对接文档
文档简介#
云智API 模型网关的统一接入地址为 https://api.yunzhiapi.cn。网关以模型展示名为路由键,把 OpenAI Chat Completions、OpenAI Responses、Anthropic Messages 与 Gemini generateContent 四套协议转换为模型所绑定上游端点实际使用的协议,再把上游结果还原为调用方协议。鉴权、预扣费、幂等、流式转发、断点续传、媒体任务与错误映射由网关统一处理。
一个模型对接密钥即可调用全部已开放模型,支持 Authorization、X-Api-Key、X-Goog-Api-Key、Api-Key 与查询参数等多种密钥传递方式。
同一模型可分别通过 Chat、Responses、Messages 与 Gemini 入口调用,网关按上游端点的原生协议自动转换请求与响应。
SSE 按分片到达顺序实时转发,并把事件写入流缓冲区;客户端断线后可凭 X-Resume-Token 读取已缓冲内容。
转发前按模型单价预扣,完成后按上游 usage 结算;支持缓存读、缓存写与按次计费,失败请求会退回未使用部分。
协议入口
| 协议 | 请求路径 | 默认鉴权头 | 适用客户端 |
|---|---|---|---|
| OpenAI Chat | https://api.yunzhiapi.cn/v1/chat/completions | Authorization: Bearer | OpenAI SDK、LangChain、Dify、OpenAI 兼容客户端 |
| OpenAI Responses | https://api.yunzhiapi.cn/v1/responses | Authorization: Bearer | Codex CLI、Responses API 客户端 |
| Anthropic Messages | https://api.yunzhiapi.cn/v1/messages | x-api-key 或 Authorization | Anthropic SDK、Claude Code |
| Gemini GenerateContent | https://api.yunzhiapi.cn/v1beta/models/{model}:generateContent | x-goog-api-key 或 Authorization | Google Gen AI SDK、Gemini 客户端 |
| 图像 | https://api.yunzhiapi.cn/v1/images/generations、/images/edits | Authorization: Bearer | OpenAI Images 客户端 |
| 语音合成 | https://api.yunzhiapi.cn/v1/audio/speech | Authorization: Bearer | OpenAI Audio 客户端 |
| 视频任务 | https://api.yunzhiapi.cn/v1/videos | Authorization: Bearer | 自建异步视频客户端 |
| 文件 | https://api.yunzhiapi.cn/v1/files | Authorization: Bearer | OpenAI Files 客户端 |
| 模型列表 | https://api.yunzhiapi.cn/v1/models、https://api.yunzhiapi.cn/v1beta/models | 同上 | 全部客户端 |
| 健康检查 | https://api.yunzhiapi.cn/healthz | 无需鉴权 | 负载均衡与监控 |
路径别名
为了兼容在自定义 Base URL 中省略 /v1 的客户端,网关同时接受以下不带版本前缀的路径:/chat/completions、/responses、/responses/{id}、/responses/{id}/input_items、/messages、/messages/count_tokens、/models、/models/{id}。它们与带 /v1 的路径行为完全一致。
文档约定
- 所有金额单位为人民币元。模型单价、Token 用量与实际扣费以服务端结算记录为准。
{model}表示模型展示名,可从GET /v1/models获取;模型名匹配不区分大小写,传入时会自动去除models/前缀。- 示例中的
YOUR_API_KEY指「密钥信息」页生成的模型对接密钥,不需要自行添加或删除前缀字符。 - 除特别说明外,请求体均为 UTF-8 JSON;响应头均携带
X-Request-Id,排障时请一并提供。 - 网关只接受模型展示名,不接受上游后端模型名;响应中的
model始终还原为本站展示名。 - 网关不会自动切换上游端点,也不会对普通网络错误或 5xx 做通用重试;仅 Responses 上游存在受限的字段兼容重试,详见「兼容重试与脱敏」。
快速开始#
- 登录站点,在「密钥信息」页生成或复制模型对接密钥,并确认模型调用额度充足。
- 调用
GET https://api.yunzhiapi.cn/v1/models获取可用模型展示名。 - 把模型名与密钥填入下面的请求,确认返回 HTTP 200 且包含
choices数组。 - 需要逐字输出时把
stream设为true,按 SSE 规则读取data:行,直到收到[DONE]。
最小可用请求
curl https://api.yunzhiapi.cn/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "模型展示名",
"messages": [
{"role": "user", "content": "请用一句话介绍云智API"}
],
"stream": false
}'成功响应
{
"id": "chatcmpl_2f8f0c2a9b1d4e6f",
"object": "chat.completion",
"created": 1783820400,
"model": "模型展示名",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "云智API 是统一接入多种大模型的接口网关。"
},
"finish_reason": "stop",
"logprobs": null
}
],
"usage": {
"prompt_tokens": 18,
"completion_tokens": 21,
"total_tokens": 39,
"prompt_tokens_details": {"cached_tokens": 0},
"completion_tokens_details": {"reasoning_tokens": 0}
}
}连通性检查
curl -i https://api.yunzhiapi.cn/healthz
返回 200 且 status 为 ok 表示网关进程与数据库正常;返回 503 且 status 为 degraded 表示数据库不可用。健康检查不消耗额度,也不检测上游模型连通性。
鉴权与密钥#
所有模型接口都需要模型对接密钥。密钥与账号绑定,账号被停用或密钥被重置后立即失效。网关不要求密钥具有固定前缀,也不限制密钥字符集,请直接使用「密钥信息」页生成的值。
支持的传递方式
| 优先级 | 传递方式 | 示例 | 说明 |
|---|---|---|---|
| 1 | Authorization: Bearer | Authorization: Bearer YOUR_API_KEY | OpenAI、Anthropic 与多数客户端默认方式 |
| 2 | Authorization: Key | Authorization: Key YOUR_API_KEY | 前缀大小写不敏感 |
| 3 | Authorization 裸值 | Authorization: YOUR_API_KEY | 值中不含空格时整体作为密钥 |
| 4 | X-Api-Key | X-Api-Key: YOUR_API_KEY | Anthropic SDK、Claude Code 常用 |
| 5 | X-Goog-Api-Key | X-Goog-Api-Key: YOUR_API_KEY | Google 客户端常用 |
| 6 | Api-Key | Api-Key: YOUR_API_KEY | 兼容部分 Azure 风格客户端 |
| 7 | 查询参数 ?key= | ?key=YOUR_API_KEY | 浏览器地址栏会记录查询参数,生产环境优先使用请求头 |
多个来源同时存在时按上表顺序取第一个非空值,其余忽略。密钥通过 mxgapi_user.aikey 查询;如果未命中,还会尝试同一用户的 token 字段。
IP 白名单
账号在「授权管理」页配置的 IP 白名单会参与鉴权。白名单支持单个 IPv4 / IPv6、CIDR(如 10.0.0.0/8)与地址区间(如 10.0.0.1-10.0.0.50),多个条目使用逗号、分号或空白分隔;留空表示允许全部 IP。
网关只在直连对端为回环或私有地址(例如本机反向代理)时才读取 X-Forwarded-For 的首个地址与 X-Real-IP,避免公网客户端伪造来源 IP。
鉴权失败
| HTTP | 错误码 | 触发条件 | 处理建议 |
|---|---|---|---|
| 401 | GW-AUTH-001 | 所有鉴权来源均为空 | 补充 Authorization 或对应协议鉴权头 |
| 401 | GW-AUTH-002 | 密钥不存在或已被重置 | 在密钥信息页复制最新模型对接密钥 |
| 403 | GW-AUTH-003 | 账号状态不是启用状态 | 联系管理员核查账号状态 |
| 403 | GW-AUTH-004 | 请求来源 IP 不在账号 IP 白名单内 | 在授权管理页添加出口 IP,或清空白名单 |
鉴权示例
curl https://api.yunzhiapi.cn/v1/models \ -H "Authorization: Bearer YOUR_API_KEY" curl https://api.yunzhiapi.cn/v1/models \ -H "x-api-key: YOUR_API_KEY" curl "https://api.yunzhiapi.cn/v1beta/models?key=YOUR_API_KEY"
请求与响应头#
请求头
| 请求头 | 必填 | 说明 |
|---|---|---|
Authorization / X-Api-Key / X-Goog-Api-Key / Api-Key | 是 | 任选一种,详见「鉴权与密钥」 |
Content-Type | JSON 请求必填 | 固定为 application/json;/images/edits、/videos 与 /files 支持 multipart/form-data |
Accept | 否 | 流式请求可传 text/event-stream;语音可传 audio/* |
Idempotency-Key | 否 | 客户端幂等键,最长 200 字符;与密钥共同决定幂等记录,重试时保持不变 |
Anthropic-Version | 否 | Anthropic 客户端使用;同协议直通时原样转发,未提供时网关补 2023-06-01 |
Anthropic-Beta / OpenAI-Beta / OpenAI-Organization / OpenAI-Project | 否 | 按上游协议原样转发,供官方 SDK 与客户端使用 |
X-Goog-Api-Version / X-Goog-Api-Client | 否 | 转发给 Gemini 原生上游 |
X-Request-Id | 否 | 客户端自定义追踪头会被网关忽略并以服务端生成的 req_ 值返回 |
响应头
| 响应头 | 出现场景 | 说明 |
|---|---|---|
X-Request-Id | 所有响应 | 网关请求追踪 ID,格式为 req_ 加 24 位十六进制 |
X-Request-Start | 所有响应 | 请求开始时间,RFC3339Nano |
X-Model | 模型调用成功响应 | 模型展示名;仅当展示名全部为 ASCII 时返回 |
X-Resume-Token | 流式响应 | 断点续传令牌,配合 GET /v1/streams/{token} 使用 |
X-Cost-CNY | 非流式对话、图像、语音成功响应 | 本次结算总费用(元) |
X-Usage-Input-Tokens / X-Usage-Output-Tokens | 非流式成功响应 | 本次结算的输入与输出 Token 数 |
X-Idempotent-Replay | 幂等回放 | 值为 true 表示响应来自缓存记录而非重新调用上游 |
Retry-After / X-Should-Retry | 上游返回时 | 原样转发,供客户端退避重试 |
X-RateLimit-* / Anthropic-RateLimit-* | 上游返回时 | 原样转发上游限流信息 |
Access-Control-Allow-Origin | 所有响应 | 固定为 *;允许 GET、POST、DELETE、OPTIONS |
Access-Control-Expose-Headers | 所有响应 | 暴露 X-Request-Id、X-Model、X-Resume-Token、费用与用量头 |
请求大小与超时
| 项目 | 限制 / 默认值 | 超限表现 |
|---|---|---|
| JSON 请求体 | 32 MiB | HTTP 413 GW-REQ-003 |
| multipart 请求体 | 64 MiB | HTTP 413 GW-REQ-003 |
| 单个上传文件 | 32 MiB | HTTP 413 GW-FILE-002 |
| 上游 JSON 响应体 | 64 MiB | HTTP 502 GW-UPSTREAM-004 |
| 视频任务上游响应体 | 8 MiB | HTTP 502 GW-UPSTREAM-004 |
| 单个 SSE 事件 | 64 MiB | 流式连接中断 |
| 上游响应头等待 | 300 秒 | HTTP 502 GW-UPSTREAM-001 或上游状态 |
| 对话非流式请求 | 10 分钟 | 超时后取消上游并结算失败 |
| 对话流式请求 | 60 分钟 | 超时后结束流并结算已产生用量 |
| 图像 / 编辑 / 语音 | 10 分钟 | 超时后返回网关错误 |
| 视频创建 / 轮询 / 下载 | 5 分钟 / 30 秒 / 30 分钟 | 按阶段超时 |
| 入站请求头 / 读取 / 空闲 | 15 秒 / 5 分钟 / 2 分钟 | 连接被关闭 |
Retry-After、X-Should-Retry 与 X-RateLimit-* 响应头返回;请按上游提示退避,并自行控制客户端并发。模型与路由#
网关以模型展示名(mxgapi_model.display_name)作为唯一路由键。模型必须处于启用状态,绑定的上游端点也必须启用且 URL 可解析,才会出现在模型列表并可被调用。模型查询不区分大小写,并会自动去除 models/ 前缀。
模型列表
GEThttps://api.yunzhiapi.cn/v1/modelsGEThttps://api.yunzhiapi.cn/v1/models/{id}{
"object": "list",
"data": [
{"id": "模型展示名", "object": "model", "created": 1783820400, "owned_by": "mxgapi"}
]
}该端点默认返回 OpenAI 格式。若请求携带 Anthropic-Version,或携带 X-Api-Key 且 Authorization 不是 Bearer,则返回 Anthropic 格式:
{
"data": [
{
"type": "model",
"id": "模型展示名",
"display_name": "模型展示名",
"created_at": "2026-09-29T09:53:33Z"
}
],
"has_more": false,
"first_id": "模型展示名",
"last_id": "模型展示名"
}Anthropic 格式支持 limit(默认 20,最大 1000)与 after_id 分页。Gemini 格式使用 GET https://api.yunzhiapi.cn/v1beta/models,返回 models 数组,模型名带 models/ 前缀。
模型分类与可调用端点
| 分类 category | 可调用对话端点 | 可调用媒体端点 |
|---|---|---|
chat | Chat、Responses、Messages、Gemini generateContent | 图像生成/编辑、视频创建(作为 chat 类模型放行) |
image | 仅 Gemini generateContent | 图像生成、图像编辑 |
tts | 不可调用 | 语音合成 |
video | 不可调用 | 视频创建 |
OpenAI、Anthropic 与 Responses 的对话入口只接受 chat 分类;Gemini 的生成入口接受 chat 与 image。图像接口接受 image 与 chat,语音接口只接受 tts,视频接口接受 video 与 chat。分类不匹配时返回 GW-MODEL-003。
上游端点解析
每个模型只绑定一个上游端点(mxgapi_model.endpoint_id 对应 mxgapi_proxy.id)。网关根据端点 URL 判断原生协议:
| 端点 URL 形态 | 原生协议 | 行为 |
|---|---|---|
以 /chat/completions 结尾 | OpenAI Chat | 客户端协议与它一致时原样直通,否则转换为 Chat |
以 /responses 结尾 | OpenAI Responses | 同上,按 Responses 转换 |
以 /messages 结尾 | Anthropic | 同上,按 Messages 转换 |
包含 :generateContent 等 Gemini 动作,或以 /v1beta、/v1beta1、/v1alpha 结尾 | Gemini | 按 Gemini 转换,模型名写入 URL 路径 |
| 其他基础地址 | OpenAI Chat(默认) | 按客户端协议拼接 /v1 或 /v1beta 路径 |
请求转发时,网关会把 model 替换为上游后端模型名;后端名为空时使用展示名并在审计中记录降级。响应返回前再统一替换为展示名,因此客户端不会看到上游真实模型名。网关不会在主端点失败后自动切换到其他端点。
常见错误
| 错误码 | HTTP | 含义 |
|---|---|---|
GW-MODEL-001 | 400 | 请求缺少 model |
GW-MODEL-002 | 404 | 模型不存在、已停用或展示名不匹配 |
GW-MODEL-003 | 400 | 模型分类不支持当前端点操作 |
GW-MODEL-004 | 503 | 模型绑定的上游端点不可用或 URL 无法解析 |
GW-MODEL-005 | 503 | 模型绑定的上游端点已停用 |
错误码总览#
所有网关错误消息统一以 [错误码] 描述 的形式返回。错误响应会按请求协议自动适配:OpenAI 与媒体端点返回 OpenAI 结构,Anthropic 端点返回 Anthropic 结构,Gemini 端点返回 Google 结构。流式请求在响应头写出后出错时,会发送协议对应的 SSE 错误事件。
OpenAI 风格
{
"error": {
"message": "[GW-MODEL-002] model 模型展示名 was not found or is disabled",
"type": "not_found_error",
"param": null,
"code": "GW-MODEL-002"
}
}Anthropic 风格
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "[GW-REQ-005] prompt is required",
"code": "GW-REQ-005"
},
"request_id": "req_2f8f0c2a9b1d4e6f"
}Gemini 风格
{
"error": {
"code": 404,
"message": "[GW-MODEL-002] model 模型展示名 was not found or is disabled",
"status": "NOT_FOUND",
"code_detail": "GW-MODEL-002"
}
}完整错误码
| HTTP | 错误码 | 含义与处理 |
|---|---|---|
| 401 | GW-AUTH-001 | 缺少密钥;补充鉴权头 |
| 401 | GW-AUTH-002 | 密钥无效;在密钥信息页重新复制 |
| 403 | GW-AUTH-003 | 账号被停用;联系管理员 |
| 403 | GW-AUTH-004 | 客户端 IP 不在白名单;调整授权管理页配置 |
| 400 | GW-MODEL-001 | 缺少 model;补充模型展示名 |
| 404 | GW-MODEL-002 | 模型不存在或已停用;调用模型列表确认 |
| 400 | GW-MODEL-003 | 模型分类不支持当前操作;更换模型或端点 |
| 503 | GW-MODEL-004 | 没有可用的上游端点;联系管理员 |
| 503 | GW-MODEL-005 | 上游端点已停用;稍后重试或联系管理员 |
| 402 | GW-BILL-001 | 余额不足;充值模型调用额度 |
| 500 | GW-BILL-002 | 结算失败,本次请求未扣费;可稍后重试 |
| 400 | GW-REQ-001 | 请求体为空、不是合法 JSON 或无法解析 |
| 400 | GW-REQ-002 | 不支持的参数,例如幂等键超过 200 字符或未知 Gemini 方法 |
| 413 | GW-REQ-003 | 请求体超过大小限制 |
| 400 | GW-REQ-004 | multipart 请求体格式错误 |
| 400 | GW-REQ-005 | 缺少必填字段,例如 prompt、input 或文件 |
| 415 | GW-REQ-006 | Content-Type 不符合端点要求 |
| 404 | GW-REQ-007 | 未知端点 |
| 405 | GW-REQ-008 | 请求方法不被该端点允许 |
| 409 | GW-IDEM-001 | 相同幂等请求正在处理中,或流式结果不可重放 |
| 422 | GW-IDEM-002 | 同一幂等键已用于不同的请求内容 |
| 502 | GW-UPSTREAM-001 | 上游不可达或连接超时 |
| 4xx | GW-UPSTREAM-002 | 上游以 4xx 拒绝了请求,状态码通常原样返回 |
| 502 | GW-UPSTREAM-003 | 上游 5xx 错误 |
| 502 | GW-UPSTREAM-004 | 上游返回了无法读取或解析的响应 |
| 502 | GW-UPSTREAM-005 | 上游鉴权失败(上游 401/403 映射为 502) |
| 429 | GW-UPSTREAM-006 | 上游限流;读取 Retry-After 后退避 |
| 502 | GW-STREAM-001 | 上游流式响应中途结束 |
| 404 | GW-STREAM-002 | 续传令牌不存在或不属于当前密钥 |
| 404 | GW-FILE-001 | 文件不存在或不属于当前账号 |
| 413 | GW-FILE-002 | 文件超过 32 MiB |
| 500 | GW-FILE-003 | 文件存储初始化或写入失败 |
| 400 | GW-MEDIA-001 | 媒体端点不支持该操作,例如流式图像或 SSE 语音 |
| 404 | GW-MEDIA-002 | 视频任务不存在或不属于当前账号 |
| 409 | GW-MEDIA-003 | 视频尚未完成,暂不能下载内容 |
| 404 | GW-RESP-001 | 响应 ID 不存在、上下文为空或不属于当前账号 |
| 500 | GW-SYS-001 | 网关内部错误;携带 X-Request-Id 联系管理员 |
| 503 | GW-SYS-003 | 数据库不可用;稍后重试 |
OpenAI Chat#
POSThttps://api.yunzhiapi.cn/v1/chat/completions与 OpenAI Chat Completions 兼容。网关校验模型分类后,把请求中的 model 替换为上游后端名转发;当上游端点本身就是 Chat 协议时,除 model、stream 与流式 usage 选项外,其余字段原样直通。
请求字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 模型展示名 |
messages | array | 是 | 消息数组;角色支持 system、developer、user、assistant、tool |
stream | boolean | 否 | 是否使用 SSE 流式输出,默认 false |
stream_options | object | 否 | 流式时可传 include_usage;网关会强制向上游请求 usage |
max_tokens / max_completion_tokens | integer | 否 | 最大输出 Token;两者同时存在时取 max_completion_tokens |
temperature / top_p | number | 否 | 采样参数 |
n | integer | 否 | 生成候选数量;跨协议转换时只保留第一个候选并记录降级 |
stop | string / string[] | 否 | 停止序列 |
presence_penalty / frequency_penalty / seed | mixed | 否 | 原样转发 |
logprobs / top_logprobs | mixed | 否 | 原样转发,是否生效取决于上游 |
response_format | object | 否 | 支持 text、json_object、json_schema,按目标协议转换 |
tools / tool_choice / parallel_tool_calls | mixed | 否 | 函数调用相关字段;旧版 functions/function_call 也会被识别 |
reasoning_effort / reasoning | mixed | 否 | 推理强度;跨协议时转换为目标协议可表达的思考参数 |
modalities / audio / image | mixed | 否 | 多模态输出参数,按目标协议转换 |
metadata / user / store / service_tier | mixed | 否 | 原样转发或按目标协议映射 |
prompt_cache_key / safety_identifier | string | 否 | 原样转发 |
| 其他未列出的字段 | mixed | 否 | 同协议直通时保留;跨协议转换时丢弃并写入 dropped_fields 审计 |
消息内容
| 内容形态 | 结构 | 说明 |
|---|---|---|
| 纯文本 | {"role":"user","content":"你好"} | 最常见的字符串内容 |
| 文本分片 | {"type":"text","text":"..."} | 多模态消息中的文本块 |
| 图片 URL | {"type":"image_url","image_url":{"url":"https://..."}} | 支持公网 URL 与 data URL |
| 图片 Base64 | {"type":"image_url","image_url":{"url":"data:image/png;base64,..."}} | 网关会按目标协议转换为 inlineData 或图片块 |
| 音频 | {"type":"input_audio","input_audio":{"data":"BASE64","format":"wav"}} | 是否支持取决于上游模型 |
| 文件 | {"type":"file","file":{"file_data":"BASE64","filename":"a.pdf"}} | 也可使用网关文件 ID,详见「文件接口」 |
| 工具结果 | {"role":"tool","tool_call_id":"call_x","content":"..."} | 回传函数执行结果 |
完整示例
curl https://api.yunzhiapi.cn/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Idempotency-Key: order-20261022-001" \
-d '{
"model": "模型展示名",
"messages": [
{"role": "system", "content": "你是严谨的技术助手。"},
{"role": "user", "content": [
{"type": "text", "text": "描述这张图里的架构"},
{"type": "image_url", "image_url": {"url": "https://example.com/arch.png"}}
]}
],
"temperature": 0.3,
"max_tokens": 1024,
"stream": false
}'流式响应
data: {"id":"chatcmpl_x","object":"chat.completion.chunk","created":1783820400,"model":"模型展示名","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
data: {"id":"chatcmpl_x","object":"chat.completion.chunk","created":1783820400,"model":"模型展示名","choices":[{"index":0,"delta":{"content":"云智"},"finish_reason":null}]}
data: {"id":"chatcmpl_x","object":"chat.completion.chunk","created":1783820400,"model":"模型展示名","choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":{"prompt_tokens":18,"completion_tokens":21,"total_tokens":39}}
data: [DONE]推理模型的思考内容可能出现在 delta.reasoning_content,正文仍从 delta.content 读取。若客户端未请求 stream_options.include_usage,同协议直通时网关会抑制只有 usage、没有 choices 的末尾分片;转换模式会按客户端协议决定是否发送 usage。
OpenAI Responses#
POSThttps://api.yunzhiapi.cn/v1/responsesGEThttps://api.yunzhiapi.cn/v1/responses/{id}DELETEhttps://api.yunzhiapi.cn/v1/responses/{id}GEThttps://api.yunzhiapi.cn/v1/responses/{id}/input_itemsResponses 入口支持状态化会话、输入条目数组、推理项与工具调用。网关会把输入条目规范化为内部消息,再按上游协议编码;当上游原生为 Responses 时,请求在补齐 model、stream 后直通。
请求字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 模型展示名 |
input | string / array / object | 条件必填 | 文本、输入条目数组或单个条目对象;与 previous_response_id 至少提供一个 |
instructions | string | 否 | 系统指令,转换为 system 消息 |
previous_response_id | string | 否 | 续接上一轮上下文,必须属于当前账号 |
max_output_tokens | integer | 否 | 最大输出 Token |
temperature / top_p / top_k / top_logprobs | mixed | 否 | 采样参数 |
stream | boolean | 否 | SSE 流式输出 |
tools / tool_choice / parallel_tool_calls | mixed | 否 | 函数、custom、MCP 与托管工具均会解析;跨协议时按目标能力转换 |
reasoning | object | 否 | effort 与 summary;summary 在 Chat 上游不支持时会记录降级 |
text.format | object | 否 | 结构化输出格式,支持 text、json_object、json_schema |
metadata / store / user / service_tier | mixed | 否 | 按目标协议映射或直通 |
background / truncation / include | mixed | 否 | 转发给 Responses 上游;网关不实现后台队列或上下文截断 |
conversation / prompt_cache_key / safety_identifier | string | 否 | 透传或记录 |
支持的输入条目
| type | 说明 |
|---|---|
message 或省略 type | 普通消息,content 可为 input_text、input_image、input_file、input_audio 等分片 |
function_call / custom_tool_call | assistant 侧工具调用,转为内部 tool_calls |
function_call_output / custom_tool_call_output | 工具结果,转为 tool 消息 |
reasoning | 推理项,保留 summary、encrypted_content 与 signature |
item_reference | 当前无法解析,记录降级后跳过 |
| 其他未知 type | 记录降级后跳过,不会导致整个请求失败 |
非流式示例
curl https://api.yunzhiapi.cn/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "模型展示名",
"input": "用三点总结这段需求",
"instructions": "你是资深产品经理",
"max_output_tokens": 1200,
"store": false
}'{
"id": "resp_2f8f0c2a9b1d4e6f",
"object": "response",
"created_at": 1783820400,
"status": "completed",
"error": null,
"incomplete_details": null,
"model": "模型展示名",
"output": [
{
"id": "msg_2f8f0c2a9b1d4e6f_0",
"type": "message",
"status": "completed",
"role": "assistant",
"content": [
{"type": "output_text", "text": "第一点……", "annotations": [], "logprobs": []}
]
}
],
"parallel_tool_calls": true,
"previous_response_id": null,
"reasoning": {"effort": null, "summary": null},
"store": false,
"temperature": 1.0,
"text": {"format": {"type": "text"}},
"tool_choice": "auto",
"tools": [],
"top_p": 1.0,
"truncation": "disabled",
"usage": {
"input_tokens": 20,
"input_tokens_details": {"cached_tokens": 0},
"output_tokens": 80,
"output_tokens_details": {"reasoning_tokens": 0},
"total_tokens": 100
},
"metadata": {}
}流式事件
流式响应使用带 event: 行的事件格式。常见事件包括 response.created、response.in_progress、response.output_item.added、response.output_item.done、response.content_part.added、response.output_text.delta、response.output_text.done、response.function_call_arguments.delta、response.reasoning_summary_text.delta,终止事件为 response.completed、response.incomplete 或 response.failed。
回读、删除与输入条目
GET /v1/responses/{id}返回保存的响应对象。结果超过 4 MiB 时不会保存,查询返回 404GW-RESP-001。DELETE /v1/responses/{id}清空该记录的响应正文与上下文,但保留计费审计数据;返回{"id":"...","object":"response","deleted":true}。GET /v1/responses/{id}/input_items返回用于该响应的输入条目列表,上下文为空时返回 404。- 以上端点均要求记录属于当前账号;他人的响应 ID 按不存在处理。
Anthropic Messages#
POSThttps://api.yunzhiapi.cn/v1/messages与 Anthropic Messages 协议兼容。网关把 system、消息内容块、工具、图片、文档与 thinking 块转换为内部请求,再把结果还原为 Anthropic 结构。上游原生为 Messages 时请求直通;否则按目标协议转换。
请求字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 模型展示名 |
max_tokens | integer | 否 | 最大输出 Token;Messages 同一协议直通且缺省时网关补 4096 |
messages | array | 是 | 至少一条;role 为 user 或 assistant,content 可为字符串或内容块数组 |
system | string / array | 否 | 系统提示,支持字符串或文本块数组 |
stream | boolean | 否 | SSE 流式输出 |
temperature / top_p / top_k | mixed | 否 | 采样参数 |
stop_sequences | string[] | 否 | 停止序列 |
tools | array | 否 | 自定义工具与 web_search 等服务器工具;跨协议时转换 |
tool_choice | object | 否 | auto、any、tool 等策略;disable_parallel_tool_use 会映射为 parallel 设置 |
thinking | object | 否 | {"type":"enabled","budget_tokens":2048} 或 {"type":"adaptive"} |
output_config / output_format | object | 否 | 推理 effort 与结构化输出格式 |
metadata.user_id | string | 否 | 映射为内部 user 标识 |
cache_control | object | 否 | 提示缓存标记;跨协议时尽量保留,无法表达时记录降级 |
container / context_management / mcp_servers | mixed | 否 | 记录到扩展字段,是否生效取决于目标上游 |
内容块
| 类型 | 结构 | 说明 |
|---|---|---|
| 文本 | {"type":"text","text":"..."} | 普通文本 |
| 图片 | {"type":"image","source":{"type":"base64","media_type":"image/png","data":"..."}} | 也支持 source.type=url 与 file_id |
| 工具调用 | {"type":"tool_use","id":"toolu_x","name":"fn","input":{}} | 转换为 assistant tool_calls |
| 工具结果 | {"type":"tool_result","tool_use_id":"toolu_x","content":"..."} | 转换为 tool 消息;content 可包含图片块 |
| 思考 | {"type":"thinking","thinking":"...","signature":"..."} | 转换为 reasoning 内容;signature 原样保留 |
| 文档 | {"type":"document","source":{"type":"base64","media_type":"application/pdf","data":"..."}} | 转换为文件输入 |
curl https://api.yunzhiapi.cn/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "模型展示名",
"max_tokens": 1024,
"system": "你是严谨的技术助手。",
"messages": [
{"role": "user", "content": "解释一下 SSE 流式输出"}
],
"stream": false
}'成功响应
{
"id": "msg_2f8f0c2a9b1d4e6f",
"type": "message",
"role": "assistant",
"model": "模型展示名",
"content": [
{"type": "text", "text": "SSE 是服务器向客户端单向推送事件的文本协议……"}
],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 24,
"output_tokens": 128,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0
}
}注意 Anthropic 的 input_tokens 表示未缓存输入 Token;缓存命中与缓存写入分别放在 cache_read_input_tokens 与 cache_creation_input_tokens。若使用服务器端 web_search,usage 中还会出现 server_tool_use.web_search_requests。
流式事件
流式响应依次发送 message_start、若干 content_block_start、content_block_delta、content_block_stop,随后发送 message_delta 与 message_stop。文本增量类型为 text_delta,思考增量为 thinking_delta,工具参数增量为 input_json_delta。网关不额外发送周期性 ping;上游若发送 ping 事件会原样出现在流中。
event: message_start
data: {"type":"message_start","message":{"id":"msg_x","type":"message","role":"assistant","content":[],"model":"模型展示名","stop_reason":null,"usage":{"input_tokens":24,"output_tokens":0}}}
event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"SSE"}}
event: content_block_stop
data: {"type":"content_block_stop","index":0}
event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn"},"usage":{"output_tokens":128}}
event: message_stop
data: {"type":"message_stop"}Anthropic 令牌计数#
POSThttps://api.yunzhiapi.cn/v1/messages/count_tokens在本地估算输入 Token,不调用上游、不扣费。请求体与 Messages 相同,网关只解析并估算 system、messages、图片、工具定义等内容;max_tokens 等生成参数不会报错。该端点会校验密钥,但不校验模型是否存在。
curl https://api.yunzhiapi.cn/v1/messages/count_tokens \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"model": "模型展示名",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "统计这段文本的输入 token"}]
}'{"input_tokens": 128}估算规则为:ASCII 字符按约 4 字符 1 Token,CJK 字符按更高权重计算;图片、音频、文件分片按固定 Token 估算。该值用于客户端判断上下文占用,不能替代上游真实计费 Token。
Gemini 内容生成#
POSThttps://api.yunzhiapi.cn/v1beta/models/{model}:generateContent与 Gemini GenerateContent 兼容。模型名写在 URL 路径中,请求体中的 model 会被路径模型覆盖。网关把 contents、systemInstruction、generationConfig、函数声明与多模态部件转换为内部请求,再按客户端协议还原响应。路径中的 {model} 需要做 URL 编码。
请求字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
contents | array | 是 | 内容对象数组;role 通常为 user 或 model |
systemInstruction | object | 否 | 系统指令,content.parts 中放文本 |
generationConfig.temperature / topP / topK | mixed | 否 | 采样参数 |
generationConfig.maxOutputTokens | integer | 否 | 最大输出 Token |
generationConfig.stopSequences | string[] | 否 | 停止序列 |
generationConfig.candidateCount | integer | 否 | 候选数量;跨协议转换时只保留第一个 |
generationConfig.responseMimeType / responseSchema / responseJsonSchema | mixed | 否 | 结构化输出;MIME 包含 json 时转换为 JSON 输出 |
generationConfig.thinkingConfig | object | 否 | thinkingBudget、thinkingLevel、includeThoughts |
generationConfig.speechConfig | object | 否 | 语音输出音色,取 prebuiltVoiceConfig.voiceName |
generationConfig.imageConfig | object | 否 | aspectRatio 与 imageSize |
tools[].functionDeclarations | array | 否 | 函数声明,转换为目标协议工具 |
toolConfig.functionCallingConfig | object | 否 | AUTO、ANY、NONE 与 allowedFunctionNames |
safetySettings | array | 否 | 同协议直通时原样转发,跨协议时记录降级 |
cachedContent | string | 否 | 缓存内容引用,跨协议时无法表达则丢弃 |
内容部件
| 部件 | 结构 | 说明 |
|---|---|---|
| 文本 | {"text":"..."} | 普通文本 |
| 内联数据 | {"inlineData":{"mimeType":"image/png","data":"BASE64"}} | 图片、音频、PDF 等 |
| 文件引用 | {"fileData":{"mimeType":"image/jpeg","fileUri":"https://..."}} | 远程文件 |
| 函数调用 | {"functionCall":{"name":"fn","args":{}}} | 模型返回的工具调用 |
| 函数结果 | {"functionResponse":{"name":"fn","response":{}}} | 客户端回传的工具结果 |
| 思考 | {"text":"...","thought":true} | 思考内容,可能附带 thoughtSignature |
MODEL="模型展示名"
curl "https://api.yunzhiapi.cn/v1beta/models/$(python -c "import urllib.parse,sys;print(urllib.parse.quote(sys.argv[1]))" "$MODEL"):generateContent" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: YOUR_API_KEY" \
-d '{
"contents": [
{"role": "user", "parts": [{"text": "用三点介绍云智API"}]}
],
"generationConfig": {
"temperature": 0.4,
"maxOutputTokens": 1024
}
}'{
"candidates": [
{
"content": {
"role": "model",
"parts": [{"text": "一、统一接入;二、流式输出;三、透明计费。"}]
},
"finishReason": "STOP",
"index": 0,
"safetyRatings": []
}
],
"usageMetadata": {
"promptTokenCount": 16,
"candidatesTokenCount": 32,
"totalTokenCount": 48,
"cachedContentTokenCount": 0,
"thoughtsTokenCount": 0
},
"modelVersion": "模型展示名",
"responseId": "gem_2f8f0c2a9b1d4e6f"
}urllib.parse.quote 处理;生产代码请直接使用 SDK 或 encodeURIComponent。Gemini 流式生成#
POSThttps://api.yunzhiapi.cn/v1beta/models/{model}:streamGenerateContent流式生成有两种触发方式:使用 :streamGenerateContent 动作,或在 :generateContent 上携带 ?alt=sse。触发后返回 SSE,每个事件为一条 data: {GenerateContentResponse}。Gemini 流没有独立的 [DONE] 行,终止由上游流结束或最终 finishReason 表示;网关转换模式会在末尾发送包含 usageMetadata 的分片。
curl -N "https://api.yunzhiapi.cn/v1beta/models/%E6%A8%A1%E5%9E%8B%E5%B1%95%E7%A4%BA%E5%90%8D:streamGenerateContent" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: YOUR_API_KEY" \
-d '{
"contents": [{"role":"user","parts":[{"text":"写一段产品介绍"}]}],
"generationConfig": {"maxOutputTokens": 512}
}'客户端应持续拼接 candidates[0].content.parts[].text;thought:true 的部件是思考内容。转换模式下每个分片通常是增量文本;同协议直通时上游可能发送累积文本,客户端应兼容两种形态。
Gemini 令牌计数#
POSThttps://api.yunzhiapi.cn/v1beta/models/{model}:countTokens本地估算输入 Token,不调用上游、不计费。返回字段为 totalTokens。请求体使用 GenerateContent 结构,contents 为必填;模型名会做存在性校验,但不会检查模型分类是否支持生成。
curl "https://api.yunzhiapi.cn/v1beta/models/%E6%A8%A1%E5%9E%8B%E5%B1%95%E7%A4%BA%E5%90%8D:countTokens" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: YOUR_API_KEY" \
-d '{
"contents": [{"role":"user","parts":[{"text":"估算这段输入的 token"}]}]
}'{"totalTokens": 96}模型列表与目录#
GEThttps://api.yunzhiapi.cn/v1/modelsGEThttps://api.yunzhiapi.cn/v1beta/modelsOpenAI 格式只返回 id、object、created 与 owned_by。Anthropic 格式包含 type、id、display_name 与 created_at。Gemini 格式返回 models 数组,每项包含 name、displayName、description、supportedGenerationMethods 与 version,不包含上下文长度或输出上限。
{
"models": [
{
"name": "models/模型展示名",
"displayName": "模型展示名",
"description": "Gateway model 模型展示名",
"supportedGenerationMethods": [
"generateContent",
"streamGenerateContent",
"countTokens"
],
"version": "001"
}
]
}单模型查询使用 GET /v1/models/{id} 或 GET /v1beta/models/{name}。模型不存在或已停用时返回 404 GW-MODEL-002。列表只包含启用中的模型;后端模型名与端点信息不会暴露。
图像生成与编辑#
POSThttps://api.yunzhiapi.cn/v1/images/generationsPOSThttps://api.yunzhiapi.cn/v1/images/edits图像生成使用 JSON,图像编辑使用 multipart/form-data。模型必须属于 image 或 chat 分类。网关不支持流式图像生成,stream=true 会返回 400 GW-MEDIA-001。
生成字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 图像模型展示名 |
prompt | string | 是 | 提示词,不能为空 |
n | integer | 否 | 生成数量,默认 1 |
size | string | 否 | 如 1024x1024;Gemini 端点会把部分尺寸映射为宽高比 |
quality / style | string | 否 | 原样转发给 OpenAI 形态上游 |
response_format | string | 否 | url 或 b64_json |
background / output_format / moderation | mixed | 否 | 原样转发 |
user / safety_identifier | string | 否 | 调用方标识 |
image | string | 否 | 参考图 data URL;仅 OpenAI 形态上游会收到,Gemini 原生图像端点只使用提示词 |
stream | boolean | 否 | 必须为 false;流式图像不支持 |
生成示例
curl https://api.yunzhiapi.cn/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "图像模型展示名",
"prompt": "一只在花园里追蝴蝶的橘猫,水彩风格",
"n": 1,
"size": "1024x1024",
"response_format": "b64_json"
}'编辑字段
| 表单字段 | 必填 | 说明 |
|---|---|---|
model | 是 | 图像模型展示名 |
prompt | 是 | 编辑提示词 |
image 或 image[] | 是 | 至少一张图片;多图使用 image[] |
mask | 否 | 蒙版图片;Gemini 原生端点会忽略并记录降级 |
n | 否 | 生成数量,默认 1 |
size | 否 | 输出尺寸 |
quality / response_format / background / output_format | 否 | 原样转发给 OpenAI 形态上游 |
与生成接口一致,Gemini 原生图像端点只使用提示词、图片与尺寸,其余表单字段不会进入 Gemini 请求;OpenAI 形态上游会收到除 model 外的全部表单字段。
curl https://api.yunzhiapi.cn/v1/images/edits \ -H "Authorization: Bearer YOUR_API_KEY" \ -F "model=图像模型展示名" \ -F "image=@/path/to/source.png" \ -F "mask=@/path/to/mask.png" \ -F "prompt=把背景换成夕阳下的海滩" \ -F "n=1" \ -F "size=1024x1024"
响应
{
"created": 1783820400,
"data": [
{"b64_json": "iVBORw0KGgo...", "revised_prompt": "..."}
],
"usage": {"input_tokens": 12, "output_tokens": 4096, "total_tokens": 4108}
}成功响应至少包含一个 url 或 b64_json,否则网关返回 502 GW-UPSTREAM-004。Gemini 原生图像端点会被转换为 OpenAI 的 data 结构;如果上游只返回文本,转换结果为空时同样视为失败。
语音合成#
POSThttps://api.yunzhiapi.cn/v1/audio/speech语音合成使用 JSON,成功响应为二进制音频。模型必须属于 tts 分类。网关不支持 SSE 语音流,stream_format=sse 会返回 400 GW-MEDIA-001;如需流式音频,请使用 stream_format=audio 或普通二进制响应。
请求字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 语音模型展示名 |
input | string | 是 | 待合成文本,不能为空 |
voice | string | 否 | 音色名称;Gemini 原生端点默认使用 Kore |
response_format | string | 否 | mp3、opus、aac、flac、wav、pcm |
speed | number | 否 | 语速,原样转发给 OpenAI 形态上游 |
stream_format | string | 否 | 不能为 sse |
reference_audio | string | 否 | 参考音频 URL 或 Base64;仅 OpenAI 形态上游会收到 |
curl https://api.yunzhiapi.cn/v1/audio/speech \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "语音模型展示名",
"input": "欢迎使用云智API模型网关",
"voice": "alloy",
"response_format": "mp3"
}' \
-o speech.mp3响应 Content-Type 优先使用上游返回值;上游未提供时根据 response_format 推导。成功响应还包含 Content-Length 与非流式费用/用量头。
视频任务#
POSThttps://api.yunzhiapi.cn/v1/videosGEThttps://api.yunzhiapi.cn/v1/videos/{id}GEThttps://api.yunzhiapi.cn/v1/videos/{id}/content视频生成是异步任务。创建接口返回任务对象,客户端随后轮询任务状态;任务完成后通过内容接口下载视频。模型必须属于 video 或 chat 分类。任务创建时完成预扣,任务进入终态时结算。
创建字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 视频模型展示名 |
prompt | string | 是 | 视频提示词 |
seconds | string / integer | 否 | 时长,默认 8 秒 |
size | string | 否 | 尺寸,默认 1280x720 |
aspect_ratio | string | 否 | 宽高比,如 16:9 |
resolution | string | 否 | 分辨率档位 |
negative_prompt | string | 否 | 负向提示词 |
n | integer | 否 | 生成数量,1 到 8,默认 1 |
image / input_reference | mixed | 否 | 首帧参考图;JSON 支持 URL、data URL 或对象,multipart 使用 input_reference / image 文件字段 |
JSON 与 multipart 两种请求方式均支持。multipart 表单项包括 model、prompt、seconds、size、aspect_ratio、resolution、negative_prompt、n 与参考图文件。
curl https://api.yunzhiapi.cn/v1/videos \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"model": "视频模型展示名",
"prompt": "海边日落,镜头缓慢推进,电影质感",
"seconds": "8",
"size": "1280x720",
"n": 1
}'任务对象
{
"id": "video_2f8f0c2a9b1d4e6f",
"object": "video",
"created_at": 1783820400,
"status": "queued",
"model": "视频模型展示名",
"progress": 0,
"seconds": "8",
"size": "1280x720"
}任务状态通常为 queued、in_progress、completed 或 failed。轮询使用 GET /v1/videos/{id},建议间隔 3 到 10 秒;任务完成后返回的 progress 为 100。失败任务的响应中会包含 error.code 与 error.message,并退回预扣金额。
curl https://api.yunzhiapi.cn/v1/videos/video_2f8f0c2a9b1d4e6f \ -H "Authorization: Bearer YOUR_API_KEY"
下载内容
GET /v1/videos/{id}/content 在任务完成后返回视频二进制,Content-Disposition 为 video.mp4。任务未完成时返回 409 GW-MEDIA-003;任务不存在或不属于当前账号时返回 404 GW-MEDIA-002。下载端点需要与创建任务相同的密钥。
curl -L https://api.yunzhiapi.cn/v1/videos/video_2f8f0c2a9b1d4e6f/content \ -H "Authorization: Bearer YOUR_API_KEY" \ -o result.mp4
文件接口#
POSThttps://api.yunzhiapi.cn/v1/filesGEThttps://api.yunzhiapi.cn/v1/filesGEThttps://api.yunzhiapi.cn/v1/files/{id}DELETEhttps://api.yunzhiapi.cn/v1/files/{id}GEThttps://api.yunzhiapi.cn/v1/files/{id}/content文件接口与 OpenAI Files 兼容,文件按账号隔离。网关未在数据库中建立文件表,文件内容与元数据保存在本地目录;上传成功后返回 file_ 开头的文件 ID。
上传
| 表单字段 | 必填 | 说明 |
|---|---|---|
file | 是 | 文件二进制,单文件最大 32 MiB |
purpose | 否 | 用途,默认 assistants;也接受 batch、fine-tune、vision、user_data、misc |
curl https://api.yunzhiapi.cn/v1/files \ -H "Authorization: Bearer YOUR_API_KEY" \ -F "file=@/path/to/document.pdf" \ -F "purpose=assistants"
{
"id": "file_2f8f0c2a9b1d4e6f",
"object": "file",
"bytes": 184392,
"created_at": 1783820400,
"filename": "document.pdf",
"purpose": "assistants",
"status": "processed"
}列表、读取与删除
GET /v1/files返回当前账号的文件列表,按创建时间从新到旧排列。GET /v1/files/{id}返回单个文件元数据。GET /v1/files/{id}/content下载文件内容,响应带原始 Content-Type 与附件文件名。DELETE /v1/files/{id}删除文件内容与元数据,返回{"id":"file_...","object":"file","deleted":true}。
在请求中引用文件
消息内容中的图片、音频或文件块可以使用 file_id(file_ 开头)或 file://file_... 地址。网关在转发前会把文件内容内联为 Base64,并把 MIME 类型与文件名带入目标协议,因此文件 ID 不会泄露给上游。文件不存在或不属于当前账号时返回 404 GW-FILE-001。
{
"model": "模型展示名",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "总结这份 PDF"},
{"type": "file", "file": {"file_id": "file_2f8f0c2a9b1d4e6f"}}
]
}
]
}/v1/audio/transcriptions、/v1/audio/translations、/v1/embeddings 与 /v1/images/variations 端点。需要这些能力时,请确认模型是否可通过对话或图像编辑端点完成,否则应改用支持该能力的其他服务。流式输出 SSE#
Chat、Responses、Messages、Gemini 与视频任务均支持流式或异步读取;图像与语音不支持流式。流式响应头写出后,网关按 SSE 实时转发上游分片,并把已发送事件写入流缓冲区。响应开始时会先发送一行注释 : mxgapi stream,用于立即触发客户端收到响应头。
各协议流格式
| 协议 | Content-Type | 帧格式 | 终止标记 |
|---|---|---|---|
| OpenAI Chat | text/event-stream | data: {chat.completion.chunk},空行分隔 | data: [DONE] |
| OpenAI Responses | text/event-stream | event: 事件名 + data: {json} | response.completed / incomplete / failed |
| Anthropic Messages | text/event-stream | event: 事件名 + data: {json} | message_stop |
| Gemini GenerateContent | text/event-stream | data: {GenerateContentResponse} | 上游流结束或 finishReason |
响应头与计费
- 流式响应头包含
X-Resume-Token,用于断点续传;同时包含X-Request-Id与(ASCII 展示名时)X-Model。 - 流式响应不会返回
X-Cost-CNY与X-Usage-*,因为这些头在结算前已经写出。费用与用量请在「模型日志」页或计费记录中查看。 - 网关在流结束时按实际 usage 结算;客户端断开时按已产生 usage 结算并标记为
cancelled。 - 流式请求不能通过幂等键重放;重复使用同一幂等键调用流式端点会返回 409
GW-IDEM-001。
客户端读取建议
- 使用流式读取器按行解析,保留未完成行缓冲区,不要假设一次 read 就是完整事件。
- 只处理
data:行;空行表示一个事件结束。Responses 与 Anthropic 还需读取event:行判断事件类型。 - 收到终止标记后关闭连接;若连接提前结束且没有终止标记,按不完整响应处理,并决定是否续传。
- 渲染节流:将 Token 拼接与 DOM 更新分离,使用
requestAnimationFrame或 50 至 100 毫秒批量刷新,避免高频重排。 - 客户端取消请求时主动关闭连接,网关会取消上游读取并按已产生 usage 结算。
断点续传#
GEThttps://api.yunzhiapi.cn/v1/streams/{token}流式响应开始后,响应头 X-Resume-Token 即为续传令牌。客户端断线后,使用同一密钥请求续传端点,网关会把流缓冲区中已经记录的事件重新发送给客户端。续传接口只回放已缓冲事件,不会重新调用上游,也不会重复计费。
curl -N "https://api.yunzhiapi.cn/v1/streams/4f7c2a9d8e1b3c6a5d2e9f01" \ -H "Authorization: Bearer YOUR_API_KEY" curl -N "https://api.yunzhiapi.cn/v1/streams/4f7c2a9d8e1b3c6a5d2e9f01?after=128" \ -H "Authorization: Bearer YOUR_API_KEY"
after为整数,表示只返回序号大于该值的事件;不传时从 0 开始。事件序号从 0 递增。- 续传请求仍需有效密钥,且必须是创建该流的同一密钥;否则按令牌不存在处理,返回 404
GW-STREAM-002。 - 流缓冲区默认保留 2 小时;后台每 5 分钟清理过期数据。过期后只能重新发起请求。
- 流事件由后台批量写入;数据库压力过大时可能丢弃部分缓冲事件,并在原请求的审计字段中记录降级。
- 如果原流仍在写入,可以在稍后再次请求同一令牌并携带更大的
after获取新增事件。 - 缓存的终止事件会被回放;客户端收到后应关闭连接。
幂等机制#
网关为所有计费请求建立幂等记录。幂等键由 API 密钥与客户端幂等键的 SHA-256 组合生成:
client_key = 请求头 Idempotency-Key(最长 200 字符,可为空) material = client_key 非空 ? "client:" + client_key : "auto:" + 网关请求 ID idem_key = sha256(api_key + "|" + material)
幂等记录还会保存请求体指纹。对话类请求使用完整请求体的 SHA-256;图像编辑使用模型、提示词、尺寸、质量、格式与图片哈希组合;视频使用 JSON 请求体或组合后的字段指纹。
Idempotency-Key 时,网关会为每次请求生成不同的自动键。因此仅靠“相同请求体”不能保证去重;需要重试安全时,必须在重试之间保持同一个 Idempotency-Key。行为
| 场景 | 行为 |
|---|---|
| 首次请求 | 创建 pending 记录,预扣余额,调用上游,完成后保存结果 |
| 相同密钥、相同请求体、相同幂等键,且已完成 | 非流式请求直接返回缓存结果,响应头带 X-Idempotent-Replay: true,不重复调用上游 |
| 相同幂等键但请求体不同 | 返回 422 GW-IDEM-002 |
| 相同幂等键且记录仍为 pending(10 分钟内) | 返回 409 GW-IDEM-001,提示已有相同请求在处理 |
| pending 超过 10 分钟 | 视为僵死记录,退回旧预扣并重新抢占 |
| 流式请求命中已完成记录 | 返回 409 GW-IDEM-001,流式结果不可重放 |
| 记录已完成但结果超过 4 MiB | 结果未保存,无法回放;请调整请求或改用流式/分页读取 |
请求示例
curl https://api.yunzhiapi.cn/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Idempotency-Key: order-20261022-001" \
-d '{"model":"模型展示名","messages":[{"role":"user","content":"你好"}]}'建议使用业务订单号或 UUID 作为幂等键,并在网络错误、超时与 5xx 重试时保持不变。幂等键只对同一密钥、同一账号有效;更换密钥后旧记录不可复用。
计费与结算#
每个模型配置输入单价、输出单价、缓存读单价与缓存写单价,单位均为「元 / 百万 Token」。当输入单价为 0 时,模型按次计费,输出单价表示「元 / 次」。网关在转发前预扣,响应完成后按上游返回的 usage 结算,多退少补。
预扣规则
- 按次计费模型:
输出单价 × 数量。数量来自n;图像、视频按张/条数,语音为 1。 - 按 Token 计费模型:
估算输入 Token × 1.2 × max(输入单价, 缓存读单价, 缓存写单价) + 输出上限 × 输出单价。 - 输出上限默认 1024 Token;Responses 默认 2048;传了
max_tokens/max_output_tokens时使用该值;存在n时乘以 n。 - 推理参数可能提高输出上限:reasoning budget 会取 budget + 1024 与当前上限的较大值;effort 映射为 minimal 1024、low 2048、medium 4096、high 8192、xhigh/max 16384。
结算规则
| 项目 | 计算方式 |
|---|---|
| 未缓存输入 | 未缓存输入 Token × 输入单价 |
| 缓存命中输入 | 缓存读 Token × 缓存读单价 |
| 缓存写入输入 | 缓存写 Token × 缓存写单价 |
| 输出 | 输出 Token × 输出单价;推理 Token 计入输出 |
| 按次计费 | 输出单价 × 数量,不再按 Token 计算 |
上游未返回 usage 时,网关会本地估算输入与输出 Token,并在审计中记录 usage.estimated 或对应降级标记。估算只用于避免零结算,不代表上游真实用量。
费用响应头与对账
- 非流式对话、图像、编辑与语音成功响应会返回
X-Cost-CNY、X-Usage-Input-Tokens与X-Usage-Output-Tokens。 - 流式请求与视频任务在结算前已写出响应头,因此不返回上述费用头;请通过「模型日志」页查看总费用、预扣金额与结算差额。
- 幂等回放不会重复计费;首次成功调用已经结算,回放只返回缓存结果。
- 上游错误、连接失败、空响应与未产生有效输出的失败会退回预扣;已经产生 usage 的流式中断可能按实际用量结算。
计算示例
假设某模型输入单价 2 元/百万 Token、输出单价 8 元/百万 Token,某次调用实际使用 1200 个未缓存输入 Token、300 个输出 Token,则费用为:
输入费用 = 1200 / 1,000,000 × 2 = 0.0024 元 输出费用 = 300 / 1,000,000 × 8 = 0.0024 元 合计费用 = 0.0048 元
X-Request-Id 或响应 ID。模型日志页会展示输入/输出 Token、输入侧费用、输出费用、结算总费用、预扣金额与差额。Responses 上下文#
Responses 的 previous_response_id 依赖网关保存的上下文。网关会把请求消息与生成的 assistant 内容写入幂等记录的 context_json 字段;下一次请求读取后与本次输入合并,再转发给上游。
- 上下文必须属于同一账号;否则按不存在处理,返回 404
GW-RESP-001。 - 上下文字段最大 8 MiB;超过上限时不保存上下文,后续请求无法续接。
- 响应正文最大保存 4 MiB;超过时不保存,
GET /v1/responses/{id}返回 404。 store字段会按目标协议转发,但网关为了支持previous_response_id仍会在本地保存上下文。truncation会转发给上游;网关自身不实现上下文长度截断。- 流式响应的上下文在流结束时写入;若上游中断,可能只保存部分输出。
DELETE /v1/responses/{id}会清空正文与上下文;计费审计仍保留在用量流水表中。
# 第一轮
curl https://api.yunzhiapi.cn/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"模型展示名","input":"记住:项目代号是 Aurora。"}'
# 第二轮,把上一轮返回的 resp_ 开头 ID 填入
curl https://api.yunzhiapi.cn/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"模型展示名","input":"项目代号是什么?","previous_response_id":"resp_2f8f0c2a9b1d4e6f"}'兼容重试与脱敏#
网关不对普通网络错误、429 或 5xx 做通用重试,也不会在主端点失败后切换其他端点。唯一的自动重试针对 OpenAI Responses 上游:部分第三方 Responses 网关会拒绝 Codex 等客户端发送的可选字段。当上游返回 400 且错误信息点名以下字段时,网关会移除该字段并重试,最多 4 次:
| 被点名字段 | 处理方式 |
|---|---|
reasoning.summary | 删除 reasoning.summary;reasoning 为空时整个删除 |
web_search | 删除 tools 中所有 web_search 类型工具,并删除对应 tool_choice |
client_metadata | 删除 client_metadata |
namespace | 删除 tools 中 namespace 类型工具 |
每次移除都会写入 degraded_fields,格式如 request.responses_compat.dropped.tools.web_search。只有错误信息命中上述字段时才会重试,其他 400 会原样返回。
上游错误映射
| 上游情况 | 对外表现 |
|---|---|
| 上游 400 / 404 / 409 / 413 / 415 等 4xx | 状态码通常原样返回,错误码为 GW-UPSTREAM-002 |
| 上游 401 / 403 | 映射为 502 GW-UPSTREAM-005,避免把上游鉴权失败误报为客户端密钥问题 |
| 上游 429 | 保持 429,错误码 GW-UPSTREAM-006 |
| 上游 5xx | 映射为 502 GW-UPSTREAM-003 |
| 上游响应无法读取或解析 | 502 GW-UPSTREAM-004 |
| 连接失败或超时 | 502 GW-UPSTREAM-001 |
上游错误消息会经过脱敏:上游端点密钥会被替换为 ***,URL 会被替换为 [upstream],后端模型名会被替换为展示名,过长内容会被截断。脱敏后的消息仍会保留足够信息用于定位参数问题。
健康检查#
GEThttps://api.yunzhiapi.cn/healthzGEThttps://api.yunzhiapi.cn/readyz两个端点行为相同,无需鉴权,不消耗额度。数据库可用时返回 200:
{
"status": "ok",
"database": "ok",
"version": "final-2026.10",
"uptime_seconds": 86400,
"time": "2026-10-22T08:00:00Z"
}数据库不可用时返回 503,status 为 degraded,database 为 unavailable。该端点不检测上游模型是否可用。
轻量连通性端点
GET /api/hello 与 HEAD /api/hello 返回 {"ok":true},可用于反向代理或负载均衡的轻量探测。网关没有 /metrics、/debug/pprof 或 /admin 管理端点。
OpenAI SDK#
OpenAI 官方 SDK 只需把 baseURL 指向 https://api.yunzhiapi.cn/v1,SDK 会自动拼接 /chat/completions、/responses、/images/generations 等路径。
pip install openai npm install openai
from openai import OpenAI
client = OpenAI(
base_url="https://api.yunzhiapi.cn/v1",
api_key="YOUR_API_KEY",
timeout=600.0,
max_retries=0,
)
resp = client.chat.completions.create(
model="模型展示名",
messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content)
stream = client.chat.completions.create(
model="模型展示名",
messages=[{"role": "user", "content": "写一首短诗"}],
stream=True,
)
for chunk in stream:
text = chunk.choices[0].delta.content if chunk.choices else None
if text:
print(text, end="", flush=True)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.yunzhiapi.cn/v1",
apiKey: "YOUR_API_KEY",
timeout: 600000,
maxRetries: 0
});
const resp = await client.chat.completions.create({
model: "模型展示名",
messages: [{ role: "user", content: "你好" }]
});
console.log(resp.choices[0].message.content);Idempotency-Key,避免重复计费。Anthropic SDK#
Anthropic SDK 的 base_url 填网关根地址 https://api.yunzhiapi.cn,SDK 会自动追加 /v1/messages。密钥可放在 api_key(x-api-key)或 auth_token(Authorization: Bearer)。
import anthropic
client = anthropic.Anthropic(
base_url="https://api.yunzhiapi.cn",
api_key="YOUR_API_KEY",
timeout=600.0,
max_retries=0,
)
msg = client.messages.create(
model="模型展示名",
max_tokens=1024,
messages=[{"role": "user", "content": "你好"}],
)
print(msg.content[0].text)import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
baseURL: "https://api.yunzhiapi.cn",
apiKey: "YOUR_API_KEY",
timeout: 600000,
maxRetries: 0
});
const msg = await client.messages.create({
model: "模型展示名",
max_tokens: 1024,
messages: [{ role: "user", content: "你好" }]
});
console.log(msg.content[0].text);Gemini SDK#
Google Gen AI SDK 的 httpOptions.baseUrl 填 https://api.yunzhiapi.cn,SDK 会自动追加 /v1beta/models/...。鉴权使用 x-goog-api-key。
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({
apiKey: "YOUR_API_KEY",
httpOptions: { baseUrl: "https://api.yunzhiapi.cn" }
});
const resp = await ai.models.generateContent({
model: "模型展示名",
contents: "你好"
});
console.log(resp.text);from google import genai
client = genai.Client(
api_key="YOUR_API_KEY",
http_options={"base_url": "https://api.yunzhiapi.cn"}
)
resp = client.models.generate_content(
model="模型展示名",
contents="你好"
)
print(resp.text)如果所用 SDK 版本不支持自定义 baseUrl,可直接使用下方原生 HTTP 调用,或通过本地反向代理把 /v1beta 转发到网关。
原生 HTTP#
不依赖 SDK 时,按协议拼装请求即可。下表给出各协议的最小请求路径与鉴权头。
| 协议 | 方法与路径 | 鉴权头 | 请求体核心字段 |
|---|---|---|---|
| OpenAI Chat | POST https://api.yunzhiapi.cn/v1/chat/completions | Authorization: Bearer | model、messages、stream |
| OpenAI Responses | POST https://api.yunzhiapi.cn/v1/responses | Authorization: Bearer | model、input、stream |
| Anthropic | POST https://api.yunzhiapi.cn/v1/messages | x-api-key | model、messages、max_tokens |
| Gemini | POST https://api.yunzhiapi.cn/v1beta/models/{model}:generateContent | x-goog-api-key | contents、generationConfig |
| 图像 | POST https://api.yunzhiapi.cn/v1/images/generations | Authorization: Bearer | model、prompt、n、size |
| 语音 | POST https://api.yunzhiapi.cn/v1/audio/speech | Authorization: Bearer | model、input、voice、response_format |
| 视频 | POST https://api.yunzhiapi.cn/v1/videos | Authorization: Bearer | model、prompt、seconds |
| 文件 | POST https://api.yunzhiapi.cn/v1/files | Authorization: Bearer | multipart: file、purpose |
Claude Code#
Claude Code 使用 Anthropic Messages 协议,并在压缩上下文前调用 count_tokens。网关两者均已支持。通过环境变量把请求指向本站:
export ANTHROPIC_BASE_URL="https://api.yunzhiapi.cn" export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY" export ANTHROPIC_MODEL="模型展示名" export ANTHROPIC_DEFAULT_OPUS_MODEL="模型展示名" export ANTHROPIC_DEFAULT_SONNET_MODEL="模型展示名" export ANTHROPIC_DEFAULT_HAIKU_MODEL="模型展示名" export CLAUDE_CODE_SUBAGENT_MODEL="模型展示名" export CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY="1" claude
| 环境变量 | 说明 |
|---|---|
ANTHROPIC_BASE_URL | 网关根地址,不要带 /v1/messages |
ANTHROPIC_AUTH_TOKEN | 模型对接密钥,以 Authorization: Bearer 发送 |
ANTHROPIC_API_KEY | 也可使用该变量,以 x-api-key 发送 |
ANTHROPIC_MODEL | 主模型展示名 |
ANTHROPIC_DEFAULT_*_MODEL | 不同任务档位使用的模型展示名,可选 |
CLAUDE_CODE_SUBAGENT_MODEL | 子代理模型展示名,可选 |
CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY | 设为 1 时允许客户端发现网关模型目录 |
网关会原样转发 anthropic-version、anthropic-beta、anthropic-workspace-id 等头,并回传 retry-after、x-should-retry 与 anthropic-ratelimit-*。工具、MCP 工具、技能与子代理都走同一条 Messages 入口;带缓存的请求会记录缓存读/写 Token 及对应费用。
Codex CLI#
Codex CLI 使用 OpenAI Responses 协议。编辑用户级 ~/.codex/config.toml(Windows 为 %USERPROFILE%\.codex\config.toml):
model_provider = "mxgapi" model = "模型展示名" model_reasoning_effort = "high" model_reasoning_summary = "none" model_context_window = 131072 model_auto_compact_token_limit = 120000 [model_providers.mxgapi] name = "mxgapi" base_url = "https://api.yunzhiapi.cn" wire_api = "responses" requires_openai_auth = true experimental_bearer_token = "YOUR_API_KEY"
codex exec "总结当前仓库的目录结构"
base_url 填网关根地址即可,Codex 会请求 /responses;网关同时支持 /responses 与 /v1/responses。如果上游拒绝 reasoning.summary 或 web_search 工具,网关会按「兼容重试与脱敏」中的规则移除并重试,因此建议把 model_reasoning_summary 设为 none;需要展示深度思考时,可改用支持思考的模型并恢复为 detailed。
ZCode#
ZCode 可分别使用三种协议入口。供应商配置示例:
| 供应商类型 | API 类型 | Base URL | 说明 |
|---|---|---|---|
| Chat | openai-chat-completions | | 请求 /v1/chat/completions |
| Responses | openai-responses | | 请求 /responses |
| Anthropic | anthropic-messages | | 请求 /v1/messages |
[
{
"providerName": "mxgapi Chat",
"config": {
"access": { "type": "api-key", "apiKey": "YOUR_API_KEY" },
"api": { "type": "openai-chat-completions", "baseUrl": "https://api.yunzhiapi.cn/v1" },
"personalModelIds": ["模型展示名"]
}
},
{
"providerName": "mxgapi Responses",
"config": {
"access": { "type": "api-key", "apiKey": "YOUR_API_KEY" },
"api": { "type": "openai-responses", "baseUrl": "https://api.yunzhiapi.cn" },
"personalModelIds": ["模型展示名"]
}
},
{
"providerName": "mxgapi Anthropic",
"config": {
"access": { "type": "api-key", "apiKey": "YOUR_API_KEY" },
"api": { "type": "anthropic-messages", "baseUrl": "https://api.yunzhiapi.cn" },
"personalModelIds": ["模型展示名"]
}
}
]OpenAI 兼容客户端#
Cursor、Windsurf、Cline、Roo Code、OpenCode、OpenClaw、Hermes 等支持自定义 OpenAI Base URL 的客户端,都可以使用以下配置:
| 配置项 | 填写值 |
|---|---|
| Provider | OpenAI Compatible / OpenAI API |
| Base URL | https://api.yunzhiapi.cn/v1 |
| API Key | 模型对接密钥 |
| Model | GET /v1/models 返回的展示名 |
| 协议 | OpenAI Chat Completions |
如果客户端还会请求 /v1/embeddings、/v1/audio/transcriptions 或 /v1/audio/translations,这些端点不在本网关中,会返回 404。请关闭对应的向量化、语音转写或联网搜索功能,或改用支持这些能力的服务。客户端执行工具时,网关只负责透传 function/custom tool 结构,不会代为执行命令或浏览器操作。
Gemini 客户端#
Gemini 客户端应把 API 基础地址指向 https://api.yunzhiapi.cn,并让客户端自动追加 /v1beta。密钥使用 x-goog-api-key 或 Authorization: Bearer。
如果客户端只允许填写完整的 Gemini 根地址,请确认它最终请求的是 /v1beta/models/{model}:generateContent 或 :streamGenerateContent。不同 CLI 版本的配置项名称不同,请以客户端文档为准;无法配置时可直接使用 Google Gen AI SDK 的 httpOptions.baseUrl 或原生 HTTP。
| 能力 | 网关支持情况 |
|---|---|
| generateContent | 支持 |
| streamGenerateContent | 支持 SSE |
| countTokens | 支持本地估算 |
| 内联图片 / 音频 / PDF | 支持 inlineData 与 fileData |
| 函数调用 | 支持 functionDeclarations / functionCall / functionResponse |
| Google Search 等服务器工具 | 会记录扩展字段,是否生效取决于目标上游 |
| imageConfig / speechConfig | 会按目标协议转换,媒体端点另有独立接口 |
Dify#
在 Dify 的模型供应商中选择 OpenAI-API-compatible,新增模型:
| 配置项 | 填写值 |
|---|---|
| 模型类型 | LLM(Chat) |
| Base URL | https://api.yunzhiapi.cn/v1 |
| API Key | 模型对接密钥 |
| 模型名称 | 模型展示名 |
| 上下文长度 | 按模型实际窗口填写 |
| 流式模式 | 支持 |
| 函数调用 | 支持透传,是否生效取决于模型与上游 |
Dify 的文本向量化功能需要 /v1/embeddings,本网关未提供该端点;请勿把 Dify 的 Text Embedding 类型指向本网关。Dify 的联网搜索与代码执行由 Dify 自身插件执行,不会通过网关的托管工具运行。
故障排查#
| 现象 | 常见原因 | 排查步骤 |
|---|---|---|
| 所有请求 404 | Base URL 或路径写错 | OpenAI 用 /v1/chat/completions;Anthropic 用 /v1/messages;Gemini 用 /v1beta/models/{model}:generateContent |
| 401 GW-AUTH-001 | 未携带密钥或代理丢弃鉴权头 | 用 curl 直接请求,检查 Authorization 是否到达网关;检查反向代理是否过滤 Header |
| 401 GW-AUTH-002 | 密钥已重置或复制不完整 | 在密钥信息页重新复制;确认没有多余空格或换行 |
| 403 GW-AUTH-004 | IP 白名单不包含出口 IP | 在授权管理页添加 IP,或清空白名单 |
| 404 GW-MODEL-002 | 模型名不是展示名或模型已停用 | 调用 /v1/models 复制展示名;确认模型状态为启用 |
| 400 GW-MODEL-003 | 模型分类不支持当前端点 | 更换支持该能力的模型;例如 tts 模型不能调用对话端点 |
| 402 GW-BILL-001 | 余额不足 | 充值模型调用额度;确认预扣金额不超过余额 |
| 409 GW-IDEM-001 | 相同幂等请求在处理,或流式重放 | 等待原请求完成;流式请求更换 Idempotency-Key |
| 422 GW-IDEM-002 | 同一幂等键用于不同请求体 | 更换 Idempotency-Key,或恢复原请求体 |
| 429 GW-UPSTREAM-006 | 上游限流 | 读取 Retry-After 与 X-Should-Retry,增加退避与抖动,降低并发 |
| 502 GW-UPSTREAM-001 | 上游不可达或超时 | 携带 X-Request-Id 联系管理员;稍后重试并观察 /healthz |
| 502 GW-UPSTREAM-003/004 | 上游 5xx 或返回无法解析 | 携带 X-Request-Id 联系管理员;不要原样重试参数类错误 |
| 502 GW-STREAM-001 | 上游流中断 | 使用 X-Resume-Token 续传;若令牌过期则重新发起 |
| 404 GW-STREAM-002 | 续传令牌不存在或不属于当前密钥 | 确认使用创建流的同一密钥;令牌默认保留 2 小时 |
| 409 GW-MEDIA-003 | 视频尚未完成 | 继续轮询任务状态,直到 completed 再下载 |
| 流式无输出或空响应 | 客户端缓冲、反代缓冲或解析错误 | 设置 X-Accel-Buffering: no;关闭代理缓冲;按行解析 data: |
| CORS 错误 | 浏览器或代理配置 | 网关返回 Access-Control-Allow-Origin: *;检查反向代理是否移除 CORS 头 |
| 响应 model 与请求不一致 | 网关返回展示名 | 这是预期行为;上游模型名不会暴露给客户端 |
排障信息清单
- 响应头
X-Request-Id;如为幂等回放,同时提供X-Idempotent-Replay。 - 请求时间(精确到秒)、协议、端点路径、模型展示名、HTTP 状态与错误码。
- 是否流式、是否携带 Idempotency-Key 与续传令牌、是否经过反向代理或 CDN。
- 客户端 SDK 与版本;必要时提供去除密钥后的最小可复现 curl。
- 图像、视频与长文本请求请同时说明客户端超时设置。
常见问题#
https://api.yunzhiapi.cn/v1;Anthropic SDK 与 Codex 填根地址 https://api.yunzhiapi.cn,SDK 会追加 /v1/messages 或 /responses;Gemini SDK 填根地址,SDK 会追加 /v1beta。填错通常表现为 404。Retry-After 与 X-Should-Retry 后退避重试,并降低并发。批量任务与交互任务应使用不同密钥或账号,避免互相挤占上游额度。X-Resume-Token,断线后向 /v1/streams/{token}?after=N 携带同一密钥重新请求,即可读取已缓冲事件。令牌默认保留 2 小时;过期后只能重新发起请求。Idempotency-Key 且请求体一致时,网关才会命中同一条幂等记录并回放结果。不携带该头时,每次请求都会生成不同的自动幂等键,因此重试仍会重新计费。流式结果不能回放。Access-Control-Allow-Origin: *,技术上可以跨域调用;但前端代码中的密钥对任何访问者可见,生产环境应通过自己的服务端转发并鉴权。POST /v1/videos 创建任务、GET /v1/videos/{id} 轮询状态与 GET /v1/videos/{id}/content 下载内容。任务创建时预扣,完成或失败时结算;未完成时下载返回 409。***,把 URL 替换为 [upstream],把后端模型名替换为展示名,并截断过长内容。这是安全策略,不影响参数问题排查;需要更多信息时请提供 request_id。