故障排查
生产最佳实践
让 ToRouter 在生产环境里平淡无奇的八个习惯。
ToRouter 生产部署的简短清单。没有玄学,都是事故后才后悔没做的事。
1. 每个环境一把 Key
为 dev、staging、prod 各建一把 Key。dev Key 漏了顶多烦人,prod Key 不设上限漏了就是账单。
2. 生产 Key 配 IP 白名单
在 /keys 加上生产出口的 CIDR(Fly.io 区域、VPC NAT、k8s egress gateway 等)。白名单之外泄漏的 Key 不可用。
3. 每把 Key 设支出上限
每把 Key 都在控制台设一个花费上限(可按 USD 或 CNY)。失控循环短时间刷爆账单时,网关会拦在 429,而不是默默扣款。
建议大致档位:生产 约为月度预算的九成;预发 几十美元量级;开发 十美元左右即可。具体数字按团队习惯在 /keys 里调整。
4. 固定模型版本
# 好
model="claude-opus-4-7"
model="gpt-5.3-codex"
# 不好 —— 行为会随时间静默漂移
model="claude"
model="gpt-4"固定版本让你按自己的节奏 A/B 下一个版本,而不是被供应商推着走。
5. 对 429 和瞬时 5xx 做指数退避重试
OpenAI / Anthropic 官方 SDK 设 max_retries 即可;裸 HTTP 见 被限流 里的最小实现。4xx(400/401/403/404)不要重试 —— 结果不会变。
6. 始终记录 x-request-id
resp = client.chat.completions.with_raw_response.create(...)
print(resp.headers["x-request-id"])提工单时,这一项数据能让支持团队几秒钟内串起网关、调度器、上游的完整链路。
7. 准备一个兜底模型
主用 gpt-5 时,全网宕机情况下你希望代码先自动切到 claude-opus-4-7(或同分组其他模型),而不是直接呼工程师:
def chat(messages, primary="gpt-5", fallback="claude-opus-4-7"):
try:
return client.chat.completions.create(model=primary, messages=messages)
except Exception:
return client.chat.completions.create(model=fallback, messages=messages)8. 关注用量与仪表盘
就算没事故,也每季度轮换一次 Key。例行轮换让泄漏检测(审计日志对不上、"这个 Key 怎么还在用?")变得简单。