This document provides a detailed breakdown of the complete System Prompt structure sent by OpenClaw Agent to the LLM.
=> Translate: "เอกสารนี้อธิบายรายละเอียดของโครงสร้าง System Prompt ที่สมบูรณ์ซึ่งถูกส่งโดย OpenClaw Agent ไปยัง LLM"
Then empty blockquotes with <p></p> - keep as is.
Then:
Version:
=> "เวอร์ชัน:"
Then empty, then:
v2.1
=> keep as v2.1
Then empty, then:
Update Time:
=> "เวลาที่อัปเดต:"
Then empty, then:
2026-03-05
=> keep as is
Now headings: "## Overall Architecture Diagram" => "## แผนภาพสถาปัตยกรรมโดยรวม"
Then payload block - keep as is.
"## Quick Navigation (TL;DR)" => "## การนำทางด่วน (TL;DR)"
Then "Must-read for Beginners:" => "สิ่งที่มือใหม่ต้องอ่าน:"
Then list items: translate the list items but keep numbers.
- Layer 7 (Workspace Files) - Configuration files you can edit directly. => 1. เลเยอร์ 7 (Workspace Files) - ไฟล์คอนฟิกที่คุณสามารถแก้ไขได้โดยตรง
- Layer 8 (Bootstrap Hook) - Where you can write scripts to dynamically inject content. => 2. เลเยอร์ 8 (Bootstrap Hook) - ที่ที่คุณสามารถเขียนสคริปต์เพื่อแทรกเนื้อหาแบบไดนามิก
- Other layers are automatically generated by the framework; just understand them. => 3. เลเยอร์อื่นๆ ถูกสร้างขึ้นโดยอัตโนมัติจากเฟรมเวิร์ก เพียงแค่ทำความเข้าใจ
Then "Common Needs:" => "ความต้องการทั่วไป:"
Then bullet list: translate each.
- Want to define Agent identity? → Edit IDENTITY.md in Layer 7. => - ต้องการกำหนดเอกลักษณ์ของ Agent? → แก้ไข IDENTITY.md ในเลเยอร์ 7
- Want to add project documentation? → Use the bootstrap-extra-files Hook in Layer 8. => - ต้องการเพิ่มเอกสารโครงการ? → ใช้ bootstrap-extra-files Hook ในเลเยอร์ 8
- Want to inject real-time context? → Use the before_prompt_build Hook in Layer 8. => - ต้องการแทรกบริบทแบบเรียลไทม์? → ใช้ before_prompt_build Hook ในเลเยอร์ 8
- Want to control file size? → Adjust the bootstrapMaxChars configuration. => - ต้องการควบคุมขนาดไฟล์? → ปรับการกำหนดค่า bootstrapMaxChars
Then "## Layer 1: OpenClaw Framework Core" => "## เลเยอร์ 1: แกนหลักของ OpenClaw Framework"
"Analogy" => "การเปรียบเทียบ"
Blockquote: <blockquote><p>Like the "Instructions for Use" section of an operation manual—telling the LLM who you are, what you can do, and how you should respond.</p></blockquote>
=> <blockquote><p>เหมือนกับส่วน "คำแนะนำในการใช้งาน" ของคู่มือการใช้งาน—บอก LLM ว่าคุณคือใคร ทำอะไรได้บ้าง และควรตอบสนองอย่างไร</p></blockquote>
"Components" => "ส่วนประกอบ"
payload block id="blk_1" - keep
"Practical Example" => "ตัวอย่างการใช้งาน"
Then the code-like text: "You are running as a "Creative Partner," an AI content creation expert Agent." etc. This is not in a code block, but it's a paragraph. Translate it. Also the tool calling specification and safety boundaries - these are part of the practical example. Translate all natural language.
Current Time: 2026-03-05 14:37:00 CST => เวลาปัจจุบัน: 2026-03-05 14:37:00 CST (keep time format)
=== Tool Calling Specification === => === ข้อกำหนดการเรียกใช้เครื่องมือ ===
- Use XML-style tool calling format. => - ใช้รูปแบบการเรียกใช้เครื่องมือแบบ XML
- Each tool call must include a unique tool_call_id. => - การเรียกใช้เครื่องมือแต่ละครั้งต้องมี tool_call_id ที่ไม่ซ้ำกัน
- Tool results are returned via <tool_result> tags. => - ผลลัพธ์ของเครื่องมือจะถูกส่งกลับผ่านแท็ก <tool_result>
- Consider AbortSignal when executing tools to support cancellation. => - พิจารณา AbortSignal เมื่อเรียกใช้เครื่องมือเพื่อรองรับการยกเลิก
=== Safety Boundaries === => === ขอบเขตความปลอดภัย ===
- Strictly prohibited from executing destructive operations (rm -rf, formatting, etc.). => - ห้ามดำเนินการทำลายล้างโดยเด็ดขาด (rm -rf, ฟอร์แมต ฯลฯ)
- Sensitive user information must be encrypted when handled. => - ข้อมูลผู้ใช้ที่ละเอียดอ่อนต้องถูกเข้ารหัสเมื่อมีการจัดการ
- Prohibited from sending messages to unauthorized channels. => - ห้ามส่งข้อความไปยังช่องทางที่ไม่ได้รับอนุญาต
"Design Trade-offs" => "การแลกเปลี่ยนในการออกแบบ"
Why design it this way? => ทำไมถึงออกแบบเช่นนี้?
- Trade-off: Flexibility vs. Consistency => - การแลกเปลี่ยน: ความยืดหยุ่น vs ความสอดคล้อง
- Decision: Unified generation at the framework layer ensures consistent basic behavior for all Agents. => - การตัดสินใจ: การสร้างแบบรวมศูนย์ที่เลเยอร์เฟรมเวิร์กช่วยให้พฤติกรรมพื้นฐานสอดคล้องกันสำหรับ Agent ทั้งหมด
- Benefits: Users don't need to repeat basic rules for every Agent. All Agents automatically gain new capabilities when the framework upgrades. Reduces the risk of configuration errors. => - ข้อดี: ผู้ใช้ไม่ต้องทำซ้ำกฎพื้นฐานสำหรับทุก Agent Agent ทั้งหมดจะได้รับความสามารถใหม่โดยอัตโนมัติเมื่อเฟรมเวิร์กอัปเกรด ลดความเสี่ยงของข้อผิดพลาดในการกำหนดค่า
- Cost: Users cannot modify these core rules. Special behaviors must be implemented indirectly via Layer 7/8. => - ต้นทุน: ผู้ใช้ไม่สามารถแก้ไขกฎหลักเหล่านี้ได้ พฤติกรรมพิเศษต้องถูกนำไปใช้ทางอ้อมผ่านเลเยอร์ 7/8
Continue similarly for all sections. I'll produce the final translation in full.</think><blockquote>
<p>เอกสารนี้อธิบายรายละเอียดของโครงสร้าง System Prompt ที่สมบูรณ์ซึ่งถูกส่งโดย OpenClaw Agent ไปยัง LLM</p>
</blockquote>
เวอร์ชัน:
v2.1
เวลาที่อัปเดต:
2026-03-05
แผนภาพสถาปัตยกรรมโดยรวม

การนำทางด่วน (TL;DR)
สิ่งที่มือใหม่ต้องอ่าน:
- เลเยอร์ 7 (Workspace Files) - ไฟล์คอนฟิกที่คุณสามารถแก้ไขได้โดยตรง
- เลเยอร์ 8 (Bootstrap Hook) - ที่ที่คุณสามารถเขียนสคริปต์เพื่อแทรกเนื้อหาแบบไดนามิก
- เลเยอร์อื่นๆ ถูกสร้างขึ้นโดยอัตโนมัติจากเฟรมเวิร์ก เพียงแค่ทำความเข้าใจ
ความต้องการทั่วไป:
- ต้องการกำหนดเอกลักษณ์ของ Agent? → แก้ไข IDENTITY.md ในเลเยอร์ 7
- ต้องการเพิ่มเอกสารโครงการ? → ใช้ bootstrap-extra-files Hook ในเลเยอร์ 8
- ต้องการแทรกบริบทแบบเรียลไทม์? → ใช้ before_prompt_build Hook ในเลเยอร์ 8
- ต้องการควบคุมขนาดไฟล์? → ปรับการกำหนดค่า bootstrapMaxChars
เลเยอร์ 1: แกนหลักของ OpenClaw Framework
การเปรียบเทียบ
เหมือนกับส่วน "คำแนะนำในการใช้งาน" ของคู่มือการใช้งาน—บอก LLM ว่าคุณคือใคร ทำอะไรได้บ้าง และควรตอบสนองอย่างไร
ส่วนประกอบ

ตัวอย่างการใช้งาน
คุณกำลังทำงานในฐานะ "Creative Partner" ซึ่งเป็น Agent ผู้เชี่ยวชาญด้านการสร้างเนื้อหาด้วย AI
เวลาปัจจุบัน: 2026-03-05 14:37:00 CST
=== ข้อกำหนดการเรียกใช้เครื่องมือ ===
- ใช้รูปแบบการเรียกใช้เครื่องมือแบบ XML
- การเรียกใช้เครื่องมือแต่ละครั้งต้องมี tool_call_id ที่ไม่ซ้ำกัน
- ผลลัพธ์ของเครื่องมือจะถูกส่งกลับผ่านแท็ก <tool_result>
- พิจารณา AbortSignal เมื่อเรียกใช้เครื่องมือเพื่อรองรับการยกเลิก
=== ขอบเขตความปลอดภัย ===
- ห้ามดำเนินการทำลายล้างโดยเด็ดขาด (rm -rf, ฟอร์แมต ฯลฯ)
- ข้อมูลผู้ใช้ที่ละเอียดอ่อนต้องถูกเข้ารหัสเมื่อมีการจัดการ
- ห้ามส่งข้อความไปยังช่องทางที่ไม่ได้รับอนุญาต
การแลกเปลี่ยนในการออกแบบ
ทำไมถึงออกแบบเช่นนี้?
- การแลกเปลี่ยน: ความยืดหยุ่น vs ความสอดคล้อง
- การตัดสินใจ: การสร้างแบบรวมศูนย์ที่เลเยอร์เฟรมเวิร์กช่วยให้พฤติกรรมพื้นฐานสอดคล้องกันสำหรับ Agent ทั้งหมด
- ข้อดี: ผู้ใช้ไม่ต้องทำซ้ำกฎพื้นฐานสำหรับทุก Agent Agent ทั้งหมดจะได้รับความสามารถใหม่โดยอัตโนมัติเมื่อเฟรมเวิร์กอัปเกรด ลดความเสี่ยงของข้อผิดพลาดในการกำหนดค่า
- ต้นทุน: ผู้ใช้ไม่สามารถแก้ไขกฎหลักเหล่านี้ได้ พฤติกรรมพิเศษต้องถูกนำไปใช้ทางอ้อมผ่านเลเยอร์ 7/8
เลเยอร์ 2: คำจำกัดความของเครื่องมือ
การเปรียบเทียบ
เหมือนกับรายการเครื่องมือของมีดพกสวิส—บอก LLM ว่าคุณมีเครื่องมืออะไรบ้าง แต่ละชิ้นทำอะไร และวิธีการใช้งาน
ส่วนประกอบ

ตัวอย่างคำจำกัดความของเครื่องมือ
{
"name": "read",
"description": "อ่านเนื้อหาไฟล์ รองรับไฟล์ข้อความและรูปภาพ (jpg/png/gif/webp) รูปภาพจะถูกส่งเป็นไฟล์แนบ ข้อความที่ส่งออกถูกจำกัดที่ 2000 บรรทัดหรือ 50KB",
"parameters": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "เส้นทางไฟล์ (สัมพัทธ์หรือสัมบูรณ์)"
},
"offset": {
"type": "number",
"description": "หมายเลขบรรทัดเริ่มต้น (นับจาก 1)"
},
"limit": {
"type": "number",
"description": "จำนวนบรรทัดสูงสุดที่จะอ่าน"
}
},
"required": ["path"]
}
}
การแลกเปลี่ยนในการออกแบบ
ทำไมต้องใช้ JSON Schema?
- การแลกเปลี่ยน: ความยืดหยุ่น vs ความปลอดภัยของประเภทข้อมูล
- การตัดสินใจ: ใช้ JSON Schema ที่เข้มงวดเพื่อกำหนดพารามิเตอร์ของเครื่องมือ
- ข้อดี: LLM เข้าใจการใช้งานเครื่องมือได้แม่นยำยิ่งขึ้น เฟรมเวิร์กสามารถตรวจสอบพารามิเตอร์ก่อนเรียกใช้ สร้างเอกสารและคำจำกัดความของประเภทได้โดยอัตโนมัติ
- ต้นทุน: การเพิ่มเครื่องมือใหม่ต้องเขียน Schema ทั้งหมด ไม่สามารถรองรับโครงสร้างพารามิเตอร์แบบไดนามิกสมบูรณ์
เลเยอร์ 3: ทะเบียนทักษะ
การเปรียบเทียบ
เหมือนกับ "เมนูพิเศษ" ของร้านอาหาร—บอก LLM ว่ามี "สูตรอาหาร" แบบมืออาชีพใดบ้างที่สามารถเรียกใช้ได้
การแลกเปลี่ยนในการออกแบบ
ทำไมต้องใช้การสแกนไดเรกทอรีแทนการลงทะเบียนด้วยตนเอง?
- การแลกเปลี่ยน: ความยืดหยุ่น vs ต้นทุนการบำรุงรักษา
- การตัดสินใจ: สแกนไดเรกทอรี ~/development/openclaw/skills/ โดยอัตโนมัติ
- ข้อดี: การเพิ่ม Skill ใหม่只需วางไว้ในไดเรกทอรี ไม่จำเป็นต้องเปลี่ยนคอนฟิก Agent ทั้งหมดได้รับ Skill ใหม่โดยอัตโนมัติ ลดความเสี่ยงของข้อผิดพลาดในการกำหนดค่า
- ต้นทุน: ไม่สามารถควบคุมได้อย่างแม่นยำว่า Skill ใดบ้างที่พร้อมใช้งานสำหรับแต่ละ Agent Skill ทั้งหมดถูกแทรกเข้าไปใน System Prompt (เพิ่มการใช้โทเค็น)
ส่วนประกอบ

เลเยอร์ 4: นามแฝงของโมเดล
การเปรียบเทียบ
เหมือนกับ "ทางลัด"—กำหนดนามแฝงสั้นๆ ให้กับเส้นทางโมเดลที่ซับซ้อนเพื่อให้เรียกใช้ได้ง่าย
การแลกเปลี่ยนในการออกแบบ
ทำไมต้องมีนามแฝงของโมเดล?
- การแลกเปลี่ยน: ความยืดหยุ่น vs ความสามารถในการอ่าน
- การตัดสินใจ: อนุญาตให้ผู้ใช้กำหนดนามแฝงสั้นๆ สำหรับโมเดลที่ใช้งานบ่อย
- ข้อดี: ลดความซับซ้อนในการเรียกใช้โมเดล (glm-5 แทน zhipu/glm-5) รองรับการสลับระหว่าง Provider หลายตัว (นามแฝงเดียวกันสามารถแมปไปยัง Provider ต่างกัน) อำนวยความสะดวกในการทดสอบ A/B และการย้ายโมเดล
- ต้นทุน: ต้องดูแลไฟล์กำหนดค่านามแฝง อาจทำให้สับสน (นามแฝงเดียวกันอาจชี้ไปยังโมเดลต่างกันสำหรับ Agent ต่างกัน)
ส่วนประกอบ

ตัวอย่างการใช้งาน
ใน System Prompt นามแฝงของโมเดลจะแสดงเป็น:
Model Aliases
- GLM-5: zhipu/glm-5
- Opus 4.6: xiaowang886/claude-opus-4-6-thinking
- Sonnet 4.5: xiaowang886/claude-sonnet-4-5
LLM สามารถใช้ชื่อแฝงเพื่อสลับโมเดล: /model glm-5
เลเยอร์ 5: ข้อกำหนดของโปรโตคอล
การเปรียบเทียบ
เหมือนกับ "กฎจราจร"—กำหนดโปรโตคอลมาตรฐานสำหรับการโต้ตอบของ Agent กับระบบ
การแลกเปลี่ยนในการออกแบบ
ทำไมต้องมีข้อกำหนดของโปรโตคอล?
- การแลกเปลี่ยน: เสรีภาพ vs ความสอดคล้อง
- การตัดสินใจ: กำหนดโปรโตคอลการโต้ตอบที่เป็นมาตรฐาน (Silent Replies, Heartbeats, Reply Tags ฯลฯ)
- ข้อดี: รับประกันพฤติกรรมที่สอดคล้องกันในทุก Agent รองรับการตรวจสอบอัตโนมัติและการตรวจสอบสถานะ ทำให้การทำงานร่วมกันของ Agent หลายตัวง่ายขึ้น
- ต้นทุน: จำกัดเสรีภาพในการแสดงออกของ Agent ต้องการให้ LLM ปฏิบัติตามโปรโตคอลอย่างเคร่งครัด (อาจถูกละเว้น)
ส่วนประกอบ

ตัวอย่างการใช้งาน
ตัวอย่าง Silent Replies:
ผู้ใช้: ได้รับ
Agent: NO_REPLY
ตัวอย่าง Heartbeats:
ระบบ: [Heartbeat Poll]
Agent: HEARTBEAT_OK
ตัวอย่าง Reply Tags:
Agent: [[reply_to_current]] งานเสร็จสมบูรณ์ ✓
เลเยอร์ 6: ข้อมูลรันไทม์
การเปรียบเทียบ
เหมือนกับ "แดชบอร์ด"—บอก LLM ถึงสถานะแบบเรียลไทม์ของสภาพแวดล้อมการทำงานปัจจุบัน
การแลกเปลี่ยนในการออกแบบ
ทำไมต้องแทรกข้อมูลรันไทม์ทุกครั้ง?
- การแลกเปลี่ยน: การใช้โทเค็น vs ความถูกต้องของบริบท
- การตัดสินใจ: แทรกสถานะรันไทม์ล่าสุดในทุกคำขอ
- ข้อดี: LLM รู้เวลาปัจจุบัน (หลีกเลี่ยงความสับสนเรื่องเวลา) LLM รู้โมเดลปัจจุบัน (หลีกเลี่ยงการตัดสินความสามารถผิด) LLM รู้สภาพแวดล้อมปัจจุบัน (หลีกเลี่ยงข้อผิดพลาดเรื่องเส้นทาง)
- ต้นทุน: ใช้โทเค็น ~2KB ต่อคำขอ ข้อมูลอาจมีความซ้ำซ้อน
ส่วนประกอบ

ตัวอย่างการใช้งาน
Runtime
เลเยอร์ 7: Workspace Files ★ ผู้ใช้สามารถควบคุมได้
การเปรียบเทียบ
เหมือนกับ "บันทึกการทำงานของคุณ"—เหล่านี้คือไฟล์คอนฟิกแบบคงที่ที่คุณสามารถแก้ไขได้โดยตรง
การแลกเปลี่ยนในการออกแบบ
ทำไมเฉพาะเลเยอร์นี้เท่านั้นที่แก้ไขแบบคงที่ได้?
- การแลกเปลี่ยน: ความเสถียรของเฟรมเวิร์ก vs เสรีภาพของผู้ใช้
- การตัดสินใจ: แยกส่วนที่ "เปลี่ยนแปลง" ออกจากส่วนที่ "ไม่เปลี่ยนแปลง" เลเยอร์เฟรมเวิร์กรับประกันความสอดคล้อง ในขณะที่เลเยอร์ผู้ใช้อนุญาตให้ปรับแต่งเองได้
- ข้อดี: ผู้ใช้สามารถกำหนดเอกลักษณ์ ข้อกำหนดการทำงาน และความจำของ Agent การอัปเกรดเฟรมเวิร์กจะไม่ทำลายคอนฟิกของผู้ใช้ ไฟล์คอนฟิกสามารถควบคุมเวอร์ชัน สำรองข้อมูล และแชร์ได้
- ต้นทุน: ผู้ใช้ไม่สามารถแก้ไขพฤติกรรมหลักของเฟรมเวิร์ก ต้องเรียนรู้เฟรมเวิร์ก TELOS และโครงสร้างไฟล์
ไฟล์หลัก

เลเยอร์ 8: ระบบ Bootstrap Hook ★ ผู้ใช้สามารถควบคุมได้
การเปรียบเทียบ
เหมือนกับ "เข็มฉีดยาที่ตั้งโปรแกรมได้"—คุณสามารถเขียนสคริปต์เพื่อแทรกเนื้อหาแบบไดนามิกเข้าไปใน System Prompt ขณะรันไทม์
การแลกเปลี่ยนในการออกแบบ
ทำไมต้องมีระบบ Hook?
- การแลกเปลี่ยน: ความเรียบง่ายของคอนฟิกคงที่ vs ความยืดหยุ่นของการแทรกแบบไดนามิก
- การตัดสินใจ: จัดหากลไก Hook แบบไดนามิกควบคู่ไปกับ Workspace Files แบบคงที่
- ข้อดี: สามารถปรับเนื้อหาที่แทรกตามบริบท (ช่องทาง ผู้ส่ง เวลา) สามารถเรียกใช้คำสั่งเชลล์และแทรกผลลัพธ์ (เช่น สภาพอากาศปัจจุบัน, สถานะ Git) สามารถอ่านไฟล์ภายนอกและแทรก (เช่น เอกสารโครงการ, เอกสาร API) รองรับตรรกะแบบมีเงื่อนไข (if/else)
- ต้นทุน: ต้องเรียนรู้ไวยากรณ์ของระบบ Hook และกลไกการทริกเกอร์ ข้อผิดพลาดของสคริปต์ Hook อาจทำให้ System Prompt ผิดปกติ เพิ่มความซับซ้อนของระบบ
กลไก Hook สี่อย่าง
- agent:bootstrap Hook (ระบบ Hook ภายใน)
ตำแหน่งที่ทริกเกอร์: applyBootstrapHookOverrides() ใน bootstrap-hooks.ts
ความสามารถ:
- ควบคุมอาร์เรย์ bootstrapFiles อย่างสมบูรณ์
- สามารถเพิ่ม ลบ หรือแก้ไขไฟล์
- สามารถจัดลำดับไฟล์ใหม่
- สามารถแก้ไขเนื้อหาไฟล์
ใครสามารถลงทะเบียน:
- ปลั๊กอิน OpenClaw
- Workspace Hooks (ไดเรกทอรี ~/.openclaw/workspace-*/hooks/)
- โมดูลภายใน
ตัวอย่างโค้ด:
registerInternalHook("agent:bootstrap", (event) => {
const context = event.context as AgentBootstrapHookContext;
// Full control over bootstrapFiles array
context.bootstrapFiles = [
{ path: "CUSTOM.md", content: "Custom Content" }
];
});
- bootstrap-extra-files Hook (Bundled Hook)
ตำแหน่งที่ทริกเกอร์: handler.ts ใน hooks/bundled/bootstrap-extra-files/
ความสามารถ:
- แนบไฟล์เท่านั้น ไม่แก้ไขไฟล์ที่มีอยู่
- ระบุไฟล์เพิ่มเติมผ่านไฟล์คอนฟิก
ตัวอย่างคอนฟิก:
{
"hooks": {
"bootstrap-extra-files": {
"enabled": true,
"paths": ["extra/*.md", "docs/CONTEXT.md"]
}
}
}
สถานการณ์ที่เหมาะสม:
- ต้องแทรกไฟล์บริบทเฉพาะโครงการ
- ไม่ต้องการแก้ไขไฟล์ Bootstrap 8 ไฟล์เริ่มต้น
- ต้องโหลดเอกสารเพิ่มเติมแบบไดนามิก
- before_prompt_build Hook (Plugin Hook)
ตำแหน่งที่ทริกเกอร์: runBeforePromptBuild() ใน attempt.ts
ความสามารถ:
- แก้ไข prompt สุดท้าย (หลังสร้าง system prompt ก่อนส่งไปยัง LLM)
- สามารถเพิ่มบริบทด้านหน้า (เพิ่มเนื้อหาก่อน prompt)
- สามารถแทนที่ systemPrompt
ข้อมูลเหตุการณ์:
{
prompt: string; // User input
messages: unknown[]; // Session message history
}
ค่าที่ส่งกลับ:
{
prependContext?: string; // Content added before the prompt
systemPrompt?: string; // Overrides the system prompt
}
สถานการณ์ที่เหมาะสม:
- ต้องปรับ prompt แบบไดนามิกตามประวัติเซสชัน
- ต้องแทรกบริบทแบบเรียลไทม์ (เช่น เวลาปัจจุบัน สภาพอากาศ)
- ต้องแทนที่ system prompt ทั้งหมด
- bootstrapMaxChars / bootstrapTotalMaxChars (รายการคอนฟิก)
ประเภท: รายการคอนฟิก (ไม่ใช่ Hook)
ความสามารถ:
- ควบคุมงบประมาณตัวอักษร
- ค่าเริ่มต้นของไฟล์เดียว: 20K
- ค่าเริ่มต้นรวม: 150K
- ส่วนที่เกินจะถูกตัดโดยใช้ 70% แรก + 20% สุดท้าย
ตำแหน่งคอนฟิก:
{
"agents": {
"defaults": {
"bootstrapMaxChars": 20000,
"bootstrapTotalMaxChars": 150000
}
}
}
คำแนะนำเชิงปฏิบัติ
สถานการณ์ที่ 1: ต้องการเพิ่มเอกสารโครงการ
วิธีแก้ไขที่แนะนำ: bootstrap-extra-files
{
"hooks": {
"bootstrap-extra-files": {
"enabled": true,
"paths": ["docs/API.md", "docs/ARCHITECTURE.md"]
}
}
}
สถานการณ์ที่ 2: ต้องการโหลดไฟล์แบบไดนามิกตามประเภทงาน
วิธีแก้ไขที่แนะนำ: Custom agent:bootstrap Hook
registerInternalHook("agent:bootstrap", (event) => {
const context = event.context as AgentBootstrapHookContext;
const sessionKey = context.sessionKey;
// Load different files based on session type
if (sessionKey.includes("coding")) {
context.bootstrapFiles.push({
path: "CODING_GUIDELINES.md",
content: fs.readFileSync("...").toString()
});
}
});
สถานการณ์ที่ 3: ต้องการแทรกบริบทแบบเรียลไทม์ (เช่น เวลาปัจจุบัน)
วิธีแก้ไขที่แนะนำ: before_prompt_build Hook
on("before_prompt_build", (event, ctx) => {
return {
prependContext: Current Time: ${new Date().toISOString()}
};
});
เลเยอร์ 9: บริบทขาเข้า
การเปรียบเทียบ
เหมือนกับ "ข้อมูลการจราจรแบบเรียลไทม์"—แทรกข้อมูลบริบทของการสนทนาปัจจุบันแบบไดนามิกในทุกคำขอ
การแลกเปลี่ยนในการออกแบบ
ทำไมต้องแทรกบริบททุกครั้ง?
- การแลกเปลี่ยน: การใช้โทเค็น vs ความต่อเนื่องของการสนทนา
- การตัดสินใจ: แทรกเมทาดาทาของข้อความล่าสุด ข้อมูลผู้ส่ง และประวัติการสนทนาในทุกคำขอ
- ข้อดี: LLM รู้ว่าผู้ใดกำลังพูดอยู่ (หลีกเลี่ยงความสับสนเรื่องผู้ส่ง) LLM รู้ประวัติการสนทนา (รักษาความต่อเนื่องของบริบท) LLM รู้ว่าถูก @mention หรือไม่ (ตัดสินใจว่าจะตอบสนองหรือไม่)
- ต้นทุน: ใช้โทเค็น ~3KB ต่อคำขอ ประวัติการสนทนาอาจมีสัญญาณรบกวน
ส่วนประกอบ

กระบวนการสร้าง System Prompt ที่สมบูรณ์



สรุปเลเยอร์ที่ผู้ใช้สามารถควบคุมได้
OpenClaw มี กลไกที่ผู้ใช้สามารถควบคุมได้ 3 ประเภท:
- เลเยอร์ 7 (Workspace Files) - ไฟล์คอนฟิกแบบคงที่ สถานการณ์: การกำหนดเอกลักษณ์ Agent ข้อกำหนดการทำงาน และความจำ ข้อดี: ง่าย ใช้งานง่าย ควบคุมเวอร์ชันได้ง่าย ข้อเสีย: ไม่สามารถปรับเปลี่ยนแบบไดนามิก
- เลเยอร์ 8 (Bootstrap Hook System) - สคริปต์การแทรกแบบไดนามิก สถานการณ์: การแทรกเนื้อหาตามบริบท การเรียกใช้คำสั่ง การอ่านไฟล์ภายนอก ข้อดี: ยืดหยุ่น มีประสิทธิภาพ รองรับตรรกะและคำสั่ง ข้อเสีย: ต้องเรียนรู้ระบบ Hook ข้อผิดพลาดของสคริปต์ทำให้เกิดปัญหา
- การควบคุมเลเยอร์ 9 ทางอ้อม (บริบทขาเข้า) - การมีอิทธิพลต่อบริบทโดยการส่งข้อความ สถานการณ์: การมีอิทธิพลต่อพฤติกรรมของ LLM ผ่านประวัติการแชทหรือข้อความที่อ้างถึง ข้อดี: ไม่ต้องตั้งค่า ปฏิสัมพันธ์ที่เป็นธรรมชาติ ข้อเสีย: ไม่สามารถควบคุมได้แม่นยำ
ตารางเปรียบเทียบขนาด
⚠️
หมายเหตุ: ข้อมูลต่อไปนี้เป็นค่าประมาณ ขนาดจริงแตกต่างกันไปตามคอนฟิกและบริบทรันไทม์ เลเยอร์เฟรมเวิร์ก (เลเยอร์ 1-6 + 9) ตามทฤษฎีแล้วควรจะเหมือนกัน แต่อาจแตกต่างกันเล็กน้อยเนื่องจากคำจำกัดความของเครื่องมือ ทักษะที่โหลด ฯลฯ

หมายเหตุ:
- เลเยอร์ 7 และเลเยอร์ 8 เป็นส่วนที่ผู้ใช้ควบคุมได้ ขนาดแตกต่างกันไปตามคอนฟิกของ Agent
- เลเยอร์อื่นๆ ถูกสร้างขึ้นโดยอัตโนมัติ และตามทฤษฎีแล้วเหมือนกันทุก Agent
- การวัดจริงอาจแตกต่างกันเนื่องจากความพร้อมของเครื่องมือ การโหลดทักษะ และบริบทรันไทม์
ข้อเสนอแนะในการปรับปรุงประสิทธิภาพ
- การปรับแต่งส่วนที่ผู้ใช้ควบคุมได้ (เลเยอร์ 7 + 8)
เนื่องจากเลเยอร์ 7 และ 8 ถูกควบคุมโดยผู้ใช้ นี่คือกลยุทธ์การปรับแต่ง:
การปรับแต่งเลเยอร์ 7 (ไฟล์คงที่):
✅ กลยุทธ์แบบลีนที่แนะนำ:
- IDENTITY.md: เก็บโครงสร้าง TELOS หลัก ลบคำอธิบายที่ซ้ำซ้อน ใช้ตารางแทนย่อหน้า
- AGENTS.md: ใช้รายการตรวจสอบแทนย่อหน้ายาว แสดงคำสั่งในบล็อกโค้ด ลบคำอธิบายกฎที่ซ้ำกัน
- MEMORY.md: พึ่งพาการส่งออกอัตโนมัติของ MemOS ไม่ต้องเพิ่มเนื้อหาด้วยตนเอง ปล่อยให้ระบบดูแล
❌ สิ่งที่ควรหลีกเลี่ยง:
- อย่าทำซ้ำคำอธิบายที่ OpenClaw framework รู้อยู่แล้ว
- อย่าคัดลอกคำอธิบายทักษะโดยละเอียดลงใน Workspace Files
- อย่าใช้สำนวนโวหารหรือภาษาตกแต่งมากเกินไป
การปรับแต่งเลเยอร์ 8 (ระบบ Hook):
✅ กลยุทธ์การใช้งานที่แนะนำ:
- ให้ความสำคัญกับ bootstrap-extra-files (สถานการณ์ง่าย)
- ใช้ agent:bootstrap เมื่อต้องการตรรกะแบบมีเงื่อนไข (สถานการณ์ซับซ้อน)
- ใช้ before_prompt_build สำหรับบริบทแบบเรียลไทม์ (สถานการณ์ไดนามิก)
❌ สิ่งที่ควรหลีกเลี่ยง:
- อย่ารันการดำเนินการที่ใช้เวลานานใน Hook (บล็อกการสร้าง System Prompt)
- อย่าแทรกเนื้อหามากเกินไปใน Hook (เกินขีดจำกัดโทเค็น)
- อย่าใช้ dependencies ภายนอกที่ไม่เสถียรใน Hook (ทำให้เกิดข้อผิดพลาดในการเริ่มต้น)
- กลยุทธ์การตัดแต่ง Prompt
หาก System Prompt มีขนาดใหญ่เกินไป ให้พิจารณา:

สรุป
System Prompt ของ OpenClaw ไม่ใช่ไฟล์เดียว แต่เป็น สถาปัตยกรรม 9 เลเยอร์ ที่ถูกออกแบบอย่างพิถีพิถัน:
- เลเยอร์ 1-6: สร้างขึ้นโดยอัตโนมัติจากเฟรมเวิร์ก รับประกันความสอดคล้องและความเสถียร
- เลเยอร์ 7: ไฟล์คอนฟิกแบบคงที่ที่ผู้ใช้แก้ไขได้ (IDENTITY.md, AGENTS.md ฯลฯ)
- เลเยอร์ 8: สคริปต์การแทรกแบบไดนามิกที่ผู้ใช้ตั้งโปรแกรมได้ (Bootstrap Hook System)
- เลเยอร์ 9: บริบทแบบเรียลไทม์ที่เฟรมเวิร์กแทรกโดยอัตโนมัติ (บริบทขาเข้า)
มี 2 เลเยอร์ที่ผู้ใช้ควบคุมได้ (เลเยอร์ 7 + 8) ไม่ใช่แค่เลเยอร์ 7 ตามที่เคยระบุไว้ผิด
การเข้าใจความแตกต่างและการเชื่อมต่อระหว่างเลเยอร์เหล่านี้คือกุญแจสำคัญในการควบคุมการกำหนดค่า OpenClaw





