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.ts
  • sanitizeContentBlocksImages ใน 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 นอกเหนือจากการทำความสะอาดรูปภาพ

ที่เกี่ยวข้อง