聊天补全
大约 4 分钟
聊天补全
接入结论
- OpenAI 兼容端点:
POST https://www.yuzhixiaolongxia.com/v1/chat/completions - Anthropic 原生端点:
POST https://www.yuzhixiaolongxia.com/v1/messages - 认证:
Authorization: Bearer <你的 API 令牌>(Anthropic 还要带anthropic-version: 2023-06-01) - 流式:
stream: true走 Server-Sent Events - 流式异常不扣费:Claude 流式过程中出现客户端中断 / 超时 /
scanner_error/ 上游断流时,平台不会产生扣费 log(详见下文)
请求参数(OpenAI 兼容)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 模型 ID,去 模型广场 复制,或调 GET /v1/models 查询 |
messages | array | 是 | 对话消息数组 |
stream | boolean | 否 | true 开启流式输出;默认 false |
max_tokens | integer | 否 | 最大输出 token,建议显式设置避免回包被截断 |
temperature | number | 否 | 0~2,默认 1.0 |
top_p | number | 否 | 0~1,与 temperature 二选一 |
tools | array | 否 | 函数调用 / 工具调用定义,与上游官方语义保持一致 |
messages 格式:
[
{"role": "system", "content": "你是一个 Python 编程助手"},
{"role": "user", "content": "写一个快速排序"},
{"role": "assistant", "content": "好的,下面是实现……"},
{"role": "user", "content": "再加上递归终止条件的注释"}
]最小示例
TypeScript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.YZX_API_KEY,
baseURL: "https://www.yuzhixiaolongxia.com/v1",
});
const resp = await client.chat.completions.create({
model: "claude-opus-4-7",
messages: [
{ role: "system", content: "你是一个简洁的助理,回答控制在两句话以内。" },
{ role: "user", content: "用一句话介绍量子纠缠。" },
],
max_tokens: 256,
});
console.log(resp.choices[0].message.content);Python
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["YZX_API_KEY"],
base_url="https://www.yuzhixiaolongxia.com/v1",
)
resp = client.chat.completions.create(
model="claude-opus-4-7",
messages=[
{"role": "system", "content": "你是一个简洁的助理"},
{"role": "user", "content": "用一句话介绍量子纠缠"},
],
max_tokens=256,
)
print(resp.choices[0].message.content)响应示例
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"created": 1714000000,
"model": "claude-opus-4-7",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "量子纠缠是指两个粒子的状态相互绑定。"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 20,
"completion_tokens": 18,
"total_tokens": 38
}
}流式输出
TypeScript
const stream = await client.chat.completions.create({
model: "claude-opus-4-7",
messages: [{ role: "user", content: "写一首四句的春日小诗" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}Python
stream = client.chat.completions.create(
model="claude-opus-4-7",
messages=[{"role": "user", "content": "写一首四句的春日小诗"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)SSE 帧格式
data: {"id":"chatcmpl-abc","object":"chat.completion.chunk","choices":[{"delta":{"content":"春"},"index":0}]}
data: {"id":"chatcmpl-abc","object":"chat.completion.chunk","choices":[{"delta":{"content":"风"},"index":0}]}
data: [DONE]Claude 流式异常路径不扣费
Claude 系列模型走流式时,如果出现下面这些情况,平台不会产生扣费 log,也不会把半截 token 算到你头上:
- 客户端主动断开(关闭进程、
Ctrl+C、HTTP 客户端 abort) - TCP / SSE 连接超时
- 上游推流过程中
scanner_error、incomplete chunked encoding等读取异常 - 上游主动断开但没发完
[DONE]
只有客户端完整收到 [DONE] 后才会写扣费 log。一次失败的流式调用不需要担心被扣"半成品"的钱。
Anthropic 原生 Messages
Claude 官方 SDK 直接走 /v1/messages,请求体语义不同:
Python
import anthropic
client = anthropic.Anthropic(
api_key="你的令牌",
base_url="https://www.yuzhixiaolongxia.com",
)
message = client.messages.create(
model="claude-opus-4-7",
max_tokens=1024,
system="你是一个代码助手",
messages=[{"role": "user", "content": "解释一下什么是递归"}],
)
print(message.content[0].text)TypeScript
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: process.env.YZX_API_KEY,
baseURL: "https://www.yuzhixiaolongxia.com",
});
const message = await client.messages.create({
model: "claude-opus-4-7",
max_tokens: 1024,
system: "你是一个代码助手",
messages: [{ role: "user", content: "解释一下什么是递归" }],
});
console.log(message.content[0]);Claude Code CLI 直接读
ANTHROPIC_BASE_URL = https://www.yuzhixiaolongxia.com(不要带/v1),SDK 内部会自动补/v1/messages。
常见问题
报 model not found
模型 ID 不在当前令牌的分组里。先用 GET /v1/models 列出可用 ID,或去模型广场复制。
413 Request Entity Too Large
上下文 + 输入超过模型单次窗口。在 Claude Code 交互界面里用 /compact 压缩历史;纯 API 调用建议把长内容存进文件或 RAG,让 prompt 保持精简。
429 Too Many Requests
降低并发,加入指数退避;测试和生产分到不同令牌。
流式只收到第一段就断了
客户端没有正确处理 SSE。确认你在循环里读取每个 data: 块,直到收到 [DONE]。Node 用 for await,Python 用 SDK 的 stream=True,避免自己手写 socket。
输出被截断
max_tokens 设小了。建议显式给出与业务匹配的值,比如长文本生成给 4096。
