From d71f526af455f5b3d31a4370127a63b258cb8b2d Mon Sep 17 00:00:00 2001 From: qing <1776177662@qq.com> Date: Wed, 5 Aug 2026 00:16:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(aibox):=20=E5=AD=90=E4=BB=A3=E7=90=86?= =?UTF-8?q?=E6=80=9D=E8=80=83=E8=BF=87=E7=A8=8B=E5=AE=9E=E6=97=B6=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E5=88=B0=E4=B8=BB=E5=AF=B9=E8=AF=9D=E4=BE=A7=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - run_full_subagent 新增 output_callback 参数,转发子代理 reasoning 事件 - SubAgentTool 新增 _subagent_output 回调,将子代理思考过程以 line 流式输出到前端 --- aibox/aibox.py | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/aibox/aibox.py b/aibox/aibox.py index 63de676..dd9fbe5 100644 --- a/aibox/aibox.py +++ b/aibox/aibox.py @@ -6556,7 +6556,8 @@ def run_light_subagent(role, task, config, logger=None, model=None, def run_full_subagent(role, task, config, logger=None, model=None, - temperature=None, max_tokens=2048, max_turns=10) -> str: + temperature=None, max_tokens=2048, max_turns=10, + output_callback=None) -> str: """完整子代理:拥有全部工具,独立上下文,多轮对话直到任务完成。 子代理是完整的 DeepSeekChat 实例,拥有文件操作、命令执行、网页访问、 @@ -6564,6 +6565,9 @@ def run_full_subagent(role, task, config, logger=None, model=None, 多轮对话(工具调用→结果→继续)直到任务完成或达到最大轮次。 结束后自动总结对话内容,返回摘要给父代理。 + output_callback: 可选回调(msg_type, content),用于转发子代理的实时思考过程 + (reasoning_start / reasoning / reasoning_end),不传则静默执行。 + 供 create_subagent 工具使用。 """ try: @@ -6611,7 +6615,13 @@ def run_full_subagent(role, task, config, logger=None, model=None, # 运行对话:think_and_respond 内部递归处理工具调用, # 直到 AI 返回纯文本无工具调用,或达到轮次限制 - sub_chat.think_and_respond(task, output_callback=None) + # 将子代理的思考过程(reasoning)通过 output_callback 转发给父代理 + def sub_think_callback(msg_type, content): + if output_callback is not None and \ + msg_type in ("reasoning_start", "reasoning", "reasoning_end"): + output_callback(msg_type, content) + + sub_chat.think_and_respond(task, output_callback=sub_think_callback) if logger: logger.info(f"子代理完成,共 {turn_count[0]} 轮,开始总结...") @@ -6732,6 +6742,15 @@ class SubAgentTool(Tool): "required": ["role", "task"] } + def _subagent_output(self, msg_type: str, content: str): + """子代理思考过程转发:把子代理的实时推理文字输出到主对话侧栏""" + if msg_type == "reasoning_start": + self.send_line("\n💭 [子代理思考] ") + elif msg_type == "reasoning": + self.send_line(content) + elif msg_type == "reasoning_end": + self.send_line("\n") + def execute(self, role: str = None, task: str = None, model: str = None, temperature: float = None, max_tokens: int = 2048, max_turns: int = 10, **kwargs) -> str: @@ -6739,7 +6758,8 @@ class SubAgentTool(Tool): return error return run_full_subagent(role, task, self.config, logger=self.logger, model=model, temperature=temperature, - max_tokens=max_tokens, max_turns=max_turns) + max_tokens=max_tokens, max_turns=max_turns, + output_callback=self._subagent_output) class SetProxyTool(Tool):