Nodes and media
ความเข้าใจสื่อ
OpenClaw สามารถสรุปสื่อขาเข้า (รูปภาพ/เสียง/วิดีโอ) ก่อนที่ไปป์ไลน์การตอบกลับจะทำงาน โดยตรวจจับอัตโนมัติเมื่อมีเครื่องมือภายในเครื่องหรือคีย์ของผู้ให้บริการ และสามารถปิดใช้งานหรือปรับแต่งได้ หากปิดการทำความเข้าใจ โมเดลจะยังได้รับไฟล์/URL ต้นฉบับตามปกติ
พฤติกรรมสื่อเฉพาะผู้ขายจะลงทะเบียนโดย Plugin ของผู้ขาย ขณะที่แกนหลักของ OpenClaw เป็นเจ้าของการกำหนดค่า tools.media ที่ใช้ร่วมกัน ลำดับ fallback และการผสานรวมกับไปป์ไลน์การตอบกลับ
เป้าหมาย
- ไม่บังคับ: ย่อยสื่อขาเข้าเบื้องต้นเป็นข้อความสั้นเพื่อการกำหนดเส้นทางที่เร็วขึ้น + การแยกวิเคราะห์คำสั่งที่ดีขึ้น
- รักษาการส่งสื่อต้นฉบับไปยังโมเดล (เสมอ)
- รองรับ API ของผู้ให้บริการ และ CLI fallbacks
- อนุญาตให้ใช้หลายโมเดลพร้อม fallback ตามลำดับ (ข้อผิดพลาด/ขนาด/หมดเวลา)
พฤติกรรมระดับสูง
รวบรวมไฟล์แนบ
รวบรวมไฟล์แนบขาเข้า (MediaPaths, MediaUrls, MediaTypes)
เลือกตามความสามารถ
สำหรับแต่ละความสามารถที่เปิดใช้งาน (รูปภาพ/เสียง/วิดีโอ) ให้เลือกไฟล์แนบตามนโยบาย (ค่าเริ่มต้น: รายการแรก)
เลือกโมเดล
เลือกรายการโมเดลที่มีสิทธิ์รายการแรก (ขนาด + ความสามารถ + การยืนยันตัวตน)
Fallback เมื่อเกิดความล้มเหลว
หากโมเดลล้มเหลวหรือสื่อมีขนาดใหญ่เกินไป ให้ fall back ไปยังรายการถัดไป
ใช้บล็อกเมื่อสำเร็จ
เมื่อสำเร็จ:
Bodyกลายเป็นบล็อก[Image],[Audio]หรือ[Video]- เสียงตั้งค่า
{{Transcript}}; การแยกวิเคราะห์คำสั่งใช้ข้อความคำบรรยายเมื่อมี มิฉะนั้นใช้ transcript - คำบรรยายจะถูกรักษาไว้เป็น
User text:ภายในบล็อก
หากการทำความเข้าใจล้มเหลวหรือถูกปิดใช้งาน โฟลว์การตอบกลับจะดำเนินต่อไป พร้อม body + ไฟล์แนบต้นฉบับ
ภาพรวมการกำหนดค่า
tools.media รองรับ โมเดลที่ใช้ร่วมกัน พร้อมการ override รายความสามารถ:
คีย์ระดับบนสุด
tools.media.models: รายการโมเดลที่ใช้ร่วมกัน (ใช้capabilitiesเพื่อควบคุม)tools.media.image/tools.media.audio/tools.media.video:- ค่าเริ่มต้น (
prompt,maxChars,maxBytes,timeoutSeconds,language) - การ override ผู้ให้บริการ (
baseUrl,headers,providerOptions) - ตัวเลือกเสียง Deepgram ผ่าน
tools.media.audio.providerOptions.deepgram - การควบคุมการ echo transcript เสียง (
echoTranscript, ค่าเริ่มต้นfalse;echoFormat) - รายการ
modelsรายความสามารถ แบบไม่บังคับ (ใช้ก่อนโมเดลที่ใช้ร่วมกัน) - นโยบาย
attachments(mode,maxAttachments,prefer) scope(การควบคุมแบบไม่บังคับตาม channel/chatType/session key)
- ค่าเริ่มต้น (
tools.media.concurrency: จำนวนการรันความสามารถพร้อมกันสูงสุด (ค่าเริ่มต้น 2)
{ tools: { media: { models: [ /* shared list */ ], image: { /* optional overrides */ }, audio: { /* optional overrides */ echoTranscript: true, echoFormat: '📝 "{transcript}"', }, video: { /* optional overrides */ }, }, },}รายการโมเดล
แต่ละรายการ models[] สามารถเป็น ผู้ให้บริการ หรือ CLI:
รายการผู้ให้บริการ
{ type: "provider", // default if omitted provider: "openai", model: "gpt-5.5", prompt: "Describe the image in <= 500 chars.", maxChars: 500, maxBytes: 10485760, timeoutSeconds: 60, capabilities: ["image"], // optional, used for multi-modal entries profile: "vision-profile", preferredProfile: "vision-fallback",}รายการ CLI
{ type: "cli", command: "gemini", args: [ "-m", "gemini-3-flash", "--allowed-tools", "read_file", "Read the media at {{MediaPath}} and describe it in <= {{MaxChars}} characters.", ], maxChars: 500, maxBytes: 52428800, timeoutSeconds: 120, capabilities: ["video", "image"],}เทมเพลต CLI ยังสามารถใช้:
{{MediaDir}}(ไดเรกทอรีที่มีไฟล์สื่อ){{OutputDir}}(ไดเรกทอรี scratch ที่สร้างสำหรับการรันนี้){{OutputBase}}(พาธฐานของไฟล์ scratch ไม่มีนามสกุล)
ข้อมูลประจำตัวผู้ให้บริการ (apiKey)
การทำความเข้าใจสื่อของผู้ให้บริการใช้การแก้ไขการยืนยันตัวตนผู้ให้บริการแบบเดียวกับการเรียกโมเดลปกติ: โปรไฟล์การยืนยันตัวตน ตัวแปรสภาพแวดล้อม จากนั้นคือ models.providers.<providerId>.apiKey
รายการ tools.media.*.models[] ไม่ยอมรับฟิลด์ apiKey แบบ inline ค่า provider ในรายการโมเดลสื่อ เช่น openai หรือ moonshot ต้องมีข้อมูลประจำตัวที่พร้อมใช้งานผ่านแหล่งการยืนยันตัวตนผู้ให้บริการมาตรฐานรายการใดรายการหนึ่ง
ตัวอย่างขั้นต่ำ:
{ models: { providers: { openai: { apiKey: "<OPENAI_API_KEY>" }, moonshot: { apiKey: "<MOONSHOT_API_KEY>" }, }, },}สำหรับอ้างอิงการยืนยันตัวตนผู้ให้บริการฉบับเต็ม รวมถึงโปรไฟล์ ตัวแปรสภาพแวดล้อม และ URL ฐานแบบกำหนดเอง โปรดดู เครื่องมือและผู้ให้บริการแบบกำหนดเอง
ค่าเริ่มต้นและขีดจำกัด
ค่าเริ่มต้นที่แนะนำ:
maxChars: 500 สำหรับรูปภาพ/วิดีโอ (สั้น เหมาะกับคำสั่ง)maxChars: ไม่ได้ตั้งค่า สำหรับเสียง (transcript เต็ม เว้นแต่คุณจะตั้งขีดจำกัด)maxBytes:- รูปภาพ: 10MB
- เสียง: 20MB
- วิดีโอ: 50MB
กฎ
- หากสื่อเกิน
maxBytesโมเดลนั้นจะถูกข้าม และจะ ลองโมเดลถัดไป - ไฟล์เสียงที่เล็กกว่า 1024 bytes จะถูกถือว่าว่าง/เสียหาย และถูกข้ามก่อนการถอดเสียงโดยผู้ให้บริการ/CLI; บริบทการตอบกลับขาเข้าจะได้รับ transcript placeholder แบบกำหนดแน่นอน เพื่อให้ agent รู้ว่าโน้ตนั้นเล็กเกินไป
- หากโมเดลส่งคืนมากกว่า
maxCharsเอาต์พุตจะถูกตัด promptมีค่าเริ่มต้นเป็น "Describe the {media}." แบบง่าย พร้อมคำแนะนำmaxChars(เฉพาะรูปภาพ/วิดีโอ)- หากโมเดลรูปภาพหลักที่ใช้งานอยู่รองรับ vision โดยตรงอยู่แล้ว OpenClaw จะข้ามบล็อกสรุป
[Image]และส่งรูปภาพต้นฉบับเข้าไปยังโมเดลแทน - หากโมเดลหลักของ Gateway/WebChat เป็นแบบข้อความเท่านั้น ไฟล์แนบรูปภาพจะถูกรักษาไว้เป็น refs
media://inbound/*ที่ offload แล้ว เพื่อให้เครื่องมือรูปภาพ/PDF หรือโมเดลรูปภาพที่กำหนดค่ายังสามารถตรวจสอบได้ แทนที่จะสูญเสียไฟล์แนบ - คำขอ
openclaw infer image describe --model <provider/model>แบบระบุชัดเจนแตกต่างออกไป: คำขอเหล่านี้รันผู้ให้บริการ/โมเดลที่รองรับรูปภาพนั้นโดยตรง รวมถึง refs ของ Ollama เช่นollama/qwen2.5vl:7b - หาก
<capability>.enabled: trueแต่ไม่มีการกำหนดค่าโมเดล OpenClaw จะลองใช้ โมเดลตอบกลับที่ใช้งานอยู่ เมื่อผู้ให้บริการรองรับความสามารถนั้น
ตรวจจับการทำความเข้าใจสื่ออัตโนมัติ (ค่าเริ่มต้น)
หาก tools.media.<capability>.enabled ไม่ได้ ตั้งเป็น false และคุณไม่ได้กำหนดค่าโมเดล OpenClaw จะตรวจจับอัตโนมัติตามลำดับนี้ และ หยุดที่ตัวเลือกแรกที่ทำงานได้:
โมเดลตอบกลับที่ใช้งานอยู่
โมเดลตอบกลับที่ใช้งานอยู่เมื่อผู้ให้บริการรองรับความสามารถนั้น
agents.defaults.imageModel
refs หลัก/fallback ของ agents.defaults.imageModel (เฉพาะรูปภาพ)
ควรใช้ refs provider/model refs แบบ bare จะถูก qualify จากรายการโมเดลผู้ให้บริการที่กำหนดค่าและรองรับรูปภาพเท่านั้น เมื่อมีรายการที่ตรงกันเพียงรายการเดียว
CLI ภายในเครื่อง (เฉพาะเสียง)
CLI ภายในเครื่อง (หากติดตั้งแล้ว):
sherpa-onnx-offline(ต้องใช้SHERPA_ONNX_MODEL_DIRพร้อม encoder/decoder/joiner/tokens)whisper-cli(whisper-cpp; ใช้WHISPER_CPP_MODELหรือโมเดล tiny ที่ bunded มา)whisper(Python CLI; ดาวน์โหลดโมเดลอัตโนมัติ)
Gemini CLI
gemini โดยใช้ read_many_files
การยืนยันตัวตนผู้ให้บริการ
- รายการ
models.providers.*ที่กำหนดค่าและรองรับความสามารถนั้นจะถูกลองก่อนลำดับ fallback ที่ bunded มา - ผู้ให้บริการใน config แบบเฉพาะรูปภาพที่มีโมเดลที่รองรับรูปภาพจะลงทะเบียนอัตโนมัติสำหรับการทำความเข้าใจสื่อ แม้จะไม่ใช่ Plugin ผู้ขายที่ bunded มา
- การทำความเข้าใจรูปภาพของ Ollama พร้อมใช้งานเมื่อเลือกอย่างชัดเจน เช่น ผ่าน
agents.defaults.imageModelหรือopenclaw infer image describe --model ollama/<vision-model>
ลำดับ fallback ที่ bunded มา:
- เสียง: OpenAI → Groq → xAI → Deepgram → OpenRouter → Google → SenseAudio → ElevenLabs → Mistral
- รูปภาพ: OpenAI → Anthropic → Google → MiniMax → MiniMax Portal → Z.AI
- วิดีโอ: Google → Qwen → Moonshot
หากต้องการปิดการตรวจจับอัตโนมัติ ให้ตั้งค่า:
{ tools: { media: { audio: { enabled: false, }, }, },}การรองรับสภาพแวดล้อมพร็อกซี (โมเดลผู้ให้บริการ)
เมื่อเปิดใช้งานการทำความเข้าใจสื่อแบบผู้ให้บริการสำหรับ เสียง และ วิดีโอ OpenClaw จะเคารพตัวแปรสภาพแวดล้อมพร็อกซีขาออกมาตรฐานสำหรับการเรียก HTTP ของผู้ให้บริการ:
HTTPS_PROXYHTTP_PROXYALL_PROXYhttps_proxyhttp_proxyall_proxy
หากไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อมพร็อกซี การทำความเข้าใจสื่อจะใช้ egress โดยตรง หากค่าพร็อกซีมีรูปแบบไม่ถูกต้อง OpenClaw จะบันทึกคำเตือนและ fallback ไปยังการ fetch โดยตรง
ความสามารถ (ไม่บังคับ)
หากคุณตั้งค่า capabilities รายการนั้นจะรันเฉพาะสื่อประเภทเหล่านั้น สำหรับรายการที่ใช้ร่วมกัน OpenClaw สามารถอนุมานค่าเริ่มต้นได้:
openai,anthropic,minimax: รูปภาพminimax-portal: รูปภาพmoonshot: รูปภาพ + วิดีโอopenrouter: รูปภาพ + เสียงgoogle(Gemini API): รูปภาพ + เสียง + วิดีโอqwen: รูปภาพ + วิดีโอmistral: เสียงzai: รูปภาพgroq: เสียงxai: เสียงdeepgram: เสียง- แค็ตตาล็อก
models.providers.<id>.models[]ใดก็ตามที่มีโมเดลที่รองรับรูปภาพ: รูปภาพ
สำหรับรายการ CLI ให้ ตั้งค่า capabilities อย่างชัดเจน เพื่อหลีกเลี่ยงการจับคู่ที่ไม่คาดคิด หากคุณละเว้น capabilities รายการนั้นจะมีสิทธิ์สำหรับรายการที่มันปรากฏอยู่
ตารางการรองรับของผู้ให้บริการ (การผสานรวมของ OpenClaw)
| ความสามารถ | การผสานรวมผู้ให้บริการ | หมายเหตุ |
|---|---|---|
| รูปภาพ | OpenAI, OpenAI Codex OAuth, Codex app-server, OpenRouter, Anthropic, Google, MiniMax, Moonshot, Qwen, Z.AI, ผู้ให้บริการใน config | Plugin ผู้ขายลงทะเบียนการรองรับรูปภาพ; openai/* สามารถใช้การกำหนดเส้นทางด้วย API-key หรือ Codex OAuth; codex/* ใช้ turn ของ Codex app-server แบบมีขอบเขต; MiniMax และ MiniMax OAuth ใช้ MiniMax-VL-01; ผู้ให้บริการใน config ที่รองรับรูปภาพลงทะเบียนอัตโนมัติ |
| เสียง | OpenAI, Groq, xAI, Deepgram, OpenRouter, Google, SenseAudio, ElevenLabs, Mistral | การถอดเสียงโดยผู้ให้บริการ (Whisper/Groq/xAI/Deepgram/OpenRouter STT/Gemini/SenseAudio/Scribe/Voxtral) |
| วิดีโอ | Google, Qwen, Moonshot | การทำความเข้าใจวิดีโอโดยผู้ให้บริการผ่าน Plugin ผู้ขาย; การทำความเข้าใจวิดีโอของ Qwen ใช้ endpoint Standard DashScope |
คำแนะนำในการเลือกโมเดล
- ควรเลือกโมเดลรุ่นล่าสุดที่แข็งแกร่งที่สุดที่มีให้สำหรับความสามารถด้านสื่อแต่ละประเภท เมื่อคุณภาพและความปลอดภัยเป็นสิ่งสำคัญ
- สำหรับเอเจนต์ที่เปิดใช้เครื่องมือและจัดการอินพุตที่ไม่น่าเชื่อถือ ให้หลีกเลี่ยงโมเดลสื่อที่เก่ากว่าหรืออ่อนแอกว่า
- เก็บ fallback อย่างน้อยหนึ่งรายการต่อความสามารถเพื่อความพร้อมใช้งาน (โมเดลคุณภาพ + โมเดลที่เร็วกว่า/ถูกกว่า)
- fallback ของ CLI (
whisper-cli,whisper,gemini) มีประโยชน์เมื่อ API ของผู้ให้บริการไม่พร้อมใช้งาน - หมายเหตุ
parakeet-mlx: เมื่อใช้--output-dirOpenClaw จะอ่าน<output-dir>/<media-basename>.txtเมื่อรูปแบบเอาต์พุตเป็นtxt(หรือไม่ได้ระบุ); รูปแบบที่ไม่ใช่txtจะ fallback ไปที่ stdout
นโยบายไฟล์แนบ
attachments ตามแต่ละความสามารถควบคุมว่าไฟล์แนบใดจะถูกประมวลผล:
mode"first" | "all"default: firstระบุว่าจะประมวลผลไฟล์แนบที่เลือกไฟล์แรกหรือประมวลผลทั้งหมด
maxAttachmentsnumberdefault: 1จำกัดจำนวนที่ประมวลผล
prefer"first" | "last" | "path" | "url"การกำหนดความชอบในการเลือกจากไฟล์แนบที่เป็นตัวเลือก
เมื่อ mode: "all" เอาต์พุตจะมีป้ายกำกับ [Image 1/2], [Audio 2/2] เป็นต้น
พฤติกรรมการดึงข้อมูลจากไฟล์แนบ
- ข้อความไฟล์ที่ดึงออกมาจะถูกห่อเป็น เนื้อหาภายนอกที่ไม่น่าเชื่อถือ ก่อนต่อท้ายลงในพรอมป์สื่อ
- บล็อกที่แทรกใช้ตัวทำเครื่องหมายขอบเขตอย่างชัดเจน เช่น
<<<EXTERNAL_UNTRUSTED_CONTENT id="...">>>/<<<END_EXTERNAL_UNTRUSTED_CONTENT id="...">>>และมีบรรทัดเมตาดาต้าSource: External - เส้นทางการดึงข้อมูลจากไฟล์แนบนี้ตั้งใจละเว้นแบนเนอร์
SECURITY NOTICE:แบบยาวเพื่อหลีกเลี่ยงการทำให้พรอมป์สื่อใหญ่เกินไป; ตัวทำเครื่องหมายขอบเขตและเมตาดาต้ายังคงอยู่ - หากไฟล์ไม่มีข้อความที่ดึงออกมาได้ OpenClaw จะแทรก
[No extractable text] - หาก PDF fallback ไปใช้รูปภาพหน้าที่เรนเดอร์ในเส้นทางนี้ OpenClaw จะส่งรูปภาพหน้าเหล่านั้นต่อไปยังโมเดลตอบกลับที่รองรับวิชัน และเก็บ placeholder
[PDF content rendered to images]ไว้ในบล็อกไฟล์
ตัวอย่างการกำหนดค่า
โมเดลที่ใช้ร่วมกัน + การเขียนทับ
{ tools: { media: { models: [ { provider: "openai", model: "gpt-5.5", capabilities: ["image"] }, { provider: "google", model: "gemini-3-flash-preview", capabilities: ["image", "audio", "video"], }, { type: "cli", command: "gemini", args: [ "-m", "gemini-3-flash", "--allowed-tools", "read_file", "Read the media at {{MediaPath}} and describe it in <= {{MaxChars}} characters.", ], capabilities: ["image", "video"], }, ], audio: { attachments: { mode: "all", maxAttachments: 2 }, }, video: { maxChars: 500, }, }, },}เฉพาะเสียง + วิดีโอ
{ tools: { media: { audio: { enabled: true, models: [ { provider: "openai", model: "gpt-4o-mini-transcribe" }, { type: "cli", command: "whisper", args: ["--model", "base", "{{MediaPath}}"], }, ], }, video: { enabled: true, maxChars: 500, models: [ { provider: "google", model: "gemini-3-flash-preview" }, { type: "cli", command: "gemini", args: [ "-m", "gemini-3-flash", "--allowed-tools", "read_file", "Read the media at {{MediaPath}} and describe it in <= {{MaxChars}} characters.", ], }, ], }, }, },}เฉพาะรูปภาพ
{ tools: { media: { image: { enabled: true, maxBytes: 10485760, maxChars: 500, models: [ { provider: "openai", model: "gpt-5.5" }, { provider: "anthropic", model: "claude-opus-4-6" }, { type: "cli", command: "gemini", args: [ "-m", "gemini-3-flash", "--allowed-tools", "read_file", "Read the media at {{MediaPath}} and describe it in <= {{MaxChars}} characters.", ], }, ], }, }, },}รายการเดียวแบบหลายโมดัล
{ tools: { media: { image: { models: [ { provider: "google", model: "gemini-3.1-pro-preview", capabilities: ["image", "video", "audio"], }, ], }, audio: { models: [ { provider: "google", model: "gemini-3.1-pro-preview", capabilities: ["image", "video", "audio"], }, ], }, video: { models: [ { provider: "google", model: "gemini-3.1-pro-preview", capabilities: ["image", "video", "audio"], }, ], }, }, },}เอาต์พุตสถานะ
เมื่อการทำความเข้าใจสื่อทำงาน /status จะมีบรรทัดสรุปสั้น ๆ:
📎 Media: image ok (openai/gpt-5.4) · audio skipped (maxBytes)สิ่งนี้แสดงผลลัพธ์ตามแต่ละความสามารถและผู้ให้บริการ/โมเดลที่เลือกเมื่อเกี่ยวข้อง
หมายเหตุ
- การทำความเข้าใจเป็นแบบ พยายามอย่างดีที่สุด ข้อผิดพลาดไม่บล็อกการตอบกลับ
- ไฟล์แนบยังคงถูกส่งไปยังโมเดลแม้ว่าจะปิดการทำความเข้าใจไว้
- ใช้
scopeเพื่อจำกัดตำแหน่งที่การทำความเข้าใจทำงาน (เช่น เฉพาะ DM)