接入文档

base_url:https://www.xixiaoci.cn/xmb/app/api

快速开始

三步:注册账号 → 在控制台生成令牌 → 把 base_url 换成上面的地址。 如果你原来就在用 OpenAI SDK,只需要改两行。

# Python + openai SDK
from openai import OpenAI

client = OpenAI(
    api_key="xmbk_你的令牌",
    base_url="https://www.xixiaoci.cn/xmb/app/api/v1",
)

resp = client.chat.completions.create(
    model="deepseek-flash",
    messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content)
地址有两段前缀,别漏。 /xmb 是站点,/app 是应用。 只写 /xmb/api/... 会返回明确的 410 提示页,不会静默失败 —— 因为静默失败会让你以为是自己的代码有问题。

地址对照表

协议完整地址
OpenAI chat/xmb/app/api/v1/chat/completions
OpenAI models/xmb/app/api/v1/models
Anthropic messages/xmb/app/api/anthropic/v1/messages
健康检查/xmb/app/healthz

鉴权

令牌形如 xmbk_ + 32 位字符,在控制台「令牌」页生成。两种 Header 都接受:

# OpenAI 风格
Authorization: Bearer xmbk_xxxxxxxxxxxxxxxx

# Anthropic 风格
x-api-key: xmbk_xxxxxxxxxxxxxxxx
  • 同一个令牌可同时用于两种协议,不需要分开申请。
  • 令牌只在生成时完整显示一次,之后控制台只显示前后几位。
  • 令牌泄露后立即在控制台吊销,吊销即时生效,无需等待缓存过期。
  • 可以为不同项目建不同令牌,按令牌分别看用量。

OpenAI 协议

路径与请求体与 OpenAI /v1/chat/completions 一致,model 填平台的模型 ID。

字段是否必填说明
model必填平台模型 ID,见能力商城
messages必填标准消息数组,支持 system / user / assistant
stream可选true 时返回 SSE 流
max_tokens可选最大输出长度,透传上游
temperature可选透传上游,取值范围随上游模型而定

其余参数原样透传给上游。上游不支持的参数会被忽略而不是报错 —— 换模型时不会因为参数差异导致代码崩掉。但这也意味着你不能靠参数报错来判断上游是否支持某特性,请查上游文档。

Anthropic 协议

路径是 /anthropic/v1/messages,字段名遵循 Anthropic 规范 (max_tokens 必填,内容在 content 数组里)。 这个协议的主要用途是让 Claude Code 之类的工具直接接进来。

# 让 Claude Code 走虾米盒子
export ANTHROPIC_BASE_URL="https://www.xixiaoci.cn/xmb/app/api/anthropic"
export ANTHROPIC_AUTH_TOKEN="xmbk_你的令牌"
claude
# 或用 curl 直接测
curl -X POST "https://www.xixiaoci.cn/xmb/app/api/anthropic/v1/messages" \
  -H "x-api-key: xmbk_你的令牌" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{
    "model": "kimi-k2.6",
    "max_tokens": 256,
    "messages": [{"role": "user", "content": "你好"}]
  }'

注意:这里接的是模型,不是真的 Anthropic 服务。 model 仍然填平台的模型 ID(如 kimi-k2.6), 而不是 claude-*。协议只是外壳,背后是哪家上游由商品池决定。

流式返回

stream: true 时返回 text/event-stream, 每行 data: {...},以 data: [DONE] 结束。 两种协议的流式格式各自保持原有风格,不做混用。

计费在流结束后按实际产出的 token结算,不是按请求发出时预估。 所以中途断开(客户端取消)时,已产出的部分照扣,未产出的不扣。

错误码

HTTP含义你该做什么
401令牌无效或已吊销检查 Header,重新生成令牌
402余额不足充值;或改用 BYOK
404模型不存在或已下架查能力商城的模型 ID
410路径少了 /app按上面的地址对照表修正
429上游限流,池内无备份退避重试;或换同档模型
502/504上游不可用 / 超时平台已尝试切换,仍失败则重试

所有错误响应都带 request_id。这个 ID 可以在控制台查到完整的调用链路: 命中了哪个商品、调了哪家上游、上游返回了什么、是否已扣费。 提工单时报这个 ID,不用贴一堆日志。

上游报错会经过脱敏再返回。 上游的错误文本里有时会带着它自己的账号标识甚至密钥, 平台会在回传前把这类内容替换成 ***。 所以你能看到真实原因(如 max RPM、rate_limit_reached_error), 但看不到任何人的凭证。

BYOK:自带上游 Key

BYOK(Bring Your Own Key)是指你把上游厂商的 Key 交给平台托管, 平台用你的 Key 去调上游,token 费用由你自己的上游账号承担, 平台只按调用次数收一笔通路费。

什么时候该用

  • 你已经有上游大额预付,不想重复充值。
  • 你要用的模型平台没上架。
  • 你需要上游侧的用量统计留在自己账号里。
  • 你的调用量很大,按 token 加价不如按次付费划算。

怎么配

控制台 → 商户中心 → 渠道 → 新增渠道,填上游类型与 Key。平台侧会:

  • 用该 Key 做一次探活调用,失败则不允许保存(防止存进去一个坏 Key)。
  • Key 加密存储,接口返回时永远脱敏成前 4 位 + ***。
  • 每次调用后记录上游返回的状态,连续失败会自动标记该渠道为异常。

边界,必须说清楚

  • BYOK 的通路费按次数计,不按 token。你的 token 越省,单次成本越低。
  • Key 在平台侧是加密存储的,但不是零知识 —— 平台在调用时必须解密使用。如果你的合规要求是"任何第三方都不能持有明文 Key",BYOK 不满足。
  • 上游侧的账单与平台侧的调用记录可能不一致(例如上游按请求计费、平台按返回 token 计)。对账以上游为准,平台记录只作参考。
  • 你删除 Key 后,历史调用记录保留(那是账),但新调用立即失败。

计费与分账说明

这一段是平台最该讲清楚的部分,因为它决定了你的钱去哪了。

资金流向

你充值 100 元
   ↓  站内余额(不是代金券,不过期)
调用产生费用
   ↓  按微厘计算,向上取整到分扣减
   ↓
   ├─→ 上游成本(平台付给模型厂商,约 70%)
   └─→ 毛利(约 30%)
          ├─→ 商户分成(默认 82%)
          ├─→ L1 分销佣金(毛利 6%)
          ├─→ L2 分销佣金(毛利 2%)
          └─→ 平台留存(毛利 92% − 商户分成)

为什么写成「经销商」而不是「中介」

早期版本把这个平台描述成"抽佣 8%–15% 的撮合中介",那是错的。 实际模型是:平台以底价从上游进货,再以零售价卖给你, 赚的是价差,不是佣金。这带来两个你必须知道的后果:

  • 上游涨价直接影响我们。厂商调价传导很快,我们没法像中介那样"只抽固定比例"。所以价格会变。
  • 我们的利益和上游成本是对抗的。你在池子里选更便宜的供应商,我们和你方向一致 —— 那是我们的进货价也更低。

两条硬约束

  • 商户入账总额永不超过用户实付总额。任何时刻这一点被破坏,系统会拒绝落账。
  • 佣金从毛利里出,不动商户货款。分销层级硬上限 2 级,月封顶 2000 元。

找零池

商户侧收入不足 1 分时,不会抹零,也不落虚假分录,而是进「找零池」累计, 凑满整分才记一笔真实账。找零池本身不是账 —— 它只是"还没凑够一分"的过渡量,不构成任何一方的债权。 一切以复式账本的分录为准。

已知边界: 余额校验有两道闸门(调用前预检 + 落账前复核),但两者之间存在极小的竞态窗口。 极端并发下理论上可能出现小幅透支。彻底解决需要账本层原子扣款,尚未实现。 这一项写在这里而不是藏在代码注释里,因为它是你评估风险时需要知道的。

服务承诺

下面这些是当前实际能做到的,不是愿望清单。

项目承诺说明
选品缓存45 秒这是上游故障后最长的切换等待窗口
失败重试池内自动切换仅当同款有第二家供应商时生效
调用留痕全量保留每次调用可凭 request_id 回放
余额一致性每日对账断言对账不平会告警,不会静默通过
令牌吊销即时生效不依赖缓存过期

做不到的,明说

  • 没有 99.9% 的可用性承诺。上游是第三方,我们无法保证它们不挂。平台能做的是切换,不是免除上游故障。
  • 没有赔付条款。调用失败不扣费是基本,但没有额外的 SLA 赔偿。
  • 单点部署。当前是单机部署,机器故障会整体不可用。多活未实现。
  • 上游限流就是限流。某个上游账号的 RPM 打满时,如果池内没有第二家,请求就是会失败。

常见问题

Q:模型 ID 会变吗?

不会。model 是稳定标识,展示名改了不影响调用。 但已下架的模型会返回 404 —— 下架前控制台会提前提示。

Q:为什么我的请求返回的 model 和我要的不一样?

如果同款有多家供应商,平台会切换上游,但响应里的 model 保持为你请求的那个 ID。真实命中的供应商可以在控制台的调用详情里看到。

Q:能不能固定只用某一家上游?

当前不开放这个配置。平台的比价逻辑是自动的, 要固定供应商需要走企业合作单独约定。

Q:支持 function calling / 工具调用吗?

请求参数会原样透传给上游。上游支持就支持,上游不支持就报错或忽略。 平台不做能力适配层,所以同样的参数在不同模型上行为可能不同。

Q:为什么我的错误信息里看不到上游原始返回?

上游原始报文里可能带它自己的账号标识甚至密钥,平台会先脱敏再返回。 你能看到错误类型和原因,但凭证类内容会被替换成 ***。

Q:余额不足时会怎样?

返回 402,不发起上游调用(不会先花上游的钱再拒绝你)。 但见上面「已知边界」—— 极端并发下有小幅透支的可能。

Q:数据会被用来训练吗?

平台不做任何模型训练。但上游厂商可能按它们的条款使用数据, 这一点平台无法替上游承诺。有严格数据要求请走企业合作并指定供应商。

Q:有 SDK 吗?

没有专门的 SDK,也不需要 —— 直接用官方 OpenAI SDK 或 Anthropic SDK 即可。 多一层封装反而增加版本兼容负担。