Technical reference
สุขอนามัยของบันทึกบทสนทนา
OpenClaw ใช้ การแก้ไขเฉพาะผู้ให้บริการ กับทรานสคริปต์ก่อนการรัน (การสร้างบริบทของโมเดล) การแก้ไขส่วนใหญ่เป็นการปรับค่า ในหน่วยความจำ เพื่อให้เป็นไปตามข้อกำหนดที่เข้มงวดของผู้ให้บริการ นอกจากนี้ อาจมีรอบการซ่อมแซมไฟล์เซสชันแยกต่างหากที่เขียน JSONL ที่จัดเก็บไว้ใหม่ก่อนโหลดเซสชัน แต่จะทำเฉพาะกับบรรทัดที่ผิดรูปแบบหรือเทิร์นที่คงอยู่ซึ่งเป็นเรคคอร์ดถาวรที่ไม่ถูกต้องเท่านั้น คำตอบของ assistant ที่ส่งแล้วจะถูกเก็บไว้บนดิสก์ การตัด assistant-prefill เฉพาะผู้ให้บริการจะเกิดขึ้นเฉพาะตอนสร้างเพย์โหลดขาออกเท่านั้น เมื่อมีการซ่อมแซม ไฟล์ต้นฉบับจะถูกสำรองไว้ข้างไฟล์เซสชัน
ขอบเขตรวมถึง:
- บริบทพรอมป์แบบ runtime-only ที่ไม่เข้าไปอยู่ในเทิร์นทรานสคริปต์ที่ผู้ใช้มองเห็น
- การทำความสะอาด id ของ tool call
- การตรวจสอบความถูกต้องของอินพุต tool call
- การซ่อมแซมการจับคู่ผลลัพธ์ของ tool
- การตรวจสอบความถูกต้อง / การจัดลำดับของเทิร์น
- การล้างลายเซ็นความคิด
- การล้างลายเซ็น thinking
- การทำความสะอาดเพย์โหลดรูปภาพ
- การล้างบล็อกข้อความว่างก่อนการ replay ให้ผู้ให้บริการ
- การติดแท็กที่มาของอินพุตผู้ใช้ (สำหรับพรอมป์ที่ routed ข้ามเซสชัน)
- การซ่อมแซมเทิร์นข้อผิดพลาดของ assistant ที่ว่างเปล่าสำหรับการ replay ของ Bedrock Converse
หากคุณต้องการรายละเอียดการจัดเก็บทรานสคริปต์ โปรดดู:
กฎสากล: บริบท runtime ไม่ใช่ทรานสคริปต์ผู้ใช้
บริบท runtime/system สามารถเพิ่มเข้าไปในพรอมป์ของโมเดลสำหรับเทิร์นหนึ่งได้ แต่ไม่ใช่เนื้อหาที่ผู้ใช้ปลายทางเขียนเอง OpenClaw เก็บเนื้อหาพรอมป์ที่หันหน้าเข้าหาทรานสคริปต์แยกต่างหากสำหรับการตอบกลับของ Gateway, followup ที่อยู่ในคิว, ACP, CLI และการรัน Pi แบบฝัง เทิร์นผู้ใช้ที่มองเห็นได้และถูกจัดเก็บจะใช้เนื้อหาทรานสคริปต์นั้นแทนพรอมป์ที่เติม runtime เข้าไป
สำหรับเซสชันเดิมที่เคยคง wrapper ของ runtime ไว้แล้ว พื้นผิวประวัติของ Gateway จะใช้การฉายผลสำหรับการแสดงผลก่อนส่งข้อความกลับไปยังไคลเอนต์ WebChat, TUI, REST หรือ SSE
จุดที่สิ่งนี้ทำงาน
สุขอนามัยทรานสคริปต์ทั้งหมดถูกรวมศูนย์ไว้ในตัวรันแบบฝัง:
- การเลือกนโยบาย:
src/agents/transcript-policy.ts - การใช้การทำความสะอาด/ซ่อมแซม:
sanitizeSessionHistoryในsrc/agents/pi-embedded-runner/replay-history.ts
นโยบายใช้ provider, modelApi และ modelId เพื่อตัดสินใจว่าจะใช้อะไร
แยกจากสุขอนามัยทรานสคริปต์ ไฟล์เซสชันจะถูกซ่อมแซม (หากจำเป็น) ก่อนโหลด:
repairSessionFileIfNeededในsrc/agents/session-file-repair.ts- เรียกจาก
run/attempt.tsและcompact.ts(ตัวรันแบบฝัง)
กฎสากล: การทำความสะอาดรูปภาพ
เพย์โหลดรูปภาพจะถูกทำความสะอาดเสมอเพื่อป้องกันการถูกปฏิเสธจากฝั่งผู้ให้บริการเนื่องจากข้อจำกัดด้านขนาด (ลดขนาด/บีบอัดรูปภาพ base64 ที่ใหญ่เกินใหม่)
สิ่งนี้ยังช่วยควบคุมแรงกดดันด้านโทเคนจากรูปภาพสำหรับโมเดลที่รองรับ vision ได้ด้วย ขนาดสูงสุดที่ต่ำกว่ามักลดการใช้โทเคน ส่วนขนาดที่สูงกว่าจะรักษารายละเอียดไว้
การใช้งาน:
sanitizeSessionMessagesImagesในsrc/agents/pi-embedded-helpers/images.tssanitizeContentBlocksImagesในsrc/agents/tool-images.ts- ด้านสูงสุดของรูปภาพกำหนดค่าได้ผ่าน
agents.defaults.imageMaxDimensionPx(ค่าเริ่มต้น:1200) - บล็อกข้อความว่างจะถูกลบออกขณะที่รอบนี้เดินผ่านเนื้อหา replay เทิร์นของ assistant ที่กลายเป็นว่างจะถูกตัดออกจากสำเนา replay ส่วนเทิร์นของผู้ใช้และผลลัพธ์ของ tool ที่กลายเป็นว่างจะได้รับ placeholder omitted-content ที่ไม่ว่าง
กฎสากล: tool call ที่ผิดรูปแบบ
บล็อก tool-call ของ assistant ที่ไม่มีทั้ง input และ arguments จะถูกตัดออกก่อนสร้างบริบทของโมเดล สิ่งนี้ป้องกันการถูกปฏิเสธจากผู้ให้บริการเนื่องจาก tool call ที่คงอยู่บางส่วน (เช่น หลังจากความล้มเหลวจาก rate limit)
การใช้งาน:
sanitizeToolCallInputsในsrc/agents/session-transcript-repair.ts- ใช้ใน
sanitizeSessionHistoryในsrc/agents/pi-embedded-runner/replay-history.ts
กฎสากล: ที่มาของอินพุตข้ามเซสชัน
เมื่อ agent ส่งพรอมป์เข้าไปยังอีกเซสชันผ่าน sessions_send (รวมถึงขั้นตอน reply/announce ระหว่าง agent) OpenClaw จะคงเทิร์นผู้ใช้ที่สร้างขึ้นพร้อมกับ:
message.provenance.kind = "inter_session"
OpenClaw ยังเติม marker [Inter-session message ... isUser=false] ในเทิร์นเดียวกันไว้หน้าข้อความพรอมป์ที่ routed เพื่อให้การเรียกโมเดลที่กำลังทำงานสามารถแยกแยะเอาต์พุตจากเซสชันอื่นออกจากคำสั่งของผู้ใช้ปลายทางภายนอกได้ marker นี้รวมเซสชันต้นทาง แชนเนล และ tool เมื่อมีอยู่ ทรานสคริปต์ยังคงใช้ role: "user" เพื่อความเข้ากันได้กับผู้ให้บริการ แต่ทั้งข้อความที่มองเห็นได้และ metadata ที่มาจะทำเครื่องหมายเทิร์นว่าเป็นข้อมูลข้ามเซสชัน
ระหว่างการสร้างบริบทใหม่ OpenClaw ใช้ marker เดียวกันกับเทิร์นผู้ใช้ข้ามเซสชันที่คงอยู่รุ่นเก่าซึ่งมีเฉพาะ metadata ที่มา
เมทริกซ์ผู้ให้บริการ (พฤติกรรมปัจจุบัน)
OpenAI / OpenAI Codex
- ทำความสะอาดรูปภาพเท่านั้น
- ตัดลายเซ็น reasoning ที่ไม่มีคู่ (รายการ reasoning แบบ standalone ที่ไม่มีบล็อกเนื้อหาตามมา) สำหรับทรานสคริปต์ OpenAI Responses/Codex และตัด reasoning ของ OpenAI ที่ replay ได้หลังจากเปลี่ยนเส้นทางโมเดล
- คงเพย์โหลดรายการ reasoning ของ OpenAI Responses ที่ replay ได้ รวมถึงรายการ encrypted empty-summary เพื่อให้การ replay แบบ manual/WebSocket รักษาสถานะ
rs_*ที่จำเป็นให้จับคู่กับรายการเอาต์พุตของ assistant - Native ChatGPT Codex Responses ตาม wire parity ของ Codex โดย replay เพย์โหลด Responses reasoning/message/function ก่อนหน้าโดยไม่มี item ID ก่อนหน้า พร้อมคง
prompt_cache_keyของเซสชัน - ไม่มีการทำความสะอาด id ของ tool call
- การซ่อมแซมการจับคู่ผลลัพธ์ของ tool อาจย้ายเอาต์พุตจริงที่จับคู่แล้วและสังเคราะห์เอาต์พุต
abortedแบบ Codex สำหรับ tool call ที่หายไป - ไม่มีการตรวจสอบความถูกต้องหรือจัดลำดับเทิร์นใหม่
- เอาต์พุต tool ของตระกูล OpenAI Responses ที่หายไปจะถูกสังเคราะห์เป็น
abortedเพื่อให้ตรงกับการทำให้ replay ของ Codex เป็นมาตรฐาน - ไม่มีการตัดลายเซ็นความคิด
OpenAI-compatible Gemma 4
- บล็อก thinking/reasoning ของ assistant ในอดีตจะถูกตัดก่อน replay เพื่อให้เซิร์ฟเวอร์ Gemma 4 แบบ OpenAI-compatible ในเครื่องไม่ได้รับเนื้อหา reasoning จากเทิร์นก่อนหน้า
- การต่อเนื่องของ tool-call ในเทิร์นเดียวกันปัจจุบันจะคงบล็อก reasoning ของ assistant ที่แนบกับ tool call ไว้จนกว่าจะ replay ผลลัพธ์ของ tool แล้ว
Google (Generative AI / Gemini CLI / Antigravity)
- การทำความสะอาด id ของ tool call: alphanumeric อย่างเข้มงวด
- การซ่อมแซมการจับคู่ผลลัพธ์ของ tool และผลลัพธ์ tool สังเคราะห์
- การตรวจสอบความถูกต้องของเทิร์น (การสลับเทิร์นแบบ Gemini)
- การแก้ลำดับเทิร์นของ Google (เติม user bootstrap ขนาดเล็กไว้ด้านหน้าหากประวัติเริ่มด้วย assistant)
- Antigravity Claude: ทำให้ลายเซ็น thinking เป็นมาตรฐาน; ตัดบล็อก thinking ที่ไม่ได้ลงนาม
Anthropic / Minimax (Anthropic-compatible)
- การซ่อมแซมการจับคู่ผลลัพธ์ของ tool และผลลัพธ์ tool สังเคราะห์
- การตรวจสอบความถูกต้องของเทิร์น (รวมเทิร์นผู้ใช้ที่ต่อเนื่องกันเพื่อให้เป็นไปตามการสลับที่เข้มงวด)
- เทิร์น assistant prefill ท้ายสุดจะถูกตัดออกจากเพย์โหลด Anthropic Messages ขาออกเมื่อเปิดใช้ thinking รวมถึงเส้นทาง Cloudflare AI Gateway
- บล็อก thinking ที่ไม่มีลายเซ็น replay, ลายเซ็นว่าง หรือมีแต่ช่องว่างจะถูกตัดก่อนการแปลงสำหรับผู้ให้บริการ หากสิ่งนั้นทำให้เทิร์น assistant ว่าง OpenClaw จะคงรูปทรงของเทิร์นไว้ด้วยข้อความ omitted-reasoning ที่ไม่ว่าง
- เทิร์น assistant รุ่นเก่าที่มีเฉพาะ thinking และต้องถูกตัดจะถูกแทนที่ด้วยข้อความ omitted-reasoning ที่ไม่ว่าง เพื่อให้อะแดปเตอร์ผู้ให้บริการไม่ตัดเทิร์น replay ออก
Amazon Bedrock (Converse API)
- เทิร์นข้อผิดพลาดสตรีมของ assistant ที่ว่างเปล่าจะถูกซ่อมแซมเป็นบล็อกข้อความ fallback ที่ไม่ว่างก่อน replay Bedrock Converse ปฏิเสธข้อความ assistant ที่มี
content: []ดังนั้นเทิร์น assistant ที่คงอยู่พร้อมstopReason: "error"และเนื้อหาว่างจึงถูกซ่อมแซมบนดิสก์ก่อนโหลดด้วย - เทิร์นข้อผิดพลาดสตรีมของ assistant ที่มีเฉพาะบล็อกข้อความว่างจะถูกตัดออกจากสำเนา replay ในหน่วยความจำ แทนที่จะ replay บล็อกว่างที่ไม่ถูกต้อง
- บล็อก thinking ของ Claude ที่ไม่มีลายเซ็น replay, ลายเซ็นว่าง หรือมีแต่ช่องว่างจะถูกตัดก่อนการ replay ของ Converse หากสิ่งนั้นทำให้เทิร์น assistant ว่าง OpenClaw จะคงรูปทรงของเทิร์นไว้ด้วยข้อความ omitted-reasoning ที่ไม่ว่าง
- เทิร์น assistant รุ่นเก่าที่มีเฉพาะ thinking และต้องถูกตัดจะถูกแทนที่ด้วยข้อความ omitted-reasoning ที่ไม่ว่าง เพื่อให้การ replay ของ Converse คงรูปทรงเทิร์นที่เข้มงวดไว้
- การ replay จะกรองเทิร์น assistant แบบ delivery-mirror ของ OpenClaw และเทิร์นที่ Gateway แทรกเข้ามา
- การทำความสะอาดรูปภาพใช้ผ่านกฎสากล
Mistral (รวมถึงการตรวจจับตาม model-id)
- การทำความสะอาด id ของ tool call: strict9 (alphanumeric ความยาว 9)
OpenRouter Gemini
- การล้างลายเซ็นความคิด: ตัดค่า
thought_signatureที่ไม่ใช่ base64 (คง base64 ไว้)
OpenRouter Anthropic
- เทิร์น assistant prefill ท้ายสุดจะถูกตัดออกจากเพย์โหลดโมเดล Anthropic แบบ OpenAI-compatible ของ OpenRouter ที่ผ่านการยืนยันแล้วเมื่อเปิดใช้ reasoning ให้ตรงกับพฤติกรรม replay ของ Anthropic โดยตรงและ Cloudflare Anthropic
อย่างอื่นทั้งหมด
- ทำความสะอาดรูปภาพเท่านั้น
พฤติกรรมในอดีต (ก่อน 2026.1.22)
ก่อนรุ่น 2026.1.22 OpenClaw ใช้สุขอนามัยทรานสคริปต์หลายชั้น:
- transcript-sanitize extension ทำงานทุกครั้งที่สร้างบริบทและสามารถ:
- ซ่อมแซมการจับคู่ tool use/result
- ทำความสะอาด id ของ tool call (รวมถึงโหมดไม่เข้มงวดที่คง
_/-ไว้)
- ตัวรันยังทำการทำความสะอาดเฉพาะผู้ให้บริการ ซึ่งทำงานซ้ำซ้อน
- มีการกลายพันธุ์เพิ่มเติมนอกนโยบายผู้ให้บริการ รวมถึง:
- ตัดแท็ก
<final>ออกจากข้อความ assistant ก่อนคงอยู่ - ตัดเทิร์นข้อผิดพลาดของ assistant ที่ว่างเปล่า
- ตัดเนื้อหา assistant หลังจาก tool call
- ตัดแท็ก
ความซับซ้อนนี้ทำให้เกิด regression ข้ามผู้ให้บริการ (โดยเฉพาะการจับคู่ call_id|fc_id ของ openai-responses) การล้างใน 2026.1.22 นำ extension ออก รวมตรรกะไว้ที่ตัวรัน และทำให้ OpenAI เป็นแบบ no-touch นอกเหนือจากการทำความสะอาดรูปภาพ