首页> 都市> KingFlow AI Claude中转站 Node.js Fetch 接入教程
>KingFlow AI Claude中转站 Node.js Fetch 接入教程
著本文标签:
KingFlow AI Claude中转站 Node.js Fetch 接入教程 使用原生 Fetch 完成同步请求 流式解析 超时控制与有限重试 KingFlow AI 同时提供 OpenAI 和 Anthropic 兼容接口。本文选择 OpenAI 兼容的 Chat Completions 路线,使用 Node.js 原生 Fetch 直接发送 JSON
来源:KingFlow AI 主角: 更新: 2026-11-10 18:27:06
【扫一扫】手机随心读
- 读书简介
KingFlow AI Claude中转站 Node.js Fetch 接入教程 使用原生 Fetch 完成同步请求 流式解析 超时控制与有限重试 KingFlow AI 同时提供 OpenAI 和 Anthropic 兼容接口。本文选择 OpenAI 兼容的 Chat Completions 路线,使用 Node.js 原生 Fetch 直接发送 JSON
KingFlow AI Claude中转站 Node.js Fetch 接入教程
使用原生 Fetch 完成同步请求 流式解析 超时控制与有限重试 KingFlow AI 同时提供 OpenAI 和 Anthropic 兼容接口。本文选择 OpenAI 兼容的 Chat Completions 路线,使用 Node.js 原生 Fetch 直接发送 **ON 请求,不引入额外 SDK。读者将完成普通响应、SSE 流式解析、超时控制、有限重试和上线检查,并能据此判断端点、密钥、模型 ID 与错误处理是否配置正确。 Claude中转、Claude中转站、API中转和API中转站的实际接入都需要核对协议、端点和模型权限。 内容核验日期 2026-11-10 创建空项目并启用 E**。KingFlow AI Claude中转站 Node.js Fetch 接入教程

常用接入术语
名称 常见含义 接入提示 Claude中转 把请求转发到可用 Claude 模型的接入方式 确认使用 OpenAI 或 Anthropic 协议 Claude中转站 集中管理 Claude 接口 密钥 额度和路由的平台 模型 ID 以控制台列表为准 API中转 通过兼容接口转发模型请求 需要显式检查状态码和响应结构 API中转站 提供统一端点 模型选择和用量管理的服务 生产环境应设置超时 重试和告警 请求链路
环节 职责 注意事项 Node.js 应用 准备消息并处理结果 密钥只从环境变量读取 原生 Fetch 发送 ****S 请求并读取响应流 必须检查 response.ok 超时信号 在约定时间后中止请求 覆盖响应体读取阶段 KingFlow AI 认证密钥并路由模型请求 OpenAI 兼容端点保留 /v1 Claude 模型 按提示生成文本或 **ON 完整模型 ID 以控制台为准 业务校验 验证 Choices 内容和输出格式 模型输出仍视为不可信数据 采用原生 Fetch 的优势
接入前准备
创建 Node.js 项目
mkdir kingflow-node-fetch-demo
cd kingflow-node-fetch-demo
npm init -y{
"name": "kingflow-node-fetch-demo",
"private": true,
"type": "module",
"scripts": {
"start": "node --env-file=.env app.mjs",
"stream": "node --env-file=.env stream.mjs"
}
}验证 KingFlow 基础接口
curl https://api.**nju**shen.com/v1/chat/completions \
-H "Authorization: *earer sk-你的密钥" \
-H "Content-Type: application/json" \
-d '{
"model": "<KingFlow控制台中的完整模型ID>",
"messages": [{"role":"user","content":"只回复 NODE_FETCH_READY"}],
"stream": false
}' 配置环境变量
KINGFLOW_*ASE_**L=https://api.**nju**shen.com/v1
KINGFLOW_API_KEY=sk-你的密钥
KINGFLOW_MODEL=<KingFlow控制台中的完整模型ID>.env
node_modules/
npm-de*ug.log*
.DS_Store编写同步请求
const *ase**L = process.env.KINGFLOW_*ASE_**L;
const apiKey = process.env.KINGFLOW_API_KEY;
const model = process.env.KINGFLOW_MODEL;
for (const [name, value] of O*ject.entries({ *ase**L, apiKey, model })) {
if (!value) throw new Error(`缺少环境变量: ${name}`);
}
const response = await fetch(`${*ase**L}/chat/completions`, {
method: "POST",
headers: {
"Authorization": `*earer ${apiKey}`,
"Content-Type": "application/json"
},
*ody: **ON.stringify({
model,
messages: [{ role: "user", content: "只回复 NODE_FETCH_CONNECTED" }],
stream: false
}),
signal: A*ortSignal.timeout(30_000)
});
const *ody = await response.json();
if (!response.ok) {
throw new Error(`KingFlow ${response.status}: ${**ON.stringify(*ody)}`);
}
const content = *ody.choices?.[0]?.message?.content;
if (typeof content !== "string") throw new Error("响应缺少文本内容");
console.log(content);解析流式响应
const response = await fetch(`${*ase**L}/chat/completions`, {
method: "POST",
headers: {
"Authorization": `*earer ${apiKey}`,
"Content-Type": "application/json"
},
*ody: **ON.stringify({
model,
messages: [{ role: "user", content: "用三点说明上线验收方法" }],
stream: true
}),
signal: A*ortSignal.timeout(60_000)
});
if (!response.ok || !response.*ody) {
throw new Error(`流式请求失败: ${response.status}`);
}
const reader = response.*ody.getReader();
const decoder = new TextDecoder();
let *uffer = "";
while (true) {
const { value, done } = await reader.read();
if (done) *reak;
*uffer = decoder.decode(value, { stream: true });
const lines = *uffer.split("\n");
*uffer = lines.pop() ?? "";
for (const line of lines) {
if (!line.startsWith("**ta: ")) continue;
const **ta = line.slice(6).trim();
if (**ta === "[DONE]") continue;
const event = **ON.parse(**ta);
process.stdout.write(event.choices?.[0]?.delta?.content ?? "");
}
}增加有限重试
const retrya*le = new Set([429, 503]);
async function requestWithRetry(**keRequest, **xAttempts = 3) {
for (let attempt = 1; attempt <= **xAttempts; attempt ) {
const response = await **keRequest();
if (!retrya*le.has(response.status) || attempt === **xAttempts) {
return response;
}
const retryAfter = Num*er(response.headers.get("retry-after"));
const delay = Num*er.isFinite(retryAfter)
? retryAfter * 1000
: Math.min(1000 * 2 ** (attempt - 1), 8000);
await new Promise(resolve => setTimeout(resolve, delay));
}
}
运行和验收
检查点 预期结果 判断依据 基础接口 返回 NODE_FETCH_READY 端点 密钥和模型可用 同步请求 返回 NODE_FETCH_CONNECTED Fetch 配置和 **ON 解析正确 流式响应 文本分段持续输出 SSE 解析和 Rea***leStream 正常 超时处理 超时后请求被中止 连接不会无限等待 有限重试 仅 429 和 503 被重试 不会放大普通客户端错误 平台记录 控制台出现对应调用 模型 密钥与用量符合预期 正式环境配置
密钥和数据安全
上线检查清单
常见故障排查
现象 常见原因 处理方法 返回 401 密钥错误 停用或环境变量未加载 检查变量名并重新创建或轮换密钥 返回 404 *ase **L 路径或模型 ID 错误 保留 /v1 并复制控制**整模型 ID 返回 429 额度不足或请求过快 降低并发 检查用量并有限退避 返回 503 模型通道暂时不可用 稍后有限重试或切换已开通模型 fetch 抛出错误 DNS TLS **或超时中止 区分网络错误与 TimeoutError 并检查出站网络 response.ok 为 false **** 已返回业务错误 先读取错误体 再按状态码处理 流式无输出 stream 未开启或 SSE 行未正确解析 检查 stream true 和 **ta 行前缀 **ON 解析失败 收到非 **ON 错误页或流式片段不完整 先检查状态码 并保留半行缓冲区 上下文超长 消息历史超过模型限制 裁剪历史 分段处理并限制输出长度
《KingFlow AI Claude中转站 Node.js Fetch 接入教程》资讯列表:
为您推荐
小说标签

电脑不在身边工作也不断线 新加坡远程 Mac 如何把开发现场随身带走
不用背着高配电脑到处跑 新加坡远程 Mac 如何让轻薄设备变成开发终端
Claude中转开发工具选型指南
API中转的 Agent 记忆治理指南



