UNAI API

API 文档

统一大模型 API 网关 · 兼容 OpenAI / Claude / Gemini 协议的统一网关

概览

本站提供 OpenAI 兼容的 HTTP 接口。任何支持自定义 base_url 的 SDK 或客户端都可以直接接入,无需修改业务代码。

项目值
Base URLhttp://test.z7z8.site/v1
协议HTTPS(生产环境)/ HTTP(本地调试)
数据格式application/json
编码UTF-8

鉴权

所有 /v1 请求都必须在请求头携带 API Key:

Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxx
API Key 可在「控制台 → API 密钥」中创建。Key 只在创建时完整显示一次,请立即保存。若 Key 泄露,请立刻在控制台删除并重建。

快速开始

下面三种写法等价,选你手上已有的那个。所有示例都可以直接复制运行,只需要把 sk-xxxx 换成你自己的 Key。

curl http://test.z7z8.site/v1/chat/completions \
  -H "Authorization: Bearer sk-xxxx" \
  -H "Content-Type: application/json" \
  -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"你好"}]}'
from openai import OpenAI

client = OpenAI(
    api_key="sk-xxxxxxxx",
    base_url="http://test.z7z8.site/v1",
)
resp = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content)
import OpenAI from 'openai';

const client = new OpenAI({
  apiKey: 'sk-xxxxxxxx',
  baseURL: 'http://test.z7z8.site/v1',
});

const r = await client.chat.completions.create({
  model: 'gpt-4o-mini',
  messages: [{ role: 'user', content: '你好' }],
});
console.log(r.choices[0].message.content);
SDK 会自动带上 Authorization 头,所以 Python / Node 示例里没有手写它。用 curl 时必须自己加,少这一行会直接 401。

POST /v1/chat/completions

创建一次对话补全。请求体与 OpenAI 官方保持一致。

字段类型说明
modelstring必填,模型 ID,可从 /v1/models 获取
messagesarray必填,消息列表,role 支持 system/user/assistant/tool
streambool是否流式返回,默认 false
temperaturenumber采样温度,0-2
max_tokensint最大生成 token 数
toolsarray可调用的函数定义
tool_choicestring/object函数调用策略

响应

{
  "id": "chatcmpl-xxxxxxxx",
  "object": "chat.completion",
  "created": 1730000000,
  "model": "gpt-4o-mini",
  "choices": [{
    "index": 0,
    "message": { "role": "assistant", "content": "你好!有什么可以帮你?" },
    "finish_reason": "stop"
  }],
  "usage": { "prompt_tokens": 9, "completion_tokens": 12, "total_tokens": 21 }
}

流式输出

设置 "stream": true 后,服务以 SSE 返回。每行以 data: 开头,最后一个数据块固定为 data: [DONE]。

data: {"id":"chatcmpl-x","choices":[{"delta":{"role":"assistant"},"index":0}]}

data: {"id":"chatcmpl-x","choices":[{"delta":{"content":"你好"},"index":0}]}

data: {"id":"chatcmpl-x","choices":[{"delta":{},"finish_reason":"stop","index":0}]}

data: [DONE]
计费以最终 usage 为准。若上游不返回 usage,网关会按字符数估算,因此流式与一次性调用的账单可能有极小差异。

Function Calling

与 OpenAI 一致:在请求中传入 tools,模型若决定调用,响应里的 finish_reason 为 tool_calls,并在 message.tool_calls 中给出函数名与 JSON 参数。调用方执行函数后,把结果以 role 为 tool 的消息回传即可继续对话。

POST /v1/embeddings

把文本转为向量。请求体为 model 加 input,input 也可以是字符串数组以批量处理。

{
  "object": "list",
  "data": [{ "object": "embedding", "index": 0, "embedding": [0.0123, -0.0456] }],
  "model": "text-embedding-3-small",
  "usage": { "prompt_tokens": 8, "total_tokens": 8 }
}

GET /v1/models

返回当前 API Key 可用的模型列表。

{
  "object": "list",
  "data": [
    { "id": "gpt-4o-mini", "object": "model", "created": 1730000000, "owned_by": "unai" }
  ]
}

错误码

错误统一返回 OpenAI 风格结构,便于 SDK 直接解析:

{
  "error": {
    "message": "用户名或密码错误",
    "type": "invalid_request_error",
    "code": "unauthorized"
  }
}
HTTP含义处理建议
200成功返回 JSON;stream:true 时为 SSE 分块
400请求参数错误检查请求体字段与类型
401未授权 / Key 无效确认 Authorization 头是否正确
403无权限该模型未授权给你的分组,联系管理员
404模型或端点不存在用 /v1/models 确认模型 ID
429触发限流降低并发或稍后重试
500服务内部错误稍后重试,持续失败请联系管理员
502上游渠道异常网关会自动重试与切换渠道

限流与重试

每个 API Key 有独立的每分钟请求上限(RPM)。超限返回 429 并附带 x-ratelimit-remaining 头。

网关在遇到上游 5xx、超时或连接失败时会自动重试并切换到其它可用渠道;对调用方而言通常表现为「稍慢但成功」,无需自行实现故障转移。某个渠道连续失败达到阈值后会被熔断一段时间,期间不再被选中。