Plugin SDK reference

ไฟล์กำกับ Plugin

หน้านี้ครอบคลุม ไฟล์ manifest ของ Plugin OpenClaw แบบเนทีฟ ซึ่งคือ openclaw.plugin.json สำหรับโครงสร้างบันเดิลที่เข้ากันได้ (Codex, Claude, Cursor) โปรดดู บันเดิล Plugin

รูปแบบบันเดิลที่เข้ากันได้จะใช้ไฟล์ manifest ของตนเองแทน:

  • บันเดิล Codex: .codex-plugin/plugin.json
  • บันเดิล Claude: .claude-plugin/plugin.json หรือโครงสร้างคอมโพเนนต์ Claude เริ่มต้นที่ไม่มีไฟล์ manifest
  • บันเดิล 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 หากไฟล์ manifest ขาดหายหรือไม่ถูกต้อง การตรวจสอบความถูกต้องของการกำหนดค่าจะถูกระงับและถือเป็นข้อผิดพลาดของ Plugin

โปรดดู Plugin สำหรับคู่มือระบบ Plugin ฉบับเต็ม และ โมเดลความสามารถ สำหรับโมเดลความสามารถแบบเนทีฟและคำแนะนำปัจจุบันด้านความเข้ากันได้ภายนอก

ไฟล์นี้ทำหน้าที่อะไร

openclaw.plugin.json คือเมทาดาทาที่ OpenClaw อ่าน ก่อนโหลดโค้ด Plugin ของคุณ ทุกอย่างในไฟล์นี้ต้องตรวจสอบได้โดยใช้ทรัพยากรน้อย โดยไม่ต้องเริ่มรันไทม์ของ Plugin

ใช้ไฟล์นี้สำหรับ:

  • ข้อมูลประจำตัวของ Plugin การตรวจสอบความถูกต้องของการกำหนดค่า และคำแนะนำสำหรับ UI การกำหนดค่า
  • เมทาดาทาสำหรับการยืนยันตัวตน การเริ่มต้นใช้งาน และการตั้งค่า (นามแฝง การเปิดใช้งานอัตโนมัติ ตัวแปรสภาพแวดล้อมของผู้ให้บริการ ตัวเลือกการยืนยันตัวตน)
  • คำแนะนำการเปิดใช้งานสำหรับพื้นผิวของระนาบควบคุม
  • ความเป็นเจ้าของตระกูลโมเดลแบบย่อ
  • สแนปช็อตแบบคงที่ของความเป็นเจ้าของความสามารถ (contracts)
  • เมทาดาทาของตัวรัน QA ที่โฮสต์ openclaw qa ที่ใช้ร่วมกันสามารถตรวจสอบได้
  • เมทาดาทาการกำหนดค่าเฉพาะช่องทางที่รวมเข้ากับแค็ตตาล็อกและพื้นผิวการตรวจสอบความถูกต้อง

อย่าใช้ไฟล์นี้สำหรับ: การลงทะเบียนพฤติกรรมรันไทม์ การประกาศจุดเริ่มต้นของโค้ด หรือเมทาดาทาการติดตั้ง npm สิ่งเหล่านี้ควรอยู่ในโค้ด Plugin และ package.json

ตัวอย่างขั้นต่ำ

json
{  "id": "voice-call",  "configSchema": {    "type": "object",    "additionalProperties": false,    "properties": {}  }}

ตัวอย่างแบบละเอียด

json
{  "id": "openrouter",  "name": "OpenRouter",  "description": "Plugin ผู้ให้บริการ OpenRouter",  "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"  },  "providerAuthChoices": [    {      "provider": "openrouter",      "method": "api-key",      "choiceId": "openrouter-api-key",      "choiceLabel": "คีย์ API ของ OpenRouter",      "groupId": "openrouter",      "groupLabel": "OpenRouter",      "optionKey": "openrouterApiKey",      "cliFlag": "--openrouter-api-key",      "cliOption": "--openrouter-api-key <key>",      "cliDescription": "คีย์ API ของ OpenRouter",      "onboardingScopes": ["text-inference"]    }  ],  "uiHints": {    "apiKey": {      "label": "คีย์ API",      "placeholder": "sk-or-v1-...",      "sensitive": true    }  },  "configSchema": {    "type": "object",    "additionalProperties": false,    "properties": {      "apiKey": {        "type": "string"      }    }  }}

ข้อมูลอ้างอิงฟิลด์ระดับบนสุด

ฟิลด์ จำเป็น ชนิด ความหมาย
id ใช่ string รหัส Plugin มาตรฐาน ซึ่งเป็นรหัสที่ใช้ใน plugins.entries.<id>
configSchema ใช่ object JSON Schema แบบอินไลน์สำหรับการกำหนดค่าของ Plugin นี้
requiresPlugins ไม่ string[] รหัส Plugin ที่ต้องติดตั้งร่วมด้วยเพื่อให้ Plugin นี้มีผล การค้นหาจะยังคงทำให้โหลด Plugin ได้ แต่จะแจ้งเตือนเมื่อไม่มี Plugin ที่จำเป็นรายการใดรายการหนึ่ง
enabledByDefault ไม่ true ระบุให้ Plugin ที่รวมมากับระบบเปิดใช้งานเป็นค่าเริ่มต้น หากละเว้นหรือกำหนดเป็นค่าใดก็ตามที่ไม่ใช่ true Plugin จะยังคงปิดใช้งานเป็นค่าเริ่มต้น
enabledByDefaultOnPlatforms ไม่ string[] ระบุให้ Plugin ที่รวมมากับระบบเปิดใช้งานเป็นค่าเริ่มต้นเฉพาะบนแพลตฟอร์ม Node.js ที่ระบุไว้ เช่น ["darwin"] การกำหนดค่าอย่างชัดเจนยังคงมีลำดับความสำคัญสูงกว่า
legacyPluginIds ไม่ string[] รหัสแบบเดิมที่จะถูกปรับให้เป็นรหัส Plugin มาตรฐานนี้
autoEnableWhenConfiguredProviders ไม่ string[] รหัสผู้ให้บริการที่ควรเปิดใช้งาน Plugin นี้โดยอัตโนมัติเมื่อการยืนยันตัวตน การกำหนดค่า หรือการอ้างอิงโมเดลกล่าวถึงรหัสเหล่านั้น
kind ไม่ PluginKind | PluginKind[] ประกาศชนิด Plugin แบบเอกสิทธิ์หนึ่งชนิดขึ้นไป ("memory", "context-engine") ที่ใช้โดย plugins.slots.* Plugin ที่เป็นเจ้าของทั้งสองสล็อตจะประกาศทั้งสองชนิดไว้ในอาร์เรย์เดียว
channels ไม่ string[] รหัสช่องทางที่ Plugin นี้เป็นเจ้าของ ใช้สำหรับการค้นหาและการตรวจสอบความถูกต้องของการกำหนดค่า
providers ไม่ string[] รหัสผู้ให้บริการที่ Plugin นี้เป็นเจ้าของ
providerCatalogEntry ไม่ string พาธโมดูลแค็ตตาล็อกผู้ให้บริการแบบน้ำหนักเบาที่สัมพันธ์กับรากของ Plugin สำหรับเมทาดาทาแค็ตตาล็อกผู้ให้บริการที่อยู่ในขอบเขตของแมนิเฟสต์ ซึ่งโหลดได้โดยไม่ต้องเปิดใช้งานรันไทม์ทั้งหมดของ Plugin
modelSupport ไม่ object เมทาดาทาแบบย่อของตระกูลโมเดลที่แมนิเฟสต์เป็นเจ้าของ ซึ่งใช้โหลด Plugin โดยอัตโนมัติก่อนรันไทม์
modelCatalog ไม่ object เมทาดาทาแค็ตตาล็อกโมเดลแบบประกาศสำหรับผู้ให้บริการที่ Plugin นี้เป็นเจ้าของ นี่คือสัญญาระดับส่วนควบคุมสำหรับการแสดงรายการแบบอ่านอย่างเดียว การเริ่มต้นใช้งาน ตัวเลือกโมเดล นามแฝง และการระงับในอนาคต โดยไม่ต้องโหลดรันไทม์ของ Plugin
modelPricing ไม่ object นโยบายค้นหาราคาภายนอกที่ผู้ให้บริการเป็นเจ้าของ ใช้เพื่อยกเว้นผู้ให้บริการภายในเครื่อง/โฮสต์เองออกจากแค็ตตาล็อกราคาระยะไกล หรือแมปการอ้างอิงผู้ให้บริการกับรหัสแค็ตตาล็อก OpenRouter/LiteLLM โดยไม่ฮาร์ดโค้ดรหัสผู้ให้บริการในแกนกลาง
modelIdNormalization ไม่ object การล้างนามแฝง/คำนำหน้ารหัสโมเดลที่ผู้ให้บริการเป็นเจ้าของ ซึ่งต้องทำงานก่อนโหลดรันไทม์ของผู้ให้บริการ
providerEndpoints ไม่ object[] เมทาดาทาโฮสต์ปลายทาง/baseUrl ที่แมนิเฟสต์เป็นเจ้าของสำหรับเส้นทางผู้ให้บริการ ซึ่งแกนกลางต้องจัดประเภทก่อนโหลดรันไทม์ของผู้ให้บริการ
providerRequest ไม่ object เมทาดาทาตระกูลผู้ให้บริการและความเข้ากันได้ของคำขอที่ประมวลผลได้รวดเร็ว ซึ่งนโยบายคำขอทั่วไปใช้ก่อนโหลดรันไทม์ของผู้ให้บริการ
secretProviderIntegrations ไม่ Record<string, object> ค่าที่ตั้งไว้ล่วงหน้าของผู้ให้บริการการเรียกใช้ SecretRef แบบประกาศ ซึ่งพื้นผิวการตั้งค่าหรือการติดตั้งสามารถนำเสนอได้โดยไม่ต้องฮาร์ดโค้ดการผสานรวมเฉพาะผู้ให้บริการในแกนกลาง
cliBackends ไม่ string[] รหัสแบ็กเอนด์การอนุมานของ CLI ที่ Plugin นี้เป็นเจ้าของ ใช้สำหรับเปิดใช้งานโดยอัตโนมัติเมื่อเริ่มต้นระบบจากการอ้างอิงการกำหนดค่าที่ระบุไว้อย่างชัดเจน
syntheticAuthRefs ไม่ string[] การอ้างอิงผู้ให้บริการหรือแบ็กเอนด์ CLI ที่ควรตรวจสอบฮุกการยืนยันตัวตนสังเคราะห์ซึ่ง Plugin เป็นเจ้าของ ระหว่างการค้นหาโมเดลแบบเย็นก่อนโหลดรันไทม์
nonSecretAuthMarkers ไม่ string[] ค่าคีย์ API ตัวแทนที่ Plugin ซึ่งรวมมากับระบบเป็นเจ้าของ โดยแสดงถึงสถานะข้อมูลประจำตัวภายในเครื่อง OAuth หรือข้อมูลประจำตัวแวดล้อมที่ไม่ใช่ความลับ
commandAliases ไม่ object[] ชื่อคำสั่งที่ Plugin นี้เป็นเจ้าของ ซึ่งควรสร้างการวินิจฉัยการกำหนดค่าและ CLI ที่รับรู้ถึง Plugin ก่อนโหลดรันไทม์
providerUsageAuthEnvVars ไม่ Record<string, string[]> ข้อมูลประจำตัวผู้ให้บริการสำหรับการใช้งาน/การเรียกเก็บเงินเท่านั้น OpenClaw ใช้ชื่อเหล่านี้สำหรับการค้นหาการใช้งานและการลบข้อมูลลับ แต่ไม่ใช้สำหรับการยืนยันตัวตนในการอนุมาน
providerAuthAliases ไม่ Record<string, string> รหัสผู้ให้บริการที่ควรนำรหัสผู้ให้บริการอื่นมาใช้ซ้ำสำหรับการค้นหาการยืนยันตัวตน เช่น ผู้ให้บริการด้านการเขียนโค้ดที่ใช้คีย์ API และโปรไฟล์การยืนยันตัวตนร่วมกับผู้ให้บริการพื้นฐาน
providerAuthChoices ไม่ object[] เมทาดาทาตัวเลือกการยืนยันตัวตนที่ประมวลผลได้รวดเร็วสำหรับตัวเลือกการเริ่มต้นใช้งาน การแก้ไขผู้ให้บริการที่ต้องการ และการเชื่อมต่อแฟล็ก CLI อย่างง่าย
activation ไม่ object เมทาดาทาตัววางแผนการเปิดใช้งานที่ประมวลผลได้รวดเร็วสำหรับการโหลดที่ทริกเกอร์โดยการเริ่มต้นระบบ ผู้ให้บริการ คำสั่ง ช่องทาง เส้นทาง และความสามารถ เป็นเพียงเมทาดาทาเท่านั้น รันไทม์ของ Plugin ยังคงเป็นเจ้าของพฤติกรรมจริง
setup ไม่ object ตัวอธิบายการตั้งค่า/การเริ่มต้นใช้งานที่ประมวลผลได้รวดเร็ว ซึ่งพื้นผิวการค้นหาและการตั้งค่าสามารถตรวจสอบได้โดยไม่ต้องโหลดรันไทม์ของ Plugin
qaRunners ไม่ object[] ตัวอธิบายตัวรัน QA ที่ประมวลผลได้รวดเร็ว ซึ่งโฮสต์ openclaw qa ที่ใช้ร่วมกันจะใช้ก่อนโหลดรันไทม์ของ Plugin
contracts ไม่ object สแนปช็อตแบบคงที่ของการเป็นเจ้าของความสามารถสำหรับฮุกการยืนยันตัวตนภายนอก การฝัง การพูด การถอดเสียงแบบเรียลไทม์ เสียงแบบเรียลไทม์ การทำความเข้าใจสื่อ การสร้างภาพ/วิดีโอ/เพลง การดึงข้อมูลเว็บ การค้นหาเว็บ ผู้ให้บริการเวิร์กเกอร์ การแยกเนื้อหาเอกสาร/เว็บ และการเป็นเจ้าของเครื่องมือ
configContracts ไม่ object พฤติกรรมการกำหนดค่าที่แมนิเฟสต์เป็นเจ้าของ ซึ่งตัวช่วยทั่วไปของแกนกลางใช้ ได้แก่ การตรวจหาแฟล็กอันตราย เป้าหมายการย้าย SecretRef และการจำกัดพาธการกำหนดค่าแบบเดิม ดูข้อมูลอ้างอิง configContracts
mediaUnderstandingProviderMetadata ไม่ Record<string, object> ค่าเริ่มต้นสำหรับการทำความเข้าใจสื่อที่ประมวลผลได้รวดเร็วสำหรับรหัสผู้ให้บริการที่ประกาศไว้ใน contracts.mediaUnderstandingProviders
imageGenerationProviderMetadata ไม่ Record<string, object> เมทาดาทาการยืนยันตัวตนสำหรับการสร้างรูปภาพที่ตรวจสอบได้อย่างรวดเร็วสำหรับ ID ผู้ให้บริการที่ประกาศใน contracts.imageGenerationProviders รวมถึงชื่อแทนการยืนยันตัวตนที่ผู้ให้บริการเป็นเจ้าของและข้อกำหนดป้องกันสำหรับ URL ฐาน
videoGenerationProviderMetadata ไม่ Record<string, object> เมทาดาทาการยืนยันตัวตนสำหรับการสร้างวิดีโอที่ตรวจสอบได้อย่างรวดเร็วสำหรับ ID ผู้ให้บริการที่ประกาศใน contracts.videoGenerationProviders รวมถึงชื่อแทนการยืนยันตัวตนที่ผู้ให้บริการเป็นเจ้าของและข้อกำหนดป้องกันสำหรับ URL ฐาน
musicGenerationProviderMetadata ไม่ Record<string, object> เมทาดาทาการยืนยันตัวตนสำหรับการสร้างเพลงที่ตรวจสอบได้อย่างรวดเร็วสำหรับ ID ผู้ให้บริการที่ประกาศใน contracts.musicGenerationProviders รวมถึงชื่อแทนการยืนยันตัวตนที่ผู้ให้บริการเป็นเจ้าของและข้อกำหนดป้องกันสำหรับ URL ฐาน
toolMetadata ไม่ Record<string, object> เมทาดาทาความพร้อมใช้งานที่ตรวจสอบได้อย่างรวดเร็วสำหรับเครื่องมือที่ Plugin เป็นเจ้าของซึ่งประกาศใน contracts.tools ใช้เมื่อเครื่องมือไม่ควรโหลดรันไทม์ เว้นแต่จะมีหลักฐานจากการกำหนดค่า ตัวแปรสภาพแวดล้อม หรือการยืนยันตัวตน
channelConfigs ไม่ Record<string, object> เมทาดาทาการกำหนดค่าช่องทางที่ไฟล์แมนิเฟสต์เป็นเจ้าของ ซึ่งผสานเข้ากับส่วนการค้นพบและการตรวจสอบความถูกต้องก่อนโหลดรันไทม์
skills ไม่ string[] ไดเรกทอรี Skills ที่จะโหลด โดยระบุแบบสัมพัทธ์กับรากของ Plugin
name ไม่ string ชื่อ Plugin ที่มนุษย์อ่านเข้าใจได้
description ไม่ string สรุปสั้นๆ ที่แสดงในส่วนต่างๆ ของ Plugin
catalog ไม่ object คำแนะนำด้านการนำเสนอที่เป็นทางเลือกสำหรับส่วนแค็ตตาล็อก Plugin เมทาดาทานี้ไม่ได้ติดตั้ง เปิดใช้งาน หรือให้ความไว้วางใจแก่ Plugin
icon ไม่ string URL รูปภาพแบบ HTTPS สำหรับการ์ดในมาร์เก็ตเพลส/แค็ตตาล็อก ClawHub ยอมรับ URL https:// ใดๆ ที่ถูกต้อง และจะใช้ไอคอน Plugin เริ่มต้นแทนเมื่อไม่ได้ระบุค่านี้หรือค่าไม่ถูกต้อง
version ไม่ string เวอร์ชัน Plugin สำหรับให้ข้อมูล
uiHints ไม่ Record<string, object> ป้ายกำกับ UI ข้อความตัวอย่าง และคำแนะนำระดับความอ่อนไหวสำหรับฟิลด์การกำหนดค่า

ข้อมูลอ้างอิง catalog

catalog ให้คำแนะนำการแสดงผลเพิ่มเติมแก่เบราว์เซอร์ Plugin โฮสต์อาจไม่ใช้คำแนะนำเหล่านี้ คำแนะนำเหล่านี้จะไม่ติดตั้งหรือเปิดใช้งาน Plugin และไม่เปลี่ยนพฤติกรรมขณะรันไทม์หรือระดับความน่าเชื่อถือของ Plugin

json
{  "catalog": {    "featured": true,    "order": 10  }}
ฟิลด์ ชนิด ความหมาย
featured boolean พื้นที่แสดง catalog ควรแนะนำ Plugin นี้หรือไม่
order number คำแนะนำลำดับการแสดงแบบเรียงจากน้อยไปมากในบรรดา Plugin ที่ผ่านการคัดสรร โดยค่าที่ต่ำกว่าจะแสดงก่อน

ข้อมูลอ้างอิงเมทาดาทาของผู้ให้บริการการสร้าง

ฟิลด์เมทาดาทาของผู้ให้บริการการสร้างอธิบายสัญญาณการยืนยันตัวตนแบบคงที่สำหรับผู้ให้บริการที่ประกาศในรายการ contracts.*GenerationProviders ที่ตรงกัน OpenClaw อ่านฟิลด์เหล่านี้ก่อนโหลดรันไทม์ของผู้ให้บริการ เพื่อให้เครื่องมือหลักตัดสินได้ว่าผู้ให้บริการการสร้างพร้อมใช้งานหรือไม่โดยไม่ต้องนำเข้า Plugin ของผู้ให้บริการทุกรายการ

ใช้ฟิลด์เหล่านี้เฉพาะกับข้อเท็จจริงเชิงประกาศที่ตรวจสอบได้โดยใช้ทรัพยากรน้อยเท่านั้น การรับส่งข้อมูล การแปลงคำขอ การรีเฟรชโทเค็น การตรวจสอบข้อมูลประจำตัว และพฤติกรรมการสร้างจริงยังคงอยู่ในรันไทม์ของ Plugin

json
{  "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 ผู้ให้บริการเพิ่มเติมที่ควรนับเป็นนามแฝงการยืนยันตัวตนแบบคงที่สำหรับผู้ให้บริการการสร้าง
authProviders ไม่ string[] ID ผู้ให้บริการซึ่งโปรไฟล์การยืนยันตัวตนที่กำหนดค่าไว้ควรนับเป็นการยืนยันตัวตนสำหรับผู้ให้บริการการสร้างนี้
configSignals ไม่ object[] สัญญาณความพร้อมใช้งานที่ตรวจสอบเฉพาะการกำหนดค่าโดยใช้ทรัพยากรน้อย สำหรับผู้ให้บริการภายในเครื่องหรือแบบโฮสต์เองที่กำหนดค่าได้โดยไม่ต้องใช้โปรไฟล์การยืนยันตัวตนหรือตัวแปรสภาพแวดล้อม
authSignals ไม่ object[] สัญญาณการยืนยันตัวตนที่ระบุอย่างชัดเจน เมื่อมีฟิลด์นี้ สัญญาณเหล่านี้จะแทนที่ชุดสัญญาณเริ่มต้นจาก ID ผู้ให้บริการ, aliases และ authProviders
referenceAudioInputs ไม่ boolean สำหรับการสร้างวิดีโอเท่านั้น ตั้งค่าเป็น true เมื่อผู้ให้บริการยอมรับแอสเซ็ตเสียงอ้างอิง มิฉะนั้น video_generate จะซ่อนพารามิเตอร์การอ้างอิงเสียง

รายการ configSignals แต่ละรายการรองรับ:

ฟิลด์ จำเป็น ชนิด ความหมาย
rootPath ใช่ string พาธแบบจุดไปยังออบเจ็กต์การกำหนดค่าที่ Plugin เป็นเจ้าของซึ่งต้องตรวจสอบ เช่น plugins.entries.example.config
overlayPath ไม่ string พาธแบบจุดภายในการกำหนดค่าราก ซึ่งออบเจ็กต์ที่ตำแหน่งนั้นควรวางซ้อนทับออบเจ็กต์รากก่อนประเมินสัญญาณ ใช้สำหรับการกำหนดค่าเฉพาะความสามารถ เช่น image, video หรือ music
overlayMapPath ไม่ string พาธแบบจุดภายในการกำหนดค่าราก ซึ่งค่าออบเจ็กต์แต่ละค่าที่ตำแหน่งนั้นควรวางซ้อนทับออบเจ็กต์ราก ใช้สำหรับแมปบัญชีแบบมีชื่อ เช่น accounts ซึ่งบัญชีใดก็ตามที่กำหนดค่าไว้ควรถือว่าผ่านเกณฑ์
required ไม่ string[] พาธแบบจุดภายในการกำหนดค่าที่มีผล ซึ่งต้องมีค่าที่กำหนดไว้ สตริงต้องไม่ว่าง และออบเจ็กต์กับอาร์เรย์ต้องไม่ว่าง
requiredAny ไม่ string[] พาธแบบจุดภายในการกำหนดค่าที่มีผล ซึ่งอย่างน้อยหนึ่งพาธต้องมีค่าที่กำหนดไว้
mode ไม่ object เงื่อนไขโหมดสตริงเพิ่มเติมภายในการกำหนดค่าที่มีผล ใช้เมื่อความพร้อมใช้งานที่ตรวจสอบเฉพาะการกำหนดค่าใช้ได้กับโหมดเดียวเท่านั้น

เงื่อนไข mode แต่ละรายการรองรับ:

ฟิลด์ จำเป็น ชนิด ความหมาย
path ไม่ string พาธแบบจุดภายในการกำหนดค่าที่มีผล ค่าเริ่มต้นคือ mode
default ไม่ string ค่าโหมดที่จะใช้เมื่อการกำหนดค่าไม่มีพาธดังกล่าว
allowed ไม่ string[] หากมีฟิลด์นี้ สัญญาณจะผ่านเฉพาะเมื่อโหมดที่มีผลเป็นหนึ่งในค่าเหล่านี้
disallowed ไม่ string[] หากมีฟิลด์นี้ สัญญาณจะไม่ผ่านเมื่อโหมดที่มีผลเป็นหนึ่งในค่าเหล่านี้

รายการ authSignals แต่ละรายการรองรับ:

ฟิลด์ จำเป็น ชนิด ความหมาย
provider ใช่ string ID ผู้ให้บริการที่จะตรวจสอบในโปรไฟล์การยืนยันตัวตนที่กำหนดค่าไว้
providerBaseUrl ไม่ object เงื่อนไขเพิ่มเติมที่ทำให้สัญญาณมีผลเฉพาะเมื่อผู้ให้บริการที่กำหนดค่าไว้ซึ่งอ้างอิงถึงใช้ URL ฐานที่อนุญาต ใช้เมื่อใช้นามแฝงการยืนยันตัวตนได้เฉพาะกับ API บางรายการ

เงื่อนไข providerBaseUrl แต่ละรายการรองรับ:

ฟิลด์ จำเป็น ชนิด ความหมาย
provider ใช่ string ID การกำหนดค่าผู้ให้บริการซึ่งควรตรวจสอบ baseUrl
defaultBaseUrl ไม่ string URL ฐานที่จะใช้เมื่อการกำหนดค่าผู้ให้บริการไม่มี baseUrl
allowedBaseUrls ใช่ string[] URL ฐานที่อนุญาตสำหรับสัญญาณการยืนยันตัวตนนี้ ระบบจะไม่ใช้สัญญาณเมื่อ URL ฐานที่กำหนดค่าหรือค่าเริ่มต้นไม่ตรงกับค่าที่ปรับเป็นรูปแบบมาตรฐานแล้วค่าใดค่าหนึ่งเหล่านี้

ข้อมูลอ้างอิงเมทาดาทาของเครื่องมือ

toolMetadata ใช้โครงสร้าง configSignals และ authSignals แบบเดียวกับเมทาดาทาของผู้ให้บริการการสร้าง โดยใช้ชื่อเครื่องมือเป็นคีย์ contracts.tools ประกาศความเป็นเจ้าของ toolMetadata ประกาศหลักฐานความพร้อมใช้งานที่ตรวจสอบได้โดยใช้ทรัพยากรน้อย เพื่อให้ OpenClaw หลีกเลี่ยงการนำเข้ารันไทม์ของ Plugin เพียงเพื่อให้แฟกทอรีเครื่องมือส่งคืน null

json
{  "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 ยังรองรับ optional (ระบุว่าเครื่องมือนี้ไม่จำเป็นต่อการเปิดใช้งาน Plugin) และ replaySafe (ระบุว่าสามารถเรียกใช้เครื่องมือซ้ำได้อย่างปลอดภัยหลังจากรอบการทำงานของโมเดลที่ไม่สมบูรณ์) นอกเหนือจากฟิลด์ configSignals/authSignals ที่ใช้ร่วมกันข้างต้น

หากเครื่องมือไม่มี toolMetadata OpenClaw จะคงพฤติกรรมเดิมไว้และโหลด Plugin เจ้าของเมื่อสัญญาเครื่องมือตรงกับนโยบาย สำหรับเครื่องมือในเส้นทางที่ใช้งานบ่อยซึ่งแฟกทอรีขึ้นอยู่กับการยืนยันตัวตนหรือการกำหนดค่า ผู้เขียน Plugin ควรประกาศ toolMetadata แทนการให้ส่วนหลักนำเข้ารันไทม์เพื่อสอบถาม

ข้อมูลอ้างอิง providerAuthChoices

รายการ providerAuthChoices แต่ละรายการอธิบายตัวเลือกการเริ่มต้นใช้งานหรือการยืนยันตัวตนหนึ่งตัวเลือก OpenClaw อ่านข้อมูลนี้ก่อนโหลดรันไทม์ของผู้ให้บริการ รายการการตั้งค่าผู้ให้บริการใช้ตัวเลือกในไฟล์ manifest เหล่านี้ ตัวเลือกการตั้งค่าที่ได้จาก descriptor และเมทาดาทา catalog สำหรับการติดตั้ง โดยไม่ต้องโหลดรันไทม์ของผู้ให้บริการ

ฟิลด์ จำเป็น ประเภท ความหมาย
provider ใช่ string รหัสผู้ให้บริการที่ตัวเลือกนี้สังกัด
method ใช่ string รหัสวิธีการยืนยันตัวตนที่จะส่งต่อไป
choiceId ใช่ string รหัสตัวเลือกการยืนยันตัวตนแบบคงที่ที่ใช้ในขั้นตอนการเริ่มต้นใช้งานและขั้นตอน CLI
choiceLabel ไม่ string ป้ายกำกับที่แสดงต่อผู้ใช้ หากละไว้ OpenClaw จะใช้ choiceId แทน
choiceHint ไม่ string ข้อความช่วยเหลือสั้นๆ สำหรับตัวเลือก
icon ไม่ URL แบบ HTTPS ภาพประกอบที่แสดงข้างตัวเลือกนี้ในไคลเอนต์เริ่มต้นใช้งานที่รองรับ
website ไม่ URL แบบ HTTPS หน้าผลิตภัณฑ์ หน้าเข้าสู่ระบบ หรือหน้าติดตั้งที่แสดงโดยไคลเอนต์เริ่มต้นใช้งานที่รองรับ
assistantPriority ไม่ number ค่าที่ต่ำกว่าจะถูกจัดเรียงไว้ก่อนในตัวเลือกแบบโต้ตอบที่ขับเคลื่อนโดยผู้ช่วย
assistantVisibility ไม่ "visible" | "manual-only" ซ่อนตัวเลือกจากตัวเลือกของผู้ช่วย แต่ยังคงอนุญาตให้เลือกด้วยตนเองผ่าน CLI
deprecatedChoiceIds ไม่ string[] รหัสตัวเลือกเดิมที่ควรเปลี่ยนเส้นทางผู้ใช้มายังตัวเลือกทดแทนนี้
groupId ไม่ string รหัสกลุ่มที่ไม่บังคับสำหรับจัดกลุ่มตัวเลือกที่เกี่ยวข้อง
groupLabel ไม่ string ป้ายกำกับที่แสดงต่อผู้ใช้สำหรับกลุ่มนั้น
groupHint ไม่ string ข้อความช่วยเหลือสั้นๆ สำหรับกลุ่ม
onboardingFeatured ไม่ boolean แสดงกลุ่มนี้ในระดับแนะนำของตัวเลือกเริ่มต้นใช้งานแบบโต้ตอบ ก่อนรายการ "More..."
optionKey ไม่ string คีย์ตัวเลือกภายในสำหรับขั้นตอนการยืนยันตัวตนแบบแฟล็กเดียวอย่างง่าย
cliFlag ไม่ string ชื่อแฟล็ก CLI เช่น --openrouter-api-key
cliOption ไม่ string รูปแบบตัวเลือก CLI แบบเต็ม เช่น --openrouter-api-key <key>
cliDescription ไม่ string คำอธิบายที่ใช้ในความช่วยเหลือ CLI
appGuidedSecret ไม่ boolean ข้อมูลลับหนึ่งรายการที่วางเข้ามาร่วมกับค่าเริ่มต้นของผู้ให้บริการ เพียงพอสำหรับการตั้งค่าที่แอปแนะนำ
appGuidedDiscovery ไม่ boolean วิธีการยืนยันตัวตนของรันไทม์ที่ตรงกันเป็นเจ้าของการค้นหาในเครื่องแบบอ่านอย่างเดียวผ่าน appGuidedSetup
appGuidedAuth ไม่ "oauth" | "device-code" การเข้าสู่ระบบแบบโต้ตอบที่ผู้ให้บริการเป็นเจ้าของ ซึ่งไคลเอนต์ตั้งค่าแบบเนทีฟสามารถแสดงผลในรูปแบบทั่วไป
onboardingScopes ไม่ Array<"text-inference" | "image-generation" | "music-generation"> พื้นผิวการเริ่มต้นใช้งานที่ควรแสดงตัวเลือกนี้ หากละไว้ ค่าเริ่มต้นคือ ["text-inference"]

เมื่อ appGuidedDiscovery เป็น true วิธีการยืนยันตัวตนของผู้ให้บริการที่ตรงกันต้องเปิดเผย appGuidedSetup.detect และ appGuidedSetup.prepare การตรวจหาต้องเป็นแบบ อ่านอย่างเดียว: ห้ามเข้าสู่ระบบ ดึงโมเดล ดาวน์โหลด หรือเขียนการกำหนดค่า การเตรียมการจะตรวจสอบ โมเดลที่เลือกอย่างเจาะจงอีกครั้งและส่งคืนข้อเสนอการกำหนดค่า OpenClaw จะทดสอบข้อเสนอแบบสด โดยแยกจากระบบ และบันทึกการเปลี่ยนแปลงเมื่อสำเร็จแล้วเท่านั้น

ข้อมูลอ้างอิง commandAliases

ใช้ commandAliases เมื่อ Plugin เป็นเจ้าของชื่อคำสั่งรันไทม์ที่ผู้ใช้อาจใส่ผิดใน plugins.allow หรือพยายามเรียกใช้เป็นคำสั่ง CLI ระดับรูท OpenClaw ใช้ข้อมูลเมตานี้เพื่อการวินิจฉัยโดยไม่ต้องนำเข้าโค้ดรันไทม์ของ Plugin

json
{  "commandAliases": [    {      "name": "dreaming",      "kind": "runtime-slash",      "cliCommand": "memory"    }  ]}
ฟิลด์ จำเป็น ประเภท ความหมาย
name ใช่ string ชื่อคำสั่งที่เป็นของ Plugin นี้
kind ไม่ "runtime-slash" ระบุว่า alias เป็นคำสั่งแชตแบบเครื่องหมายทับ ไม่ใช่คำสั่ง CLI ระดับรูท
cliCommand ไม่ string คำสั่ง CLI ระดับรูทที่เกี่ยวข้องเพื่อแนะนำสำหรับการดำเนินการ CLI หากมี

ข้อมูลอ้างอิง activation

ใช้ activation เมื่อ Plugin สามารถประกาศได้โดยใช้ทรัพยากรน้อยว่าเหตุการณ์ใดใน control plane ควรรวม Plugin นี้ไว้ในแผนการเปิดใช้งาน/โหลด

บล็อกนี้เป็นข้อมูลเมตาของตัววางแผน ไม่ใช่ API วงจรชีวิต บล็อกนี้ไม่ลงทะเบียนพฤติกรรมรันไทม์ ไม่แทนที่ register(...) และไม่รับประกันว่าโค้ดของ Plugin ได้ทำงานแล้ว ตัววางแผนการเปิดใช้งานใช้ฟิลด์เหล่านี้เพื่อจำกัด Plugin ที่เป็นตัวเลือก ก่อนจะย้อนกลับไปใช้ข้อมูลเมตาความเป็นเจ้าของใน manifest ที่มีอยู่ เช่น providers, channels, commandAliases, setup.providers, contracts.tools และ hooks

ควรใช้ข้อมูลเมตาที่แคบที่สุดซึ่งอธิบายความเป็นเจ้าของได้อยู่แล้ว ใช้ providers, channels, commandAliases, ตัวอธิบายการตั้งค่า หรือ contracts เมื่อฟิลด์เหล่านั้นแสดงความสัมพันธ์ได้ ใช้ activation สำหรับคำใบ้เพิ่มเติมแก่ตัววางแผนที่ไม่สามารถแสดงด้วยฟิลด์ความเป็นเจ้าของเหล่านั้น ใช้ cliBackends ระดับบนสุดสำหรับ alias รันไทม์ CLI เช่น claude-cli, my-cli หรือ google-gemini-cli; activation.onAgentHarnesses ใช้เฉพาะรหัส harness ของเอเจนต์แบบฝังที่ยังไม่มีฟิลด์ความเป็นเจ้าของ

Plugin ทุกตัวควรกำหนด activation.onStartup โดยตั้งใจ ตั้งเป็น true เฉพาะเมื่อ Plugin ต้องทำงานระหว่างการเริ่มต้น Gateway ตั้งเป็น false เมื่อ Plugin ไม่ทำงานขณะเริ่มต้นและควรโหลดจากทริกเกอร์ที่แคบกว่าเท่านั้น การละ onStartup จะไม่ทำให้ Plugin ถูกโหลดเมื่อเริ่มต้นโดยปริยายอีกต่อไป ให้ใช้ข้อมูลเมตาการเปิดใช้งานอย่างชัดเจนสำหรับการเริ่มต้น ช่องทาง การกำหนดค่า harness ของเอเจนต์ หน่วยความจำ หรือทริกเกอร์การเปิดใช้งานอื่นที่แคบกว่า

json
{  "activation": {    "onStartup": false,    "onProviders": ["openai"],    "onCommands": ["models"],    "onChannels": ["web"],    "onRoutes": ["gateway-webhook"],    "onConfigPaths": ["browser"],    "onCapabilities": ["provider", "tool"]  }}
ฟิลด์ จำเป็น ประเภท ความหมาย
onStartup ไม่ boolean การเปิดใช้งานเมื่อเริ่มต้น Gateway อย่างชัดเจน Plugin ทุกตัวควรกำหนดค่านี้ true จะนำเข้า Plugin ระหว่างการเริ่มต้น ส่วน false จะคงการโหลดแบบหน่วงไว้จนกว่าทริกเกอร์อื่นที่ตรงกันจะกำหนดให้โหลด
onProviders ไม่ string[] รหัสผู้ให้บริการที่ควรรวม Plugin นี้ไว้ในแผนการเปิดใช้งาน/โหลด
onAgentHarnesses ไม่ string[] รหัสรันไทม์ harness ของเอเจนต์แบบฝังที่ควรรวม Plugin นี้ไว้ในแผนการเปิดใช้งาน/โหลด ใช้ cliBackends ระดับบนสุดสำหรับ alias แบ็กเอนด์ CLI
onCommands ไม่ string[] รหัสคำสั่งที่ควรรวม Plugin นี้ไว้ในแผนการเปิดใช้งาน/โหลด
onChannels ไม่ string[] รหัสช่องทางที่ควรรวม Plugin นี้ไว้ในแผนการเปิดใช้งาน/โหลด
onRoutes ไม่ string[] ชนิดเส้นทางที่ควรรวม Plugin นี้ไว้ในแผนการเปิดใช้งาน/โหลด
onConfigPaths ไม่ string[] พาธการกำหนดค่าที่อ้างอิงจากรูท ซึ่งควรรวม Plugin นี้ไว้ในแผนการเริ่มต้น/โหลดเมื่อมีพาธอยู่และไม่ได้ถูกปิดใช้งานอย่างชัดเจน
onCapabilities ไม่ Array<"provider" | "channel" | "tool" | "hook"> คำใบ้ความสามารถแบบกว้างที่ใช้โดยการวางแผนการเปิดใช้งานของ control plane ควรใช้ฟิลด์ที่แคบกว่าเมื่อทำได้

ผู้ใช้งานจริงในปัจจุบัน:

  • การวางแผนการเริ่มต้น Gateway ใช้ activation.onStartup สำหรับการนำเข้าขณะเริ่มต้นอย่างชัดเจน
  • การวางแผน CLI ที่ทริกเกอร์ด้วยคำสั่งจะใช้ commandAliases[].cliCommand หรือ commandAliases[].name แบบเดิมเป็นทางเลือกสำรอง
  • การวางแผนการเริ่มต้นรันไทม์ของเอเจนต์ใช้ activation.onAgentHarnesses สำหรับชุดทดสอบแบบฝัง และใช้ cliBackends[] ระดับบนสุดสำหรับนามแฝงรันไทม์ CLI
  • การวางแผนการตั้งค่า/ช่องทางที่ทริกเกอร์โดยช่องทางจะใช้การเป็นเจ้าของ channels[] แบบเดิมเป็นทางเลือกสำรอง เมื่อไม่มีเมทาดาทาการเปิดใช้งานช่องทางอย่างชัดเจน
  • การวางแผน Plugin ขณะเริ่มต้นใช้ activation.onConfigPaths สำหรับพื้นผิวการกำหนดค่ารูทที่ไม่ใช่ช่องทาง เช่น บล็อก browser ของ Plugin เบราว์เซอร์ที่รวมมาให้
  • การวางแผนการตั้งค่า/รันไทม์ที่ทริกเกอร์โดยผู้ให้บริการจะใช้การเป็นเจ้าของ providers[] แบบเดิมและ cliBackends[] ระดับบนสุดเป็นทางเลือกสำรอง เมื่อไม่มีเมทาดาทาการเปิดใช้งานผู้ให้บริการอย่างชัดเจน

การวินิจฉัยของตัววางแผนสามารถแยกคำแนะนำการเปิดใช้งานอย่างชัดเจนออกจากทางเลือกสำรองตามการเป็นเจ้าของในไฟล์ manifest ได้ ตัวอย่างเช่น activation-command-hint หมายความว่า activation.onCommands ตรงกัน ขณะที่ manifest-command-alias หมายความว่าตัววางแผนใช้การเป็นเจ้าของ commandAliases แทน ป้ายกำกับเหตุผลเหล่านี้มีไว้สำหรับการวินิจฉัยของโฮสต์และการทดสอบ ผู้เขียน Plugin ควรประกาศเมทาดาทาที่อธิบายการเป็นเจ้าของได้เหมาะสมที่สุดต่อไป

ข้อมูลอ้างอิง qaRunners

ใช้ qaRunners เมื่อ Plugin สนับสนุนตัวรันการขนส่งอย่างน้อยหนึ่งรายการภายใต้ รูท openclaw qa ที่ใช้ร่วมกัน ทำให้เมทาดาทานี้ประมวลผลได้รวดเร็วและคงที่ รันไทม์ ของ Plugin ยังคงเป็นเจ้าของการลงทะเบียน CLI จริงผ่านพื้นผิว runtime-api.ts แบบน้ำหนักเบาซึ่งส่งออก qaRunnerCliRegistrations ที่ตรงกัน ส่วน adapterFactory ซึ่งเป็นตัวเลือกจะเปิดเผยการขนส่งแก่สถานการณ์ QA ที่ใช้ร่วมกันโดยไม่ เปลี่ยนตัวรันของคำสั่งที่ลงทะเบียนไว้

json
{  "qaRunners": [    {      "commandName": "matrix",      "description": "เรียกใช้เลน QA แบบสดของ Matrix ที่ใช้ Docker กับ homeserver แบบใช้แล้วทิ้ง"    }  ]}
ฟิลด์ จำเป็น ชนิด ความหมาย
commandName ใช่ string คำสั่งย่อยที่เมานต์ภายใต้ openclaw qa เช่น matrix
description ไม่ string ข้อความช่วยเหลือสำรองที่ใช้เมื่อโฮสต์ที่ใช้ร่วมกันต้องใช้คำสั่งตัวแทน

รหัส adapterFactory ต้องตรงกับ commandName อย่าส่งออกการลงทะเบียน สำหรับคำสั่งที่ไม่มีอยู่ในไฟล์ manifest

ข้อมูลอ้างอิง setup

ใช้ setup เมื่อพื้นผิวการตั้งค่าและการเริ่มต้นใช้งานต้องใช้เมทาดาทาที่ Plugin เป็นเจ้าของและเรียกใช้ได้อย่างรวดเร็วก่อนโหลดรันไทม์

json
{  "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"          }        ]      }    ],    "cliBackends": ["openai-cli"],    "configMigrations": ["legacy-openai-auth"],    "requiresRuntime": false  }}

cliBackends ระดับบนสุดยังคงใช้ได้และยังคงอธิบายแบ็กเอนด์การอนุมาน CLI ต่อไป setup.cliBackends คือพื้นผิวตัวอธิบายเฉพาะการตั้งค่าสำหรับโฟลว์การตั้งค่า/ระนาบควบคุมที่ควรเป็นเมทาดาทาเท่านั้น

เมื่อมี setup.providers และ setup.cliBackends ทั้งสองรายการนี้คือพื้นผิวการค้นหาที่ใช้ตัวอธิบายก่อนสำหรับการค้นพบการตั้งค่า หากตัวอธิบายเพียงจำกัดขอบเขต Plugin ที่เป็นตัวเลือก และการตั้งค่ายังต้องใช้ฮุกของรันไทม์ขณะตั้งค่าที่มีรายละเอียดมากขึ้น ให้ตั้งค่า requiresRuntime: true และคง setup-api ไว้เป็นเส้นทางดำเนินการสำรอง

OpenClaw รวม setup.providers[].envVars ไว้ในการค้นหาการยืนยันตัวตนของผู้ให้บริการและตัวแปรสภาพแวดล้อมแบบทั่วไป ให้ใส่เมทาดาทาสภาพแวดล้อมสำหรับการตั้งค่าและสถานะไว้ที่นั่น

ใช้ providerUsageAuthEnvVars เมื่อข้อมูลประจำตัวระดับการเรียกเก็บเงินหรือระดับองค์กรต้องเปิดใช้งาน resolveUsageAuth โดยไม่กลายเป็นข้อมูลประจำตัวสำหรับการอนุมาน ชื่อเหล่านี้จะรวมอยู่ในการบล็อก dotenv ของเวิร์กสเปซ การตัดออกจากโปรเซสลูก ACP การกรองข้อมูลลับในแซนด์บ็อกซ์ และการล้างข้อมูลลับในวงกว้าง รันไทม์ของผู้ให้บริการยังคงอ่านและจำแนกค่าภายใน resolveUsageAuth

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 รหัสผู้ให้บริการที่เปิดเผยระหว่างการตั้งค่าหรือการเริ่มต้นใช้งาน รักษารหัสที่ปรับให้เป็นมาตรฐานไม่ให้ซ้ำกันทั่วระบบ
authMethods ไม่ string[] รหัสวิธีการตั้งค่า/การยืนยันตัวตนที่ผู้ให้บริการนี้รองรับโดยไม่ต้องโหลดรันไทม์ทั้งหมด
envVars ไม่ string[] ตัวแปรสภาพแวดล้อมที่พื้นผิวการตั้งค่า/สถานะแบบทั่วไปสามารถตรวจสอบก่อนโหลดรันไทม์ของ Plugin
authEvidence ไม่ object[] การตรวจสอบหลักฐานการยืนยันตัวตนภายในเครื่องที่ประมวลผลได้รวดเร็ว สำหรับผู้ให้บริการที่สามารถยืนยันตัวตนผ่านเครื่องหมายที่ไม่ใช่ข้อมูลลับ

authEvidence ใช้สำหรับเครื่องหมายข้อมูลประจำตัวภายในเครื่องที่ผู้ให้บริการเป็นเจ้าของ ซึ่งสามารถตรวจสอบได้โดยไม่ต้องโหลดโค้ดรันไทม์ การตรวจสอบเหล่านี้ต้องประมวลผลได้รวดเร็วและอยู่ภายในเครื่องเท่านั้น: ห้ามเรียกใช้เครือข่าย ห้ามอ่านพวงกุญแจหรือตัวจัดการข้อมูลลับ ห้ามใช้คำสั่งเชลล์ และห้ามตรวจสอบ API ของผู้ให้บริการ

รายการหลักฐานที่รองรับ:

ฟิลด์ จำเป็น ชนิด ความหมาย
type ใช่ string ปัจจุบันคือ local-file-with-env
fileEnvVar ไม่ string ตัวแปรสภาพแวดล้อมที่มีพาธไฟล์ข้อมูลประจำตัวที่ระบุไว้อย่างชัดเจน
fallbackPaths ไม่ string[] พาธไฟล์ข้อมูลประจำตัวภายในเครื่องที่ตรวจสอบเมื่อไม่มี fileEnvVar หรือมีค่าว่าง รองรับ ${HOME} และ ${APPDATA}
requiresAnyEnv ไม่ string[] ตัวแปรสภาพแวดล้อมที่ระบุไว้อย่างน้อยหนึ่งรายการต้องไม่ว่างเปล่า ก่อนที่หลักฐานจะใช้ได้
requiresAllEnv ไม่ string[] ตัวแปรสภาพแวดล้อมที่ระบุไว้ทุกรายการต้องไม่ว่างเปล่า ก่อนที่หลักฐานจะใช้ได้
credentialMarker ใช่ string เครื่องหมายที่ไม่ใช่ข้อมูลลับซึ่งส่งคืนเมื่อพบหลักฐาน
source ไม่ string ป้ายกำกับแหล่งที่มาที่ผู้ใช้เห็นสำหรับผลลัพธ์การยืนยันตัวตน/สถานะ

ฟิลด์ setup

ฟิลด์ จำเป็น ชนิด ความหมาย
providers ไม่ object[] ตัวอธิบายการตั้งค่าผู้ให้บริการที่เปิดเผยระหว่างการตั้งค่าและการเริ่มต้นใช้งาน
cliBackends ไม่ string[] รหัสแบ็กเอนด์ขณะตั้งค่าที่ใช้สำหรับการค้นหาการตั้งค่าแบบใช้ตัวอธิบายก่อน รักษารหัสที่ปรับให้เป็นมาตรฐานไม่ให้ซ้ำกันทั่วระบบ
configMigrations ไม่ string[] รหัสการย้ายข้อมูลการกำหนดค่าที่พื้นผิวการตั้งค่าของ Plugin นี้เป็นเจ้าของ
requiresRuntime ไม่ boolean ระบุว่าการตั้งค่ายังต้องเรียกใช้ setup-api หลังจากค้นหาตัวอธิบายหรือไม่

ข้อมูลอ้างอิง uiHints

uiHints คือแมปจากชื่อฟิลด์การกำหนดค่าไปยังคำแนะนำการแสดงผลขนาดเล็ก คีย์สามารถใช้จุดสำหรับฟิลด์การกำหนดค่าที่ซ้อนกันได้ แต่ส่วนใดของพาธต้องไม่เป็น __proto__, constructor หรือ prototype; การตั้งค่าจะปฏิเสธชื่อเหล่านั้น

json
{  "uiHints": {    "apiKey": {      "label": "คีย์ API",      "help": "ใช้สำหรับคำขอ OpenRouter",      "placeholder": "sk-or-v1-...",      "sensitive": true    }  }}

คำแนะนำของแต่ละฟิลด์สามารถมีรายการต่อไปนี้:

ฟิลด์ ชนิด ความหมาย
label string ป้ายกำกับฟิลด์ที่ผู้ใช้เห็น
help string ข้อความช่วยเหลือสั้น ๆ
tags string[] แท็ก UI ที่เป็นตัวเลือก
advanced boolean ทำเครื่องหมายฟิลด์ว่าเป็นขั้นสูง
sensitive boolean ทำเครื่องหมายฟิลด์ว่าเป็นข้อมูลลับหรือข้อมูลละเอียดอ่อน
placeholder string ข้อความตัวแทนสำหรับช่องป้อนข้อมูลในแบบฟอร์ม

ข้อมูลอ้างอิง contracts

ใช้ contracts เฉพาะสำหรับเมทาดาทาการเป็นเจ้าของความสามารถแบบคงที่ที่ OpenClaw สามารถอ่านได้โดยไม่ต้องนำเข้ารันไทม์ของ Plugin

json
{  "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"],    "musicGenerationProviders": ["stability-audio"],    "documentExtractors": ["example-docs"],    "webContentExtractors": ["firecrawl"],    "webFetchProviders": ["firecrawl"],    "webSearchProviders": ["gemini"],    "workerProviders": ["example-worker"],    "usageProviders": ["acme-ai"],    "migrationProviders": ["hermes"],    "gatewayMethodDispatch": ["authenticated-request"],    "tools": ["firecrawl_search", "firecrawl_scrape"]  }}

แต่ละรายการเป็นตัวเลือก:

ฟิลด์ ชนิด ความหมาย
embeddedExtensionFactories string[] รหัสแฟกทอรีส่วนขยาย app-server ของ Codex ซึ่งปัจจุบันคือ codex-app-server
agentToolResultMiddleware string[] รหัสรันไทม์ที่ Plugin นี้อาจลงทะเบียนมิดเดิลแวร์ผลลัพธ์ของเครื่องมือให้
trustedToolPolicies string[] รหัสนโยบายก่อนใช้เครื่องมือที่เชื่อถือได้และใช้ภายใน Plugin ซึ่ง Plugin ที่ติดตั้งอาจลงทะเบียนได้ Plugin ที่มาพร้อมระบบอาจลงทะเบียนนโยบายโดยไม่มีฟิลด์นี้
externalAuthProviders string[] รหัสผู้ให้บริการซึ่ง Plugin นี้เป็นเจ้าของฮุกโปรไฟล์การยืนยันตัวตนภายนอก
embeddingProviders string[] รหัสผู้ให้บริการ embedding ทั่วไปที่ Plugin นี้เป็นเจ้าของสำหรับการใช้ vector embedding ซ้ำ รวมถึงหน่วยความจำ
speechProviders string[] รหัสผู้ให้บริการเสียงพูดที่ Plugin นี้เป็นเจ้าของ
realtimeTranscriptionProviders string[] รหัสผู้ให้บริการถอดเสียงแบบเรียลไทม์ที่ Plugin นี้เป็นเจ้าของ
realtimeVoiceProviders string[] รหัสผู้ให้บริการเสียงแบบเรียลไทม์ที่ Plugin นี้เป็นเจ้าของ
memoryEmbeddingProviders string[] รหัสผู้ให้บริการ embedding สำหรับหน่วยความจำโดยเฉพาะที่เลิกใช้แล้ว ซึ่ง Plugin นี้เป็นเจ้าของ
mediaUnderstandingProviders string[] รหัสผู้ให้บริการทำความเข้าใจสื่อที่ Plugin นี้เป็นเจ้าของ
transcriptSourceProviders string[] รหัสผู้ให้บริการแหล่งที่มาของข้อความถอดเสียงที่ Plugin นี้เป็นเจ้าของ
documentExtractors string[] รหัสผู้ให้บริการแยกข้อมูลจากเอกสาร (เช่น PDF) ที่ Plugin นี้เป็นเจ้าของ
imageGenerationProviders string[] รหัสผู้ให้บริการสร้างภาพที่ Plugin นี้เป็นเจ้าของ
videoGenerationProviders string[] รหัสผู้ให้บริการสร้างวิดีโอที่ Plugin นี้เป็นเจ้าของ
musicGenerationProviders string[] รหัสผู้ให้บริการสร้างเพลงที่ Plugin นี้เป็นเจ้าของ
webContentExtractors string[] รหัสผู้ให้บริการแยกเนื้อหาจากหน้าเว็บที่ Plugin นี้เป็นเจ้าของ
webFetchProviders string[] รหัสผู้ให้บริการดึงข้อมูลจากเว็บที่ Plugin นี้เป็นเจ้าของ
webSearchProviders string[] รหัสผู้ให้บริการค้นหาเว็บที่ Plugin นี้เป็นเจ้าของ
workerProviders string[] รหัสผู้ให้บริการเวิร์กเกอร์บนคลาวด์ที่ Plugin นี้เป็นเจ้าของ สำหรับการจัดเตรียมและวงจรชีวิตสัญญาเช่าที่อิงโปรไฟล์
usageProviders string[] รหัสผู้ให้บริการซึ่ง Plugin นี้เป็นเจ้าของฮุกการยืนยันตัวตนเพื่อการใช้งานและสแนปช็อตการใช้งาน
migrationProviders string[] รหัสผู้ให้บริการนำเข้าที่ Plugin นี้เป็นเจ้าของสำหรับ openclaw migrate
gatewayMethodDispatch string[] สิทธิ์ที่สงวนไว้สำหรับเส้นทาง HTTP ของ Plugin ที่ผ่านการยืนยันตัวตน ซึ่งส่งต่อเมธอดของ Gateway ภายในโปรเซส
tools string[] ชื่อเครื่องมือของเอเจนต์ที่ Plugin นี้เป็นเจ้าของ

contracts.embeddedExtensionFactories ยังคงเก็บไว้สำหรับแฟกทอรีส่วนขยายที่ใช้เฉพาะ app-server ของ Codex ซึ่งมาพร้อมระบบ การแปลงผลลัพธ์ของเครื่องมือที่มาพร้อมระบบควรประกาศ contracts.agentToolResultMiddleware และลงทะเบียนด้วย api.registerAgentToolResultMiddleware(...) แทน Plugin ที่ติดตั้งอาจใช้จุดเชื่อมมิดเดิลแวร์เดียวกันได้เฉพาะเมื่อเปิดใช้อย่างชัดเจน และเฉพาะสำหรับรันไทม์ที่ประกาศไว้ใน contracts.agentToolResultMiddleware

Plugin ที่ติดตั้งซึ่งต้องใช้ระดับนโยบายก่อนใช้เครื่องมือที่โฮสต์เชื่อถือ ต้องประกาศรหัสภายในแต่ละรายการที่ลงทะเบียนใน contracts.trustedToolPolicies และต้องเปิดใช้อย่างชัดเจน Plugin ที่มาพร้อมระบบยังคงใช้เส้นทางนโยบายที่เชื่อถือได้เดิม แต่ Plugin ที่ติดตั้งซึ่งมีรหัสนโยบายที่ไม่ได้ประกาศจะถูกปฏิเสธก่อนการลงทะเบียน รหัสนโยบายมีขอบเขตเฉพาะ Plugin ที่ลงทะเบียน ดังนั้น Plugin สองตัวจึงสามารถประกาศและลงทะเบียน workflow-budget ได้ทั้งคู่ แต่ Plugin เดียวไม่สามารถลงทะเบียนรหัสภายในเดียวกันซ้ำสองครั้งได้

การลงทะเบียนรันไทม์ api.registerTool(...) ต้องตรงกับ contracts.tools การค้นหาเครื่องมือใช้รายการนี้เพื่อโหลดเฉพาะรันไทม์ของ Plugin ที่สามารถเป็นเจ้าของเครื่องมือที่ร้องขอได้

Plugin ผู้ให้บริการที่ใช้งาน resolveExternalAuthProfiles ควรประกาศ contracts.externalAuthProviders ฮุกการยืนยันตัวตนภายนอกที่ไม่ได้ประกาศจะถูกละเว้น

Plugin ผู้ให้บริการที่ใช้งานทั้ง resolveUsageAuth และ fetchUsageSnapshot ควรประกาศรหัสผู้ให้บริการที่ค้นพบอัตโนมัติแต่ละรายการใน contracts.usageProviders การค้นหาการใช้งานจะอ่านสัญญานี้ก่อนโหลดโค้ดรันไทม์ จากนั้นตรวจสอบฮุกทั้งสองหลังจากโหลดเฉพาะเจ้าของที่ประกาศไว้

ผู้ให้บริการ embedding ทั่วไปควรประกาศ contracts.embeddingProviders สำหรับอะแดปเตอร์แต่ละตัวที่ลงทะเบียนด้วย api.registerEmbeddingProvider(...) ใช้สัญญาทั่วไปสำหรับการสร้างเวกเตอร์ที่นำกลับมาใช้ซ้ำได้ รวมถึงผู้ให้บริการที่การค้นหาหน่วยความจำใช้งาน contracts.memoryEmbeddingProviders เป็นความเข้ากันได้เฉพาะหน่วยความจำที่เลิกใช้แล้ว และจะคงอยู่เฉพาะระหว่างที่ผู้ให้บริการเดิมย้ายไปยังจุดเชื่อมผู้ให้บริการ embedding แบบทั่วไป

ผู้ให้บริการเวิร์กเกอร์ต้องประกาศรหัส api.registerWorkerProvider(...) แต่ละรายการใน contracts.workerProviders Core จะบันทึกเจตนาที่คงทนก่อนเรียก provision ผู้ให้บริการจะตรวจสอบการตั้งค่าของตนก่อนจัดสรรทรัพยากรภายนอก และการเรียกซ้ำด้วยรหัสการดำเนินการเดียวกันต้องรับช่วงสัญญาเช่าเดิม Core ยังบันทึกสแนปช็อตการตั้งค่าที่ผ่านการตรวจสอบนั้น และส่งไปพร้อมกับ leaseId ให้แก่ inspect({ leaseId, profile }) และ destroy({ leaseId, profile }) รวมถึงหลังจากโปรไฟล์ที่ระบุชื่อถูกเปลี่ยนแปลงหรือลบแล้ว การทำลายเป็นแบบ idempotent การตรวจสอบจะส่งคืนยูเนียนสถานะปิด active / destroyed / unknown และวัสดุคีย์ส่วนตัว SSH จะถูกอ้างอิงผ่าน SecretRef เท่านั้น ปลายทาง SSH ที่จัดเตรียมแล้วต้องมี hostKey สาธารณะจากผลลัพธ์การจัดเตรียมที่เชื่อถือได้ในรูปแบบ algorithm base64 อย่างเคร่งครัด โดยไม่มีชื่อโฮสต์หรือความคิดเห็น เพื่อให้ Core สามารถตรึงโฮสต์ก่อนเชื่อมต่อ ผู้ให้บริการที่สร้างการอ้างอิงข้อมูลประจำตัวแบบไดนามิกอาจใช้งาน resolveSshIdentity({ leaseId, profile, keyRef }) ที่มีอำนาจสูงสุด ผู้ให้บริการที่ไม่มีรายการนี้จะใช้ตัวแก้ไขข้อมูลลับทั่วไปของ Core unknown ที่มีอำนาจสูงสุดจะทำให้ระเบียนภายในที่ใช้งานอยู่กลายเป็นระเบียนกำพร้า และหลังจากคำขอทำลายถูกบันทึกแล้ว จะใช้ยืนยันว่าการรื้อถอนได้เสร็จสิ้น

ปัจจุบัน contracts.gatewayMethodDispatch ยอมรับ "authenticated-request" รายการนี้เป็นด่านตรวจสุขอนามัยของ API สำหรับเส้นทาง HTTP แบบเนทีฟของ Plugin ที่ตั้งใจส่งต่อเมธอดระนาบควบคุมของ Gateway ภายในโปรเซส ไม่ใช่แซนด์บ็อกซ์สำหรับป้องกัน Plugin แบบเนทีฟที่เป็นอันตราย ใช้เฉพาะกับพื้นผิวที่มาพร้อมระบบหรือสำหรับผู้ปฏิบัติงานซึ่งผ่านการตรวจสอบอย่างเข้มงวด และกำหนดให้ใช้การยืนยันตัวตน HTTP ของ Gateway อยู่แล้ว เส้นทางที่มีสิทธิ์จะยังเข้าถึงได้ขณะที่ปิดการรับงานระดับรากของ Gateway เฉพาะเมื่อเส้นทางนั้นประกาศทั้ง auth: "gateway" และ gatewayRuntimeScopeSurface: "trusted-operator" เฉพาะเส้นทาง ส่วนเส้นทางพี่น้องทั่วไปจาก Plugin เดียวกันจะยังคงอยู่หลังขอบเขตการรับงาน วิธีนี้ช่วยให้ยังเข้าถึงสถานะการระงับและการดำเนินการต่อได้ โดยไม่ให้สิทธิ์ข้ามการรับงานแก่ทั้ง Plugin จำกัดขอบเขตการแยกวิเคราะห์และการจัดรูปแบบการตอบกลับไว้นอกการส่งต่อ งานที่มีสาระสำคัญหรือแก้ไขข้อมูลต้องดำเนินการผ่านการส่งต่อเมธอดของ Gateway ซึ่งเป็นเจ้าของการบังคับใช้การรับงานและขอบเขต

ข้อมูลอ้างอิง configContracts

ใช้ configContracts สำหรับพฤติกรรมการกำหนดค่าที่แมนิเฟสต์เป็นเจ้าของ ซึ่งตัวช่วยทั่วไปของ Core ต้องใช้โดยไม่ต้องนำเข้ารันไทม์ของ Plugin ได้แก่ การตรวจจับแฟล็กอันตราย เป้าหมายการย้าย SecretRef และการจำกัดเส้นทางการกำหนดค่าแบบเดิม

json
{  "configContracts": {    "compatibilityMigrationPaths": ["legacyProvider"],    "compatibilityRuntimePaths": ["legacyProvider.webhook"],    "dangerousFlags": [      {        "path": "accounts.*.allowUnverifiedSenders",        "equals": true      }    ],    "secretInputs": {      "bundledDefaultEnabled": false,      "paths": [        {          "path": "routes.*.secret",          "expected": "string",          "ownerKind": "route"        }      ]    }  }}
ฟิลด์ จำเป็น ชนิด ความหมาย
compatibilityMigrationPaths ไม่ string[] เส้นทางการกำหนดค่าที่สัมพันธ์กับราก ซึ่งระบุว่าการย้ายเพื่อความเข้ากันได้ระหว่างการตั้งค่าของ Plugin นี้อาจมีผล ช่วยให้การอ่านการกำหนดค่ารันไทม์ทั่วไปข้ามพื้นผิวการตั้งค่าทั้งหมดของ Plugin ได้ เมื่อการกำหนดค่าไม่เคยอ้างอิง Plugin
compatibilityRuntimePaths ไม่ string[] เส้นทางความเข้ากันได้ที่สัมพันธ์กับราก ซึ่ง Plugin นี้สามารถรองรับระหว่างรันไทม์ก่อนที่โค้ด Plugin จะเปิดใช้งานอย่างสมบูรณ์ ใช้สำหรับพื้นผิวแบบเดิมที่ควรจำกัดชุดตัวเลือกที่มาพร้อมระบบโดยไม่ต้องนำเข้ารันไทม์ของ Plugin ที่เข้ากันได้ทุกตัว
dangerousFlags ไม่ object[] ลิเทอรัลการกำหนดค่าที่ openclaw doctor ควรทำเครื่องหมายว่าไม่ปลอดภัยหรือเป็นอันตรายเมื่อเปิดใช้งาน ดูรายละเอียดด้านล่าง
secretInputs ไม่ object เส้นทางการกำหนดค่าภายใต้ plugins.entries.<id>.config สำหรับการย้าย SecretRef การตรวจสอบ การสร้างค่าเพื่อใช้งานเมื่อเริ่มต้นระบบ และการแยกเจ้าของรันไทม์แบบเลือกใช้ ดูรายละเอียดด้านล่าง

แต่ละรายการ dangerousFlags รองรับ:

ฟิลด์ จำเป็น ชนิด ความหมาย
path ใช่ string เส้นทางการกำหนดค่าที่คั่นด้วยจุดและสัมพันธ์กับ plugins.entries.<id>.config รองรับไวลด์การ์ด * สำหรับเซกเมนต์ของแมป/อาร์เรย์
equals ใช่ string | number | boolean | null ลิเทอรัลที่ตรงกันทุกประการซึ่งระบุว่าค่าการกำหนดค่านี้เป็นอันตราย

secretInputs รองรับ:

ฟิลด์ จำเป็น ประเภท ความหมาย
bundledDefaultEnabled ไม่ boolean แทนที่ค่าเริ่มต้นของการเปิดใช้งาน Plugin ที่รวมมาให้ เมื่อพิจารณาว่าพื้นที่ผิว SecretRef นี้ทำงานอยู่หรือไม่ ใช้เมื่อ Plugin รวมมาให้ แต่พื้นที่ผิวควรยังคงไม่ทำงานจนกว่าจะเปิดใช้งานอย่างชัดเจนในการกำหนดค่า
paths ใช่ object[] พาธการกำหนดค่าที่มีรูปแบบเป็นข้อมูลลับ โดยแต่ละพาธมี path (คั่นด้วยจุด สัมพันธ์กับ plugins.entries.<id>.config และรองรับไวลด์การ์ด *) พร้อม expected ที่เป็นตัวเลือก (ปัจจุบันมีเฉพาะ "string") และ ownerKind ที่เป็นตัวเลือก (ปัจจุบันมีเฉพาะ "route") เจ้าของที่ประกาศจะแยกเฉพาะพาธที่ตรงกันทุกประการนั้นเมื่อการแก้ค่าล้มเหลว โดยรหัสเจ้าของคือพาธการกำหนดค่าแบบเต็ม

เอกสารอ้างอิง mediaUnderstandingProviderMetadata

ใช้ mediaUnderstandingProviderMetadata เมื่อผู้ให้บริการการทำความเข้าใจสื่อมีโมเดลเริ่มต้น ลำดับความสำคัญของทางเลือกสำรองในการยืนยันตัวตนอัตโนมัติ หรือการรองรับเอกสารแบบเนทีฟที่ตัวช่วยทั่วไปของแกนหลักต้องใช้ก่อนโหลดรันไทม์ นอกจากนี้ยังต้องประกาศคีย์ใน contracts.mediaUnderstandingProviders

json
{  "contracts": {    "mediaUnderstandingProviders": ["example"]  },  "mediaUnderstandingProviderMetadata": {    "example": {      "capabilities": ["image", "audio"],      "defaultModels": {        "image": "example-vision-latest",        "audio": "example-transcribe-latest"      },      "autoPriority": {        "image": 40      },      "nativeDocumentInputs": ["pdf"],      "documentModels": {        "pdf": {          "textExtraction": "example-doc-text-latest",          "image": "example-doc-vision-latest"        }      }    }  }}

รายการผู้ให้บริการแต่ละรายการสามารถมีสิ่งต่อไปนี้:

ฟิลด์ ประเภท ความหมาย
capabilities ("image" | "audio" | "video")[] ความสามารถด้านสื่อที่ผู้ให้บริการนี้เปิดให้ใช้
defaultModels Record<string, string> ค่าเริ่มต้นในการจับคู่ความสามารถกับโมเดล ซึ่งใช้เมื่อการกำหนดค่าไม่ได้ระบุโมเดล
autoPriority Record<string, number> ตัวเลขที่ต่ำกว่าจะถูกจัดเรียงก่อนสำหรับทางเลือกสำรองของผู้ให้บริการโดยอัตโนมัติตามข้อมูลประจำตัว
nativeDocumentInputs "pdf"[] อินพุตเอกสารแบบเนทีฟที่ผู้ให้บริการรองรับ
documentModels { pdf?: { textExtraction?: string; image?: string | false } } การแทนที่โมเดลแยกตามประเภทเอกสาร ตั้งค่า image: false เพื่อปิดใช้งานการแยกข้อมูลจากรูปภาพสำหรับเอกสารประเภทนั้น

เอกสารอ้างอิง channelConfigs

ใช้ channelConfigs เมื่อ Plugin ช่องทางต้องการข้อมูลเมตาการกำหนดค่าที่มีต้นทุนต่ำก่อนโหลดรันไทม์ การค้นพบการตั้งค่า/สถานะช่องทางแบบอ่านอย่างเดียวสามารถใช้ข้อมูลเมตานี้โดยตรงสำหรับช่องทางภายนอกที่กำหนดค่าไว้ เมื่อไม่มีรายการตั้งค่า หรือเมื่อ setup.requiresRuntime: false ประกาศว่าไม่จำเป็นต้องใช้รันไทม์การตั้งค่า

channelConfigs เป็นข้อมูลเมตาของไฟล์รายการ Plugin ไม่ใช่ส่วนการกำหนดค่าระดับบนสุดใหม่สำหรับผู้ใช้ ผู้ใช้ยังคงกำหนดค่าอินสแตนซ์ช่องทางภายใต้ channels.<channel-id> OpenClaw อ่านข้อมูลเมตาของไฟล์รายการเพื่อพิจารณาว่า Plugin ใดเป็นเจ้าของช่องทางที่กำหนดค่าไว้นั้น ก่อนที่โค้ดรันไทม์ของ Plugin จะทำงาน

สำหรับ Plugin ช่องทาง configSchema และ channelConfigs อธิบายพาธที่แตกต่างกัน:

  • configSchema ตรวจสอบความถูกต้องของ plugins.entries.<plugin-id>.config
  • channelConfigs.<channel-id>.schema ตรวจสอบความถูกต้องของ channels.<channel-id>

Plugin ที่ไม่ได้รวมมาให้ซึ่งประกาศ channels[] ควรประกาศรายการ channelConfigs ที่ตรงกันด้วย หากไม่มีรายการเหล่านี้ OpenClaw ยังคงโหลด Plugin ได้ แต่สคีมาการกำหนดค่าแบบโคลด์พาธ การตั้งค่า และพื้นที่ผิว Control UI จะไม่ทราบรูปร่างตัวเลือกที่ช่องทางเป็นเจ้าของจนกว่ารันไทม์ของ Plugin จะทำงาน

channelConfigs.<channel-id>.commands.nativeCommandsAutoEnabled และ nativeSkillsAutoEnabled สามารถประกาศค่าเริ่มต้น auto แบบคงที่สำหรับการตรวจสอบการกำหนดค่าคำสั่งที่ทำงานก่อนโหลดรันไทม์ช่องทาง ช่องทางที่รวมมาให้ยังสามารถเผยแพร่ค่าเริ่มต้นเดียวกันผ่าน package.json#openclaw.channel.commands ควบคู่กับข้อมูลเมตาแค็ตตาล็อกช่องทางอื่นที่แพ็กเกจเป็นเจ้าของ

json
{  "channelConfigs": {    "matrix": {      "schema": {        "type": "object",        "additionalProperties": false,        "properties": {          "homeserverUrl": { "type": "string" }        }      },      "uiHints": {        "homeserverUrl": {          "label": "URL ของโฮมเซิร์ฟเวอร์",          "placeholder": "https://matrix.example.com"        }      },      "label": "Matrix",      "description": "การเชื่อมต่อโฮมเซิร์ฟเวอร์ Matrix",      "commands": {        "nativeCommandsAutoEnabled": true,        "nativeSkillsAutoEnabled": true      },      "preferOver": ["matrix-legacy"]    }  }}

รายการช่องทางแต่ละรายการสามารถมีสิ่งต่อไปนี้:

ฟิลด์ ประเภท ความหมาย
schema object JSON Schema สำหรับ channels.<id> จำเป็นสำหรับรายการการกำหนดค่าช่องทางแต่ละรายการที่ประกาศ
uiHints Record<string, object> ป้ายกำกับ UI/ข้อความตัวอย่าง/คำแนะนำเกี่ยวกับข้อมูลละเอียดอ่อนที่เป็นตัวเลือกสำหรับส่วนการกำหนดค่าช่องทางนั้น
label string ป้ายกำกับช่องทางที่ผสานเข้ากับพื้นที่ผิวตัวเลือกและการตรวจสอบเมื่อข้อมูลเมตารันไทม์ยังไม่พร้อม
description string คำอธิบายช่องทางแบบสั้นสำหรับพื้นที่ผิวการตรวจสอบและแค็ตตาล็อก
commands object ค่าเริ่มต้นอัตโนมัติแบบคงที่ของคำสั่งเนทีฟและ Skills เนทีฟสำหรับการตรวจสอบการกำหนดค่าก่อนรันไทม์
preferOver string[] รหัส Plugin แบบเดิมหรือที่มีลำดับความสำคัญต่ำกว่า ซึ่งช่องทางนี้ควรมีลำดับเหนือกว่าในพื้นที่ผิวการเลือก

การแทนที่ Plugin ช่องทางอื่น

ใช้ preferOver เมื่อ Plugin ของคุณเป็นเจ้าของที่ต้องการสำหรับรหัสช่องทางที่ Plugin อื่นสามารถให้บริการได้เช่นกัน กรณีทั่วไปได้แก่ รหัส Plugin ที่เปลี่ยนชื่อ Plugin แบบสแตนด์อโลนที่เข้ามาแทนที่ Plugin ที่รวมมาให้ หรือฟอร์กที่มีการบำรุงรักษาซึ่งคงรหัสช่องทางเดิมไว้เพื่อความเข้ากันได้ของการกำหนดค่า

json
{  "id": "acme-chat",  "channels": ["chat"],  "channelConfigs": {    "chat": {      "schema": {        "type": "object",        "additionalProperties": false,        "properties": {          "webhookUrl": { "type": "string" }        }      },      "preferOver": ["chat"]    }  }}

เมื่อกำหนดค่า channels.chat แล้ว OpenClaw จะพิจารณาทั้งรหัสช่องทางและรหัส Plugin ที่ต้องการ หาก Plugin ที่มีลำดับความสำคัญต่ำกว่าถูกเลือกเพียงเพราะเป็น Plugin ที่รวมมาให้หรือเปิดใช้งานโดยค่าเริ่มต้น OpenClaw จะปิดใช้งาน Plugin นั้นในการกำหนดค่ารันไทม์ที่มีผล เพื่อให้ Plugin เดียวเป็นเจ้าของช่องทางและเครื่องมือของช่องทาง การเลือกอย่างชัดเจนของผู้ใช้ยังคงมีผลเหนือกว่า หากผู้ใช้เปิดใช้งาน Plugin ทั้งสองอย่างชัดเจน (ผ่าน plugins.allow หรือการกำหนดค่า plugins.entries ที่มีสาระสำคัญ) OpenClaw จะคงตัวเลือกนั้นไว้และรายงานการวินิจฉัยช่องทาง/เครื่องมือที่ซ้ำกัน แทนที่จะเปลี่ยนชุด Plugin ที่ร้องขอโดยไม่แจ้ง

จำกัดขอบเขต preferOver ไว้เฉพาะรหัส Plugin ที่สามารถให้บริการช่องทางเดียวกันได้จริง ฟิลด์นี้ไม่ใช่ฟิลด์ลำดับความสำคัญทั่วไปและไม่ได้เปลี่ยนชื่อคีย์การกำหนดค่าของผู้ใช้

เอกสารอ้างอิง modelSupport

ใช้ modelSupport เมื่อ OpenClaw ควรอนุมาน Plugin ผู้ให้บริการของคุณจากรหัสโมเดลแบบย่อ เช่น gpt-5.6-sol หรือ claude-sonnet-4.6 ก่อนโหลดรันไทม์ของ Plugin

json
{  "modelSupport": {    "modelPrefixes": ["gpt-", "o1", "o3", "o4"],    "modelPatterns": ["^computer-use-preview"]  }}

OpenClaw ใช้ลำดับความสำคัญดังนี้:

  • การอ้างอิง provider/model แบบชัดเจนใช้ข้อมูลเมตาของไฟล์รายการ providers ที่เป็นเจ้าของ
  • modelPatterns มีลำดับเหนือกว่า modelPrefixes
  • หาก Plugin ที่ไม่ได้รวมมาให้หนึ่งรายการและ Plugin ที่รวมมาให้หนึ่งรายการตรงกัน Plugin ที่ไม่ได้รวมมาให้จะมีผลเหนือกว่า
  • ความกำกวมที่เหลือจะถูกละเว้นจนกว่าผู้ใช้หรือการกำหนดค่าจะระบุผู้ให้บริการ

ฟิลด์:

ฟิลด์ ประเภท ความหมาย
modelPrefixes string[] คำนำหน้าที่จับคู่ด้วย startsWith กับรหัสโมเดลแบบย่อ
modelPatterns string[] ซอร์สเรเจกซ์ที่จับคู่กับรหัสโมเดลแบบย่อหลังนำส่วนต่อท้ายโปรไฟล์ออก

รายการ modelPatterns จะถูกคอมไพล์ผ่าน compileSafeRegex ซึ่งปฏิเสธรูปแบบที่มีการทำซ้ำซ้อนกัน (ตัวอย่างเช่น (a+)+$) รูปแบบที่ไม่ผ่านการตรวจสอบความปลอดภัยจะถูกข้ามโดยไม่แจ้ง เช่นเดียวกับเรเจกซ์ที่มีไวยากรณ์ไม่ถูกต้อง ควรรักษารูปแบบให้เรียบง่ายและหลีกเลี่ยงตัวระบุจำนวนแบบซ้อนกัน

เอกสารอ้างอิง modelCatalog

ใช้ modelCatalog เมื่อ OpenClaw ควรทราบข้อมูลเมตาโมเดลของผู้ให้บริการก่อนโหลดรันไทม์ของ Plugin นี่คือแหล่งข้อมูลที่ไฟล์รายการเป็นเจ้าของสำหรับแถวแค็ตตาล็อกแบบคงที่ นามแฝงผู้ให้บริการ กฎการระงับ และโหมดการค้นพบ การรีเฟรชรันไทม์ยังคงเป็นหน้าที่ของโค้ดรันไทม์ผู้ให้บริการ แต่ไฟล์รายการจะแจ้งแกนหลักว่าเมื่อใดจำเป็นต้องใช้รันไทม์

json
{  "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": "ไม่มีให้ใช้งานบน Azure OpenAI Responses"      }    ],    "discovery": {      "openai": "static"    }  }}

ฟิลด์ระดับบนสุด:

ฟิลด์ ชนิด ความหมาย
providers Record<string, object> แถวแค็ตตาล็อกสำหรับรหัสผู้ให้บริการที่ Plugin นี้เป็นเจ้าของ คีย์ควรปรากฏใน providers ระดับบนสุดด้วย
aliases Record<string, object> นามแฝงผู้ให้บริการที่ควรแปลงเป็นผู้ให้บริการที่เป็นเจ้าของสำหรับการวางแผนแค็ตตาล็อกหรือการระงับ
suppressions object[] แถวโมเดลจากแหล่งอื่นที่ Plugin นี้ระงับด้วยเหตุผลเฉพาะของผู้ให้บริการ
discovery Record<string, "static" | "refreshable" | "runtime"> ระบุว่าแค็ตตาล็อกผู้ให้บริการสามารถอ่านจากเมทาดาทาของแมนิเฟสต์ รีเฟรชลงแคช หรือต้องใช้รันไทม์
runtimeAugment boolean ตั้งเป็น true เฉพาะเมื่อรันไทม์ของผู้ให้บริการต้องเพิ่มแถวแค็ตตาล็อกหลังการวางแผนแมนิเฟสต์/การกำหนดค่า

aliases มีส่วนร่วมในการค้นหาความเป็นเจ้าของผู้ให้บริการสำหรับการวางแผนแค็ตตาล็อกโมเดล เป้าหมายนามแฝงต้องเป็นผู้ให้บริการระดับบนสุดที่ Plugin เดียวกันเป็นเจ้าของ เมื่อรายการที่กรองตามผู้ให้บริการใช้นามแฝง OpenClaw สามารถอ่านแมนิเฟสต์ของเจ้าของและใช้การเขียนทับ API/URL ฐานของนามแฝงได้โดยไม่ต้องโหลดรันไทม์ของผู้ให้บริการ นามแฝงจะไม่ขยายรายการแค็ตตาล็อกที่ไม่ได้กรอง รายการแบบกว้างจะแสดงเฉพาะแถวผู้ให้บริการมาตรฐานของเจ้าของเท่านั้น

suppressions แทนที่ฮุก suppressBuiltInModel แบบเก่าของรันไทม์ผู้ให้บริการ รายการระงับจะมีผลเฉพาะเมื่อ Plugin เป็นเจ้าของผู้ให้บริการ หรือประกาศเป็นคีย์ modelCatalog.aliases ที่ชี้ไปยังผู้ให้บริการที่เป็นเจ้าของ ระบบจะไม่เรียกฮุกระงับของรันไทม์ระหว่างการแปลงค่าโมเดลอีกต่อไป

ฟิลด์ผู้ให้บริการ:

ฟิลด์ ชนิด ความหมาย
baseUrl string URL ฐานเริ่มต้นที่เลือกกำหนดได้สำหรับโมเดลในแค็ตตาล็อกผู้ให้บริการนี้
api ModelApi อะแดปเตอร์ API เริ่มต้นที่เลือกกำหนดได้สำหรับโมเดลในแค็ตตาล็อกผู้ให้บริการนี้
headers Record<string, string> ส่วนหัวแบบคงที่ที่เลือกกำหนดได้ซึ่งใช้กับแค็ตตาล็อกผู้ให้บริการนี้
defaultUtilityModel string รหัสโมเดลขนาดเล็กที่ผู้ให้บริการแนะนำซึ่งเลือกกำหนดได้สำหรับงานอรรถประโยชน์ภายในระยะสั้น (ชื่อเรื่อง การบรรยายความคืบหน้า) ใช้เมื่อไม่ได้ตั้งค่า agents.defaults.utilityModel และผู้ให้บริการนี้ให้บริการโมเดลหลักของเอเจนต์
models object[] แถวโมเดลที่จำเป็น ระบบจะละเว้นแถวที่ไม่มี id

ฟิลด์โมเดล:

ฟิลด์ ชนิด ความหมาย
id string รหัสโมเดลภายในผู้ให้บริการ โดยไม่มีคำนำหน้า provider/
name string ชื่อที่แสดงซึ่งเลือกกำหนดได้
api ModelApi การเขียนทับ API รายโมเดลซึ่งเลือกกำหนดได้
baseUrl string การเขียนทับ URL ฐานรายโมเดลซึ่งเลือกกำหนดได้
headers Record<string, string> ส่วนหัวแบบคงที่รายโมเดลซึ่งเลือกกำหนดได้
input Array<"text" | "image" | "document"> รูปแบบข้อมูลที่โมเดลยอมรับ ค่าอื่นจะถูกตัดทิ้งโดยไม่มีการแจ้งเตือน
reasoning boolean ระบุว่าโมเดลเปิดเผยพฤติกรรมการให้เหตุผลหรือไม่
contextWindow number หน้าต่างบริบทดั้งเดิมของผู้ให้บริการ
contextTokens number ขีดจำกัดบริบทรันไทม์ที่มีผลซึ่งเลือกกำหนดได้ เมื่อแตกต่างจาก contextWindow
maxTokens number จำนวนโทเค็นเอาต์พุตสูงสุดเมื่อทราบค่า
thinkingLevelMap Record<string, string | null> การเขียนทับรหัสโมเดลหรือพารามิเตอร์ตามระดับการคิดซึ่งเลือกกำหนดได้
cost object ราคาที่เลือกกำหนดได้ในหน่วย USD ต่อหนึ่งล้านโทเค็น รวมถึง tieredPricing ที่เลือกกำหนดได้
compat object แฟล็กความเข้ากันได้ที่เลือกกำหนดได้ ซึ่งตรงกับความเข้ากันได้ของการกำหนดค่าโมเดล OpenClaw
mediaInput object การกำหนดค่าอินพุตรายรูปแบบข้อมูลซึ่งเลือกกำหนดได้ ปัจจุบันรองรับเฉพาะรูปภาพ
status "available" | "preview" | "deprecated" | "disabled" สถานะการแสดงรายการ ระงับเฉพาะเมื่อแถวนั้นต้องไม่ปรากฏเลย
statusReason string เหตุผลที่เลือกกำหนดได้ซึ่งแสดงพร้อมสถานะไม่พร้อมใช้งาน
replaces string[] รหัสโมเดลภายในผู้ให้บริการแบบเก่าที่โมเดลนี้เข้ามาแทนที่
replacedBy string รหัสโมเดลภายในผู้ให้บริการที่ใช้แทนสำหรับแถวที่เลิกใช้แล้ว
tags string[] แท็กที่เสถียรซึ่งใช้โดยตัวเลือกและตัวกรอง

ฟิลด์การระงับ:

ฟิลด์ ชนิด ความหมาย
provider string รหัสผู้ให้บริการสำหรับแถวต้นทางที่จะระงับ Plugin นี้ต้องเป็นเจ้าของหรือประกาศเป็นนามแฝงที่เป็นเจ้าของ
model string รหัสโมเดลภายในผู้ให้บริการที่จะระงับ
reason string ข้อความที่เลือกกำหนดได้ซึ่งแสดงเมื่อมีการร้องขอแถวที่ถูกระงับโดยตรง
when.baseUrlHosts string[] รายการโฮสต์ URL ฐานที่มีผลของผู้ให้บริการซึ่งเลือกกำหนดได้และจำเป็นก่อนการระงับจะมีผล
when.providerConfigApiIn string[] รายการค่า api ที่ตรงกันทุกประการในการกำหนดค่าผู้ให้บริการซึ่งเลือกกำหนดได้และจำเป็นก่อนการระงับจะมีผล

อย่าใส่ข้อมูลที่ใช้เฉพาะรันไทม์ใน modelCatalog ใช้ static เฉพาะเมื่อแถวแมนิเฟสต์สมบูรณ์เพียงพอให้รายการที่กรองตามผู้ให้บริการและพื้นผิวตัวเลือกข้ามการค้นหารีจิสทรี/รันไทม์ได้ ใช้ refreshable เมื่อแถวแมนิเฟสต์เป็นข้อมูลตั้งต้นหรือส่วนเสริมที่มีประโยชน์และแสดงในรายการได้ แต่การรีเฟรช/แคชสามารถเพิ่มแถวเพิ่มเติมภายหลังได้ แถวที่รีเฟรชได้ไม่ถือเป็นแหล่งข้อมูลที่เชื่อถือได้โดยตัวมันเอง ใช้ runtime เมื่อ OpenClaw ต้องโหลดรันไทม์ของผู้ให้บริการเพื่อทราบรายการ

ข้อมูลอ้างอิง modelIdNormalization

ใช้ modelIdNormalization สำหรับการปรับแต่งรหัสโมเดลที่ผู้ให้บริการเป็นเจ้าของแบบประหยัด ซึ่งต้องเกิดขึ้นก่อนโหลดรันไทม์ของผู้ให้บริการ วิธีนี้เก็บนามแฝง เช่น ชื่อโมเดลแบบสั้น รหัสเดิมภายในผู้ให้บริการ และกฎคำนำหน้าพร็อกซี ไว้ในแมนิเฟสต์ของ Plugin เจ้าของ แทนที่จะอยู่ในตารางเลือกโมเดลของแกนหลัก

json
{  "providers": ["anthropic", "openrouter"],  "modelIdNormalization": {    "providers": {      "anthropic": {        "aliases": {          "sonnet-4.6": "claude-sonnet-4-6"        }      },      "openrouter": {        "prefixWhenBare": "openrouter"      }    }  }}

ฟิลด์ผู้ให้บริการ:

ฟิลด์ ชนิด ความหมาย
aliases Record<string,string> นามแฝงรหัสโมเดลที่ตรงกันทุกประการโดยไม่คำนึงถึงตัวพิมพ์เล็ก-ใหญ่ ระบบจะส่งคืนค่าตามที่เขียนไว้
stripPrefixes string[] คำนำหน้าที่จะนำออกก่อนค้นหานามแฝง มีประโยชน์สำหรับการซ้ำซ้อนของผู้ให้บริการ/โมเดลแบบเดิม
prefixWhenBare string คำนำหน้าที่จะเพิ่มเมื่อรหัสโมเดลที่ปรับมาตรฐานแล้วไม่มี / อยู่ก่อน
prefixWhenBareAfterAliasStartsWith object[] กฎคำนำหน้ารหัสเปล่าแบบมีเงื่อนไขหลังการค้นหานามแฝง โดยใช้ modelPrefix และ prefix เป็นคีย์

ข้อมูลอ้างอิง providerEndpoints

ใช้ providerEndpoints สำหรับการจำแนกปลายทางที่นโยบายคำขอทั่วไปต้องทราบก่อนโหลดรันไทม์ของผู้ให้บริการ แกนหลักยังคงเป็นเจ้าของความหมายของ endpointClass แต่ละรายการ ส่วนแมนิเฟสต์ของ Plugin เป็นเจ้าของเมทาดาทาโฮสต์และ URL ฐาน

Plugin ผู้ให้บริการที่แยกออกเป็นภายนอกอย่างเป็นทางการจะไม่รวมอยู่ในชุดแจกจ่ายหลัก ดังนั้น แมนิเฟสต์ของ Plugin เหล่านั้นจึงมองไม่เห็นจนกว่าจะติดตั้ง และต้องทำสำเนา providerEndpoints ไว้ใน scripts/lib/official-external-provider-catalog.json ด้วย เพื่อให้ การจำแนกปลายทางยังคงทำงานได้โดยไม่มี Plugin โดยมีการทดสอบสัญญา คอยบังคับให้ข้อมูลสำเนาตรงกัน

ฟิลด์ปลายทาง:

ฟิลด์ ชนิด ความหมาย
endpointClass string คลาสเอนด์พอยต์หลักที่รู้จัก เช่น openrouter, moonshot-native หรือ google-vertex
hosts string[] ชื่อโฮสต์แบบตรงกันทุกประการที่แมปกับคลาสเอนด์พอยต์
hostSuffixes string[] ส่วนต่อท้ายของโฮสต์ที่แมปกับคลาสเอนด์พอยต์ เติม . ไว้ข้างหน้าสำหรับการจับคู่เฉพาะส่วนต่อท้ายของโดเมน
baseUrls string[] URL ฐาน HTTP(S) ที่ปรับรูปแบบแล้วและตรงกันทุกประการ ซึ่งแมปกับคลาสเอนด์พอยต์
googleVertexRegion string ภูมิภาค Google Vertex แบบคงที่สำหรับโฮสต์ส่วนกลางที่ตรงกันทุกประการ
googleVertexRegionHostSuffix string ส่วนต่อท้ายที่จะตัดออกจากโฮสต์ที่ตรงกัน เพื่อแสดงคำนำหน้าภูมิภาค Google Vertex

ข้อมูลอ้างอิง providerRequest

ใช้ providerRequest สำหรับข้อมูลเมตาความเข้ากันได้ของคำขอที่มีต้นทุนต่ำ ซึ่งนโยบายคำขอทั่วไปต้องใช้โดยไม่ต้องโหลดรันไทม์ของผู้ให้บริการ เก็บการเขียนเพย์โหลดใหม่ที่เฉพาะเจาะจงกับพฤติกรรมไว้ในฮุกของรันไทม์ผู้ให้บริการหรือตัวช่วยร่วมของตระกูลผู้ให้บริการ

json
{  "providerRequest": {    "providers": {      "vllm": {        "family": "vllm",        "openAICompletions": {          "supportsStreamingUsage": true        }      }    }  }}

ฟิลด์ผู้ให้บริการ:

ฟิลด์ ชนิด ความหมาย
family string ป้ายกำกับตระกูลผู้ให้บริการที่ใช้ในการตัดสินใจด้านความเข้ากันได้ของคำขอทั่วไปและการวินิจฉัย
compatibilityFamily "moonshot" กลุ่มความเข้ากันได้ของตระกูลผู้ให้บริการที่เป็นตัวเลือก สำหรับตัวช่วยคำขอที่ใช้ร่วมกัน
openAICompletions object แฟล็กคำขอ completions ที่เข้ากันได้กับ OpenAI ซึ่งปัจจุบันคือ supportsStreamingUsage

ข้อมูลอ้างอิง secretProviderIntegrations

ใช้ secretProviderIntegrations เมื่อ Plugin สามารถเผยแพร่พรีเซ็ตผู้ให้บริการ exec ของ SecretRef ที่นำกลับมาใช้ใหม่ได้ OpenClaw อ่านข้อมูลเมตานี้ก่อนโหลดรันไทม์ของ Plugin จัดเก็บความเป็นเจ้าของ Plugin ไว้ใน secrets.providers.<alias>.pluginIntegration และปล่อยให้รันไทม์ SecretRef ดำเนินการแก้ไขข้อมูลลับจริง พรีเซ็ตจะแสดงเฉพาะสำหรับ Plugin ที่รวมมาให้และ Plugin ที่ติดตั้งซึ่งค้นพบจากรูทการติดตั้ง Plugin ที่มีการจัดการ เช่น การติดตั้งผ่าน git และ ClawHub

json
{  "secretProviderIntegrations": {    "secret-store": {      "providerAlias": "team-secrets",      "displayName": "Team secrets",      "source": "exec",      "command": "${node}",      "args": ["./bin/resolve-secrets.mjs"]    }  }}

คีย์ของแมปคือรหัสการผสานการทำงาน หากละเว้น providerAlias OpenClaw จะใช้รหัสการผสานการทำงานเป็นนามแฝงผู้ให้บริการ SecretRef นามแฝงผู้ให้บริการต้องตรงกับรูปแบบนามแฝงผู้ให้บริการ SecretRef ปกติ เช่น team-secrets หรือ onepassword-work

เมื่อผู้ดำเนินการเลือกพรีเซ็ต OpenClaw จะเขียนการอ้างอิงผู้ให้บริการดังนี้:

json
{  "secrets": {    "providers": {      "team-secrets": {        "source": "exec",        "pluginIntegration": {          "pluginId": "acme-secrets",          "integrationId": "secret-store"        }      }    }  }}

เมื่อเริ่มต้น/โหลดใหม่ OpenClaw จะแก้ไขผู้ให้บริการนั้นโดยโหลดข้อมูลเมตาแมนิเฟสต์ Plugin ปัจจุบัน ตรวจสอบว่า Plugin เจ้าของได้รับการติดตั้งและทำงานอยู่ และสร้างคำสั่ง exec จากแมนิเฟสต์ การปิดใช้งานหรือลบ Plugin จะเพิกถอนผู้ให้บริการสำหรับ SecretRef ที่ใช้งานอยู่ ผู้ดำเนินการที่ต้องการการกำหนดค่า exec แบบสแตนด์อโลนยังคงสามารถเขียนผู้ให้บริการ command/args ด้วยตนเองได้โดยตรง

ปัจจุบันรองรับเฉพาะพรีเซ็ต source: "exec" เท่านั้น command ต้องเป็น ${node} และ args[0] ต้องเป็นสคริปต์ตัวแก้ไข ./ ที่สัมพันธ์กับรูทของ Plugin OpenClaw จะสร้างค่าดังกล่าวเมื่อเริ่มต้น/โหลดใหม่ให้เป็นไฟล์ปฏิบัติการ Node ปัจจุบันและพาธสัมบูรณ์ของสคริปต์ภายใน Plugin ตัวเลือก Node เช่น --require, --import, --loader, --env-file, --eval และ --print ไม่ได้เป็นส่วนหนึ่งของสัญญาพรีเซ็ตแมนิเฟสต์ ผู้ดำเนินการที่ต้องใช้คำสั่งที่ไม่ใช่ Node สามารถกำหนดค่าผู้ให้บริการ exec แบบสแตนด์อโลนด้วยตนเองได้โดยตรง

OpenClaw สร้าง trustedDirs สำหรับพรีเซ็ตแมนิเฟสต์จากรูทของ Plugin และสำหรับพรีเซ็ต ${node} จะสร้างจากไดเรกทอรีไฟล์ปฏิบัติการ Node ปัจจุบัน trustedDirs ที่กำหนดไว้ในแมนิเฟสต์จะถูกละเว้น ตัวเลือกผู้ให้บริการ exec อื่นๆ เช่น timeoutMs, noOutputTimeoutMs, maxOutputBytes, jsonOnly, env, passEnv และ allowInsecurePath จะถูกส่งต่อไปยังการกำหนดค่าผู้ให้บริการ exec ของ SecretRef ตามปกติ

ข้อมูลอ้างอิง modelPricing

ใช้ modelPricing เมื่อผู้ให้บริการต้องควบคุมพฤติกรรมการกำหนดราคาของระนาบควบคุมก่อนโหลดรันไทม์ แคชราคาของ Gateway จะอ่านข้อมูลเมตานี้โดยไม่ต้องนำเข้าโค้ดรันไทม์ของผู้ให้บริการ

json
{  "providers": ["ollama", "openrouter"],  "modelPricing": {    "providers": {      "ollama": {        "external": false      },      "openrouter": {        "openRouter": {          "passthroughProviderModel": true        },        "liteLLM": false      }    }  }}

ฟิลด์ผู้ให้บริการ:

ฟิลด์ ชนิด ความหมาย
external boolean ตั้งค่า false สำหรับผู้ให้บริการภายในเครื่อง/โฮสต์เองที่ต้องไม่ดึงข้อมูลราคา OpenRouter หรือ LiteLLM โดยเด็ดขาด
openRouter false | object การแมปการค้นหาราคา OpenRouter โดย false จะปิดใช้งานการค้นหา OpenRouter สำหรับผู้ให้บริการนี้
liteLLM false | object การแมปการค้นหาราคา LiteLLM โดย false จะปิดใช้งานการค้นหา LiteLLM สำหรับผู้ให้บริการนี้

ฟิลด์แหล่งที่มา:

ฟิลด์ ชนิด ความหมาย
provider string รหัสผู้ให้บริการแค็ตตาล็อกภายนอกเมื่อแตกต่างจากรหัสผู้ให้บริการ OpenClaw เช่น z-ai สำหรับผู้ให้บริการ zai
passthroughProviderModel boolean ถือว่ารหัสโมเดลที่มีเครื่องหมายทับเป็นการอ้างอิงผู้ให้บริการ/โมเดลแบบซ้อน ซึ่งมีประโยชน์สำหรับผู้ให้บริการพร็อกซี เช่น OpenRouter
modelIdTransforms "version-dots"[] รูปแบบรหัสโมเดลของแค็ตตาล็อกภายนอกเพิ่มเติม โดย version-dots จะลองรหัสเวอร์ชันแบบมีจุด เช่น claude-opus-4.6

ดัชนีผู้ให้บริการ OpenClaw

ดัชนีผู้ให้บริการ OpenClaw คือข้อมูลเมตาตัวอย่างที่ OpenClaw เป็นเจ้าของ สำหรับผู้ให้บริการซึ่งอาจยังไม่ได้ติดตั้ง Plugin ข้อมูลนี้ไม่ใช่ส่วนหนึ่งของแมนิเฟสต์ Plugin แมนิเฟสต์ Plugin ยังคงเป็นแหล่งข้อมูลที่เชื่อถือได้สำหรับ Plugin ที่ติดตั้ง ดัชนีผู้ให้บริการเป็นสัญญาสำรองภายในที่พื้นผิวผู้ให้บริการแบบติดตั้งได้และตัวเลือกโมเดลก่อนติดตั้งในอนาคตจะใช้ เมื่อยังไม่ได้ติดตั้ง Plugin ของผู้ให้บริการ

ลำดับความน่าเชื่อถือของแค็ตตาล็อก:

  1. การกำหนดค่าของผู้ใช้
  2. แมนิเฟสต์ Plugin ที่ติดตั้ง modelCatalog
  3. แคชแค็ตตาล็อกโมเดลจากการรีเฟรชอย่างชัดเจน
  4. แถวตัวอย่างจากดัชนีผู้ให้บริการ OpenClaw

ดัชนีผู้ให้บริการต้องไม่มีข้อมูลลับ สถานะการเปิดใช้งาน ฮุกรันไทม์ หรือข้อมูลโมเดลสดที่เฉพาะเจาะจงกับบัญชี แค็ตตาล็อกตัวอย่างใช้รูปแบบแถวผู้ให้บริการ modelCatalog เดียวกับแมนิเฟสต์ Plugin แต่ควรจำกัดไว้เฉพาะข้อมูลเมตาสำหรับการแสดงผลที่เสถียร เว้นแต่ฟิลด์อะแดปเตอร์รันไทม์ เช่น api, baseUrl, ราคา หรือแฟล็กความเข้ากันได้ จะได้รับการรักษาให้สอดคล้องกับแมนิเฟสต์ Plugin ที่ติดตั้งโดยเจตนา ผู้ให้บริการที่มีการค้นหา /models แบบสดควรเขียนแถวที่รีเฟรชผ่านพาธแคชแค็ตตาล็อกโมเดลอย่างชัดเจน แทนที่จะให้การแสดงรายการหรือการเริ่มต้นใช้งานตามปกติเรียก API ของผู้ให้บริการ

รายการในดัชนีผู้ให้บริการอาจมีข้อมูลเมตาของ Plugin ที่ติดตั้งได้ด้วย สำหรับผู้ให้บริการที่ย้าย Plugin ออกจากแกนหลักหรือยังไม่ได้ติดตั้งด้วยเหตุผลอื่น ข้อมูลเมตานี้สะท้อนรูปแบบแค็ตตาล็อกช่องทาง ได้แก่ ชื่อแพ็กเกจ ข้อกำหนดการติดตั้ง npm ค่า integrity ที่คาดไว้ และป้ายกำกับตัวเลือกการยืนยันตัวตนที่มีต้นทุนต่ำ ซึ่งเพียงพอสำหรับแสดงตัวเลือกการตั้งค่าที่ติดตั้งได้ เมื่อติดตั้ง Plugin แล้ว แมนิเฟสต์ของ Plugin จะมีลำดับความสำคัญเหนือกว่า และรายการดัชนีผู้ให้บริการสำหรับผู้ให้บริการนั้นจะถูกละเว้น

openclaw doctor --fix ย้ายชุดคีย์ความสามารถระดับบนสุดแบบเดิมของแมนิเฟสต์ที่มีขนาดเล็กและจำกัดไปยัง contracts.* ได้แก่ speechProviders, mediaUnderstandingProviders, imageGenerationProviders และ tools คีย์เหล่านี้ทั้งหมด (รวมถึงรายการความสามารถอื่นๆ) จะไม่ถูกอ่านเป็นฟิลด์ระดับบนสุดของแมนิเฟสต์อีกต่อไป การโหลดแมนิเฟสต์ตามปกติจะรู้จักคีย์เหล่านี้เฉพาะภายใต้ contracts

แมนิเฟสต์เทียบกับ package.json

ไฟล์ทั้งสองทำหน้าที่ต่างกัน:

ไฟล์ ใช้สำหรับ
openclaw.plugin.json การค้นพบ การตรวจสอบความถูกต้องของการกำหนดค่า ข้อมูลเมตาตัวเลือกการยืนยันตัวตน และคำแนะนำ UI ที่ต้องมีอยู่ก่อนโค้ด Plugin ทำงาน
package.json ข้อมูลเมตา npm การติดตั้งการขึ้นต่อกัน และบล็อก openclaw ที่ใช้สำหรับเอนทรีพอยต์ การควบคุมการติดตั้ง การตั้งค่า หรือข้อมูลเมตาแค็ตตาล็อก

หากไม่แน่ใจว่าข้อมูลเมตาส่วนหนึ่งควรอยู่ที่ใด ให้ใช้กฎนี้:

  • หาก OpenClaw ต้องทราบข้อมูลนั้นก่อนโหลดโค้ด Plugin ให้ใส่ไว้ใน openclaw.plugin.json
  • หากข้อมูลนั้นเกี่ยวกับการจัดแพ็กเกจ ไฟล์เริ่มต้น หรือพฤติกรรมการติดตั้ง npm ให้ใส่ไว้ใน package.json

ฟิลด์ package.json ที่ส่งผลต่อการค้นพบ

ข้อมูลเมตา Plugin ก่อนรันไทม์บางส่วนถูกจัดเก็บไว้ใน package.json ภายใต้บล็อก openclaw แทน openclaw.plugin.json โดยเจตนา openclaw.bundle และ openclaw.bundle.json ไม่ใช่สัญญา Plugin ของ OpenClaw โดย Plugin แบบเนทีฟต้องใช้ openclaw.plugin.json ร่วมกับฟิลด์ package.json#openclaw ที่รองรับด้านล่าง

ตัวอย่างสำคัญ:

ฟิลด์ ความหมาย
openclaw.extensions ประกาศจุดเริ่มต้นของ Plugin แบบเนทีฟ ต้องอยู่ภายในไดเรกทอรีแพ็กเกจของ Plugin
openclaw.runtimeExtensions ประกาศจุดเริ่มต้นรันไทม์ JavaScript ที่สร้างแล้วสำหรับแพ็กเกจที่ติดตั้ง ต้องอยู่ภายในไดเรกทอรีแพ็กเกจของ Plugin
openclaw.setupEntry จุดเริ่มต้นขนาดเล็กสำหรับการตั้งค่าเท่านั้น ซึ่งใช้ระหว่างการเริ่มต้นใช้งาน การเริ่มช่องทางแบบเลื่อนเวลา และการตรวจสอบสถานะช่องทาง/การค้นหา SecretRef แบบอ่านอย่างเดียว ต้องอยู่ภายในไดเรกทอรีแพ็กเกจของ Plugin
openclaw.runtimeSetupEntry ประกาศจุดเริ่มต้นการตั้งค่า JavaScript ที่สร้างแล้วสำหรับแพ็กเกจที่ติดตั้ง ต้องมี setupEntry ต้องมีอยู่จริง และต้องอยู่ภายในไดเรกทอรีแพ็กเกจของ Plugin
openclaw.channel เมทาดาทาแค็ตตาล็อกช่องทางที่มีขนาดเล็ก เช่น ป้ายกำกับ พาธเอกสาร นามแฝง และข้อความสำหรับการเลือก
openclaw.channel.approvalFlags แฟล็กลักษณะการทำงานของการอนุมัติแบบปิดที่พร้อมใช้ก่อนโหลดรันไทม์ native หมายถึงช่องทางเป็นเจ้าของ UI การอนุมัติแบบเนทีฟและการแก้ไขให้เสร็จภายในเทิร์นเดียวกัน
openclaw.channel.commands เมทาดาทาค่าเริ่มต้นอัตโนมัติแบบคงที่สำหรับคำสั่งเนทีฟและ Skills แบบเนทีฟ ซึ่งการกำหนดค่า การตรวจสอบ และพื้นผิวรายการคำสั่งใช้ก่อนโหลดรันไทม์ของช่องทาง
openclaw.channel.configuredState เมทาดาทาตัวตรวจสอบสถานะการกำหนดค่าแบบขนาดเล็กที่ตอบได้ว่า "มีการตั้งค่าผ่านตัวแปรสภาพแวดล้อมเท่านั้นอยู่แล้วหรือไม่" โดยไม่ต้องโหลดรันไทม์ของช่องทางทั้งหมด
openclaw.channel.persistedAuthState เมทาดาทาตัวตรวจสอบการยืนยันตัวตนที่บันทึกไว้แบบขนาดเล็ก ซึ่งตอบได้ว่า "มีสิ่งใดลงชื่อเข้าใช้อยู่แล้วหรือไม่" โดยไม่ต้องโหลดรันไทม์ของช่องทางทั้งหมด
openclaw.install.clawhubSpec / openclaw.install.npmSpec / openclaw.install.localPath คำแนะนำการติดตั้ง/อัปเดตสำหรับ Plugin ที่รวมมาด้วยและเผยแพร่ภายนอก
openclaw.install.defaultChoice พาธการติดตั้งที่ต้องการเมื่อมีแหล่งติดตั้งหลายแหล่ง
openclaw.install.minHostVersion เวอร์ชันโฮสต์ OpenClaw ขั้นต่ำที่รองรับ โดยใช้ค่าขั้นต่ำของ semver เช่น >=2026.3.22 หรือ >=2026.5.1-beta.1
openclaw.compat.pluginApi ช่วง API ของ Plugin OpenClaw ขั้นต่ำที่แพ็กเกจนี้ต้องใช้ โดยใช้ค่าขั้นต่ำของ semver เช่น >=2026.5.27
openclaw.install.expectedIntegrity สตริงความถูกต้องสมบูรณ์ของ npm dist ที่คาดไว้ เช่น sha512-...; ขั้นตอนการติดตั้งและอัปเดตจะตรวจสอบอาร์ติแฟกต์ที่ดึงมากับค่านี้
openclaw.install.allowInvalidConfigRecovery อนุญาตพาธการกู้คืนแบบจำกัดสำหรับการติดตั้ง Plugin ที่รวมมาด้วยอีกครั้งเมื่อการกำหนดค่าไม่ถูกต้อง
openclaw.install.requiredPlatformPackages นามแฝงแพ็กเกจ npm ที่ต้องถูกสร้างขึ้นเมื่อข้อจำกัดแพลตฟอร์มใน lockfile ตรงกับโฮสต์ปัจจุบัน
openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen ช่วยให้พื้นผิวช่องทางของรันไทม์การตั้งค่าโหลดได้ก่อนเริ่มรับฟัง จากนั้นเลื่อนการโหลด Plugin ช่องทางที่กำหนดค่าไว้อย่างสมบูรณ์ไปจนถึงการเปิดใช้งานหลังเริ่มรับฟัง

เมทาดาทาแมนิเฟสต์กำหนดว่าตัวเลือกผู้ให้บริการ/ช่องทาง/การตั้งค่าใดจะปรากฏในการเริ่มต้นใช้งานก่อนโหลดรันไทม์ package.json#openclaw.install บอกขั้นตอนการเริ่มต้นใช้งานว่าจะดึงหรือเปิดใช้ Plugin นั้นอย่างไรเมื่อผู้ใช้เลือกหนึ่งในตัวเลือกเหล่านั้น อย่าย้ายคำแนะนำการติดตั้งไปไว้ใน openclaw.plugin.json

openclaw.install.minHostVersion ถูกบังคับใช้ระหว่างการติดตั้งและการโหลดรีจิสทรีแมนิเฟสต์สำหรับแหล่ง Plugin ที่ไม่ได้รวมมาด้วย ค่าที่ไม่ถูกต้องจะถูกปฏิเสธ ส่วนค่าที่ถูกต้องแต่ใหม่กว่าจะทำให้ข้าม Plugin ภายนอกบนโฮสต์รุ่นเก่า ถือว่า Plugin ต้นทางที่รวมมาด้วยใช้เวอร์ชันเดียวกับเช็กเอาต์ของโฮสต์

openclaw.install.requiredPlatformPackages ใช้สำหรับแพ็กเกจ npm ที่เปิดเผยไบนารีเนทีฟที่จำเป็นผ่านนามแฝงแบบไม่บังคับซึ่งจำเพาะต่อแพลตฟอร์ม ระบุชื่อแพ็กเกจ npm แบบไม่มีส่วนขยายสำหรับทุกนามแฝงแพลตฟอร์มที่รองรับ ระหว่างการติดตั้ง npm OpenClaw จะตรวจสอบเฉพาะนามแฝงที่ประกาศไว้ซึ่งมีข้อจำกัดใน lockfile ตรงกับโฮสต์ปัจจุบัน หาก npm รายงานว่าสำเร็จแต่ละเว้นนามแฝงนั้น OpenClaw จะลองใหม่หนึ่งครั้งด้วยแคชใหม่ และย้อนกลับการติดตั้งหากนามแฝงยังคงหายไป

openclaw.compat.pluginApi ถูกบังคับใช้ระหว่างการติดตั้งแพ็กเกจสำหรับแหล่ง Plugin ที่ไม่ได้รวมมาด้วย ใช้ค่านี้เป็นค่าขั้นต่ำของ API รันไทม์/SDK ของ Plugin OpenClaw ที่ใช้สร้างแพ็กเกจ ค่านี้อาจเข้มงวดกว่า minHostVersion เมื่อแพ็กเกจ Plugin ต้องใช้ API ที่ใหม่กว่า แต่ยังคงคำแนะนำการติดตั้งขั้นต่ำที่ต่ำกว่าสำหรับขั้นตอนอื่น โดยค่าเริ่มต้น การซิงค์รีลีสอย่างเป็นทางการของ OpenClaw จะเพิ่มค่าขั้นต่ำ API ของ Plugin อย่างเป็นทางการที่มีอยู่ให้เท่ากับเวอร์ชันรีลีสของ OpenClaw แต่รีลีสที่มีเฉพาะ Plugin สามารถคงค่าขั้นต่ำที่ต่ำกว่าได้เมื่อแพ็กเกจตั้งใจรองรับโฮสต์รุ่นเก่า อย่าใช้เวอร์ชันแพ็กเกจเพียงอย่างเดียวเป็นสัญญาความเข้ากันได้ peerDependencies.openclaw ยังคงเป็นเมทาดาทาแพ็กเกจ npm; OpenClaw ใช้สัญญา openclaw.compat.pluginApi สำหรับการตัดสินใจด้านความเข้ากันได้ในการติดตั้ง

เมทาดาทาการติดตั้งตามต้องการอย่างเป็นทางการควรใช้ clawhubSpec เมื่อ Plugin เผยแพร่บน ClawHub; ขั้นตอนการเริ่มต้นใช้งานจะถือว่านี่เป็นแหล่งระยะไกลที่ต้องการและบันทึกข้อมูลอาร์ติแฟกต์ ClawHub หลังติดตั้ง npmSpec ยังคงเป็นทางเลือกสำรองเพื่อความเข้ากันได้สำหรับแพ็กเกจที่ยังไม่ได้ย้ายไป ClawHub

การตรึงเวอร์ชัน npm แบบตรงตัวมีอยู่แล้วใน npmSpec ตัวอย่างเช่น "npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3" รายการแค็ตตาล็อกภายนอกอย่างเป็นทางการควรจับคู่ข้อกำหนดแบบตรงตัวกับ expectedIntegrity เพื่อให้ขั้นตอนการอัปเดตหยุดอย่างปลอดภัยหากอาร์ติแฟกต์ npm ที่ดึงมาไม่ตรงกับรีลีสที่ตรึงไว้อีกต่อไป การเริ่มต้นใช้งานแบบโต้ตอบยังคงเสนอข้อกำหนด npm จากรีจิสทรีที่เชื่อถือได้ รวมถึงชื่อแพ็กเกจแบบไม่มีส่วนขยายและ dist-tags เพื่อความเข้ากันได้ การวินิจฉัยแค็ตตาล็อกสามารถแยกแยะแหล่งตัวเลือกเริ่มต้นแบบตรงตัว แบบลอยตัว แบบตรึงความถูกต้องสมบูรณ์ แบบไม่มีความถูกต้องสมบูรณ์ แบบชื่อแพ็กเกจไม่ตรงกัน และแบบไม่ถูกต้องได้ นอกจากนี้ยังเตือนเมื่อมี expectedIntegrity แต่ไม่มีแหล่ง npm ที่ถูกต้องให้ตรึง เมื่อมี expectedIntegrity ขั้นตอนการติดตั้ง/อัปเดตจะบังคับใช้ค่านี้ เมื่อไม่มีค่านี้ ระบบจะบันทึกการแก้ไขรีจิสทรีโดยไม่มีการตรึงความถูกต้องสมบูรณ์

Plugin ช่องทางควรระบุ openclaw.setupEntry เมื่อการตรวจสอบสถานะ รายการช่องทาง หรือการสแกน SecretRef จำเป็นต้องระบุบัญชีที่กำหนดค่าไว้โดยไม่โหลดรันไทม์ทั้งหมด จุดเริ่มต้นการตั้งค่าควรเปิดเผยเมทาดาทาช่องทาง รวมถึงอะแดปเตอร์การกำหนดค่า สถานะ และข้อมูลลับที่ปลอดภัยสำหรับการตั้งค่า ส่วนไคลเอ็นต์เครือข่าย ตัวรับฟัง Gateway และรันไทม์การขนส่งให้เก็บไว้ในจุดเริ่มต้นส่วนขยายหลัก

ฟิลด์จุดเริ่มต้นรันไทม์ไม่ลบล้างการตรวจสอบขอบเขตแพ็กเกจสำหรับฟิลด์จุดเริ่มต้นต้นทาง ตัวอย่างเช่น openclaw.runtimeExtensions ไม่สามารถทำให้พาธ openclaw.extensions ที่หลุดออกนอกขอบเขตสามารถโหลดได้

openclaw.install.allowInvalidConfigRecovery มีขอบเขตจำกัดโดยเจตนา ค่านี้ไม่ได้ทำให้การกำหนดค่าที่เสียหายใด ๆ สามารถติดตั้งได้ ปัจจุบันค่านี้อนุญาตให้ขั้นตอนการติดตั้งกู้คืนจากความล้มเหลวเฉพาะของการอัปเกรด Plugin ที่รวมมาด้วยซึ่งล้าสมัยเท่านั้น เช่น พาธ Plugin ที่รวมมาด้วยหายไป หรือรายการ channels.<id> ที่ล้าสมัยสำหรับ Plugin ที่รวมมาด้วยเดียวกัน ข้อผิดพลาดการกำหนดค่าที่ไม่เกี่ยวข้องยังคงขัดขวางการติดตั้งและส่งผู้ดำเนินการไปยัง openclaw doctor --fix

openclaw.channel.persistedAuthState คือเมทาดาทาแพ็กเกจสำหรับโมดูลตัวตรวจสอบขนาดเล็ก:

json
{  "openclaw": {    "channel": {      "id": "whatsapp",      "persistedAuthState": {        "specifier": "./auth-presence",        "exportName": "hasAnyWhatsAppAuth"      }    }  }}

ใช้ค่านี้เมื่อขั้นตอนการตั้งค่า doctor สถานะ หรือขั้นตอนตรวจสอบการมีอยู่แบบอ่านอย่างเดียว ต้องการการตรวจสอบการยืนยันตัวตนแบบใช่/ไม่ใช่ที่มีต้นทุนต่ำก่อนโหลด Plugin ช่องทางทั้งหมด สถานะการยืนยันตัวตนที่บันทึกไว้ไม่ใช่สถานะช่องทางที่กำหนดค่าไว้: อย่าใช้เมทาดาทานี้เพื่อเปิดใช้ Plugin โดยอัตโนมัติ ซ่อมแซมการขึ้นต่อกันของรันไทม์ หรือตัดสินใจว่าควรโหลดรันไทม์ของช่องทางหรือไม่ เอ็กซ์พอร์ตเป้าหมายควรเป็นฟังก์ชันขนาดเล็กที่อ่านเฉพาะสถานะที่บันทึกไว้ อย่าส่งผ่าน barrel ของรันไทม์ช่องทางทั้งหมด

openclaw.channel.configuredState รองรับการตรวจสอบการกำหนดค่าที่มีต้นทุนต่ำ ควรใช้เมทาดาทาตัวแปรสภาพแวดล้อมแบบประกาศเมื่อใช้เพียงตัวแปรสภาพแวดล้อมก็เพียงพอ:

json
{  "openclaw": {    "channel": {      "id": "telegram",      "configuredState": {        "env": {          "allOf": ["TELEGRAM_BOT_TOKEN"]        }      }    }  }}

ใช้ env.allOf เมื่อต้องมีทุกตัวแปรที่ระบุ และใช้ env.anyOf เมื่อตัวแปรใดตัวแปรหนึ่งที่ไม่ว่างก็เพียงพอ หากการตรวจสอบขนาดเล็กที่ไม่ใช่รันไทม์ต้องการมากกว่าเมทาดาทาตัวแปรสภาพแวดล้อม ให้ใช้ specifier ร่วมกับ exportName ตามที่แสดงสำหรับ persistedAuthState; เมื่อมี env OpenClaw จะใช้ค่านี้โดยไม่โหลดโมดูลนั้น หากการตรวจสอบต้องใช้การแก้ไขการกำหนดค่าแบบเต็มหรือรันไทม์ช่องทางจริง ให้เก็บตรรกะนั้นไว้ในฮุก config.hasConfiguredState ของ Plugin แทน

ลำดับความสำคัญในการค้นหา (รหัส Plugin ซ้ำกัน)

OpenClaw ค้นหา Plugin จากสามรูท โดยตรวจสอบตามลำดับนี้: Plugin ที่รวมและจัดส่งมากับ OpenClaw, รูทการติดตั้งส่วนกลาง (~/.openclaw/extensions) และรูทพื้นที่ทำงานปัจจุบัน (<workspace>/.openclaw/extensions) รวมถึงรายการ plugins.load.paths ที่ระบุไว้อย่างชัดเจน

หากผลการค้นหาสองรายการมี id เดียวกัน ระบบจะเก็บเฉพาะแมนิเฟสต์ที่มีลำดับความสำคัญสูงสุด ส่วนรายการซ้ำที่มีลำดับความสำคัญต่ำกว่าจะถูกทิ้งแทนที่จะโหลดควบคู่กัน ลำดับความสำคัญจากสูงสุดไปต่ำสุด:

  1. เลือกโดยการกำหนดค่า — พาธที่ตรึงไว้อย่างชัดเจนใน plugins.entries.<id>
  2. การติดตั้งส่วนกลางที่ตรงกับระเบียนการติดตั้งที่ติดตามไว้ — Plugin ที่ติดตั้งผ่าน openclaw plugin install/openclaw plugin update ซึ่งการติดตามการติดตั้งของ OpenClaw รู้จักว่าเป็นรหัสเดียวกัน แม้ว่ารหัสนั้นจะเป็นของ Plugin ที่รวมมาด้วยด้วยก็ตาม
  3. รวมมาด้วย — Plugin ที่จัดส่งมากับ OpenClaw
  4. พื้นที่ทำงาน — Plugin ที่ค้นพบโดยอ้างอิงจากพื้นที่ทำงานปัจจุบัน
  5. ตัวเลือกอื่นใดที่ค้นพบ

ผลที่ตามมา:

  • สำเนาที่ fork ไว้หรือล้าสมัยของ Plugin ที่รวมมา ซึ่งวางอยู่โดยไม่ถูกติดตามในเวิร์กสเปซหรือรูทส่วนกลาง จะไม่บดบังบิลด์ที่รวมมา
  • หากต้องการแทนที่ Plugin ที่รวมมา ให้เรียกใช้ openclaw plugin install สำหรับ id นั้น เพื่อให้การติดตั้งส่วนกลางที่ติดตามไว้มีลำดับความสำคัญสูงกว่าสำเนาที่รวมมา หรือปักหมุดพาธเฉพาะผ่าน plugins.entries.<id> เพื่อให้พาธนั้นชนะตามลำดับความสำคัญที่เลือกด้วยการกำหนดค่า
  • ระบบจะบันทึกการทิ้งรายการซ้ำลงในล็อก เพื่อให้ Doctor และการวินิจฉัยเมื่อเริ่มต้นระบบสามารถชี้ไปยังสำเนาที่ถูกละทิ้งได้
  • การแทนที่รายการซ้ำที่เลือกด้วยการกำหนดค่าจะแสดงถ้อยคำในการวินิจฉัยว่าเป็นการแทนที่อย่างชัดเจน แต่ยังคงแจ้งเตือนเพื่อให้ fork ที่ล้าสมัยและการบดบังโดยไม่ตั้งใจยังคงมองเห็นได้

ข้อกำหนดของ JSON Schema

  • ทุก Plugin ต้องมาพร้อม JSON Schema แม้ว่าจะไม่รับการกำหนดค่าใดก็ตาม
  • สามารถใช้สคีมาว่างได้ (ตัวอย่างเช่น { "type": "object", "additionalProperties": false })
  • ระบบจะตรวจสอบความถูกต้องของสคีมาขณะอ่าน/เขียนการกำหนดค่า ไม่ใช่ขณะรันไทม์
  • เมื่อขยายหรือ fork Plugin ที่รวมมาด้วยคีย์การกำหนดค่าใหม่ ให้อัปเดต openclaw.plugin.json configSchema ของ Plugin นั้นพร้อมกัน สคีมาของ Plugin ที่รวมมามีความเข้มงวด ดังนั้นการเพิ่ม plugins.entries.<id>.config.myNewKey ในการกำหนดค่าของผู้ใช้โดยไม่เพิ่ม myNewKey ลงใน configSchema.properties จะถูกปฏิเสธก่อนที่รันไทม์ของ Plugin จะโหลด

ตัวอย่างการขยายสคีมา:

json
{  "configSchema": {    "type": "object",    "additionalProperties": false,    "properties": {      "myNewKey": {        "type": "string"      }    }  }}

ลักษณะการตรวจสอบความถูกต้อง

  • คีย์ channels.* ที่ไม่รู้จักถือเป็น ข้อผิดพลาด เว้นแต่ id ของช่องทางจะประกาศโดยไฟล์ manifest ของ Plugin หาก id เดียวกันปรากฏใน plugins.allow, plugins.entries หรือ plugins.installs ด้วย (Plugin ที่ถูกอ้างอิงแต่ยังค้นหาไม่พบในขณะนี้) OpenClaw จะลดระดับกรณีนี้เป็น คำเตือน แทน
  • plugins.entries.<id>, plugins.allow และ plugins.deny ที่อ้างอิง id ของ Plugin ที่ไม่รู้จักถือเป็น คำเตือน ("ละเว้นรายการการกำหนดค่าที่ล้าสมัย") ไม่ใช่ข้อผิดพลาด เพื่อให้การอัปเกรดและ Plugin ที่ถูกลบ/เปลี่ยนชื่อไม่ขัดขวางการเริ่มต้น Gateway
  • plugins.slots.memory ที่อ้างอิง id ของ Plugin ที่ไม่รู้จักถือเป็น ข้อผิดพลาด ยกเว้น Plugin ภายนอกอย่างเป็นทางการ memory-lancedb ที่ระบบรู้จัก ซึ่งจะแจ้งเตือนแทน
  • หากมีการติดตั้ง Plugin แต่ไฟล์ manifest หรือสคีมาเสียหายหรือขาดหาย การตรวจสอบความถูกต้องจะล้มเหลว และ Doctor จะรายงานข้อผิดพลาดของ Plugin
  • หากมีการกำหนดค่าของ Plugin แต่ Plugin ถูกปิดใช้งาน ระบบจะเก็บการกำหนดค่าไว้และแสดง คำเตือน ใน Doctor และล็อก

ดูสคีมา plugins.* ฉบับเต็มได้ที่ ข้อมูลอ้างอิงการกำหนดค่า

หมายเหตุ

  • ไฟล์ manifest จำเป็นสำหรับ Plugin แบบเนทีฟของ OpenClaw รวมถึงการโหลดจากระบบไฟล์ภายในเครื่อง รันไทม์ยังคงโหลดโมดูลของ Plugin แยกต่างหาก ส่วนไฟล์ manifest ใช้สำหรับการค้นหาและการตรวจสอบความถูกต้องเท่านั้น
  • ไฟล์ manifest แบบเนทีฟได้รับการแยกวิเคราะห์ด้วย JSON5 จึงรองรับความคิดเห็น เครื่องหมายจุลภาคต่อท้าย และคีย์ที่ไม่ใส่เครื่องหมายคำพูด ตราบใดที่ค่าสุดท้ายยังคงเป็นออบเจ็กต์
  • ตัวโหลดไฟล์ manifest จะอ่านเฉพาะฟิลด์ที่มีเอกสารกำกับเท่านั้น หลีกเลี่ยงการใช้คีย์ระดับบนสุดแบบกำหนดเอง
  • สามารถละเว้น channels, providers, cliBackends และ skills ทั้งหมดได้เมื่อ Plugin ไม่จำเป็นต้องใช้
  • providerCatalogEntry ต้องมีขนาดเบาและไม่ควรนำเข้าโค้ดรันไทม์ในวงกว้าง ให้ใช้สำหรับเมทาดาทาของแค็ตตาล็อกผู้ให้บริการแบบคงที่หรือตัวอธิบายการค้นหาที่มีขอบเขตแคบ ไม่ใช่การดำเนินการขณะประมวลผลคำขอ
  • ชนิด Plugin แบบเลือกได้เพียงรายการเดียวจะเลือกผ่าน plugins.slots.*: kind: "memory" ผ่าน plugins.slots.memory (ค่าเริ่มต้น memory-core), kind: "context-engine" ผ่าน plugins.slots.contextEngine (ค่าเริ่มต้น legacy)
  • ประกาศชนิด Plugin แบบเลือกได้เพียงรายการเดียวในไฟล์ manifest นี้ OpenClawPluginDefinition.kind ของรายการเข้าสู่รันไทม์เลิกแนะนำให้ใช้แล้ว และยังคงมีอยู่เฉพาะเป็นทางเลือกสำรองเพื่อความเข้ากันได้สำหรับ Plugin รุ่นเก่า
  • เมทาดาทาของตัวแปรสภาพแวดล้อมใน setup.providers[].envVars มีไว้เพื่อการประกาศเท่านั้น สถานะ การตรวจสอบ การตรวจสอบความถูกต้องของการส่ง Cron และส่วนอื่นที่อ่านอย่างเดียวยังคงใช้นโยบายความน่าเชื่อถือและการเปิดใช้งานที่มีผลของ Plugin ก่อนถือว่าตัวแปรสภาพแวดล้อมได้รับการกำหนดค่าแล้ว
  • สำหรับเมทาดาทาของวิซาร์ดรันไทม์ที่ต้องใช้โค้ดของผู้ให้บริการ โปรดดู ฮุกของรันไทม์ผู้ให้บริการ
  • หาก Plugin ของคุณพึ่งพาโมดูลแบบเนทีฟ ให้จัดทำเอกสารขั้นตอนการบิลด์และข้อกำหนดของรายการอนุญาตสำหรับตัวจัดการแพ็กเกจ (ตัวอย่างเช่น pnpm allow-build-scripts + pnpm rebuild <package>)

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

Was this useful?
On this page

On this page