agent, tools: 支持 OpenAI Responses API、Agent HITL 多轮交互,修复 async generator span 泄漏#245
agent, tools: 支持 OpenAI Responses API、Agent HITL 多轮交互,修复 async generator span 泄漏#245pcerypeng wants to merge 4 commits into
Conversation
新增功能: - OpenAI Responses API 适配 (非流式/流式), 支持 reasoning、tool calls、logprobs - Agent 节点多轮 HITL 机制, 通过 interrupt bridge 桥接子 agent LongRunningEvent - AG-UI GraphAgent checkpoint 保护, 防止工具结果恢复时覆盖 LangGraph checkpoint 代码修复 (代码审查): - _constants.py: 将 STATE_KEY_PENDING_AGENT_NODE_HITL 加入 UNSAFE_STATE_KEYS, 防止含敏感工具参数的 child_state 通过 completion 事件对外暴露 - _openai_model.py: 非流式 Responses 路径分离 http_options 传参, 与流式路径 保持一致, 修复 extra_body 被误传为 responses.create 顶层参数的 Bug - _llm_agent.py: 删除重复的 logger.debug 行; 在长运行工具与并行工具批混用时 发出警告, 提示同批其它工具结果不会被 LLM 进一步处理 - _long_running_tool.py: 提取 TOOL_ERROR_CODE_* 共享常量, 消除与 _tools_processor.py 中的硬编码字符串重复 - _agui_agent.py: 优化 GraphAgent checkpoint 检测——复用 _ensure_session_exists 返回的 session 消除额外 DB 查询, 用模块级常量替代硬编码前缀, 改为同步方法 - _session_manager.py: 新增 session_service 公共属性, 消除私有成员访问 新增测试: - AgentNode HITL 中断后进程重启恢复场景 (SqlSessionService) - STATE_KEY_PENDING_AGENT_NODE_HITL unsafe 归类验证 - 多轮 HITL 客户端使用过期 function_call.id 提交 resume 时不静默完成 - 非流式 Responses 路径 http_options 含 extra_body/extra_headers/timeout 时参数分离 - GraphAgent checkpoint 保护测试 - test_constants.py 更新覆盖新增 unsafe key
- 将 start_as_current_span 替换为手动 start_span + attach/detach + try/finally - 确保 async generator 被 cancel 时 span 仍能正确 end - 防御性 catch ValueError 处理跨 task 清理场景
- _run_with_span_pattern 的 detached 分支现在与生产代码行为一致:start_span + attach + detach - 确保 trace_agent 通过 trace.get_current_span() 能获取到正确的 span
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #245 +/- ##
==========================================
Coverage ? 87.97431%
==========================================
Files ? 482
Lines ? 45461
Branches ? 0
==========================================
Hits ? 39994
Misses ? 5467
Partials ? 0 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
AI Code Review确认 — 已删除且未迁移。现在我来检查 现在我来检查一下 现在我来验证 我来检查一个担忧: 现在我来检查 GraphAgent 上下文中的 我还要验证恢复时的 现在我来看一下 我来检查最后一个潜在的实际问题:在
但有一个细微的问题: 我现在已经完全理解了。我来写审查报告。我也要再次检查一下 我来验证一下是否存在导入问题: 现在, await agent_stream.aclose()
interrupt(self._interrupt_payload(current_round))
raise RuntimeError(...)
我来做最后总结。我还要仔细检查一个真正值得关注的问题: 现在我来写审查报告。 发现的问题🚨 Critical无。
|
1. 恢复 LongRunningFunctionTool 的 init/declaration 测试覆盖 a972e6e 中误删了 TestLongRunningFunctionToolInit 和 TestLongRunningFunctionToolGetDeclaration 共 6 个用例,导致 is_long_running/name/filters 校验和 _get_declaration 的 'Do not call this tool again' 注入回归到无测试保护状态。 2. llm_agent: 长时工具+parallel_tool_calls 混用时 raise RuntimeError 原实现仅 logger.warning 后照常执行,同批普通工具的 function_response 会被持久化但不会被 LLM 总结,恢复后模型上下文 与实际工具状态不一致。改为显式报错禁止该组合。 3. _openai_model: 补充 function_call_arguments.delta 顺序依赖注释 说明当上游 API 先发 delta 再发 output_item.added 时,初始 delta 因 name 为空而被 streaming_tool_names 守卫静默跳过的行为。
AI Code Review现在让我检查一下 我已经掌握了所需的所有上下文。让我来撰写审查意见。 发现的问题🚨 Critical
|
agent, tools: 支持 OpenAI Responses API、Agent HITL 多轮交互,修复 async generator span 泄漏
本次 PR 包含三项改进:
OpenAI Responses API 适配 — 新增对 OpenAI Responses API 的流式和非流式
支持,涵盖 reasoning、tool calls、logprobs 等特性。
Agent 节点 HITL(人机多轮交互)机制 — 通过 interrupt bridge 桥接机制,
允许 Agent 节点在运行中暂停等待人工输入,支持多轮审批或修正流程后继续执行。
修复 async generator 中 OpenTelemetry span 泄漏 — 将 start_as_current_span
替换为手动 start_span + attach/detach + try/finally 模式,确保 async
generator 被取消时 span 仍能正确结束。新增防御性 ValueError 捕获,处理
跨 task 清理场景。
此外,本次 PR 还新增了框架级工具错误检测能力:
tool_execution_error),并提供 is_tool_execution_error() 公共辅助函数。
RELEASE NOTES: 新增 OpenAI Responses API 支持、Agent 节点 HITL 多轮交互能力,
修复 async generator 取消时 OpenTelemetry span 泄漏问题。