Category: Uncategorized

  • 多模型 API 工具测评:能力契约、参数降级与升级前回归测试怎么做

    多模型 API 工具测评:能力契约、参数降级与升级前回归测试怎么做

    接口“兼容 OpenAI”不代表行为兼容;多模型接入需要一套可自动执行的能力契约测试。

    本文面向正在接入多模型、AI Agent 与工具调用的开发团队,给出可操作的验收思路。所有测评应在自己的授权环境中进行,并保留可复核的测试记录。

    把兼容性写成能力契约

    列出每个模型与上游是否支持流式输出、JSON Schema、工具调用、图像输入、seed、logprobs 和取消请求。契约既要描述“支持”,也要描述不支持时的明确错误与降级行为。

    参数接受不等于参数生效

    有些服务会静默忽略 temperature、response_format 或工具选择。测试应从输出行为、响应头和错误码三方面验证参数是否真正生效,并防止网关把未知参数错误地转发给不兼容的提供商。

    每次升级都跑小而稳定的回归集

    选择覆盖结构化输出、长文本、多语言、工具参数和错误处理的样例,固定预期范围而非固定每一个字。模型或网关版本变化后,先比较契约差异,再决定是否扩大流量。

    对外透明能减少接入摩擦

    将能力矩阵、弃用时间和错误码说明公开给调用方。使用 https://top-api.cc 这类统一入口时,也应保留上游能力与实际路由的可见性,避免“一个接口”掩盖差异。

    结语

    好的 AI API 测评不是一次性打分,而是把风险点转化为可重复执行的检查。先验证边界条件,再逐步扩大流量,才能兼顾体验、成本和可追溯性。

  • AI API 故障切换怎么测:对冲请求、首包门限、重复费用与质量回归

    AI API 故障切换怎么测:对冲请求、首包门限、重复费用与质量回归

    更快地切到备用模型不一定更可靠;对冲请求必须同时验证重复成本、取消语义和输出质量。

    本文面向正在接入多模型、AI Agent 与工具调用的开发团队,给出可操作的验收思路。所有测评应在自己的授权环境中进行,并保留可复核的测试记录。

    对冲请求适合少数高价值场景

    当首包延迟超过门限时,同时向备用路径发出请求可以降低长尾延迟。但它会增加调用量,也可能让同一工具操作执行两次,因此不能默认对所有请求开启。

    取消语义决定是否会双花

    主路径先返回后,备用请求是否会收到取消?上游是否仍计费?流式响应已输出部分文本时如何选择结果?测试必须记录两个请求的生命周期和账单事件,而不是只看用户端的最终首包。

    备用模型还要做质量回归

    不同模型在结构化输出、函数调用和安全策略上可能不兼容。为关键任务准备固定评测集,比较主备路径的 schema 通过率、工具参数正确率和人工偏好,避免“更快但不可用”。

    网关应给出可审计的决定

    记录触发门限、选中的上游、取消结果、花费和模型版本。中转站的价值在于把这些决策与用量放到同一视图中,而不是隐藏真实的失败与重试。

    结语

    好的 AI API 测评不是一次性打分,而是把风险点转化为可重复执行的检查。先验证边界条件,再逐步扩大流量,才能兼顾体验、成本和可追溯性。

  • 长对话 API 怎么控成本又不丢事实:摘要、滑动窗口与上下文压缩测评

    长对话 API 怎么控成本又不丢事实:摘要、滑动窗口与上下文压缩测评

    上下文压缩不是简单截断;需要同时测成本、事实保留、指令优先级和工具状态完整性。

    本文面向正在接入多模型、AI Agent 与工具调用的开发团队,给出可操作的验收思路。所有测评应在自己的授权环境中进行,并保留可复核的测试记录。

    先定义什么信息绝不能丢

    用户偏好、未完成任务、工具返回的关键 ID、安全约束和最新决策通常比闲聊更重要。压缩策略应把这些信息作为结构化状态保存,不能只依赖自然语言摘要。

    比较三种常见策略

    滑动窗口实现简单但容易截掉早期约束;摘要能省 token 但可能改写事实;分层记忆把状态和原文分开,工程成本更高。应在相同对话集上比较输入 token、答案正确率和关键事实召回。

    工具调用状态要单独处理

    支付、工单或文件操作产生的 ID 不能被摘要器随意合并。测试中插入相近但不同的编号、撤销操作和多轮澄清,观察压缩后是否仍引用正确对象。

    用成本曲线决定阈值

    不要按照固定轮数压缩。根据模型价格、平均会话长度、延迟目标和错误成本绘制曲线,再设定触发阈值;通过统一 API 入口记录这些数据会更容易比较不同模型。

    结语

    好的 AI API 测评不是一次性打分,而是把风险点转化为可重复执行的检查。先验证边界条件,再逐步扩大流量,才能兼顾体验、成本和可追溯性。

  • RAG 向量检索怎么防越权:Metadata ACL、过滤顺序与泄漏验证清单

    RAG 向量检索怎么防越权:Metadata ACL、过滤顺序与泄漏验证清单

    向量相似度不会理解权限;没有服务端 ACL 过滤的 RAG,很容易检索到不该展示的片段。

    本文面向正在接入多模型、AI Agent 与工具调用的开发团队,给出可操作的验收思路。所有测评应在自己的授权环境中进行,并保留可复核的测试记录。

    权限过滤必须发生在服务端

    将文档权限写进前端提示词或让模型“不要引用”都不可靠。索引中的租户、组织、项目和文档状态应成为服务端查询过滤条件,并有默认拒绝逻辑。

    别只测“正常用户能搜到什么”

    要构造跨组织同名文档、已撤权文档、软删除文档和权限刚变更的文档。检查召回候选、重排序输入和最终上下文三个阶段,确认未授权文本没有在任何阶段出现。

    混合检索容易把过滤做丢

    关键词检索、向量检索、缓存和重排序服务常由不同组件实现。压测时分别记录每层过滤命中数,并验证 filter 在分页、fallback 与错误恢复路径中仍然存在。

    把泄漏测试纳入发布门槛

    为每个租户准备 canary 文档和唯一短语,自动执行跨权限查询;一旦返回候选或答案中出现短语就阻断发布。这样比上线后等待用户发现更可靠。

    结语

    好的 AI API 测评不是一次性打分,而是把风险点转化为可重复执行的检查。先验证边界条件,再逐步扩大流量,才能兼顾体验、成本和可追溯性。

  • AI 编程 Agent 怎么安全上线:PR 证据、最小权限、CI 合闸与回滚演练

    更新日期:2026-07-15
    适用范围:允许 AI 编程 Agent 创建分支、提交代码、触发 CI 或提出合并请求的团队。本文不把“Agent 能通过测试”视为“变更可以直接进入生产”。

    结论:把 Agent 当作低权限协作者,而不是自动化管理员

    AI 编程 Agent 可以缩短样板代码、测试补全和文档维护的时间,但它同时把提示词、依赖、代码托管令牌、CI 密钥和部署权限连到同一条供应链。安全上线的目标不是让 Agent 永不犯错,而是让它的每次高影响操作都具备:可追溯输入、最小权限、独立验证和可执行回滚。

    OWASP 对 CI/CD 风险的项目强调了凭据暴露、依赖与流水线配置等攻击面;可参考 OWASP Top 10 CI/CD Security Risks。对 Agent 而言,提示注入或仓库内恶意文本也应视作不可信输入:它可以提供事实,不能自行获得写入、发布或扩大权限的授权。

    四道合闸比一次“自动通过”更可靠

    阶段 必须产生的证据 失败时的动作
    计划 任务范围、受影响目录、禁止触碰项 超出范围即停止
    变更 清晰 diff、依赖变动、测试命令 仅创建分支/PR
    验证 单测、静态检查、秘密扫描、人工审阅 阻断合并
    发布 版本号、审批记录、回滚点、监控阈值 自动或人工回退

    Agent 不应持有可直接推送主分支或生产部署的长期 token。将它限制在临时分支、短期凭据和明确的 repository scope 中;CI 使用独立身份验证发布,并按环境拆分权限。

    最小权限的可检查配置

    1. 默认令牌只读;只有创建 PR 的工作流获得最小的 pull-requests: write 或等价权限。
    2. 生产部署密钥不暴露给来自 fork、外部贡献或非受保护分支的 workflow。
    3. 将依赖安装、构建、测试与部署分成不同 job;部署 job 要求受保护环境审批。
    4. 固定第三方 action/依赖的版本或不可变提交,记录升级原因与校验结果。
    5. 在日志中遮蔽 token、连接串和用户数据;对 Agent 的工具输出做同样处理。

    不要因为 Agent 生成的代码“看起来合理”就跳过 diff 审阅。尤其是权限、网络请求、序列化、shell 调用和 CI 配置改动,应要求人工确认。

    可复现的 PR 证据包

    每个 Agent PR 至少附带以下内容,缺一项则不得自动合并:

    - 任务原始目标与允许修改范围
    - git diff --stat 和关键文件 diff
    - 运行过的测试命令、版本、退出码
    - 未执行测试及原因
    - 新增依赖、网络访问、权限变化
    - 回滚方式:revert 提交、feature flag 或上一制品版本
    

    测试环境应与生产隔离,不使用生产 token、真实客户数据或可写的生产资源。对代码生成任务,可在临时仓库运行最小测试;对基础设施变更,应先使用 dry-run、计划文件或沙箱账号。将结果作为 PR 附件,而不是让 Agent 在对话中口头声明“已测试”。

    回滚演练不能等故障发生才设计

    发布前定义触发器,例如错误率、权限拒绝量、队列积压、异常费用或安全告警超过阈值。每个触发器要有负责人和动作:暂停 workflow、撤销短期凭据、关闭 feature flag、回滚制品、保全日志。至少按季度做一次从报警到回滚的演练,并记录平均恢复时间和遗漏步骤。

    中转与工具调用的边界

    如果 Agent 还会调用模型或外部工具,top-api.cc 这类接入层应把模型 API 密钥与代码托管凭据分开管理;记录调用来源、租户、模型路由和预算,而不把可复用密钥写入提示词或构建日志。将模型调用失败、超预算和异常工具权限当作合闸条件的一部分。

    限制

    本文提供的是工程检查框架,不能替代组织的代码所有者规则、合规要求、渗透测试或事故响应流程。不同 CI 平台的权限名称和保护机制不同,应以所用平台的官方文档与实际配置为准。

    参考资料

    1. OWASP Top 10 CI/CD Security Risks
    2. GitHub Actions:Security hardening your deployments

    把依赖和工作流文件当作高风险变更

    Agent 修改 package-lock、容器基础镜像、GitHub Actions workflow、部署脚本或权限清单时,审阅门槛应高于普通业务代码。PR 描述要列出新增下载源、镜像 tag、action 版本、网络出口和所需 secret;若这些信息无法自动提取,就要求 Agent 明确说明“未检查”的部分。对 lockfile 的大面积变化,先确认是工具版本升级、依赖重解还是异常注入。

    建议为工作流设置两类测试:一类在无 secret 的隔离环境验证语法和构建;另一类只在受保护分支、受审批环境中验证部署前置条件。任何来自 issue、PR 描述、网页抓取或仓库文档的自然语言都可能影响 Agent 的下一步工具调用,因此将其当作不可信输入,不允许它改变 token scope、关闭检查或直接触发生产发布。

    复盘时按“变更发现时间、阻断位置、权限是否足够小、回滚是否完成”四项记录。即使最终没有事故,这些近失事件也能暴露合闸缺口,并为下一次 prompt、代码所有者规则和 CI 策略提供真实改进依据。

    指标不是装饰

    把 Agent PR 的阻断次数、人工修改比例、回滚次数和权限异常按月统计。若某类任务持续需要人工修正,优先收紧提示范围、补充测试夹具或移除不必要的写权限,而不是提高自动合并比例。

    每次策略调整后,选择一条代表性任务重新演练从创建分支、审阅、测试到回滚的完整路径,并保留批准人与实际执行时间。

  • LLM 可观测性怎么兼顾隐私:提示词脱敏、Trace 采样与回放数据的测评方法

    LLM 可观测性怎么兼顾隐私:提示词脱敏、Trace 采样与回放数据的测评方法

    Trace 能定位 AI 故障,也可能复制用户隐私;可观测性方案要同时测试定位能力和数据最小化。

    本文面向正在接入多模型、AI Agent 与工具调用的开发团队,给出可操作的验收思路。所有测评应在自己的授权环境中进行,并保留可复核的测试记录。

    先区分三类记录

    请求元数据、提示词内容和工具返回值的敏感度不同。团队应先决定哪些字段永久保存、哪些只保存摘要、哪些完全不出业务边界,而不是把完整请求一股脑写入 Trace。

    脱敏规则要用对抗样本测试

    手机号、邮箱和身份证样式只是起点。还要测试分段文本、Unicode 变体、JSON 嵌套、工具输出和多语言地址。脱敏后仍需保留足够的关联 ID,才能定位一次失败调用的上游与下游。

    采样策略应服从事故响应

    全量记录费用高且扩大暴露面;完全不采样又无法复盘。可按错误率、延迟、模型、租户等级和策略触发情况增加采样,并对高敏租户使用独立的保存与访问规则。

    工具选择的比较维度

    比较 Helicone、OpenLit、Evidently 等可观测性工具时,不只看仪表盘;还要看字段掩码、保留期、导出控制、OpenTelemetry 兼容性和删除请求是否可验证。

    结语

    好的 AI API 测评不是一次性打分,而是把风险点转化为可重复执行的检查。先验证边界条件,再逐步扩大流量,才能兼顾体验、成本和可追溯性。

  • 远程 MCP 接入怎么防令牌被转发:DPoP、令牌绑定与中转链路测评

    更新日期:2026-07-15
    适用范围:远程 MCP、OAuth 受保护资源和经由网关转发的 Agent 工具调用。本文讨论令牌重放与链路验证,不把 DPoP 当作单独解决所有授权问题的方案。

    结论:令牌“能用”不等于令牌“只能由原客户端用”

    远程 MCP 常把浏览器、Agent、网关和工具服务器串成一条链。若访问令牌被日志、代理、浏览器扩展或错误的重定向带走,持有该 bearer token 的任何一方都可能重放它。DPoP(Demonstrating Proof-of-Possession)提供了一个重要补强:客户端针对每个 HTTP 请求签名,资源服务器验证签名、方法、目标 URI 与时间相关声明,从而把令牌的使用与持有私钥的客户端绑定。RFC 9449 定义了 DPoP;RFC 9700 则总结了 OAuth 2.0 的安全最佳实践。

    这并不意味着“加了 DPoP 就安全”。它只能降低已泄露令牌被直接重放的概率,前提是资源服务器正确验证证明、私钥未泄露、代理没有改变目标语义,且授权范围仍遵循最小权限。

    先画出远程 MCP 的授权边界

    一个可审计的最小链路应明确以下角色:

    角色 应持有什么 不应持有什么
    浏览器/Agent 客户端 短期私钥、当前会话状态 长期服务端密钥、全租户 token
    授权服务器 客户端登记和授权策略 工具业务数据
    网关 路由与策略决策、可脱敏审计 可导出的明文令牌日志
    MCP 工具服务器 经验证的访问令牌及细粒度 scope 不受限的上游管理权限

    每次转发前都要问:目标服务是否仍然是原 token 的受众?scope 是否仍对应当前工具?调用是否超出用户发起的会话?这些问题无法由单纯的 HTTP 200 回答。

    DPoP 验证清单

    资源服务器或网关收到 DPoP 证明后,至少验证:

    1. JWS 签名与内嵌公钥可验证,算法符合本系统允许列表;
    2. htm 与实际 HTTP 方法一致;
    3. htu 与规范化后的目标 URI 一致,不能只比较 host;
    4. iat 在允许时钟偏差内,jti 在短窗口内不可重复;
    5. access token 的 cnf.jkt 与证明中的公钥指纹匹配;
    6. 若使用 nonce,客户端能在收到挑战后重新取证,而不是把旧证明重发;
    7. 反向代理改写路径或 scheme 后,验证点仍使用对外可见的原始 URI。

    其中第 3 和第 7 点最容易在中转链路里被忽略。网关若将 /mcp/files/read 改写为内部 /v1/tool/read,但资源服务器拿内部路径校验 htu,合法请求会失败;若只比较域名,则攻击者可能把证明复用到同主机的另一路径。

    可复现实验设计

    测试环境应包含一个授权服务器、一个反向代理、一个受保护 MCP 工具和两个客户端密钥。为每一步保存脱敏日志:request_idjti 哈希、jkt、方法、外部 URI、验证结果和拒绝原因。至少执行以下负例:

    A. 用同一 DPoP 证明重放同一请求 -> 应被 jti 去重拒绝
    B. 将 GET 证明改用于 POST -> htm 不匹配
    C. 将 /read 证明改用于 /write -> htu 不匹配
    D. 更换客户端密钥但沿用 access token -> cnf.jkt 不匹配
    E. 令 iat 过期或未来时间过大 -> 时间窗口拒绝
    

    这些用例验证的是控制逻辑,不代表某个供应商默认已经开启 DPoP。只有把实际返回码、代理配置版本和验证日志一起保存,才构成可复盘的安全证据。

    与最小权限、回滚一起使用

    DPoP 不替代短生命周期 token、细粒度 scope、租户隔离、工具审批和密钥轮换。高影响工具(删除数据、部署、付款、外发消息)仍应有单独确认或策略门。发生异常时,先吊销对应会话或 client key,再检索同一 jkt 关联的调用;不要依赖“令牌已经过期”作为唯一处置手段。

    对于需要快速接入多模型和工具路由的团队,top-api.cc 这类中转层应把 token 处理与模型 API 密钥隔离,并提供按租户、路由和工具范围的调用审计。上线前先把上述负例跑通,再允许真实用户授权。

    限制

    DPoP 的互操作性取决于授权服务器、客户端和资源服务器同时支持相关流程;遗留 SDK、WebSocket 或代理重写环境需要额外设计。本文不构成 OAuth 部署指南,也不能替代对具体 MCP 实现、浏览器存储方式和组织授权策略的安全评估。

    参考资料

    1. RFC 9449:OAuth 2.0 Demonstrating Proof of Possession
    2. RFC 9700:OAuth 2.0 Security Best Current Practice

    私钥、nonce 与审计的运行边界

    私钥应只存在于能够代表当前客户端的受保护存储中,不应随着 access token 一起写入日志、配置中心或工具参数。服务端验证 jti 时,保存短期哈希即可;保存完整 DPoP JWT 会扩大敏感数据留存。多实例网关要共享或一致地访问短期去重存储,否则同一证明可能从不同实例穿透。

    nonce 机制适合降低时钟偏差和重放窗口带来的不确定性,但客户端必须把挑战当作一次新的签名请求,而不是原封不动重传旧 header。审计系统则应记录验证结论而非原 token:例如 dpop_valid=truereason=htu_mismatchkey_thumbprint_hash。这样既能排查路由问题,也不会把可利用凭据放进日志。

    最后,把 token 交换、资源访问和工具执行三类失败分别计数。授权服务器签发失败、网关证明校验失败、工具 scope 拒绝需要不同的告警与处置人;混为“MCP 调用失败”会让真正的授权异常被业务错误淹没。

    发布前确认

    上线前让客户端、网关和工具服务各自输出一次脱敏验证日志,确认它们对同一请求的
    equest_id、目标 URI 与授权范围理解一致。任何一端无法解释拒绝原因时,都应停在灰度环境继续排查。

  • 内容审核 API 怎么测:多语言阈值、人工复核与故障降级比命中率更重要

    内容审核 API 怎么测:多语言阈值、人工复核与故障降级比命中率更重要

    审核 API 的价值不在于单一准确率,而在于不同语言、不同场景下的阈值解释和可复核流程。

    本文面向正在接入多模型、AI Agent 与工具调用的开发团队,给出可操作的验收思路。所有测评应在自己的授权环境中进行,并保留可复核的测试记录。

    先定义审核动作,而不是只看标签

    同一类别分数在不同业务中可以对应放行、限速、人工复核或拒绝。测试方案应为每个动作定义可解释阈值和申诉路径,避免把模型标签直接当作最终业务判决。

    多语言与语境必须单独抽样

    中文缩写、拼音、混合语句、代码块和引用内容往往会改变判定。建立按语言、业务场景与内容长度分层的样本集,分别统计误杀和漏放;不要用英文基准的分数直接套到中文产品。

    人工复核需要保存最少但足够的证据

    复核页面应展示原始片段、模型版本、策略版本、触发规则和时间,而不是只显示一个风险分。保存周期应与隐私政策对齐,并将访问权限限制在必要岗位。

    故障时不要静默失明

    审核服务超时或不可用时,系统应按内容类型采取明确的降级策略,并产生告警。压测中模拟超时、空响应和分数格式变化,确认业务不会在无提示的情况下全面放行或全面拦截。

    结语

    好的 AI API 测评不是一次性打分,而是把风险点转化为可重复执行的检查。先验证边界条件,再逐步扩大流量,才能兼顾体验、成本和可追溯性。

  • AI 中转站缓存怎么避免串数据:缓存键、Vary、TTL 与逐租户隔离测评

    AI 中转站缓存怎么避免串数据:缓存键、Vary、TTL 与逐租户隔离测评

    缓存能降低 AI API 成本,但错误的缓存键会把上下文、身份和敏感输出交给错误的用户。

    本文面向正在接入多模型、AI Agent 与工具调用的开发团队,给出可操作的验收思路。所有测评应在自己的授权环境中进行,并保留可复核的测试记录。

    缓存命中率不是唯一指标

    对文本生成、Embedding 和工具结果做缓存,能够减少重复调用;但只按提示词哈希缓存,极易忽略模型版本、系统提示、温度、工具权限和租户身份。命中率越高,错误复用造成的影响也可能越大。

    把身份与上下文纳入缓存键

    设计缓存键时,应至少包含租户、模型快照、关键参数、系统策略版本和授权范围。对带有个人信息的请求,默认禁用共享缓存或使用短 TTL 的私有缓存;不要把 Authorization 原文写入键或日志。

    用 Vary 思维检查网关

    HTTP 的 Vary 概念适合迁移到 AI 网关:哪些字段变化后必须失效?语言、区域、工具白名单和安全策略经常被遗漏。测试时使用两名不同权限的用户提交相同文本,确认绝不会收到对方的缓存结果。

    上线前的最小测试

    执行跨租户命中测试、模型升级失效测试、策略变更失效测试和缓存删除演练。对需要统一入口、透明用量和多模型切换的团队,可先在 https://top-api.cc 这类中转入口梳理调用边界,再决定哪些调用适合缓存。

    结语

    好的 AI API 测评不是一次性打分,而是把风险点转化为可重复执行的检查。先验证边界条件,再逐步扩大流量,才能兼顾体验、成本和可追溯性。

  • AI API 限流怎么测:令牌桶、优先级队列与 429 重试不能各自为政

    更新日期:2026-07-15
    适用范围:需要通过统一 API 网关调用多个模型、并希望把 429 处理做成可验证工程能力的团队。本文不是任何供应商的吞吐量排行,也不提供跨平台“最快/最低价”结论。

    先给结论

    429 不是“客户端多等一会儿”就能解决的普通异常。它代表服务端当前拒绝继续接受请求;在 HTTP 语义里,服务端可以通过 Retry-After 告诉客户端何时再试,但不保证每一个 429 都带该字段。RFC 6585 定义了 429 Too Many Requests,而 RFC 9110 说明了 Retry-After 的两种表达形式。工程上,令牌桶、优先级队列和重试必须共用同一份请求预算与取消语义;把三者分散到 SDK、网关和业务层,会制造重复扣费、低优先级饿死和“已经超时仍在重试”的隐性故障。

    先定义四个可测指标

    不要只记录“429 次数”。一次压测至少记录以下字段:

    指标 定义 为什么需要它
    接受率 真正进入上游的请求 / 入站请求 区分网关本地限流与上游拒绝
    429 比例 按模型、租户、优先级分组的 429 定位谁耗尽了预算
    排队等待 入队到首次上游尝试的耗时 防止队列把可用请求拖成超时
    端到端结果 成功、取消、超时、最终失败 防止重试掩盖用户体验

    测试环境应记录网关版本、模型路由规则、并发数、超时、每租户配额、是否启用流式响应,以及测试开始/结束时间。缺少这些条件的“QPS”不能拿来比较。

    三层控制必须共享状态

    1. 令牌桶负责“能否立刻发”

    令牌桶应按租户 + 上游模型 + 请求类别至少三个维度计费。仅按全局 key 限流会让一个批处理任务挤掉交互请求;只按租户限流又会忽略单一上游的容量。令牌不足时,不要直接把请求交给客户端循环重发,而是返回可解释的等待时间或放入受控队列。

    2. 优先级队列负责“谁先获得下一个令牌”

    优先级不能只是一列数字。建议至少分为:用户交互、在线 Agent 工具调用、可延迟批处理。每个优先级都应有最大排队时长;到期后必须取消或降级,而不是无限等待。还要设置老化规则:低优先级等待超过阈值后逐步提升,避免长期饥饿。

    3. 重试负责“何时值得再试”

    重试器应只接收仍未过期、尚未取消、且幂等性可确认的请求。优先遵守 Retry-After;没有该字段时,使用带抖动的指数退避,并受总尝试次数和总截止时间双重约束。流式生成已经输出部分内容时,默认不应自动重放,否则可能造成重复内容和重复计费。

    可复现实验脚本的最小结构

    下面是语言无关的控制流;它的重点不是具体数值,而是状态只在一个调度器内更新:

    request -> deadline check -> priority queue
    queue head -> acquire(tenant, model) token
      no token: schedule at retry_after or next_refill
      token: call upstream with idempotency key
    upstream 429 -> release/record outcome -> retry only before deadline
    upstream success -> record first-byte, total latency, usage
    cancel/timeout -> remove queued work and block later retry
    

    日志至少包含 request_idtenant_idmodel_routepriorityqueue_msattemptretry_after_msfinal_status。用这些字段才能回答“429 是哪个租户、哪条路由、哪种优先级造成的”。

    常见失败模式

    • 每层各自重试:SDK、网关和业务 worker 同时重试,放大流量。
    • 令牌在请求完成后才扣除:突发流量会同时穿透桶,随后一起收到 429。
    • 只看平均延迟:队列等待被平均值掩盖,少数交互请求已超时。
    • 没有取消传播:浏览器关闭后,上游仍在生成并计费。
    • 把 429 视为可忽略告警:持续 429 会让排队、重试和连接池全部失去稳定边界。

    中转层怎样落地

    top-api.cc 这类多模型接入层,更适合把路由、配额、预算告警和调用日志放在同一个控制面:业务侧只声明请求优先级和截止时间,网关负责选择上游并返回可审计结果。接入前先在测试租户中验证 429、取消、切换和费用归属,再将策略扩大到生产租户。

    限制与下一步

    不同供应商对 RPM、TPM、并发和流式计费的定义并不相同;本文的队列结构不能替代供应商文档或合同限额。上线后应按周复盘按租户/模型划分的 429、排队等待和最终失败,并把异常样本保留到可回放的审计日志中。

    参考资料

    1. RFC 6585:429 Too Many Requests
    2. RFC 9110:Retry-After 字段语义

    一次上线前演练的步骤

    先为交互、后台和回填任务各创建一个测试租户,并给每类流量配置独立的并发与令牌预算。第一轮只发送低于限额的稳定流量,确认成功率、首包时间和 usage 字段可以关联到 request_id;第二轮逐步提高并发,直到本地桶开始拒绝;第三轮再提高到上游出现 429。三轮之间不要更换模型、提示词或超时,否则结果无法归因。

    演练结束后,抽取十条“排队后成功”、十条“按 Retry-After 重试”、十条“截止时间到期取消”的记录。检查同一个 request_id 是否只有一次最终扣费、队列项是否在取消后被删除、低优先级是否没有无限等待。若无法回答这些问题,先修正日志和状态机,再讨论提升限额。

    还应明确对调用方的返回契约:本地拒绝使用什么状态码、是否返回建议等待时间、是否区分租户配额和上游限额、流式连接中断如何标识。稳定的错误契约能让业务侧停止盲目重试,也让客服、财务和研发看到同一份事件解释。

    复盘节奏

    将以上指标按小时、租户和模型路由保留趋势图,并为突发 429、排队超时和重试放大设置独立告警。告警触发后先冻结新增重试,再核对限额配置和上游状态,避免排障动作本身继续放大负载。