Skip to content

[Reliability] AI Gateway: 受控重试、JSON 修复与一次性合规切换 #172

Closed

Description

@cg8-5712

背景

当前 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 次尝试之一:

  1. JSON 修复:初始调用成功返回、但 JSON 解析或 Schema 校验失败时,向同一已选供应商发起一次低 token 修复请求。修复提示只提供必要的无效模型输出、Schema/验证错误和 JSON 输出要求,不得重新加入更多敏感上下文。修复后仍失败则规则/人工降级。
  2. 合规备用供应商切换:初始调用发生超时或可识别的 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/认证失败、调用次数上限、审计内容与敏感原文缺失。

不在范围内

  • 自动确认线索、自动发布摘要、自动派发任务或绕过人工审核。
  • 无上限的指数退避、同供应商业务请求重试、跨多个备用供应商的链式切换。
  • 保存原始模型输入/输出用于调试或审计。

Metadata

Metadata

Assignees

No one assigned

    Labels

    backendBackend, API, data, or service-side deliveryenhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions