多智能体与路由
多智能体与路由
本文解读 Grok Bot 的「智能体生态」:推理路由(怎么把同一个 agent 切到 Claude Code / Codex / OpenRouter)、多 agent 协作(agent 之间怎么异步通信)、以及桌面/浏览器自动化(computer/browser use)。
面向对象:想理解「它如何对接不同模型后端、如何与其它 agent 协作、如何在桌面干活」的读者。文中路径均为仓库内相对路径。
1. 推理路由(Inference Router)
重构版新增的能力,在 Settings → Router 选择后端(source/node-agent-coordinator/inference-router.ts、source/shared/inference-router.ts、source/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 工具 |
openrouter | API key(桌面 secrets bridge) | ai-sdk 工具循环 |
1.2 转录存储与用量
createCoordinatorInferenceRouter:
- 每个 agent 的转录存
inference-router-transcript.json(schemaVersion: 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/destructiveHint(isReadOnly用正则识别 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(responsesAPI),支持工具定义 +executeTool回调、reasoning effort。claudeExecutor:@anthropic-ai/claude-agent-sdk的queryClaude,maxTurns受 MCP 是否启用控制(无 MCP 1 turn,有 MCP 8 turns),permissionMode: "default"。openRouterExecutor:ai(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.json(memberIds)、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.ts、sand-computer-use-subagent.ts、source/host/runner/computer-use.ts。
3.1 两种 subagent
browserUse | computerUse | |
|---|---|---|
| 粒度 | 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.ts、forever-box的vncUrl); - 每个 agent 有自己的屏幕/浏览器窗口,但共享同一台机器。
4. 一句话总结
- 路由:同一套 Grok Bot 工具,通过 MCP bridge(Claude Code)、Direct Responses(Codex)、ai-sdk 循环(OpenRouter)适配到不同后端,转录与用量本地记录。
- 协作:agent 之间是异步文件级通信(
SendToAgent+[agent]唤醒 cue),fan-out 需授权,agent 即文件夹。 - 桌面:
browserUse(DOM)vscomputerUse(像素)分工,headless 后台跑,人机验证交给真人。
相关文档: