会话工具(Session Tools)
目标:小型、难以误用的工具集,以便智能体可以列出会话、获取历史记录并向另一个会话发送消息。
工具名称
- sessions_list
- sessions_history
- sessions_send
- sessions_spawn
键模型
- 主直接聊天桶始终是字面键 "main"(解析为当前智能体的主键)。
- 群组聊天使用 agent:<agentId>:<channel>:group:<id> 或 agent:<agentId>:<channel>:channel:<id>(传递完整键)。
- 定时任务使用 cron:<job.id>。
- 钩子(Hooks)使用 hook:<uuid>,除非明确设置。
- 节点会话使用 node-<nodeId>,除非明确设置。
global 和 unknown 是保留值,永远不会列出。如果 session.scope = "global",我们将其别名为 main,以便调用者永远不会看到 global。
sessions_list
将会话列为行数组。
参数:
- kinds?: string[] 过滤器:"main" | "group" | "cron" | "hook" | "node" | "other" 中的任何一个
- limit?: number 最大行数(默认:服务器默认,限制例如 200)
- activeMinutes?: number 仅在 N 分钟内更新的会话
- messageLimit?: number 0 = 无消息(默认 0);>0 = 包含最后 N 条消息
行为:
- messageLimit > 0 为每个会话获取 chat.history 并包含最后 N 条消息。
- 工具结果在列表输出中被过滤掉;使用 sessions_history 获取工具消息。
- 在沙箱化智能体会话中运行时,会话工具默认为仅生成的可见性(见下文)。
行形状(JSON):
- key:会话键(字符串)
- kind:main | group | cron | hook | node | other
- channel:whatsapp | telegram | discord | signal | imessage | webchat | internal | unknown
- displayName(如果可用,群组显示标签)
- updatedAt(毫秒)
- sessionId
- model、contextTokens、totalTokens
- thinkingLevel、verboseLevel、systemSent、abortedLastRun
- sendPolicy(如果设置了会话覆盖)
- lastChannel、lastTo
- deliveryContext(可用时标准化的 { channel, to, accountId })
- transcriptPath(从存储目录 + sessionId 派生的尽力而为路径)
- messages?(仅当 messageLimit > 0 时)
sessions_history
获取一个会话的转录。
参数:
- sessionKey(必需;接受会话键或来自 sessions_list 的 sessionId)
- limit?: number 最大消息数(服务器限制)
- includeTools?: boolean(默认 false)
行为:
- includeTools=false 过滤 role: "toolResult" 消息。
- 以原始转录格式返回消息数组。
- 当给定 sessionId 时,OpenClaw 将其解析为相应的会话键(缺少 ID 错误)。
sessions_send
向另一个会话发送消息。
参数:
- sessionKey(必需;接受会话键或来自 sessions_list 的 sessionId)
- message(必需)
- timeoutSeconds?: number(默认 >0;0 = 发送即忘)
行为:
- timeoutSeconds = 0:排队并返回 { runId, status: "accepted" }。
- timeoutSeconds > 0:等待最多 N 秒以完成,然后返回 { runId, status: "ok", reply }。
- 如果等待超时:{ runId, status: "timeout", error }。运行继续;稍后调用 sessions_history。
- 如果运行失败:{ runId, status: "error", error }。
- 宣布传递在主运行完成后运行,是尽力而为的;status: "ok" 不保证宣布已传递。
- 通过网关 agent.wait(服务器端)等待,因此重新连接不会丢失等待。
- 为主运行注入智能体间消息上下文。
- 主运行完成后,OpenClaw 运行回复循环:
- 第 2+ 轮在请求者和目标智能体之间交替。
- 精确回复 REPLY_SKIP 以停止乒乓。
- 最大轮次为 session.agentToAgent.maxPingPongTurns(0–5,默认 5)。
- 循环结束后,OpenClaw 运行智能体间宣布步骤(仅目标智能体):
- 精确回复 ANNOUNCE_SKIP 以保持沉默。
- 任何其他回复都会发送到目标频道。
- 宣布步骤包括原始请求 + 第 1 轮回复 + 最新的乒乓回复。
频道字段(Channel Field)
- 对于群组,channel 是会话条目上记录的频道。
- 对于直接聊天,channel 从 lastChannel 映射。
- 对于 cron/hook/node,channel 是 internal。
- 如果缺少,channel 是 unknown。
安全 / 发送策略(Security / Send Policy)
基于频道/聊天类型(而不是每个会话 ID)的策略阻止。
{
"session": {
"sendPolicy": {
"rules": [
{
"match": { "channel": "discord", "chatType": "group" },
"action": "deny"
}
],
"default": "allow"
}
}
}
运行时覆盖(每个会话条目):
- sendPolicy: "allow" | "deny"(未设置 = 继承配置)
- 可通过 sessions.patch 或仅所有者 /send on|off|inherit(独立消息)设置。
强制执行点:
- chat.send / agent(网关)
- 自动回复传递逻辑
sessions_spawn
在隔离的会话中生成子智能体运行,并将结果宣布回请求者聊天频道。
参数:
- task(必需)
- label?(可选;用于日志/UI)
- agentId?(可选;如果允许,在另一个智能体 ID 下生成)
- model?(可选;覆盖子智能体模型;无效值错误)
- runTimeoutSeconds?(默认 0;设置时,在 N 秒后中止子智能体运行)
- cleanup?(delete|keep,默认 keep)
白名单:
- agents.list[].subagents.allowAgents:通过 agentId 允许的智能体 ID 列表(["*"] 允许任何)。默认:仅请求者智能体。
发现:
- 使用 agents_list 发现 sessions_spawn 允许哪些智能体 ID。
行为:
- 使用 deliver: false 启动新的 agent:<agentId>:subagent:<uuid> 会话。
- 子智能体默认使用完整工具集减去会话工具(可通过 tools.subagents.tools 配置)。
- 子智能体不允许调用 sessions_spawn(不允许子智能体 → 子智能体生成)。
- 始终非阻塞:立即返回 { status: "accepted", runId, childSessionKey }。
- 完成后,OpenClaw 运行子智能体宣布步骤并将结果发布到请求者聊天频道。
- 在宣布步骤期间精确回复 ANNOUNCE_SKIP 以保持沉默。
- 宣布回复标准化为 Status/Result/Notes;Status 来自运行时结果(而不是模型文本)。
- 子智能体会话在 agents.defaults.subagents.archiveAfterMinutes(默认:60)后自动存档。
- 宣布回复包括统计行(运行时、令牌、sessionKey/sessionId、转录路径和可选成本)。
沙箱会话可见性(Sandbox Session Visibility)
沙箱化会话可以使用会话工具,但默认情况下它们只能看到通过 sessions_spawn 生成的会话。
配置:
{
agents: {
defaults: {
sandbox: {
// 默认:"spawned"
sessionToolsVisibility: "spawned" // 或 "all"
}
}
}
}