{"_id":"@carpediemnn/node-red-ai-gateway","name":"@carpediemnn/node-red-ai-gateway","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@carpediemnn/node-red-ai-gateway","version":"0.1.0","description":"Node-RED AI gateway nodes for OpenAI-compatible APIs with hidden credentials and prompt-cache observability.","keywords":["node-red","node-red-node","openai","openai-compatible","ai","llm","prompt-cache","chatgpt","deepseek","gateway"],"license":"MIT","author":{"name":"carpediemnn"},"homepage":"https://github.com/carpediemnn/node-red-ai-gateway","publishConfig":{"access":"public"},"main":"index.js","engines":{"node":">=18"},"scripts":{"test":"node --test","lint":"node --check nodes/ai-provider.js && node --check nodes/ai-gateway.js && node --check lib/*.js","validate":"npm run lint && npm test && npm pack --dry-run"},"node-red":{"version":">=3.1.0","nodes":{"ai-provider":"nodes/ai-provider.js","ai-gateway":"nodes/ai-gateway.js"}},"devDependencies":{},"_id":"@carpediemnn/node-red-ai-gateway@0.1.0","gitHead":"4cd2f7046851b0e38d4b87f24b5044e0ba6b84d5","_nodeVersion":"22.16.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-RluO5cqno6/cybGVdlxZQ+TxaBWXyybD3iCHM/pu78vocWjvySEUHaTgr6gz+60zGl6mwkQNtWgDLO0ZT/s2ZA==","shasum":"92712add177529e3a8cc0c7e931e9f7f91957393","tarball":"https://registry.npmjs.org/@carpediemnn/node-red-ai-gateway/-/node-red-ai-gateway-0.1.0.tgz","fileCount":16,"unpackedSize":49299,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQClcuGV6XaXIdwn8dBkLK4KoohksFFRnxOd6IWkvcvevgIhALyOS+XRWzSeEk20rlRbj+PScZsVyty3Ej3AaVHqVJcS"}]},"_npmUser":{"name":"carpediemnn","email":"syn15503530245@gmail.com"},"directories":{},"maintainers":[{"name":"carpediemnn","email":"syn15503530245@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/node-red-ai-gateway_0.1.0_1779250832666_0.7996275177129344"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-20T04:20:32.546Z","0.1.0":"2026-05-20T04:20:32.800Z","modified":"2026-05-20T04:20:33.045Z"},"maintainers":[{"name":"carpediemnn","email":"syn15503530245@gmail.com"}],"description":"Node-RED AI gateway nodes for OpenAI-compatible APIs with hidden credentials and prompt-cache observability.","homepage":"https://github.com/carpediemnn/node-red-ai-gateway","keywords":["node-red","node-red-node","openai","openai-compatible","ai","llm","prompt-cache","chatgpt","deepseek","gateway"],"author":{"name":"carpediemnn"},"license":"MIT","readme":"# @carpediemnn/node-red-ai-gateway\n\n一个面向 OpenAI-compatible 网关的 Node-RED AI 节点包。核心目标是：\n\n- API Key 不暴露在 flow JSON、节点输出和日志里。\n- 把常见 AI 能力收敛到一个主节点里，画布更干净。\n- 请求结构对 provider-side prompt cache 更友好。\n- 把 `cached_tokens`、token usage、prefix hash 等诊断信息输出到 `msg.ai`。\n\n## 安装\n\n在 Node-RED 编辑器中打开：\n\n```text\n菜单 -> Manage palette -> Install\n```\n\n搜索并安装：\n\n```text\n@carpediemnn/node-red-ai-gateway\n```\n\n也可以在 Node-RED 用户目录中安装：\n\n```bash\ncd ~/.node-red\nnpm install @carpediemnn/node-red-ai-gateway\n```\n\nDocker 版 Node-RED 通常在容器的 `/data` 目录安装：\n\n```bash\ncd /data\nnpm install @carpediemnn/node-red-ai-gateway\n```\n\n安装后重启 Node-RED。\n\n## 当前设计\n\n推荐的新 flow 结构是：\n\n```text\nAI Provider  ->  AI Gateway\n```\n\n### AI Provider\n\n配置节点，只负责连接和安全：\n\n- API Base，例如 `https://api.openai.com/v1` 或自己的网关 `/v1` 地址。\n- API Key，使用 Node-RED credentials 的 `password` 字段保存。\n- 鉴权方式：Bearer Token、自定义 Header 原始值、无鉴权。\n- 默认模型。\n- `prompt_cache_key` 开关。\n- `prompt_cache_retention` 设置。\n\nAPI Key 不会作为普通节点配置保存，导出 flow 时也不会出现在 JSON 里。\n\n### AI Gateway\n\n推荐主节点。一个节点里通过 `Mode` 选择能力：\n\n- `Text / Chat`：普通文本生成、总结、分析。\n- `JSON`：让模型输出 JSON，并解析成对象。\n- `Classify`：输出 `{ label, confidence, reason }`。\n- `Router`：先分类，再按 label 顺序发到对应 output。\n- `Request`：高级模式，直接请求任意 OpenAI-compatible endpoint。\n- `Cache Probe`：用同一个稳定前缀连续请求两次，检查真实 provider cache 是否命中。\n\n当前包只暴露这两个节点：`AI Provider` 和 `AI Gateway`。\n\n## Prompt Cache 友好策略\n\n节点会尽量把稳定内容放在请求前缀里：\n\n1. System prompt\n2. Few-shot examples\n3. JSON schema / labels / routing rules\n4. 动态输入，例如 `msg.payload`\n\n这样相同任务的前缀更稳定，更容易命中 AI 服务商侧 prompt cache。\n\n当 Provider 开启 `prompt_cache_key` 时，节点会根据稳定前缀、模型、API Base 生成稳定 key。\n\n## 运行时输出\n\n`AI Gateway` 会把诊断信息写到 `msg.ai`：\n\n```js\nmsg.ai = {\n  provider: \"openai-compatible\",\n  model: \"openai/gpt-5.4-mini\",\n  endpoint: \"/chat/completions\",\n  cache: {\n    providerCachedTokens: 8448,\n    promptTokens: 9036,\n    cacheHitRate: 0.9349,\n    prefixHash: \"69298b89cea6bbe2\"\n  },\n  usage: {\n    promptTokens: 9036,\n    completionTokens: 5,\n    totalTokens: 9041,\n    raw: {}\n  }\n}\n```\n\n如果是 `AI Gateway` 的 `Cache Probe` 模式，输出会包含：\n\n```js\nmsg.payload = {\n  prefixHash: \"...\",\n  warmed: true,\n  first: {\n    cache: { providerCachedTokens: 0 }\n  },\n  second: {\n    cache: { providerCachedTokens: 8448 }\n  }\n}\n```\n\n## 安全设计\n\n- API Key 存在 `AI Provider` 的 credentials password 字段里。\n- 运行时服务端代码负责组装鉴权 Header。\n- `msg` 输出不包含 API Key。\n- 错误信息和请求摘要会脱敏。\n- 导出 flow JSON 不包含 API Key。\n\n## 示例\n\n仓库内置了一个基础示例 flow：\n\n```text\nexamples/gateway-basic-flow.json\n```\n\n导入后，打开 `AI Provider`，填写自己的 API Base、模型和 API Key 即可运行。\n\n## 本地开发\n\n```bash\nnpm test\nnpm run validate\n```\n\n安装到本地 Node-RED：\n\n```bash\ncd ~/.node-red\nnpm install /Users/shiyanan/Documents/nodered-ai-node\n```\n\n发布前检查：\n\n```bash\nnpm run validate\nnpm publish --dry-run\n```\n\n当前测试覆盖：\n\n- 节点注册。\n- API Key credentials 声明。\n- `AI Gateway` 的 Text、JSON、Request、Cache Probe、Router 模式。\n- prompt 前缀稳定性。\n- cached token 解析。\n- 错误脱敏。\n","readmeFilename":"README.md","_rev":"1-1f51b40592abfd7e5005d97e6f3714e0"}