Repository navigation
[Reliability] AI Gateway: 受控重试、JSON 修复与一次性合规切换 #172
Copy link
Copy link
Closed
Labels
backendBackend, API, data, or service-side deliveryBackend, API, data, or service-side deliveryenhancementNew feature or requestNew feature or request
Description
背景
当前 Gateway::execute() 仅选择优先级最高的合规供应商、发起一次 HTTP 请求、提取响应文本,并返回 Completed 或 Failed。它没有同供应商的受控重试、JSON 解析或 Schema 校验失败后的修复路径,也没有在超时或 5xx 下切换一次合规备用供应商的策略。
本 Issue 是 #171 的后端执行契约拆分,聚焦 Gateway 的可靠性、结构化输出与可审计降级;不实现具体问询、线索、摘要或案例整理页面。
目标
为 AI Gateway 建立有限且可预测的两次尝试模型。结构化草稿必须通过用途 Schema 和业务校验后才能交给上层;无效、部分解析或未验证输出不得写为事实,应明确降级到规则或人工流程。
行为契约
用途 Schema 与受约束输出
- 线索结构化、问询、案例整理分别定义明确的请求/响应 Schema,并在 Gateway 或紧邻的用途适配层做严格解析和业务校验。
- 对支持 structured output 的供应商,例如 OpenAI Responses,传递 JSON Schema 约束;Anthropic、Gemini 等接口至少收到 application/json 输出约束,服务端 Schema 校验仍是最终判定。
- 摘要不再接受任意非空文本,应返回结构化结果再由服务端渲染为可编辑摘要:
{
"confirmed_information": [],
"pending_verification": [],
"excluded_directions": [],
"safety_reminders": [],
"uncertainty_notice": ""
}- 摘要 Schema/业务校验必须能够拒绝把待核实信息写为已确认事实的不合格输出;不确定或无来源字段不得默认视为已确认。
最多两次模型调用,且恢复路径互斥
总模型调用次数最多为 2,初始调用计为第 1 次。一次执行只允许下列两种第 2 次尝试之一:
- JSON 修复:初始调用成功返回、但 JSON 解析或 Schema 校验失败时,向同一已选供应商发起一次低 token 修复请求。修复提示只提供必要的无效模型输出、Schema/验证错误和 JSON 输出要求,不得重新加入更多敏感上下文。修复后仍失败则规则/人工降级。
- 合规备用供应商切换:初始调用发生超时或可识别的 5xx/临时传输失败时,只有策略允许且存在合规备用供应商才切换一次。备用供应商必须重新通过用途、数据等级、区域、限额和紧急禁用等检查。
限制:
- 不对原始业务请求进行多次同供应商 HTTP 重试。
- 不在同一次执行中组合 JSON 修复和备用供应商切换。
- 无合规备用供应商、策略不允许切换、4xx/认证/策略失败、二次尝试失败或输出无效时,不再调用模型,转入既有规则/人工路径。
- 保持无供应商配置时既有确定性 rule_based / manual_required 行为。
状态与降级
- 初始生成通过解析、Schema 和业务校验时,返回已验证结果供上层创建 AI 草稿。
- JSON 修复或备用供应商切换成功时,返回同等已验证结果,并标明发生过修复或切换。
- 二次修复失败、无备用供应商或其他不可恢复情况,返回稳定的失败分类和降级原因;上层不得创建事实记录,也不得用空文本或通用错误掩盖原因。
尝试级审计与隐私
每次模型调用和最终降级都写入独立 AiExecutionAudit 事件,至少记录:
- 执行关联 ID、用途、尝试序号(1 或 2)、尝试角色(initial、json_repair、provider_failover)与供应商/模型标识;
- 路由/策略决定、结果状态、失败分类、HTTP 状态类别或超时标识、Schema/解析错误类别;
- 是否修复、是否切换供应商、最终降级原因,以及模板/Schema 版本、输入范围、脱敏策略标识和必要的不可逆哈希。
审计不得保存原始提示词、原始模型输出、精确位置、健康细节或其他敏感上下文。JSON 修复请求同样遵守既有脱敏与数据等级策略。
实施建议
- 将供应商特定 structured-output 参数、文本/JSON 提取和故障分类集中在唯一 Transport 边界,避免业务服务自行重试或直接调用供应商 SDK。
- 将尝试预算作为一次 Gateway 执行的显式状态,而非 HTTP 客户端的隐式自动重试。
- 设计稳定的解析和 Schema/业务验证错误分类,供 API、审计与规则/人工降级共同使用。
- 切换时排除初始供应商,并重新运行全部合规检查。
验收标准
- 每种受控用途均能声明并强制其响应 Schema;OpenAI Responses 使用 JSON Schema 约束,其他供应商至少收到 JSON 输出约束。
- 摘要使用五段结构化响应并由服务端渲染;任意非空自由文本不再被视为有效摘要。
- 初始响应有效时仅发生 1 次模型调用并产生草稿候选。
- 初始响应解析或校验失败时,恰好可发生 1 次低 token JSON 修复;修复请求不附加新的敏感业务上下文,修复成功才产生草稿候选。
- 修复失败时不发生第三次调用,并返回可审计的规则/人工降级原因。
- 初始请求超时或 5xx 时,策略允许且有合规备用供应商才发生恰好 1 次切换;切换前重新验证全部合规策略。
- JSON 修复与供应商切换在一次执行中互斥,不存在 初始 + 多次重试 + 修复 + 切换 的组合。
- 4xx、认证、策略不匹配、无备用供应商、二次调用失败和无效输出均不再触发模型调用,并安全降级。
- 每次尝试及最终降级都有独立审计事件,含尝试编号、失败分类和最终原因,但不含输入/输出原文或其他禁止审计的数据。
- 新增单元/集成测试覆盖成功、首次 Schema 失败后修复成功/失败、超时/5xx 后切换成功/失败、无合规备用、4xx/认证失败、调用次数上限、审计内容与敏感原文缺失。
不在范围内
- 自动确认线索、自动发布摘要、自动派发任务或绕过人工审核。
- 无上限的指数退避、同供应商业务请求重试、跨多个备用供应商的链式切换。
- 保存原始模型输入/输出用于调试或审计。
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
backendBackend, API, data, or service-side deliveryBackend, API, data, or service-side deliveryenhancementNew feature or requestNew feature or request
Activity