概览
API 总览:每个端点、请求和错误的样子、调用如何计费,以及从 OpenAI 或 Anthropic SDK 迁移过来时需要知道的事。
端点
所有端点都位于同一个 base URL 之下,并通过 HTTPS 提供服务。
Base URL
https://api.shannon-ai.com | 端点 | 格式 | 用途 |
|---|---|---|
POST /v1/chat/completions | OpenAI Chat Completions | 发送一段对话,得到下一个答案。可流式,也可不流式。 |
POST /v1/messages | Anthropic Messages | 同样的功能,使用 Anthropic SDK 的请求和回复结构。 |
POST /v1/responses | OpenAI Responses | 同样的功能,使用 Responses 的结构。该端点不保存状态:每个请求都要发送完整的对话。 |
GET /v1/models | OpenAI 模型列表 | 列出模型及其上下文窗口、价格和功能。无需密钥。 |
POST /v1/tokenize | Shannon API | 为托管开源权重模型统计一段文本或一个聊天请求的 tokens。免费。 |
POST /v1/messages/count_tokens | Anthropic token 计数 | 为托管开源权重模型统计 Messages 请求的输入 tokens。免费。 |
产生文本的三个端点连接到相同的模型。请选择与你的代码已在使用的格式相符的那一个。
请求基础
| 请求头 | 说明 |
|---|---|
Authorization: Bearer <key> | 你的 API 密钥。除 GET /v1/models 外,每个端点都必需,除非你发送 x-api-key。 |
x-api-key: <key> | 同一个密钥,放在 Anthropic SDK 发送的请求头中。每个端点都会读取。 |
Content-Type: application/json | 每个 POST 都必需。缺少时回复为 415。 |
x-request-id: <your id> | 可选。你自己的请求 id;它会出现在回复头 x-request-id 中。若未提供,API 会生成一个 12 位十六进制字符的 id。 |
- 每个
POST的请求体都是一个 JSON 对象,最大 32 MiB。 - API 不认识的字段不会引起错误,也没有任何效果。为其他提供方编写的请求不会因多出一个字段而失败。
- 已知字段的 JSON 类型有误,或缺少必需字段,会得到
422。请求体不是有效的 JSON 会得到400。 model是模型与定价中的 id 之一。大小写无关。
回复是 JSON;如果请求将 stream 设为 true,则是服务器发送事件(server-sent events)流。每个端点以各自的格式作答。每个回复都带有标头 x-request-id。
请求要通过的检查
请求在模型运行之前,会按固定顺序检查。第一个失败的检查就会给出答复,因此 401 还不能说明请求体的任何情况。
| 检查(按此顺序) | 失败时的状态码 |
|---|---|
| API 密钥 | 401 |
| 请求体:大小、内容类型、JSON、字段类型 | 413 · 415 · 400 · 422 |
| 模型 id | 400 |
| 限流保护:每个账户每分钟 120 个请求 | 429 |
| 余额:请求的输出预算必须放得下 | 429 |
错误结构
错误是一个 JSON 对象,其 error 包含 type 和 message。/v1/messages 按 Anthropic SDK 期望的方式包装它;其他所有路径使用 OpenAI 的结构。
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: gpt-4o"
}
} {
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "unknown model: gpt-4o"
}
} - 请读取
type和message。code和param只出现在部分错误中:请将它们视为可选。param始终为null。 - 流开始之后,状态码已经是
200。此后的失败会以流内错误帧的形式到达。 - 每个错误回复都带有
x-request-id请求头。
| 状态码 | 类型 | 何时 |
|---|---|---|
400 | invalid_request_error | 请求体不是有效的 JSON、模型 id 未知,或模型不接受你发送的某种输入。 |
401 | authentication_error | 密钥缺失或无效。 |
404 | not_found_error | 路径不存在。 |
405 | api_error | 路径存在,但方法错误。 |
413 | invalid_request_error | 请求体大于 32 MiB。 |
415 | invalid_request_error | Content-Type 不是 application/json。 |
422 | invalid_request_error | 某个字段的 JSON 类型错误,或缺少必填字段。 |
429 | rate_limit_error | 余额不足以支付该请求,一分钟内到达的请求超过 120 个,窗口内的 Shannon Coder 调用已用完,或模型繁忙。消息会说明是哪一种。 |
5xx | api_error | 状态码 500、502、503 或 504:请求有效,但无法作答。请重新发送。500 可能带有类型 server_error。 |
账单与余额
- 每个账户只有一份余额,聊天和 API 共用:先消耗当日计划额度,再消耗已购买的信用额度。API 没有自己的配额。
- 请求会预留其输出预算(
max_tokens,默认 4,096),然后按实际用掉的 tokens、以模型的价格计费。 - 每个回复都在
usage中报告其 token 计数。密钥与用量页面显示余额以及每个请求的花费。 - 每个请求一视同仁。对请求速率的唯一限制是限流保护:每个账户每分钟 120 个请求。并行发送的请求会排队等待。
取决于模型的字段
所有模型接受相同的请求。少数字段只对部分模型生效;表中注明了适用范围。各端点页面列出了每个字段。
| 字段 | 说明 | 适用模型 |
|---|---|---|
system | 给模型的指令:Chat Completions 上是 system 消息,Messages 上是 system,Responses 上是 instructions。 | 托管开源权重模型、shannon-1.6-*、shannon-2-*、shannon-coder-1 |
temperature | 采样温度。 | 托管开源权重模型、shannon-1.6-*、shannon-coder-1 |
top_p | 核采样。 | 托管开源权重模型 |
seed | 固定的采样种子。 | 托管开源权重模型 |
stop | 最多 4 个停止序列。 | 托管开源权重模型 |
reasoning_effort | 模型回答前的推理量。Responses 上是 reasoning.effort,Messages 上是 thinking。 | 托管开源权重模型 |
web_search | true 让模型为该请求搜索网页。这是本 API 的字段,适用于 Chat Completions 和 Messages。 | 除 shannon-coder-1 以外的 Shannon 模型 |
max_tokens | 输出预算。在所有模型上,它都决定从你的余额中预留的数量。 | 作为答案长度的限制:托管开源权重模型、shannon-1.6-*、shannon-coder-1 |
从 OpenAI SDK 迁移
- 将 base URL 设为
https://api.shannon-ai.com/v1,并将密钥设为你的 Shannon 密钥。这样 Chat Completions 和 Responses 调用就能直接配合 SDK 使用。 model必须是 Shannon id。其他提供方的模型名称(如gpt-4o)会得到400和unknown model。- 推理内容放在单独的字段中:与
content并列的reasoning_content,在消息和流的 delta 中皆然。 - 流的最后一个数据块始终携带
usage,同时带有finish_reason。 - 流中的工具调用会作为一个数据块到达,其中包含完整的
arguments字符串。 - 回复只有一个 choice。
- 上表中没有的 OpenAI API 路径(如
/v1/embeddings)会得到404。
从 Anthropic SDK 迁移
- 将 base URL 设为
https://api.shannon-ai.com(不带/v1),并将密钥设为你的 Shannon 密钥。SDK 会以x-api-key发送它。 model必须是 Shannon id。- 在此 API 上,
max_tokens是可选的。默认值为 4,096。 - 回复包含类型为
thinking、text和tool_use的内容块。第一个块并不总是文本:请按type选取块。 stop_reason为end_turn或tool_use。Shannon 模型的流也可能以max_tokens结束。anthropic-version和anthropic-beta会被接受,因此 SDK 无需修改即可工作。请求并不需要它们。/v1/messages上的错误具有 Anthropic 的结构:{"type": "error", "error": {…}}。
使用这些格式的编程工具,设置方法相同:base URL、密钥,以及作为模型的 Shannon id。 CLI 编程工具