已关闭
[Feature]: agent_core 模型调用超时分层 #171
chenxiying创建于  9月14日关闭于  7 天前
chenxiying
chenxiying成员
9月14日 创建

Paired: GitHub #310 ↔ GitCode #171

🚀 背景描述

930 分支上,两条模型调用 HTTP 栈的超时均未按调用阶段分层,企业客户长任务场景暴露三类问题:

  • 读取空闲超时误杀长思考:主力栈(OkHttp)读超时取自模型客户端配置的单一 timeout 字段(默认 60 秒),同一字段同时承载读/写两层;思考型模型在生成大段工具调用前的几十秒停顿超过该值即被误杀——实际并非故障,是模型的正常工作方式。
  • 单次调用超时参数语义错误且调用点传空:单次调用级超时参数在客户端已有接线,但语义被实现为全程总时长硬顶(主力栈 OkHttp callTimeout、推理亲和栈 JDK 请求级超时)——调用方为长任务放宽超时时,引入的恰恰是要消除的总时长硬顶;同时上层全部模型调用点(ReActAgent、LlmAgent 等)仍不传该参数,调用方无法按次覆盖。
  • 两条栈超时语义不齐:主力栈已具备独立连接超时(系统属性,默认 10 秒封顶、快速失败);推理亲和栈(JDK HttpClient)仅以请求级单一超时承载,无连接/读取分层;两条栈对同一调用的超时行为不一致。

针对上述痛点引入:连接建立 / 响应头到达 / 数据段空闲三层独立计时,响应头到达即解除总计时,数据段空闲超时放宽,不设全程总时长硬顶,单次调用参数按层覆盖。

设计思路

按"痛点 → 机制"设计,两条 HTTP 栈同步改造,统一为同一套分层语义:

痛点 对应机制 关键点
误杀长思考 数据段空闲超时分层 空闲计时以相邻数据段间隔为基准(每段到达即重置),默认 600 秒(合理区间 300-900),为思考型模型长停顿留生存线
长回答被掐断 响应头到达解除总计时 首包到达后一切全程级计时解除,长回答写到底;不设全程总时长硬顶,极端卡死由上层取消机制兜底
参数语义错误 单次调用参数按层生效 覆盖该次调用相应超时层(至少覆盖数据段空闲层),不污染客户端级配置,不再映射为总时长硬顶;上层全部模型调用点消除传空
两栈不一致 双栈同步改造 主力栈与推理亲和栈采用同一套三层划分、默认值档位与错误表面;不允许只改一条栈
建连挂起 连接超时独立 只管 TCP/TLS 建连,默认 10 秒(合理区间 5-15),快速失败

错误表面:连接超时、响应头到达前超时、数据段空闲超时三类失败可程序区分,携带三段阶段信息(连接建立前 / 首段数据到达前 / 首段数据到达后);上层主动取消不得归类为超时失败。

涉及到的对外API

模型客户端配置面增量演进:新增连接超时、数据段空闲超时独立配置项(未配置时有可解释默认值,非法值拒绝或回落默认);单次调用超时参数作用于相应超时层。不改既有配置项名称与语义。

与其他模块的相关性描述

  • DFX-002(任务级并发额度):并发额度是 runtime 语义,本特性是 LLM HTTP 客户端层超时语义,两者不重叠;不改连接池容量与行为。
  • 熔断:930 已有模型级熔断器(连接失败不计入记账并清空保活连接池),超时错误表面供其消费;超时类失败与熔断记账的区分口径由后续特性定义。
  • 应用侧 FEAT-054(deepanalyze-java 宿主装配):超时参数经宿主配置面接入,core 特性合入为其前置。
  • SSE 服务面(FEAT-001):只作用于 HTTP 客户端层,不改 SSE 事件结构与序列。

测试设计与测试计划

  • 流式回答超 3 分钟完整读取;长思考停顿接近但未超空闲窗口不被误杀;建连失败在默认 10 秒窗口内快速失败;流中途死链在空闲窗口内检出并释放连接;单次调用参数覆盖生效且不污染共享配置;阻塞调用响应头等待超时保护;推理亲和栈同等语义回归;上层取消不误判为超时。
  • 计划:主力栈分层改造先行 → 推理亲和栈对齐 → 双栈语义一致性回归。

其他信息

感谢您的贡献 🎉!

likedislike
chenxiyingchenxiying成员
9月14日 添加了label:feature, sig/sig-agent-core-java
openJiuwen-bot成员
9月14日 评论:

欢迎来到 openJiuwen 社区

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

机器人使用手册

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

联系指引

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

likedislike
chenxiyingchenxiying成员
9月14日 将 weixin_45837958 设为负责人
chenxiyingchenxiying成员
9月14日 issue类型由 Experience-Feedback 改变为 Feature
chenxiyingchenxiying成员
9月14日 关联了里程碑:agent-core-java v0.1.17
chenxiyingchenxiying成员
9月14日 issue状态由 TODO 改变为 BACKLOG
chenxiyingchenxiying成员
9月15日 关联了里程碑:agnet-core-java-v0.1.14
chenxiyingchenxiying成员
9月15日 关联了里程碑:agent-core-java v0.1.17
chenxiyingchenxiying成员
9月17日 修改了issue 的描述
chenxiyingchenxiying成员
9月17日 修改了issue 的描述
chenxiying
chenxiying成员
7 天前 评论:

【功能&测试设计】0a683e15d8f34fae847b2242fd2c79b3.md
【自测结论】
新增UT用例 19 个, ST用例 8 个:其中Level0 用例 5 个、Level1 用例 3 个;新增及修改代码约 4366 行(新增 3566 行、删除
800 行)

likedislike
xuefanfan成员
7 天前 评论:

测试方式:用 timeout-probe-agent(probe-agent jar)+ llm-stub-server(本机 stub,模拟各类超时场景)在 ECS 上端到端拉起完整调用链,SIT TC 通过 HTTP 发起对话请求,观察 wire 面返回的错误码、阶段字段(BEFORE_CONNECT / BEFORE_FIRST_SEGMENT / AFTER_FIRST_SEGMENT)、日志锚点。

覆盖的核心场景(15 条 TC):连接超时独立触发、响应头等待超时(阻塞/流式两路)、首段后 stream_idle 超时独立于 header_wait、长回答不被全程硬顶截断、单次调用 per-call idle 覆盖不污染客户端配置、agent 级 idle 覆盖客户端级 idle、取消不误判为超时、range 校验拒绝非法配置、跨 client 子类统一超时语义、error details 四字段跨三阶段完整性。

likedislike
chenxiying
chenxiying成员
7 天前 评论:

模型调用超时分层(FEAT-058)交付总结

代码交付:代码变更约 4851 行,其中新增 4033 行、删除 818 行;core !400、runtime !227、测试仓 !766、!912 四条 PR
均已合入。

新增用例数:新增用例 27 个,其中 UT 19 个、ST 8 个(Level0 5 个、Level1 3 个)。

问题数:5 个(致命 0 个 / 严重 2 个 / 一般 2 个 / 提示 1 个)。5 个 issue 已清零。

兼容验证:未配置新超时项的任务与引入特性前逐字节一致(UT 与 ST
双层锚定);连接建立/响应头等待/数据段空闲三层超时双栈统一语义,响应头到达即解除总计时、不设全程总时长硬顶;单次调用超
时参数仅覆盖数据段空闲层,不污染客户端级配置;上层主动取消不归类为超时失败。

likedislike
chenxiyingchenxiying成员
7 天前 issue状态由 BACKLOG 改变为 DONE
chenxiyingchenxiying成员
7 天前 关闭了 issue
Oopenjiuwen-sync成员
7 天前 修改了issue 的描述