旭恒数据 API 文档

完全兼容 OpenAI 协议,一个端点接入多家主流大模型

能做什么

  • 统一入口:GPT、Claude、Gemini、DeepSeek 等模型全部走同一个接口和同一把密钥。
  • 流式输出:支持 SSE 实时返回,打字机效果,首字延迟低。
  • 按量计费:按输入 / 输出 token 精确扣费,费用实时可见。
  • 多密钥管理:一个账号可创建多把密钥,分别设置额度与用途。
  • 用量统计:每次调用都有记录,可按模型、时间维度查询。

1接口地址

所有接口都挂在同一个基础地址下:

BASE https://www.xhoper.xyz/v1

完整端点列表:

方法路径说明
GET/v1/models获取可用模型列表
POST/v1/chat/completions对话补全(支持流式)
路径末尾不要加斜杠。/v1/chat/completions 正确,/v1/chat/completions/ 虽然也能访问,但不推荐。

2鉴权方式

所有请求都要在 HTTP 头带上你的 API 密钥,使用标准 Bearer 方式:

http
Authorization: Bearer sk-你的密钥

如何获取密钥

  1. 登录控制台 → 左侧菜单「API 密钥」
  2. 点击「新建密钥」,填写名称(例如「生产环境」)
  3. 创建成功后会显示完整密钥,形如 sk-4de7b44a...
  4. 复制保存好,页面关闭后只显示前缀
安全提醒:密钥等同于账户余额,切勿提交到 Git 仓库、写进前端代码或分享给他人。建议后端环境变量存储。若怀疑泄露,立即在控制台删除并重建。

鉴权失败的表现

密钥缺失或无效时返回 HTTP 401:

json
{
  "error": {
    "message": "Invalid API key",
    "type": "invalid_request_error",
    "code": "invalid_api_key"
  }
}

3快速开始

用 Python 官方 SDK,三行代码跑通第一次调用:

python
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 直接测试:

bash
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":"你好"}]}'
调用前请确保账户余额大于 0。余额不足会返回 402 insufficient_quota。

4模型列表

GET/v1/models

返回当前账号可用的全部模型,字段与 OpenAI 保持一致。

请求示例

bash
curl https://www.xhoper.xyz/v1/models \
  -H "Authorization: Bearer sk-你的密钥"

响应示例

json
{
  "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对话补全

POST/v1/chat/completions

核心接口,发送消息列表,返回模型回复。兼容 OpenAI 的请求与响应结构。

最小请求

json
{
  "model": "gpt-4o-mini",
  "messages": [
    { "role": "user", "content": "你好" }
  ]
}

响应示例

json
{
  "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)逐块返回,实现打字机效果。

json
{
  "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 流式示例

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 支持的字段:

字段类型必填说明
modelstring必填模型 ID,如 gpt-4o-mini。必须是 /v1/models 返回的其中之一。
messagesarray必填消息列表,见下方「messages 结构」。
streamboolean可选是否流式返回,默认 false。
temperaturenumber可选随机性,0~2,越大越发散。默认 1。
top_pnumber可选核采样,0~1。与 temperature 二选一调整。
max_tokensinteger可选限制回复的最大 token 数。
stopstring / array可选遇到这些字符串就停止生成。
presence_penaltynumber可选-2~2,鼓励谈论新话题。
frequency_penaltynumber可选-2~2,降低重复用词。
response_formatobject可选设为 {"type":"json_object"} 强制返回 JSON。
toolsarray可选可调用的函数定义,见「函数调用」。
tool_choicestring / object可选auto / none / 指定函数。
userstring可选终端用户标识,便于排查问题。

messages 结构

每个元素是一个对象,按对话顺序排列:

role说明
system系统提示,设定模型的角色与行为。通常放在第一条。
user用户输入。
assistant模型历史回复。多轮对话时需要带上。
tool工具调用结果,配合函数调用使用。
json
{
  "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响应结构

字段类型说明
idstring本次调用的唯一标识。
objectstring固定为 chat.completion。
createdintegerUnix 时间戳(秒)。
modelstring实际使用的模型。
choicesarray结果数组,通常只有一个元素。
choices[].indexinteger序号,从 0 开始。
choices[].message.rolestring固定为 assistant。
choices[].message.contentstring模型回复的内容。
choices[].finish_reasonstring停止原因,见下表。
usageobjecttoken 用量统计。
usage.prompt_tokensinteger输入消耗的 token 数。
usage.completion_tokensinteger输出消耗的 token 数。
usage.total_tokensinteger合计。

finish_reason 取值

值含义
stop正常结束。
length达到 max_tokens 限制被截断。
tool_calls模型请求调用函数。
content_filter内容被安全策略过滤。

9图片理解

支持视觉的模型(如 gpt-4o)可以接收图片。把 content 从字符串改成数组即可:

json
{
  "model": "gpt-4o",
  "messages": [{
    "role": "user",
    "content": [
      { "type": "text", "text": "这张图里有什么?" },
      { "type": "image_url", "image_url": { "url": "https://example.com/cat.jpg" } }
    ]
  }]
}

Base64 内联

本地图片可以转成 data URL 直接传:

json
{
  "type": "image_url",
  "image_url": {
    "url": "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
  }
}
图片会按尺寸折算 token,费用比纯文本高。建议先把大图压缩到合理分辨率再上传。

10JSON 输出

需要结构化数据时,设置 response_format 可以强制模型输出合法 JSON:

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":"北京"}
使用 JSON 模式时,messages 里必须出现 "JSON" 这个词(在 system 或 user 消息中),否则部分上游会报错。

11函数调用

让模型决定是否调用你定义的函数,适合查数据库、调外部 API 等场景。声明 tools 即可:

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

python
pip install openai
python
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

bash
npm i openai
javascript
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

bash
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
<?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 服务暂时不可用或未配置上游。联系管理员。

处理建议

python
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 计费,分输入和输出两部分,费率由模型决定:

计费项说明
输入 tokenmessages 里所有内容的 token 总和。
输出 token模型生成的回复 token 数。
扣费公式输入tokens × 输入单价 + 输出tokens × 输出单价

查看用量

  • 控制台「用量统计」:按日期、模型查看明细
  • 控制台「调用日志」:逐条记录每次请求的 token 与费用
  • 响应体的 usage 字段:单次调用的精确统计

余额说明

余额 = 充值余额 + 赠送余额。调用时优先扣赠送额度。余额 ≤ 0 时接口返回 402。

并发建议

  • 单密钥建议并发不超过 10,需要更高并发可创建多把密钥分摊。
  • 流式请求占用连接时间较长,注意控制同时进行的流数量。
  • 遇到 429 时使用指数退避重试(1s、2s、4s…)。

15最佳实践

1. 密钥放服务端

绝对不要把密钥写进前端 JS、小程序、App 或任何用户能拿到的位置。正确做法:前端请求你自己的后端,后端再调用本 API。

2. 用环境变量管理

# .env
XHOPER_API_KEY=sk-你的密钥
XHOPER_BASE_URL=https://www.xhoper.xyz/v1
python
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. 处理超时

python
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:如何在浏览器里调用?

不推荐——会暴露密钥。确需前端临时调试,可用后端代理一层。生产环境务必服务端调用。

还有问题?登录控制台提交工单,或联系客服。描述里带上请求时间、模型名、错误信息,能更快定位。
© 旭恒AI 保留所有权利
未经授权禁止复制、修改、分发或用于商业用途