---
read_when:
    - คุณกำลังดีบักการปฏิเสธคำขอของผู้ให้บริการที่ผูกกับรูปแบบของ transcript
    - คุณกำลังเปลี่ยนตรรกะการทำความสะอาด transcript หรือการซ่อมแซมการเรียก tool
    - คุณกำลังตรวจสอบความไม่ตรงกันของ id การเรียก tool ระหว่างผู้ให้บริการ տարբեր ๆ
summary: 'เอกสารอ้างอิง: กฎการทำความสะอาดและซ่อมแซม transcript ที่เฉพาะกับผู้ให้บริการ'
title: สุขอนามัยของ transcript
x-i18n:
    generated_at: "2026-04-26T11:41:48Z"
    model: gpt-5.4
    provider: openai
    source_hash: e380be2b011afca5fedf89579e702c6d221d42e777c23bd766c8df07ff05ed18
    source_path: reference/transcript-hygiene.md
    workflow: 15
---

เอกสารนี้อธิบาย **การแก้ไขเฉพาะผู้ให้บริการ** ที่ถูกนำไปใช้กับ transcript ก่อนการรัน (การสร้างบริบทของโมเดล) การปรับส่วนใหญ่เป็นการแก้ไข **ในหน่วยความจำ** เพื่อให้เป็นไปตามข้อกำหนดที่เข้มงวดของผู้ให้บริการ นอกจากนี้ยังมีขั้นตอนซ่อมแซมไฟล์เซสชันแยกต่างหากที่อาจเขียน JSONL ที่จัดเก็บไว้ใหม่ก่อนโหลดเซสชัน โดยอาจเป็นการทิ้งบรรทัด JSONL ที่ผิดรูปแบบ หรือซ่อมแซม turn ที่ถูกบันทึกไว้ซึ่งมีไวยากรณ์ถูกต้องแต่ทราบกันว่าจะถูกผู้ให้บริการปฏิเสธระหว่างการเล่นซ้ำ เมื่อเกิดการซ่อมแซม ไฟล์ต้นฉบับจะถูกสำรองไว้ข้างไฟล์เซสชัน

ขอบเขตประกอบด้วย:

- บริบท prompt แบบ runtime-only ที่ไม่ปะปนกับ turn ของ transcript ที่ผู้ใช้มองเห็น
- การทำความสะอาด id การเรียก tool
- การตรวจสอบความถูกต้องของอินพุตการเรียก tool
- การซ่อมแซมการจับคู่ผลลัพธ์ของ tool
- การตรวจสอบ / การจัดลำดับ turn
- การล้างลายเซ็น thought
- การล้างลายเซ็น thinking
- การทำความสะอาด payload ภาพ
- การติดแท็กแหล่งที่มาของอินพุตผู้ใช้ (สำหรับ prompt ที่ถูกส่งข้ามเซสชัน)
- การซ่อมแซม turn ข้อผิดพลาดของ assistant แบบว่างสำหรับการเล่นซ้ำของ Bedrock Converse

หากคุณต้องการรายละเอียดการจัดเก็บ transcript ดูได้ที่:

- [เจาะลึกการจัดการเซสชัน](/th/reference/session-management-compaction)

---

## กฎส่วนกลาง: บริบทรันไทม์ไม่ใช่ transcript ของผู้ใช้

บริบท runtime/system สามารถถูกเพิ่มเข้าไปใน prompt ของโมเดลสำหรับ turn หนึ่งได้ แต่ไม่ใช่เนื้อหาที่ผู้ใช้ปลายทางเป็นผู้เขียน OpenClaw แยกเนื้อหา prompt ที่หันหน้าไปทาง transcript ต่างหากสำหรับการตอบกลับของ Gateway, การติดตามผลที่อยู่ในคิว, ACP, CLI และการรัน Pi แบบฝัง turn ผู้ใช้ที่มองเห็นได้และถูกจัดเก็บจะใช้เนื้อหา transcript นั้นแทน prompt ที่ถูกเพิ่มบริบทรันไทม์

สำหรับเซสชันแบบเดิมที่เคยบันทึกตัวห่อรันไทม์ไว้แล้ว surface ประวัติของ Gateway จะใช้ display projection ก่อนส่งข้อความกลับไปยังไคลเอนต์ WebChat, TUI, REST หรือ SSE

---

## จุดที่สิ่งนี้ทำงาน

สุขอนามัยของ transcript ทั้งหมดถูกรวมศูนย์ไว้ใน embedded runner:

- การเลือกนโยบาย: `src/agents/transcript-policy.ts`
- การใช้การทำความสะอาด/ซ่อมแซม: `sanitizeSessionHistory` ใน `src/agents/pi-embedded-runner/replay-history.ts`

นโยบายจะใช้ `provider`, `modelApi` และ `modelId` เพื่อตัดสินใจว่าจะใช้สิ่งใด

แยกจากสุขอนามัยของ transcript ไฟล์เซสชันจะถูกซ่อมแซม (หากจำเป็น) ก่อนโหลด:

- `repairSessionFileIfNeeded` ใน `src/agents/session-file-repair.ts`
- ถูกเรียกจาก `run/attempt.ts` และ `compact.ts` (embedded runner)

---

## กฎส่วนกลาง: การทำความสะอาดภาพ

payload ภาพจะถูกทำความสะอาดเสมอเพื่อป้องกันการปฏิเสธจากฝั่งผู้ให้บริการอันเนื่องมาจากข้อจำกัดด้านขนาด (ลดขนาด/บีบอัดใหม่สำหรับภาพ base64 ที่มีขนาดใหญ่เกินไป)

สิ่งนี้ยังช่วยควบคุมแรงกดดันด้าน token จากภาพสำหรับโมเดลที่รองรับ vision ขนาดด้านสูงสุดที่เล็กลงมักช่วยลดการใช้ token; ขนาดที่สูงขึ้นจะคงรายละเอียดได้ดีกว่า

การใช้งาน:

- `sanitizeSessionMessagesImages` ใน `src/agents/pi-embedded-helpers/images.ts`
- `sanitizeContentBlocksImages` ใน `src/agents/tool-images.ts`
- ด้านสูงสุดของภาพกำหนดค่าได้ผ่าน `agents.defaults.imageMaxDimensionPx` (ค่าเริ่มต้น: `1200`)

---

## กฎส่วนกลาง: การเรียก tool ที่ผิดรูปแบบ

บล็อกการเรียก tool ของ assistant ที่ไม่มีทั้ง `input` และ `arguments` จะถูกทิ้งก่อนสร้างบริบทของโมเดล วิธีนี้ช่วยป้องกันการปฏิเสธจากผู้ให้บริการอันเนื่องมาจากการเรียก tool ที่ถูกบันทึกไว้เพียงบางส่วน (เช่น หลังเกิดข้อผิดพลาดจากการจำกัดอัตรา)

การใช้งาน:

- `sanitizeToolCallInputs` ใน `src/agents/session-transcript-repair.ts`
- ถูกใช้ใน `sanitizeSessionHistory` ใน `src/agents/pi-embedded-runner/replay-history.ts`

---

## กฎส่วนกลาง: แหล่งที่มาของอินพุตข้ามเซสชัน

เมื่อ agent ส่ง prompt เข้าไปยังอีกเซสชันผ่าน `sessions_send` (รวมถึงขั้นตอนตอบกลับ/ประกาศจาก agent ไปยัง agent) OpenClaw จะบันทึก turn ผู้ใช้ที่ถูกสร้างขึ้นพร้อมกับ:

- `message.provenance.kind = "inter_session"`

ข้อมูลเมตานี้จะถูกเขียนตอน append ลง transcript และไม่เปลี่ยน role (`role: "user"` ยังคงเดิมเพื่อความเข้ากันได้กับผู้ให้บริการ) ตัวอ่าน transcript สามารถใช้สิ่งนี้เพื่อหลีกเลี่ยงการตีความ prompt ภายในที่ถูกส่งต่อว่าเป็นคำสั่งจากผู้ใช้ปลายทาง

ระหว่างการสร้างบริบทใหม่ OpenClaw จะเติมเครื่องหมายสั้น ๆ `[Inter-session message]` ไว้หน้าข้อความผู้ใช้เหล่านั้นในหน่วยความจำด้วย เพื่อให้โมเดลแยกแยะได้จากคำสั่งภายนอกจากผู้ใช้ปลายทาง

---

## เมทริกซ์ผู้ให้บริการ (พฤติกรรมปัจจุบัน)

**OpenAI / OpenAI Codex**

- ทำความสะอาดภาพเท่านั้น
- ทิ้งลายเซ็น reasoning ที่กำพร้า (รายการ reasoning เดี่ยว ๆ ที่ไม่มีบล็อกเนื้อหาตามมา) สำหรับ transcript ของ OpenAI Responses/Codex และทิ้ง reasoning ของ OpenAI ที่เล่นซ้ำได้หลังการสลับเส้นทางโมเดล
- ไม่มีการทำความสะอาด id การเรียก tool
- การซ่อมแซมการจับคู่ผลลัพธ์ของ tool อาจย้ายเอาต์พุตที่จับคู่ได้จริง และสังเคราะห์เอาต์พุต `aborted` แบบ Codex สำหรับการเรียก tool ที่ขาดหายไป
- ไม่มีการตรวจสอบ turn หรือการจัดเรียงใหม่
- เอาต์พุต tool ที่หายไปของตระกูล OpenAI Responses จะถูกสังเคราะห์เป็น `aborted` เพื่อให้ตรงกับการทำให้การเล่นซ้ำของ Codex เป็นมาตรฐาน
- ไม่มีการตัดลายเซ็น thought

**Google (Generative AI / Gemini CLI / Antigravity)**

- การทำความสะอาด id การเรียก tool: ต้องเป็นตัวอักษรและตัวเลขอย่างเคร่งครัด
- การซ่อมแซมการจับคู่ผลลัพธ์ของ tool และผลลัพธ์ tool แบบสังเคราะห์
- การตรวจสอบ turn (การสลับ turn แบบ Gemini)
- การแก้ไขลำดับ turn ของ Google (เติม bootstrap ผู้ใช้ขนาดเล็กมากไว้ด้านหน้า หากประวัติเริ่มต้นด้วย assistant)
- Antigravity Claude: ทำให้ลายเซ็น thinking เป็นมาตรฐาน; ทิ้งบล็อก thinking ที่ไม่มีลายเซ็น

**Anthropic / Minimax (เข้ากันได้กับ Anthropic)**

- การซ่อมแซมการจับคู่ผลลัพธ์ของ tool และผลลัพธ์ tool แบบสังเคราะห์
- การตรวจสอบ turn (รวม turn ผู้ใช้ที่ติดกันเพื่อให้เป็นไปตามการสลับอย่างเคร่งครัด)
- บล็อก thinking ที่ไม่มีลายเซ็นสำหรับการเล่นซ้ำ หรือมีลายเซ็นว่าง/เว้นวรรคเท่านั้น จะถูกตัดออกก่อนการแปลงสำหรับผู้ให้บริการ หากทำให้ turn ของ assistant ว่างเปล่า OpenClaw จะคงรูปทรงของ turn ไว้ด้วยข้อความ omitted-reasoning ที่ไม่ว่าง
- turn ของ assistant แบบ thinking-only รุ่นเก่าที่ต้องถูกตัดออก จะถูกแทนที่ด้วยข้อความ omitted-reasoning ที่ไม่ว่าง เพื่อไม่ให้ adapter ของผู้ให้บริการทิ้ง turn ในการเล่นซ้ำ

**Amazon Bedrock (Converse API)**

- turn ข้อผิดพลาดสตรีมของ assistant ที่ว่าง จะถูกซ่อมแซมให้เป็นบล็อกข้อความ fallback ที่ไม่ว่างก่อนเล่นซ้ำ Bedrock Converse ปฏิเสธข้อความ assistant ที่มี `content: []` ดังนั้น turn assistant ที่ถูกบันทึกไว้ซึ่งมี `stopReason: "error"` และเนื้อหาว่าง จะถูกซ่อมแซมบนดิสก์ก่อนโหลดด้วย
- บล็อก thinking ของ Claude ที่ไม่มีลายเซ็นสำหรับการเล่นซ้ำ หรือมีลายเซ็นว่าง/เว้นวรรคเท่านั้น จะถูกตัดออกก่อนการเล่นซ้ำผ่าน Converse หากทำให้ turn ของ assistant ว่างเปล่า OpenClaw จะคงรูปทรงของ turn ไว้ด้วยข้อความ omitted-reasoning ที่ไม่ว่าง
- turn ของ assistant แบบ thinking-only รุ่นเก่าที่ต้องถูกตัดออก จะถูกแทนที่ด้วยข้อความ omitted-reasoning ที่ไม่ว่าง เพื่อให้การเล่นซ้ำผ่าน Converse คงรูปทรงของ turn ที่เข้มงวดไว้
- การเล่นซ้ำจะกรอง turn ของ assistant ที่เป็น delivery-mirror ของ OpenClaw และ turn ที่ Gateway inject เข้ามา
- การทำความสะอาดภาพถูกใช้ผ่านกฎส่วนกลาง

**Mistral (รวมถึงการตรวจจับโดยอิง model-id)**

- การทำความสะอาด id การเรียก tool: strict9 (ตัวอักษรและตัวเลข ความยาว 9)

**OpenRouter Gemini**

- การล้างลายเซ็น thought: ตัดค่า `thought_signature` ที่ไม่ใช่ base64 ออก (คงค่า base64 ไว้)

**อย่างอื่นทั้งหมด**

- ทำความสะอาดภาพเท่านั้น

---

## พฤติกรรมในอดีต (ก่อน 2026.1.22)

ก่อนรีลีส 2026.1.22 OpenClaw ใช้สุขอนามัยของ transcript หลายชั้น:

- ส่วนขยาย **transcript-sanitize** ทำงานในการสร้างบริบททุกครั้ง และสามารถ:
  - ซ่อมแซมการจับคู่การใช้/ผลลัพธ์ของ tool
  - ทำความสะอาด id การเรียก tool (รวมถึงโหมดไม่เข้มงวดที่คง `_`/`-` ไว้)
- runner ยังทำการทำความสะอาดเฉพาะผู้ให้บริการด้วย ซึ่งทำงานซ้ำซ้อน
- มีการกลายพันธุ์เพิ่มเติมเกิดขึ้นนอกนโยบายของผู้ให้บริการ รวมถึง:
  - ตัดแท็ก `<final>` ออกจากข้อความของ assistant ก่อนการบันทึก
  - ทิ้ง turn ข้อผิดพลาดของ assistant ที่ว่าง
  - ตัดเนื้อหาของ assistant หลังการเรียก tool

ความซับซ้อนนี้ทำให้เกิด regression ข้ามผู้ให้บริการ (โดยเฉพาะการจับคู่ `call_id|fc_id` ของ `openai-responses`) การปรับปรุงใน 2026.1.22 ได้นำส่วนขยายออก รวมตรรกะไว้ที่ runner และทำให้ OpenAI เป็นแบบ **ไม่แตะต้อง** นอกเหนือจากการทำความสะอาดภาพ

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

- [การจัดการเซสชัน](/th/concepts/session)
- [การตัดทอนเซสชัน](/th/concepts/session-pruning)
