Plugins
Manifes Plugin
Halaman ini hanya untuk manifes Plugin native OpenClaw.
Untuk tata letak bundel yang kompatibel, lihat Bundel Plugin.
Format bundel yang kompatibel menggunakan file manifes yang berbeda:
- Bundel Codex:
.codex-plugin/plugin.json - Bundel Claude:
.claude-plugin/plugin.jsonatau tata letak komponen Claude default tanpa manifes - Bundel Cursor:
.cursor-plugin/plugin.json
OpenClaw juga otomatis mendeteksi tata letak bundel tersebut, tetapi tata letak itu tidak divalidasi
terhadap skema openclaw.plugin.json yang dijelaskan di sini.
Untuk bundel yang kompatibel, OpenClaw saat ini membaca metadata bundel beserta root
skill yang dideklarasikan, root perintah Claude, default settings.json bundel Claude,
default LSP bundel Claude, dan paket hook yang didukung ketika tata letaknya sesuai dengan
ekspektasi runtime OpenClaw.
Setiap Plugin native OpenClaw harus menyertakan file openclaw.plugin.json di
root Plugin. OpenClaw menggunakan manifes ini untuk memvalidasi konfigurasi
tanpa mengeksekusi kode Plugin. Manifes yang hilang atau tidak valid diperlakukan sebagai
kesalahan Plugin dan memblokir validasi konfigurasi.
Lihat panduan sistem Plugin lengkap: Plugin. Untuk model kapabilitas native dan panduan kompatibilitas eksternal saat ini: Model kapabilitas.
Apa yang dilakukan file ini
openclaw.plugin.json adalah metadata yang dibaca OpenClaw sebelum memuat
kode Plugin Anda. Semua hal di bawah ini harus cukup ringan untuk diperiksa tanpa menjalankan
runtime Plugin.
Gunakan untuk:
- identitas Plugin, validasi konfigurasi, dan petunjuk UI konfigurasi
- metadata auth, onboarding, dan penyiapan (alias, pengaktifan otomatis, variabel env provider, pilihan auth)
- petunjuk aktivasi untuk surface control-plane
- kepemilikan keluarga model singkat
- snapshot kepemilikan kapabilitas statis (
contracts) - metadata runner QA yang dapat diperiksa host bersama
openclaw qa - metadata konfigurasi khusus channel yang digabungkan ke surface katalog dan validasi
Jangan gunakan untuk: mendaftarkan perilaku runtime, mendeklarasikan entrypoint kode,
atau metadata instalasi npm. Hal tersebut berada di kode Plugin Anda dan package.json.
Contoh minimal
{
"id": "voice-call",
"configSchema": {
"type": "object",
"additionalProperties": false,
"properties": {}
}
}
Contoh lengkap
{
"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"],
"providerAuthEnvVars": {
"openrouter": ["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"
}
}
}
}
Referensi field tingkat atas
| Bidang | Wajib | Tipe | Artinya |
|---|---|---|---|
id |
Ya | string |
ID Plugin kanonis. Ini adalah id yang digunakan di plugins.entries.<id>. |
configSchema |
Ya | object |
JSON Schema inline untuk konfigurasi Plugin ini. |
enabledByDefault |
Tidak | true |
Menandai Plugin bawaan sebagai diaktifkan secara default. Abaikan, atau tetapkan nilai non-true apa pun, agar Plugin tetap dinonaktifkan secara default. |
enabledByDefaultOnPlatforms |
Tidak | string[] |
Menandai Plugin bawaan sebagai diaktifkan secara default hanya pada platform Node.js yang tercantum, misalnya ["darwin"]. Konfigurasi eksplisit tetap menang. |
legacyPluginIds |
Tidak | string[] |
ID lama yang dinormalisasi ke ID Plugin kanonis ini. |
autoEnableWhenConfiguredProviders |
Tidak | string[] |
ID penyedia yang harus mengaktifkan Plugin ini secara otomatis ketika autentikasi, konfigurasi, atau referensi model menyebutkannya. |
kind |
Tidak | "memory" | "context-engine" |
Mendeklarasikan jenis Plugin eksklusif yang digunakan oleh plugins.slots.*. |
channels |
Tidak | string[] |
ID saluran yang dimiliki oleh Plugin ini. Digunakan untuk penemuan dan validasi konfigurasi. |
providers |
Tidak | string[] |
ID penyedia yang dimiliki oleh Plugin ini. |
providerDiscoveryEntry |
Tidak | string |
Jalur modul penemuan penyedia ringan, relatif terhadap root Plugin, untuk metadata katalog penyedia dalam cakupan manifes yang dapat dimuat tanpa mengaktifkan runtime Plugin penuh. |
modelSupport |
Tidak | object |
Metadata ringkas keluarga model milik manifes yang digunakan untuk memuat Plugin secara otomatis sebelum runtime. |
modelCatalog |
Tidak | object |
Metadata katalog model deklaratif untuk penyedia yang dimiliki oleh Plugin ini. Ini adalah kontrak control-plane untuk daftar baca-saja mendatang, onboarding, pemilih model, alias, dan supresi tanpa memuat runtime Plugin. |
modelPricing |
Tidak | object |
Kebijakan pencarian harga eksternal milik penyedia. Gunakan ini untuk mengecualikan penyedia lokal/self-hosted dari katalog harga jarak jauh atau memetakan referensi penyedia ke ID katalog OpenRouter/LiteLLM tanpa meng-hardcode ID penyedia di core. |
modelIdNormalization |
Tidak | object |
Pembersihan alias/prefiks ID model milik penyedia yang harus berjalan sebelum runtime penyedia dimuat. |
providerEndpoints |
Tidak | object[] |
Metadata host/baseUrl endpoint milik manifes untuk rute penyedia yang harus diklasifikasikan core sebelum runtime penyedia dimuat. |
providerRequest |
Tidak | object |
Metadata murah keluarga penyedia dan kompatibilitas permintaan yang digunakan oleh kebijakan permintaan generik sebelum runtime penyedia dimuat. |
cliBackends |
Tidak | string[] |
ID backend inferensi CLI yang dimiliki oleh Plugin ini. Digunakan untuk aktivasi otomatis saat startup dari referensi konfigurasi eksplisit. |
syntheticAuthRefs |
Tidak | string[] |
Referensi penyedia atau backend CLI yang hook autentikasi sintetis milik Plugin-nya harus diperiksa selama penemuan model dingin sebelum runtime dimuat. |
nonSecretAuthMarkers |
Tidak | string[] |
Nilai placeholder API key milik Plugin bawaan yang merepresentasikan status kredensial lokal non-rahasia, OAuth, atau ambient. |
commandAliases |
Tidak | object[] |
Nama perintah yang dimiliki oleh Plugin ini yang harus menghasilkan diagnostik konfigurasi dan CLI yang sadar Plugin sebelum runtime dimuat. |
providerAuthEnvVars |
Tidak | Record<string, string[]> |
Metadata env kompatibilitas yang tidak digunakan lagi untuk pencarian autentikasi/status penyedia. Lebih disarankan setup.providers[].envVars untuk Plugin baru; OpenClaw masih membaca ini selama jendela deprekasi. |
providerAuthAliases |
Tidak | Record<string, string> |
ID penyedia yang harus menggunakan kembali ID penyedia lain untuk pencarian autentikasi, misalnya penyedia coding yang berbagi API key dan profil autentikasi penyedia dasar. |
channelEnvVars |
Tidak | Record<string, string[]> |
Metadata env saluran murah yang dapat diperiksa OpenClaw tanpa memuat kode Plugin. Gunakan ini untuk setup saluran berbasis env atau permukaan autentikasi yang harus terlihat oleh helper startup/konfigurasi generik. |
providerAuthChoices |
Tidak | object[] |
Metadata pilihan autentikasi murah untuk pemilih onboarding, resolusi penyedia pilihan, dan wiring flag CLI sederhana. |
activation |
Tidak | object |
Metadata perencana aktivasi murah untuk pemuatan yang dipicu startup, penyedia, perintah, saluran, rute, dan kapabilitas. Hanya metadata; runtime Plugin tetap memiliki perilaku aktual. |
setup |
Tidak | object |
Deskriptor setup/onboarding murah yang dapat diperiksa permukaan penemuan dan setup tanpa memuat runtime Plugin. |
qaRunners |
Tidak | object[] |
Deskriptor runner QA murah yang digunakan oleh host bersama openclaw qa sebelum runtime Plugin dimuat. |
contracts |
Tidak | object |
Snapshot kepemilikan kapabilitas statis untuk hook autentikasi eksternal, ucapan, transkripsi realtime, suara realtime, pemahaman media, pembuatan gambar, pembuatan musik, pembuatan video, pengambilan web, pencarian web, dan kepemilikan tool. |
mediaUnderstandingProviderMetadata |
Tidak | Record<string, object> |
Default pemahaman media murah untuk ID penyedia yang dideklarasikan di contracts.mediaUnderstandingProviders. |
imageGenerationProviderMetadata |
Tidak | Record<string, object> |
Metadata autentikasi pembuatan gambar murah untuk ID penyedia yang dideklarasikan di contracts.imageGenerationProviders, termasuk alias autentikasi milik penyedia dan guard base-url. |
videoGenerationProviderMetadata |
Tidak | Record<string, object> |
Metadata autentikasi pembuatan video murah untuk ID penyedia yang dideklarasikan di contracts.videoGenerationProviders, termasuk alias autentikasi milik penyedia dan guard base-url. |
musicGenerationProviderMetadata |
Tidak | Record<string, object> |
Metadata autentikasi pembuatan musik murah untuk ID penyedia yang dideklarasikan di contracts.musicGenerationProviders, termasuk alias autentikasi milik penyedia dan guard base-url. |
toolMetadata |
Tidak | Record<string, object> |
Metadata ketersediaan murah untuk tool milik Plugin yang dideklarasikan di contracts.tools. Gunakan ini ketika tool tidak boleh memuat runtime kecuali ada bukti konfigurasi, env, atau autentikasi. |
channelConfigs |
Tidak | Record<string, object> |
Metadata konfigurasi saluran milik manifes yang digabungkan ke permukaan penemuan dan validasi sebelum runtime dimuat. |
skills |
Tidak | string[] |
Direktori Skill yang akan dimuat, relatif terhadap root Plugin. |
name |
Tidak | string |
Nama Plugin yang dapat dibaca manusia. |
description |
Tidak | string |
Ringkasan singkat yang ditampilkan di permukaan Plugin. |
version |
Tidak | string |
Versi Plugin informatif. |
uiHints |
Tidak | Record<string, object> |
Label UI, placeholder, dan petunjuk sensitivitas untuk kolom konfigurasi. |
Referensi metadata penyedia pembuatan
Kolom metadata penyedia pembuatan menjelaskan sinyal autentikasi statis untuk
penyedia yang dideklarasikan dalam daftar contracts.*GenerationProviders yang cocok.
OpenClaw membaca kolom-kolom ini sebelum runtime penyedia dimuat sehingga alat inti dapat
memutuskan apakah penyedia pembuatan tersedia tanpa mengimpor setiap
plugin penyedia.
Gunakan kolom-kolom ini hanya untuk fakta deklaratif yang murah. Transport, transformasi permintaan, penyegaran token, validasi kredensial, dan perilaku pembuatan yang sebenarnya tetap berada di 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"]
}
}
]
}
}
}
Setiap entri metadata mendukung:
| Kolom | Wajib | Tipe | Artinya |
|---|---|---|---|
aliases |
Tidak | string[] |
Id penyedia tambahan yang harus dihitung sebagai alias autentikasi statis untuk penyedia pembuatan. |
authProviders |
Tidak | string[] |
Id penyedia yang profil autentikasi terkonfigurasinya harus dihitung sebagai autentikasi untuk penyedia pembuatan ini. |
configSignals |
Tidak | object[] |
Sinyal ketersediaan murah berbasis konfigurasi saja untuk penyedia lokal atau self-hosted yang dapat dikonfigurasi tanpa profil autentikasi atau variabel env. |
authSignals |
Tidak | object[] |
Sinyal autentikasi eksplisit. Jika ada, sinyal ini menggantikan kumpulan sinyal default dari id penyedia, aliases, dan authProviders. |
Setiap entri configSignals mendukung:
| Kolom | Wajib | Tipe | Artinya |
|---|---|---|---|
rootPath |
Ya | string |
Jalur titik ke objek konfigurasi milik plugin yang akan diperiksa, misalnya plugins.entries.example.config. |
overlayPath |
Tidak | string |
Jalur titik di dalam konfigurasi root yang objeknya harus melapisi objek root sebelum mengevaluasi sinyal. Gunakan ini untuk konfigurasi khusus kapabilitas seperti image, video, atau music. |
required |
Tidak | string[] |
Jalur titik di dalam konfigurasi efektif yang harus memiliki nilai terkonfigurasi. String tidak boleh kosong; objek dan array tidak boleh kosong. |
requiredAny |
Tidak | string[] |
Jalur titik di dalam konfigurasi efektif dengan setidaknya satu yang harus memiliki nilai terkonfigurasi. |
mode |
Tidak | object |
Penjaga mode string opsional di dalam konfigurasi efektif. Gunakan ini saat ketersediaan berbasis konfigurasi saja hanya berlaku untuk satu mode. |
Setiap penjaga mode mendukung:
| Kolom | Wajib | Tipe | Artinya |
|---|---|---|---|
path |
Tidak | string |
Jalur titik di dalam konfigurasi efektif. Default-nya adalah mode. |
default |
Tidak | string |
Nilai mode yang digunakan saat konfigurasi menghilangkan jalur tersebut. |
allowed |
Tidak | string[] |
Jika ada, sinyal lolos hanya ketika mode efektif adalah salah satu dari nilai-nilai ini. |
disallowed |
Tidak | string[] |
Jika ada, sinyal gagal ketika mode efektif adalah salah satu dari nilai-nilai ini. |
Setiap entri authSignals mendukung:
| Kolom | Wajib | Tipe | Artinya |
|---|---|---|---|
provider |
Ya | string |
Id penyedia yang akan diperiksa dalam profil autentikasi terkonfigurasi. |
providerBaseUrl |
Tidak | object |
Penjaga opsional yang membuat sinyal dihitung hanya ketika penyedia terkonfigurasi yang dirujuk menggunakan URL dasar yang diizinkan. Gunakan ini saat alias autentikasi hanya valid untuk API tertentu. |
Setiap penjaga providerBaseUrl mendukung:
| Kolom | Wajib | Tipe | Artinya |
|---|---|---|---|
provider |
Ya | string |
Id konfigurasi penyedia yang baseUrl-nya harus diperiksa. |
defaultBaseUrl |
Tidak | string |
URL dasar yang diasumsikan ketika konfigurasi penyedia menghilangkan baseUrl. |
allowedBaseUrls |
Ya | string[] |
URL dasar yang diizinkan untuk sinyal autentikasi ini. Sinyal diabaikan ketika URL dasar terkonfigurasi atau default tidak cocok dengan salah satu nilai ternormalisasi ini. |
Referensi metadata alat
toolMetadata menggunakan bentuk configSignals dan authSignals yang sama seperti
metadata penyedia pembuatan, dengan kunci berdasarkan nama alat. contracts.tools mendeklarasikan
kepemilikan. toolMetadata mendeklarasikan bukti ketersediaan yang murah sehingga OpenClaw dapat
menghindari pengimporan runtime plugin hanya agar factory alatnya mengembalikan null.
{
"providerAuthEnvVars": {
"example": ["EXAMPLE_API_KEY"]
},
"contracts": {
"tools": ["example_search"]
},
"toolMetadata": {
"example_search": {
"authSignals": [
{
"provider": "example"
}
],
"configSignals": [
{
"rootPath": "plugins.entries.example.config",
"overlayPath": "search",
"required": ["apiKey"]
}
]
}
}
}
Jika sebuah alat tidak memiliki toolMetadata, OpenClaw mempertahankan perilaku yang ada dan
memuat plugin pemilik saat kontrak alat cocok dengan kebijakan. Untuk alat jalur panas
yang factory-nya bergantung pada autentikasi/konfigurasi, penulis plugin sebaiknya mendeklarasikan
toolMetadata alih-alih membuat inti mengimpor runtime untuk bertanya.
Referensi providerAuthChoices
Setiap entri providerAuthChoices menjelaskan satu pilihan onboarding atau autentikasi.
OpenClaw membaca ini sebelum runtime penyedia dimuat.
Daftar penyiapan penyedia menggunakan pilihan manifes ini, pilihan penyiapan turunan deskriptor,
dan metadata katalog instalasi tanpa memuat runtime penyedia.
| Kolom | Wajib | Tipe | Artinya |
|---|---|---|---|
provider |
Ya | string |
Id penyedia yang memiliki pilihan ini. |
method |
Ya | string |
Id metode autentikasi untuk dikirimkan. |
choiceId |
Ya | string |
Id pilihan autentikasi stabil yang digunakan oleh alur onboarding dan CLI. |
choiceLabel |
Tidak | string |
Label yang terlihat oleh pengguna. Jika dihilangkan, OpenClaw menggunakan fallback ke choiceId. |
choiceHint |
Tidak | string |
Teks bantuan singkat untuk pemilih. |
assistantPriority |
Tidak | number |
Nilai yang lebih rendah diurutkan lebih awal dalam pemilih interaktif yang digerakkan asisten. |
assistantVisibility |
Tidak | "visible" | "manual-only" |
Sembunyikan pilihan dari pemilih asisten sambil tetap mengizinkan pemilihan CLI manual. |
deprecatedChoiceIds |
Tidak | string[] |
Id pilihan lama yang harus mengarahkan pengguna ke pilihan pengganti ini. |
groupId |
Tidak | string |
Id grup opsional untuk mengelompokkan pilihan terkait. |
groupLabel |
Tidak | string |
Label yang terlihat oleh pengguna untuk grup tersebut. |
groupHint |
Tidak | string |
Teks bantuan singkat untuk grup. |
optionKey |
Tidak | string |
Kunci opsi internal untuk alur autentikasi satu flag sederhana. |
cliFlag |
Tidak | string |
Nama flag CLI, seperti --openrouter-api-key. |
cliOption |
Tidak | string |
Bentuk opsi CLI lengkap, seperti --openrouter-api-key <key>. |
cliDescription |
Tidak | string |
Deskripsi yang digunakan dalam bantuan CLI. |
onboardingScopes |
Tidak | Array<"text-inference" | "image-generation"> |
Permukaan onboarding tempat pilihan ini harus muncul. Jika dihilangkan, default-nya adalah ["text-inference"]. |
Referensi commandAliases
Gunakan commandAliases ketika Plugin memiliki nama perintah runtime yang mungkin
secara keliru dimasukkan pengguna ke plugins.allow atau dicoba dijalankan sebagai perintah CLI root. OpenClaw
menggunakan metadata ini untuk diagnostik tanpa mengimpor kode runtime Plugin.
{
"commandAliases": [
{
"name": "dreaming",
"kind": "runtime-slash",
"cliCommand": "memory"
}
]
}
| Bidang | Wajib | Tipe | Artinya |
|---|---|---|---|
name |
Ya | string |
Nama perintah yang dimiliki Plugin ini. |
kind |
Tidak | "runtime-slash" |
Menandai alias sebagai perintah garis miring chat, bukan perintah CLI root. |
cliCommand |
Tidak | string |
Perintah CLI root terkait yang disarankan untuk operasi CLI, jika ada. |
referensi activation
Gunakan activation ketika Plugin dapat mendeklarasikan dengan murah event control-plane mana
yang harus menyertakannya dalam rencana activation/load.
Blok ini adalah metadata perencana, bukan API siklus hidup. Ini tidak mendaftarkan
perilaku runtime, tidak menggantikan register(...), dan tidak menjanjikan bahwa
kode Plugin sudah dieksekusi. Perencana activation menggunakan bidang-bidang ini untuk
mempersempit kandidat Plugin sebelum kembali ke metadata kepemilikan manifes yang ada
seperti providers, channels, commandAliases, setup.providers,
contracts.tools, dan hooks.
Pilih metadata tersempit yang sudah mendeskripsikan kepemilikan. Gunakan
providers, channels, commandAliases, deskriptor setup, atau contracts
ketika bidang-bidang tersebut menyatakan hubungan itu. Gunakan activation untuk petunjuk
perencana tambahan yang tidak dapat direpresentasikan oleh bidang kepemilikan tersebut.
Gunakan cliBackends tingkat atas untuk alias runtime CLI seperti claude-cli,
codex-cli, atau google-gemini-cli; activation.onAgentHarnesses hanya untuk
id harness agen tertanam yang belum memiliki bidang kepemilikan.
Blok ini hanya metadata. Ini tidak mendaftarkan perilaku runtime, dan tidak
menggantikan register(...), setupEntry, atau entrypoint runtime/Plugin lainnya.
Konsumen saat ini menggunakannya sebagai petunjuk penyempitan sebelum pemuatan Plugin yang lebih luas, sehingga
metadata activation non-startup yang hilang biasanya hanya berdampak pada performa; itu
tidak seharusnya mengubah kebenaran selama fallback kepemilikan manifes masih ada.
Setiap Plugin harus menetapkan activation.onStartup secara sengaja. Tetapkan ke true
hanya ketika Plugin harus berjalan selama startup Gateway. Tetapkan ke false ketika
Plugin tidak aktif saat startup dan hanya boleh dimuat dari pemicu yang lebih sempit.
Menghilangkan onStartup tidak lagi memuat Plugin saat startup secara implisit; gunakan metadata
activation eksplisit untuk startup, channel, config, agent-harness, memory, atau
pemicu activation lain yang lebih sempit.
{
"activation": {
"onStartup": false,
"onProviders": ["openai"],
"onCommands": ["models"],
"onChannels": ["web"],
"onRoutes": ["gateway-webhook"],
"onConfigPaths": ["browser"],
"onCapabilities": ["provider", "tool"]
}
}
| Bidang | Wajib | Tipe | Artinya |
|---|---|---|---|
onStartup |
Tidak | boolean |
Activation startup Gateway eksplisit. Setiap Plugin harus menetapkan ini. true mengimpor Plugin selama startup; false membuatnya lazy saat startup kecuali pemicu lain yang cocok memerlukan pemuatan. |
onProviders |
Tidak | string[] |
Id provider yang harus menyertakan Plugin ini dalam rencana activation/load. |
onAgentHarnesses |
Tidak | string[] |
Id runtime harness agen tertanam yang harus menyertakan Plugin ini dalam rencana activation/load. Gunakan cliBackends tingkat atas untuk alias backend CLI. |
onCommands |
Tidak | string[] |
Id perintah yang harus menyertakan Plugin ini dalam rencana activation/load. |
onChannels |
Tidak | string[] |
Id channel yang harus menyertakan Plugin ini dalam rencana activation/load. |
onRoutes |
Tidak | string[] |
Jenis route yang harus menyertakan Plugin ini dalam rencana activation/load. |
onConfigPaths |
Tidak | string[] |
Path config relatif root yang harus menyertakan Plugin ini dalam rencana startup/load ketika path tersebut ada dan tidak dinonaktifkan secara eksplisit. |
onCapabilities |
Tidak | Array<"provider" | "channel" | "tool" | "hook"> |
Petunjuk kapabilitas luas yang digunakan oleh perencanaan activation control-plane. Pilih bidang yang lebih sempit jika memungkinkan. |
Konsumen live saat ini:
- Perencanaan startup Gateway menggunakan
activation.onStartupuntuk impor startup eksplisit - perencanaan CLI yang dipicu perintah kembali ke
commandAliases[].cliCommandataucommandAliases[].namelama - perencanaan startup agent-runtime menggunakan
activation.onAgentHarnessesuntuk harness tertanam dancliBackends[]tingkat atas untuk alias runtime CLI - perencanaan setup/channel yang dipicu channel kembali ke kepemilikan
channels[]lama ketika metadata activation channel eksplisit tidak ada - perencanaan Plugin startup menggunakan
activation.onConfigPathsuntuk permukaan config root non-channel seperti blokbrowsermilik Plugin browser bawaan - perencanaan setup/runtime yang dipicu provider kembali ke kepemilikan
providers[]dancliBackends[]tingkat atas lama ketika metadata activation provider eksplisit tidak ada
Diagnostik perencana dapat membedakan petunjuk activation eksplisit dari fallback
kepemilikan manifes. Misalnya, activation-command-hint berarti
activation.onCommands cocok, sedangkan manifest-command-alias berarti
perencana menggunakan kepemilikan commandAliases. Label alasan ini ditujukan untuk
diagnostik host dan pengujian; penulis Plugin harus tetap mendeklarasikan metadata
yang paling baik mendeskripsikan kepemilikan.
referensi qaRunners
Gunakan qaRunners saat sebuah Plugin menyumbangkan satu atau beberapa runner transport di bawah
root openclaw qa bersama. Jaga metadata ini tetap murah dan statis; runtime Plugin
tetap memiliki pendaftaran CLI aktual melalui permukaan ringan
runtime-api.ts yang mengekspor qaRunnerCliRegistrations.
{
"qaRunners": [
{
"commandName": "matrix",
"description": "Run the Docker-backed Matrix live QA lane against a disposable homeserver"
}
]
}
| Bidang | Wajib | Tipe | Artinya |
|---|---|---|---|
commandName |
Ya | string |
Subperintah yang dipasang di bawah openclaw qa, misalnya matrix. |
description |
Tidak | string |
Teks bantuan fallback yang digunakan saat host bersama memerlukan perintah stub. |
Referensi setup
Gunakan setup saat permukaan setup dan onboarding memerlukan metadata murah milik Plugin
sebelum runtime dimuat.
{
"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 tingkat atas tetap valid dan terus mendeskripsikan backend inferensi CLI.
setup.cliBackends adalah permukaan deskriptor khusus setup untuk
alur control-plane/setup yang harus tetap hanya metadata.
Jika ada, setup.providers dan setup.cliBackends adalah permukaan pencarian
yang diutamakan berbasis deskriptor untuk penemuan setup. Jika deskriptor hanya
mempersempit kandidat Plugin dan setup masih memerlukan hook runtime waktu-setup
yang lebih kaya, tetapkan requiresRuntime: true dan pertahankan setup-api
sebagai jalur eksekusi fallback.
OpenClaw juga menyertakan setup.providers[].envVars dalam pencarian autentikasi penyedia
dan env-var generik. providerAuthEnvVars tetap didukung melalui adaptor kompatibilitas
selama jendela deprekasi, tetapi Plugin yang tidak dibundel yang masih menggunakannya
menerima diagnostik manifes. Plugin baru harus meletakkan metadata env setup/status
di setup.providers[].envVars.
OpenClaw juga dapat menurunkan pilihan setup sederhana dari setup.providers[].authMethods
saat tidak ada entri setup, atau saat setup.requiresRuntime: false
menyatakan runtime setup tidak diperlukan. Entri providerAuthChoices eksplisit tetap
diutamakan untuk label khusus, flag CLI, cakupan onboarding, dan metadata asisten.
Tetapkan requiresRuntime: false hanya saat deskriptor tersebut cukup untuk
permukaan setup. OpenClaw memperlakukan false eksplisit sebagai kontrak hanya-deskriptor
dan tidak akan mengeksekusi setup-api atau openclaw.setupEntry untuk pencarian setup. Jika
Plugin hanya-deskriptor masih mengirim salah satu entri runtime setup tersebut,
OpenClaw melaporkan diagnostik aditif dan terus mengabaikannya. requiresRuntime
yang dihilangkan mempertahankan perilaku fallback lama sehingga Plugin yang ada yang menambahkan
deskriptor tanpa flag tersebut tidak rusak.
Karena pencarian setup dapat mengeksekusi kode setup-api milik Plugin, nilai
setup.providers[].id dan setup.cliBackends[] yang dinormalisasi harus tetap unik di seluruh
Plugin yang ditemukan. Kepemilikan ambigu gagal tertutup alih-alih memilih
pemenang dari urutan penemuan.
Saat runtime setup memang dieksekusi, diagnostik registry setup melaporkan drift deskriptor
jika setup-api mendaftarkan penyedia atau backend CLI yang tidak dideklarasikan
oleh deskriptor manifes, atau jika sebuah deskriptor tidak memiliki pendaftaran runtime
yang cocok. Diagnostik ini bersifat aditif dan tidak menolak Plugin lama.
Referensi setup.providers
| Bidang | Wajib | Tipe | Artinya |
|---|---|---|---|
id |
Ya | string |
Id penyedia yang diekspos selama setup atau onboarding. Jaga id yang dinormalisasi tetap unik secara global. |
authMethods |
Tidak | string[] |
Id metode setup/autentikasi yang didukung penyedia ini tanpa memuat runtime penuh. |
envVars |
Tidak | string[] |
Env var yang dapat diperiksa permukaan setup/status generik sebelum runtime Plugin dimuat. |
authEvidence |
Tidak | object[] |
Pemeriksaan bukti autentikasi lokal murah untuk penyedia yang dapat mengautentikasi melalui penanda non-rahasia. |
authEvidence digunakan untuk penanda kredensial lokal milik penyedia yang dapat
diverifikasi tanpa memuat kode runtime. Pemeriksaan ini harus tetap ringan dan lokal:
tidak ada panggilan jaringan, tidak ada pembacaan keychain atau secret-manager, tidak ada perintah shell, dan tidak ada
probe API penyedia.
Entri bukti yang didukung:
| Bidang | Wajib | Tipe | Artinya |
|---|---|---|---|
type |
Ya | string |
Saat ini local-file-with-env. |
fileEnvVar |
Tidak | string |
Env var yang berisi path file kredensial eksplisit. |
fallbackPaths |
Tidak | string[] |
Path file kredensial lokal yang diperiksa saat fileEnvVar tidak ada atau kosong. Mendukung ${HOME} dan ${APPDATA}. |
requiresAnyEnv |
Tidak | string[] |
Setidaknya satu env var yang tercantum harus tidak kosong sebelum bukti valid. |
requiresAllEnv |
Tidak | string[] |
Setiap env var yang tercantum harus tidak kosong sebelum bukti valid. |
credentialMarker |
Ya | string |
Penanda non-rahasia yang dikembalikan saat bukti ada. |
source |
Tidak | string |
Label sumber yang terlihat oleh pengguna untuk output auth/status. |
bidang setup
| Bidang | Wajib | Tipe | Artinya |
|---|---|---|---|
providers |
Tidak | object[] |
Deskriptor penyiapan penyedia yang diekspos selama penyiapan dan onboarding. |
cliBackends |
Tidak | string[] |
Id backend saat penyiapan yang digunakan untuk lookup penyiapan berbasis deskriptor terlebih dahulu. Jaga agar id ternormalisasi unik secara global. |
configMigrations |
Tidak | string[] |
Id migrasi konfigurasi yang dimiliki oleh permukaan penyiapan Plugin ini. |
requiresRuntime |
Tidak | boolean |
Apakah penyiapan masih membutuhkan eksekusi setup-api setelah lookup deskriptor. |
referensi uiHints
uiHints adalah peta dari nama bidang konfigurasi ke petunjuk rendering kecil.
{
"uiHints": {
"apiKey": {
"label": "API key",
"help": "Used for OpenRouter requests",
"placeholder": "sk-or-v1-...",
"sensitive": true
}
}
}
Setiap petunjuk bidang dapat mencakup:
| Bidang | Tipe | Artinya |
|---|---|---|
label |
string |
Label bidang yang terlihat oleh pengguna. |
help |
string |
Teks bantuan singkat. |
tags |
string[] |
Tag UI opsional. |
advanced |
boolean |
Menandai bidang sebagai lanjutan. |
sensitive |
boolean |
Menandai bidang sebagai rahasia atau sensitif. |
placeholder |
string |
Teks placeholder untuk input formulir. |
referensi contracts
Gunakan contracts hanya untuk metadata kepemilikan kapabilitas statis yang dapat dibaca OpenClaw
tanpa mengimpor runtime Plugin.
{
"contracts": {
"agentToolResultMiddleware": ["pi", "codex"],
"externalAuthProviders": ["acme-ai"],
"speechProviders": ["openai"],
"realtimeTranscriptionProviders": ["openai"],
"realtimeVoiceProviders": ["openai"],
"memoryEmbeddingProviders": ["local"],
"mediaUnderstandingProviders": ["openai", "openai-codex"],
"imageGenerationProviders": ["openai"],
"videoGenerationProviders": ["qwen"],
"webFetchProviders": ["firecrawl"],
"webSearchProviders": ["gemini"],
"migrationProviders": ["hermes"],
"tools": ["firecrawl_search", "firecrawl_scrape"]
}
}
Setiap daftar bersifat opsional:
| Bidang | Tipe | Artinya |
|---|---|---|
embeddedExtensionFactories |
string[] |
Id factory ekstensi app-server Codex, saat ini codex-app-server. |
agentToolResultMiddleware |
string[] |
Id runtime yang dapat digunakan Plugin bawaan untuk mendaftarkan middleware hasil alat. |
externalAuthProviders |
string[] |
Id penyedia yang hook profil auth eksternalnya dimiliki Plugin ini. |
speechProviders |
string[] |
Id penyedia speech yang dimiliki Plugin ini. |
realtimeTranscriptionProviders |
string[] |
Id penyedia realtime-transcription yang dimiliki Plugin ini. |
realtimeVoiceProviders |
string[] |
Id penyedia realtime-voice yang dimiliki Plugin ini. |
memoryEmbeddingProviders |
string[] |
Id penyedia embedding memori yang dimiliki Plugin ini. |
mediaUnderstandingProviders |
string[] |
Id penyedia pemahaman media yang dimiliki Plugin ini. |
imageGenerationProviders |
string[] |
Id penyedia pembuatan gambar yang dimiliki Plugin ini. |
videoGenerationProviders |
string[] |
Id penyedia pembuatan video yang dimiliki Plugin ini. |
webFetchProviders |
string[] |
Id penyedia web-fetch yang dimiliki Plugin ini. |
webSearchProviders |
string[] |
Id penyedia web-search yang dimiliki Plugin ini. |
migrationProviders |
string[] |
Id penyedia impor yang dimiliki Plugin ini untuk openclaw migrate. |
tools |
string[] |
Nama alat agent yang dimiliki Plugin ini. |
contracts.embeddedExtensionFactories dipertahankan untuk factory ekstensi bawaan khusus app-server Codex.
Transformasi hasil alat bawaan harus mendeklarasikan
contracts.agentToolResultMiddleware dan mendaftar dengan
api.registerAgentToolResultMiddleware(...) sebagai gantinya. Plugin eksternal tidak dapat
mendaftarkan middleware hasil alat karena seam ini dapat menulis ulang output alat dengan kepercayaan tinggi
sebelum model melihatnya.
Registrasi runtime api.registerTool(...) harus cocok dengan contracts.tools.
Penemuan alat menggunakan daftar ini untuk memuat hanya runtime Plugin yang dapat memiliki
alat yang diminta.
Plugin penyedia yang mengimplementasikan resolveExternalAuthProfiles harus mendeklarasikan
contracts.externalAuthProviders. Plugin tanpa deklarasi tersebut tetap berjalan
melalui fallback kompatibilitas yang sudah deprecated, tetapi fallback itu lebih lambat dan
akan dihapus setelah jendela migrasi.
Penyedia embedding memori bawaan harus mendeklarasikan
contracts.memoryEmbeddingProviders untuk setiap id adaptor yang diekspos, termasuk
adaptor bawaan seperti local. Path CLI mandiri menggunakan kontrak manifes ini
untuk memuat hanya Plugin pemilik sebelum runtime Gateway penuh
mendaftarkan penyedia.
referensi mediaUnderstandingProviderMetadata
Gunakan mediaUnderstandingProviderMetadata saat penyedia pemahaman media memiliki
model default, prioritas fallback auto-auth, atau dukungan dokumen native yang
dibutuhkan helper inti generik sebelum runtime dimuat. Kunci juga harus dideklarasikan di
contracts.mediaUnderstandingProviders.
{
"contracts": {
"mediaUnderstandingProviders": ["example"]
},
"mediaUnderstandingProviderMetadata": {
"example": {
"capabilities": ["image", "audio"],
"defaultModels": {
"image": "example-vision-latest",
"audio": "example-transcribe-latest"
},
"autoPriority": {
"image": 40
},
"nativeDocumentInputs": ["pdf"]
}
}
}
Setiap entri penyedia dapat mencakup:
| Bidang | Tipe | Artinya |
|---|---|---|
capabilities |
("image" | "audio" | "video")[] |
Kapabilitas media yang diekspos oleh penyedia ini. |
defaultModels |
Record<string, string> |
Default kapabilitas-ke-model yang digunakan saat konfigurasi tidak menentukan model. |
autoPriority |
Record<string, number> |
Angka lebih rendah diurutkan lebih awal untuk fallback penyedia berbasis kredensial otomatis. |
nativeDocumentInputs |
"pdf"[] |
Input dokumen native yang didukung oleh penyedia. |
referensi channelConfigs
Gunakan channelConfigs saat Plugin channel membutuhkan metadata konfigurasi ringan sebelum
runtime dimuat. Penemuan penyiapan/status channel baca-saja dapat menggunakan metadata ini
secara langsung untuk channel eksternal yang dikonfigurasi saat tidak ada entri penyiapan, atau
saat setup.requiresRuntime: false mendeklarasikan runtime penyiapan tidak diperlukan.
channelConfigs adalah metadata manifes Plugin, bukan bagian konfigurasi pengguna tingkat atas baru.
Pengguna tetap mengonfigurasi instance channel di bawah channels.<channel-id>.
OpenClaw membaca metadata manifes untuk menentukan Plugin mana yang memiliki channel yang dikonfigurasi itu
sebelum kode runtime Plugin dieksekusi.
Untuk Plugin channel, configSchema dan channelConfigs menjelaskan path yang berbeda:
configSchemamemvalidasiplugins.entries.<plugin-id>.configchannelConfigs.<channel-id>.schemamemvalidasichannels.<channel-id>
Plugin non-bawaan yang mendeklarasikan channels[] juga harus mendeklarasikan entri
channelConfigs yang cocok. Tanpanya, OpenClaw tetap dapat memuat Plugin, tetapi
skema konfigurasi cold-path, penyiapan, dan permukaan Control UI tidak dapat mengetahui
bentuk opsi milik channel sampai runtime Plugin dieksekusi.
channelConfigs.<channel-id>.commands.nativeCommandsAutoEnabled dan
nativeSkillsAutoEnabled dapat mendeklarasikan default auto statis untuk pemeriksaan konfigurasi perintah
yang berjalan sebelum runtime channel dimuat. Channel bawaan juga dapat menerbitkan
default yang sama melalui package.json#openclaw.channel.commands bersama
metadata katalog channel lain yang dimiliki 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"]
}
}
}
Setiap entri channel dapat mencakup:
| Bidang | Jenis | Artinya |
|---|---|---|
schema |
object |
JSON Schema untuk channels.<id>. Wajib untuk setiap entri konfigurasi saluran yang dideklarasikan. |
uiHints |
Record<string, object> |
Label/placeholder/petunjuk sensitif UI opsional untuk bagian konfigurasi saluran tersebut. |
label |
string |
Label saluran yang digabungkan ke permukaan pemilih dan inspeksi saat metadata runtime belum siap. |
description |
string |
Deskripsi singkat saluran untuk permukaan inspeksi dan katalog. |
commands |
object |
Default otomatis perintah asli statis dan keterampilan asli untuk pemeriksaan konfigurasi pra-runtime. |
preferOver |
string[] |
Id Plugin lama atau berprioritas lebih rendah yang harus dikalahkan saluran ini di permukaan pemilihan. |
Mengganti Plugin saluran lain
Gunakan preferOver saat Plugin Anda adalah pemilik pilihan untuk id saluran yang
juga dapat disediakan oleh Plugin lain. Kasus umum mencakup id Plugin yang
diganti namanya, Plugin mandiri yang menggantikan Plugin bundel, atau fork yang
dipelihara yang mempertahankan id saluran yang sama untuk kompatibilitas konfigurasi.
{
"id": "acme-chat",
"channels": ["chat"],
"channelConfigs": {
"chat": {
"schema": {
"type": "object",
"additionalProperties": false,
"properties": {
"webhookUrl": { "type": "string" }
}
},
"preferOver": ["chat"]
}
}
}
Saat channels.chat dikonfigurasi, OpenClaw mempertimbangkan id saluran dan
id Plugin pilihan. Jika Plugin berprioritas lebih rendah hanya dipilih karena
dibundel atau diaktifkan secara default, OpenClaw menonaktifkannya dalam
konfigurasi runtime efektif sehingga satu Plugin memiliki saluran dan alatnya.
Pilihan pengguna eksplisit tetap menang: jika pengguna secara eksplisit
mengaktifkan kedua Plugin, OpenClaw mempertahankan pilihan tersebut dan
melaporkan diagnostik saluran/alat duplikat alih-alih diam-diam mengubah
kumpulan Plugin yang diminta.
Jaga preferOver tetap terbatas pada id Plugin yang benar-benar dapat
menyediakan saluran yang sama. Ini bukan bidang prioritas umum dan tidak
mengganti nama kunci konfigurasi pengguna.
Referensi modelSupport
Gunakan modelSupport saat OpenClaw harus menyimpulkan Plugin penyedia Anda dari
id model singkat seperti gpt-5.5 atau claude-sonnet-4.6 sebelum runtime
Plugin dimuat.
{
"modelSupport": {
"modelPrefixes": ["gpt-", "o1", "o3", "o4"],
"modelPatterns": ["^computer-use-preview"]
}
}
OpenClaw menerapkan prioritas ini:
- referensi
provider/modeleksplisit menggunakan metadata manifesproviderspemilik modelPatternsmengalahkanmodelPrefixes- jika satu Plugin non-bundel dan satu Plugin bundel sama-sama cocok, Plugin non-bundel menang
- ambiguitas yang tersisa diabaikan hingga pengguna atau konfigurasi menentukan penyedia
Bidang:
| Bidang | Jenis | Artinya |
|---|---|---|
modelPrefixes |
string[] |
Prefiks yang dicocokkan dengan startsWith terhadap id model singkat. |
modelPatterns |
string[] |
Sumber regex yang dicocokkan terhadap id model singkat setelah penghapusan sufiks profil. |
Referensi modelCatalog
Gunakan modelCatalog saat OpenClaw harus mengetahui metadata model penyedia
sebelum memuat runtime Plugin. Ini adalah sumber milik manifes untuk baris
katalog tetap, alias penyedia, aturan penekanan, dan mode penemuan. Penyegaran
runtime tetap berada dalam kode runtime penyedia, tetapi manifes memberi tahu
core kapan runtime diperlukan.
{
"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"
}
}
}
Bidang tingkat atas:
| Bidang | Jenis | Artinya |
|---|---|---|
providers |
Record<string, object> |
Baris katalog untuk id penyedia yang dimiliki oleh Plugin ini. Kunci juga harus muncul di providers tingkat atas. |
aliases |
Record<string, object> |
Alias penyedia yang harus diarahkan ke penyedia yang dimiliki untuk perencanaan katalog atau penekanan. |
suppressions |
object[] |
Baris model dari sumber lain yang ditekan oleh Plugin ini karena alasan khusus penyedia. |
discovery |
Record<string, "static" | "refreshable" | "runtime"> |
Apakah katalog penyedia dapat dibaca dari metadata manifes, disegarkan ke cache, atau memerlukan runtime. |
aliases berpartisipasi dalam pencarian kepemilikan penyedia untuk perencanaan
katalog model. Target alias harus berupa penyedia tingkat atas yang dimiliki
oleh Plugin yang sama. Saat daftar yang difilter menurut penyedia menggunakan
alias, OpenClaw dapat membaca manifes pemilik dan menerapkan penggantian API/URL
dasar alias tanpa memuat runtime penyedia.
Alias tidak memperluas daftar katalog tanpa filter; daftar luas hanya
menghasilkan baris penyedia kanonis pemilik.
suppressions menggantikan hook suppressBuiltInModel runtime penyedia lama.
Entri penekanan hanya dihormati saat penyedia dimiliki oleh Plugin atau
dideklarasikan sebagai kunci modelCatalog.aliases yang menargetkan penyedia
miliknya. Hook penekanan runtime tidak lagi dipanggil selama resolusi model.
Bidang penyedia:
| Bidang | Jenis | Artinya |
|---|---|---|
baseUrl |
string |
URL dasar default opsional untuk model dalam katalog penyedia ini. |
api |
ModelApi |
Adapter API default opsional untuk model dalam katalog penyedia ini. |
headers |
Record<string, string> |
Header statis opsional yang berlaku untuk katalog penyedia ini. |
models |
object[] |
Baris model wajib. Baris tanpa id diabaikan. |
Bidang model:
| Bidang | Jenis | Artinya |
|---|---|---|
id |
string |
Id model lokal penyedia, tanpa prefiks provider/. |
name |
string |
Nama tampilan opsional. |
api |
ModelApi |
Penggantian API per model opsional. |
baseUrl |
string |
Penggantian URL dasar per model opsional. |
headers |
Record<string, string> |
Header statis per model opsional. |
input |
Array<"text" | "image" | "document" | "audio" | "video"> |
Modalitas yang diterima model. |
reasoning |
boolean |
Apakah model mengekspos perilaku reasoning. |
contextWindow |
number |
Jendela konteks penyedia asli. |
contextTokens |
number |
Batas konteks runtime efektif opsional saat berbeda dari contextWindow. |
maxTokens |
number |
Token keluaran maksimum saat diketahui. |
cost |
object |
Harga USD per juta token opsional, termasuk tieredPricing opsional. |
compat |
object |
Flag kompatibilitas opsional yang cocok dengan kompatibilitas konfigurasi model OpenClaw. |
status |
"available" | "preview" | "deprecated" | "disabled" |
Status pencantuman. Tekan hanya saat baris sama sekali tidak boleh muncul. |
statusReason |
string |
Alasan opsional yang ditampilkan dengan status non-tersedia. |
replaces |
string[] |
Id model lokal penyedia lama yang digantikan model ini. |
replacedBy |
string |
Id model lokal penyedia pengganti untuk baris yang usang. |
tags |
string[] |
Tag stabil yang digunakan oleh pemilih dan filter. |
Bidang penekanan:
| Bidang | Jenis | Artinya |
|---|---|---|
provider |
string |
Id penyedia untuk baris upstream yang akan ditekan. Harus dimiliki oleh Plugin ini atau dideklarasikan sebagai alias milik. |
model |
string |
Id model lokal penyedia yang akan ditekan. |
reason |
string |
Pesan opsional yang ditampilkan saat baris yang ditekan diminta secara langsung. |
when.baseUrlHosts |
string[] |
Daftar opsional host URL dasar penyedia efektif yang diperlukan sebelum penekanan berlaku. |
when.providerConfigApiIn |
string[] |
Daftar opsional nilai api konfigurasi penyedia persis yang diperlukan sebelum penekanan berlaku. |
Jangan tempatkan data khusus runtime di modelCatalog. Gunakan static hanya ketika baris manifes sudah cukup lengkap agar daftar yang difilter penyedia dan permukaan pemilih dapat melewati penemuan registry/runtime. Gunakan refreshable ketika baris manifes berguna sebagai seed atau pelengkap yang dapat dicantumkan, tetapi refresh/cache dapat menambahkan lebih banyak baris nanti; baris refreshable tidak bersifat otoritatif sendiri. Gunakan runtime ketika OpenClaw harus memuat runtime penyedia untuk mengetahui daftarnya.
Referensi modelIdNormalization
Gunakan modelIdNormalization untuk pembersihan model-id murah yang dimiliki penyedia dan harus terjadi sebelum runtime penyedia dimuat. Ini menjaga alias seperti nama model singkat, id lama lokal penyedia, dan aturan prefiks proxy tetap berada di manifes Plugin pemilik, bukan di tabel pemilihan model inti.
{
"providers": ["anthropic", "openrouter"],
"modelIdNormalization": {
"providers": {
"anthropic": {
"aliases": {
"sonnet-4.6": "claude-sonnet-4-6"
}
},
"openrouter": {
"prefixWhenBare": "openrouter"
}
}
}
}
Kolom penyedia:
| Kolom | Tipe | Artinya |
|---|---|---|
aliases |
Record<string,string> |
Alias model-id persis yang tidak peka huruf besar/kecil. Nilai dikembalikan apa adanya. |
stripPrefixes |
string[] |
Prefiks yang dihapus sebelum pencarian alias, berguna untuk duplikasi penyedia/model lama. |
prefixWhenBare |
string |
Prefiks yang ditambahkan ketika id model yang dinormalisasi belum berisi /. |
prefixWhenBareAfterAliasStartsWith |
object[] |
Aturan prefiks id polos bersyarat setelah pencarian alias, dengan kunci modelPrefix dan prefix. |
Referensi providerEndpoints
Gunakan providerEndpoints untuk klasifikasi endpoint yang harus diketahui kebijakan permintaan generik sebelum runtime penyedia dimuat. Inti tetap memiliki makna setiap endpointClass; manifes Plugin memiliki metadata host dan URL dasar.
Kolom endpoint:
| Kolom | Tipe | Artinya |
|---|---|---|
endpointClass |
string |
Kelas endpoint inti yang dikenal, seperti openrouter, moonshot-native, atau google-vertex. |
hosts |
string[] |
Nama host persis yang dipetakan ke kelas endpoint. |
hostSuffixes |
string[] |
Sufiks host yang dipetakan ke kelas endpoint. Awali dengan . untuk pencocokan khusus sufiks domain. |
baseUrls |
string[] |
URL dasar HTTP(S) ternormalisasi persis yang dipetakan ke kelas endpoint. |
googleVertexRegion |
string |
Region Google Vertex statis untuk host global persis. |
googleVertexRegionHostSuffix |
string |
Sufiks yang dihapus dari host yang cocok untuk mengekspos prefiks region Google Vertex. |
Referensi providerRequest
Gunakan providerRequest untuk metadata kompatibilitas permintaan murah yang diperlukan kebijakan permintaan generik tanpa memuat runtime penyedia. Simpan penulisan ulang payload khusus perilaku di hook runtime penyedia atau helper keluarga penyedia bersama.
{
"providers": ["vllm"],
"providerRequest": {
"providers": {
"vllm": {
"family": "vllm",
"openAICompletions": {
"supportsStreamingUsage": true
}
}
}
}
}
Kolom penyedia:
| Kolom | Tipe | Artinya |
|---|---|---|
family |
string |
Label keluarga penyedia yang digunakan oleh keputusan kompatibilitas permintaan generik dan diagnostik. |
compatibilityFamily |
"moonshot" |
Bucket kompatibilitas keluarga penyedia opsional untuk helper permintaan bersama. |
openAICompletions |
object |
Flag permintaan completions kompatibel OpenAI, saat ini supportsStreamingUsage. |
Referensi modelPricing
Gunakan modelPricing ketika penyedia memerlukan perilaku harga control-plane sebelum runtime dimuat. Cache harga Gateway membaca metadata ini tanpa mengimpor kode runtime penyedia.
{
"providers": ["ollama", "openrouter"],
"modelPricing": {
"providers": {
"ollama": {
"external": false
},
"openrouter": {
"openRouter": {
"passthroughProviderModel": true
},
"liteLLM": false
}
}
}
}
Kolom penyedia:
| Kolom | Tipe | Artinya |
|---|---|---|
external |
boolean |
Atur false untuk penyedia lokal/self-hosted yang tidak boleh pernah mengambil harga OpenRouter atau LiteLLM. |
openRouter |
false | object |
Pemetaan lookup harga OpenRouter. false menonaktifkan lookup OpenRouter untuk penyedia ini. |
liteLLM |
false | object |
Pemetaan lookup harga LiteLLM. false menonaktifkan lookup LiteLLM untuk penyedia ini. |
Kolom sumber:
| Kolom | Tipe | Artinya |
|---|---|---|
provider |
string |
Id penyedia katalog eksternal ketika berbeda dari id penyedia OpenClaw, misalnya z-ai untuk penyedia zai. |
passthroughProviderModel |
boolean |
Perlakukan id model yang berisi garis miring sebagai referensi penyedia/model bersarang, berguna untuk penyedia proxy seperti OpenRouter. |
modelIdTransforms |
"version-dots"[] |
Varian model-id katalog eksternal tambahan. version-dots mencoba id versi bertitik seperti claude-opus-4.6. |
Indeks Penyedia OpenClaw
Indeks Penyedia OpenClaw adalah metadata pratinjau milik OpenClaw untuk penyedia yang Plugin-nya mungkin belum terpasang. Ini bukan bagian dari manifes Plugin. Manifes Plugin tetap menjadi otoritas Plugin terpasang. Indeks Penyedia adalah kontrak fallback internal yang akan digunakan oleh permukaan penyedia dapat dipasang dan pemilih model pra-instal mendatang ketika Plugin penyedia tidak terpasang.
Urutan otoritas katalog:
- Konfigurasi pengguna.
modelCatalogmanifes Plugin terpasang.- Cache katalog model dari refresh eksplisit.
- Baris pratinjau Indeks Penyedia OpenClaw.
Indeks Penyedia tidak boleh berisi rahasia, status aktif, hook runtime, atau data model khusus akun langsung. Katalog pratinjaunya menggunakan bentuk baris penyedia modelCatalog yang sama seperti manifes Plugin, tetapi sebaiknya tetap dibatasi pada metadata tampilan stabil kecuali kolom adapter runtime seperti api, baseUrl, harga, atau flag kompatibilitas sengaja dijaga selaras dengan manifes Plugin terpasang. Penyedia dengan penemuan /models langsung sebaiknya menulis baris yang disegarkan melalui jalur cache katalog model eksplisit, bukan membuat daftar normal atau onboarding memanggil API penyedia.
Entri Indeks Penyedia juga dapat membawa metadata Plugin yang dapat dipasang untuk penyedia yang Plugin-nya telah dipindahkan keluar dari inti atau belum terpasang. Metadata ini meniru pola katalog channel: nama paket, spesifikasi instal npm, integritas yang diharapkan, dan label pilihan auth murah sudah cukup untuk menampilkan opsi penyiapan yang dapat dipasang. Setelah Plugin terpasang, manifesnya menang dan entri Indeks Penyedia diabaikan untuk penyedia tersebut.
Kunci kapabilitas level atas lama sudah tidak digunakan. Gunakan openclaw doctor --fix untuk memindahkan speechProviders, realtimeTranscriptionProviders, realtimeVoiceProviders, mediaUnderstandingProviders, imageGenerationProviders, videoGenerationProviders, webFetchProviders, dan webSearchProviders ke bawah contracts; pemuatan manifes normal tidak lagi memperlakukan kolom level atas tersebut sebagai kepemilikan kapabilitas.
Manifes versus package.json
Kedua file menjalankan tugas yang berbeda:
| File | Gunakan untuk |
|---|---|
openclaw.plugin.json |
Penemuan, validasi konfigurasi, metadata pilihan auth, dan petunjuk UI yang harus ada sebelum kode Plugin berjalan |
package.json |
Metadata npm, instalasi dependensi, dan blok openclaw yang digunakan untuk entrypoint, gating instalasi, penyiapan, atau metadata katalog |
Jika Anda tidak yakin di mana suatu metadata seharusnya berada, gunakan aturan ini:
- jika OpenClaw harus mengetahuinya sebelum memuat kode Plugin, letakkan di
openclaw.plugin.json - jika berkaitan dengan packaging, file entry, atau perilaku instal npm, letakkan di
package.json
Kolom package.json yang memengaruhi penemuan
Sebagian metadata Plugin pra-runtime sengaja berada di package.json di bawah blok openclaw, bukan di openclaw.plugin.json.
openclaw.bundle dan openclaw.bundle.json bukan kontrak Plugin OpenClaw; Plugin native harus menggunakan openclaw.plugin.json ditambah kolom package.json#openclaw yang didukung di bawah.
Contoh penting:
| Bidang | Artinya |
|---|---|
openclaw.extensions |
Mendeklarasikan entrypoint plugin native. Harus tetap berada di dalam direktori paket plugin. |
openclaw.runtimeExtensions |
Mendeklarasikan entrypoint runtime JavaScript hasil build untuk paket yang terinstal. Harus tetap berada di dalam direktori paket plugin. |
openclaw.setupEntry |
Entrypoint ringan khusus penyiapan yang digunakan selama onboarding, startup saluran tertunda, serta penemuan status saluran/SecretRef baca-saja. Harus tetap berada di dalam direktori paket plugin. |
openclaw.runtimeSetupEntry |
Mendeklarasikan entrypoint penyiapan JavaScript hasil build untuk paket yang terinstal. Memerlukan setupEntry, harus ada, dan harus tetap berada di dalam direktori paket plugin. |
openclaw.channel |
Metadata katalog saluran murah seperti label, jalur docs, alias, dan salinan pilihan. |
openclaw.channel.commands |
Metadata statis perintah native dan default otomatis skill native yang digunakan oleh permukaan konfigurasi, audit, dan daftar perintah sebelum runtime saluran dimuat. |
openclaw.channel.configuredState |
Metadata pemeriksa status-terkonfigurasi ringan yang dapat menjawab "apakah penyiapan hanya-env sudah ada?" tanpa memuat runtime saluran penuh. |
openclaw.channel.persistedAuthState |
Metadata pemeriksa auth tersimpan ringan yang dapat menjawab "apakah ada yang sudah masuk?" tanpa memuat runtime saluran penuh. |
openclaw.install.clawhubSpec / openclaw.install.npmSpec / openclaw.install.localPath |
Petunjuk instal/pembaruan untuk plugin bawaan dan plugin yang diterbitkan secara eksternal. |
openclaw.install.defaultChoice |
Jalur instal yang disukai saat beberapa sumber instal tersedia. |
openclaw.install.minHostVersion |
Versi host OpenClaw minimum yang didukung, menggunakan batas bawah semver seperti >=2026.3.22 atau >=2026.5.1-beta.1. |
openclaw.install.expectedIntegrity |
String integritas dist npm yang diharapkan seperti sha512-...; alur instal dan pembaruan memverifikasi artefak yang diambil terhadap nilai ini. |
openclaw.install.allowInvalidConfigRecovery |
Mengizinkan jalur pemulihan instal ulang plugin bawaan yang sempit saat konfigurasi tidak valid. |
openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen |
Memungkinkan permukaan saluran khusus penyiapan dimuat sebelum plugin saluran penuh selama startup. |
Metadata manifes menentukan pilihan penyedia/saluran/penyiapan mana yang muncul di
onboarding sebelum runtime dimuat. package.json#openclaw.install memberi tahu
onboarding cara mengambil atau mengaktifkan plugin tersebut saat pengguna memilih salah satu
pilihan itu. Jangan pindahkan petunjuk instal ke openclaw.plugin.json.
openclaw.install.minHostVersion diberlakukan selama instal dan pemuatan registry
manifes untuk sumber plugin non-bawaan. Nilai yang tidak valid ditolak;
nilai yang lebih baru tetapi valid melewati plugin eksternal pada host yang lebih lama. Plugin sumber
bawaan diasumsikan memiliki versi yang sama dengan checkout host.
Metadata instal-sesuai-permintaan resmi harus menggunakan clawhubSpec saat plugin
diterbitkan di ClawHub; onboarding memperlakukannya sebagai sumber jarak jauh yang disukai dan
merekam fakta artefak ClawHub setelah instal. npmSpec tetap menjadi fallback
kompatibilitas untuk paket yang belum pindah ke ClawHub.
Penyematan versi npm persis sudah berada di npmSpec, misalnya
"npmSpec": "@wecom/[email protected]". Entri katalog eksternal resmi
harus memasangkan spec persis dengan expectedIntegrity agar alur pembaruan gagal
tertutup jika artefak npm yang diambil tidak lagi cocok dengan rilis yang disematkan.
Onboarding interaktif tetap menawarkan spec npm registry tepercaya, termasuk nama
paket polos dan dist-tag, untuk kompatibilitas. Diagnostik katalog dapat
membedakan sumber pilihan-default yang persis, mengambang, disematkan-integritas, hilang-integritas, nama-paket
tidak cocok, dan tidak valid. Diagnostik juga memperingatkan saat
expectedIntegrity ada tetapi tidak ada sumber npm valid yang dapat disematkannya.
Saat expectedIntegrity ada,
alur instal/pembaruan memberlakukannya; saat dihilangkan, resolusi registry
direkam tanpa sematan integritas.
Plugin saluran harus menyediakan openclaw.setupEntry saat status, daftar saluran,
atau pemindaian SecretRef perlu mengidentifikasi akun yang dikonfigurasi tanpa memuat runtime
penuh. Entry penyiapan harus mengekspos metadata saluran serta adapter konfigurasi,
status, dan rahasia yang aman untuk penyiapan; simpan klien jaringan, listener gateway, dan
runtime transport di entrypoint ekstensi utama.
Bidang entrypoint runtime tidak menimpa pemeriksaan batas paket untuk bidang
entrypoint sumber. Misalnya, openclaw.runtimeExtensions tidak dapat membuat
jalur openclaw.extensions yang keluar batas menjadi dapat dimuat.
openclaw.install.allowInvalidConfigRecovery sengaja sempit. Ini tidak
membuat konfigurasi rusak sembarang menjadi dapat diinstal. Saat ini, ini hanya mengizinkan alur instal
untuk pulih dari kegagalan upgrade plugin bawaan usang tertentu, seperti
jalur plugin bawaan yang hilang atau entri channels.<id> usang untuk plugin
bawaan yang sama. Error konfigurasi yang tidak terkait tetap memblokir instal dan mengarahkan operator
ke openclaw doctor --fix.
openclaw.channel.persistedAuthState adalah metadata paket untuk modul pemeriksa
kecil:
{
"openclaw": {
"channel": {
"id": "whatsapp",
"persistedAuthState": {
"specifier": "./auth-presence",
"exportName": "hasAnyWhatsAppAuth"
}
}
}
}
Gunakan ini saat alur penyiapan, doctor, status, atau kehadiran baca-saja memerlukan probe auth ya/tidak yang murah sebelum plugin saluran penuh dimuat. Status auth tersimpan bukan status saluran terkonfigurasi: jangan gunakan metadata ini untuk mengaktifkan plugin otomatis, memperbaiki dependensi runtime, atau memutuskan apakah runtime saluran harus dimuat. Export target harus berupa fungsi kecil yang hanya membaca status tersimpan; jangan rutekan melalui barrel runtime saluran penuh.
openclaw.channel.configuredState mengikuti bentuk yang sama untuk pemeriksaan
terkonfigurasi hanya-env yang murah:
{
"openclaw": {
"channel": {
"id": "telegram",
"configuredState": {
"specifier": "./configured-state",
"exportName": "hasTelegramConfiguredState"
}
}
}
}
Gunakan ini saat saluran dapat menjawab status-terkonfigurasi dari env atau input kecil
non-runtime lainnya. Jika pemeriksaan memerlukan resolusi konfigurasi penuh atau runtime
saluran nyata, simpan logika itu di hook config.hasConfiguredState
plugin.
Prioritas penemuan (id plugin duplikat)
OpenClaw menemukan plugin dari beberapa root (bawaan, instal global, workspace, jalur pilihan konfigurasi eksplisit). Jika dua penemuan memiliki id yang sama, hanya manifes dengan prioritas tertinggi yang dipertahankan; duplikat dengan prioritas lebih rendah dibuang alih-alih dimuat berdampingan dengannya.
Prioritas, dari tertinggi ke terendah:
- Dipilih konfigurasi — jalur yang disematkan secara eksplisit di
plugins.entries.<id> - Bawaan — plugin yang dikirim bersama OpenClaw
- Instal global — plugin yang diinstal ke root plugin OpenClaw global
- Workspace — plugin yang ditemukan relatif terhadap workspace saat ini
Implikasi:
- Salinan fork atau usang dari plugin bawaan yang berada di workspace tidak akan membayangi build bawaan.
- Untuk benar-benar menimpa plugin bawaan dengan plugin lokal, sematkan melalui
plugins.entries.<id>agar menang berdasarkan prioritas, bukan mengandalkan penemuan workspace. - Duplikat yang dibuang dicatat sehingga diagnostik Doctor dan startup dapat menunjuk ke salinan yang dibuang.
- Penimpaan duplikat yang dipilih konfigurasi ditulis sebagai penimpaan eksplisit dalam diagnostik, tetapi tetap memperingatkan agar fork usang dan bayangan tidak disengaja tetap terlihat.
Persyaratan JSON Schema
- Setiap plugin harus menyertakan JSON Schema, meskipun tidak menerima konfigurasi.
- Skema kosong dapat diterima (misalnya,
{ "type": "object", "additionalProperties": false }). - Skema divalidasi saat konfigurasi dibaca/ditulis, bukan saat runtime.
- Saat memperluas atau melakukan fork plugin bawaan dengan kunci konfigurasi baru, perbarui
configSchemaopenclaw.plugin.jsonplugin tersebut pada saat yang sama. Skema plugin bawaan bersifat ketat, sehingga menambahkanplugins.entries.<id>.config.myNewKeydi konfigurasi pengguna tanpa menambahkanmyNewKeykeconfigSchema.propertiesakan ditolak sebelum runtime plugin dimuat.
Contoh ekstensi skema:
{
"configSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"myNewKey": {
"type": "string"
}
}
}
}
Perilaku validasi
- Kunci
channels.*yang tidak dikenal adalah error, kecuali id saluran dideklarasikan oleh manifes plugin. plugins.entries.<id>,plugins.allow,plugins.deny, danplugins.slots.*harus merujuk ke id plugin yang dapat ditemukan. Id yang tidak dikenal adalah error.- Jika plugin terinstal tetapi memiliki manifes atau skema yang rusak atau hilang, validasi gagal dan Doctor melaporkan error plugin.
- Jika konfigurasi plugin ada tetapi plugin dinonaktifkan, konfigurasi dipertahankan dan peringatan ditampilkan di Doctor + log.
Lihat Referensi konfigurasi untuk skema plugins.* lengkap.
Catatan
- Manifes wajib untuk Plugin OpenClaw native, termasuk pemuatan dari sistem file lokal. Runtime tetap memuat modul Plugin secara terpisah; manifes hanya untuk penemuan + validasi.
- Manifes native diuraikan dengan JSON5, sehingga komentar, koma di akhir, dan kunci tanpa tanda kutip diterima selama nilai akhirnya tetap berupa objek.
- Hanya bidang manifes terdokumentasi yang dibaca oleh pemuat manifes. Hindari kunci tingkat atas khusus.
channels,providers,cliBackends, danskillssemuanya dapat dihilangkan saat Plugin tidak membutuhkannya.providerDiscoveryEntryharus tetap ringan dan tidak boleh mengimpor kode runtime yang luas; gunakan untuk metadata katalog penyedia statis atau deskriptor penemuan yang sempit, bukan eksekusi saat permintaan.- Jenis Plugin eksklusif dipilih melalui
plugins.slots.*:kind: "memory"melaluiplugins.slots.memory,kind: "context-engine"melaluiplugins.slots.contextEngine(defaultlegacy). - Deklarasikan jenis Plugin eksklusif dalam manifes ini.
OpenClawPluginDefinition.kindpada entri runtime sudah tidak digunakan lagi dan tetap ada hanya sebagai fallback kompatibilitas untuk Plugin lama. - Metadata variabel lingkungan (
setup.providers[].envVars,providerAuthEnvVarsyang tidak digunakan lagi, danchannelEnvVars) hanya bersifat deklaratif. Status, audit, validasi pengiriman Cron, dan permukaan baca-saja lainnya tetap menerapkan kepercayaan Plugin dan kebijakan aktivasi efektif sebelum memperlakukan variabel lingkungan sebagai telah dikonfigurasi. - Untuk metadata wizard runtime yang memerlukan kode penyedia, lihat hook runtime penyedia.
- Jika Plugin Anda bergantung pada modul native, dokumentasikan langkah build dan persyaratan allowlist pengelola paket apa pun (misalnya, pnpm
allow-build-scripts+pnpm rebuild <package>).