CyberStrikeAI:多代理编排、Eino 单代理、Skills 与中间件的一次迭代
给要在环境里部署CyberStrikeAI的同学看:尽量写清楚改了什么、各路径差在哪、配置要看哪。
一、背景:为什么还是「多一条路」而不是换一条路
聊天侧原来主要是:用户发话 → 单代理 ReAct 循环 → MCP 工具。能跑,但常见痛点也实在:
工具一多,上下文和 schema 都占 token,误选工具的概率上去。 有的活适合「先拆再派」,单循环里不好表达。 流式、重试、偶发错误之后,历史上可能出现 tool 消息对不齐,后面轮次容易跟着歪。
所以这次没有砍掉 ReAct,而是在同一条产品线上加了可选路径:基于 CloudWeGo Eino 的多代理编排,以及后面补上的 Eino ADK 单代理(见下)。Skills 则从「尽量塞进系统提示」往「渐进式加载」挪了一步。
二、对话模式现在有五类
前端「对话模式」里,和实现大致对应关系如下(细节以 docs/MULTI_AGENT_EINO.md 和代码为准):
| 原生 ReAct | /api/agent-loop.../stream) | |
| 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: trueerror + done);三种差异见下文 「三种预置编排差异对照」。 |
Eino 单代理想解决的是:希望和官方 ADK 用法对齐(单 ChatModelAgent + Runner)、又暂时不想开多代理编排时,多一个选项;不是宣称比 ReAct「更强」,只是栈不同,便于对照和渐进迁移。
三种预置编排差异对照
以下均走同一套 MCP 与会话准备;与 Eino 单代理的区别是:这三条都依赖 multi_agent.enabled,且请求里用 orchestration 取值 deep | plan_execute | supervisor(缺省行为以服务端为准,批量/机器人无该字段时常按 deep)。
Deepdeep) | Plan-Executeplan_execute) | Supervisorsupervisor) | |
|---|---|---|---|
orchestrator.mdkind: 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 拆派 | 不构建 | agents_dir子代理作专家池;文档约定 至少一个子代理 | |
调度 + 收口transfer / exit | |||
max_iteration 等约束(以配置为准) | plan_execute_loop_max_iterations 等 Plan-Execute 外层循环相关项 | ||
eino_middleware | docs/MULTI_AGENT_EINO.md) | Executortool_search)仍可能影响工具列表形态 | 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为准。
五、提示词与上下文长度
默认系统正文: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