旭恒数据 API 文档
完全兼容 OpenAI 协议,一个端点接入多家主流大模型
能做什么
- 统一入口:GPT、Claude、Gemini、DeepSeek 等模型全部走同一个接口和同一把密钥。
- 流式输出:支持 SSE 实时返回,打字机效果,首字延迟低。
- 按量计费:按输入 / 输出 token 精确扣费,费用实时可见。
- 多密钥管理:一个账号可创建多把密钥,分别设置额度与用途。
- 用量统计:每次调用都有记录,可按模型、时间维度查询。
1接口地址
所有接口都挂在同一个基础地址下:
完整端点列表:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /v1/models | 获取可用模型列表 |
| POST | /v1/chat/completions | 对话补全(支持流式) |
/v1/chat/completions 正确,/v1/chat/completions/ 虽然也能访问,但不推荐。2鉴权方式
所有请求都要在 HTTP 头带上你的 API 密钥,使用标准 Bearer 方式:
Authorization: Bearer sk-你的密钥
如何获取密钥
- 登录控制台 → 左侧菜单「API 密钥」
- 点击「新建密钥」,填写名称(例如「生产环境」)
- 创建成功后会显示完整密钥,形如
sk-4de7b44a... - 复制保存好,页面关闭后只显示前缀
鉴权失败的表现
密钥缺失或无效时返回 HTTP 401:
{
"error": {
"message": "Invalid API key",
"type": "invalid_request_error",
"code": "invalid_api_key"
}
}
3快速开始
用 Python 官方 SDK,三行代码跑通第一次调用:
from openai import OpenAI client = OpenAI( base_url="https://www.xhoper.xyz/v1", api_key="sk-你的密钥", ) resp = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": "你好"}], ) print(resp.choices[0].message.content)
或者用 curl 直接测试:
curl https://www.xhoper.xyz/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的密钥" \ -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"你好"}]}'
402 insufficient_quota。4模型列表
返回当前账号可用的全部模型,字段与 OpenAI 保持一致。
请求示例
curl https://www.xhoper.xyz/v1/models \
-H "Authorization: Bearer sk-你的密钥"
响应示例
{
"object": "list",
"data": [
{ "id": "gpt-4o-mini", "object": "model", "owned_by": "gateway", "created": 0 },
{ "id": "gpt-4o", "object": "model", "owned_by": "gateway", "created": 0 }
]
}
5对话补全
核心接口,发送消息列表,返回模型回复。兼容 OpenAI 的请求与响应结构。
最小请求
{
"model": "gpt-4o-mini",
"messages": [
{ "role": "user", "content": "你好" }
]
}
响应示例
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"created": 1793172218,
"model": "gpt-4o-mini",
"choices": [{
"index": 0,
"message": { "role": "assistant", "content": "你好!有什么可以帮你的?" },
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 9,
"completion_tokens": 12,
"total_tokens": 21
}
}
6流式输出
请求体加 "stream": true,服务端会以 SSE(Server-Sent Events)逐块返回,实现打字机效果。
{
"model": "gpt-4o-mini",
"messages": [{ "role": "user", "content": "写一首短诗" }],
"stream": true
}
流式响应格式
每条数据以 data: 开头,最后以 data: [DONE] 结束:
data: {"choices":[{"delta":{"role":"assistant"},"index":0}]}
data: {"choices":[{"delta":{"content":"春"},"index":0}]}
data: {"choices":[{"delta":{"content":"风"},"index":0}]}
data: {"choices":[{"delta":{},"finish_reason":"stop","index":0}]}
data: [DONE]
Python 流式示例
from openai import OpenAI client = OpenAI(base_url="https://www.xhoper.xyz/v1", api_key="sk-你的密钥") stream = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": "写一首短诗"}], stream=True, ) for chunk in stream: delta = chunk.choices[0].delta if delta.content: print(delta.content, end="", flush=True)
usage 统计通常只在最后一个 chunk 里出现(或者完全没有)。如果需要精确用量,请用非流式请求,或在最后一块里读取 usage。7请求参数
POST /v1/chat/completions 支持的字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 必填 | 模型 ID,如 gpt-4o-mini。必须是 /v1/models 返回的其中之一。 |
messages | array | 必填 | 消息列表,见下方「messages 结构」。 |
stream | boolean | 可选 | 是否流式返回,默认 false。 |
temperature | number | 可选 | 随机性,0~2,越大越发散。默认 1。 |
top_p | number | 可选 | 核采样,0~1。与 temperature 二选一调整。 |
max_tokens | integer | 可选 | 限制回复的最大 token 数。 |
stop | string / array | 可选 | 遇到这些字符串就停止生成。 |
presence_penalty | number | 可选 | -2~2,鼓励谈论新话题。 |
frequency_penalty | number | 可选 | -2~2,降低重复用词。 |
response_format | object | 可选 | 设为 {"type":"json_object"} 强制返回 JSON。 |
tools | array | 可选 | 可调用的函数定义,见「函数调用」。 |
tool_choice | string / object | 可选 | auto / none / 指定函数。 |
user | string | 可选 | 终端用户标识,便于排查问题。 |
messages 结构
每个元素是一个对象,按对话顺序排列:
| role | 说明 |
|---|---|
system | 系统提示,设定模型的角色与行为。通常放在第一条。 |
user | 用户输入。 |
assistant | 模型历史回复。多轮对话时需要带上。 |
tool | 工具调用结果,配合函数调用使用。 |
{
"model": "gpt-4o-mini",
"messages": [
{ "role": "system", "content": "你是一个简洁的助手" },
{ "role": "user", "content": "什么是 REST?" },
{ "role": "assistant", "content": "REST 是一种网络架构风格。" },
{ "role": "user", "content": "再简短一点" }
],
"temperature": 0.7,
"max_tokens": 200
}
8响应结构
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 本次调用的唯一标识。 |
object | string | 固定为 chat.completion。 |
created | integer | Unix 时间戳(秒)。 |
model | string | 实际使用的模型。 |
choices | array | 结果数组,通常只有一个元素。 |
choices[].index | integer | 序号,从 0 开始。 |
choices[].message.role | string | 固定为 assistant。 |
choices[].message.content | string | 模型回复的内容。 |
choices[].finish_reason | string | 停止原因,见下表。 |
usage | object | token 用量统计。 |
usage.prompt_tokens | integer | 输入消耗的 token 数。 |
usage.completion_tokens | integer | 输出消耗的 token 数。 |
usage.total_tokens | integer | 合计。 |
finish_reason 取值
| 值 | 含义 |
|---|---|
stop | 正常结束。 |
length | 达到 max_tokens 限制被截断。 |
tool_calls | 模型请求调用函数。 |
content_filter | 内容被安全策略过滤。 |
9图片理解
支持视觉的模型(如 gpt-4o)可以接收图片。把 content 从字符串改成数组即可:
{
"model": "gpt-4o",
"messages": [{
"role": "user",
"content": [
{ "type": "text", "text": "这张图里有什么?" },
{ "type": "image_url", "image_url": { "url": "https://example.com/cat.jpg" } }
]
}]
}
Base64 内联
本地图片可以转成 data URL 直接传:
{
"type": "image_url",
"image_url": {
"url": "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
}
}
10JSON 输出
需要结构化数据时,设置 response_format 可以强制模型输出合法 JSON:
{
"model": "gpt-4o-mini",
"messages": [
{ "role": "system", "content": "只输出 JSON,不要任何解释" },
{ "role": "user", "content": "把「张三,28岁,北京」转成 JSON" }
],
"response_format": { "type": "json_object" }
}
返回的 content 会是一段 JSON 字符串:
{"name":"张三","age":28,"city":"北京"}
messages 里必须出现 "JSON" 这个词(在 system 或 user 消息中),否则部分上游会报错。11函数调用
让模型决定是否调用你定义的函数,适合查数据库、调外部 API 等场景。声明 tools 即可:
{
"model": "gpt-4o-mini",
"messages": [{ "role": "user", "content": "北京现在天气怎么样?" }],
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": { "type": "string", "description": "城市名" }
},
"required": ["city"]
}
}
}]
}
模型会返回 tool_calls 告诉你调用哪个函数、什么参数:
{
"choices": [{
"message": {
"role": "assistant",
"tool_calls": [{
"id": "call_abc",
"type": "function",
"function": { "name": "get_weather", "arguments": "{\"city\":\"北京\"}" }
}]
},
"finish_reason": "tool_calls"
}]
}
你执行完函数后,把结果以 role: "tool" 回传,模型继续作答:
{
"role": "tool",
"tool_call_id": "call_abc",
"content": "晴,18°C"
}
12多语言示例
Python
pip install openai
from openai import OpenAI client = OpenAI( base_url="https://www.xhoper.xyz/v1", api_key="sk-你的密钥", ) resp = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": "你好"}], ) print(resp.choices[0].message.content)
Node.js
npm i openai
import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://www.xhoper.xyz/v1", apiKey: "sk-你的密钥", }); const resp = await client.chat.completions.create({ model: "gpt-4o-mini", messages: [{ role: "user", content: "你好" }], }); console.log(resp.choices[0].message.content);
curl
curl https://www.xhoper.xyz/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的密钥" \ -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"你好"}]}'
PHP
<?php $ch = curl_init("https://www.xhoper.xyz/v1/chat/completions"); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Content-Type: application/json", "Authorization: Bearer sk-你的密钥", ], CURLOPT_POSTFIELDS => json_encode([ "model" => "gpt-4o-mini", "messages" => [["role" => "user", "content" => "你好"]], ]), ]); $resp = json_decode(curl_exec($ch), true); echo $resp["choices"][0]["message"]["content"];
13错误码
出错时返回对应 HTTP 状态码,响应体结构与 OpenAI 一致:
{
"error": {
"message": "具体错误说明",
"type": "错误类型",
"code": "错误码"
}
}
| 状态码 | code | 原因与处理 |
|---|---|---|
| 400 | invalid_request_error |
请求体格式错误、缺少必填参数。检查 JSON 结构和 messages。 |
| 401 | invalid_api_key |
密钥缺失、无效或被删除。检查 Authorization 头。 |
| 402 | insufficient_quota |
余额不足。去控制台充值。 |
| 403 | forbidden |
密钥被禁用或无权访问该资源。检查密钥状态。 |
| 404 | invalid_model |
模型不存在或未上架。先调 /v1/models 查可用列表。 |
| 429 | rate_limit_exceeded |
请求过于频繁。降低并发或加重试退避。 |
| 500 | internal_error |
服务内部异常。可重试,持续出现请联系客服。 |
| 502 | upstream_error |
上游模型服务异常。稍后重试。 |
| 503 | service_unavailable |
服务暂时不可用或未配置上游。联系管理员。 |
处理建议
import time from openai import OpenAI, APIStatusError, RateLimitError client = OpenAI(base_url="https://www.xhoper.xyz/v1", api_key="sk-你的密钥") def ask(prompt, retries=3): for i in range(retries): try: r = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": prompt}], ) return r.choices[0].message.content except RateLimitError: time.sleep(2 ** i) except APIStatusError as e: if e.status_code >= 500 and i < retries - 1: time.sleep(2 ** i) else: raise raise RuntimeError("重试次数用尽")
14速率与计费
计费方式
按 token 计费,分输入和输出两部分,费率由模型决定:
| 计费项 | 说明 |
|---|---|
| 输入 token | messages 里所有内容的 token 总和。 |
| 输出 token | 模型生成的回复 token 数。 |
| 扣费公式 | 输入tokens × 输入单价 + 输出tokens × 输出单价 |
查看用量
- 控制台「用量统计」:按日期、模型查看明细
- 控制台「调用日志」:逐条记录每次请求的 token 与费用
- 响应体的
usage字段:单次调用的精确统计
余额说明
402。并发建议
- 单密钥建议并发不超过 10,需要更高并发可创建多把密钥分摊。
- 流式请求占用连接时间较长,注意控制同时进行的流数量。
- 遇到
429时使用指数退避重试(1s、2s、4s…)。
15最佳实践
1. 密钥放服务端
2. 用环境变量管理
# .env XHOPER_API_KEY=sk-你的密钥 XHOPER_BASE_URL=https://www.xhoper.xyz/v1
import os from openai import OpenAI client = OpenAI( base_url=os.environ["XHOPER_BASE_URL"], api_key=os.environ["XHOPER_API_KEY"], )
3. 复用 client 实例
不要每次请求都新建 client,会重复建立连接。全局创建一个、反复使用即可。
4. 多轮对话要带上历史
接口是无状态的。想让模型「记住」上下文,需要把之前所有消息都放进 messages 里。历史太长时可以截断早期消息或做摘要压缩。
5. 处理超时
client = OpenAI( base_url="https://www.xhoper.xyz/v1", api_key="sk-你的密钥", timeout=60.0, # 总超时 60 秒 max_retries=2, # SDK 自动重试 2 次 )
16常见问题
Q:能用第三方客户端吗(Cherry Studio、ChatGPT-Next-Web、LobeChat 等)?
可以。这类工具都支持自定义 OpenAI 端点。填两个值即可:
- API Base URL:
https://www.xhoper.xyz/v1 - API Key:你的
sk-密钥
Q:返回 404 说模型不存在?
说明该模型未上架。先调 GET /v1/models 看返回的 id 列表,用列表里的名字,注意大小写和连字符。
Q:为什么返回 401?
- 没带
Authorization头 - 漏了
Bearer前缀(注意后面有空格) - 密钥被删除或禁用
- 密钥前后有多余空格或换行
Q:调用成功但余额没扣?
用量统计和扣费有秒级延迟,稍等刷新即可。若长时间未扣,检查密钥是否属于其他账号。
Q:支持并发吗?有速率限制吗?
支持并发,建议单密钥不超过 10 并发。触发限制会返回 429,用指数退避重试。
Q:流式输出中文乱码?
确保按 UTF-8 解码,并且以 \n\n 分割 SSE 事件。Python SDK 已内部处理,用原生 requests 时需要手动处理。
Q:如何在浏览器里调用?
不推荐——会暴露密钥。确需前端临时调试,可用后端代理一层。生产环境务必服务端调用。