Skip to content

fix(agent): prevent premature stops in streaming tool loops - #150

Merged
Rfym21 merged 1 commit into
Rfym21:mainfrom
GrothKeiran:codex/fix-agent-premature-stop
Aug 5, 2026
Merged

fix(agent): prevent premature stops in streaming tool loops#150
Rfym21 merged 1 commit into
Rfym21:mainfrom
GrothKeiran:codex/fix-agent-premature-stop

Conversation

@GrothKeiran

Copy link
Copy Markdown
Contributor

背景

Agent 客户端通过 /v1/messages/v1/chat/completions 或 CLI 端点运行长任务时,上游截断、异常 EOF、SSE 跨 TCP 分块或残缺工具调用会被桥接层包装成正常的 stop / end_turn,导致客户端把未完成任务误判为完成。

主要修改

  • 新增统一增量 SSE 解码器,支持任意 TCP、UTF-8、LF/CRLF 分块,并串行等待异步 frame handler
  • OpenAI/Anthropic 端点保留上游真实结束原因,正确映射 length / max_tokens
  • 上游未发送终止标记或传输异常时返回明确协议错误,不再伪造正常完成
  • 修复 CLI 端点按 TCP chunk 拆分并转发残缺 JSON 的问题,并将请求超时提升到 10 分钟
  • 同时支持 prompt/XML 和原生 delta.tool_calls,校验工具名及参数完整性
  • 残缺、非法或未知工具调用返回显式错误,tool_choice=required 重试提示写入真实当前消息
  • Anthropic thinking 流补齐 signature_delta,非流式 thinking block 补齐 signature
  • 对无 phase 的正文回退为 answer,避免 Thinking/Max 模型只显示思考而丢失最终答案
  • 多轮历史从易冲突的分号拼接改为 JSONL 信封,保留角色、换行和标点边界

验证

运行:

node --test tests/*.test.js

结果:23 项测试全部通过。新增测试覆盖:

  • SSE 逐字节、UTF-8、CRLF 和无尾随空行分块
  • 异步 frame handler 的结束竞态
  • OpenAI/Anthropic 流式与非流式截断原因传播
  • 异常 EOF 不再返回正常 stop/end_turn
  • Anthropic thinking 签名事件
  • 工具调用跨分块、截断、未知工具及原生 delta 累积
  • 多轮上下文 JSONL 边界保真

当前测试环境没有真实 Qwen 账户,因此未执行真实账号的上游端到端请求;控制器级流式测试已覆盖原故障路径。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants