Plugin SDK reference
แมนิเฟสต์ของ Plugin
หน้านี้มีไว้สำหรับ แมนิเฟสต์ Plugin แบบเนทีฟของ OpenClaw เท่านั้น.
สำหรับเลย์เอาต์บันเดิลที่เข้ากันได้ โปรดดู บันเดิล Plugin.
รูปแบบบันเดิลที่เข้ากันได้ใช้ไฟล์แมนิเฟสต์ที่แตกต่างกัน:
- บันเดิล Codex:
.codex-plugin/plugin.json - บันเดิล Claude:
.claude-plugin/plugin.jsonหรือเลย์เอาต์คอมโพเนนต์ Claude เริ่มต้น ที่ไม่มีแมนิเฟสต์ - บันเดิล Cursor:
.cursor-plugin/plugin.json
OpenClaw ตรวจพบเลย์เอาต์บันเดิลเหล่านั้นโดยอัตโนมัติเช่นกัน แต่จะไม่ตรวจสอบ
กับสคีมา openclaw.plugin.json ที่อธิบายไว้ที่นี่.
สำหรับบันเดิลที่เข้ากันได้ ปัจจุบัน OpenClaw อ่านเมทาดาต้าบันเดิลพร้อมราก Skills
ที่ประกาศไว้ รากคำสั่ง Claude ค่าเริ่มต้น settings.json ของบันเดิล Claude,
ค่าเริ่มต้น LSP ของบันเดิล Claude และชุด hook ที่รองรับเมื่อเลย์เอาต์ตรงกับ
ความคาดหวังของรันไทม์ OpenClaw.
Plugin แบบเนทีฟของ OpenClaw ทุกตัว ต้อง ส่งไฟล์ openclaw.plugin.json ใน
ราก Plugin. OpenClaw ใช้แมนิเฟสต์นี้เพื่อตรวจสอบการกำหนดค่า
โดยไม่เรียกใช้โค้ด Plugin. แมนิเฟสต์ที่หายไปหรือไม่ถูกต้องจะถูกถือเป็น
ข้อผิดพลาดของ Plugin และบล็อกการตรวจสอบการกำหนดค่า.
ดูคู่มือระบบ Plugin ฉบับเต็ม: Plugins. สำหรับโมเดลความสามารถแบบเนทีฟและคำแนะนำความเข้ากันได้ภายนอกในปัจจุบัน: โมเดลความสามารถ.
ไฟล์นี้ทำอะไร
openclaw.plugin.json คือเมทาดาต้าที่ OpenClaw อ่าน ก่อนโหลดโค้ด
Plugin ของคุณ. ทุกอย่างด้านล่างต้องมีต้นทุนต่ำพอที่จะตรวจสอบได้โดยไม่ต้องบูต
รันไทม์ Plugin.
ใช้สำหรับ:
- ตัวตนของ Plugin, การตรวจสอบการกำหนดค่า และคำใบ้ UI การกำหนดค่า
- เมทาดาต้า auth, onboarding และ setup (alias, auto-enable, provider env vars, auth choices)
- คำใบ้การเปิดใช้งานสำหรับพื้นผิวระนาบควบคุม
- ความเป็นเจ้าของตระกูลโมเดลแบบย่อ
- สแนปช็อตแบบคงที่ของความเป็นเจ้าของความสามารถ (
contracts) - เมทาดาต้า QA runner ที่โฮสต์
openclaw qaแบบใช้ร่วมกันสามารถตรวจสอบได้ - เมทาดาต้าการกำหนดค่าเฉพาะช่องทางที่ผสานเข้ากับแค็ตตาล็อกและพื้นผิวการตรวจสอบ
อย่าใช้สำหรับ: การลงทะเบียนพฤติกรรมรันไทม์, การประกาศ entrypoints ของโค้ด,
หรือเมทาดาต้า npm install. สิ่งเหล่านั้นอยู่ในโค้ด Plugin ของคุณและ package.json.
ตัวอย่างขั้นต่ำ
{ "id": "voice-call", "configSchema": { "type": "object", "additionalProperties": false, "properties": {} }}ตัวอย่างแบบสมบูรณ์
{ "id": "openrouter", "name": "OpenRouter", "description": "OpenRouter provider plugin", "version": "1.0.0", "providers": ["openrouter"], "modelSupport": { "modelPrefixes": ["router-"] }, "modelIdNormalization": { "providers": { "openrouter": { "prefixWhenBare": "openrouter" } } }, "providerEndpoints": [ { "endpointClass": "openrouter", "hostSuffixes": ["openrouter.ai"] } ], "providerRequest": { "providers": { "openrouter": { "family": "openrouter" } } }, "cliBackends": ["openrouter-cli"], "syntheticAuthRefs": ["openrouter-cli"], "setup": { "providers": [ { "id": "openrouter", "envVars": ["OPENROUTER_API_KEY"] } ] }, "providerAuthAliases": { "openrouter-coding": "openrouter" }, "channelEnvVars": { "openrouter-chatops": ["OPENROUTER_CHATOPS_TOKEN"] }, "providerAuthChoices": [ { "provider": "openrouter", "method": "api-key", "choiceId": "openrouter-api-key", "choiceLabel": "OpenRouter API key", "groupId": "openrouter", "groupLabel": "OpenRouter", "optionKey": "openrouterApiKey", "cliFlag": "--openrouter-api-key", "cliOption": "--openrouter-api-key <key>", "cliDescription": "OpenRouter API key", "onboardingScopes": ["text-inference"] } ], "uiHints": { "apiKey": { "label": "API key", "placeholder": "sk-or-v1-...", "sensitive": true } }, "configSchema": { "type": "object", "additionalProperties": false, "properties": { "apiKey": { "type": "string" } } }}อ้างอิงฟิลด์ระดับบนสุด
| ฟิลด์ | จำเป็น | ชนิด | ความหมาย |
|---|---|---|---|
id |
ใช่ | string |
id ของ Plugin แบบมาตรฐาน นี่คือ id ที่ใช้ใน plugins.entries.<id> |
configSchema |
ใช่ | object |
JSON Schema แบบอินไลน์สำหรับ config ของ Plugin นี้ |
requiresPlugins |
ไม่ | string[] |
id ของ Plugin ที่ต้องติดตั้งด้วยเพื่อให้ Plugin นี้มีผล Discovery จะยังคงทำให้ Plugin โหลดได้ แต่จะแจ้งเตือนเมื่อ Plugin ที่จำเป็นขาดหายไป |
enabledByDefault |
ไม่ | true |
ทำเครื่องหมาย Plugin ที่ bundled ว่าเปิดใช้งานตามค่าเริ่มต้น ละเว้นค่านี้ หรือตั้งค่าเป็นค่าใดก็ตามที่ไม่ใช่ true เพื่อปล่อยให้ Plugin ปิดใช้งานตามค่าเริ่มต้น |
enabledByDefaultOnPlatforms |
ไม่ | string[] |
ทำเครื่องหมาย Plugin ที่ bundled ว่าเปิดใช้งานตามค่าเริ่มต้นเฉพาะบนแพลตฟอร์ม Node.js ที่ระบุไว้ เช่น ["darwin"] config ที่ระบุไว้อย่างชัดเจนยังคงมีผลเหนือกว่า |
legacyPluginIds |
ไม่ | string[] |
id เดิมที่ normalize เป็น id ของ Plugin แบบมาตรฐานนี้ |
autoEnableWhenConfiguredProviders |
ไม่ | string[] |
id ของ provider ที่ควรเปิดใช้ Plugin นี้โดยอัตโนมัติเมื่อ auth, config หรือ model refs กล่าวถึง provider เหล่านั้น |
kind |
ไม่ | "memory" | "context-engine" |
ประกาศชนิด Plugin แบบ exclusive ที่ใช้โดย plugins.slots.* |
channels |
ไม่ | string[] |
id ของ channel ที่ Plugin นี้เป็นเจ้าของ ใช้สำหรับ discovery และการตรวจสอบ config |
providers |
ไม่ | string[] |
id ของ provider ที่ Plugin นี้เป็นเจ้าของ |
providerCatalogEntry |
ไม่ | string |
พาธโมดูล provider-catalog แบบเบา ซึ่งสัมพันธ์กับรากของ Plugin สำหรับ metadata ของ provider catalog ที่อยู่ในขอบเขต manifest ซึ่งโหลดได้โดยไม่ต้องเปิดใช้งาน runtime เต็มของ Plugin |
modelSupport |
ไม่ | object |
metadata ตระกูลโมเดลแบบย่อที่ manifest เป็นเจ้าของ ใช้เพื่อโหลด Plugin อัตโนมัติก่อน runtime |
modelCatalog |
ไม่ | object |
metadata ของ model catalog แบบ declarative สำหรับ provider ที่ Plugin นี้เป็นเจ้าของ นี่คือสัญญา control-plane สำหรับการแสดงรายการแบบอ่านอย่างเดียวในอนาคต, onboarding, ตัวเลือกโมเดล, aliases และ suppression โดยไม่ต้องโหลด runtime ของ Plugin |
modelPricing |
ไม่ | object |
นโยบาย lookup ราคาภายนอกที่ provider เป็นเจ้าของ ใช้เพื่อยกเว้น provider แบบ local/self-hosted ออกจาก remote pricing catalogs หรือ map provider refs ไปยัง id ของ OpenRouter/LiteLLM catalog โดยไม่ hardcode id ของ provider ใน core |
modelIdNormalization |
ไม่ | object |
การล้าง alias/prefix ของ model-id ที่ provider เป็นเจ้าของ ซึ่งต้องทำงานก่อนโหลด runtime ของ provider |
providerEndpoints |
ไม่ | object[] |
metadata ของ endpoint host/baseUrl ที่ manifest เป็นเจ้าของ สำหรับ route ของ provider ที่ core ต้องจัดประเภทก่อนโหลด runtime ของ provider |
providerRequest |
ไม่ | object |
metadata ของตระกูล provider และความเข้ากันได้ของคำขอแบบประหยัด ที่ใช้โดยนโยบายคำขอทั่วไปก่อนโหลด runtime ของ provider |
secretProviderIntegrations |
ไม่ | Record<string, object> |
preset ของ SecretRef exec provider แบบ declarative ที่พื้นผิว setup หรือ install สามารถเสนอได้โดยไม่ต้อง hardcode integration เฉพาะ provider ใน core |
cliBackends |
ไม่ | string[] |
id ของ backend การ inference ของ CLI ที่ Plugin นี้เป็นเจ้าของ ใช้สำหรับการเปิดใช้งานอัตโนมัติเมื่อเริ่มต้นจาก config refs ที่ระบุไว้อย่างชัดเจน |
syntheticAuthRefs |
ไม่ | string[] |
refs ของ provider หรือ CLI backend ที่ควร probe hook synthetic auth ซึ่ง Plugin เป็นเจ้าของ ระหว่าง cold model discovery ก่อนโหลด runtime |
nonSecretAuthMarkers |
ไม่ | string[] |
ค่า placeholder ของ API key ที่ Plugin แบบ bundled เป็นเจ้าของ ซึ่งแทนสถานะ credential แบบ local, OAuth หรือ ambient ที่ไม่ใช่ความลับ |
commandAliases |
ไม่ | object[] |
ชื่อคำสั่งที่ Plugin นี้เป็นเจ้าของ ซึ่งควรสร้าง diagnostics ของ config และ CLI ที่รับรู้ Plugin ก่อนโหลด runtime |
providerAuthEnvVars |
ไม่ | Record<string, string[]> |
metadata ของ env สำหรับความเข้ากันได้ที่เลิกใช้แล้ว สำหรับการ lookup auth/status ของ provider ควรใช้ setup.providers[].envVars สำหรับ Plugin ใหม่ OpenClaw ยังอ่านค่านี้ระหว่างช่วง deprecation |
providerAuthAliases |
ไม่ | Record<string, string> |
id ของ provider ที่ควรใช้ id ของ provider อื่นซ้ำสำหรับการ lookup auth เช่น provider สำหรับ coding ที่แชร์ API key และ auth profiles ของ provider พื้นฐาน |
channelEnvVars |
ไม่ | Record<string, string[]> |
metadata ของ env สำหรับ channel แบบประหยัดที่ OpenClaw สามารถตรวจสอบได้โดยไม่ต้องโหลดโค้ด Plugin ใช้สำหรับการตั้งค่า channel ที่ขับเคลื่อนด้วย env หรือพื้นผิว auth ที่ helper ทั่วไปของ startup/config ควรมองเห็น |
providerAuthChoices |
ไม่ | object[] |
metadata ของตัวเลือก auth แบบประหยัดสำหรับ onboarding pickers, การ resolve preferred-provider และการเชื่อม CLI flag อย่างง่าย |
activation |
ไม่ | object |
metadata ของ activation planner แบบประหยัดสำหรับการโหลดที่ถูก trigger โดย startup, provider, command, channel, route และ capability เป็นเพียง metadata เท่านั้น; runtime ของ Plugin ยังคงเป็นเจ้าของพฤติกรรมจริง |
setup |
ไม่ | object |
descriptor ของ setup/onboarding แบบประหยัดที่ discovery และพื้นผิว setup สามารถตรวจสอบได้โดยไม่ต้องโหลด runtime ของ Plugin |
qaRunners |
ไม่ | object[] |
descriptor ของ QA runner แบบประหยัดที่ใช้โดย host openclaw qa ที่แชร์ร่วมกัน ก่อนโหลด runtime ของ Plugin |
contracts |
ไม่ | object |
snapshot ความเป็นเจ้าของ capability แบบ static สำหรับ external auth hooks, embeddings, speech, realtime transcription, realtime voice, media-understanding, image-generation, music-generation, video-generation, web-fetch, web search และความเป็นเจ้าของ tool |
mediaUnderstandingProviderMetadata |
ไม่ | Record<string, object> |
ค่าเริ่มต้นของ media-understanding แบบประหยัดสำหรับ id ของ provider ที่ประกาศใน contracts.mediaUnderstandingProviders |
imageGenerationProviderMetadata |
ไม่ | Record<string, object> |
metadata ของ auth สำหรับ image-generation แบบประหยัดสำหรับ id ของ provider ที่ประกาศใน contracts.imageGenerationProviders รวมถึง auth aliases และ base-url guards ที่ provider เป็นเจ้าของ |
videoGenerationProviderMetadata |
ไม่ | Record<string, object> |
metadata ของ auth สำหรับ video-generation แบบประหยัดสำหรับ id ของ provider ที่ประกาศใน contracts.videoGenerationProviders รวมถึง auth aliases และ base-url guards ที่ provider เป็นเจ้าของ |
musicGenerationProviderMetadata |
ไม่ | Record<string, object> |
metadata ของ auth สำหรับ music-generation แบบประหยัดสำหรับ id ของ provider ที่ประกาศใน contracts.musicGenerationProviders รวมถึง auth aliases และ base-url guards ที่ provider เป็นเจ้าของ |
toolMetadata |
ไม่ | Record<string, object> |
เมตาดาต้าความพร้อมใช้งานราคาถูกสำหรับเครื่องมือที่ Plugin เป็นเจ้าของซึ่งประกาศใน contracts.tools ใช้เมื่อเครื่องมือไม่ควรโหลดรันไทม์ เว้นแต่จะมีหลักฐานของ config, env หรือ auth อยู่ |
channelConfigs |
ไม่ | Record<string, object> |
เมตาดาต้า config ของช่องทางที่ manifest เป็นเจ้าของ ซึ่งผสานเข้ากับพื้นผิวการค้นพบและการตรวจสอบก่อนโหลดรันไทม์ |
skills |
ไม่ | string[] |
ไดเรกทอรี Skills ที่จะโหลด โดยสัมพันธ์กับรูทของ Plugin |
name |
ไม่ | string |
ชื่อ Plugin ที่มนุษย์อ่านเข้าใจได้ |
description |
ไม่ | string |
สรุปสั้นๆ ที่แสดงในพื้นผิวของ Plugin |
icon |
ไม่ | string |
URL รูปภาพ HTTPS สำหรับการ์ด marketplace/catalog ClawHub ยอมรับ URL https:// ที่ถูกต้องใดๆ และจะย้อนกลับไปใช้ไอคอน Plugin เริ่มต้นเมื่อเว้นค่านี้ไว้หรือค่าไม่ถูกต้อง |
version |
ไม่ | string |
เวอร์ชัน Plugin เพื่อให้ข้อมูล |
uiHints |
ไม่ | Record<string, object> |
ป้ายกำกับ UI, placeholder และคำใบ้ความอ่อนไหวสำหรับฟิลด์ config |
ข้อมูลอ้างอิงเมทาดาทาของผู้ให้บริการการสร้าง
ฟิลด์เมทาดาทาของผู้ให้บริการการสร้างอธิบายสัญญาณ auth แบบคงที่สำหรับ
ผู้ให้บริการที่ประกาศในรายการ contracts.*GenerationProviders ที่ตรงกัน
OpenClaw อ่านฟิลด์เหล่านี้ก่อนโหลด runtime ของผู้ให้บริการ เพื่อให้เครื่องมือหลักสามารถ
ตัดสินได้ว่าผู้ให้บริการการสร้างพร้อมใช้งานหรือไม่โดยไม่ต้องนำเข้า
Plugin ของผู้ให้บริการทุกตัว
ใช้ฟิลด์เหล่านี้เฉพาะกับข้อเท็จจริงเชิงประกาศที่มีต้นทุนต่ำเท่านั้น Transport, การแปลง request, การรีเฟรช token, การตรวจสอบ credential และพฤติกรรมการสร้างจริง ยังคงอยู่ใน runtime ของ Plugin
{ "contracts": { "imageGenerationProviders": ["example-image"] }, "imageGenerationProviderMetadata": { "example-image": { "aliases": ["example-image-oauth"], "authProviders": ["example-image"], "configSignals": [ { "rootPath": "plugins.entries.example-image.config", "overlayPath": "image", "mode": { "path": "mode", "default": "local", "allowed": ["local"] }, "requiredAny": ["workflow", "workflowPath"], "required": ["promptNodeId"] } ], "authSignals": [ { "provider": "example-image" }, { "provider": "example-image-oauth", "providerBaseUrl": { "provider": "example-image", "defaultBaseUrl": "https://api.example.com/v1", "allowedBaseUrls": ["https://api.example.com/v1"] } } ] } }}แต่ละรายการเมทาดาทารองรับ:
| ฟิลด์ | จำเป็น | ชนิด | ความหมาย |
|---|---|---|---|
aliases |
ไม่ | string[] |
id ผู้ให้บริการเพิ่มเติมที่ควรถูกนับเป็นนามแฝง auth แบบคงที่สำหรับผู้ให้บริการการสร้าง |
authProviders |
ไม่ | string[] |
id ผู้ให้บริการที่โปรไฟล์ auth ที่กำหนดค่าไว้ควรถูกนับเป็น auth สำหรับผู้ให้บริการการสร้างนี้ |
configSignals |
ไม่ | object[] |
สัญญาณความพร้อมใช้งานที่อิงเฉพาะ config และมีต้นทุนต่ำ สำหรับผู้ให้บริการแบบ local หรือ self-hosted ที่สามารถกำหนดค่าได้โดยไม่ต้องมีโปรไฟล์ auth หรือ env var |
authSignals |
ไม่ | object[] |
สัญญาณ auth แบบชัดเจน เมื่อมีอยู่ สัญญาณเหล่านี้จะแทนที่ชุดสัญญาณเริ่มต้นจาก id ผู้ให้บริการ, aliases และ authProviders |
referenceAudioInputs |
ไม่ | boolean |
สำหรับการสร้างวิดีโอเท่านั้น ตั้งเป็น true เมื่อผู้ให้บริการยอมรับ assets เสียงอ้างอิง มิฉะนั้น video_generate จะซ่อนพารามิเตอร์การอ้างอิงเสียง |
แต่ละรายการ configSignals รองรับ:
| ฟิลด์ | จำเป็น | ชนิด | ความหมาย |
|---|---|---|---|
rootPath |
ใช่ | string |
Dot path ไปยังออบเจ็กต์ config ที่ Plugin เป็นเจ้าของเพื่อตรวจสอบ เช่น plugins.entries.example.config |
overlayPath |
ไม่ | string |
Dot path ภายใน root config ที่ออบเจ็กต์ของมันควร overlay ออบเจ็กต์ root ก่อนประเมินสัญญาณ ใช้สำหรับ config เฉพาะ capability เช่น image, video หรือ music |
overlayMapPath |
ไม่ | string |
Dot path ภายใน root config ที่ค่าออบเจ็กต์แต่ละค่าควร overlay ออบเจ็กต์ root ใช้สำหรับแมปบัญชีที่มีชื่อ เช่น accounts โดยบัญชีใดก็ตามที่กำหนดค่าไว้ควรผ่านเงื่อนไข |
required |
ไม่ | string[] |
Dot path ภายใน config ที่มีผลซึ่งต้องมีค่าที่กำหนดค่าไว้ สตริงต้องไม่ว่างเปล่า ออบเจ็กต์และอาร์เรย์ต้องไม่ว่างเปล่า |
requiredAny |
ไม่ | string[] |
Dot path ภายใน config ที่มีผลซึ่งอย่างน้อยหนึ่งรายการต้องมีค่าที่กำหนดค่าไว้ |
mode |
ไม่ | object |
ตัวป้องกันโหมดสตริงแบบเลือกได้ภายใน config ที่มีผล ใช้เมื่อความพร้อมใช้งานจาก config เท่านั้นมีผลเฉพาะกับโหมดเดียว |
แต่ละตัวป้องกัน mode รองรับ:
| ฟิลด์ | จำเป็น | ชนิด | ความหมาย |
|---|---|---|---|
path |
ไม่ | string |
Dot path ภายใน config ที่มีผล ค่าเริ่มต้นคือ mode |
default |
ไม่ | string |
ค่าโหมดที่จะใช้เมื่อ config ละเว้น path |
allowed |
ไม่ | string[] |
หากมี สัญญาณจะผ่านเฉพาะเมื่อโหมดที่มีผลเป็นหนึ่งในค่าเหล่านี้ |
disallowed |
ไม่ | string[] |
หากมี สัญญาณจะล้มเหลวเมื่อโหมดที่มีผลเป็นหนึ่งในค่าเหล่านี้ |
แต่ละรายการ authSignals รองรับ:
| ฟิลด์ | จำเป็น | ชนิด | ความหมาย |
|---|---|---|---|
provider |
ใช่ | string |
id ผู้ให้บริการที่จะตรวจในโปรไฟล์ auth ที่กำหนดค่าไว้ |
providerBaseUrl |
ไม่ | object |
ตัวป้องกันแบบเลือกได้ที่ทำให้สัญญาณถูกนับเฉพาะเมื่อผู้ให้บริการที่กำหนดค่าไว้ซึ่งอ้างอิงใช้ base URL ที่อนุญาต ใช้เมื่อ alias ของ auth ใช้ได้เฉพาะกับ API บางรายการ |
แต่ละตัวป้องกัน providerBaseUrl รองรับ:
| ฟิลด์ | จำเป็น | ชนิด | ความหมาย |
|---|---|---|---|
provider |
ใช่ | string |
id config ของผู้ให้บริการที่ควรตรวจ baseUrl |
defaultBaseUrl |
ไม่ | string |
Base URL ที่จะสมมติใช้เมื่อ config ของผู้ให้บริการละเว้น baseUrl |
allowedBaseUrls |
ใช่ | string[] |
Base URL ที่อนุญาตสำหรับสัญญาณ auth นี้ สัญญาณจะถูกละเว้นเมื่อ base URL ที่กำหนดค่าไว้หรือค่าเริ่มต้นไม่ตรงกับหนึ่งในค่าที่ normalize แล้วเหล่านี้ |
ข้อมูลอ้างอิงเมทาดาทาของเครื่องมือ
toolMetadata ใช้รูปทรง configSignals และ authSignals เดียวกับ
เมทาดาทาของผู้ให้บริการการสร้าง โดยใช้ชื่อเครื่องมือเป็นคีย์ contracts.tools ประกาศ
ความเป็นเจ้าของ toolMetadata ประกาศหลักฐานความพร้อมใช้งานที่มีต้นทุนต่ำ เพื่อให้ OpenClaw สามารถ
หลีกเลี่ยงการนำเข้า runtime ของ Plugin เพียงเพื่อให้ factory ของเครื่องมือนั้นคืนค่า null
{ "setup": { "providers": [ { "id": "example", "envVars": ["EXAMPLE_API_KEY"] } ] }, "contracts": { "tools": ["example_search"] }, "toolMetadata": { "example_search": { "authSignals": [ { "provider": "example" } ], "configSignals": [ { "rootPath": "plugins.entries.example.config", "overlayPath": "search", "required": ["apiKey"] } ] } }}หากเครื่องมือไม่มี toolMetadata OpenClaw จะคงพฤติกรรมเดิมไว้และ
โหลด Plugin เจ้าของเมื่อสัญญาเครื่องมือตรงกับ policy สำหรับเครื่องมือใน hot path
ที่ factory ขึ้นอยู่กับ auth/config ผู้เขียน Plugin ควรประกาศ
toolMetadata แทนการทำให้ core นำเข้า runtime เพื่อสอบถาม
ข้อมูลอ้างอิง providerAuthChoices
แต่ละรายการ providerAuthChoices อธิบายตัวเลือก onboarding หรือ auth หนึ่งรายการ
OpenClaw อ่านข้อมูลนี้ก่อนโหลด runtime ของผู้ให้บริการ
รายการ setup ของผู้ให้บริการใช้ตัวเลือกใน manifest เหล่านี้, ตัวเลือก setup ที่ได้จาก descriptor
และเมทาดาทา install-catalog โดยไม่โหลด runtime ของผู้ให้บริการ
| ฟิลด์ | จำเป็น | ชนิด | ความหมาย |
|---|---|---|---|
provider |
ใช่ | string |
id ของ Provider ที่ตัวเลือกนี้สังกัดอยู่ |
method |
ใช่ | string |
id ของเมธอดการยืนยันตัวตนที่จะ dispatch ไป |
choiceId |
ใช่ | string |
id ตัวเลือกการยืนยันตัวตนที่เสถียร ซึ่งใช้โดยโฟลว์ onboarding และ CLI |
choiceLabel |
ไม่ | string |
ป้ายกำกับที่แสดงต่อผู้ใช้ หากละไว้ OpenClaw จะ fallback ไปใช้ choiceId |
choiceHint |
ไม่ | string |
ข้อความช่วยเหลือสั้นๆ สำหรับตัวเลือก |
assistantPriority |
ไม่ | number |
ค่าที่ต่ำกว่าจะถูกเรียงก่อนในตัวเลือกแบบโต้ตอบที่ assistant ขับเคลื่อน |
assistantVisibility |
ไม่ | "visible" | "manual-only" |
ซ่อนตัวเลือกจากตัวเลือกของ assistant แต่ยังอนุญาตให้เลือกด้วย CLI แบบแมนนวลได้ |
deprecatedChoiceIds |
ไม่ | string[] |
id ตัวเลือกเดิมที่ควรเปลี่ยนเส้นทางผู้ใช้มายังตัวเลือกทดแทนนี้ |
groupId |
ไม่ | string |
id กลุ่มแบบไม่บังคับสำหรับจัดกลุ่มตัวเลือกที่เกี่ยวข้องกัน |
groupLabel |
ไม่ | string |
ป้ายกำกับที่แสดงต่อผู้ใช้สำหรับกลุ่มนั้น |
groupHint |
ไม่ | string |
ข้อความช่วยเหลือสั้นๆ สำหรับกลุ่ม |
optionKey |
ไม่ | string |
คีย์ตัวเลือกภายในสำหรับโฟลว์การยืนยันตัวตนแบบแฟล็กเดียวที่เรียบง่าย |
cliFlag |
ไม่ | string |
ชื่อแฟล็ก CLI เช่น --openrouter-api-key |
cliOption |
ไม่ | string |
รูปแบบตัวเลือก CLI แบบเต็ม เช่น --openrouter-api-key <key> |
cliDescription |
ไม่ | string |
คำอธิบายที่ใช้ในความช่วยเหลือของ CLI |
onboardingScopes |
ไม่ | Array<"text-inference" | "image-generation" | "music-generation"> |
พื้นผิว onboarding ที่ตัวเลือกนี้ควรปรากฏ หากละไว้ ค่าเริ่มต้นคือ ["text-inference"] |
ข้อมูลอ้างอิง commandAliases
ใช้ commandAliases เมื่อ Plugin เป็นเจ้าของชื่อคำสั่ง runtime ที่ผู้ใช้อาจ
ใส่ใน plugins.allow โดยผิดพลาด หรือพยายามรันเป็นคำสั่ง CLI ระดับ root OpenClaw
ใช้ metadata นี้สำหรับการวินิจฉัยโดยไม่ import โค้ด runtime ของ Plugin
{ "commandAliases": [ { "name": "dreaming", "kind": "runtime-slash", "cliCommand": "memory" } ]}| ฟิลด์ | จำเป็น | ชนิด | ความหมาย |
|---|---|---|---|
name |
ใช่ | string |
ชื่อคำสั่งที่เป็นของ Plugin นี้ |
kind |
ไม่ | "runtime-slash" |
ระบุว่า alias เป็นคำสั่ง slash ในแชต ไม่ใช่คำสั่ง CLI ระดับ root |
cliCommand |
ไม่ | string |
คำสั่ง CLI ระดับ root ที่เกี่ยวข้องเพื่อแนะนำสำหรับการดำเนินการ CLI หากมี |
ข้อมูลอ้างอิง activation
ใช้ activation เมื่อ Plugin สามารถประกาศได้อย่างประหยัดว่าเหตุการณ์ control-plane ใด
ควรรวม Plugin นี้ไว้ในแผน activation/load
บล็อกนี้เป็น metadata สำหรับ planner ไม่ใช่ lifecycle API บล็อกนี้ไม่ลงทะเบียน
พฤติกรรม runtime ไม่แทนที่ register(...) และไม่ให้สัญญาว่า
โค้ด Plugin ได้รันแล้ว activation planner ใช้ฟิลด์เหล่านี้เพื่อ
จำกัด Plugin ที่เป็นผู้สมัครก่อน fallback ไปยัง metadata ความเป็นเจ้าของใน manifest ที่มีอยู่
เช่น providers, channels, commandAliases, setup.providers,
contracts.tools และ hooks
ควรใช้ metadata ที่แคบที่สุดซึ่งอธิบายความเป็นเจ้าของอยู่แล้ว ใช้
providers, channels, commandAliases, ตัวอธิบาย setup หรือ contracts
เมื่อฟิลด์เหล่านั้นแสดงความสัมพันธ์ได้ ใช้ activation สำหรับ hint เพิ่มเติมของ planner
ที่ไม่สามารถแทนด้วยฟิลด์ความเป็นเจ้าของเหล่านั้นได้
ใช้ cliBackends ระดับบนสุดสำหรับ alias runtime ของ CLI เช่น claude-cli,
my-cli หรือ google-gemini-cli; activation.onAgentHarnesses ใช้สำหรับ
id ของ embedded agent harness ที่ยังไม่มีฟิลด์ความเป็นเจ้าของเท่านั้น
บล็อกนี้เป็น metadata เท่านั้น บล็อกนี้ไม่ลงทะเบียนพฤติกรรม runtime และไม่
แทนที่ register(...), setupEntry หรือ entrypoint runtime/Plugin อื่นๆ
consumer ปัจจุบันใช้บล็อกนี้เป็น hint สำหรับจำกัดขอบเขตก่อนโหลด Plugin แบบกว้างขึ้น ดังนั้น
metadata activation ที่ไม่ใช่ startup ซึ่งขาดหายไปโดยทั่วไปจึงมีผลแค่ด้านประสิทธิภาพเท่านั้น และ
ไม่ควรเปลี่ยนความถูกต้องตราบใดที่ fallback ความเป็นเจ้าของจาก manifest ยังมีอยู่
ทุก Plugin ควรกำหนด activation.onStartup อย่างตั้งใจ ตั้งค่าเป็น true
เฉพาะเมื่อ Plugin ต้องรันระหว่างการเริ่มต้น Gateway ตั้งค่าเป็น false เมื่อ
Plugin ไม่ทำงานที่ startup และควรโหลดจาก trigger ที่แคบกว่าเท่านั้น
การละ onStartup จะไม่ startup-load Plugin โดยปริยายอีกต่อไป ให้ใช้
metadata activation ที่ชัดเจนสำหรับ startup, channel, config, agent-harness, memory หรือ
trigger activation อื่นที่แคบกว่า
{ "activation": { "onStartup": false, "onProviders": ["openai"], "onCommands": ["models"], "onChannels": ["web"], "onRoutes": ["gateway-webhook"], "onConfigPaths": ["browser"], "onCapabilities": ["provider", "tool"] }}| ฟิลด์ | จำเป็น | ชนิด | ความหมาย |
|---|---|---|---|
onStartup |
ไม่ | boolean |
การ activation เมื่อเริ่มต้น Gateway แบบชัดเจน ทุก Plugin ควรกำหนดค่านี้ true จะ import Plugin ระหว่าง startup; false ทำให้ยัง lazy ตอน startup เว้นแต่ trigger อื่นที่ตรงกันต้องโหลด |
onProviders |
ไม่ | string[] |
id ของ Provider ที่ควรรวม Plugin นี้ไว้ในแผน activation/load |
onAgentHarnesses |
ไม่ | string[] |
id runtime ของ embedded agent harness ที่ควรรวม Plugin นี้ไว้ในแผน activation/load ใช้ cliBackends ระดับบนสุดสำหรับ alias ของ backend CLI |
onCommands |
ไม่ | string[] |
id คำสั่งที่ควรรวม Plugin นี้ไว้ในแผน activation/load |
onChannels |
ไม่ | string[] |
id ของ channel ที่ควรรวม Plugin นี้ไว้ในแผน activation/load |
onRoutes |
ไม่ | string[] |
ชนิด route ที่ควรรวม Plugin นี้ไว้ในแผน activation/load |
onConfigPaths |
ไม่ | string[] |
path config ที่สัมพันธ์กับ root ซึ่งควรรวม Plugin นี้ไว้ในแผน startup/load เมื่อมี path นั้นอยู่และไม่ได้ถูกปิดใช้งานอย่างชัดเจน |
onCapabilities |
ไม่ | Array<"provider" | "channel" | "tool" | "hook"> |
hint ความสามารถแบบกว้างที่ใช้โดยการวางแผน activation ของ control-plane ควรใช้ฟิลด์ที่แคบกว่าเมื่อเป็นไปได้ |
consumer สดปัจจุบัน:
- การวางแผน startup ของ Gateway ใช้
activation.onStartupสำหรับ startup import แบบชัดเจน - การวางแผน CLI ที่ trigger ด้วยคำสั่ง fallback ไปยัง legacy
commandAliases[].cliCommandหรือcommandAliases[].name - การวางแผน startup ของ agent-runtime ใช้
activation.onAgentHarnessesสำหรับ embedded harnesses และcliBackends[]ระดับบนสุดสำหรับ alias runtime ของ CLI - การวางแผน setup/channel ที่ trigger ด้วย channel fallback ไปยังความเป็นเจ้าของ legacy
channels[]เมื่อ metadata activation ของ channel แบบชัดเจนขาดหายไป - การวางแผน Plugin ตอน startup ใช้
activation.onConfigPathsสำหรับพื้นผิว config ระดับ root ที่ไม่ใช่ channel เช่นบล็อกbrowserของ Plugin browser ที่ bundled มา - การวางแผน setup/runtime ที่ trigger ด้วย Provider fallback ไปยังความเป็นเจ้าของ legacy
providers[]และcliBackends[]ระดับบนสุด เมื่อ metadata activation ของ Provider แบบชัดเจน ขาดหายไป
การวินิจฉัยของ planner สามารถแยก hint activation แบบชัดเจนออกจาก fallback
ความเป็นเจ้าของใน manifest ได้ ตัวอย่างเช่น activation-command-hint หมายถึง
activation.onCommands ตรงกัน ขณะที่ manifest-command-alias หมายถึง
planner ใช้ความเป็นเจ้าของ commandAliases แทน ป้ายเหตุผลเหล่านี้มีไว้สำหรับ
การวินิจฉัยและการทดสอบของ host; ผู้เขียน Plugin ควรประกาศ metadata
ที่อธิบายความเป็นเจ้าของได้ดีที่สุดต่อไป
ข้อมูลอ้างอิง qaRunners
ใช้ qaRunners เมื่อ Plugin เพิ่ม transport runner หนึ่งรายการขึ้นไปไว้ใต้
root openclaw qa ที่ใช้ร่วมกัน รักษา metadata นี้ให้ประหยัดและเป็น static; runtime ของ Plugin
ยังคงเป็นเจ้าของการลงทะเบียน CLI จริงผ่านพื้นผิว runtime-api.ts
แบบเบาที่ export qaRunnerCliRegistrations
{ "qaRunners": [ { "commandName": "matrix", "description": "Run the Docker-backed Matrix live QA lane against a disposable homeserver" } ]}| ฟิลด์ | จำเป็น | ประเภท | ความหมาย |
|---|---|---|---|
commandName |
ใช่ | string |
คำสั่งย่อยที่เมานต์อยู่ใต้ openclaw qa เช่น matrix |
description |
ไม่ | string |
ข้อความช่วยเหลือสำรองที่ใช้เมื่อโฮสต์ที่ใช้ร่วมกันต้องมีคำสั่ง stub |
ข้อมูลอ้างอิง setup
ใช้ setup เมื่อพื้นผิวการตั้งค่าและการเริ่มใช้งานต้องการเมทาดาทาราคาถูกที่ Plugin เป็นเจ้าของก่อนที่รันไทม์จะโหลด
{ "setup": { "providers": [ { "id": "openai", "authMethods": ["api-key"], "envVars": ["OPENAI_API_KEY"], "authEvidence": [ { "type": "local-file-with-env", "fileEnvVar": "OPENAI_CREDENTIALS_FILE", "requiresAllEnv": ["OPENAI_PROJECT"], "credentialMarker": "openai-local-credentials", "source": "openai local credentials" } ] } ], "cliBackends": ["openai-cli"], "configMigrations": ["legacy-openai-auth"], "requiresRuntime": false }}cliBackends ระดับบนสุดยังคงใช้ได้และยังอธิบายแบ็กเอนด์การอนุมานของ CLI ต่อไป setup.cliBackends คือพื้นผิวดีสคริปเตอร์เฉพาะการตั้งค่าสำหรับโฟลว์ control-plane/setup ที่ควรคงเป็นเมทาดาทาเท่านั้น
เมื่อมี setup.providers และ setup.cliBackends จะเป็นพื้นผิวการค้นหาแบบดีสคริปเตอร์ก่อนที่แนะนำสำหรับการค้นพบการตั้งค่า หากดีสคริปเตอร์เพียงจำกัด Plugin ตัวเลือกให้แคบลง และการตั้งค่ายังต้องใช้ฮุกของรันไทม์ในช่วงตั้งค่าที่สมบูรณ์กว่า ให้ตั้ง requiresRuntime: true และคง setup-api ไว้เป็นเส้นทางการทำงานสำรอง
OpenClaw ยังรวม setup.providers[].envVars ไว้ในการค้นหาการยืนยันตัวตนผู้ให้บริการทั่วไปและการค้นหา env-var ด้วย providerAuthEnvVars ยังคงรองรับผ่านอะแดปเตอร์ความเข้ากันได้ระหว่างช่วงเลิกใช้ แต่ Plugin ที่ไม่ถูกบันเดิลซึ่งยังใช้อยู่จะได้รับการวินิจฉัย manifest Plugin ใหม่ควรวางเมทาดาทา env ของการตั้งค่า/สถานะไว้ที่ setup.providers[].envVars
OpenClaw ยังสามารถอนุมานตัวเลือกการตั้งค่าง่าย ๆ จาก setup.providers[].authMethods เมื่อไม่มีรายการการตั้งค่า หรือเมื่อ setup.requiresRuntime: false ประกาศว่าไม่จำเป็นต้องใช้รันไทม์การตั้งค่า รายการ providerAuthChoices แบบชัดเจนยังคงเป็นตัวเลือกที่แนะนำสำหรับป้ายกำกับแบบกำหนดเอง แฟล็ก CLI ขอบเขตการเริ่มใช้งาน และเมทาดาทาของผู้ช่วย
ตั้ง requiresRuntime: false เฉพาะเมื่อดีสคริปเตอร์เหล่านั้นเพียงพอสำหรับพื้นผิวการตั้งค่า OpenClaw ถือค่า false แบบชัดเจนเป็นสัญญาแบบดีสคริปเตอร์เท่านั้น และจะไม่เรียกใช้ setup-api หรือ openclaw.setupEntry สำหรับการค้นหาการตั้งค่า หาก Plugin แบบดีสคริปเตอร์เท่านั้นยังส่งรายการรันไทม์การตั้งค่าอย่างใดอย่างหนึ่งเหล่านั้นมาด้วย OpenClaw จะรายงานการวินิจฉัยแบบเพิ่มเติมและยังคงเพิกเฉยต่อรายการนั้น การละ requiresRuntime ไว้จะคงพฤติกรรมสำรองแบบเดิมไว้ เพื่อไม่ให้ Plugin ที่มีอยู่ซึ่งเพิ่มดีสคริปเตอร์โดยไม่มีแฟล็กเสียหาย
เนื่องจากการค้นหาการตั้งค่าสามารถเรียกใช้โค้ด setup-api ที่ Plugin เป็นเจ้าของได้ ค่า setup.providers[].id และ setup.cliBackends[] ที่ทำให้เป็นรูปแบบปกติแล้วต้องไม่ซ้ำกันในทุก Plugin ที่ค้นพบ ความเป็นเจ้าของที่กำกวมจะล้มเหลวแบบปิดแทนที่จะเลือกผู้ชนะจากลำดับการค้นพบ
เมื่อรันไทม์การตั้งค่าถูกเรียกใช้จริง การวินิจฉัยรีจิสทรีการตั้งค่าจะรายงานความคลาดเคลื่อนของดีสคริปเตอร์ หาก setup-api ลงทะเบียนผู้ให้บริการหรือแบ็กเอนด์ CLI ที่ดีสคริปเตอร์ manifest ไม่ได้ประกาศ หรือหากดีสคริปเตอร์ไม่มีการลงทะเบียนรันไทม์ที่ตรงกัน การวินิจฉัยเหล่านี้เป็นแบบเพิ่มเติมและไม่ปฏิเสธ Plugin เดิม
ข้อมูลอ้างอิง setup.providers
| ฟิลด์ | จำเป็น | ประเภท | ความหมาย |
|---|---|---|---|
id |
ใช่ | string |
id ผู้ให้บริการที่เปิดเผยระหว่างการตั้งค่าหรือการเริ่มใช้งาน รักษา id ที่ทำให้เป็นรูปแบบปกติแล้วให้ไม่ซ้ำกันทั่วทั้งระบบ |
authMethods |
ไม่ | string[] |
id วิธีการตั้งค่า/ยืนยันตัวตนที่ผู้ให้บริการนี้รองรับโดยไม่ต้องโหลดรันไทม์เต็ม |
envVars |
ไม่ | string[] |
Env vars ที่พื้นผิวการตั้งค่า/สถานะทั่วไปสามารถตรวจสอบได้ก่อนที่รันไทม์ของ Plugin จะโหลด |
authEvidence |
ไม่ | object[] |
การตรวจสอบหลักฐานการยืนยันตัวตนในเครื่องราคาถูกสำหรับผู้ให้บริการที่สามารถยืนยันตัวตนผ่าน marker ที่ไม่ใช่ความลับ |
authEvidence มีไว้สำหรับ marker ข้อมูลประจำตัวในเครื่องที่ผู้ให้บริการเป็นเจ้าของ ซึ่งสามารถตรวจสอบได้โดยไม่ต้องโหลดโค้ดรันไทม์ การตรวจสอบเหล่านี้ต้องยังคงราคาถูกและอยู่ในเครื่อง: ไม่มีการเรียกเครือข่าย ไม่มีการอ่าน keychain หรือตัวจัดการความลับ ไม่มีคำสั่ง shell และไม่มีการ probe API ของผู้ให้บริการ
รายการหลักฐานที่รองรับ:
| ฟิลด์ | จำเป็น | ประเภท | ความหมาย |
|---|---|---|---|
type |
ใช่ | string |
ปัจจุบันคือ local-file-with-env |
fileEnvVar |
ไม่ | string |
Env var ที่มีพาธไฟล์ข้อมูลประจำตัวแบบชัดเจน |
fallbackPaths |
ไม่ | string[] |
พาธไฟล์ข้อมูลประจำตัวในเครื่องที่ตรวจสอบเมื่อ fileEnvVar ไม่มีอยู่หรือว่าง รองรับ ${HOME} และ ${APPDATA} |
requiresAnyEnv |
ไม่ | string[] |
ต้องมี env var อย่างน้อยหนึ่งรายการที่ระบุไว้ไม่ว่างก่อนที่หลักฐานจะใช้ได้ |
requiresAllEnv |
ไม่ | string[] |
env var ทุกตัวที่ระบุไว้ต้องไม่ว่างก่อนที่หลักฐานจะใช้ได้ |
credentialMarker |
ใช่ | string |
marker ที่ไม่ใช่ความลับซึ่งส่งคืนเมื่อมีหลักฐาน |
source |
ไม่ | string |
ป้ายกำกับแหล่งที่มาที่แสดงต่อผู้ใช้สำหรับเอาต์พุตการยืนยันตัวตน/สถานะ |
ฟิลด์ setup
| ฟิลด์ | จำเป็น | ประเภท | ความหมาย |
|---|---|---|---|
providers |
ไม่ | object[] |
ดีสคริปเตอร์การตั้งค่าผู้ให้บริการที่เปิดเผยระหว่างการตั้งค่าและการเริ่มใช้งาน |
cliBackends |
ไม่ | string[] |
id แบ็กเอนด์ช่วงตั้งค่าที่ใช้สำหรับการค้นหาการตั้งค่าแบบดีสคริปเตอร์ก่อน รักษา id ที่ทำให้เป็นรูปแบบปกติแล้วให้ไม่ซ้ำกันทั่วทั้งระบบ |
configMigrations |
ไม่ | string[] |
id การย้าย config ที่พื้นผิวการตั้งค่าของ Plugin นี้เป็นเจ้าของ |
requiresRuntime |
ไม่ | boolean |
ระบุว่าการตั้งค่ายังต้องใช้การเรียกใช้ setup-api หลังการค้นหาดีสคริปเตอร์หรือไม่ |
ข้อมูลอ้างอิง uiHints
uiHints คือแผนที่จากชื่อฟิลด์ config ไปยังคำใบ้การเรนเดอร์ขนาดเล็ก
{ "uiHints": { "apiKey": { "label": "API key", "help": "Used for OpenRouter requests", "placeholder": "sk-or-v1-...", "sensitive": true } }}คำใบ้ของแต่ละฟิลด์สามารถมี:
| ฟิลด์ | ประเภท | ความหมาย |
|---|---|---|
label |
string |
ป้ายกำกับฟิลด์ที่แสดงต่อผู้ใช้ |
help |
string |
ข้อความช่วยเหลือสั้น ๆ |
tags |
string[] |
แท็ก UI แบบไม่บังคับ |
advanced |
boolean |
ทำเครื่องหมายฟิลด์ว่าเป็นขั้นสูง |
sensitive |
boolean |
ทำเครื่องหมายฟิลด์ว่าเป็นความลับหรืออ่อนไหว |
placeholder |
string |
ข้อความ placeholder สำหรับอินพุตฟอร์ม |
ข้อมูลอ้างอิง contracts
ใช้ contracts เฉพาะสำหรับเมทาดาทาความเป็นเจ้าของ capability แบบสแตติกที่ OpenClaw สามารถอ่านได้โดยไม่ต้องนำเข้ารันไทม์ของ Plugin
{ "contracts": { "agentToolResultMiddleware": ["openclaw", "codex"], "trustedToolPolicies": ["workflow-budget"], "externalAuthProviders": ["acme-ai"], "embeddingProviders": ["openai-compatible"], "speechProviders": ["openai"], "realtimeTranscriptionProviders": ["openai"], "realtimeVoiceProviders": ["openai"], "memoryEmbeddingProviders": ["local"], "mediaUnderstandingProviders": ["openai"], "imageGenerationProviders": ["openai"], "videoGenerationProviders": ["qwen"], "webFetchProviders": ["firecrawl"], "webSearchProviders": ["gemini"], "migrationProviders": ["hermes"], "gatewayMethodDispatch": ["authenticated-request"], "tools": ["firecrawl_search", "firecrawl_scrape"] }}แต่ละรายการเป็นแบบไม่บังคับ:
| ฟิลด์ | ชนิด | ความหมาย |
|---|---|---|
embeddedExtensionFactories |
string[] |
id ของ extension factory สำหรับ app-server ของ Codex ปัจจุบันคือ codex-app-server |
agentToolResultMiddleware |
string[] |
id ของรันไทม์ที่ Plugin นี้อาจลงทะเบียนมิดเดิลแวร์ผลลัพธ์เครื่องมือให้ได้ |
trustedToolPolicies |
string[] |
id ของนโยบายก่อนใช้เครื่องมือที่เชื่อถือได้แบบโลคัลของ Plugin ซึ่ง Plugin ที่ติดตั้งแล้วอาจลงทะเบียนได้ Plugin ที่บันเดิลมาด้วยอาจลงทะเบียนนโยบายได้โดยไม่ต้องมีฟิลด์นี้ |
externalAuthProviders |
string[] |
id ของผู้ให้บริการที่ Plugin นี้เป็นเจ้าของฮุกโปรไฟล์การยืนยันตัวตนภายนอก |
embeddingProviders |
string[] |
id ของผู้ให้บริการ embedding ทั่วไปที่ Plugin นี้เป็นเจ้าของสำหรับการใช้ vector embedding ซ้ำได้ รวมถึงหน่วยความจำ |
speechProviders |
string[] |
id ของผู้ให้บริการเสียงพูดที่ Plugin นี้เป็นเจ้าของ |
realtimeTranscriptionProviders |
string[] |
id ของผู้ให้บริการถอดเสียงแบบเรียลไทม์ที่ Plugin นี้เป็นเจ้าของ |
realtimeVoiceProviders |
string[] |
id ของผู้ให้บริการเสียงแบบเรียลไทม์ที่ Plugin นี้เป็นเจ้าของ |
memoryEmbeddingProviders |
string[] |
id ของผู้ให้บริการ embedding เฉพาะหน่วยความจำที่เลิกใช้แล้วซึ่ง Plugin นี้เป็นเจ้าของ |
mediaUnderstandingProviders |
string[] |
id ของผู้ให้บริการทำความเข้าใจสื่อที่ Plugin นี้เป็นเจ้าของ |
transcriptSourceProviders |
string[] |
id ของผู้ให้บริการแหล่งถอดความที่ Plugin นี้เป็นเจ้าของ |
imageGenerationProviders |
string[] |
id ของผู้ให้บริการสร้างภาพที่ Plugin นี้เป็นเจ้าของ |
videoGenerationProviders |
string[] |
id ของผู้ให้บริการสร้างวิดีโอที่ Plugin นี้เป็นเจ้าของ |
webFetchProviders |
string[] |
id ของผู้ให้บริการดึงข้อมูลเว็บที่ Plugin นี้เป็นเจ้าของ |
webSearchProviders |
string[] |
id ของผู้ให้บริการค้นหาเว็บที่ Plugin นี้เป็นเจ้าของ |
migrationProviders |
string[] |
id ของผู้ให้บริการนำเข้าที่ Plugin นี้เป็นเจ้าของสำหรับ openclaw migrate |
gatewayMethodDispatch |
string[] |
สิทธิ์ที่สงวนไว้สำหรับเส้นทาง HTTP ของ Plugin ที่ผ่านการยืนยันตัวตนซึ่ง dispatch เมธอด Gateway ภายในกระบวนการ |
tools |
string[] |
ชื่อเครื่องมือของเอเจนต์ที่ Plugin นี้เป็นเจ้าของ |
contracts.embeddedExtensionFactories ถูกเก็บไว้สำหรับ extension factory
แบบเฉพาะ app-server ของ Codex ที่บันเดิลมาด้วยเท่านั้น การแปลงผลลัพธ์เครื่องมือที่บันเดิลมาด้วยควร
ประกาศ contracts.agentToolResultMiddleware และลงทะเบียนด้วย
api.registerAgentToolResultMiddleware(...) แทน Plugin ที่ติดตั้งแล้วอาจใช้
จุดเชื่อมมิดเดิลแวร์เดียวกันได้เฉพาะเมื่อเปิดใช้อย่างชัดเจน และเฉพาะสำหรับรันไทม์ที่
ประกาศไว้ใน contracts.agentToolResultMiddleware เท่านั้น
Plugin ที่ติดตั้งแล้วซึ่งต้องใช้ชั้นนโยบายก่อนใช้เครื่องมือที่โฮสต์เชื่อถือ ต้องประกาศ
id โลคัลแต่ละรายการที่ลงทะเบียนไว้ใน contracts.trustedToolPolicies และต้องถูกเปิดใช้อย่างชัดเจน
Plugin ที่บันเดิลมาด้วยยังคงใช้เส้นทาง trusted-policy เดิม แต่ Plugin ที่ติดตั้งแล้ว
ซึ่งมี id นโยบายที่ไม่ได้ประกาศจะถูกปฏิเสธก่อนการลงทะเบียน id ของนโยบาย
ถูกจำกัดขอบเขตไว้กับ Plugin ที่ลงทะเบียน ดังนั้น Plugin สองตัวอาจประกาศและ
ลงทะเบียน workflow-budget ได้ทั้งคู่ แต่ Plugin ตัวเดียวกันไม่สามารถลงทะเบียน id โลคัลเดียวกัน
ซ้ำสองครั้งได้
การลงทะเบียน api.registerTool(...) ของรันไทม์ต้องตรงกับ contracts.tools
การค้นหาเครื่องมือใช้รายการนี้เพื่อโหลดเฉพาะรันไทม์ของ Plugin ที่สามารถเป็นเจ้าของ
เครื่องมือที่ร้องขอได้
Plugin ผู้ให้บริการที่ implement resolveExternalAuthProfiles ควรประกาศ
contracts.externalAuthProviders; ฮุก external-auth ที่ไม่ได้ประกาศจะถูกละเว้น
ผู้ให้บริการ embedding ทั่วไปควรประกาศ contracts.embeddingProviders สำหรับ
แต่ละ adapter ที่ลงทะเบียนด้วย api.registerEmbeddingProvider(...) ใช้
สัญญาทั่วไปสำหรับการสร้างเวกเตอร์ที่ใช้ซ้ำได้ รวมถึงผู้ให้บริการที่ถูกใช้โดย
การค้นหาหน่วยความจำ contracts.memoryEmbeddingProviders เป็นความเข้ากันได้
เฉพาะหน่วยความจำที่เลิกใช้แล้ว และยังคงอยู่เฉพาะระหว่างที่ผู้ให้บริการเดิมย้าย
ไปยังจุดเชื่อมผู้ให้บริการ embedding แบบทั่วไป
ปัจจุบัน contracts.gatewayMethodDispatch รับ
"authenticated-request" ได้ เป็นด่านสุขอนามัยของ API สำหรับเส้นทาง HTTP
ของ Plugin แบบเนทีฟที่ตั้งใจ dispatch เมธอด control-plane ของ Gateway ภายในกระบวนการ
ไม่ใช่ sandbox สำหรับป้องกัน Plugin เนทีฟที่เป็นอันตราย ใช้เฉพาะกับพื้นผิว
ที่บันเดิลมาด้วยหรือสำหรับโอเปอเรเตอร์ซึ่งผ่านการตรวจทานอย่างเข้มงวด และต้องใช้การยืนยันตัวตน HTTP ของ Gateway อยู่แล้ว
อ้างอิง mediaUnderstandingProviderMetadata
ใช้ mediaUnderstandingProviderMetadata เมื่อผู้ให้บริการทำความเข้าใจสื่อมี
โมเดลเริ่มต้น ลำดับความสำคัญของ fallback การยืนยันตัวตนอัตโนมัติ หรือการรองรับเอกสารเนทีฟที่
ตัวช่วยทั่วไปของ core ต้องใช้ก่อนโหลดรันไทม์ คีย์ต้องถูกประกาศใน
contracts.mediaUnderstandingProviders ด้วย
{ "contracts": { "mediaUnderstandingProviders": ["example"] }, "mediaUnderstandingProviderMetadata": { "example": { "capabilities": ["image", "audio"], "defaultModels": { "image": "example-vision-latest", "audio": "example-transcribe-latest" }, "autoPriority": { "image": 40 }, "nativeDocumentInputs": ["pdf"] } }}แต่ละรายการผู้ให้บริการสามารถมี:
| ฟิลด์ | ชนิด | ความหมาย |
|---|---|---|
capabilities |
("image" | "audio" | "video")[] |
ความสามารถด้านสื่อที่ผู้ให้บริการนี้เปิดเผย |
defaultModels |
Record<string, string> |
ค่าเริ่มต้นของความสามารถต่อโมเดลที่ใช้เมื่อ config ไม่ได้ระบุโมเดล |
autoPriority |
Record<string, number> |
ตัวเลขที่ต่ำกว่าจะเรียงก่อนสำหรับ fallback ผู้ให้บริการตามข้อมูลรับรองโดยอัตโนมัติ |
nativeDocumentInputs |
"pdf"[] |
อินพุตเอกสารเนทีฟที่ผู้ให้บริการรองรับ |
อ้างอิง channelConfigs
ใช้ channelConfigs เมื่อ Plugin ช่องทางต้องใช้ metadata ของ config ที่มีต้นทุนต่ำก่อน
โหลดรันไทม์ การค้นหาการตั้งค่า/สถานะแบบอ่านอย่างเดียวของช่องทางสามารถใช้ metadata นี้
โดยตรงสำหรับช่องทางภายนอกที่กำหนดค่าไว้เมื่อไม่มีรายการตั้งค่าให้ใช้ หรือ
เมื่อ setup.requiresRuntime: false ประกาศว่าไม่จำเป็นต้องมีรันไทม์สำหรับการตั้งค่า
channelConfigs เป็น metadata ใน manifest ของ Plugin ไม่ใช่ส่วน config ผู้ใช้ระดับบนสุด
ส่วนใหม่ ผู้ใช้ยังคงกำหนดค่าอินสแตนซ์ช่องทางภายใต้ channels.<channel-id>
OpenClaw อ่าน metadata ใน manifest เพื่อตัดสินว่า Plugin ใดเป็นเจ้าของช่องทาง
ที่กำหนดค่าไว้นั้น ก่อนที่โค้ดรันไทม์ของ Plugin จะทำงาน
สำหรับ Plugin ช่องทาง configSchema และ channelConfigs อธิบายเส้นทางที่ต่างกัน:
configSchemaตรวจสอบplugins.entries.<plugin-id>.configchannelConfigs.<channel-id>.schemaตรวจสอบchannels.<channel-id>
Plugin ที่ไม่ได้บันเดิลมาด้วยซึ่งประกาศ channels[] ควรประกาศรายการ
channelConfigs ที่ตรงกันด้วย หากไม่มี OpenClaw ยังสามารถโหลด Plugin ได้ แต่
schema ของ config ในเส้นทาง cold-path, การตั้งค่า, และพื้นผิว Control UI จะไม่สามารถรู้
รูปร่างตัวเลือกที่ช่องทางเป็นเจ้าของได้จนกว่ารันไทม์ของ Plugin จะทำงาน
channelConfigs.<channel-id>.commands.nativeCommandsAutoEnabled และ
nativeSkillsAutoEnabled สามารถประกาศค่าเริ่มต้น auto แบบสแตติกสำหรับการตรวจสอบ config คำสั่ง
ที่ทำงานก่อนโหลดรันไทม์ของช่องทาง ช่องทางที่บันเดิลมาด้วยยังสามารถเผยแพร่
ค่าเริ่มต้นเดียวกันผ่าน package.json#openclaw.channel.commands ควบคู่กับ
metadata แค็ตตาล็อกช่องทางอื่น ๆ ที่ package เป็นเจ้าของได้
{ "channelConfigs": { "matrix": { "schema": { "type": "object", "additionalProperties": false, "properties": { "homeserverUrl": { "type": "string" } } }, "uiHints": { "homeserverUrl": { "label": "Homeserver URL", "placeholder": "https://matrix.example.com" } }, "label": "Matrix", "description": "Matrix homeserver connection", "commands": { "nativeCommandsAutoEnabled": true, "nativeSkillsAutoEnabled": true }, "preferOver": ["matrix-legacy"] } }}แต่ละรายการช่องทางสามารถมี:
| ฟิลด์ | ชนิด | ความหมาย |
|---|---|---|
schema |
object |
JSON Schema สำหรับ channels.<id> จำเป็นสำหรับรายการ config ช่องทางแต่ละรายการที่ประกาศไว้ |
uiHints |
Record<string, object> |
ป้ายกำกับ UI/placeholder/คำใบ้ข้อมูลอ่อนไหวที่เป็นตัวเลือกสำหรับส่วนนั้นของ config ช่องทาง |
label |
string |
ป้ายกำกับช่องทางที่รวมเข้ากับ picker และพื้นผิว inspect เมื่อ metadata ของรันไทม์ยังไม่พร้อม |
description |
string |
คำอธิบายช่องทางสั้น ๆ สำหรับพื้นผิว inspect และแค็ตตาล็อก |
commands |
object |
ค่าเริ่มต้นอัตโนมัติแบบสแตติกสำหรับคำสั่งเนทีฟและ Skills เนทีฟสำหรับการตรวจสอบ config ก่อนรันไทม์ |
preferOver |
string[] |
id ของ Plugin แบบเดิมหรือมีลำดับความสำคัญต่ำกว่าที่ช่องทางนี้ควรอยู่เหนือกว่าในพื้นผิวการเลือก |
การแทนที่ Plugin ช่องทางอื่น
ใช้ preferOver เมื่อ Plugin ของคุณเป็นเจ้าของที่ต้องการสำหรับ id ช่องทางที่
Plugin อื่นก็สามารถให้ได้เช่นกัน กรณีทั่วไปคือ id ของ Plugin ที่เปลี่ยนชื่อ,
Plugin แบบสแตนด์อโลนที่มาแทน Plugin ที่บันเดิลมาด้วย, หรือ fork ที่มีการดูแลต่อ
ซึ่งคง id ช่องทางเดิมไว้เพื่อความเข้ากันได้ของ config
{ "id": "acme-chat", "channels": ["chat"], "channelConfigs": { "chat": { "schema": { "type": "object", "additionalProperties": false, "properties": { "webhookUrl": { "type": "string" } } }, "preferOver": ["chat"] } }}เมื่อกำหนดค่า channels.chat แล้ว OpenClaw จะพิจารณาทั้ง id ช่องทางและ
id ของ Plugin ที่ต้องการ หาก Plugin ที่มีลำดับความสำคัญต่ำกว่าถูกเลือกเพียงเพราะ
เป็น Plugin ที่บันเดิลมาด้วยหรือถูกเปิดใช้โดยค่าเริ่มต้น OpenClaw จะปิดใช้งานใน
config รันไทม์ที่มีผล เพื่อให้ Plugin เดียวเป็นเจ้าของช่องทางและเครื่องมือของช่องทางนั้น
การเลือกของผู้ใช้ที่ชัดเจนยังคงมีผลเหนือกว่า: หากผู้ใช้เปิดใช้ Plugin ทั้งสองอย่างชัดเจน
OpenClaw จะรักษาตัวเลือกนั้นไว้และรายงานการวินิจฉัยช่องทาง/เครื่องมือซ้ำ แทนที่จะ
เปลี่ยนชุด Plugin ที่ร้องขอแบบเงียบ ๆ
จำกัดขอบเขต preferOver ไว้กับ id ของ Plugin ที่สามารถให้ช่องทางเดียวกันได้จริง
ไม่ใช่ฟิลด์ลำดับความสำคัญทั่วไป และไม่ได้เปลี่ยนชื่อคีย์ config ของผู้ใช้
อ้างอิง modelSupport
ใช้ modelSupport เมื่อ OpenClaw ควรอนุมาน provider plugin ของคุณจาก
รหัสโมเดลแบบย่อ เช่น gpt-5.5 หรือ claude-sonnet-4.6 ก่อนที่ plugin runtime
จะโหลด
{ "modelSupport": { "modelPrefixes": ["gpt-", "o1", "o3", "o4"], "modelPatterns": ["^computer-use-preview"] }}OpenClaw ใช้ลำดับความสำคัญนี้:
- การอ้างอิง
provider/modelแบบชัดเจนจะใช้เมทาดาทา manifest ของprovidersที่เป็นเจ้าของ modelPatternsมีลำดับเหนือกว่าmodelPrefixes- หาก plugin ที่ไม่ถูกบันเดิลหนึ่งตัวและ plugin ที่ถูกบันเดิลหนึ่งตัวตรงกันทั้งคู่ plugin ที่ไม่ถูกบันเดิลจะชนะ
- ความกำกวมที่เหลือจะถูกละเว้นจนกว่าผู้ใช้หรือ config จะระบุ provider
ฟิลด์:
| ฟิลด์ | ชนิด | ความหมาย |
|---|---|---|
modelPrefixes |
string[] |
คำนำหน้าที่จับคู่ด้วย startsWith กับรหัสโมเดลแบบย่อ |
modelPatterns |
string[] |
ซอร์สของ Regex ที่จับคู่กับรหัสโมเดลแบบย่อหลังจากลบส่วนต่อท้ายของโปรไฟล์แล้ว |
รายการ modelPatterns จะถูกคอมไพล์ผ่าน compileSafeRegex ซึ่งปฏิเสธ
แพตเทิร์นที่มีการทำซ้ำแบบซ้อนกัน (เช่น (a+)+$) แพตเทิร์นที่ไม่ผ่าน
การตรวจสอบความปลอดภัยจะถูกข้ามอย่างเงียบ ๆ เช่นเดียวกับ regex ที่ไวยากรณ์ไม่ถูกต้อง
ให้ใช้แพตเทิร์นที่เรียบง่ายและหลีกเลี่ยง quantifier แบบซ้อนกัน
อ้างอิง modelCatalog
ใช้ modelCatalog เมื่อ OpenClaw ควรรู้เมทาดาทาโมเดลของ provider ก่อน
โหลด plugin runtime นี่คือแหล่งที่เป็นของ manifest สำหรับแถวแค็ตตาล็อกแบบคงที่,
นามแฝงของ provider, กฎการระงับ และโหมดการค้นพบ การรีเฟรช runtime
ยังคงเป็นหน้าที่ของโค้ด provider runtime แต่ manifest จะบอก core ว่าเมื่อใดต้องใช้ runtime
{ "providers": ["openai"], "modelCatalog": { "providers": { "openai": { "baseUrl": "https://api.openai.com/v1", "api": "openai-responses", "models": [ { "id": "gpt-5.4", "name": "GPT-5.4", "input": ["text", "image"], "reasoning": true, "contextWindow": 256000, "maxTokens": 128000, "cost": { "input": 1.25, "output": 10, "cacheRead": 0.125 }, "status": "available", "tags": ["default"] } ] } }, "aliases": { "azure-openai-responses": { "provider": "openai", "api": "azure-openai-responses" } }, "suppressions": [ { "provider": "azure-openai-responses", "model": "gpt-5.3-codex-spark", "reason": "not available on Azure OpenAI Responses" } ], "discovery": { "openai": "static" } }}ฟิลด์ระดับบนสุด:
| ฟิลด์ | ชนิด | ความหมาย |
|---|---|---|
providers |
Record<string, object> |
แถวแค็ตตาล็อกสำหรับรหัส provider ที่ plugin นี้เป็นเจ้าของ คีย์ควรปรากฏใน providers ระดับบนสุดด้วย |
aliases |
Record<string, object> |
นามแฝงของ provider ที่ควร resolve ไปยัง provider ที่เป็นเจ้าของสำหรับการวางแผนแค็ตตาล็อกหรือการระงับ |
suppressions |
object[] |
แถวโมเดลจากแหล่งอื่นที่ plugin นี้ระงับด้วยเหตุผลเฉพาะของ provider |
discovery |
Record<string, "static" | "refreshable" | "runtime"> |
ระบุว่าแค็ตตาล็อกของ provider สามารถอ่านจากเมทาดาทา manifest, รีเฟรชเข้า cache, หรือต้องใช้ runtime |
runtimeAugment |
boolean |
ตั้งเป็น true เฉพาะเมื่อ provider runtime ต้องต่อท้ายแถวแค็ตตาล็อกหลังการวางแผน manifest/config |
aliases มีส่วนร่วมในการค้นหาความเป็นเจ้าของของ provider สำหรับการวางแผน model-catalog
เป้าหมายของนามแฝงต้องเป็น provider ระดับบนสุดที่ plugin เดียวกันเป็นเจ้าของ เมื่อรายการ
ที่กรองด้วย provider ใช้นามแฝง OpenClaw จะอ่าน manifest ของเจ้าของและ
ใช้การ override API/base URL ของนามแฝงได้โดยไม่ต้องโหลด provider runtime
นามแฝงจะไม่ขยายรายการแค็ตตาล็อกที่ไม่ได้กรอง รายการแบบกว้างจะแสดงเฉพาะแถว
ของ provider canonical ที่เป็นเจ้าของเท่านั้น
suppressions แทนที่ hook suppressBuiltInModel ของ provider runtime แบบเก่า
รายการการระงับจะมีผลเฉพาะเมื่อ provider เป็นของ plugin หรือ
ประกาศเป็นคีย์ modelCatalog.aliases ที่ชี้ไปยัง provider ที่เป็นเจ้าของเท่านั้น hook การระงับ
ของ runtime จะไม่ถูกเรียกอีกต่อไประหว่างการ resolve โมเดล
ฟิลด์ของ provider:
| ฟิลด์ | ชนิด | ความหมาย |
|---|---|---|
baseUrl |
string |
base URL เริ่มต้นแบบไม่บังคับสำหรับโมเดลในแค็ตตาล็อก provider นี้ |
api |
ModelApi |
adapter API เริ่มต้นแบบไม่บังคับสำหรับโมเดลในแค็ตตาล็อก provider นี้ |
headers |
Record<string, string> |
header แบบคงที่ที่ไม่บังคับ ซึ่งใช้กับแค็ตตาล็อก provider นี้ |
models |
object[] |
แถวโมเดลที่จำเป็น แถวที่ไม่มี id จะถูกละเว้น |
ฟิลด์ของโมเดล:
| ฟิลด์ | ชนิด | ความหมาย |
|---|---|---|
id |
string |
รหัสโมเดลภายใน provider โดยไม่มีคำนำหน้า provider/ |
name |
string |
ชื่อที่แสดงแบบไม่บังคับ |
api |
ModelApi |
การ override API รายโมเดลแบบไม่บังคับ |
baseUrl |
string |
การ override base URL รายโมเดลแบบไม่บังคับ |
headers |
Record<string, string> |
header แบบคงที่รายโมเดลแบบไม่บังคับ |
input |
Array<"text" | "image" | "document" | "audio" | "video"> |
modality ที่โมเดลรับได้ |
reasoning |
boolean |
ระบุว่าโมเดลเปิดเผยพฤติกรรมการให้เหตุผลหรือไม่ |
contextWindow |
number |
หน้าต่าง context ดั้งเดิมของ provider |
contextTokens |
number |
เพดาน context runtime ที่มีผลแบบไม่บังคับ เมื่อแตกต่างจาก contextWindow |
maxTokens |
number |
จำนวน token เอาต์พุตสูงสุดเมื่อทราบ |
cost |
object |
ราคา USD ต่อหนึ่งล้าน token แบบไม่บังคับ รวมถึง tieredPricing แบบไม่บังคับ |
compat |
object |
flag ความเข้ากันได้แบบไม่บังคับที่ตรงกับความเข้ากันได้ของ config โมเดล OpenClaw |
status |
"available" | "preview" | "deprecated" | "disabled" |
สถานะการแสดงรายการ ระงับเฉพาะเมื่อแถวนั้นต้องไม่ปรากฏเลย |
statusReason |
string |
เหตุผลแบบไม่บังคับที่แสดงพร้อมสถานะที่ไม่พร้อมใช้งาน |
replaces |
string[] |
รหัสโมเดลภายใน provider รุ่นเก่าที่โมเดลนี้แทนที่ |
replacedBy |
string |
รหัสโมเดลภายใน provider ที่มาแทนสำหรับแถวที่ deprecated |
tags |
string[] |
แท็กที่เสถียรซึ่งใช้โดยตัวเลือกและตัวกรอง |
ฟิลด์การระงับ:
| ฟิลด์ | ชนิด | ความหมาย |
|---|---|---|
provider |
string |
รหัส provider สำหรับแถว upstream ที่ต้องระงับ ต้องเป็นของ plugin นี้หรือประกาศเป็นนามแฝงที่เป็นเจ้าของ |
model |
string |
รหัสโมเดลภายใน provider ที่ต้องระงับ |
reason |
string |
ข้อความแบบไม่บังคับที่แสดงเมื่อมีการร้องขอแถวที่ถูกระงับโดยตรง |
when.baseUrlHosts |
string[] |
รายการ host ของ base URL ของ provider ที่มีผลแบบไม่บังคับ ซึ่งต้องตรงก่อนจึงจะใช้การระงับ |
when.providerConfigApiIn |
string[] |
รายการค่า api ของ provider-config แบบตรงตัวที่ไม่บังคับ ซึ่งต้องตรงก่อนจึงจะใช้การระงับ |
อย่าใส่ข้อมูลที่มีเฉพาะ runtime ใน modelCatalog ใช้ static เฉพาะเมื่อแถวใน manifest
สมบูรณ์พอให้พื้นผิวรายการที่กรองด้วย provider และตัวเลือกข้าม
การค้นพบ registry/runtime ได้ ใช้ refreshable เมื่อแถวใน manifest มีประโยชน์
ในฐานะ seed หรือส่วนเสริมที่แสดงเป็นรายการได้ แต่ refresh/cache สามารถเพิ่มแถวเพิ่มเติมภายหลังได้
แถวแบบ refreshable ไม่ถือเป็นแหล่งอ้างอิงที่เด็ดขาดด้วยตัวเอง ใช้ runtime เมื่อ OpenClaw
ต้องโหลด provider runtime เพื่อทราบรายการ
อ้างอิง modelIdNormalization
ใช้ modelIdNormalization สำหรับการทำความสะอาด model-id ที่ provider เป็นเจ้าของแบบต้นทุนต่ำ ซึ่งต้อง
เกิดขึ้นก่อน provider runtime โหลด สิ่งนี้เก็บนามแฝง เช่น ชื่อโมเดลแบบสั้น,
รหัส legacy ภายใน provider และกฎคำนำหน้า proxy ไว้ใน manifest ของ plugin เจ้าของ
แทนที่จะอยู่ในตารางการเลือกโมเดลของ core
{ "providers": ["anthropic", "openrouter"], "modelIdNormalization": { "providers": { "anthropic": { "aliases": { "sonnet-4.6": "claude-sonnet-4-6" } }, "openrouter": { "prefixWhenBare": "openrouter" } } }}ฟิลด์ของ provider:
| ฟิลด์ | ชนิด | ความหมาย |
|---|---|---|
aliases |
Record<string,string> |
นามแฝง model-id แบบตรงตัวที่ไม่แยกตัวพิมพ์เล็กใหญ่ ค่าจะถูกส่งคืนตามที่เขียนไว้ |
stripPrefixes |
string[] |
คำนำหน้าที่ต้องลบก่อนค้นหานามแฝง มีประโยชน์สำหรับ provider/model ซ้ำซ้อนแบบ legacy |
prefixWhenBare |
string |
คำนำหน้าที่ต้องเพิ่มเมื่อรหัสโมเดลที่ normalize แล้ว ยังไม่มี / |
prefixWhenBareAfterAliasStartsWith |
object[] |
กฎคำนำหน้า bare-id แบบมีเงื่อนไขหลังค้นหานามแฝง โดยใช้คีย์ modelPrefix และ prefix |
อ้างอิง providerEndpoints
ใช้ providerEndpoints สำหรับการจำแนก endpoint ที่นโยบายคำขอทั่วไป
ต้องรู้ก่อน provider runtime โหลด Core ยังคงเป็นเจ้าของความหมายของแต่ละ
endpointClass; plugin manifest เป็นเจ้าของเมทาดาทา host และ base URL
ฟิลด์ของ Endpoint:
| Field | Type | ความหมาย |
|---|---|---|
endpointClass |
string |
คลาส endpoint หลักที่รู้จัก เช่น openrouter, moonshot-native หรือ google-vertex |
hosts |
string[] |
ชื่อโฮสต์แบบตรงตัวที่แมปกับคลาส endpoint |
hostSuffixes |
string[] |
ส่วนต่อท้ายของโฮสต์ที่แมปกับคลาส endpoint ใส่ . นำหน้าเพื่อจับคู่เฉพาะส่วนต่อท้ายโดเมน |
baseUrls |
string[] |
URL ฐาน HTTP(S) ที่ปรับรูปแบบแล้วแบบตรงตัวซึ่งแมปกับคลาส endpoint |
googleVertexRegion |
string |
ภูมิภาค Google Vertex แบบคงที่สำหรับโฮสต์ส่วนกลางแบบตรงตัว |
googleVertexRegionHostSuffix |
string |
ส่วนต่อท้ายที่จะตัดออกจากโฮสต์ที่ตรงกันเพื่อเปิดเผยคำนำหน้าภูมิภาค Google Vertex |
เอกสารอ้างอิง providerRequest
ใช้ providerRequest สำหรับเมตาดาต้าความเข้ากันได้ของคำขอที่มีต้นทุนต่ำ ซึ่งนโยบายคำขอทั่วไปต้องใช้โดยไม่ต้องโหลด runtime ของผู้ให้บริการ เก็บการเขียน payload ใหม่ที่เฉพาะเจาะจงกับพฤติกรรมไว้ใน hook runtime ของผู้ให้บริการหรือ helper ของกลุ่มผู้ให้บริการที่ใช้ร่วมกัน
{ "providers": ["vllm"], "providerRequest": { "providers": { "vllm": { "family": "vllm", "openAICompletions": { "supportsStreamingUsage": true } } } }}ฟิลด์ของผู้ให้บริการ:
| Field | Type | ความหมาย |
|---|---|---|
family |
string |
ป้ายกำกับกลุ่มผู้ให้บริการที่ใช้โดยการตัดสินใจความเข้ากันได้ของคำขอทั่วไปและการวินิจฉัย |
compatibilityFamily |
"moonshot" |
กลุ่มความเข้ากันได้ของกลุ่มผู้ให้บริการที่เป็นทางเลือกสำหรับ helper คำขอที่ใช้ร่วมกัน |
openAICompletions |
object |
แฟล็กคำขอ completions ที่เข้ากันได้กับ OpenAI ปัจจุบันคือ supportsStreamingUsage |
เอกสารอ้างอิง secretProviderIntegrations
ใช้ secretProviderIntegrations เมื่อ Plugin สามารถเผยแพร่พรีเซ็ตผู้ให้บริการ exec ของ SecretRef ที่นำกลับมาใช้ซ้ำได้ OpenClaw อ่านเมตาดาต้านี้ก่อนที่ runtime ของ Plugin จะโหลด เก็บความเป็นเจ้าของของ Plugin ไว้ใน secrets.providers.<alias>.pluginIntegration และปล่อยให้การ resolve secret จริงเป็นหน้าที่ของ runtime ของ SecretRef
พรีเซ็ตจะเปิดเผยเฉพาะสำหรับ Plugin ที่ bundled และ Plugin ที่ติดตั้งซึ่งค้นพบจากรากการติดตั้ง Plugin ที่จัดการไว้ เช่น การติดตั้งจาก git และ ClawHub
{ "secretProviderIntegrations": { "secret-store": { "providerAlias": "team-secrets", "displayName": "Team secrets", "source": "exec", "command": "${node}", "args": ["./bin/resolve-secrets.mjs"] } }}คีย์ของแมปคือ id ของการผสานรวม หากละ providerAlias ไว้ OpenClaw จะใช้ id ของการผสานรวมเป็น alias ของผู้ให้บริการ SecretRef alias ของผู้ให้บริการต้องตรงกับรูปแบบ alias ผู้ให้บริการ SecretRef ปกติ เช่น team-secrets หรือ onepassword-work
เมื่อ operator เลือกพรีเซ็ต OpenClaw จะเขียนการอ้างอิงผู้ให้บริการเช่น:
{ "secrets": { "providers": { "team-secrets": { "source": "exec", "pluginIntegration": { "pluginId": "acme-secrets", "integrationId": "secret-store" } } } }}เมื่อเริ่มต้นหรือโหลดซ้ำ OpenClaw จะ resolve ผู้ให้บริการนั้นโดยโหลดเมตาดาต้า manifest ของ Plugin ปัจจุบัน ตรวจสอบว่า Plugin เจ้าของติดตั้งและใช้งานอยู่ แล้วสร้างคำสั่ง exec จาก manifest การปิดใช้งานหรือลบ Plugin จะเพิกถอนผู้ให้บริการสำหรับ SecretRefs ที่ใช้งานอยู่ operator ที่ต้องการการกำหนดค่า exec แบบ standalone ยังสามารถเขียนผู้ให้บริการ command/args แบบแมนนวลได้โดยตรง
ปัจจุบันรองรับเฉพาะพรีเซ็ต source: "exec" เท่านั้น command ต้องเป็น ${node} และ args[0] ต้องเป็นสคริปต์ resolver แบบสัมพันธ์กับรากของ Plugin ที่ขึ้นต้นด้วย ./ OpenClaw จะ materialize ในตอนเริ่มต้นหรือโหลดซ้ำให้เป็นไฟล์ปฏิบัติการ Node ปัจจุบันและพาธสคริปต์แบบสัมบูรณ์ภายใน Plugin ตัวเลือก Node เช่น --require, --import, --loader, --env-file, --eval และ --print ไม่ได้เป็นส่วนหนึ่งของสัญญาพรีเซ็ต manifest operator ที่ต้องใช้คำสั่งที่ไม่ใช่ Node สามารถกำหนดค่าผู้ให้บริการ exec แบบแมนนวล standalone ได้โดยตรง
OpenClaw อนุมาน trustedDirs สำหรับพรีเซ็ต manifest จากรากของ Plugin และสำหรับพรีเซ็ต ${node} จะรวมไดเรกทอรีของไฟล์ปฏิบัติการ Node ปัจจุบันด้วย trustedDirs ที่เขียนใน manifest จะถูกละเว้น ตัวเลือกผู้ให้บริการ exec อื่น ๆ เช่น timeoutMs, maxOutputBytes, jsonOnly, env, passEnv และ allowInsecurePath จะส่งผ่านไปยังการกำหนดค่าผู้ให้บริการ exec ของ SecretRef ปกติ
เอกสารอ้างอิง modelPricing
ใช้ modelPricing เมื่อผู้ให้บริการต้องการพฤติกรรม pricing ของ control-plane ก่อนที่ runtime จะโหลด แคช pricing ของ Gateway อ่านเมตาดาต้านี้โดยไม่ต้อง import โค้ด runtime ของผู้ให้บริการ
{ "providers": ["ollama", "openrouter"], "modelPricing": { "providers": { "ollama": { "external": false }, "openrouter": { "openRouter": { "passthroughProviderModel": true }, "liteLLM": false } } }}ฟิลด์ของผู้ให้บริการ:
| Field | Type | ความหมาย |
|---|---|---|
external |
boolean |
ตั้งเป็น false สำหรับผู้ให้บริการแบบ local/self-hosted ที่ไม่ควรดึง pricing จาก OpenRouter หรือ LiteLLM เลย |
openRouter |
false | object |
การแมปสำหรับค้นหา pricing ของ OpenRouter false ปิดการค้นหา OpenRouter สำหรับผู้ให้บริการนี้ |
liteLLM |
false | object |
การแมปสำหรับค้นหา pricing ของ LiteLLM false ปิดการค้นหา LiteLLM สำหรับผู้ให้บริการนี้ |
ฟิลด์ของแหล่งข้อมูล:
| Field | Type | ความหมาย |
|---|---|---|
provider |
string |
id ผู้ให้บริการใน catalog ภายนอกเมื่อแตกต่างจาก id ผู้ให้บริการของ OpenClaw เช่น z-ai สำหรับผู้ให้บริการ zai |
passthroughProviderModel |
boolean |
ถือว่า id โมเดลที่มี slash เป็น ref ผู้ให้บริการ/โมเดลแบบซ้อน มีประโยชน์สำหรับผู้ให้บริการ proxy เช่น OpenRouter |
modelIdTransforms |
"version-dots"[] |
variant เพิ่มเติมของ model-id ใน catalog ภายนอก version-dots จะลอง id เวอร์ชันแบบมีจุด เช่น claude-opus-4.6 |
OpenClaw Provider Index
OpenClaw Provider Index คือเมตาดาต้า preview ที่ OpenClaw เป็นเจ้าของสำหรับผู้ให้บริการที่ Plugin ของผู้ให้บริการนั้นอาจยังไม่ได้ติดตั้ง ยังไม่ใช่ส่วนหนึ่งของ manifest ของ Plugin manifest ของ Plugin ยังคงเป็นแหล่งอำนาจของ Plugin ที่ติดตั้งแล้ว Provider Index คือสัญญา fallback ภายในที่พื้นผิวสำหรับผู้ให้บริการที่ติดตั้งได้ในอนาคตและตัวเลือกโมเดลก่อนติดตั้งจะใช้เมื่อ Plugin ของผู้ให้บริการยังไม่ได้ติดตั้ง
ลำดับอำนาจของ catalog:
- การกำหนดค่าของผู้ใช้
modelCatalogใน manifest ของ Plugin ที่ติดตั้งแล้ว- แคช catalog โมเดลจากการ refresh อย่างชัดเจน
- แถว preview ของ OpenClaw Provider Index
Provider Index ต้องไม่มี secret, สถานะ enabled, hook runtime หรือข้อมูลโมเดลที่เฉพาะกับบัญชีแบบ live catalog preview ของมันใช้ shape แถวผู้ให้บริการ modelCatalog เดียวกับ manifest ของ Plugin แต่ควรจำกัดไว้ที่เมตาดาต้าการแสดงผลที่เสถียร เว้นแต่ฟิลด์ adapter runtime เช่น api, baseUrl, pricing หรือแฟล็กความเข้ากันได้จะถูกตั้งใจให้สอดคล้องกับ manifest ของ Plugin ที่ติดตั้งแล้ว ผู้ให้บริการที่มีการค้นพบ /models แบบ live ควรเขียนแถวที่ refresh แล้วผ่านพาธแคช catalog โมเดลแบบชัดเจน แทนที่จะให้การ list ปกติหรือ onboarding เรียก API ของผู้ให้บริการ
รายการใน Provider Index อาจมีเมตาดาต้า Plugin ที่ติดตั้งได้สำหรับผู้ให้บริการที่ Plugin ย้ายออกจาก core แล้วหรือยังไม่ได้ติดตั้งด้วย เมตาดาต้านี้สะท้อนรูปแบบ catalog ของ channel: ชื่อแพ็กเกจ, npm install spec, integrity ที่คาดหวัง และป้ายกำกับตัวเลือก auth ที่ต้นทุนต่ำก็เพียงพอสำหรับแสดงตัวเลือก setup ที่ติดตั้งได้ เมื่อ Plugin ติดตั้งแล้ว manifest ของมันจะชนะ และรายการ Provider Index จะถูกละเว้นสำหรับผู้ให้บริการนั้น
คีย์ capability ระดับบนสุดแบบ legacy ถูกเลิกใช้แล้ว ใช้ openclaw doctor --fix เพื่อย้าย speechProviders, realtimeTranscriptionProviders, realtimeVoiceProviders, mediaUnderstandingProviders, imageGenerationProviders, videoGenerationProviders, webFetchProviders และ webSearchProviders ไปไว้ใต้ contracts; การโหลด manifest ปกติจะไม่ถือว่าฟิลด์ระดับบนสุดเหล่านั้นเป็นความเป็นเจ้าของ capability อีกต่อไป
Manifest เทียบกับ package.json
สองไฟล์นี้ทำหน้าที่ต่างกัน:
| File | ใช้สำหรับ |
|---|---|
openclaw.plugin.json |
การค้นพบ การตรวจสอบความถูกต้องของ config เมตาดาต้าตัวเลือก auth และคำใบ้ UI ที่ต้องมีอยู่ก่อนโค้ด Plugin จะทำงาน |
package.json |
เมตาดาต้า npm การติดตั้ง dependency และบล็อก openclaw ที่ใช้สำหรับ entrypoints, install gating, setup หรือเมตาดาต้า catalog |
หากไม่แน่ใจว่าเมตาดาต้าชิ้นหนึ่งควรอยู่ที่ไหน ให้ใช้กฎนี้:
- หาก OpenClaw ต้องรู้ก่อนโหลดโค้ด Plugin ให้ใส่ไว้ใน
openclaw.plugin.json - หากเกี่ยวกับ packaging, ไฟล์ entry หรือพฤติกรรมการติดตั้ง npm ให้ใส่ไว้ใน
package.json
ฟิลด์ package.json ที่ส่งผลต่อการค้นพบ
เมตาดาต้า Plugin บางส่วนก่อน runtime ตั้งใจให้อยู่ใน package.json ใต้บล็อก openclaw แทนที่จะอยู่ใน openclaw.plugin.json
openclaw.bundle และ openclaw.bundle.json ไม่ใช่สัญญา Plugin ของ OpenClaw; Plugin แบบ native ต้องใช้ openclaw.plugin.json ร่วมกับฟิลด์ package.json#openclaw ที่รองรับด้านล่าง
ตัวอย่างสำคัญ:
| ฟิลด์ | ความหมาย |
|---|---|
openclaw.extensions |
ประกาศ entrypoint ของ Plugin แบบเนทีฟ ต้องอยู่ภายในไดเรกทอรีแพ็กเกจของ Plugin |
openclaw.runtimeExtensions |
ประกาศ entrypoint ของรันไทม์ JavaScript ที่ build แล้วสำหรับแพ็กเกจที่ติดตั้ง ต้องอยู่ภายในไดเรกทอรีแพ็กเกจของ Plugin |
openclaw.setupEntry |
entrypoint แบบเบาสำหรับการตั้งค่าเท่านั้น ใช้ระหว่าง onboarding, การเริ่มต้น channel แบบเลื่อนเวลา และการค้นหาสถานะ channel/SecretRef แบบอ่านอย่างเดียว ต้องอยู่ภายในไดเรกทอรีแพ็กเกจของ Plugin |
openclaw.runtimeSetupEntry |
ประกาศ entrypoint การตั้งค่า JavaScript ที่ build แล้วสำหรับแพ็กเกจที่ติดตั้ง ต้องมี setupEntry, ต้องมีอยู่จริง และต้องอยู่ภายในไดเรกทอรีแพ็กเกจของ Plugin |
openclaw.channel |
เมตาดาทาแค็ตตาล็อก channel แบบประหยัด เช่น ป้ายกำกับ, path ของเอกสาร, alias และข้อความสำหรับการเลือก |
openclaw.channel.commands |
เมตาดาทาคำสั่งเนทีฟแบบคงที่และค่าเริ่มต้นอัตโนมัติของ skill เนทีฟ ใช้โดยพื้นผิว config, audit และรายการคำสั่งก่อนที่รันไทม์ channel จะโหลด |
openclaw.channel.configuredState |
เมตาดาทาตัวตรวจสอบสถานะที่กำหนดค่าแล้วแบบเบา ซึ่งตอบได้ว่า "การตั้งค่าแบบ env-only มีอยู่แล้วหรือไม่?" โดยไม่ต้องโหลดรันไทม์ channel ทั้งหมด |
openclaw.channel.persistedAuthState |
เมตาดาทาตัวตรวจสอบ auth ที่คงไว้แบบเบา ซึ่งตอบได้ว่า "มีสิ่งใดลงชื่อเข้าใช้แล้วหรือไม่?" โดยไม่ต้องโหลดรันไทม์ channel ทั้งหมด |
openclaw.install.clawhubSpec / openclaw.install.npmSpec / openclaw.install.localPath |
คำใบ้สำหรับติดตั้ง/อัปเดต Plugin ที่ bundled และ Plugin ที่เผยแพร่ภายนอก |
openclaw.install.defaultChoice |
path การติดตั้งที่ต้องการเมื่อมีแหล่งติดตั้งหลายแหล่ง |
openclaw.install.minHostVersion |
เวอร์ชันโฮสต์ OpenClaw ขั้นต่ำที่รองรับ โดยใช้ semver floor เช่น >=2026.3.22 หรือ >=2026.5.1-beta.1 |
openclaw.compat.pluginApi |
ช่วง API ของ Plugin OpenClaw ขั้นต่ำที่แพ็กเกจนี้ต้องการ โดยใช้ semver floor เช่น >=2026.5.27 |
openclaw.install.expectedIntegrity |
สตริง integrity ของ npm dist ที่คาดหวัง เช่น sha512-...; flow การติดตั้งและอัปเดตจะตรวจสอบ artifact ที่ดึงมากับค่านี้ |
openclaw.install.allowInvalidConfigRecovery |
อนุญาต path การกู้คืนแบบติดตั้ง Plugin ที่ bundled ใหม่ในขอบเขตแคบเมื่อ config ไม่ถูกต้อง |
openclaw.install.requiredPlatformPackages |
alias ของแพ็กเกจ npm ที่ต้อง materialize เมื่อข้อจำกัดแพลตฟอร์มใน lockfile ตรงกับโฮสต์ปัจจุบัน |
openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen |
อนุญาตให้พื้นผิว channel ของ setup-runtime โหลดก่อน listen แล้วเลื่อน Plugin channel ที่กำหนดค่าเต็มไว้จนกว่าจะเปิดใช้งานหลัง listen |
เมตาดาทา manifest ตัดสินว่าตัวเลือก provider/channel/setup ใดจะแสดงใน
onboarding ก่อนที่รันไทม์จะโหลด package.json#openclaw.install บอก
onboarding ว่าจะดึงหรือเปิดใช้ Plugin นั้นอย่างไรเมื่อผู้ใช้เลือกหนึ่งใน
ตัวเลือกเหล่านั้น อย่าย้ายคำใบ้การติดตั้งไปไว้ใน openclaw.plugin.json
openclaw.install.minHostVersion ถูกบังคับใช้ระหว่างการติดตั้งและการโหลด
registry ของ manifest สำหรับแหล่ง Plugin ที่ไม่ใช่ bundled ค่าที่ไม่ถูกต้องจะถูกปฏิเสธ;
ค่าที่ใหม่กว่าแต่ถูกต้องจะข้าม Plugin ภายนอกบนโฮสต์รุ่นเก่า Plugin source แบบ bundled
ถือว่า co-versioned กับ checkout ของโฮสต์
openclaw.install.requiredPlatformPackages ใช้สำหรับแพ็กเกจ npm ที่เปิดเผย
ไบนารีเนทีฟที่จำเป็นผ่าน alias แบบ optional และเฉพาะแพลตฟอร์ม ระบุชื่อ
แพ็กเกจ npm แบบ bare สำหรับทุก alias แพลตฟอร์มที่รองรับ ระหว่างการติดตั้ง npm,
OpenClaw จะตรวจสอบเฉพาะ alias ที่ประกาศซึ่งข้อจำกัดใน lockfile ตรงกับ
โฮสต์ปัจจุบัน หาก npm รายงานว่าสำเร็จแต่ละเว้น alias นั้น OpenClaw จะลองอีกครั้งหนึ่ง
ด้วย cache ใหม่และ rollback การติดตั้งหาก alias ยังขาดอยู่
openclaw.compat.pluginApi ถูกบังคับใช้ระหว่างการติดตั้งแพ็กเกจสำหรับแหล่ง
Plugin ที่ไม่ใช่ bundled ใช้ค่านี้สำหรับ floor ของ API ของ SDK/รันไทม์ Plugin OpenClaw ที่
แพ็กเกจถูก build มาด้วย ค่านี้อาจเข้มงวดกว่า minHostVersion ได้เมื่อ
แพ็กเกจ Plugin ต้องการ API ที่ใหม่กว่าแต่ยังคงคำใบ้การติดตั้งที่ต่ำกว่าสำหรับ
flow อื่น การซิงก์ release อย่างเป็นทางการของ OpenClaw จะ bump floor ของ API ของ Plugin อย่างเป็นทางการที่มีอยู่
เป็นเวอร์ชัน release ของ OpenClaw โดยค่าเริ่มต้น แต่ release เฉพาะ Plugin สามารถคง
floor ที่ต่ำกว่าได้เมื่อแพ็กเกจตั้งใจรองรับโฮสต์รุ่นเก่า อย่าใช้
เวอร์ชันแพ็กเกจเพียงอย่างเดียวเป็นสัญญาความเข้ากันได้ peerDependencies.openclaw
ยังคงเป็นเมตาดาทาแพ็กเกจ npm; OpenClaw ใช้สัญญา openclaw.compat.pluginApi
สำหรับการตัดสินใจความเข้ากันได้ของการติดตั้ง
เมตาดาทา install-on-demand อย่างเป็นทางการควรใช้ clawhubSpec เมื่อ Plugin
เผยแพร่บน ClawHub; onboarding จะถือค่านี้เป็นแหล่ง remote ที่ต้องการและ
บันทึกข้อเท็จจริง artifact ของ ClawHub หลังการติดตั้ง npmSpec ยังคงเป็น fallback
ด้านความเข้ากันได้สำหรับแพ็กเกจที่ยังไม่ได้ย้ายไป ClawHub
การ pin เวอร์ชัน npm แบบ exact อยู่ใน npmSpec แล้ว เช่น
"npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3" รายการแค็ตตาล็อกภายนอกอย่างเป็นทางการ
ควรจับคู่ spec แบบ exact กับ expectedIntegrity เพื่อให้ flow การอัปเดต fail
closed หาก artifact npm ที่ดึงมาไม่ตรงกับ release ที่ pin ไว้อีกต่อไป
onboarding แบบ interactive ยังคงเสนอ spec ของ npm registry ที่เชื่อถือได้ รวมถึงชื่อ
แพ็กเกจแบบ bare และ dist-tag เพื่อความเข้ากันได้ การวินิจฉัยแค็ตตาล็อกสามารถ
แยกแยะระหว่างแหล่งแบบ exact, floating, integrity-pinned, missing-integrity, package-name
mismatch และ default-choice ที่ไม่ถูกต้องได้ นอกจากนี้ยังเตือนเมื่อ
มี expectedIntegrity แต่ไม่มีแหล่ง npm ที่ถูกต้องซึ่งสามารถ pin ค่านั้นได้
เมื่อมี expectedIntegrity,
flow การติดตั้ง/อัปเดตจะบังคับใช้ค่านี้; เมื่อไม่มีค่านี้ การ resolve registry จะถูก
บันทึกโดยไม่มี integrity pin
Plugin channel ควรมี openclaw.setupEntry เมื่อการสแกนสถานะ, รายการ channel
หรือ SecretRef จำเป็นต้องระบุบัญชีที่กำหนดค่าแล้วโดยไม่โหลดรันไทม์ทั้งหมด
entry การตั้งค่าควรเปิดเผยเมตาดาทา channel พร้อม adapter สำหรับ config,
สถานะ และ secrets ที่ปลอดภัยสำหรับการตั้งค่า; เก็บ network client, listener ของ Gateway และ
รันไทม์ transport ไว้ใน entrypoint หลักของ extension
ฟิลด์ entrypoint ของรันไทม์ไม่ได้ override การตรวจสอบขอบเขตแพ็กเกจสำหรับฟิลด์
entrypoint ของ source ตัวอย่างเช่น openclaw.runtimeExtensions ไม่สามารถทำให้
path openclaw.extensions ที่หลุดออกนอกขอบเขตโหลดได้
openclaw.install.allowInvalidConfigRecovery มีขอบเขตแคบโดยเจตนา ค่านี้ไม่ได้
ทำให้ config ที่เสียโดยอำเภอใจติดตั้งได้ ปัจจุบันค่านี้อนุญาตเฉพาะให้ flow การติดตั้ง
กู้คืนจากความล้มเหลวเฉพาะของการอัปเกรด Plugin ที่ bundled ซึ่งล้าสมัย เช่น
path ของ Plugin ที่ bundled หายไป หรือรายการ channels.<id> ที่ล้าสมัยสำหรับ
Plugin ที่ bundled เดียวกันนั้น ข้อผิดพลาด config ที่ไม่เกี่ยวข้องยังคงบล็อกการติดตั้งและส่งผู้ปฏิบัติงาน
ไปที่ openclaw doctor --fix
openclaw.channel.persistedAuthState คือเมตาดาทาแพ็กเกจสำหรับโมดูลตัวตรวจสอบ
ขนาดเล็ก:
{ "openclaw": { "channel": { "id": "whatsapp", "persistedAuthState": { "specifier": "./auth-presence", "exportName": "hasAnyWhatsAppAuth" } } }}ใช้เมื่อ flow การตั้งค่า, doctor, สถานะ หรือ presence แบบอ่านอย่างเดียวต้องการ probe auth แบบ yes/no ที่ประหยัดก่อนที่ Plugin channel ทั้งหมดจะโหลด สถานะ auth ที่คงไว้ ไม่ใช่สถานะ channel ที่กำหนดค่าแล้ว: อย่าใช้เมตาดาทานี้เพื่อเปิดใช้ Plugin อัตโนมัติ, ซ่อมแซม dependency ของรันไทม์ หรือตัดสินว่าควรโหลดรันไทม์ channel หรือไม่ export เป้าหมายควรเป็นฟังก์ชันขนาดเล็กที่อ่านเฉพาะสถานะที่คงไว้; อย่า route ผ่าน barrel รันไทม์ channel ทั้งหมด
openclaw.channel.configuredState ใช้รูปแบบเดียวกันสำหรับการตรวจสอบแบบประหยัดว่า
ตั้งค่า env-only แล้วหรือไม่:
{ "openclaw": { "channel": { "id": "telegram", "configuredState": { "specifier": "./configured-state", "exportName": "hasTelegramConfiguredState" } } }}ใช้เมื่อ channel สามารถตอบสถานะที่กำหนดค่าแล้วจาก env หรือ input ขนาดเล็กอื่นที่ไม่ใช่รันไทม์
หากการตรวจสอบต้องการการ resolve config ทั้งหมดหรือรันไทม์ channel จริง
ให้เก็บ logic นั้นไว้ใน hook config.hasConfiguredState ของ Plugin แทน
ลำดับความสำคัญในการค้นพบ (id ของ Plugin ซ้ำ)
OpenClaw ค้นพบ Plugin จาก root หลายแห่ง สำหรับลำดับการสแกน filesystem แบบ raw
ดูที่ ลำดับการสแกน Plugin
หากการค้นพบสองรายการใช้ id เดียวกัน จะเก็บเฉพาะ manifest ที่มี
ลำดับความสำคัญสูงสุด เท่านั้น; duplicate ที่มีลำดับความสำคัญต่ำกว่าจะถูกทิ้งแทนที่จะโหลดเคียงข้างกัน
ลำดับความสำคัญ จากสูงสุดไปต่ำสุด:
- เลือกโดย config — path ที่ pin อย่างชัดเจนใน
plugins.entries.<id> - Bundled — Plugin ที่มาพร้อมกับ OpenClaw
- ติดตั้งแบบ global — Plugin ที่ติดตั้งลงใน root ของ Plugin OpenClaw แบบ global
- Workspace — Plugin ที่ค้นพบโดยอิงกับ workspace ปัจจุบัน
ผลที่ตามมา:
- สำเนา fork หรือล้าสมัยของ Plugin ที่ bundled ซึ่งอยู่ใน workspace จะไม่ shadow build ที่ bundled
- หากต้องการ override Plugin ที่ bundled ด้วย Plugin local จริง ๆ ให้ pin ผ่าน
plugins.entries.<id>เพื่อให้ชนะด้วยลำดับความสำคัญ แทนการพึ่งพาการค้นพบจาก workspace - การทิ้ง duplicate จะถูกบันทึกใน log เพื่อให้ Doctor และการวินิจฉัยการเริ่มต้นชี้ไปยังสำเนาที่ถูกทิ้งได้
- override duplicate ที่เลือกโดย config จะถูกเขียนใน diagnostics ว่าเป็น override อย่างชัดเจน แต่ยังคงเตือนเพื่อให้ fork ที่ล้าสมัยและ shadow โดยไม่ตั้งใจยังมองเห็นได้
ข้อกำหนด JSON Schema
- Plugin ทุกตัวต้องมาพร้อม JSON Schema แม้ว่าจะไม่รับการกำหนดค่าใดๆ ก็ตาม.
- สคีมาเปล่าสามารถใช้ได้ (เช่น
{ "type": "object", "additionalProperties": false }). - สคีมาจะถูกตรวจสอบความถูกต้องตอนอ่าน/เขียนการกำหนดค่า ไม่ใช่ตอน runtime.
- เมื่อขยายหรือ fork Plugin ที่ bundled พร้อมคีย์การกำหนดค่าใหม่ ให้อัปเดต
configSchemaในopenclaw.plugin.jsonของ Plugin นั้นพร้อมกัน สคีมาของ Plugin ที่ bundled มีความเข้มงวด ดังนั้นการเพิ่มplugins.entries.<id>.config.myNewKeyในการกำหนดค่าของผู้ใช้โดยไม่เพิ่มmyNewKeyลงในconfigSchema.propertiesจะถูกปฏิเสธก่อนที่ runtime ของ Plugin จะโหลด.
ตัวอย่างการขยายสคีมา:
{ "configSchema": { "type": "object", "additionalProperties": false, "properties": { "myNewKey": { "type": "string" } } }}พฤติกรรมการตรวจสอบความถูกต้อง
- คีย์
channels.*ที่ไม่รู้จักคือ ข้อผิดพลาด เว้นแต่ id ของ channel จะถูกประกาศโดย manifest ของ Plugin. plugins.entries.<id>,plugins.allow,plugins.denyและplugins.slots.*ต้องอ้างอิง id ของ Plugin ที่ ค้นพบได้ id ที่ไม่รู้จักคือ ข้อผิดพลาด.- หากติดตั้ง Plugin แล้วแต่ manifest หรือสคีมาเสียหายหรือขาดหาย การตรวจสอบความถูกต้องจะล้มเหลวและ Doctor จะรายงานข้อผิดพลาดของ Plugin.
- หากมีการกำหนดค่า Plugin อยู่แต่ Plugin ถูก ปิดใช้งาน การกำหนดค่าจะถูกเก็บไว้และ จะแสดง คำเตือน ใน Doctor + บันทึก.
ดู ข้อมูลอ้างอิงการกำหนดค่า สำหรับสคีมา plugins.* แบบเต็ม.
หมายเหตุ
- manifest เป็นสิ่งที่ จำเป็นสำหรับ Plugin แบบ native ของ OpenClaw รวมถึงการโหลดจากระบบไฟล์ภายในเครื่อง runtime ยังโหลดโมดูล Plugin แยกต่างหาก; manifest ใช้สำหรับการค้นพบ + การตรวจสอบความถูกต้องเท่านั้น.
- manifest แบบ native จะถูก parse ด้วย JSON5 ดังนั้นจึงยอมรับคอมเมนต์ comma ท้ายรายการ และคีย์ที่ไม่ใส่เครื่องหมายคำพูดได้ ตราบใดที่ค่าสุดท้ายยังเป็นออบเจ็กต์.
- loader ของ manifest จะอ่านเฉพาะฟิลด์ manifest ที่มีเอกสารกำกับเท่านั้น หลีกเลี่ยงคีย์ระดับบนสุดแบบกำหนดเอง.
channels,providers,cliBackendsและskillsสามารถละไว้ได้ทั้งหมดเมื่อ Plugin ไม่จำเป็นต้องใช้.providerCatalogEntryต้องคงความเบาและไม่ควร import โค้ด runtime ขนาดใหญ่; ใช้สำหรับเมตาดาต้าแค็ตตาล็อก provider แบบ static หรือ descriptor การค้นพบแบบแคบ ไม่ใช่การประมวลผลระหว่างคำขอ.- ชนิด Plugin แบบ exclusive จะถูกเลือกผ่าน
plugins.slots.*:kind: "memory"ผ่านplugins.slots.memory,kind: "context-engine"ผ่านplugins.slots.contextEngine(ค่าเริ่มต้นlegacy). - ประกาศชนิด Plugin แบบ exclusive ใน manifest นี้
OpenClawPluginDefinition.kindใน entry ของ runtime เลิกแนะนำให้ใช้แล้ว และยังคงอยู่เพื่อเป็น fallback ด้านความเข้ากันได้สำหรับ Plugin รุ่นเก่าเท่านั้น. - เมตาดาต้า env-var (
setup.providers[].envVars,providerAuthEnvVarsที่เลิกแนะนำให้ใช้แล้ว และchannelEnvVars) เป็นแบบ declarative เท่านั้น สถานะ การ audit การตรวจสอบความถูกต้องของการส่งผ่าน Cron และพื้นผิวแบบอ่านอย่างเดียวอื่นๆ ยังคงใช้นโยบายความเชื่อถือของ Plugin และการเปิดใช้งานที่มีผลจริงก่อนจะถือว่า env var ถูกกำหนดค่าแล้ว. - สำหรับเมตาดาต้า wizard ของ runtime ที่ต้องใช้โค้ด provider ดู hooks ของ runtime provider.
- หาก Plugin ของคุณขึ้นกับ native modules ให้จัดทำเอกสารขั้นตอนการ build และข้อกำหนด allowlist ของ package-manager (เช่น pnpm
allow-build-scripts+pnpm rebuild <package>).