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

เนื้อหาที่เกี่ยวข้อง

Was this useful?
On this page

On this page