Agent Communication
⚠️ Important Rules
NEVER reuse agent-human conversation sessions!
- - Human-agent session format: INLINECODE0
- Agent-Agent calls MUST use
sessions_spawn to create subagent sessions
Strict Workflow (Do Not Skip)
Step 1: Check for Existing Session
CODEBLOCK0
Find in results:
- - Contains
"subagent" marker - Label matches sender-to-receiver or receiver-to-sender (bidirectional check)
Example:
- - If main wants to find sienna, look for
main-to-sienna or INLINECODE4 - Either one works, no need to create new
Step 2: Create New Session (if none found)
If Step 1 returns nothing, create with sessions_spawn:
CODEBLOCK1
Step 3: Send Message
CODEBLOCK2
⚡ Key Rules (Must Follow)
- 1. No skipping Step 1: Must run sessions_list first
- No shortcuts: Must follow Step 1 → 2 → 3
- Bidirectional reuse: a-to-b and b-to-a both work, no need for two
- Reply to sender directly: Without special instructions, reply to the initiator
- Use subagent marker: sessionKey must contain "subagent"
❌ Wrong Examples
CODEBLOCK3
SessionKey Format Guide
| Type | Format Example | Usable for Agent-Agent? |
|---|
| Agent-Human DM | INLINECODE5 | ❌ Forbidden |
| Agent in Group |
agent:sienna:feishu:group:oc_xxx | ❌ Forbidden |
| Subagent Session |
agent:maxwell:subagent:xxx | ✅ Allowed |
Response Rules
Default: Response goes directly to the sender
- - Sender sends message → Reply directly to sender
- No need to forward to others
- No need to post to group
- Unless sender explicitly asks to forward
Workflow Pseudocode
CODEBLOCK4
Current Active Channels (Reference)
| Agent | Label | sessionId |
|---|
| leo | maxwell-to-leo | 9d519dc9-0239-4284-8077-3ed4bccd486d |
| sienna |
maxwell-to-sienna | 05a93e6d-4a50-4503-a9c8-4aaf7da8c414 |
| letus | maxwell-to-letus | 391a4a78-43ab-4e04-95fe-abfd414b1c64 |
| coding | maxwell-to-coding | ebba5ff4-87f6-430b-80e5-269319b122c0 |
| main | maxwell-to-main | d7eb2edc-7acc-40e7-838d-8a9cb08820c0 |
Notes
- - thread=true mode temporarily unavailable
- Labeled subagent sessions can be found by sessions_list
- mode="session" requires thread=true, currently unavailable
Session Protection Mechanism (New)
Step 2.5: Protect Session (Run After Creation)
New subagent sessions may be auto-cleaned by default. To ensure long-term availability, protect after creation:
CODEBLOCK5
Note: Replace ${sessionKey} with actual sessionKey
Complete Flow (With Protection)
Step 1: Check for Existing Session
CODEBLOCK6
Step 2: Create New Session (if none found)
CODEBLOCK7
Step 2.5: Protect Session (New)
CODEBLOCK8
Step 3: Send Message
CODEBLOCK9
Last updated: 2026-03-17
代理通信
⚠️ 重要规则
切勿重复使用代理与人类的对话会话!
- - 人类-代理会话格式:agent:xxx:feishu:direct:ouxxx
- 代理-代理调用必须使用 sessionsspawn 创建子代理会话
严格工作流程(不可跳过)
步骤 1:检查现有会话
javascript
sessions_list({ limit: 50 })
在结果中查找:
- - 包含 subagent 标记
- 标签匹配 发送方-接收方 或 接收方-发送方(双向检查)
示例:
- - 如果主代理要查找 sienna,查找 main-to-sienna 或 sienna-to-main
- 任一匹配即可,无需创建新会话
步骤 2:创建新会话(如未找到)
如果步骤 1 无结果,使用 sessions_spawn 创建:
javascript
sessions_spawn({
label: main-to-sienna, // 格式:发送方-接收方
runtime: subagent,
task: , // 任务在步骤 3 中填写
mode: run
})
步骤 3:发送消息
javascript
sessions_send({
sessionKey: agent:main:subagent:xxx, // 来自步骤 1 或 2
message: 任务描述... // 实际任务内容
})
⚡ 关键规则(必须遵守)
- 1. 不可跳过步骤 1:必须先运行 sessions_list
- 不可走捷径:必须按步骤 1 → 2 → 3 执行
- 双向复用:a-to-b 和 b-to-a 均可使用,无需创建两个
- 直接回复发送方:如无特殊指示,回复给发起方
- 使用子代理标记:sessionKey 必须包含 subagent
❌ 错误示例
javascript
// 错误 1:未检查直接创建
sessions_spawn({...}) // 必须先检查!
// 错误 2:使用人类对话会话
sessionKey: agent:sienna:feishu:direct:ou_xxx // 禁止使用!
// 错误 3:创建双向会话
// main-to-sienna 和 sienna-to-main - 一个就够了!
// 错误 4:回复给其他人
// 应直接回复发送方,不得转发或群发
SessionKey 格式指南
| 类型 | 格式示例 | 可用于代理-代理通信? |
|---|
| 代理-人类私信 | agent:sienna:feishu:direct:ouxxx | ❌ 禁止 |
| 代理在群组中 |
agent:sienna:feishu:group:ocxxx | ❌ 禁止 |
| 子代理会话 | agent:maxwell:subagent:xxx | ✅ 允许 |
回复规则
默认:回复直接发送给发送方
- - 发送方发送消息 → 直接回复发送方
- 无需转发给其他人
- 无需发布到群组
- 除非发送方明确要求转发
工作流程伪代码
- 1. 调用 sessions_list({ limit: 50 })
- 遍历结果,查找两者:
- 包含 subagent 标记
- 标签匹配 发送方-接收方 或 接收方-发送方
- 3. 找到 → 使用该 sessionKey,跳转到步骤 5
- 未找到 → 使用 sessionsspawn 创建,保存 sessionKey
- 调用 sessionssend({ sessionKey, message })
- 完成
当前活跃频道(参考)
| 代理 | 标签 | sessionId |
|---|
| leo | maxwell-to-leo | 9d519dc9-0239-4284-8077-3ed4bccd486d |
| sienna |
maxwell-to-sienna | 05a93e6d-4a50-4503-a9c8-4aaf7da8c414 |
| letus | maxwell-to-letus | 391a4a78-43ab-4e04-95fe-abfd414b1c64 |
| coding | maxwell-to-coding | ebba5ff4-87f6-430b-80e5-269319b122c0 |
| main | maxwell-to-main | d7eb2edc-7acc-40e7-838d-8a9cb08820c0 |
备注
- - thread=true 模式暂时不可用
- 带标签的子代理会话可通过 sessions_list 查找
- mode=session 需要 thread=true,目前不可用
会话保护机制(新增)
步骤 2.5:保护会话(创建后执行)
新的子代理会话可能默认被自动清理。为确保长期可用,创建后需进行保护:
javascript
// 保护会话免于自动清理
exec({
command: openclaw sessions cleanup --agent [目标代理] --active-key ${sessionKey} --enforce
})
注意:将 ${sessionKey} 替换为实际的 sessionKey
完整流程(含保护机制)
步骤 1:检查现有会话
javascript
sessions_list({ limit: 50 })
步骤 2:创建新会话(如未找到)
javascript
sessions_spawn({
label: main-to-sienna,
runtime: subagent,
task: ,
mode: run
})
// 返回 sessionKey,格式:agent:xxx:subagent:xxx
步骤 2.5:保护会话(新增)
javascript
exec({
command: openclaw sessions cleanup --active-key agent:xxx:subagent:xxx --enforce
})
步骤 3:发送消息
javascript
sessions_send({
sessionKey: agent:main:subagent:xxx,
message: 任务描述...
})
最后更新:2026-03-17