Skip to content

[Feature]【功能建议】SubAgent 支持“静默调用”模式,让子代理结果返回主代理而非直接回复用户 #8181

@NekoTumble

Description

@NekoTumble

Description / 描述

感谢开发团队!目前 SubAgent 在沉浸式角色场景中有个局限,建议增加静默调用模式。

🧩 当前行为

在目前的 SubAgent 机制中,主代理通过 transfer_to_[SubAgent] 工具将对话控制权移交给子代理后,子代理会以独立角色与用户直接对话,其回复直接展示在聊天界面中。用户会看到类似“camera_agent”这样的角色切换提示,体验上像是换了一个人在聊天。

对于多角色轮流对话的场景(如客服转接、专家会诊),这种设计是合适的。但对于需要保持单一角色沉浸感的应用(如虚拟伴侣、猫娘女仆、角色扮演助手),这种角色切换会严重破坏沉浸感——用户不希望助手突然“分裂”成多个不同的身份。

🎯 期望行为

希望增加一种静默调用模式(background / silent mode)。在此模式下:

  1. 主代理可以以类似调用函数的方式发起一个子代理任务,并等待子代理返回处理结果(结果可以包含文本、图片、语音等多种类型)。
  2. 子代理在整个过程中不直接向用户输出任何内容,其回复数据仅返回给主代理
  3. 主代理获得结果后,可以将其整合到自己的回复中,以统一的角色人格和口吻呈现给用户。
  4. 用户完全感知不到子代理的存在,只看到主代理的最终回复。

注:子代理的提示词可以通过现有的**人格设定(Persona)**机制独立配置,无需额外增加输入框。

🔧 调用方式建议

  • 可以在现有 transfer_to_[SubAgent] 的基础上增加一个可选参数(例如 mode="silent"),或新增一个 call_subagent 工具。
  • 当静默模式启用时,主代理会挂起当前回复生成,等待子代理完成任务后再继续。

⏳ 异步与结果处理

  • 主代理需要支持异步等待子代理的完成信号。
  • 子代理返回的结果应包含结构化的数据(如 {text: "...", image: "...", audio: "..."}),方便主代理解析和再组织。

🚫 替代方案(当前)

目前用户只能:

  • 接受角色切换带来的割裂感;或者
  • 放弃使用 SubAgent,将所有工具调用逻辑(如超时重试、prompt 构造等)直接写入主代理的系统提示词,导致提示词极度臃肿、容易出错、难以维护。

这两种方案都不理想,尤其对于需要长期维护的沉浸式角色项目。

Use Case / 使用场景

📸 典型用例

1. 拍照场景
主代理(例如猫娘女仆“小白”)需要拍照给主人看。

  • 主代理输出内部意图(如 [拍照:自拍 情绪:委屈],但不显示给用户) → 静默调用 camera_subagent(该子代理使用独立的“拍照助手”人格) → 子代理生成图片并返回 → 主代理将图片嵌入自己的回复中,并附上角色化的台词:“哼,给你看~才不是特意拍的喵!”
    用户全程只看到“小白”的对话和图片,体验自然统一。

2. 记忆查询场景
主代理想确认主人曾经说过的某个约定。

  • 主代理静默调用 memory_subagent → 子代理查询记忆,处理冲突,返回结果文本 → 主代理以自己的语气说出:“主人上次说喜欢吃提拉米苏喵~”

3. 语音生成场景
主代理想用撒娇的声音说一句话。

  • 主代理静默调用 tts_subagent,传入文本和语气参数 → 子代理合成语音并返回音频 → 主代理发送语音消息,同时可选地发送文字“你听~”。
    用户听到的是角色的声音,而不是突然冒出来的“tts_agent”。

📌 附加信息

  • AstrBot 版本:最新 WebUI 版(2026-05)
  • 使用场景:沉浸式角色扮演(猫娘女仆、虚拟人、动漫角色聊天等)

希望开发者能考虑这个增强功能,让 SubAgent 同时覆盖“对话转移”和“能力模块”两种主流使用模式。再次感谢 AstrBot 团队的辛勤付出!

Willing to Submit PR? / 是否愿意提交PR?

  • Yes, I am willing to submit a PR. / 是的,我愿意提交 PR。

Code of Conduct

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:providerThe bug / feature is about AI Provider, Models, LLM Agent, LLM Agent Runner.enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions