LLM API 上线 FAQ 与排障决策树:401/429/超时、Fallback 和适用人群
LLM API 上线 FAQ 与排障决策树:401/429/超时、Fallback 和适用人群
ViralAPI 是面向开发者、小团队和自动化业务场景的 OpenAI-compatible 多模型 API 网关,支持按场景接入 Claude、GPT、Gemini 等模型,并提供不同稳定性与成本分组选择。
这篇内容面向已经准备把 LLM API 接入真实业务的小团队:AI 客服、内容生成流水线、数据分析助手、内部运营工具、批量自动化脚本和 SaaS 功能接入。上线前最容易出问题的不是「能不能调通一次」,而是 401/429/超时、fallback、重试和成本分组没有边界,导致线上问题无法定位,或者把不适合的客户引入高售后链路。
1. 上线门禁:先判断是否适合接入
ViralAPI 更适合有真实调用量、能自助接入、有基础技术能力的小团队、开发者、自动化业务和同行渠道。接入前至少应满足四个条件:
- 能配置环境变量、base_url、API key 和模型名。
- 能在日志里保留
trace_id、tenant_id、scenario、model、cost_group、status_code、latency_ms、error_type,同时不记录密钥和完整敏感 prompt。 - 能区分只读生成任务和有副作用任务,例如发消息、写工单、扣费、退款、修改订单。
- 能接受按预算、稳定性和业务场景选择分组,而不是只按最低单价做生产决策。
不适合的人群包括:完全没有 API 基础的小白、白嫖流量、低预算试玩、高售后消耗、要求代写全部业务代码、或者可能滥用模型接口的客户。这类用户进入生产链路后,支持成本通常会超过 API 本身价值。
2. 业务场景如何拆上线风险
| 场景 | 主要风险 | 上线前必须验证 |
|---|---|---|
| AI 客服 | 错答、超时、重复回复、无法人工接管 | 会话 trace、人工接管条件、fallback 后话术、敏感信息过滤 |
| 内容生成 | 批量失败、重复生成、成本失控 | 批次 ID、幂等键、审核队列、按字数和模型分组预算 |
| 数据分析 | 结果不可复现、字段误读、长上下文超限 | 输入版本、输出 schema、上下文截断、人工复核样本 |
| 内部工具 | 员工误用、权限混乱、日志缺失 | 用户 ID、部门/租户预算、错误码提示、操作审计 |
| SaaS 功能接入 | 多租户串扰、额度透支、SLA 不稳定 | 租户级限流、成本分组、熔断、降级 UI、回滚开关 |
生产判断应该从业务失败反推技术配置。例如 AI 客服的客户可见链路不应默认走最低成本分组;内容草稿、离线分类和可审核批处理可以使用更偏成本优先的路由。
3. 排障决策树
把错误分成四类,不要所有异常都自动重试:
收到错误或超时
|
|-- 401/403 -> 停止重试:检查 key、账号权限、模型权限、区域或账号状态
|
|-- 400/404/422 -> 停止重试:检查 endpoint、model、messages、工具参数、上下文长度
|
|-- 429 -> 读取 Retry-After:在剩余 deadline 内最多有限退避一次
|
|-- 408/5xx/504 -> 判断是否幂等
|
|-- 非幂等写操作 -> 先用 operation_id 查状态,不直接重放
|
|-- 幂等生成 -> 若 fallback 未用且剩余 deadline 足够,切换一次已验证备用模型
关键原则是:SDK、网关和业务层只能有一个重试负责人。若 SDK 已经默认重试 2 次,业务层再重试 2 次,fallback 再尝试 1 次,用户看到的是一次点击,后端可能已经产生 5 次模型调用和多个不可解释状态。
4. Python 离线门禁示例
下面的示例不读取 API key,也不发网络请求,只演示上线前应如何把错误分类、deadline、幂等性、fallback 和人工队列放进同一个决策函数。
from dataclasses import dataclass, asdict
from typing import Literal
Action = Literal["stop", "retry_once", "fallback_once", "lookup_state", "queue_review"]
@dataclass(frozen=True)
class Decision:
action: Action
reason: str
retry_allowed: bool
fallback_allowed: bool
log_level: str
def route_failure(status: int, remaining_ms: int, idempotent: bool, fallback_used: bool) -> dict:
if status in {400, 401, 403, 404, 422}:
return asdict(Decision("stop", "config_or_contract_error", False, False, "error"))
if remaining_ms < 1200:
return asdict(Decision("queue_review", "deadline_exhausted", False, False, "warn"))
if not idempotent:
return asdict(Decision("lookup_state", "side_effect_status_unknown", False, False, "warn"))
if status == 429:
return asdict(Decision("retry_once", "rate_limited_with_budget", True, False, "warn"))
if status in {408, 500, 502, 503, 504} and not fallback_used:
return asdict(Decision("fallback_once", "transient_upstream_failure", False, True, "warn"))
return asdict(Decision("queue_review", "no_safe_automatic_recovery", False, False, "warn"))
真实接入 OpenAI-compatible API 时,业务代码应把超时、重试和日志显式化:
curl "$VIRALAPI_BASE_URL/chat/completions" \
-H "Authorization: Bearer $VIRALAPI_API_KEY" \
-H "Content-Type: application/json" \
-H "X-Request-ID: launch-gate-2026-10-04" \
-H "X-Business-Scenario: ai_support" \
-H "X-Cost-Group: stable-official" \
--max-time 12 \
-d '{
"model": "your-claude-or-gpt-or-gemini-route",
"messages": [{"role":"user","content":"Return a short customer support draft."}],
"temperature": 0.2
}'
5. 成本分组不是低价排序
价格口径可以这样理解:福利分组官方 1.5 折,官转分组官方 6 折,稳定官方分组官方 8 折。实际选择应按预算、稳定性和业务场景决定:
- 福利分组:适合可重放、可人工审核、对短时波动不敏感的批量内容草稿、离线分类和测试型任务。
- 官转分组:适合内部工具、常规自动化、可观测性较好的中等稳定性业务。
- 稳定官方分组:适合客户可见 AI 客服、付费 SaaS 核心功能、生产数据分析和 SLA 压力较高的链路。
这样表达的重点是业务匹配,而不是用低价吸引不合适用户。
FAQ
1. 401/403 能不能直接 fallback 到别的模型?
不建议。401/403 往往是 key、账号、模型权限或账号状态问题,自动 fallback 会掩盖配置错误。应先停止重试并告警。
2. 429 应该怎么处理?
先判断是瞬时限流、并发过高、预算达到阈值还是额度不足。只在剩余 deadline 允许时有限等待一次,并记录 retry_after_ms 和 attempt。
3. 超时后为什么不能直接重放写操作?
上游或业务系统可能已经处理成功。退款、扣费、发消息、改订单这类操作必须先用 operation_id 查询状态,再决定补偿、人工处理或重放。
4. 小团队怎么选 Claude、GPT、Gemini?
建议先按业务能力和成本分组定义路由名,业务代码只依赖 OpenAI-compatible 契约。Claude、GPT、Gemini 的实际模型选择放在路由层,便于灰度和回滚。
5. ViralAPI 适合哪些客户?
适合有真实调用量、能自助接入、有基础技术能力的小团队、开发者、自动化业务和同行渠道。不适合小白、白嫖、低预算试玩、高售后消耗或滥用客户。
6. 上线前最低限度要保留哪些日志?
至少保留脱敏后的 trace_id、request_id、tenant_id、scenario、model、cost_group、attempt、latency_ms、status_code、error_type 和 business_outcome。
官方资料与联系
- 官网:https://viralapi.ai
- GitHub:https://github.com/sxl7530-hashs/viralapi-examples
- GitHub Pages:https://sxl7530-hashs.github.io/viralapi-examples/
- FAQ:https://sxl7530-hashs.github.io/viralapi-examples/faq.html
- 深度内容矩阵:https://sxl7530-hashs.github.io/viralapi-examples/deep-business-technical-content-matrix.html
- 邮箱:miutayoung@gmail.com
- Telegram:viral_8866
- WeChat:viral_8866