Skip to content

feat(core): 阻止长度截断的不完整工具调用执行并引导模型分块恢复 - #2649

Open
CyberXavier wants to merge 3 commits into
agentscope-ai:mainfrom
CyberXavier:fix/openai-compatible-length-truncated-tool-calls
Open

feat(core): 阻止长度截断的不完整工具调用执行并引导模型分块恢复#2649
CyberXavier wants to merge 3 commits into
agentscope-ai:mainfrom
CyberXavier:fix/openai-compatible-length-truncated-tool-calls

Conversation

@CyberXavier

Copy link
Copy Markdown
Contributor

fix:#2648
本 PR 修复 OpenAI 兼容模型因输出长度限制截断工具参数后,工具调用失败、遗留 pending 状态或重复重试同一大调用的问题。

主要改动:

  • 透传 OpenAI 兼容响应的 finish_reason,覆盖流式与非流式响应。
  • 将终止原因写入最终 AssistantMessage 元数据及 ModelCallEndEvent
  • 工具参数聚合仍保留非法 JSON 降级为 {} 的原有兼容行为。
  • 对非空但无法组成合法 JSON 对象的原始工具参数增加内部不完整标记。
  • 仅在 finish_reason=length 且工具参数不完整时阻止实际工具执行。
  • 返回与原始 ToolUse 具有相同 toolCallId 和工具名的错误 ToolResult,避免遗留 pending tool call。
  • 错误 ToolResult 明确要求模型不要原样重试,而应缩小参数并通过多次小调用或可用的增量更新工具完成任务,支持大文件采用首段创建加后续追加/编辑的方式恢复。
  • 完整参数、非 length 终止原因及缺失终止原因的响应保持原有执行与降级行为。

测试覆盖:

  • 流式与非流式 finish_reason=length 解析;
  • 完整及不完整工具参数聚合;
  • 截断参数不执行实际工具;
  • 错误 ToolResult 的恢复指令;
  • AgentState 中 ToolUse 与同 ID ToolResult 的端到端配对。

修复后运行效果:
image

- 在 MessageMetadataKeys 中新增 MODEL_FINISH_REASON 常量用于存储模型完成原因
- 扩展 ModelCallEndEvent 类以包含 finishReason 字段
- 在 OpenAI 扩展中添加测试用例验证流式和非流式响应的完成原因保留
- 修改 ReActAgent 中的事件发射逻辑以传递上下文中的完成原因
- 在 ReasoningContext 中添加 finishReason 字段并处理分块响应中的完成原因
- 实现长度限制工具调用标记功能,在模型达到输出长度限制时标记不完整工具调用
- 在 ToolCallsAccumulator 中检测原始内容完整性并在元数据中标记不完整内容
- 更新 ToolExecutor 阻止具有长度限制不完整参数的工具调用执行
- 添加新的元数据键用于标识原始内容不完整和输出长度限制状态
- 新增 ReActAgentLengthLimitedToolCallTest 测试类验证完整的长度截断工具调用流程
@codecov

codecov Bot commented Aug 10, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 92.00000% with 4 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...scope/core/agent/accumulator/ReasoningContext.java 87.50% 1 Missing and 2 partials ⚠️
...va/io/agentscope/core/event/ModelCallEndEvent.java 83.33% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@CyberXavier

Copy link
Copy Markdown
Contributor Author

@jujn 您好,这个pr需要您帮忙审批一下

@AgentScopeJavaBot AgentScopeJavaBot added enhancement New feature or request area/core/agent Agent runtime, pipeline, hooks, plan area/core/model Model providers and formatters area/core/tool Tool, skill, RAG abstractions labels Aug 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/core/agent Agent runtime, pipeline, hooks, plan area/core/model Model providers and formatters area/core/tool Tool, skill, RAG abstractions enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants