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)
กฎส่วนกลาง: การจับคู่ผลลัพธ์ของเครื่องมือ
ผลลัพธ์ของเครื่องมือจะถูกจับคู่กับเหตุการณ์การเรียกเครื่องมือภายในแต่ละรอบสนทนาของผู้ช่วย ก่อน เขียนรหัสการเรียกใหม่ตามผู้ให้บริการ รหัสที่ผู้ให้บริการสร้างอาจปรากฏซ้ำในรอบสนทนาถัดไป ดังนั้นผลลัพธ์ที่อยู่ติดกับการเรียกซ้ำจะยังคงจับคู่กับเหตุการณ์นั้น ผลลัพธ์ที่อยู่ผิดตำแหน่ง จะถูกย้ายเฉพาะเมื่อมีเหตุการณ์ที่ยังไม่ได้รับการแก้ไขเพียงหนึ่งรายการเท่านั้นที่สามารถเป็นเจ้าของได้ รายการส่วนเกินที่กำกวมจะถูกนำออก และเหตุการณ์ที่ขาดผลลัพธ์จะได้รับผลลัพธ์ข้อผิดพลาดสังเคราะห์
การนำไปใช้: sanitizeToolUseResultPairing ใน
src/agents/session-transcript-repair.ts
กฎส่วนกลาง: รอบสนทนาที่มีเฉพาะการให้เหตุผลซึ่งไม่สมบูรณ์หรือไม่มีคำตอบ
รอบสนทนาของผู้ช่วยจะถูกละเว้นจากสำเนาสำหรับเล่นซ้ำในหน่วยความจำ เมื่อมี เฉพาะเนื้อหากระบวนการคิดหรือกระบวนการคิดที่ปกปิดแล้ว หลังเกิดเหตุการณ์ใดเหตุการณ์หนึ่งต่อไปนี้:
- ขีดจำกัดเอาต์พุตของผู้ให้บริการสิ้นสุดรอบสนทนาโดยที่สถานะการให้เหตุผลยังไม่สมบูรณ์
- การล้างคำตอบแบบไม่มีข้อความจะลบข้อความ
NO_REPLYที่มองเห็นได้เพียงรายการเดียวของรอบสนทนา
การล้างคำตอบแบบไม่มีข้อความช่วยป้องกันไม่ให้การให้เหตุผลที่ซ่อนอยู่ถูกรวมเข้ากับ รอบสนทนาการใช้เครื่องมือของผู้ช่วยในภายหลัง เมื่อผู้ให้บริการที่เข้มงวดสร้างบทสนทนาใหม่
รอบสนทนาที่ว่างเพราะถึงขีดจำกัดความยาวจะคงเดิม เช่นเดียวกับรอบสนทนาที่ถึงขีดจำกัดความยาว แต่มีข้อความที่มองเห็นได้ การเรียกเครื่องมือ หรือบล็อกเนื้อหาที่ไม่รู้จัก รอบสนทนาแบบไม่มีข้อความ ที่มีการเรียกเครื่องมือหรือบล็อกเนื้อหาที่ไม่รู้จักจะคงเดิมเช่นกัน ทรานสคริปต์ที่จัดเก็บไว้ จะไม่ถูกเขียนใหม่
การนำไปใช้: 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 ปฏิเสธคำขอด้วย "Invalid signature in thinking block" ข้อความกระบวนการคิด จะถูกเก็บไว้เป็นบล็อกที่ไม่มีลายเซ็น แล้วจึงจัดการตามกฎด้านล่าง
- บล็อกกระบวนการคิดที่ไม่มีลายเซ็นสำหรับเล่นซ้ำ หรือลายเซ็นว่างหรือมีแต่ช่องว่าง จะถูกตัดออกก่อนแปลงสำหรับผู้ให้บริการ หากทำให้รอบสนทนาของผู้ช่วยว่างเปล่า 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 โดยตรงและ Cloudflare Anthropic
อื่น ๆ ทั้งหมด
- ปรับรูปภาพให้ปลอดภัยเท่านั้น
พฤติกรรมในอดีต (ก่อน 2026.1.22)
ก่อนรีลีส 2026.1.22 OpenClaw ใช้การดูแลความถูกต้องของทรานสคริปต์ หลายชั้น:
- ส่วนขยาย transcript-sanitize ทำงานทุกครั้งที่สร้างบริบทและสามารถ:
- ซ่อมแซมการจับคู่การใช้เครื่องมือ/ผลลัพธ์
- ปรับรหัสการเรียกใช้เครื่องมือให้ปลอดภัย (รวมถึงโหมดไม่เคร่งครัดที่คง
_/-ไว้)
- ตัวรันยังดำเนินการปรับข้อมูลให้ปลอดภัยเฉพาะสำหรับผู้ให้บริการ ซึ่ง เป็นการทำงานซ้ำซ้อน
- มีการเปลี่ยนแปลงเพิ่มเติมเกิดขึ้นนอกนโยบายของผู้ให้บริการ รวมถึง
การตัดแท็ก
<final>ออกจากข้อความของผู้ช่วยก่อนบันทึก การละทิ้ง เทิร์นข้อผิดพลาดของผู้ช่วยที่ว่างเปล่า และการตัดเนื้อหาของผู้ช่วยหลังจาก เรียกใช้เครื่องมือ
ความซับซ้อนนี้ทำให้เกิดการถดถอยข้ามผู้ให้บริการ (โดยเฉพาะการจับคู่
openai-responses call_id|fc_id) การปรับปรุงเมื่อ 2026.1.22 ได้ลบ
ส่วนขยายดังกล่าว รวมตรรกะไว้ที่ตัวรัน และกำหนดให้ OpenAI ไม่แก้ไข
นอกเหนือจากการปรับรูปภาพให้ปลอดภัย