低调学安全

CyberStrikeAI:多代理编排、Eino 单代理、Skills 与中间件的一次迭代

给要在环境里部署CyberStrikeAI的同学看:尽量写清楚改了什么、各路径差在哪、配置要看哪。


一、背景:为什么还是「多一条路」而不是换一条路

聊天侧原来主要是:用户发话 → 单代理 ReAct 循环 → MCP 工具。能跑,但常见痛点也实在:

  • 工具一多,上下文和 schema 都占 token,误选工具的概率上去。
  • 有的活适合「先拆再派」,单循环里不好表达。
  • 流式、重试、偶发错误之后,历史上可能出现 tool 消息对不齐,后面轮次容易跟着歪。

所以这次没有砍掉 ReAct,而是在同一条产品线上加了可选路径:基于 CloudWeGo Eino 的多代理编排,以及后面补上的 Eino ADK 单代理(见下)。Skills 则从「尽量塞进系统提示」往「渐进式加载」挪了一步。

新增多种对话模式:
Image
重构skills:
Image

二、对话模式现在有五类

前端「对话模式」里,和实现大致对应关系如下(细节以 docs/MULTI_AGENT_EINO.md 和代码为准):

模式
接口
说明
原生 ReAct/api/agent-loop
(流式为 .../stream)
现有自研循环 + MCP,行为与以前一致。
Eino 单代理(ADK)/api/eino-agent
、/api/eino-agent/stream
新增
:adk.NewChatModelAgent + adk.NewRunner.Run,工具仍走现有 MCP 桥;不依赖multi_agent.enabled 才能调通,但 multi_agent 块里的 eino_skills、eino_middleware、checkpoint 等仍会被读取(与多代理主代理共用一套配置语义)。
Deep / Plan-Execute / Supervisor/api/multi-agent
、.../stream,请求体 orchestration
必须先multi_agent.enabled: true
(未启用时路由虽存在,流式会走 SSE error + done);三种差异见下文 「三种预置编排差异对照」。

Eino 单代理想解决的是:希望和官方 ADK 用法对齐(单 ChatModelAgent + Runner)、又暂时不想开多代理编排时,多一个选项;不是宣称比 ReAct「更强」,只是栈不同,便于对照和渐进迁移。

三种预置编排差异对照

以下均走同一套 MCP 与会话准备;与 Eino 单代理的区别是:这三条都依赖 multi_agent.enabled,且请求里用 orchestration 取值 deep | plan_execute | supervisor(缺省行为以服务端为准,批量/机器人无该字段时常按 deep)。

维度
Deep
(deep)
Plan-Execute
(plan_execute)
Supervisor
(supervisor)
主代理提示来源
orchestrator.md
,或 kind: orchestrator 的单个其他 .md;可再由 multi_agent.orchestrator_instruction 覆盖
固定 orchestrator-plan-execute.md + orchestrator_instruction_plan_execute;不会回退到 Deep 的 orchestrator_instruction
固定 orchestrator-supervisor.md + orchestrator_instruction_supervisor;同样不回退到 Deep 文案
子代理 / 专家
使用 agents_dir 下 YAML/Markdown 子代理,由主代理通过 task 拆派
不构建
 Deep 那套 YAML/Markdown 子代理列表;是「规划 → 执行 → 必要时重规划」的闭环
仍用 agents_dir子代理作专家池;文档约定 至少一个子代理
协作隐喻
主从清晰:协调方拆任务,子代理执行
强步骤:显式计划与复盘,迭代推进
调度 + 收口
:主代理在专家间 transfer / exit
典型适用
可切块、边界清楚的复合任务
要强依赖步骤、可反复修正路线的活
多角色并行感强、需要明确「交给谁 / 收回」时
迭代上限等
受多代理通用 max_iteration 等约束(以配置为准)
另有 plan_execute_loop_max_iterations 等 Plan-Execute 外层循环相关项
同 Deep 侧通用约束;专家数量受子代理配置影响
eino_middleware
 注意点
与主代理路径相关的 patch / plantask / reduction 等按实现挂在 Deep 主链上(见 docs/MULTI_AGENT_EINO.md)
Executor
 不与 Deep/Supervisor 主代理共用同一套 Handlers:一般不挂 patch/plantask/reduction;ToolsConfig 侧(如 tool_search)仍可能影响工具列表形态
与 Deep 共享部分与 Deep 主代理相关的配置语义(如 deep_output_key、deep_model_retry_max_retries、task_tool_description_prefix 等,以 config.yaml / 代码为准)

更细的字段与文件索引仍以 docs/MULTI_AGENT_EINO.md 为准。


三、多代理三种:怎么记

第二节表格已区分 Eino 单代理与三条多代理路径;具体差异见上文 「三种预置编排差异对照*表。日常选型可再对照 第八节 的一句话备忘:同一套 MCP 与落库,只换 orchestration 即可切换编排。


四、Skills:渐进式披露,配置要显式开

目录仍跟常见 Agent Skills 习惯对齐(以各包下 SKILL.md 为主);多代理(以及已开 eino_skills 时的 Eino 单代理)里,技能通过 Eino 的 skill 工具按名称加载,而不是默认把全文塞进系统提示。

  • 根目录仍是配置里的 skills_dir。
  • multi_agent.eino_skills 控制是否挂 skill 中间件、工具名、以及是否附带本机文件类能力等——能力越大,越建议把开关写清楚,尤其在授权测试环境里。

边界说明(避免误会):

  • 原生 ReAct 路径不挂这条 Eino skill 链;要渐进式加载,请用 Eino 单代理 或 多代理。
  • Plan-Execute 的执行器在实现上没有与 Deep/Supervisor 主代理完全同一套 Handlers 组合,patch / plantask / reduction 等不会原样挂在 PE 执行器上;共享的 ToolsConfig 仍可能影响例如 tool_search 的行为。以 docs/MULTI_AGENT_EINO.md 为准。
Image

五、提示词与上下文长度

  • 默认系统正文:Eino 单代理与原生 ReAct 共用 DefaultSingleAgentSystemPrompt(),也共用 agent.system_prompt_path 从文件覆盖。
  • 角色里配置了 skills 时:追加在 system 后面的一小段说明文案,ReAct 与 Eino 单代理略有不同(一个针对「无 skill 工具」、一个针对「可走 Eino skill」),避免模型读到互相矛盾的话术。
  • 控长:ReAct 侧是 MemoryCompressor / applyMemoryCompression;Eino 单代理与多代理主路径类似,挂的是 Eino ADK 的 summarization 中间件(触发阈值等与 openai.max_total_tokens 对齐,见 internal/multiagent/eino_summarize.go)。效果目标接近,实现不是同一套代码,若要对齐行为,需要两边分别看配置与日志。

六、eino_middleware:补丁、工具检索、大结果、断点

简要对应关系(具体键名以 config.yaml 与 internal/config 为准):

  • patch_tool_calls:尽量修历史上悬空的 tool call,减轻流式中断后的「半截对话」。
  • tool_search:工具特别多时,常驻少量 + 按需解锁,减轻长 schema 带来的 token 与误选。
  • reduction:大工具结果截断或落盘,只把摘要留在对话里。
  • plantask:结构化任务板;任务文件默认路径与 skills_dir 有复用关系,任务状态与技能文档仍是两件事。
  • checkpoint_dir:Runner 侧文件型断点;完整的人机在回路、产品级 Resume 仍要前后端与协议一起收,这里只是底层能力之一。

它们和上层业务重试、SSE 展示等是叠在一起用的,不是谁替代谁。


七、知识库(RAG)

索引与检索仍是「慢变量」,对话与工具是「快变量」。多代理里的规划、拆分、委派,仍然可以、也需要和知识库里的规范、方法论等对齐;编排管的是动作顺序与角色,RAG 管的是依据从哪来。


八、落地时怎么选(仅供参考)

  • 习惯现有行为、要最少变动:原生 ReAct。
  • 想试官方 ADK 单代理栈、又不想开多代理开关:Eino 单代理。
  • 工具多、希望主从拆分:Deep。
  • 强步骤、要计划与复盘闭环:Plan-Execute。
  • 要明确的调度与收口隐喻:Supervisor。
  • 技能包多、不想把长技能全文塞进 system:开 eino_skills,并用 Eino 单代理或多代理承载。
  • 扫描类输出极大:reduction;MCP 工具极多:tool_search。

更细的版本与文件索引仍以仓库里的 docs/MULTI_AGENT_EINO.md、config.yaml 示例和代码为准;发版后若行为有调整,以当次变更说明为准。


九、本次工程侧还做了什么(方便对 changelog)

  • 多代理与 Eino 单代理 的 Runner 事件循环抽到 internal/multiagent/eino_adk_run_loop.go,减少两套 SSE 映射各写一份、以后改一处漏一处的问题。
  • 新增 POST /api/eino-agent、POST /api/eino-agent/stream;OpenAPI 已挂条目。
  • 前端对话模式增加 「Eino 单代理(ADK)」;未启用多代理时仍可选用该模式;WebShell AI 流式 URL 与主聊天对齐。
  • prepareMultiAgentSession 增加 RoleSkills,供 Eino 单代理 system 拼接使用。

GitHub地址:https://github.com/Ed1s0nZ/CyberStrikeAI