已开启
[Feature]: agent_core 模型调用错误分类与弹性重试 #191
chenxiying创建于  18 天前
chenxiying
chenxiying成员
18 天前 创建

Paired: GitHub #363 ↔ GitCode #191

🚀 背景描述

要做什么:为 core 新建模型调用错误的统一分类与分级重试机制。这是一项 core 当前不具备的能力(功能缺失),顺带修复一个既有缺陷(重试配置空转)。

当前现状(各分支均存在,非特定版本问题):

  1. 模型调用失败没有分类:任何一次模型调用(非流式/流式)的失败,都以不带类型的裸异常穿透主链。限流(429)、欠费(402)、认证失效(401/403)、服务端临时故障(5xx)、网络抖动、用户取消——这些性质完全不同的失败被一锅烩。
  2. 重试配置是空转的:模型客户端存在"最大重试次数"配置字段,但全链路没有消费方,配置了不生效。
  3. 后果:网络抖一次,整轮任务直接失败;不可重试的错误(欠费、认证失效)上无法快速失败;上层与运维无法区分"等一下再试"和"重试也没用",错误表面不可程序消费。

工程实践的成熟解法是分类驱动处置:错误先按性质归并类别,再按类别决定退避重试、降温等待还是立即失败。本特性即把这套机制内建于 core。

设计思路

按"痛点 → 机制"设计,所有模型客户端实现(含两条 HTTP 栈)同步接入:

痛点 对应机制 关键点
失败无分类、裸异常穿透 统一错误分类 五类基础分类:限流/欠费/认证永久失效/临时故障/用户取消;另加第六个可判定扩展类别"上下文超限"(提示词过长被拒,不做普通重试,干净浮出)。分类为纯规则映射(HTTP 状态码 + 错误消息关键词组合),不调用模型、不引入外部组件;规则可随服务商差异持续补充,分类集合保持稳定
可重试的错误没人重试 分类驱动自动重试 限流、临时故障按退避策略自动重试(默认至多 2 次,可配置);欠费、认证永久失效、上下文超限、用户取消绝不重试;重试不推进主循环轮次计数,不消耗任务轮次预算
重试配置空转 接线既有配置字段 "最大重试次数"被真实消费,默认值对齐承诺(2 次),配置语义与实际行为一致
流式重试会重复产出 首段判定线 流式调用以"首段数据到达"为重试分界:首段前失败可整次重试;首段后中断不自动重试,按分类浮出处置;HTTP 200 内嵌错误体与流中错误帧(data: {"error":...})必须识别并上浮为带分类异常,不得当空数据段静默吞掉
取消被当故障重试 取消/中断特判 用户取消在任何路径绝不重试、不计入失败统计、干净退出;取消与超时同型异常的区分规则显式定义并文档化;人在环中断类异常是控制流不是故障,必须优先识别并原样放行
错误表面不可程序消费 标准错误码映射 各类别映射统一错误码模型段(181xxx),限流与欠费为新增错误码;控制流按分类类型判定,不按错误码分支;欠费与认证失效产出用户可读说明与修复建议

处置原则:任何模型调用失败离开客户端层前必须携带分类结果;可重试类在重试包装内自动恢复(用户最多感到一次停顿),不可重试类直接形成用户可读的错误表面,裸异常不再穿透主链。

涉及到的对外API

  • 错误分类 SPI:模型客户端层与重试机制之间的统一分类接入点;输入为原始异常/响应事实,输出为分类结果与可恢复性标记;中断类异常不经分类,原样穿透。
  • 重试配置项:最大重试次数(默认 2)、各可重试类别的重试使能;只增量演进,不改既有配置项名称与语义。
  • 错误码:模型段 181xxx,限流与欠费错误码为新增并在错误码规范登记;错误表面携带错误码与可程序化判定的分类信息。
  • 取消识别规则:作为公开行为契约文档化。

测试设计与测试计划

  • 覆盖:五类基础分类与"上下文超限"扩展类别各一条端到端路径;非流式限流/5xx 自动重试与耗尽后失败表面;欠费/认证失效不重试且产出用户可读文案;流式首段前重试、首段后不重试;流中错误帧与 HTTP 200 内嵌错误体上浮;用户取消不重试不计数干净退出;中断类异常放行;重试配置非默认值严格生效;取消与超时同型异常的区分;分类结果、错误码、重试次数在日志与可观测结果中稳定呈现。
  • 计划:分类 SPI 与五类基础分类先行 → 重试机制与既有配置接线 → 流式判定线与错误帧上浮 → 取消/中断特判。
likedislike
chenxiyingchenxiying成员
18 天前 添加了label:feature, sig/sig-agent-core-java
openJiuwen-bot成员
18 天前 评论:

欢迎来到 openJiuwen 社区

Hey @weixin_45837958 , 感谢你对社区的贡献.

机器人使用手册

有关指令的使用,可以点击 此处 查看详情。开发人员可以在每个PR或Issue下方评论特定指令来触发机器人任务。

联系指引

有疑问可以联系 SIG: sig-agent-core-java ,
维护者是: @shenwei21, @tianmingyong ,
审核者是: @foreach1991, @gcw_xJSJ32Ge, @jeffrey_qiao, @kangquansheng_makeIT, @xiongjie_makeit .

likedislike
Oopenjiuwen-sync成员
18 天前 修改了issue 的描述
chenxiyingchenxiying成员
18 天前 issue状态由 TODO 改变为 BACKLOG
chenxiyingchenxiying成员
18 天前 issue优先级由 未指定 改变为 一般
chenxiyingchenxiying成员
18 天前 关联了里程碑:agent-core-java v0.1.17
chenxiyingchenxiying成员
18 天前 issue类型由 Experience-Feedback 改变为 Feature
chenxiyingchenxiying成员
18 天前 issue类型由 Experience-Feedback 改变为 Feature
chenxiyingchenxiying成员
18 天前 issue类型由 Experience-Feedback 改变为 Feature
chenxiyingchenxiying成员
18 天前 issue类型由 Experience-Feedback 改变为 Feature
chenxiyingchenxiying成员
18 天前 issue类型由 Experience-Feedback 改变为 Feature
chenxiyingchenxiying成员
18 天前 修改了issue 的描述
Oopenjiuwen-sync成员
18 天前 修改了issue 的描述
chenxiyingchenxiying成员
18 天前 修改了issue 的描述
chenxiyingchenxiying成员
17 天前 修改了issue 的描述