Fundamentals
วงรอบเอเจนต์
ลูปเอเจนต์คือการทำงานต่อเซสชันแบบอนุกรมที่เปลี่ยนข้อความให้เป็น การดำเนินการและการตอบกลับ ได้แก่ การรับข้อมูล การประกอบบริบท การอนุมานของโมเดล การเรียกใช้เครื่องมือ การสตรีม และการคงข้อมูล
จุดเริ่มต้น
- Gateway RPC:
agentและagent.wait - CLI:
openclaw agent
ลำดับการทำงาน
agentRPC ตรวจสอบพารามิเตอร์ แก้ไขเซสชัน (sessionKey/sessionId) คงข้อมูลเมตาของเซสชัน และส่งคืน{ runId, acceptedAt }ทันทีagentCommandดำเนินรอบการทำงาน: แก้ไขค่าเริ่มต้นของโมเดล + การคิด/ความละเอียด/การติดตาม โหลดสแนปช็อต Skills เรียกrunEmbeddedAgentและส่งเหตุการณ์สำรอง สิ้นสุดวงจรชีวิต/ข้อผิดพลาด หากลูปที่ฝังอยู่ยังไม่ได้ส่งเหตุการณ์ดังกล่าวrunEmbeddedAgent: จัดลำดับการทำงานแบบอนุกรมผ่านคิวต่อเซสชันและคิวส่วนกลาง แก้ไขโมเดล + โปรไฟล์การยืนยันตัวตน สร้างเซสชัน OpenClaw สมัครรับเหตุการณ์รันไทม์ สตรีมเดลตาของผู้ช่วย/เครื่องมือ บังคับใช้ระยะหมดเวลาของการทำงาน (ยกเลิกเมื่อหมดเวลา) และส่งคืนเพย์โหลดพร้อมข้อมูลเมตาการใช้งาน สำหรับรอบการทำงานของ Codex app-server ยังยกเลิกรอบที่ยอมรับแล้วด้วย หากหยุดสร้างความคืบหน้าของ app-server ก่อนเกิดเหตุการณ์สิ้นสุดsubscribeEmbeddedAgentSessionเชื่อมเหตุการณ์รันไทม์เข้ากับสตรีมagent: เหตุการณ์เครื่องมือไปยังstream: "tool"เดลตาของผู้ช่วยไปยังstream: "assistant"และเหตุการณ์วงจรชีวิตไปยังstream: "lifecycle"(phase: "start" | "end" | "error")agent.wait(waitForAgentRun) รอ สิ้นสุดวงจรชีวิต/ข้อผิดพลาด บนrunIdและส่งคืน{ status: ok|error|timeout, startedAt, endedAt, error? }
การเข้าคิวและภาวะพร้อมกัน
การทำงานจะถูกจัดลำดับแบบอนุกรมตามคีย์เซสชัน (เลนเซสชัน) และอาจผ่านเลนส่วนกลางด้วย เพื่อป้องกันสภาวะแข่งขันของเครื่องมือ/เซสชัน ช่องทางการรับส่งข้อความจะเลือกโหมดคิว (steer/followup/collect/interrupt) ที่ป้อนเข้าสู่ระบบเลนนี้ โปรดดู คิวคำสั่ง
การเขียนทรานสคริปต์ยังได้รับการป้องกันเพิ่มเติมด้วยล็อกการเขียนเซสชันบนไฟล์เซสชัน ล็อกนี้รับรู้กระบวนการและทำงานบนไฟล์ จึงตรวจจับผู้เขียนที่ข้ามคิวภายในกระบวนการหรือมาจากกระบวนการอื่นได้ โดยค่าเริ่มต้น ผู้เขียนจะรอได้สูงสุด 60 วินาที (แทนที่ด้วยตัวแปรสภาพแวดล้อม OPENCLAW_SESSION_WRITE_LOCK_ACQUIRE_TIMEOUT_MS) ก่อนรายงานว่าเซสชันไม่ว่าง
โดยค่าเริ่มต้น ล็อกการเขียนเซสชันไม่รองรับการกลับเข้าซ้ำ ตัวช่วยที่ตั้งใจซ้อนการขอล็อกเดียวกันโดยยังคงผู้เขียนเชิงตรรกะเพียงรายเดียวไว้ ต้องเลือกใช้ allowReentrant: true
การเตรียมเซสชันและพื้นที่ทำงาน
- พื้นที่ทำงานได้รับการแก้ไขและสร้างขึ้น การทำงานในแซนด์บ็อกซ์อาจเปลี่ยนเส้นทางไปยังรากพื้นที่ทำงานของแซนด์บ็อกซ์
- โหลด Skills (หรือนำกลับมาใช้จากสแนปช็อต) และแทรกลงในสภาพแวดล้อมและพรอมต์
- แก้ไขไฟล์บูตสแตรป/บริบทและแทรกลงในพรอมต์ระบบ
- ขอล็อกการเขียนเซสชันและเตรียมเป้าหมายทรานสคริปต์ของเซสชันก่อนเริ่มสตรีม เส้นทางที่เขียนทรานสคริปต์ใหม่ ทำ Compaction หรือตัดทอนในภายหลัง ต้องขอล็อกเดียวกันก่อนแก้ไขแถวทรานสคริปต์ใน SQLite
การประกอบพรอมต์
พรอมต์ระบบสร้างขึ้นจากพรอมต์พื้นฐานของ OpenClaw พรอมต์ Skills บริบทบูตสแตรป และค่าที่แทนที่สำหรับแต่ละการทำงาน โดยบังคับใช้ขีดจำกัดเฉพาะโมเดลและโทเค็นสำรองสำหรับ Compaction โปรดดู พรอมต์ระบบ สำหรับสิ่งที่โมเดลมองเห็น
ฮุก
OpenClaw มีระบบฮุกสองระบบ:
- ฮุกภายใน (ฮุก Gateway): สคริปต์ที่ขับเคลื่อนด้วยเหตุการณ์สำหรับคำสั่งและเหตุการณ์วงจรชีวิต
- ฮุก Plugin: จุดขยายภายในวงจรชีวิตของเอเจนต์/เครื่องมือและไปป์ไลน์ Gateway
ฮุกภายใน (ฮุก Gateway)
agent:bootstrap: ทำงานขณะสร้างไฟล์บูตสแตรปก่อนพรอมต์ระบบเสร็จสมบูรณ์ ใช้เพื่อเพิ่มหรือลบไฟล์บริบทบูตสแตรป- ฮุกคำสั่ง:
/new,/reset,/stopและเหตุการณ์คำสั่งอื่น ๆ (ดูเอกสารฮุก)
โปรดดู ฮุก สำหรับการตั้งค่าและตัวอย่าง
ฮุก Plugin
ฮุกเหล่านี้ทำงานภายในลูปเอเจนต์หรือไปป์ไลน์ Gateway:
| ฮุก | ทำงาน |
|---|---|
before_model_resolve |
ก่อนเซสชัน (ไม่มี messages) เพื่อแทนที่ผู้ให้บริการ/โมเดลอย่างกำหนดแน่นอนก่อนการแก้ไข |
before_prompt_build |
หลังโหลดเซสชัน (พร้อม messages) เพื่อแทรก prependContext, systemPrompt, prependSystemContext หรือ appendSystemContext ก่อนส่ง ใช้ prependContext สำหรับข้อความแบบไดนามิกต่อรอบ และใช้ฟิลด์บริบทระบบสำหรับคำแนะนำที่เสถียรซึ่งควรอยู่ในพื้นที่พรอมต์ระบบ |
before_agent_reply |
หลังการดำเนินการแบบอินไลน์ ก่อนเรียก LLM ช่วยให้ Plugin รับช่วงรอบการทำงานและส่งคืนคำตอบสังเคราะห์หรือระงับคำตอบทั้งหมดได้ |
agent_end |
หลังเสร็จสิ้น พร้อมรายการข้อความสุดท้ายและข้อมูลเมตาการทำงาน |
before_compaction / after_compaction |
สังเกตหรือใส่คำอธิบายประกอบวงจร Compaction |
before_tool_call / after_tool_call |
สกัดกั้นพารามิเตอร์/ผลลัพธ์ของเครื่องมือ |
before_install |
หลังนโยบายการติดตั้งของผู้ปฏิบัติงานทำงาน บนวัสดุการติดตั้ง Skills/Plugin ที่จัดเตรียมไว้ เมื่อโหลดฮุก Plugin ในกระบวนการปัจจุบันแล้ว |
tool_result_persist |
แปลงผลลัพธ์ของเครื่องมือแบบซิงโครนัสก่อนเขียนลงในทรานสคริปต์เซสชันที่ OpenClaw เป็นเจ้าของ |
message_received / message_sending / message_sent |
ฮุกข้อความขาเข้าและขาออก |
session_start / session_end |
ขอบเขตวงจรชีวิตของเซสชัน |
gateway_start / gateway_stop |
เหตุการณ์วงจรชีวิตของ Gateway |
กฎการตัดสินใจของฮุกสำหรับตัวป้องกันขาออก/เครื่องมือ:
before_tool_call:{ block: true }เป็นผลลัพธ์สิ้นสุดและหยุดตัวจัดการที่มีลำดับความสำคัญต่ำกว่า{ block: false }ไม่ดำเนินการใด ๆ และไม่ล้างการบล็อกก่อนหน้าbefore_install: มีความหมายด้านการสิ้นสุด/ไม่ดำเนินการเช่นเดียวกับด้านบน ใช้security.installPolicyไม่ใช่before_installสำหรับการตัดสินใจอนุญาต/บล็อกการติดตั้งที่ผู้ปฏิบัติงานเป็นเจ้าของ ซึ่งต้องครอบคลุมเส้นทางการติดตั้งและอัปเดตผ่าน CLImessage_sending:{ cancel: true }เป็นผลลัพธ์สิ้นสุดและหยุดตัวจัดการที่มีลำดับความสำคัญต่ำกว่า{ cancel: false }ไม่ดำเนินการใด ๆ และไม่ล้างการยกเลิกก่อนหน้า
โปรดดู ฮุก Plugin สำหรับ API ของฮุกและรายละเอียดการลงทะเบียน
ฮาร์เนสสามารถปรับใช้ฮุกเหล่านี้ได้ ฮาร์เนส Codex app-server ใช้ฮุก Plugin ของ OpenClaw เป็นสัญญาความเข้ากันได้สำหรับพื้นผิวที่ทำสำเนาตามเอกสาร ส่วนฮุกเนทีฟของ Codex เป็นกลไก Codex ระดับต่ำที่แยกต่างหาก
การสตรีม
- เดลตาของผู้ช่วยสตรีมจากรันไทม์เอเจนต์เป็นเหตุการณ์
assistant - การสตรีมแบบบล็อกสามารถส่งคำตอบบางส่วนบน
text_endหรือmessage_end - การสตรีมกระบวนการให้เหตุผลอาจเป็นสตรีมแยกต่างหากหรือเป็นคำตอบแบบบล็อก
- โปรดดู การสตรีม สำหรับลักษณะการแบ่งส่วนและคำตอบแบบบล็อก
การเรียกใช้เครื่องมือ
- เหตุการณ์เริ่มต้น/อัปเดต/สิ้นสุดของเครื่องมือจะถูกส่งบนสตรีม
tool - ผลลัพธ์ของเครื่องมือจะได้รับการปรับให้ปลอดภัยในด้านขนาดและเพย์โหลดรูปภาพก่อนบันทึกล็อก/ส่งเหตุการณ์
- มีการติดตามการส่งด้วยเครื่องมือรับส่งข้อความเพื่อระงับการยืนยันซ้ำจากผู้ช่วย
การจัดรูปแบบคำตอบ
เพย์โหลดสุดท้ายประกอบขึ้นจากข้อความของผู้ช่วย (รวมกระบวนการให้เหตุผลที่เลือกเปิดใช้ได้) สรุปเครื่องมือแบบอินไลน์ (เมื่อเปิดโหมดละเอียดและได้รับอนุญาต) และข้อความข้อผิดพลาดของผู้ช่วยเมื่อโมเดลเกิดข้อผิดพลาด
- โทเค็นเงียบที่ตรงกันทุกประการ
NO_REPLYจะถูกกรองออกจากเพย์โหลดขาออก - รายการซ้ำจากเครื่องมือรับส่งข้อความจะถูกลบออกจากรายการเพย์โหลดสุดท้าย
- หากไม่มีเพย์โหลดที่แสดงผลได้เหลืออยู่และเครื่องมือเกิดข้อผิดพลาด ระบบจะส่งคำตอบข้อผิดพลาดของเครื่องมือสำรอง เว้นแต่เครื่องมือรับส่งข้อความได้ส่งคำตอบที่ผู้ใช้มองเห็นแล้ว
Compaction และการลองใหม่
Compaction อัตโนมัติจะส่งเหตุการณ์สตรีม compaction และสามารถกระตุ้นการลองใหม่ เมื่อมีการลองใหม่ บัฟเฟอร์ในหน่วยความจำและสรุปเครื่องมือจะถูกรีเซ็ตเพื่อหลีกเลี่ยงผลลัพธ์ซ้ำ โปรดดู Compaction
สตรีมเหตุการณ์
lifecycle: ส่งโดยsubscribeEmbeddedAgentSession(และส่งเป็นเหตุการณ์สำรองโดยagentCommand)assistant: เดลตาที่สตรีมจากรันไทม์เอเจนต์tool: เหตุการณ์เครื่องมือที่สตรีมจากรันไทม์เอเจนต์
Gateway ฉายเหตุการณ์วงจรชีวิตและเหตุการณ์เริ่มต้น/สิ้นสุดของเครื่องมือไปยัง บัญชีแยกประเภทการตรวจสอบ ที่มีขอบเขตจำกัดและเก็บเฉพาะข้อมูลเมตา การฉายนี้บันทึกที่มาและ รหัสผลลัพธ์โดยไม่คัดลอกพรอมต์ ข้อความ อาร์กิวเมนต์ของเครื่องมือ ผลลัพธ์ของเครื่องมือ หรือข้อผิดพลาดดิบออกจากเส้นทางทรานสคริปต์/รันไทม์
การจัดการช่องทางแชต
เดลตาของผู้ช่วยจะถูกบัฟเฟอร์ลงในข้อความแชต delta ระบบจะส่งแชต final เมื่อเกิด สิ้นสุดวงจรชีวิต/ข้อผิดพลาด
การหมดเวลา
| การหมดเวลา | ค่าเริ่มต้น | หมายเหตุ |
|---|---|---|
agent.wait |
30s | รอเท่านั้น; พารามิเตอร์ timeoutMs จะเขียนทับค่านี้ โดยจะไม่หยุดการทำงานเบื้องหลัง |
รันไทม์ของเอเจนต์ (agents.defaults.timeoutSeconds) |
172800s (48h) | บังคับใช้โดยตัวจับเวลายกเลิกของ runEmbeddedAgent ตั้งค่า 0 เพื่อให้งบเวลาการทำงานไม่จำกัด; ตัวเฝ้าระวังความพร้อมทำงานของสตรีมโมเดลยังคงมีผล |
| ตัวเฝ้าระวังกรณีแบ็กเอนด์ CLI ไม่มีเอาต์พุต | คำนวณใหม่สำหรับการทำงานของ CLI แต่ละครั้งที่เริ่มใหม่/ทำต่อ | แยกจากรันไทม์ของเอเจนต์ กำหนดค่า agents.defaults.cliBackends.<id>.reliability.watchdog.{fresh,resume} สำหรับ CLI ที่อาจไม่มีเอาต์พุตระหว่างทำงาน งานเบื้องหลังภายใน CLI ใช้โปรเซสย่อยร่วมกับโปรเซสหลักและไม่สามารถทำงานต่อหลังจากการหมดเวลาโดยรวมของเอเจนต์ |
| รอบการทำงานของเอเจนต์แบบแยกของ Cron | ควบคุมโดย Cron | ตัวกำหนดตารางเวลาเริ่มตัวจับเวลาของตนเองเมื่อการดำเนินการเริ่มขึ้น ยกเลิกการทำงานเมื่อถึงเส้นตายที่กำหนด จากนั้นดำเนินการล้างข้อมูลแบบมีขอบเขตก่อนบันทึกการหมดเวลา เพื่อไม่ให้เซสชันลูกที่ค้างทำให้เลนติดขัดต่อไป |
| การหมดเวลาเมื่อโมเดลไม่มีการตอบสนอง | คลาวด์ 120s; โฮสต์เอง 300s | OpenClaw ยกเลิกคำขอโมเดลเมื่อไม่มีส่วนข้อมูลการตอบกลับมาถึงก่อนสิ้นสุดช่วงเวลาที่ไม่มีการตอบสนอง models.providers.<id>.timeoutSeconds ขยายเวลาของตัวเฝ้าระวังนี้สำหรับผู้ให้บริการภายในเครื่อง/ที่โฮสต์เองซึ่งทำงานช้า แต่ยังถูกจำกัดด้วย agents.defaults.timeoutSeconds แบบมีขอบเขตที่ต่ำกว่าหรือการหมดเวลาเฉพาะการทำงาน เนื่องจากค่าเหล่านั้นควบคุมการทำงานทั้งหมดของเอเจนต์ งบเวลาการทำงานแบบไม่จำกัดยังคงใช้ตัวเฝ้าระวังตามประเภทผู้ให้บริการ การทำงานของโมเดลคลาวด์ที่ Cron ทริกเกอร์โดยไม่ได้กำหนดการหมดเวลาของโมเดล/เอเจนต์อย่างชัดเจนจะใช้ค่าเริ่มต้นเดียวกัน; เมื่อกำหนดการหมดเวลาของ Cron อย่างชัดเจน การหยุดชะงักของสตรีมโมเดลคลาวด์จะถูกจำกัดไว้ที่ 60s เพื่อให้โมเดลสำรองที่กำหนดค่าไว้ยังสามารถทำงานก่อนถึงเส้นตายภายนอกของ Cron การทำงานที่ Cron ทริกเกอร์บนปลายทางภายในเครื่องจริง (loopback/baseUrl ส่วนตัว) ยังคงสามารถปิดใช้การหมดเวลาเมื่อไม่มีการตอบสนองภายในเครื่องได้; ผู้ให้บริการที่โฮสต์เองบน baseUrl ของเครือข่ายจะใช้ตัวเฝ้าระวังโดยปริยายที่ 300s เมื่อกำหนดการหมดเวลาของ Cron อย่างชัดเจน การหยุดชะงักภายในเครื่อง/ที่โฮสต์เองจะถูกจำกัดไว้ตามการหมดเวลานั้น ตั้งค่า models.providers.<id>.timeoutSeconds สำหรับผู้ให้บริการภายในเครื่องที่ทำงานช้า |
| การหมดเวลาของคำขอ HTTP ของผู้ให้บริการ | models.providers.<id>.timeoutSeconds |
ครอบคลุมการเชื่อมต่อ ส่วนหัว เนื้อหา การหมดเวลาของคำขอ SDK การจัดการการยกเลิกของ guarded-fetch และตัวเฝ้าระวังเมื่อสตรีมโมเดลของผู้ให้บริการนั้นไม่มีการตอบสนอง ใช้สำหรับผู้ให้บริการภายในเครื่อง/ที่โฮสต์เองซึ่งทำงานช้า (เช่น Ollama) ก่อนเพิ่มการหมดเวลารันไทม์ทั้งหมดของเอเจนต์; กำหนดให้การหมดเวลาของเอเจนต์/รันไทม์มีค่าอย่างน้อยเท่ากันเมื่อคำขอโมเดลต้องทำงานนานกว่า |
การวินิจฉัยเซสชันที่ค้าง
เมื่อเปิดใช้การวินิจฉัย เกณฑ์สองนาทีในตัวจะจำแนกเซสชัน processing ที่ทำงานนานโดยไม่พบความคืบหน้าของการตอบกลับ เครื่องมือ สถานะ บล็อก หรือ ACP:
- การทำงานแบบฝัง การเรียกโมเดล และการเรียกเครื่องมือที่ยังทำงานอยู่จะรายงานเป็น
session.long_runningการเรียกโมเดลที่อยู่ภายใต้การควบคุมและไม่มีเอาต์พุตจะยังคงเป็นsession.long_runningจนถึงเกณฑ์การยกเลิก เพื่อไม่ให้ผู้ให้บริการที่ทำงานช้าหรือไม่ใช้สตรีมถูกระบุว่าหยุดชะงักเร็วเกินไป - งานที่ยังทำงานอยู่แต่ไม่มีความคืบหน้าล่าสุดจะรายงานเป็น
session.stalledการเรียกโมเดลที่อยู่ภายใต้การควบคุมจะเปลี่ยนเป็นsession.stalledเมื่อถึงหรือผ่านเกณฑ์การยกเลิก; กิจกรรมโมเดล/เครื่องมือที่ค้างและไม่มีเจ้าของจะไม่ถูกซ่อนไว้ว่าเป็นงานที่ทำงานยาวนาน session.stuckสงวนไว้สำหรับข้อมูลการจัดการเซสชันที่ค้างซึ่งกู้คืนได้ รวมถึงเซสชันในคิวที่ไม่มีการทำงานแต่ยังมีกิจกรรมโมเดล/เครื่องมือที่ค้างและไม่มีเจ้าของ
เกณฑ์การยกเลิกมีค่าอย่างน้อย 5 นาทีและเป็น 3 เท่าของเกณฑ์การเตือน การจัดการเซสชันที่ค้างจะปล่อยเลนของเซสชันที่ได้รับผลกระทบทันทีหลังผ่านเกณฑ์การกู้คืน; การทำงานแบบฝังที่หยุดชะงักจะถูกยกเลิกและระบายออกหลังจากผ่านเกณฑ์การยกเลิกเท่านั้น เพื่อให้งานในคิวกลับมาทำงานต่อได้โดยไม่ตัดการทำงานที่เพียงแค่ช้า การกู้คืนจะส่งผลลัพธ์แบบมีโครงสร้างสำหรับสถานะที่ร้องขอ/เสร็จสมบูรณ์; สถานะการวินิจฉัยจะถูกทำเครื่องหมายว่าไม่มีการทำงานก็ต่อเมื่อรุ่นการประมวลผลเดียวกันยังเป็นรุ่นปัจจุบัน และการวินิจฉัย session.stuck ซ้ำจะเพิ่มช่วงเว้นระยะขณะที่เซสชันยังคงไม่เปลี่ยนแปลง
จุดที่การทำงานอาจสิ้นสุดก่อนกำหนด
- เอเจนต์หมดเวลา (ยกเลิก)
- AbortSignal (ยกเลิก)
- Gateway ตัดการเชื่อมต่อหรือ RPC หมดเวลา
agent.waitหมดเวลา (รอเท่านั้น ไม่หยุดเอเจนต์)
ที่เกี่ยวข้อง
- เครื่องมือ - เครื่องมือที่เอเจนต์ใช้ได้
- ฮุก - สคริปต์ที่ขับเคลื่อนด้วยเหตุการณ์ซึ่งทริกเกอร์โดยเหตุการณ์ในวงจรชีวิตของเอเจนต์
- Compaction - วิธีสรุปบทสนทนาที่ยาว
- การอนุมัติการดำเนินการ - ด่านการอนุมัติสำหรับคำสั่งเชลล์
- การคิด - การกำหนดค่าระดับการคิด/การให้เหตุผล