ลูปเอเจนต์ (OpenClaw)¶
Agentic loop คือการรันแบบ “จริง” เต็มรูปแบบของเอเจนต์: การรับเข้า → การประกอบบริบท → การอนุมานของโมเดล → การรันเครื่องมือ → การสตรีมคำตอบ → การบันทึกถาวร นี่คือเส้นทางหลักที่เปลี่ยนข้อความให้กลายเป็นการกระทำ และคำตอบสุดท้าย โดยยังคงทำให้สถานะของเซสชันสอดคล้องกัน 12. นี่คือเส้นทางหลักที่เชื่อถือได้ซึ่งเปลี่ยนข้อความ ให้เป็นการกระทำและคำตอบสุดท้าย พร้อมทั้งรักษาสถานะเซสชันให้สอดคล้องกัน
ใน OpenClaw หนึ่งลูปคือการรันแบบลำดับเดียวต่อหนึ่งเซสชัน ซึ่งจะปล่อยอีเวนต์ของวงจรชีวิตและสตรีม ขณะที่โมเดลคิด เรียกใช้เครื่องมือ และสตรีมเอาต์พุต เอกสารนี้อธิบายว่าลูปที่แท้จริงนั้นถูกเชื่อมต่อแบบครบวงจรอย่างไร 13. เอกสารนี้อธิบายว่าลูปที่แท้จริงนั้น เชื่อมต่อแบบ end-to-end อย่างไร
จุดเริ่มต้น¶
- Gateway RPC:
agentและagent.wait. - CLI: คำสั่ง
agent.
การทำงาน (ภาพรวมระดับสูง)¶
agentRPC ตรวจสอบพารามิเตอร์ แก้ไขเซสชัน (sessionKey/sessionId) บันทึกเมตาดาตาของเซสชัน และส่งกลับ{ runId, acceptedAt }ทันทีagentCommandรันเอเจนต์: - แก้ไขโมเดล + ค่าเริ่มต้นของ thinking/verbose - โหลดสแนปช็อตของ Skills - เรียกrunEmbeddedPiAgent(pi-agent-core runtime) - ปล่อย lifecycle end/error หากลูปที่ฝังอยู่ไม่ปล่อยอีเวนต์ดังกล่าวrunEmbeddedPiAgent: - จัดลำดับการรันผ่านคิวต่อเซสชัน + คิวส่วนกลาง - แก้ไขโมเดล + โปรไฟล์การยืนยันตัวตน และสร้าง pi session - สมัครรับอีเวนต์จาก pi และสตรีมเดลตาของ assistant/เครื่องมือ - บังคับใช้ timeout -> ยกเลิกการรันเมื่อเกินเวลา - ส่งคืนเพย์โหลด + เมตาดาตาการใช้งานsubscribeEmbeddedPiSessionเชื่อมอีเวนต์ของ pi-agent-core เข้ากับสตรีมagentของ OpenClaw: - อีเวนต์ของเครื่องมือ =>stream: "tool"- เดลตาของ assistant =>stream: "assistant"- อีเวนต์ของวงจรชีวิต =>stream: "lifecycle"(phase: "start" | "end" | "error")agent.waitใช้waitForAgentJob: - รอ lifecycle end/error สำหรับrunId- ส่งคืน{ status: ok|error|timeout, startedAt, endedAt, error? }
การจัดคิว + การทำงานพร้อมกัน¶
- การรันจะถูกจัดลำดับต่อ session key (session lane) และอาจผ่าน lane ส่วนกลางเพิ่มเติม
- วิธีนี้ป้องกันการชนกันของเครื่องมือ/เซสชัน และทำให้ประวัติเซสชันสอดคล้องกัน
- ช่องทางการส่งข้อความสามารถเลือกโหมดคิว (collect/steer/followup) ที่ป้อนเข้าสู่ระบบ lane นี้ ดู Command Queue 14. ดูที่ Command Queue
Session + workspace preparation¶
- แก้ไขและสร้าง Workspace; การรันแบบ sandbox อาจเปลี่ยนเส้นทางไปยังราก Workspace ของ sandbox
- โหลด Skills (หรือใช้ซ้ำจากสแนปช็อต) และฉีดเข้าไปใน env และพรอมป์ต์
- แก้ไขไฟล์ bootstrap/บริบท และฉีดเข้าไปในรายงาน system prompt
- ได้รับล็อกการเขียนของเซสชัน; เปิดและเตรียม
SessionManagerก่อนเริ่มสตรีม
Prompt assembly + system prompt¶
- system prompt ถูกสร้างจาก base prompt ของ OpenClaw, prompt ของ Skills, บริบท bootstrap และ override ต่อการรัน
- บังคับใช้ขีดจำกัดเฉพาะของโมเดลและโทเคนสำรองสำหรับการบีบอัด
- ดู System prompt สำหรับสิ่งที่โมเดลเห็น
Hook points (where you can intercept)¶
OpenClaw มีระบบ hook สองแบบ:
- Internal hooks (Gateway hooks): สคริปต์แบบขับเคลื่อนด้วยอีเวนต์สำหรับคำสั่งและอีเวนต์ของวงจรชีวิต
- Plugin hooks: จุดขยายภายในวงจรชีวิตของเอเจนต์/เครื่องมือและไปป์ไลน์ของ Gateway
Internal hooks (Gateway hooks)¶
agent:bootstrap: รันขณะสร้างไฟล์ bootstrap ก่อนที่ system prompt จะถูกสรุปขั้นสุดท้าย ใช้เพื่อเพิ่ม/ลบบริบท bootstrap 15. ใช้สิ่งนี้เพื่อเพิ่ม/ลบไฟล์ bootstrap context- Command hooks:
/new,/reset,/stop, และอีเวนต์คำสั่งอื่นๆ (ดูเอกสาร Hooks)
ดู Hooks สำหรับการตั้งค่าและตัวอย่าง
Plugin hooks (agent + gateway lifecycle)¶
สิ่งเหล่านี้รันภายใน agent loop หรือไปป์ไลน์ของ Gateway:
before_agent_start: ฉีดบริบทหรือ override system prompt ก่อนเริ่มการรันagent_end: ตรวจสอบรายการข้อความสุดท้ายและเมตาดาตาการรันหลังเสร็จสิ้นbefore_compaction/after_compaction: สังเกตหรือใส่คำอธิบายรอบการบีบอัดbefore_tool_call/after_tool_call: ดักจับพารามิเตอร์/ผลลัพธ์ของเครื่องมือtool_result_persist: แปลงผลลัพธ์ของเครื่องมือแบบซิงโครนัสก่อนเขียนลงในทรานสคริปต์ของเซสชันmessage_received/message_sending/message_sent: hook ข้อความขาเข้า + ขาออกsession_start/session_end: ขอบเขตวงจรชีวิตของเซสชันgateway_start/gateway_stop: อีเวนต์วงจรชีวิตของ Gateway
ดู Plugins สำหรับ API ของ hook และรายละเอียดการลงทะเบียน
Streaming + partial replies¶
- เดลตาของ assistant ถูกสตรีมจาก pi-agent-core และปล่อยเป็นอีเวนต์
assistant - สตรีมแบบบล็อกสามารถปล่อยคำตอบบางส่วนได้บน
text_endหรือmessage_end - การสตรีมเหตุผลสามารถปล่อยเป็นสตรีมแยกหรือเป็นบล็อกของคำตอบ
- ดู Streaming สำหรับพฤติกรรมการแบ่งชิ้นและบล็อกคำตอบ
Tool execution + messaging tools¶
- อีเวนต์เริ่ม/อัปเดต/จบของเครื่องมือถูกปล่อยบนสตรีม
tool - ผลลัพธ์ของเครื่องมือถูกทำความสะอาดด้านขนาดและเพย์โหลดรูปภาพก่อนบันทึก/ปล่อย
- การส่งผ่านเครื่องมือส่งข้อความถูกติดตามเพื่อระงับการยืนยันซ้ำจาก assistant
Reply shaping + suppression¶
- เพย์โหลดสุดท้ายถูกประกอบจาก:
- ข้อความของ assistant (และเหตุผลเพิ่มเติมถ้ามี)
- สรุปเครื่องมือแบบอินไลน์ (เมื่อ verbose + อนุญาต)
- ข้อความข้อผิดพลาดของ assistant เมื่อโมเดลเกิดข้อผิดพลาด
NO_REPLYถูกปฏิบัติเป็นโทเคนเงียบและถูกกรองออกจากเพย์โหลดขาออก- รายการเพย์โหลดสุดท้ายจะลบรายการซ้ำจากเครื่องมือส่งข้อความ
- หากไม่เหลือเพย์โหลดที่แสดงผลได้และเครื่องมือเกิดข้อผิดพลาด จะปล่อยคำตอบสำรองของข้อผิดพลาดจากเครื่องมือ (ยกเว้นกรณีที่เครื่องมือส่งข้อความได้ส่งคำตอบที่ผู้ใช้มองเห็นแล้ว)
Compaction + retries¶
- การบีบอัดอัตโนมัติปล่อยอีเวนต์สตรีม
compactionและอาจกระตุ้นให้เกิดการลองใหม่ - เมื่อมีการลองใหม่ บัฟเฟอร์ในหน่วยความจำและสรุปเครื่องมือจะถูกรีเซ็ตเพื่อหลีกเลี่ยงเอาต์พุตซ้ำ
- ดู Compaction สำหรับไปป์ไลน์การบีบอัด
Event streams (today)¶
lifecycle: ปล่อยโดยsubscribeEmbeddedPiSession(และเป็น fallback โดยagentCommand)assistant: เดลตาที่สตรีมจาก pi-agent-coretool: อีเวนต์ของเครื่องมือที่สตรีมจาก pi-agent-core
Chat channel handling¶
- เดลตาของ assistant ถูกบัฟเฟอร์เป็นข้อความแชต
delta - แชต
finalจะถูกปล่อยเมื่อเกิด lifecycle end/error
Timeouts¶
- ค่าเริ่มต้นของ
agent.wait: 30 วินาที (เฉพาะการรอ) พารามิเตอร์timeoutMsใช้ override ได้ 16. พารามิเตอร์timeoutMsจะถูกใช้แทนค่าเดิม - Agent runtime: ค่าเริ่มต้น
agents.defaults.timeoutSeconds600 วินาที; บังคับใช้ในตัวจับเวลา abort ของrunEmbeddedPiAgent
Where things can end early¶
- Agent timeout (abort)
- AbortSignal (ยกเลิก)
- การตัดการเชื่อมต่อของ Gateway หรือ RPC timeout
agent.waittimeout (เฉพาะการรอ ไม่ได้หยุดเอเจนต์)