跳到主内容

SAIRouter API 使用指南

这是一份面向开发者与运维团队的实践文档。你可以把 SAIRouter 理解为统一的模型接入层:业务系统只需对接一次接口,就能在多个上游模型供应商之间进行路由、回退、可观测和成本治理。文档内容不仅覆盖 API 调用方式,也包含上线建议、排障路径和支持协作流程。

平台如何工作

SAIRouter 是 OpenAI 兼容网关,核心目标是把"多模型、多供应商、多策略"的复杂度从业务代码中抽离出来。你的应用层只需要维护统一的调用协议与鉴权方式,不再为不同供应商分别维护 SDK、错误处理和参数适配,从而显著降低接入与维护成本。

在请求执行阶段,平台会结合可用性、延迟、策略规则与历史状态选择上游路由;当某条链路不可用、超时或质量不符合预期时,会按配置自动切换到候选路由。对于业务侧来说,这意味着更高的稳定性与更可预测的故障行为。

核心能力

  • 统一模型入口:业务代码围绕一个接口抽象,降低多供应商并行接入时的复杂度与变更成本。
  • 可观测性:可在平台中查看模型分布、调用趋势、成本结构与状态信息,支持从宏观到请求级别的问题定位。
  • 可治理:通过模型启停、限流、策略与回退机制控制风险,减少上游抖动对业务可用性的影响。
  • 开发友好:兼容 OpenAI 常见 SDK 和调用格式,便于在已有项目中低成本迁移与灰度验证。

安全

SAIRouter 的安全设计围绕“官方直连、最小暴露、可审计、可回退”展开。业务系统只需要接入统一网关,平台在请求进入、路由选择、上游调用和结果返回的各阶段执行鉴权、策略校验和状态记录,降低多供应商接入带来的密钥扩散与运维风险。

官方直连与传输加密

请求通过受控网关转发到模型供应商官方源站,全链路使用 HTTPS/TLS 传输,减少中间层转售、明文传输或非预期代理带来的风险。

API Key 与权限隔离

建议按环境、业务线或团队拆分 API Key,并在服务端注入密钥。平台侧可结合用户、组织、模型启停和限流策略控制可访问范围。

请求审计与可观测

平台记录模型、供应商、状态码、延迟、用量和关键追踪信息,便于回溯异常调用、排查上游故障,并支撑成本与安全告警。

故障回退与风险控制

当上游超时、限流或不可用时,可通过路由策略、候选模型和降级方案减少单点故障影响,避免业务侧直接暴露在供应商波动中。

生产环境安全建议
  • API Key 仅保存在服务端或密钥管理系统中,不要写入前端代码、移动端包或公开仓库。
  • 为开发、测试、生产环境使用不同密钥,并建立定期轮换和疑似泄露后的快速吊销流程。
  • 开启必要的请求日志与告警,至少保留 request-id、模型、状态码、延迟、用量和调用方标识。
  • 对高风险业务配置限流、预算阈值和紧急停用开关,避免异常循环调用造成成本或可用性事故。
  • 不要在日志中记录完整 API Key、用户隐私数据或完整敏感提示词;确需排障时应做脱敏处理。

说明:安全能力会随部署形态、账号权限和上游供应商能力有所差异。正式上线前建议结合你的合规要求进行密钥管理、日志保留周期、数据脱敏和权限边界评审。

快速开始

建议先用最小链路完成一次"可用性验证":获取 API Key、发送一条最短 Chat 请求、确认返回内容与 usage 字段。跑通后再逐步增加系统提示词、工具调用、流式输出等能力。这样可以快速定位是网络、鉴权、模型配置还是业务逻辑导致的问题。

最小请求示例
curl https://api.sairouter.com/v1/chat/completions \
  -H "Authorization: Bearer sk-sai-..." \
  -H "Content-Type: application/json" \
  -d '{"model":"openai/gpt-4o-mini","messages":[{"role":"user","content":"Hello"}]}'

认证方式

Base URL: https://api.sairouter.com
认证:使用 API Key(token 形式)放在请求头,并确保由服务端注入,不要在浏览器端硬编码:
Headers
Authorization: Bearer sk-sai-...

提示:建议按环境分离密钥(开发/测试/生产),并建立轮换机制。发生疑似泄露时,先停用旧密钥再回溯访问日志,避免风险扩散。

SDK 示例(Node / Python)

下面示例展示了最常见的两种接入方式。实践中建议把 `baseURL` 和 `model` 配置化,并在统一调用层封装重试、超时、日志和错误映射,这样能避免业务代码到处散落重复逻辑。

Node.js
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.SAI_API_KEY,
  baseURL: "https://api.sairouter.com/v1",
});

const res = await client.chat.completions.create({
  model: "openai/gpt-4o-mini",
  messages: [{ role: "user", content: "你好" }],
});
console.log(res.choices[0]?.message?.content);
Python
from openai import OpenAI

client = OpenAI(
    api_key="sk-sai-...",
    base_url="https://api.sairouter.com/v1",
)

res = client.chat.completions.create(
    model="openai/gpt-4o-mini",
    messages=[{"role": "user", "content": "你好"}],
)
print(res.choices[0].message.content)

请求生命周期

理解生命周期有助于你快速判断问题发生在哪一层。比如 401 多半是鉴权或密钥管理问题,429 往往和配额或并发有关,5xx 可能是上游抖动或网络异常。

  1. 客户端携带 API Key 发起请求,并附带模型、消息和可选参数。
  2. 平台完成鉴权、参数校验和策略预检查(例如模型是否可用)。
  3. 路由层根据策略选择上游并发起调用,必要时进行候选路由切换。
  4. 响应返回前会记录调用用量、延迟、状态码和关键追踪信息。
  5. 失败场景下返回标准错误结构,便于业务侧统一处理与告警。

1) Chat Completions API

发送对话请求(OpenAI 兼容)。你只需要指定 model 和 messages,其余由 SAIRouter 负责路由选择、失败回退与状态记录。建议在生产环境明确设置 timeout 和重试策略,避免长尾请求拖垮服务线程。

curl 示例
curl https://api.sairouter.com/v1/chat/completions \
  -H "Authorization: Bearer sk-sai-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o-mini",
    "messages": [
      { "role": "system", "content": "You are a helpful assistant." },
      { "role": "user", "content": "Give me a simple Node.js example." }
    ],
    "temperature": 0.7
  }'
主要参数
model: string (required)
messages: [{ role, content }] (required)
temperature: number (optional)
max_tokens: number (optional)
stream: boolean (optional)

2) Models API(获取模型列表)

用于获取当前可用模型及其能力信息、上下文窗口与价格字段。建议在服务启动时拉取并做短周期缓存,同时定时刷新,以便在模型上下线或价格变更时快速同步。

请求
GET /v1/models
Authorization: Bearer sk-sai-...

常见字段:id、provider、type、contextLength、inputPrice、outputPrice、enabled、features。你可以据此构建模型筛选器、默认模型推荐以及成本估算逻辑。

响应结构

Chat 响应兼容 OpenAI 结构,通常包含 id、model、choices、usage。业务实现上建议把响应拆分为"用户可见内容"和"运营统计信息"两层:前者用于展示,后者用于计费、审计和性能分析。

成功响应示例
{
  "id": "chatcmpl-xxx",
  "model": "openai/gpt-4o-mini",
  "choices": [{ "index": 0, "message": { "role": "assistant", "content": "..." } }],
  "usage": { "prompt_tokens": 20, "completion_tokens": 60, "total_tokens": 80 }
}

接入最佳实践

  • 模型名使用配置中心统一管理,不要硬编码在多个业务模块,避免模型迁移时全链路改代码。
  • 统一处理 401/429/5xx,结合指数退避、幂等重试和最大重试次数,避免无界重试引发雪崩。
  • 生产环境配置连接超时、读取超时和熔断策略,防止慢请求挤占线程或连接池。
  • 日志中记录 request-id、model、provider、latency 和错误码,便于跨团队快速定位问题。

计费与成本

平台展示与筛选默认以 RMB(¥)为单位。成本核算建议按输入 token、输出 token、模型类型三个维度拆分,避免只看总额而忽略结构变化。对高调用量业务,可按场景建立单独预算池和阈值告警。

你可以结合模型页与使用页观察成本趋势,识别异常峰值与低效调用模式。例如在业务高峰期间,适当调整默认模型或温度参数,通常能在可接受质量下获得更稳定的成本曲线。

3) 错误处理

公开接口使用统一错误结构,建议按 HTTP 状态码 + code 字段双重处理。实践中可先按状态码做大类分流,再按 code 映射业务策略(如提示重试、切换模型、人工介入),从而避免把所有错误都当作同一种失败。

错误响应示例
{
  "code": "UNAUTHORIZED",
  "message": "Invalid API key"
}

4) 速率限制

当遇到 429/5xx 时,建议使用带抖动的指数退避(如 500ms、1s、2s,并增加随机偏移),避免同一时刻大量重试冲击上游。

生产环境建议设置连接超时与总超时,并记录 request-id 便于排障。若连续出现限流,可考虑削峰、队列化、降级到更经济模型,或在业务层做优先级控制。

生产检查清单

  • 密钥托管在服务端,避免前端泄露,并对不同环境使用独立密钥。
  • 设置连接、读取与总超时,防止请求长期挂起并拖慢整体吞吐。
  • 401/429/5xx 均有重试与降级策略,并限制最大重试次数。
  • 记录 request-id、错误码、模型、provider 与延迟指标,支持问题复盘。
  • 对高峰流量设置预算上限、异常告警与应急开关。

排障指引

  • 先确认 API Key 是否正确、是否过期、是否误用了其他环境密钥。
  • 检查目标模型是否启用,以及是否在当前区域或环境可用。
  • 查看状态页与用量页,判断是上游波动、流量突增还是限流触发。
  • 保留失败时间、request-id、错误码和样例请求,便于快速复现和定位。

帮助与支持

如果你在接入、模型选择、成本治理或故障处理上需要帮助,建议先整理调用样例、日志片段和错误信息再联系支持团队。信息越完整,定位速度越快,也更容易判断是平台问题、上游问题还是业务接入问题。

反馈问题时请附上:时间范围、模型 ID、请求量级、错误码、是否稳定复现、预期行为与实际行为。若有 request-id,请一并提供。

术语表

Provider: 上游模型供应商,例如不同的云模型平台或代理服务。
Route: 一次请求最终命中的上游路径,可受策略、可用性和限流影响。
Fallback: 主路由失败后的自动切换机制,用于提升请求成功率与稳定性。
Context Length: 模型可处理的上下文窗口上限,直接影响可输入的历史内容长度。
RPM / TPM: 每分钟请求数 / 每分钟 token 数,是常见的限流和容量规划指标。

6) FAQ

为什么会失败回退?当上游供应商不可用、响应超时或返回异常时,SAIRouter 会根据策略切换到候选路由。这样能提升整体成功率,但也建议你在业务侧保留重试与降级策略,形成双层保障。
错误格式?公开 API 返回统一结构(code + message),便于你按错误类型做分支处理。建议在监控系统里按 code 聚合统计,快速识别最常见故障类型。
更完整的 Swagger?需要查看 OpenAPI 细节时,可以打开 /api/docs