多智能体与路由

多智能体与路由

本文解读 Grok Bot 的「智能体生态」:推理路由(怎么把同一个 agent 切到 Claude Code / Codex / OpenRouter)、多 agent 协作(agent 之间怎么异步通信)、以及桌面/浏览器自动化(computer/browser use)。

面向对象:想理解「它如何对接不同模型后端、如何与其它 agent 协作、如何在桌面干活」的读者。文中路径均为仓库内相对路径。

1. 推理路由(Inference Router)

重构版新增的能力,在 Settings → Router 选择后端(source/node-agent-coordinator/inference-router.tssource/shared/inference-router.tssource/host/extensions/inference/provider-session.ts)。

1.1 四个 provider

// shared/inference-router.ts
export const SAND_INFERENCE_PROVIDERS = ["cursor", "claude-code", "codex", "openrouter"];
provider认证工具桥接方式
cursor(默认)复用 Grok Bot/Cursor 会话原生工具 + 插件
claude-code复用本地 Claude Code 登录createRoutedMcpBridge 暴露 mcp__grok_bot_plugins__*
codex复用本地 ChatGPT/Codex 登录Direct Responses transport + Grok Bot 工具
openrouterAPI key(桌面 secrets bridge)ai-sdk 工具循环

1.2 转录存储与用量

createCoordinatorInferenceRouter

  • 每个 agent 的转录存 inference-router-transcript.jsonschemaVersion: 2,每 agent 保留最近 200 条);
  • sendPrompt 对非 cursor provider 走 runRoutedProviderText
  • 用量经 recordInferenceUsage 写进 settings(SandInferenceRouterUsage:requests / inputTokens / outputTokens / cacheReadTokens / cacheWriteTokens / lastUsedAt)。

1.3 routed MCP bridge

source/node-agent-coordinator/routed-mcp-bridge.ts

  • 起一个本地 HTTP 服务,暴露标准 JSON-RPC 2.0 MCP 端点(initialize / tools/list / tools/call);
  • tools/list 动态发现 Grok Bot 插件工具,并按工具名推断 readOnlyHint / destructiveHintisReadOnly 用正则识别 read/search/find 等动词);
  • tools/call 转发到真实的 Grok Bot 工具执行,返回 MCP 格式的 text/image content。

这样 Claude Code 就能把 Grok Bot 的插件/MCP 工具当作它自己的 mcp__grok_bot_plugins__* 工具来调。

1.4 各 provider 的执行器

provider-session.ts

  • codexExecutor:Direct Responses(responses API),支持工具定义 + executeTool 回调、reasoning effort。
  • claudeExecutor@anthropic-ai/claude-agent-sdkqueryClaudemaxTurns 受 MCP 是否启用控制(无 MCP 1 turn,有 MCP 8 turns),permissionMode: "default"
  • openRouterExecutorai(ai-sdk)+ @ai-sdk/openai,走工具集循环。

2. 多 agent 协作

source/host/agents/agent-messaging.ts(prompt 侧)+ source/host/agents/agent-profile.ts 等(存储侧)。

2.1 Agent 目录

  • 每个 agent 是 agentsRootDir/<agentId>/ 下的一个文件夹:profile.json(name/description)、group.jsonmemberIds)、memory、routines 等——文件即真相
  • renderAgentDirectorySystemPrompt 把「队友列表 + 群组」注入 system prompt(上限 AGENT_DIRECTORY_PROMPT_LIMIT = 40)。

2.2 异步通信(像发短信)

  • 工具:SendToAgent(发消息/图片给单个 agent 或群组)、CreateAgent(建新 agent)、UpdateAgent(安全合并式改名/描述)。
  • 异步语义:发完立即返回 ack,不等待回复;回复作为新 turn 的隐藏唤醒到达,cue 为 [agent]AGENT_INBOUND_WAKE_CUE)。
  • 区分通道SendToAgent → 另一个 agent;SendMessage → 本聊天里的用户。二者不混。

2.3 判断(judgment)约束

prompt 明确约束「别乱发」:

  • 转发用户原话要转述而非照搬(尤其抱怨/批评);
  • fan-out 需要用户明确同意(“ask each of my account agents”),否则先用 question widget 提议;
  • 收到消息同样要判断:没东西可说就停,避免两个 agent 互相 ping-pong ack;
  • 无法删除 agent(用户可从侧边栏右键 Delete)。

2.4 群组与 shared room

  • 群组是「共享房间」,发消息到群组 id 则所有成员可见;
  • 群组内的 turn 在历史中带 GROUP_CHAT_TAG_PREFIX 标记;
  • 1:1 DM 是私密的(不 @ 别人、不假设群成员能看到)。

3. Computer / browser use(桌面与浏览器自动化)

source/host/runner/tools/sand-browser-use-subagent.tssand-computer-use-subagent.tssource/host/runner/computer-use.ts

3.1 两种 subagent

browserUsecomputerUse
粒度page-level(DOM 快照、按引用点元素、填表单、截图)desktop-level(截图 + 鼠标键盘:click/drag/type/key/scroll/wait)
适用浏览器-only 任务,更快更可靠,共享 box 浏览器登录态GUI 应用、文件对话框、拖拽、或「打败 DOM 自动化」的站
约束headless、不能反问、后台运行同左;同一时刻只能跑一个(共享桌面单屏)

3.2 共同点

  • 都是后台 subagent(像 Task),完成后自动通知,不轮询;
  • headless 且不能问后续问题 → 任务要「tightly-scoped」,给足 site/account/确切值/成功标准/停止点/要回报什么;
  • 不能代替用户:遇到密码/2FA/captcha/支付就停下来报告,父 agent 用 request_box_help 把 box 交给用户,之后再派发继续(见 EXECUTION.md)。

3.3 桌面基础设施

  • computer-use.ts:computerUse 的 prewarm、executor 解析、audit 分类;
  • VNC:box 桌面通过 VNC 呈现(gateway/box-vnc-proxy.tsforever-boxvncUrl);
  • 每个 agent 有自己的屏幕/浏览器窗口,但共享同一台机器。

4. 一句话总结

  • 路由:同一套 Grok Bot 工具,通过 MCP bridge(Claude Code)、Direct Responses(Codex)、ai-sdk 循环(OpenRouter)适配到不同后端,转录与用量本地记录。
  • 协作:agent 之间是异步文件级通信(SendToAgent + [agent] 唤醒 cue),fan-out 需授权,agent 即文件夹。
  • 桌面browserUse(DOM)vs computerUse(像素)分工,headless 后台跑,人机验证交给真人。

相关文档: