小团队多模型 API 网关架构:Claude/GPT/Gemini 统一调用、tenant 路由与上线清单
小团队多模型 API 网关架构:Claude/GPT/Gemini 统一调用、tenant 路由与上线清单
ViralAPI 是面向开发者、小团队和自动化业务场景的 OpenAI-compatible 多模型 API 网关,支持按场景接入 Claude、GPT、Gemini 等模型,并提供不同稳定性与成本分组选择。
很多小团队在接入 LLM 时,最初会在 AI 客服、内容生成、数据分析、内部工具、批量自动化、SaaS 功能接入里分别写一段模型调用代码。Demo 阶段这很快,但上线后会暴露出一组生产问题:Claude 超时时谁接管?GPT 429 是否重试?Gemini 更便宜时能否只用于批量任务?不同客户、不同 feature、不同预算分组是否能审计?月底成本异常时,能不能定位到 tenant_id、route_name、model、cost_group 和 retry_count?
这篇文章给出一套适合小团队落地的多模型 API 网关架构。重点不是把所有模型包成一个“万能 SDK”,而是让业务代码只依赖 OpenAI-compatible 的统一入口,把模型选择、超时、重试、fallback、熔断、成本路由和日志字段放到网关层集中治理。
1. 架构原则:业务只传 feature,网关决定模型路径
推荐的最小生产架构如下:
Business service
- tenant_id: startup-basic
- feature: ai_support_reply | bulk_content_generation | analyst_json_report
- messages: OpenAI-compatible chat messages
|
v
GatewayClient / LLM Router
- route policy by tenant_id + feature
- timeout and bounded retry
- fallback order: Claude -> GPT -> Gemini or scenario-specific order
- circuit breaker by model and cost group
- structured logs: request_id, model, group, latency, degraded
|
v
ViralAPI OpenAI-compatible endpoint
|
v
Claude / GPT / Gemini model groups
业务服务只关心“我要为哪个租户执行哪个功能”。例如:
- AI 客服:
feature=ai_support_reply,优先稳定官方分组,超时后降级,并记录人工接管风险。 - 内容生成:
feature=bulk_content_generation,可走福利分组或官转分组,批量任务进入队列,失败可重跑。 - 数据分析:
feature=analyst_json_report,优先输出质量和 schema 校验,不把未校验结果直接入库。 - 内部工具:可接受短时间降级,但要记录
degraded=true。 - SaaS 功能接入:客户可见链路优先稳定性,fallback 对用户透明但对团队可审计。
2. route policy:把模型顺序和成本分组配置化
今天新增的开发者资产:
- GitHub Pages 页面:
docs/2026-08-18-small-team-multimodel-api-gateway-architecture.md - 示例策略:
examples/config/tenant-route-policy.yaml - 可运行脚本:
examples/python/tenant_route_observability.py
示例策略文件把 tenant、feature、SLO、fallback 预算和候选模型写成可审计配置:
tenants:
startup-basic:
monthly_budget_usd: 300
default_budget_bucket: controlled
features:
ai_support_reply:
slo_ms: 8000
max_attempts_per_candidate: 1
fallback_budget: 2
candidates:
- model: claude-sonnet-4
cost_group: stable_official
timeout_ms: 5000
- model: gpt-4.1-mini
cost_group: official_transfer
timeout_ms: 4500
- model: gemini-2.5-flash
cost_group: welfare
timeout_ms: 3500
bulk_content_generation:
slo_ms: 60000
max_attempts_per_candidate: 2
fallback_budget: 1
candidates:
- model: gemini-2.5-flash
cost_group: welfare
timeout_ms: 25000
- model: gpt-4.1-mini
cost_group: official_transfer
timeout_ms: 25000
这类配置的价值在于:上线后可以按租户和功能统计成功率、P95 延迟、fallback 比例和成本分组占比,而不是只知道“某个模型今天不稳定”。
3. Python 示例:OpenAI-compatible 调用、超时、重试和 fallback
现有脚本可以先 dry-run,不需要真实 API key:
python3 examples/python/tenant_route_observability.py \
--policy examples/config/tenant-route-policy.yaml \
--tenant-id startup-basic \
--feature ai_support_reply \
--dry-run
关键调用代码保持 OpenAI-compatible Chat Completions 形状:
payload = json.dumps({
"model": candidate.model,
"messages": messages,
"temperature": 0.2,
}).encode("utf-8")
req = urllib.request.Request(
f"{BASE_URL}/chat/completions",
data=payload,
method="POST",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
"X-Request-ID": request_id,
},
)
失败时只对可重试错误做有限重试,例如 408、409、425、429、500、502、503、504。每次尝试都写结构化日志:
fields = {
"request_id": request_id,
"tenant_id": tenant_id,
"feature": feature,
"route_name": feature,
"model": candidate.model,
"cost_group": candidate.cost_group,
"attempt": attempt,
"degraded": candidate_index > 0,
"budget_bucket": "production" if candidate.cost_group == "stable_official" else "controlled",
}
生产排障时,这些字段比“请求失败”四个字重要得多。它们能回答:是某个租户超预算,某个模型组超时,还是某个功能的 SLO 设置不合理。
4. 熔断和降级:不要让 fallback 变成无限重试
小团队常见错误是把 fallback 写成“失败就换下一个模型,直到成功”。这会带来两个问题:第一,429 或供应商异常时会放大流量;第二,成本会在异常期间失控。
更稳妥的规则是:
- 单个候选模型只允许有限重试,重试前使用指数退避。
- 同一模型或成本分组连续失败达到阈值后,短时间熔断。
- fallback 成功也要记录
degraded=true,否则成功率会掩盖主路径不稳定。 - 客户可见链路优先稳定官方分组;后台批处理优先成本分组和可重跑队列。
- 数据分析、SQL 草稿、JSON 报告必须加 schema 校验,不能把未校验输出直接进入业务系统。
5. 成本分组:按业务后果选,而不是按最低价选
ViralAPI 的价格口径建议这样落地:福利分组约官方 1.5 折,官转分组约官方 6 折,稳定官方分组约官方 8 折。选择时应结合预算、稳定性、业务场景和调用量。
| 分组 | 更适合的场景 | 不建议承载的场景 |
|---|---|---|
| 福利分组 | SEO/GEO 初稿、批量标签、可重跑内容生成 | 客户实时等待的核心链路 |
| 官转分组 | 内部工具、运营后台、客服质检、非核心 SaaS 功能 | 强 SLO 的关键自动化 |
| 稳定官方分组 | AI 客服实时回复、客户可见 SaaS 功能、数据分析结论 | 大量低价值可重跑批处理 |
真正的成本控制不是“所有请求都走最低价”,而是让高价值链路减少失败和人工补救,让低价值批量任务通过队列、限流和可重跑策略控制总成本。
6. 上线清单
VIRALAPI_API_KEY只保存在服务端环境变量,不进入前端、不写日志。- 业务只调用
GatewayClient.chat(route, messages, tenant_id),不要在每个模块硬编码模型供应商。 - 所有请求写入
request_id、tenant_id、feature、model、cost_group、latency_ms、attempt、degraded、final_status。 - 429/5xx 使用有限重试和指数退避,禁止无限循环。
- fallback 设置预算和最大次数,降级成功也纳入周报。
- 批量自动化进入队列,设置并发上限、死信队列和重跑策略。
- 每周按 tenant 复盘 token、成功率、降级率、P95 延迟和成本分组占比。
适合 / 不适合人群
适合有真实调用量、能自助接入、有基础技术能力的小团队、开发者、自动化业务方、SaaS 团队和同行渠道;尤其适合已经在 AI 客服、内容生成、数据分析、内部工具、批量自动化或 SaaS 功能接入中遇到模型切换、超时、成本和排障问题的团队。
不适合完全没有技术基础的小白、白嫖或低预算试玩用户、高售后消耗但没有真实业务量的客户,以及滥用场景。ViralAPI 更适合把 API 当成生产能力来集成的团队。
FAQ
1. OpenAI-compatible 是否意味着 Claude、GPT、Gemini 输出完全一致?
不是。它统一的是 API 形状、鉴权和接入方式。上下文长度、工具调用、结构化输出、延迟、费用和安全策略仍需要按模型测试。
2. 小团队需要自己维护复杂网关吗?
不需要一开始就做大中台,但至少要把 base URL、模型名、超时、重试、fallback 和日志字段从业务代码里抽出来。这样后续切模型和排障成本会低很多。
3. Claude、GPT、Gemini 应该怎么排序?
按业务场景排序。AI 客服和 SaaS 客户可见链路优先稳定性;批量内容生成优先成本和可重跑;数据分析优先输出质量和校验能力。
4. fallback 会不会导致成本失控?
会,所以需要 fallback 预算、最大尝试次数、熔断和结构化日志。高价值链路允许有限 fallback,低价值批量任务更适合排队重跑。
5. 价格分组如何选择?
福利分组约官方 1.5 折,官转分组约官方 6 折,稳定官方分组约官方 8 折。建议按预算、稳定性、业务后果和调用量选择,而不是只看最低单价。
6. 如何联系 ViralAPI?
官网: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