Technical reference
สุขอนามัยของบทสนทนา
OpenClaw ใช้ การแก้ไขเฉพาะผู้ให้บริการ กับทรานสคริปต์ก่อนเริ่มการทำงาน (ขณะสร้างบริบทของโมเดล) การแก้ไขส่วนใหญ่เป็นการปรับ ภายในหน่วยความจำ เพื่อให้เป็นไปตามข้อกำหนดที่เข้มงวดของผู้ให้บริการ กระบวนการซ่อมแซมไฟล์เซสชัน ที่แยกต่างหากอาจเขียน JSONL ที่จัดเก็บไว้ใหม่ก่อนโหลดเซสชันด้วย แต่จะทำเฉพาะ กับบรรทัดที่ผิดรูปแบบหรือเทิร์นที่คงอยู่ซึ่งไม่ใช่ระเบียนถาวรที่ถูกต้องเท่านั้น คำตอบจากผู้ช่วยที่ส่งไปแล้วจะยังคงอยู่บนดิสก์ ส่วนการตัดข้อความเติมล่วงหน้าของ ผู้ช่วยเฉพาะผู้ให้บริการจะเกิดขึ้นเฉพาะขณะสร้างเพย์โหลดขาออกเท่านั้น
เมื่อมีการซ่อมแซม ระบบจะเขียนไฟล์ต้นฉบับไปยังไฟล์ข้างเคียงชั่วคราว
*.bak-<pid>-<ts> ก่อนแทนที่แบบอะตอมมิก แล้วลบไฟล์ดังกล่าวเมื่อการแทนที่
สำเร็จ ระบบจะเก็บข้อมูลสำรองไว้เฉพาะเมื่อการล้างข้อมูลล้มเหลว ซึ่งในกรณีนั้น
ระบบจะรายงานพาธกลับมา
ขอบเขตครอบคลุม:
- ป้องกันไม่ให้บริบทพรอมต์สำหรับรันไทม์เท่านั้นปรากฏในเทิร์นทรานสคริปต์ที่ผู้ใช้มองเห็น
- การทำความสะอาดรหัสการเรียกใช้เครื่องมือ
- การตรวจสอบอินพุตของการเรียกใช้เครื่องมือ
- การซ่อมแซมการจับคู่ผลลัพธ์ของเครื่องมือ
- การตรวจสอบความถูกต้อง / การจัดลำดับเทิร์น
- การล้างลายเซ็นความคิด
- การล้างลายเซ็นกระบวนการคิด
- การทำความสะอาดเพย์โหลดรูปภาพ
- การล้างบล็อกข้อความว่างก่อนเล่นซ้ำให้ผู้ให้บริการ
- การล้างเทิร์นที่มีเฉพาะการให้เหตุผลซึ่งไม่สมบูรณ์เนื่องจากถึงขีดจำกัดความยาว ก่อนเล่นซ้ำให้ผู้ให้บริการ
- การติดแท็กแหล่งที่มาของอินพุตผู้ใช้ (สำหรับพรอมต์ที่กำหนดเส้นทางระหว่างเซสชัน)
- การซ่อมแซมเทิร์นข้อผิดพลาดว่างของผู้ช่วยสำหรับการเล่นซ้ำผ่าน Bedrock Converse
หากต้องการรายละเอียดเกี่ยวกับการจัดเก็บทรานสคริปต์ โปรดดู เจาะลึกการจัดการเซสชัน
กฎสากล: บริบทรันไทม์ไม่ใช่ทรานสคริปต์ของผู้ใช้
สามารถเพิ่มบริบทรันไทม์/ระบบลงในพรอมต์ของโมเดลสำหรับแต่ละเทิร์นได้ แต่บริบทนั้น ไม่ใช่เนื้อหาที่เขียนโดยผู้ใช้ปลายทาง OpenClaw เก็บเนื้อหาพรอมต์สำหรับแสดงใน ทรานสคริปต์แยกต่างหากสำหรับการตอบกลับผ่าน Gateway การติดตามผลในคิว ACP, CLI และการเรียกใช้ OpenClaw แบบฝัง เทิร์นผู้ใช้ที่มองเห็นและจัดเก็บไว้จะใช้เนื้อหา ทรานสคริปต์ดังกล่าวแทนพรอมต์ที่เสริมด้วยบริบทรันไทม์
สำหรับเซสชันรุ่นเก่าที่บันทึกตัวห่อหุ้มรันไทม์ไว้แล้ว พื้นผิวประวัติของ Gateway จะใช้การฉายภาพสำหรับการแสดงผลก่อนส่งข้อความกลับไปยังไคลเอนต์ WebChat, TUI, REST หรือ SSE
ตำแหน่งที่กระบวนการนี้ทำงาน
การดูแลความเรียบร้อยของทรานสคริปต์ทั้งหมดรวมศูนย์อยู่ในตัวรันแบบฝัง:
- การเลือกนโยบาย:
src/agents/transcript-policy.ts(resolveTranscriptPolicyโดยอิงตามprovider,modelApiและmodelId) - การใช้การทำความสะอาด/ซ่อมแซม:
sanitizeSessionHistoryในsrc/agents/embedded-agent-runner/replay-history.ts
การซ่อมแซมไฟล์เซสชัน (หากจำเป็น) ก่อนโหลดจะแยกออกจากการดูแลความเรียบร้อย ของทรานสคริปต์:
repairSessionFileIfNeededในsrc/agents/session-file-repair.ts- เรียกใช้จาก
src/agents/embedded-agent-runner/run/attempt.tsและsrc/agents/embedded-agent-runner/compact.ts
กฎสากล: การทำความสะอาดรูปภาพ
เพย์โหลดรูปภาพจะได้รับการทำความสะอาดเสมอ เพื่อป้องกันการปฏิเสธจากฝั่ง ผู้ให้บริการเนื่องจากขีดจำกัดขนาด (ลดขนาด/บีบอัดรูปภาพ base64 ที่มีขนาดใหญ่เกินไปใหม่) การดำเนินการนี้ยังช่วยควบคุมภาระโทเค็นที่เกิดจากรูปภาพสำหรับโมเดลที่รองรับการมองเห็น: ขนาดสูงสุดที่เล็กลงช่วยลดการใช้โทเค็น ส่วนขนาดที่ใหญ่ขึ้นช่วยรักษารายละเอียด
การนำไปใช้:
sanitizeSessionMessagesImagesในsrc/agents/embedded-agent-helpers/images.tssanitizeContentBlocksImagesในsrc/agents/tool-images.ts- สามารถกำหนดค่าความยาวด้านสูงสุดของรูปภาพผ่าน
agents.defaults.imageMaxDimensionPx(ค่าเริ่มต้น:1200) - ระบบจะนำบล็อกข้อความว่างออกขณะที่กระบวนการนี้ไล่ตรวจเนื้อหาสำหรับเล่นซ้ำ เทิร์นของผู้ช่วยที่กลายเป็นว่างจะถูกตัดออกจากสำเนาสำหรับเล่นซ้ำ ส่วนเทิร์น ของผู้ใช้และผลลัพธ์เครื่องมือที่กลายเป็นว่างจะได้รับข้อความตัวแทนเนื้อหาที่ละไว้ ซึ่งไม่เป็นค่าว่าง
กฎสากล: การเรียกใช้เครื่องมือที่ผิดรูปแบบ
ระบบจะตัดบล็อกการเรียกใช้เครื่องมือของผู้ช่วยที่ไม่มีทั้ง input และ arguments
ออกก่อนสร้างบริบทของโมเดล วิธีนี้ช่วยป้องกันการปฏิเสธจากผู้ให้บริการอันเนื่องมาจาก
การเรียกใช้เครื่องมือที่บันทึกไว้เพียงบางส่วน (ตัวอย่างเช่น หลังเกิดความล้มเหลว
จากขีดจำกัดอัตรา)
การนำไปใช้:
sanitizeToolCallInputsในsrc/agents/session-transcript-repair.ts- ใช้ใน
sanitizeSessionHistory(src/agents/embedded-agent-runner/replay-history.ts)
กฎสากล: เทิร์นที่มีเฉพาะการให้เหตุผลซึ่งไม่สมบูรณ์
เทิร์นของผู้ช่วยที่ถึงขีดจำกัดเอาต์พุตของผู้ให้บริการโดยมีเฉพาะเนื้อหากระบวนการคิด หรือกระบวนการคิดที่ปกปิด จะถูกละออกจากสำเนาสำหรับเล่นซ้ำภายในหน่วยความจำ เทิร์นดังกล่าวมีสถานะของผู้ให้บริการที่ไม่สมบูรณ์ และอาจมีลายเซ็นกระบวนการคิด เพียงบางส่วน
เทิร์นที่ถึงขีดจำกัดความยาวแต่ไม่มีเนื้อหาจะยังคงเดิม เช่นเดียวกับเทิร์นที่ถึง ขีดจำกัดความยาวแต่มีข้อความที่มองเห็นได้ การเรียกใช้เครื่องมือ หรือบล็อกเนื้อหา ที่ไม่รู้จัก ระบบจะไม่เขียนทรานสคริปต์ที่จัดเก็บไว้ใหม่
การนำไปใช้: normalizeAssistantReplayContent ใน
src/agents/embedded-agent-runner/replay-history.ts
กฎสากล: แหล่งที่มาของอินพุตระหว่างเซสชัน
เมื่อเอเจนต์ส่งพรอมต์ไปยังเซสชันอื่นผ่าน sessions_send
(รวมถึงขั้นตอนการตอบกลับ/ประกาศระหว่างเอเจนต์) OpenClaw จะบันทึกเทิร์นผู้ใช้
ที่สร้างขึ้นพร้อม message.provenance.kind = "inter_session"
นอกจากนี้ OpenClaw ยังเติมเครื่องหมาย [Inter-session message] ... isUser=false
ไว้ก่อนข้อความพรอมต์ที่กำหนดเส้นทางในเทิร์นเดียวกัน เพื่อให้การเรียกใช้โมเดล
ที่ทำงานอยู่สามารถแยกแยะเอาต์พุตจากเซสชันอื่นออกจากคำสั่งของผู้ใช้ปลายทางภายนอก
เครื่องหมายนี้จะรวมเซสชันต้นทาง ช่องทาง และเครื่องมือเมื่อมีข้อมูล ทรานสคริปต์
ยังคงใช้ role: "user" เพื่อให้เข้ากันได้กับผู้ให้บริการ แต่ทั้งข้อความที่มองเห็น
และเมทาดาทาแหล่งที่มาต่างระบุว่าเทิร์นนั้นเป็นข้อมูลระหว่างเซสชัน
ระหว่างสร้างบริบทใหม่ OpenClaw จะใช้เครื่องหมายเดียวกันกับเทิร์นผู้ใช้ระหว่าง เซสชันรุ่นเก่าที่บันทึกไว้และมีเพียงเมทาดาทาแหล่งที่มา
ตารางผู้ให้บริการ (พฤติกรรมปัจจุบัน)
OpenAI / OpenAI Codex
- ทำความสะอาดรูปภาพเท่านั้น
- ตัดลายเซ็นการให้เหตุผลที่ไม่มีคู่ (รายการการให้เหตุผลเดี่ยวที่ไม่มีบล็อกเนื้อหา ตามมา) สำหรับทรานสคริปต์ OpenAI Responses/Codex และตัดการให้เหตุผลของ OpenAI ที่เล่นซ้ำได้หลังสลับเส้นทางโมเดล
- รักษาเพย์โหลดรายการการให้เหตุผลของ OpenAI Responses ที่เล่นซ้ำได้ รวมถึง
รายการสรุปว่างที่เข้ารหัส เพื่อให้การเล่นซ้ำด้วยตนเอง/WebSocket ยังคงจับคู่
สถานะ
rs_*ที่จำเป็นกับรายการเอาต์พุตของผู้ช่วย - Native ChatGPT Codex Responses รักษาความสอดคล้องกับโปรโตคอลสายสัญญาณของ Codex
โดยเล่นซ้ำเพย์โหลดการให้เหตุผล/ข้อความ/ฟังก์ชันจาก Responses ก่อนหน้าโดยไม่มี
รหัสรายการเดิม พร้อมรักษา
prompt_cache_keyของเซสชัน - การเล่นซ้ำในตระกูล OpenAI Responses จะรักษาคู่การให้เหตุผลในโมเดลเดียวกัน
แบบมาตรฐาน
call_*|fc_*แต่จะปรับcall_id/รหัสรายการการเรียกใช้ฟังก์ชัน ที่ผิดรูปแบบหรือยาวเกินไปอย่างกำหนดผลได้ ก่อนแปลงเป็นเพย์โหลด pi-ai - การซ่อมแซมการจับคู่ผลลัพธ์เครื่องมืออาจย้ายเอาต์พุตจริงที่ตรงกัน และสังเคราะห์
เอาต์พุต
abortedรูปแบบ Codex สำหรับการเรียกใช้เครื่องมือที่ขาดหายไป - ไม่มีการตรวจสอบความถูกต้องหรือจัดลำดับเทิร์นใหม่ และไม่มีการตัดลายเซ็นความคิด
Chat Completions ที่เข้ากันได้กับ OpenAI
- ระบบจะตัดบล็อกกระบวนการคิด/การให้เหตุผลในอดีตของผู้ช่วยก่อนเล่นซ้ำ เพื่อไม่ให้
เซิร์ฟเวอร์ภายในและเซิร์ฟเวอร์แบบพร็อกซีที่เข้ากันได้กับ OpenAI ได้รับฟิลด์
การให้เหตุผลของเทิร์นก่อนหน้า เช่น
reasoningหรือreasoning_content - การทำงานต่อเนื่องของการเรียกใช้เครื่องมือในเทิร์นเดียวกันปัจจุบันจะคงบล็อก การให้เหตุผลของผู้ช่วยไว้กับการเรียกใช้เครื่องมือ จนกว่าจะเล่นซ้ำผลลัพธ์ ของเครื่องมือแล้ว
- รายการโมเดลแบบกำหนดเอง/โฮสต์เองที่มี
reasoning: trueจะรักษาเมทาดาทา การให้เหตุผลที่เล่นซ้ำ - ข้อยกเว้นที่ผู้ให้บริการเป็นเจ้าของสามารถเลือกไม่ใช้กฎนี้ได้ เมื่อโปรโตคอล สายสัญญาณของผู้ให้บริการต้องใช้เมทาดาทาการให้เหตุผลที่เล่นซ้ำ
Google (Generative AI / Gemini CLI / Antigravity)
- การทำความสะอาดรหัสการเรียกใช้เครื่องมือ: ใช้เฉพาะตัวอักษรและตัวเลขอย่างเคร่งครัด
- การซ่อมแซมการจับคู่ผลลัพธ์เครื่องมือและผลลัพธ์เครื่องมือสังเคราะห์
- การตรวจสอบความถูกต้องของเทิร์น (การสลับเทิร์นรูปแบบ Gemini)
- การแก้ไขลำดับเทิร์นของ Google (เติมข้อความเริ่มต้นสั้น ๆ จากผู้ใช้ไว้ด้านหน้า หากประวัติเริ่มต้นด้วยผู้ช่วย)
- Antigravity Claude: ปรับลายเซ็นกระบวนการคิดให้อยู่ในรูปแบบมาตรฐาน และตัดบล็อก กระบวนการคิดที่ไม่มีลายเซ็น
Anthropic / Minimax (เข้ากันได้กับ Anthropic)
- การซ่อมแซมการจับคู่ผลลัพธ์เครื่องมือและผลลัพธ์เครื่องมือสังเคราะห์
- การตรวจสอบความถูกต้องของเทิร์น (รวมเทิร์นผู้ใช้ที่ต่อเนื่องกันเพื่อให้เป็นไปตาม การสลับอย่างเคร่งครัด)
- ระบบจะตัดเทิร์นข้อความเติมล่วงหน้าของผู้ช่วยที่อยู่ท้ายสุดออกจากเพย์โหลดขาออก Anthropic Messages เมื่อเปิดใช้กระบวนการคิด รวมถึงเส้นทาง Cloudflare AI Gateway
- ระบบจะตัดลายเซ็นกระบวนการคิดของผู้ช่วยก่อน Compaction ออกก่อนเล่นซ้ำให้ ผู้ให้บริการ เมื่อเซสชันผ่าน Compaction แล้ว ลายเซ็นกระบวนการคิดจะผูกกับ คำนำหน้าของบทสนทนา ณ เวลาสร้างด้วยวิธีการเข้ารหัส หลัง Compaction คำนำหน้าจะ เปลี่ยนไป (เนื้อหาที่สรุปจะแทนที่ต้นฉบับ) ดังนั้นการเล่นซ้ำลายเซ็นเดิมจะทำให้ Anthropic ปฏิเสธคำขอด้วยข้อความ "ลายเซ็นในบล็อกกระบวนการคิดไม่ถูกต้อง" ข้อความกระบวนการคิดจะถูกเก็บไว้เป็นบล็อกที่ไม่มีลายเซ็น แล้วจึงจัดการตามกฎด้านล่าง
- ระบบจะตัดบล็อกกระบวนการคิดที่ไม่มีลายเซ็นสำหรับเล่นซ้ำ หรือลายเซ็นเป็นค่าว่าง หรือมีแต่ช่องว่าง ก่อนแปลงสำหรับผู้ให้บริการ หากทำให้เทิร์นของผู้ช่วยว่าง OpenClaw จะรักษารูปทรงของเทิร์นไว้ด้วยข้อความการให้เหตุผลที่ละไว้ซึ่งไม่เป็นค่าว่าง
- เทิร์นของผู้ช่วยรุ่นเก่าที่มีเฉพาะกระบวนการคิดและจำเป็นต้องตัดออก จะถูกแทนที่ ด้วยข้อความการให้เหตุผลที่ละไว้ซึ่งไม่เป็นค่าว่าง เพื่อไม่ให้อะแดปเตอร์ของ ผู้ให้บริการตัดเทิร์นสำหรับเล่นซ้ำออก
Amazon Bedrock (Converse API)
- ระบบจะซ่อมแซมเทิร์นข้อผิดพลาดสตรีมของผู้ช่วยที่ว่างให้เป็นบล็อกข้อความสำรอง
ที่ไม่เป็นค่าว่างก่อนเล่นซ้ำ Bedrock Converse ปฏิเสธข้อความผู้ช่วยที่มี
content: []ดังนั้นเทิร์นผู้ช่วยที่บันทึกไว้ซึ่งมีstopReason: "error"และเนื้อหาว่างจะได้รับการซ่อมแซมบนดิสก์ก่อนโหลดด้วย - เทิร์นข้อผิดพลาดสตรีมของผู้ช่วยที่มีเพียงบล็อกข้อความว่างจะถูกตัดออกจากสำเนา สำหรับเล่นซ้ำภายในหน่วยความจำ แทนการเล่นซ้ำบล็อกว่างที่ไม่ถูกต้อง
- ระบบจะตัดลายเซ็นกระบวนการคิดของผู้ช่วยก่อน Compaction ออกก่อนเล่นซ้ำผ่าน Converse เมื่อเซสชันผ่าน Compaction แล้ว ด้วยเหตุผลเดียวกับ Anthropic ข้างต้น
- ระบบจะตัดบล็อกกระบวนการคิดของ Claude ที่ไม่มีลายเซ็นสำหรับเล่นซ้ำ หรือลายเซ็น เป็นค่าว่างหรือมีแต่ช่องว่าง ก่อนเล่นซ้ำผ่าน Converse หากทำให้เทิร์นของผู้ช่วยว่าง OpenClaw จะรักษารูปทรงของเทิร์นไว้ด้วยข้อความการให้เหตุผลที่ละไว้ซึ่งไม่เป็นค่าว่าง
- เทิร์นของผู้ช่วยรุ่นเก่าที่มีเฉพาะกระบวนการคิดและจำเป็นต้องตัดออก จะถูกแทนที่ ด้วยข้อความการให้เหตุผลที่ละไว้ซึ่งไม่เป็นค่าว่าง เพื่อให้การเล่นซ้ำผ่าน Converse รักษารูปทรงเทิร์นอย่างเคร่งครัด
- การเล่นซ้ำจะกรองเทิร์นผู้ช่วยที่เป็นสำเนาการส่งของ OpenClaw และเทิร์นที่ Gateway แทรกเข้ามา
- การทำความสะอาดรูปภาพเป็นไปตามกฎสากล
Mistral (รวมถึงการตรวจจับตามรหัสโมเดล)
- การทำความสะอาดรหัสการเรียกใช้เครื่องมือ: strict9 (ตัวอักษรและตัวเลข ความยาว 9)
OpenRouter Gemini
- การล้างลายเซ็นความคิด: ตัดค่า
thought_signatureที่ไม่ใช่ base64 (เก็บค่า base64 ไว้)
OpenRouter Anthropic
- ระบบจะตัดเทิร์นข้อความเติมล่วงหน้าของผู้ช่วยที่อยู่ท้ายสุดออกจากเพย์โหลดโมเดล Anthropic ที่เข้ากันได้กับ OpenAI และผ่านการยืนยันของ OpenRouter เมื่อเปิดใช้ การให้เหตุผล ให้ตรงกับพฤติกรรมการเล่นซ้ำของ Anthropic โดยตรงและ Anthropic ผ่าน Cloudflare
อื่น ๆ ทั้งหมด
- ทำความสะอาดรูปภาพเท่านั้น
พฤติกรรมในอดีต (ก่อน 2026.1.22)
ก่อนรุ่น 2026.1.22 OpenClaw ใช้การดูแลความเรียบร้อยของทรานสคริปต์หลายชั้น:
- ส่วนขยายทำความสะอาดทรานสคริปต์ ทำงานทุกครั้งที่สร้างบริบทและสามารถ:
- ซ่อมแซมการจับคู่การใช้เครื่องมือ/ผลลัพธ์
- ทำความสะอาดรหัสการเรียกใช้เครื่องมือ (รวมถึงโหมดที่ไม่เข้มงวดซึ่งรักษา
_/-ไว้)
- ตัวรันยังดำเนินการทำความสะอาดเฉพาะผู้ให้บริการด้วย ซึ่งทำให้เกิดงานซ้ำซ้อน
- มีการเปลี่ยนแปลงเพิ่มเติมนอกนโยบายผู้ให้บริการ รวมถึงการตัดแท็ก
<final>ออกจากข้อความผู้ช่วยก่อนบันทึก การตัดเทิร์นข้อผิดพลาดว่างของผู้ช่วย และการตัด เนื้อหาผู้ช่วยหลังการเรียกใช้เครื่องมือ
ความซับซ้อนนี้ทำให้เกิดการถดถอยข้ามผู้ให้บริการ (โดยเฉพาะการจับคู่
openai-responses call_id|fc_id) การปรับปรุงในรุ่น 2026.1.22 ได้นำส่วนขยายออก
รวมตรรกะไว้ที่ตัวรัน และกำหนดให้ OpenAI ไม่ถูกแตะต้อง นอกเหนือจากการทำความสะอาดรูปภาพ