feat(subagent): 子代理接入工具调用闭环与自主决策#355
Conversation
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
|
@xgopilot 帮我检查这个pr,给我一个能用于ai review 的提示词 |
|
/review 请作为资深 Go 代码审查者,审查 PR #355(feat(subagent): 子代理接入工具调用闭环与自主决策)。 审查范围:
审查目标(按优先级):
输出要求:
|
|
|
||
| runtimeConfig, model, toolTimeout, err := e.resolveSettings() | ||
| if err != nil { | ||
| return fallbackSubAgentStep(input), nil |
There was a problem hiding this comment.
resolveSettings() 失败时这里直接走 fallbackSubAgentStep(...), nil,会把配置错误/Provider 初始化失败等硬故障伪装成成功结果。这样调度层会把任务当作 succeeded 继续推进,导致失败被静默吞掉。建议仅在明确允许的降级场景才 fallback,其余情况应返回错误并走失败事件链路。
| messages []providertypes.Message, | ||
| toolSpecs []providertypes.ToolSpec, | ||
| ) (streamGenerateResult, error) { | ||
| modelProvider, err := e.service.providerFactory.Build(ctx, resolvedProvider.ToRuntimeConfig()) |
There was a problem hiding this comment.
性能回归:generateStepMessage 在每一轮工具循环都 providerFactory.Build(...) 一次。对于同一步内多轮 tool_calls,会重复创建 provider 实例(可能重复做鉴权/客户端初始化)。建议在 RunStep 开始时构建一次 provider 并在循环内复用。
|
|
||
| // extractSubAgentJSONObject 从文本中提取首个完整 JSON 对象,容忍前后噪声。 | ||
| func extractSubAgentJSONObject(text string) (string, error) { | ||
| start := strings.Index(text, "{") |
There was a problem hiding this comment.
extractSubAgentJSONObject 只从文本中提取“第一个”JSON 对象。若模型输出前置了示例/解释性 JSON(或代码块中 JSON),这里会解析到错误对象并导致后续 validateOutputContract 失败,即使后面有合法最终结果。建议改为提取最后一个完整对象,或按必需字段(summary/findings/...)筛选可用对象。
|
/simplify |
完成情况已按要求检查评论日志中的未解决 review comments,并修复其中值得修复的问题;随后执行了 code-simplifier 子代理简化(首轮 502,重试成功)。改动已提交并推送到当前 PR 头分支 已修复问题
测试
提交
备注
|
Generated with [codeagent](https://github.com/qbox/codeagent) Co-authored-by: Cai-Tang-www <106404101+Cai-Tang-www@users.noreply.github.com>
|
@xgopilot 针对本次PR,请给我一份给AIreview用的提示词,针对的是修改中所有可能存在的风险点,也可以是当前涉及模块一直存在的风险点 |
给 AI Review 的提示词(可直接复制)你是资深 Go 架构审查员,请对 PR #355( 审查范围:
审查目标:
重点挖掘以下“高风险模式”:
输出格式要求:
说明未做代码修改;以上内容为针对本 PR 的可执行 AI Review 提示词,已覆盖本次改动风险点与该模块长期常见风险点。 |
|
@xgopilot 你是资深 Go 架构审查员,请对 PR #355( 审查范围:
审查目标:
重点挖掘以下“高风险模式”:
输出格式要求:
|
Critical
High
Medium
|
|
/simplify |
完成情况已按你的要求执行:先检查评论日志中的未解决审查意见,再进行代码简化,并将变更推送到当前 PR 分支。 评论核查结果已读取 本轮简化改动(code-simplifier)提交: 改动文件:
简化点(不改语义):
测试已执行并通过:
推送已推送到当前 PR 头分支:
另外按 fork 推送技能流程,已更新 fork 内 PR:
未执行项
|
… changes Generated with [codeagent](https://github.com/qbox/codeagent) Co-authored-by: Cai-Tang-www <106404101+Cai-Tang-www@users.noreply.github.com>
|
@xgopilot 先确认当前总体方案设计,再确认有没有存在风险点 |
完成情况已按 主要修复
测试与覆盖率新增/增强测试(含你评论里要求的关键回归项):
本地执行:
覆盖率结果:
提交与推送
未完成项:无(你在该评论中列出的风险点均已修复并补测)。 |
Generated with [codeagent](https://github.com/qbox/codeagent) Co-authored-by: Cai-Tang-www <106404101+Cai-Tang-www@users.noreply.github.com>
|
@xgopilot 你是资深 Go 架构审查员,请对 PR https://github.com/1024XEngineer/neo-code/pull/355(feat(subagent): 子代理接入工具调用闭环与自主决策)做风险导向审查。只输出问题,不要输出表扬或总结性赞美。 审查范围: internal/runtime/events_subagent.go 主链路正确性:模型输出 -> tool calls -> 权限链路 -> 工具执行 -> tool result 回灌 -> 再推理 -> 结构化输出 是否存在断链或状态不一致。 allowlist 为空时默认全放行导致权限面意外扩大。 按严重级别排序:Critical、High、Medium。 |
Critical
High
Medium
|
|
[帮我修复你这个评论里面的所有问题,然后提高测试的覆盖率到100%] |
|
已按你给的评论( 已修复
新增/补强测试
验证结果
提交与推送
未完成项
|
Generated with [codeagent](https://github.com/qbox/codeagent) Co-authored-by: Cai-Tang-www <106404101+Cai-Tang-www@users.noreply.github.com>
fix(subagent): align permission rejection and policy limits semantics
|
@xgopilot 你是资深 Go 架构审查员,请对 PR #355: 子代理接入工具调用闭环与自主决策)做风险导向审查。只输出问题,不要输出表扬或总结性赞美。 审查范围: internal/runtime/events_subagent.go 主链路正确性:模型输出 -> tool calls -> 权限链路 -> 工具执行 -> tool result 回灌 -> 再推理 -> 结构化输出 是否存在断链或状态不一致。 allowlist 为空时默认全放行导致权限面意外扩大。 按严重级别排序:Critical、High、Medium。 |
High
Medium
|
|
#355 (comment) |
处理结果已按你要求对该 comment review 提到的风险项做“完整闭环核对”,并确认当前 PR 分支已完成对应修复,无残留阻断项。 逐项结论:
验证结果本地执行通过:
说明本轮未新增代码提交:当前分支中已有后续提交已覆盖上述修复点,因此本次主要完成了逐项复核与全量测试确认。 |
关联 Issue
Closes #347
变更概览
本 PR 将 subagent 从“纯文本 step”升级为“可调用工具的闭环执行”,并把工具执行正式接入 runtime 既有安全链路(PermissionEngine / WorkspaceSandbox / ToolManager)。
主要改动
internal/subagent定义ToolExecutor、ToolExecutionInput/Result、ToolSpecListInputExecutionContext+WithToolExecutor注入到WorkerFactory/Worker,避免 subagent 直接依赖 runtime 细节runtimeSubAgentEngine(internal/runtime/subagent_engine.go)tool_use_mode:auto | required | disabledmax_tool_calls_per_stepsubAgentRuntimeToolExecutorexecuteToolCallWithPermission(...)subagent_tool_call_startedsubagent_tool_call_resultsubagent_tool_call_deniedtask_id、role、tool_name、decision、elapsed_ms、truncateddefaultSubAgentFactory(...)默认注入 runtime 引擎 + tool executorRunSubAgentTask补齐run/session/agent/workdir执行上下文透传测试
已新增并通过:
internal/runtime/subagent_engine_test.gointernal/runtime/subagent_tool_executor_test.gointernal/subagent/execution_context_test.go本地执行:
go test ./internal/subagent ./internal/runtime -count=1go test ./internal/subagent ./internal/runtime -coverinternal/runtime: 92.2%internal/subagent: 89.2%风险与说明
go test ./...在当前分支存在一个internal/config的既有失败用例(与本 PR 改动无关):TestLoadCustomProvidersReadDirAndStatErrors/providers_dir_read_error