对接文档

文档总览 文档简介

文档简介#

云智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 Chathttps://api.yunzhiapi.cn/v1/chat/completionsAuthorization: BearerOpenAI SDK、LangChain、Dify、OpenAI 兼容客户端
OpenAI Responseshttps://api.yunzhiapi.cn/v1/responsesAuthorization: BearerCodex CLI、Responses API 客户端
Anthropic Messageshttps://api.yunzhiapi.cn/v1/messagesx-api-key 或 AuthorizationAnthropic SDK、Claude Code
Gemini GenerateContenthttps://api.yunzhiapi.cn/v1beta/models/{model}:generateContentx-goog-api-key 或 AuthorizationGoogle Gen AI SDK、Gemini 客户端
图像https://api.yunzhiapi.cn/v1/images/generations、/images/editsAuthorization: BearerOpenAI Images 客户端
语音合成https://api.yunzhiapi.cn/v1/audio/speechAuthorization: BearerOpenAI Audio 客户端
视频任务https://api.yunzhiapi.cn/v1/videosAuthorization: Bearer自建异步视频客户端
文件https://api.yunzhiapi.cn/v1/filesAuthorization: BearerOpenAI 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 上游存在受限的字段兼容重试,详见「兼容重试与脱敏」。

快速开始#

  1. 登录站点,在「密钥信息」页生成或复制模型对接密钥,并确认模型调用额度充足。
  2. 调用 GET https://api.yunzhiapi.cn/v1/models 获取可用模型展示名。
  3. 把模型名与密钥填入下面的请求,确认返回 HTTP 200 且包含 choices 数组。
  4. 需要逐字输出时把 stream 设为 true,按 SSE 规则读取 data: 行,直到收到 [DONE]。

最小可用请求

bash
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
  }'

成功响应

json
{
  "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}
  }
}

连通性检查

bash
curl -i https://api.yunzhiapi.cn/healthz

返回 200 且 status 为 ok 表示网关进程与数据库正常;返回 503 且 status 为 degraded 表示数据库不可用。健康检查不消耗额度,也不检测上游模型连通性。

首次接入建议先在「对话调试」页验证密钥、模型与网络连通性,再把相同参数迁移到业务代码。浏览器直接调用需要自行承担密钥泄露风险,生产环境应通过服务端转发。

鉴权与密钥#

所有模型接口都需要模型对接密钥。密钥与账号绑定,账号被停用或密钥被重置后立即失效。网关不要求密钥具有固定前缀,也不限制密钥字符集,请直接使用「密钥信息」页生成的值。

支持的传递方式

优先级传递方式示例说明
1Authorization: BearerAuthorization: Bearer YOUR_API_KEYOpenAI、Anthropic 与多数客户端默认方式
2Authorization: KeyAuthorization: Key YOUR_API_KEY前缀大小写不敏感
3Authorization 裸值Authorization: YOUR_API_KEY值中不含空格时整体作为密钥
4X-Api-KeyX-Api-Key: YOUR_API_KEYAnthropic SDK、Claude Code 常用
5X-Goog-Api-KeyX-Goog-Api-Key: YOUR_API_KEYGoogle 客户端常用
6Api-KeyApi-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错误码触发条件处理建议
401GW-AUTH-001所有鉴权来源均为空补充 Authorization 或对应协议鉴权头
401GW-AUTH-002密钥不存在或已被重置在密钥信息页复制最新模型对接密钥
403GW-AUTH-003账号状态不是启用状态联系管理员核查账号状态
403GW-AUTH-004请求来源 IP 不在账号 IP 白名单内在授权管理页添加出口 IP,或清空白名单
密钥等同于账户凭证。不要写入前端公开代码、Git 仓库、日志或截图;怀疑泄露时立即在密钥信息页重置。重置后旧密钥立刻失效,正在运行的客户端需要同步更新。

鉴权示例

bash
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-TypeJSON 请求必填固定为 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 MiBHTTP 413 GW-REQ-003
multipart 请求体64 MiBHTTP 413 GW-REQ-003
单个上传文件32 MiBHTTP 413 GW-FILE-002
上游 JSON 响应体64 MiBHTTP 502 GW-UPSTREAM-004
视频任务上游响应体8 MiBHTTP 502 GW-UPSTREAM-004
单个 SSE 事件64 MiB流式连接中断
上游响应头等待300 秒HTTP 502 GW-UPSTREAM-001 或上游状态
对话非流式请求10 分钟超时后取消上游并结算失败
对话流式请求60 分钟超时后结束流并结算已产生用量
图像 / 编辑 / 语音10 分钟超时后返回网关错误
视频创建 / 轮询 / 下载5 分钟 / 30 秒 / 30 分钟按阶段超时
入站请求头 / 读取 / 空闲15 秒 / 5 分钟 / 2 分钟连接被关闭
网关没有内置的请求队列或网关级限流。上游返回 429 时,限流信息会随 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}
json
{
  "object": "list",
  "data": [
    {"id": "模型展示名", "object": "model", "created": 1783820400, "owned_by": "mxgapi"}
  ]
}

该端点默认返回 OpenAI 格式。若请求携带 Anthropic-Version,或携带 X-Api-Key 且 Authorization 不是 Bearer,则返回 Anthropic 格式:

json
{
  "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可调用对话端点可调用媒体端点
chatChat、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-001400请求缺少 model
GW-MODEL-002404模型不存在、已停用或展示名不匹配
GW-MODEL-003400模型分类不支持当前端点操作
GW-MODEL-004503模型绑定的上游端点不可用或 URL 无法解析
GW-MODEL-005503模型绑定的上游端点已停用
模型列表只返回展示名、对象类型、创建时间与归属方,不返回分类、价格或后端模型名。分类与计费以服务端配置为准,客户端不要仅凭模型名称推断能力。

错误码总览#

所有网关错误消息统一以 [错误码] 描述 的形式返回。错误响应会按请求协议自动适配:OpenAI 与媒体端点返回 OpenAI 结构,Anthropic 端点返回 Anthropic 结构,Gemini 端点返回 Google 结构。流式请求在响应头写出后出错时,会发送协议对应的 SSE 错误事件。

OpenAI 风格

json
{
  "error": {
    "message": "[GW-MODEL-002] model 模型展示名 was not found or is disabled",
    "type": "not_found_error",
    "param": null,
    "code": "GW-MODEL-002"
  }
}

Anthropic 风格

json
{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "[GW-REQ-005] prompt is required",
    "code": "GW-REQ-005"
  },
  "request_id": "req_2f8f0c2a9b1d4e6f"
}

Gemini 风格

json
{
  "error": {
    "code": 404,
    "message": "[GW-MODEL-002] model 模型展示名 was not found or is disabled",
    "status": "NOT_FOUND",
    "code_detail": "GW-MODEL-002"
  }
}

完整错误码

HTTP错误码含义与处理
401GW-AUTH-001缺少密钥;补充鉴权头
401GW-AUTH-002密钥无效;在密钥信息页重新复制
403GW-AUTH-003账号被停用;联系管理员
403GW-AUTH-004客户端 IP 不在白名单;调整授权管理页配置
400GW-MODEL-001缺少 model;补充模型展示名
404GW-MODEL-002模型不存在或已停用;调用模型列表确认
400GW-MODEL-003模型分类不支持当前操作;更换模型或端点
503GW-MODEL-004没有可用的上游端点;联系管理员
503GW-MODEL-005上游端点已停用;稍后重试或联系管理员
402GW-BILL-001余额不足;充值模型调用额度
500GW-BILL-002结算失败,本次请求未扣费;可稍后重试
400GW-REQ-001请求体为空、不是合法 JSON 或无法解析
400GW-REQ-002不支持的参数,例如幂等键超过 200 字符或未知 Gemini 方法
413GW-REQ-003请求体超过大小限制
400GW-REQ-004multipart 请求体格式错误
400GW-REQ-005缺少必填字段,例如 prompt、input 或文件
415GW-REQ-006Content-Type 不符合端点要求
404GW-REQ-007未知端点
405GW-REQ-008请求方法不被该端点允许
409GW-IDEM-001相同幂等请求正在处理中,或流式结果不可重放
422GW-IDEM-002同一幂等键已用于不同的请求内容
502GW-UPSTREAM-001上游不可达或连接超时
4xxGW-UPSTREAM-002上游以 4xx 拒绝了请求,状态码通常原样返回
502GW-UPSTREAM-003上游 5xx 错误
502GW-UPSTREAM-004上游返回了无法读取或解析的响应
502GW-UPSTREAM-005上游鉴权失败(上游 401/403 映射为 502)
429GW-UPSTREAM-006上游限流;读取 Retry-After 后退避
502GW-STREAM-001上游流式响应中途结束
404GW-STREAM-002续传令牌不存在或不属于当前密钥
404GW-FILE-001文件不存在或不属于当前账号
413GW-FILE-002文件超过 32 MiB
500GW-FILE-003文件存储初始化或写入失败
400GW-MEDIA-001媒体端点不支持该操作,例如流式图像或 SSE 语音
404GW-MEDIA-002视频任务不存在或不属于当前账号
409GW-MEDIA-003视频尚未完成,暂不能下载内容
404GW-RESP-001响应 ID 不存在、上下文为空或不属于当前账号
500GW-SYS-001网关内部错误;携带 X-Request-Id 联系管理员
503GW-SYS-003数据库不可用;稍后重试

OpenAI Chat#

POSThttps://api.yunzhiapi.cn/v1/chat/completions

与 OpenAI Chat Completions 兼容。网关校验模型分类后,把请求中的 model 替换为上游后端名转发;当上游端点本身就是 Chat 协议时,除 model、stream 与流式 usage 选项外,其余字段原样直通。

请求字段

字段类型必填说明
modelstring是模型展示名
messagesarray是消息数组;角色支持 system、developer、user、assistant、tool
streamboolean否是否使用 SSE 流式输出,默认 false
stream_optionsobject否流式时可传 include_usage;网关会强制向上游请求 usage
max_tokens / max_completion_tokensinteger否最大输出 Token;两者同时存在时取 max_completion_tokens
temperature / top_pnumber否采样参数
ninteger否生成候选数量;跨协议转换时只保留第一个候选并记录降级
stopstring / string[]否停止序列
presence_penalty / frequency_penalty / seedmixed否原样转发
logprobs / top_logprobsmixed否原样转发,是否生效取决于上游
response_formatobject否支持 text、json_object、json_schema,按目标协议转换
tools / tool_choice / parallel_tool_callsmixed否函数调用相关字段;旧版 functions/function_call 也会被识别
reasoning_effort / reasoningmixed否推理强度;跨协议时转换为目标协议可表达的思考参数
modalities / audio / imagemixed否多模态输出参数,按目标协议转换
metadata / user / store / service_tiermixed否原样转发或按目标协议映射
prompt_cache_key / safety_identifierstring否原样转发
其他未列出的字段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":"..."}回传函数执行结果

完整示例

bash
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
  }'

流式响应

text
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_items

Responses 入口支持状态化会话、输入条目数组、推理项与工具调用。网关会把输入条目规范化为内部消息,再按上游协议编码;当上游原生为 Responses 时,请求在补齐 model、stream 后直通。

请求字段

字段类型必填说明
modelstring是模型展示名
inputstring / array / object条件必填文本、输入条目数组或单个条目对象;与 previous_response_id 至少提供一个
instructionsstring否系统指令,转换为 system 消息
previous_response_idstring否续接上一轮上下文,必须属于当前账号
max_output_tokensinteger否最大输出 Token
temperature / top_p / top_k / top_logprobsmixed否采样参数
streamboolean否SSE 流式输出
tools / tool_choice / parallel_tool_callsmixed否函数、custom、MCP 与托管工具均会解析;跨协议时按目标能力转换
reasoningobject否effort 与 summary;summary 在 Chat 上游不支持时会记录降级
text.formatobject否结构化输出格式,支持 text、json_object、json_schema
metadata / store / user / service_tiermixed否按目标协议映射或直通
background / truncation / includemixed否转发给 Responses 上游;网关不实现后台队列或上下文截断
conversation / prompt_cache_key / safety_identifierstring否透传或记录

支持的输入条目

type说明
message 或省略 type普通消息,content 可为 input_text、input_image、input_file、input_audio 等分片
function_call / custom_tool_callassistant 侧工具调用,转为内部 tool_calls
function_call_output / custom_tool_call_output工具结果,转为 tool 消息
reasoning推理项,保留 summary、encrypted_content 与 signature
item_reference当前无法解析,记录降级后跳过
其他未知 type记录降级后跳过,不会导致整个请求失败

非流式示例

bash
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
  }'
json
{
  "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 时不会保存,查询返回 404 GW-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 时请求直通;否则按目标协议转换。

请求字段

字段类型必填说明
modelstring是模型展示名
max_tokensinteger否最大输出 Token;Messages 同一协议直通且缺省时网关补 4096
messagesarray是至少一条;role 为 user 或 assistant,content 可为字符串或内容块数组
systemstring / array否系统提示,支持字符串或文本块数组
streamboolean否SSE 流式输出
temperature / top_p / top_kmixed否采样参数
stop_sequencesstring[]否停止序列
toolsarray否自定义工具与 web_search 等服务器工具;跨协议时转换
tool_choiceobject否auto、any、tool 等策略;disable_parallel_tool_use 会映射为 parallel 设置
thinkingobject否{"type":"enabled","budget_tokens":2048} 或 {"type":"adaptive"}
output_config / output_formatobject否推理 effort 与结构化输出格式
metadata.user_idstring否映射为内部 user 标识
cache_controlobject否提示缓存标记;跨协议时尽量保留,无法表达时记录降级
container / context_management / mcp_serversmixed否记录到扩展字段,是否生效取决于目标上游

内容块

类型结构说明
文本{"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":"..."}}转换为文件输入
bash
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
  }'

成功响应

json
{
  "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 事件会原样出现在流中。

text
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 等生成参数不会报错。该端点会校验密钥,但不校验模型是否存在。

bash
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"}]
  }'
json
{"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 编码。

请求字段

字段类型必填说明
contentsarray是内容对象数组;role 通常为 user 或 model
systemInstructionobject否系统指令,content.parts 中放文本
generationConfig.temperature / topP / topKmixed否采样参数
generationConfig.maxOutputTokensinteger否最大输出 Token
generationConfig.stopSequencesstring[]否停止序列
generationConfig.candidateCountinteger否候选数量;跨协议转换时只保留第一个
generationConfig.responseMimeType / responseSchema / responseJsonSchemamixed否结构化输出;MIME 包含 json 时转换为 JSON 输出
generationConfig.thinkingConfigobject否thinkingBudget、thinkingLevel、includeThoughts
generationConfig.speechConfigobject否语音输出音色,取 prebuiltVoiceConfig.voiceName
generationConfig.imageConfigobject否aspectRatio 与 imageSize
tools[].functionDeclarationsarray否函数声明,转换为目标协议工具
toolConfig.functionCallingConfigobject否AUTO、ANY、NONE 与 allowedFunctionNames
safetySettingsarray否同协议直通时原样转发,跨协议时记录降级
cachedContentstring否缓存内容引用,跨协议时无法表达则丢弃

内容部件

部件结构说明
文本{"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
bash
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
    }
  }'
json
{
  "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"
}
Gemini 原生路径中的模型名必须做 URL 编码。上面的示例使用 Python 的 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 的分片。

bash
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 为必填;模型名会做存在性校验,但不会检查模型分类是否支持生成。

bash
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"}]}]
  }'
json
{"totalTokens": 96}

模型列表与目录#

GEThttps://api.yunzhiapi.cn/v1/modelsGEThttps://api.yunzhiapi.cn/v1beta/models

OpenAI 格式只返回 id、object、created 与 owned_by。Anthropic 格式包含 type、id、display_name 与 created_at。Gemini 格式返回 models 数组,每项包含 name、displayName、description、supportedGenerationMethods 与 version,不包含上下文长度或输出上限。

json
{
  "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。

生成字段

字段类型必填说明
modelstring是图像模型展示名
promptstring是提示词,不能为空
ninteger否生成数量,默认 1
sizestring否如 1024x1024;Gemini 端点会把部分尺寸映射为宽高比
quality / stylestring否原样转发给 OpenAI 形态上游
response_formatstring否url 或 b64_json
background / output_format / moderationmixed否原样转发
user / safety_identifierstring否调用方标识
imagestring否参考图 data URL;仅 OpenAI 形态上游会收到,Gemini 原生图像端点只使用提示词
streamboolean否必须为 false;流式图像不支持

生成示例

bash
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 外的全部表单字段。

bash
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"

响应

json
{
  "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 结构;如果上游只返回文本,转换结果为空时同样视为失败。

图像生成可能超过 60 秒。客户端超时建议不低于 300 秒;失败路径会退回未结算的预扣金额,已产生上游用量的请求仍可能按实际用量结算。

语音合成#

POSThttps://api.yunzhiapi.cn/v1/audio/speech

语音合成使用 JSON,成功响应为二进制音频。模型必须属于 tts 分类。网关不支持 SSE 语音流,stream_format=sse 会返回 400 GW-MEDIA-001;如需流式音频,请使用 stream_format=audio 或普通二进制响应。

请求字段

字段类型必填说明
modelstring是语音模型展示名
inputstring是待合成文本,不能为空
voicestring否音色名称;Gemini 原生端点默认使用 Kore
response_formatstring否mp3、opus、aac、flac、wav、pcm
speednumber否语速,原样转发给 OpenAI 形态上游
stream_formatstring否不能为 sse
reference_audiostring否参考音频 URL 或 Base64;仅 OpenAI 形态上游会收到
bash
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 分类。任务创建时完成预扣,任务进入终态时结算。

创建字段

字段类型必填说明
modelstring是视频模型展示名
promptstring是视频提示词
secondsstring / integer否时长,默认 8 秒
sizestring否尺寸,默认 1280x720
aspect_ratiostring否宽高比,如 16:9
resolutionstring否分辨率档位
negative_promptstring否负向提示词
ninteger否生成数量,1 到 8,默认 1
image / input_referencemixed否首帧参考图;JSON 支持 URL、data URL 或对象,multipart 使用 input_reference / image 文件字段

JSON 与 multipart 两种请求方式均支持。multipart 表单项包括 model、prompt、seconds、size、aspect_ratio、resolution、negative_prompt、n 与参考图文件。

bash
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
  }'

任务对象

json
{
  "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,并退回预扣金额。

bash
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。下载端点需要与创建任务相同的密钥。

bash
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
bash
curl https://api.yunzhiapi.cn/v1/files \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@/path/to/document.pdf" \
  -F "purpose=assistants"
json
{
  "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。

json
{
  "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 Chattext/event-streamdata: {chat.completion.chunk},空行分隔data: [DONE]
OpenAI Responsestext/event-streamevent: 事件名 + data: {json}response.completed / incomplete / failed
Anthropic Messagestext/event-streamevent: 事件名 + data: {json}message_stop
Gemini GenerateContenttext/event-streamdata: {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 即为续传令牌。客户端断线后,使用同一密钥请求续传端点,网关会把流缓冲区中已经记录的事件重新发送给客户端。续传接口只回放已缓冲事件,不会重新调用上游,也不会重复计费。

bash
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 获取新增事件。
  • 缓存的终止事件会被回放;客户端收到后应关闭连接。
不要在多条业务链路之间共享续传令牌。令牌与密钥绑定,只保证对应流的已缓冲内容,不适合作为长期会话 ID 使用。

幂等机制#

网关为所有计费请求建立幂等记录。幂等键由 API 密钥与客户端幂等键的 SHA-256 组合生成:

text
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结果未保存,无法回放;请调整请求或改用流式/分页读取

请求示例

bash
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,则费用为:

text
输入费用 = 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} 会清空正文与上下文;计费审计仍保留在用量流水表中。
bash
# 第一轮
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:

json
{
  "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 等路径。

bash
pip install openai
npm install openai
python
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)
javascript
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);
SDK 自带重试会在失败时自动重发请求。若希望重试安全,请关闭 SDK 重试并自行控制,或在请求头中固定传入 Idempotency-Key,避免重复计费。

Anthropic SDK#

Anthropic SDK 的 base_url 填网关根地址 https://api.yunzhiapi.cn,SDK 会自动追加 /v1/messages。密钥可放在 api_key(x-api-key)或 auth_token(Authorization: Bearer)。

python
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)
javascript
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。

javascript
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);
python
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 ChatPOST https://api.yunzhiapi.cn/v1/chat/completionsAuthorization: Bearermodel、messages、stream
OpenAI ResponsesPOST https://api.yunzhiapi.cn/v1/responsesAuthorization: Bearermodel、input、stream
AnthropicPOST https://api.yunzhiapi.cn/v1/messagesx-api-keymodel、messages、max_tokens
GeminiPOST https://api.yunzhiapi.cn/v1beta/models/{model}:generateContentx-goog-api-keycontents、generationConfig
图像POST https://api.yunzhiapi.cn/v1/images/generationsAuthorization: Bearermodel、prompt、n、size
语音POST https://api.yunzhiapi.cn/v1/audio/speechAuthorization: Bearermodel、input、voice、response_format
视频POST https://api.yunzhiapi.cn/v1/videosAuthorization: Bearermodel、prompt、seconds
文件POST https://api.yunzhiapi.cn/v1/filesAuthorization: Bearermultipart: file、purpose
生产环境请使用支持连接池与流式读取的 HTTP 客户端,并设置总超时、读取空闲超时与最大响应体大小。不要对 4xx 参数错误做无条件重试。

Claude Code#

Claude Code 使用 Anthropic Messages 协议,并在压缩上下文前调用 count_tokens。网关两者均已支持。通过环境变量把请求指向本站:

bash
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):

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"
bash
codex exec "总结当前仓库的目录结构"

base_url 填网关根地址即可,Codex 会请求 /responses;网关同时支持 /responses 与 /v1/responses。如果上游拒绝 reasoning.summary 或 web_search 工具,网关会按「兼容重试与脱敏」中的规则移除并重试,因此建议把 model_reasoning_summary 设为 none;需要展示深度思考时,可改用支持思考的模型并恢复为 detailed。

ZCode#

ZCode 可分别使用三种协议入口。供应商配置示例:

供应商类型API 类型Base URL说明
Chatopenai-chat-completions请求 /v1/chat/completions
Responsesopenai-responses请求 /responses
Anthropicanthropic-messages请求 /v1/messages
json
[
  {
    "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 的客户端,都可以使用以下配置:

配置项填写值
ProviderOpenAI Compatible / OpenAI API
Base URLhttps://api.yunzhiapi.cn/v1
API Key模型对接密钥
ModelGET /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 URLhttps://api.yunzhiapi.cn/v1
API Key模型对接密钥
模型名称模型展示名
上下文长度按模型实际窗口填写
流式模式支持
函数调用支持透传,是否生效取决于模型与上游

Dify 的文本向量化功能需要 /v1/embeddings,本网关未提供该端点;请勿把 Dify 的 Text Embedding 类型指向本网关。Dify 的联网搜索与代码执行由 Dify 自身插件执行,不会通过网关的托管工具运行。

故障排查#

现象常见原因排查步骤
所有请求 404Base 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-004IP 白名单不包含出口 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。
  • 图像、视频与长文本请求请同时说明客户端超时设置。

常见问题#

分协议:OpenAI SDK 与 OpenAI 兼容客户端填 https://api.yunzhiapi.cn/v1;Anthropic SDK 与 Codex 填根地址 https://api.yunzhiapi.cn,SDK 会追加 /v1/messages 或 /responses;Gemini SDK 填根地址,SDK 会追加 /v1beta。填错通常表现为 404。
不需要。网关直接使用密钥值查询账号,不校验前缀。请原样复制「密钥信息」页生成的值,不要自行添加或删除字符。
网关会把请求中的展示名替换为上游后端名,响应返回前再替换回展示名。若你看到的是其他名称,可能是上游自行改写了响应或客户端缓存了旧响应,请携带 request_id 联系管理员。
支持所有能自定义 OpenAI Base URL 的客户端,以及 Anthropic 与 Gemini 自定义端点客户端。已给出 Claude Code、Codex CLI、ZCode、Cursor / Windsurf / Cline 等 OpenAI 兼容客户端、Gemini 客户端与 Dify 的配置说明。托管工具、联网搜索、向量化与语音转写是否可用取决于目标模型与上游,且网关未提供 embeddings 与 transcriptions 端点。
未产生有效输出的失败通常不会扣费:鉴权失败、余额不足、上游错误、连接失败、超时与空响应会退回预扣金额。若响应已经产生上游 usage,网关可能按实际用量结算;成功响应按实际 usage 多退少补,幂等回放不会重复扣费。
网关没有内置队列或网关级限流;429 通常来自上游。读取 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。
网关不会使用请求数据训练模型。请求内容会实时转发至所选模型的上游供应商,其数据政策以对应供应商为准;平台侧保留必要的调用记录、Token 用量与计费数据用于对账和排障。请勿在请求中提交无关的敏感个人信息。
费用与用量响应头只在非流式对话、图像、编辑与语音成功响应中返回。流式请求与视频任务在结算前已经发送响应头,请通过「模型日志」页查看结算金额、Token 与预扣差额。
登录后打开侧边栏「模型日志」。页面会自动读取当前模型对接密钥,只展示该密钥的脱敏记录,支持状态、接口类型、模型、时间范围与关键词筛选,并可按 25 / 50 / 100 / 250 / 500 条分页查看。