เครื่องมือเซสชัน¶
เป้าหมาย: ชุดเครื่องมือขนาดเล็กที่ใช้งานผิดพลาดได้ยาก เพื่อให้เอเจนต์สามารถแสดงรายการเซสชัน ดึงประวัติ และส่งข้อความไปยังอีกเซสชันหนึ่งได้
ชื่อเครื่องมือ¶
sessions_listsessions_historysessions_sendsessions_spawn
โมเดลคีย์¶
- บักเก็ตแชตตรงหลักจะเป็นคีย์ตัวอักษรตรงตัว
"main"เสมอ (ถูกแปลงเป็นคีย์หลักของเอเจนต์ปัจจุบัน) - แชตกลุ่มใช้
agent:<agentId>:<channel>:group:<id>หรือagent:<agentId>:<channel>:channel:<id>(ส่งคีย์เต็ม) - งาน Cron ใช้
cron:<job.id> - Hooks ใช้
hook:<uuid>เว้นแต่จะตั้งค่าไว้ชัดเจน - เซสชันของโหนดใช้
node-<nodeId>เว้นแต่จะตั้งค่าไว้ชัดเจน
globalและunknownเป็นค่าที่สงวนไว้และจะไม่ถูกแสดงรายการglobalและunknownเป็นค่าที่สงวนไว้และจะไม่ถูกแสดงรายการ หากเป็นsession.scope = "global"เราจะทำการ alias เป็นmainสำหรับทุกเครื่องมือ เพื่อให้ผู้เรียกไม่เห็นglobal
sessions_list¶
แสดงรายการเซสชันเป็นอาร์เรย์ของแถว
พารามิเตอร์:
- ฟิลเตอร์
kinds?: string[]: ค่าใดค่าหนึ่งใน"main" | "group" | "cron" | "hook" | "node" | "other" limit?: numberจำนวนแถวสูงสุด (ค่าเริ่มต้น: ค่าเริ่มต้นของเซิร์ฟเวอร์ มีการ clamp เช่น 200)activeMinutes?: numberเฉพาะเซสชันที่มีการอัปเดตภายใน N นาทีmessageLimit?: number0 = ไม่มีข้อความ (ค่าเริ่มต้น 0); >0 = รวมข้อความล่าสุด N ข้อความ
พฤติกรรม:
messageLimit > 0จะดึงchat.historyต่อเซสชันและรวมข้อความล่าสุด N ข้อความ- ผลลัพธ์ของเครื่องมือจะถูกกรองออกจากเอาต์พุตรายการ ใช้
sessions_historyสำหรับข้อความของเครื่องมือ - เมื่อรันในเซสชันเอเจนต์ที่เป็น sandboxed เครื่องมือเซสชันจะตั้งค่าเริ่มต้นเป็น การมองเห็นเฉพาะที่ spawn (ดูด้านล่าง)
รูปแบบแถว (JSON):
key: คีย์เซสชัน (สตริง)kind:main | group | cron | hook | node | otherchannel:whatsapp | telegram | discord | signal | imessage | webchat | internal | unknowndisplayName(ป้ายแสดงผลกลุ่มหากมี)updatedAt(มิลลิวินาที)sessionIdmodel,contextTokens,totalTokensthinkingLevel,verboseLevel,systemSent,abortedLastRunsendPolicy(การ override เซสชันหากตั้งค่าไว้)lastChannel,lastTodeliveryContext(ค่า{ channel, to, accountId }ที่ถูก normalize เมื่อมี)transcriptPath(พาธแบบ best-effort ที่ได้จาก store dir + sessionId)messages?(เฉพาะเมื่อmessageLimit > 0)
sessions_history¶
ดึงทรานสคริปต์ของหนึ่งเซสชัน
พารามิเตอร์:
sessionKey(จำเป็น; รับคีย์เซสชันหรือsessionIdจากsessions_list)limit?: numberจำนวนข้อความสูงสุด (เซิร์ฟเวอร์ทำการ clamp)includeTools?: boolean(ค่าเริ่มต้น false)
พฤติกรรม:
includeTools=falseจะกรองข้อความrole: "toolResult"- ส่งคืนอาร์เรย์ข้อความในรูปแบบทรานสคริปต์ดิบ
- เมื่อได้รับ
sessionIdOpenClaw จะแปลงเป็นคีย์เซสชันที่สอดคล้องกัน (หากไม่พบ id จะเกิดข้อผิดพลาด)
sessions_send¶
ส่งข้อความเข้าไปยังอีกเซสชันหนึ่ง
พารามิเตอร์:
sessionKey(จำเป็น; รับคีย์เซสชันหรือsessionIdจากsessions_list)message(จำเป็น)timeoutSeconds?: number(ค่าเริ่มต้น >0; 0 = ส่งแบบ fire-and-forget)
พฤติกรรม:
timeoutSeconds = 0: เข้าคิวและส่งคืน{ runId, status: "accepted" }timeoutSeconds > 0: รอสูงสุด N วินาทีจนเสร็จสิ้น จากนั้นส่งคืน{ runId, status: "ok", reply }- หากหมดเวลารอ:
{ runId, status: "timeout", error }การรันยังคงดำเนินต่อไป เรียกsessions_historyภายหลัง 38. การรันจะดำเนินต่อไป; เรียกsessions_historyภายหลัง - หากการรันล้มเหลว:
{ runId, status: "error", error } - การประกาศการส่งหลังจากการรันหลักเสร็จสิ้นเป็นแบบ best-effort;
status: "ok"ไม่รับประกันว่าการประกาศจะถูกส่งถึง - การรอทำผ่าน Gateway
agent.wait(ฝั่งเซิร์ฟเวอร์) เพื่อให้การเชื่อมต่อใหม่ไม่ทำให้การรอหลุด - บริบทข้อความระหว่างเอเจนต์จะถูกฉีดสำหรับการรันหลัก
- หลังจากการรันหลักเสร็จสิ้น OpenClaw จะรัน ลูปตอบกลับ:
- รอบที่ 2+ จะสลับระหว่างเอเจนต์ผู้ร้องขอและเอเจนต์เป้าหมาย
- ตอบกลับเป็น
REPLY_SKIPแบบตรงตัวเพื่อหยุดการ ping‑pong - จำนวนรอบสูงสุดคือ
session.agentToAgent.maxPingPongTurns(0–5 ค่าเริ่มต้น 5) - เมื่อจบลูป OpenClaw จะรัน ขั้นตอนประกาศเอเจนต์‑ต่อ‑เอเจนต์ (เฉพาะเอเจนต์เป้าหมาย):
- ตอบกลับเป็น
ANNOUNCE_SKIPแบบตรงตัวเพื่อไม่ส่งเสียง - การตอบกลับอื่นใดจะถูกส่งไปยังช่องทางเป้าหมาย
- ขั้นตอนประกาศรวมคำขอดั้งเดิม + การตอบกลับรอบที่ 1 + การตอบกลับ ping‑pong ล่าสุด
ฟิลด์ Channel¶
- สำหรับกลุ่ม
channelคือช่องทางที่บันทึกไว้ในรายการเซสชัน - สำหรับแชตตรง
channelจะแมปจากlastChannel - สำหรับ cron/hook/node
channelคือinternal - หากไม่มี
channelจะเป็นunknown
ความปลอดภัย / นโยบายการส่ง¶
การบล็อกตามนโยบายโดยอิงตามช่องทาง/ประเภทแชต (ไม่ใช่ต่อ session id)
{
"session": {
"sendPolicy": {
"rules": [
{
"match": { "channel": "discord", "chatType": "group" },
"action": "deny"
}
],
"default": "allow"
}
}
}
การ override ขณะรัน (ต่อรายการเซสชัน):
sendPolicy: "allow" | "deny"(unset = สืบทอดจากคอนฟิก)- ตั้งค่าได้ผ่าน
sessions.patchหรือ/send on|off|inheritเฉพาะเจ้าของ (ข้อความแบบสแตนด์อโลน)
จุดบังคับใช้:
chat.send/agent(Gateway)- ตรรกะการส่ง auto-reply
sessions_spawn¶
สร้างการรันของซับเอเจนต์ในเซสชันที่แยกต่างหากและประกาศผลกลับไปยังช่องทางแชตของผู้ร้องขอ
พารามิเตอร์:
task(จำเป็น)label?(ไม่บังคับ; ใช้สำหรับล็อก/UI)agentId?(ไม่บังคับ; สร้างภายใต้ agent id อื่นหากได้รับอนุญาต)model?(ไม่บังคับ; override โมเดลของซับเอเจนต์; ค่าที่ไม่ถูกต้องจะเกิดข้อผิดพลาด)runTimeoutSeconds?(ค่าเริ่มต้น 0; เมื่อกำหนด จะยกเลิกการรันซับเอเจนต์หลัง N วินาที)cleanup?(delete|keep, ค่าเริ่มต้นkeep)
Allowlist:
agents.list[].subagents.allowAgents: รายการ agent id ที่อนุญาตผ่านagentId(["*"]เพื่ออนุญาตทั้งหมด) ค่าเริ่มต้น: เฉพาะเอเจนต์ผู้ร้องขอ 39. ค่าเริ่มต้น: เฉพาะเอเจนต์ที่ร้องขอ
Discovery:
- ใช้
agents_listเพื่อค้นหาว่า agent id ใดได้รับอนุญาตสำหรับsessions_spawn
พฤติกรรม:
- เริ่มเซสชัน
agent:<agentId>:subagent:<uuid>ใหม่ด้วยdeliver: false - ซับเอเจนต์จะใช้ชุดเครื่องมือเต็ม ยกเว้นเครื่องมือเซสชัน เป็นค่าเริ่มต้น (ปรับได้ผ่าน
tools.subagents.tools) - ซับเอเจนต์ไม่อนุญาตให้เรียก
sessions_spawn(ไม่มีการ spawn ซับเอเจนต์ → ซับเอเจนต์) - ไม่บล็อกเสมอ: ส่งคืน
{ status: "accepted", runId, childSessionKey }ทันที - หลังจากเสร็จสิ้น OpenClaw จะรัน ขั้นตอนประกาศ ของซับเอเจนต์และโพสต์ผลไปยังช่องทางแชตของผู้ร้องขอ
- ตอบกลับเป็น
ANNOUNCE_SKIPแบบตรงตัวระหว่างขั้นตอนประกาศเพื่อไม่ส่งเสียง - การตอบกลับประกาศจะถูก normalize เป็น
Status/Result/Notes;Statusมาจากผลลัพธ์ขณะรัน (ไม่ใช่ข้อความจากโมเดล) - เซสชันซับเอเจนต์จะถูกเก็บถาวรอัตโนมัติหลัง
agents.defaults.subagents.archiveAfterMinutes(ค่าเริ่มต้น: 60) - การตอบกลับประกาศรวมบรรทัดสถิติ (เวลาในการรัน โทเคน sessionKey/sessionId พาธทรานสคริปต์ และค่าใช้จ่ายถ้ามี)
การมองเห็นเซสชันแบบ Sandbox¶
เซสชันที่เป็น sandboxed สามารถใช้เครื่องมือเซสชันได้ แต่ค่าเริ่มต้นจะเห็นเฉพาะเซสชันที่ตน spawn ผ่าน sessions_spawn เท่านั้น
คอนฟิก:
{
agents: {
defaults: {
sandbox: {
// default: "spawned"
sessionToolsVisibility: "spawned", // or "all"
},
},
},
}