TaskFlow
DashboardFreewriteWhiteboardsProjectsCRMTasksNotificationsSettingsAgent TowerAPI Docs
OpenClaw Docs
?

User

Member

Caricamento in corso...

Home
Progetti
Task
Notifiche
CRM

    OpenClaw

    Documentation Mirror

    Documentation Overview

    Docs

    Auth credential semantics
    Scheduled tasks
    Hooks
    Automation & tasks
    Standing orders
    Task flow
    Background tasks
    BlueBubbles
    Broadcast groups
    Channel routing
    Discord
    Feishu
    Google Chat
    Group messages
    Groups
    iMessage
    Chat channels
    IRC
    LINE
    Channel location parsing
    Matrix
    Matrix migration
    Matrix push rules for quiet previews
    Mattermost
    Microsoft Teams
    Nextcloud Talk
    Nostr
    Pairing
    QA channel
    QQ bot
    Signal
    Slack
    Synology Chat
    Telegram
    Tlon
    Channel troubleshooting
    Twitch
    WeChat
    WhatsApp
    Yuanbao
    Zalo
    Zalo personal
    CI pipeline
    ACP
    Agent
    Agents
    Approvals
    Backup
    Browser
    Channels
    Clawbot
    `openclaw commitments`
    Completion
    Config
    Configure
    Cron
    Daemon
    Dashboard
    Devices
    Directory
    DNS
    Docs
    Doctor
    Flows (redirect)
    Gateway
    Health
    Hooks
    CLI reference
    Inference CLI
    Logs
    MCP
    Memory
    Message
    Migrate
    Models
    Node
    Nodes
    Onboard
    Pairing
    Plugins
    Proxy
    QR
    Reset
    Sandbox CLI
    Secrets
    Security
    Sessions
    Setup
    Skills
    Status
    System
    `openclaw tasks`
    TUI
    Uninstall
    Update
    Voicecall
    Webhooks
    Wiki
    Active memory
    Agent runtime
    Agent loop
    Agent runtimes
    Agent workspace
    Gateway architecture
    Channel docking
    Inferred commitments
    Compaction
    Context
    Context engine
    Delegate architecture
    Dreaming
    Experimental features
    Features
    Markdown formatting
    Memory overview
    Builtin memory engine
    Honcho memory
    QMD memory engine
    Memory search
    Messages
    Model failover
    Model providers
    Models CLI
    Multi-agent routing
    OAuth
    OpenClaw App SDK
    Presence
    QA overview
    Matrix QA
    Command queue
    Steering queue
    Retry policy
    Session management
    Session pruning
    Session tools
    SOUL.md personality guide
    Streaming and chunking
    System prompt
    Timezones
    TypeBox
    Typing indicators
    Usage tracking
    Date and time
    Node + tsx crash
    Diagnostics flags
    Authentication
    Background exec and process tool
    Bonjour discovery
    Bridge protocol
    CLI backends
    Configuration — agents
    Configuration — channels
    Configuration — tools and custom providers
    Configuration
    Configuration examples
    Configuration reference
    Diagnostics export
    Discovery and transports
    Doctor
    Gateway lock
    Health checks
    Heartbeat
    Gateway runbook
    Local models
    Gateway logging
    Multiple gateways
    Network model
    OpenAI chat completions
    OpenResponses API
    OpenShell
    OpenTelemetry export
    Gateway-owned pairing
    Prometheus metrics
    Gateway protocol
    Remote access
    Remote gateway setup
    Sandbox vs tool policy vs elevated
    Sandboxing
    Secrets management
    Secrets apply plan contract
    Security audit checks
    Security
    Tailscale
    Tools invoke API
    Troubleshooting
    Trusted proxy auth
    Debugging
    Environment variables
    FAQ
    FAQ: first-run setup
    FAQ: models and auth
    GPT-5.5 / Codex agentic parity
    GPT-5.5 / Codex parity maintainer notes
    Help
    Scripts
    Testing
    Testing: live suites
    General troubleshooting
    OpenClaw
    Ansible
    Azure
    Bun (experimental)
    ClawDock
    Release channels
    DigitalOcean
    Docker
    Docker VM runtime
    exe.dev
    Fly.io
    GCP
    Hetzner
    Hostinger
    Install
    Installer internals
    Kubernetes
    macOS VMs
    Migration guide
    Migrating from Claude
    Migrating from Hermes
    Nix
    Node.js
    Northflank
    Oracle Cloud
    Podman
    Railway
    Raspberry Pi
    Render
    Uninstall
    Updating
    Logging
    Network
    Audio and voice notes
    Camera capture
    Image and media support
    Nodes
    Location command
    Media understanding
    Talk mode
    Node troubleshooting
    Voice wake
    Pi integration architecture
    Pi development workflow
    Android app
    Platforms
    iOS app
    Linux app
    Gateway on macOS
    Canvas
    Gateway lifecycle
    macOS dev setup
    Health checks (macOS)
    Menu bar icon
    macOS logging
    Menu bar
    Peekaboo bridge
    macOS permissions
    Remote control
    macOS signing
    Skills (macOS)
    Voice overlay
    Voice wake (macOS)
    WebChat (macOS)
    macOS IPC
    macOS app
    Windows
    Plugin internals
    Plugin architecture internals
    Building plugins
    Plugin bundles
    Codex Computer Use
    Codex harness
    Community plugins
    Plugin compatibility
    Google Meet plugin
    Plugin hooks
    Plugin manifest
    Memory LanceDB
    Memory wiki
    Message presentation
    Agent harness plugins
    Building channel plugins
    Channel turn kernel
    Plugin entry points
    Plugin SDK migration
    Plugin SDK overview
    Building provider plugins
    Plugin runtime helpers
    Plugin setup and config
    Plugin SDK subpaths
    Plugin testing
    Skill workshop plugin
    Voice call plugin
    Webhooks plugin
    Zalo personal plugin
    OpenProse
    Alibaba Model Studio
    Anthropic
    Arcee AI
    Azure Speech
    Amazon Bedrock
    Amazon Bedrock Mantle
    Chutes
    Claude Max API proxy
    Cloudflare AI gateway
    ComfyUI
    Deepgram
    Deepinfra
    DeepSeek
    ElevenLabs
    Fal
    Fireworks
    GitHub Copilot
    GLM (Zhipu)
    Google (Gemini)
    Gradium
    Groq
    Hugging Face (inference)
    Provider directory
    Inferrs
    Inworld
    Kilocode
    LiteLLM
    LM Studio
    MiniMax
    Mistral
    Model provider quickstart
    Moonshot AI
    NVIDIA
    Ollama
    OpenAI
    OpenCode
    OpenCode Go
    OpenRouter
    Perplexity
    Qianfan
    Qwen
    Runway
    SGLang
    StepFun
    Synthetic
    Tencent Cloud (TokenHub)
    Together AI
    Venice AI
    Vercel AI gateway
    vLLM
    Volcengine (Doubao)
    Vydra
    xAI
    Xiaomi MiMo
    Z.AI
    Default AGENTS.md
    Release policy
    API usage and costs
    Credits
    Device model database
    Full release validation
    Memory configuration reference
    OpenClaw App SDK API design
    Prompt caching
    Rich output protocol
    RPC adapters
    SecretRef credential surface
    Session management deep dive
    AGENTS.md template
    BOOT.md template
    BOOTSTRAP.md template
    HEARTBEAT.md template
    IDENTITY template
    SOUL.md template
    TOOLS.md template
    USER template
    Tests
    Token use and costs
    Transcript hygiene
    Onboarding reference
    Contributing to the threat model
    Threat model (MITRE ATLAS)
    Formal verification (security models)
    Network proxy
    Agent bootstrapping
    Docs directory
    Getting started
    Docs hubs
    OpenClaw lore
    Onboarding (macOS app)
    Onboarding overview
    Personal assistant setup
    Setup
    Showcase
    Onboarding (CLI)
    CLI automation
    CLI setup reference
    ACP agents
    ACP agents — setup
    Agent send
    apply_patch tool
    Brave search
    Browser (OpenClaw-managed)
    Browser control API
    Browser troubleshooting
    Browser login
    WSL2 + Windows + remote Chrome CDP troubleshooting
    BTW side questions
    ClawHub
    Code execution
    Creating skills
    Diffs
    DuckDuckGo search
    Elevated mode
    Exa search
    Exec tool
    Exec approvals
    Exec approvals — advanced
    Firecrawl
    Gemini search
    Grok search
    Image generation
    Tools and plugins
    Kimi search
    LLM task
    Lobster
    Tool-loop detection
    Media overview
    MiniMax search
    Multi-agent sandbox and tools
    Music generation
    Ollama web search
    PDF tool
    Perplexity search
    Plugins
    Reactions
    SearXNG search
    Skills
    Skills config
    Slash commands
    Sub-agents
    Tavily
    Thinking levels
    Tokenjuice
    Trajectory bundles
    Text-to-speech
    Video generation
    Web search
    Web fetch
    Linux server
    Control UI
    Dashboard
    Web
    TUI
    WebChat

    OpenAPI Specs

    openapi
    TaskFlow
    docs/openclaw
    Original Docs

    Real-time Synchronized Documentation

    Last sync: 01/05/2026 07:01:49

    Note: This content is mirrored from docs.openclaw.ai and is subject to their terms and conditions.

    OpenClaw Docs

    v2.4.0 Production

    Last synced: Today, 22:00

    Technical reference for the OpenClaw framework. Real-time synchronization with the official documentation engine.

    Use this file to discover all available pages before exploring further.

    Plugin manifest

    This page is for the native OpenClaw plugin manifest only.

    For compatible bundle layouts, see Plugin bundles.

    Compatible bundle formats use different manifest files:

    • Codex bundle:
      text
      .codex-plugin/plugin.json
    • Claude bundle:
      text
      .claude-plugin/plugin.json
      or the default Claude component layout without a manifest
    • Cursor bundle:
      text
      .cursor-plugin/plugin.json

    OpenClaw auto-detects those bundle layouts too, but they are not validated against the

    text
    openclaw.plugin.json
    schema described here.

    For compatible bundles, OpenClaw currently reads bundle metadata plus declared skill roots, Claude command roots, Claude bundle

    text
    settings.json
    defaults, Claude bundle LSP defaults, and supported hook packs when the layout matches OpenClaw runtime expectations.

    Every native OpenClaw plugin must ship a

    text
    openclaw.plugin.json
    file in the plugin root. OpenClaw uses this manifest to validate configuration without executing plugin code. Missing or invalid manifests are treated as plugin errors and block config validation.

    See the full plugin system guide: Plugins. For the native capability model and current external-compatibility guidance: Capability model.

    What this file does

    text
    openclaw.plugin.json
    is the metadata OpenClaw reads before it loads your plugin code. Everything below must be cheap enough to inspect without booting plugin runtime.

    Use it for:

    • plugin identity, config validation, and config UI hints
    • auth, onboarding, and setup metadata (alias, auto-enable, provider env vars, auth choices)
    • activation hints for control-plane surfaces
    • shorthand model-family ownership
    • static capability-ownership snapshots (
      text
      contracts
      )
    • QA runner metadata the shared
      text
      openclaw qa
      host can inspect
    • channel-specific config metadata merged into catalog and validation surfaces

    Do not use it for: registering runtime behavior, declaring code entrypoints, or npm install metadata. Those belong in your plugin code and

    text
    package.json
    .

    Minimal example

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

    Rich example

    json
    { "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" } } } }

    Top-level field reference

    FieldRequiredTypeWhat it means
    text
    id
    Yes
    text
    string
    Canonical plugin id. This is the id used in
    text
    plugins.entries.<id>
    .
    text
    configSchema
    Yes
    text
    object
    Inline JSON Schema for this plugin's config.
    text
    enabledByDefault
    No
    text
    true
    Marks a bundled plugin as enabled by default. Omit it, or set any non-
    text
    true
    value, to leave the plugin disabled by default.
    text
    legacyPluginIds
    No
    text
    string[]
    Legacy ids that normalize to this canonical plugin id.
    text
    autoEnableWhenConfiguredProviders
    No
    text
    string[]
    Provider ids that should auto-enable this plugin when auth, config, or model refs mention them.
    text
    kind
    No
    text
    "memory"
    |
    text
    "context-engine"
    Declares an exclusive plugin kind used by
    text
    plugins.slots.*
    .
    text
    channels
    No
    text
    string[]
    Channel ids owned by this plugin. Used for discovery and config validation.
    text
    providers
    No
    text
    string[]
    Provider ids owned by this plugin.
    text
    providerDiscoveryEntry
    No
    text
    string
    Lightweight provider-discovery module path, relative to the plugin root, for manifest-scoped provider catalog metadata that can be loaded without activating the full plugin runtime.
    text
    modelSupport
    No
    text
    object
    Manifest-owned shorthand model-family metadata used to auto-load the plugin before runtime.
    text
    modelCatalog
    No
    text
    object
    Declarative model catalog metadata for providers owned by this plugin. This is the control-plane contract for future read-only listing, onboarding, model pickers, aliases, and suppression without loading plugin runtime.
    text
    modelPricing
    No
    text
    object
    Provider-owned external pricing lookup policy. Use it to opt local/self-hosted providers out of remote pricing catalogs or map provider refs to OpenRouter/LiteLLM catalog ids without hardcoding provider ids in core.
    text
    modelIdNormalization
    No
    text
    object
    Provider-owned model-id alias/prefix cleanup that must run before provider runtime loads.
    text
    providerEndpoints
    No
    text
    object[]
    Manifest-owned endpoint host/baseUrl metadata for provider routes that core must classify before provider runtime loads.
    text
    providerRequest
    No
    text
    object
    Cheap provider-family and request-compatibility metadata used by generic request policy before provider runtime loads.
    text
    cliBackends
    No
    text
    string[]
    CLI inference backend ids owned by this plugin. Used for startup auto-activation from explicit config refs.
    text
    syntheticAuthRefs
    No
    text
    string[]
    Provider or CLI backend refs whose plugin-owned synthetic auth hook should be probed during cold model discovery before runtime loads.
    text
    nonSecretAuthMarkers
    No
    text
    string[]
    Bundled-plugin-owned placeholder API key values that represent non-secret local, OAuth, or ambient credential state.
    text
    commandAliases
    No
    text
    object[]
    Command names owned by this plugin that should produce plugin-aware config and CLI diagnostics before runtime loads.
    text
    providerAuthEnvVars
    No
    text
    Record<string, string[]>
    Deprecated compatibility env metadata for provider auth/status lookup. Prefer
    text
    setup.providers[].envVars
    for new plugins; OpenClaw still reads this during the deprecation window.
    text
    providerAuthAliases
    No
    text
    Record<string, string>
    Provider ids that should reuse another provider id for auth lookup, for example a coding provider that shares the base provider API key and auth profiles.
    text
    channelEnvVars
    No
    text
    Record<string, string[]>
    Cheap channel env metadata that OpenClaw can inspect without loading plugin code. Use this for env-driven channel setup or auth surfaces that generic startup/config helpers should see.
    text
    providerAuthChoices
    No
    text
    object[]
    Cheap auth-choice metadata for onboarding pickers, preferred-provider resolution, and simple CLI flag wiring.
    text
    activation
    No
    text
    object
    Cheap activation planner metadata for startup, provider, command, channel, route, and capability-triggered loading. Metadata only; plugin runtime still owns actual behavior.
    text
    setup
    No
    text
    object
    Cheap setup/onboarding descriptors that discovery and setup surfaces can inspect without loading plugin runtime.
    text
    qaRunners
    No
    text
    object[]
    Cheap QA runner descriptors used by the shared
    text
    openclaw qa
    host before plugin runtime loads.
    text
    contracts
    No
    text
    object
    Static bundled capability snapshot for external auth hooks, speech, realtime transcription, realtime voice, media-understanding, image-generation, music-generation, video-generation, web-fetch, web search, and tool ownership.
    text
    mediaUnderstandingProviderMetadata
    No
    text
    Record<string, object>
    Cheap media-understanding defaults for provider ids declared in
    text
    contracts.mediaUnderstandingProviders
    .
    text
    channelConfigs
    No
    text
    Record<string, object>
    Manifest-owned channel config metadata merged into discovery and validation surfaces before runtime loads.
    text
    skills
    No
    text
    string[]
    Skill directories to load, relative to the plugin root.
    text
    name
    No
    text
    string
    Human-readable plugin name.
    text
    description
    No
    text
    string
    Short summary shown in plugin surfaces.
    text
    version
    No
    text
    string
    Informational plugin version.
    text
    uiHints
    No
    text
    Record<string, object>
    UI labels, placeholders, and sensitivity hints for config fields.

    providerAuthChoices reference

    Each

    text
    providerAuthChoices
    entry describes one onboarding or auth choice. OpenClaw reads this before provider runtime loads. Provider setup lists use these manifest choices, descriptor-derived setup choices, and install-catalog metadata without loading provider runtime.

    FieldRequiredTypeWhat it means
    text
    provider
    Yes
    text
    string
    Provider id this choice belongs to.
    text
    method
    Yes
    text
    string
    Auth method id to dispatch to.
    text
    choiceId
    Yes
    text
    string
    Stable auth-choice id used by onboarding and CLI flows.
    text
    choiceLabel
    No
    text
    string
    User-facing label. If omitted, OpenClaw falls back to
    text
    choiceId
    .
    text
    choiceHint
    No
    text
    string
    Short helper text for the picker.
    text
    assistantPriority
    No
    text
    number
    Lower values sort earlier in assistant-driven interactive pickers.
    text
    assistantVisibility
    No
    text
    "visible"
    |
    text
    "manual-only"
    Hide the choice from assistant pickers while still allowing manual CLI selection.
    text
    deprecatedChoiceIds
    No
    text
    string[]
    Legacy choice ids that should redirect users to this replacement choice.
    text
    groupId
    No
    text
    string
    Optional group id for grouping related choices.
    text
    groupLabel
    No
    text
    string
    User-facing label for that group.
    text
    groupHint
    No
    text
    string
    Short helper text for the group.
    text
    optionKey
    No
    text
    string
    Internal option key for simple one-flag auth flows.
    text
    cliFlag
    No
    text
    string
    CLI flag name, such as
    text
    --openrouter-api-key
    .
    text
    cliOption
    No
    text
    string
    Full CLI option shape, such as
    text
    --openrouter-api-key <key>
    .
    text
    cliDescription
    No
    text
    string
    Description used in CLI help.
    text
    onboardingScopes
    No
    text
    Array<"text-inference" | "image-generation">
    Which onboarding surfaces this choice should appear in. If omitted, it defaults to
    text
    ["text-inference"]
    .

    commandAliases reference

    Use

    text
    commandAliases
    when a plugin owns a runtime command name that users may mistakenly put in
    text
    plugins.allow
    or try to run as a root CLI command. OpenClaw uses this metadata for diagnostics without importing plugin runtime code.

    json
    { "commandAliases": [ { "name": "dreaming", "kind": "runtime-slash", "cliCommand": "memory" } ] }
    FieldRequiredTypeWhat it means
    text
    name
    Yes
    text
    string
    Command name that belongs to this plugin.
    text
    kind
    No
    text
    "runtime-slash"
    Marks the alias as a chat slash command rather than a root CLI command.
    text
    cliCommand
    No
    text
    string
    Related root CLI command to suggest for CLI operations, if one exists.

    activation reference

    Use

    text
    activation
    when the plugin can cheaply declare which control-plane events should include it in an activation/load plan.

    This block is planner metadata, not a lifecycle API. It does not register runtime behavior, does not replace

    text
    register(...)
    , and does not promise that plugin code has already executed. The activation planner uses these fields to narrow candidate plugins before falling back to existing manifest ownership metadata such as
    text
    providers
    ,
    text
    channels
    ,
    text
    commandAliases
    ,
    text
    setup.providers
    ,
    text
    contracts.tools
    , and hooks.

    Prefer the narrowest metadata that already describes ownership. Use

    text
    providers
    ,
    text
    channels
    ,
    text
    commandAliases
    , setup descriptors, or
    text
    contracts
    when those fields express the relationship. Use
    text
    activation
    for extra planner hints that cannot be represented by those ownership fields. Use top-level
    text
    cliBackends
    for CLI runtime aliases such as
    text
    claude-cli
    ,
    text
    codex-cli
    , or
    text
    google-gemini-cli
    ;
    text
    activation.onAgentHarnesses
    is only for embedded agent harness ids that do not already have an ownership field.

    This block is metadata only. It does not register runtime behavior, and it does not replace

    text
    register(...)
    ,
    text
    setupEntry
    , or other runtime/plugin entrypoints. Current consumers use it as a narrowing hint before broader plugin loading, so missing activation metadata usually only costs performance; it should not change correctness while legacy manifest ownership fallbacks still exist.

    Every plugin should set

    text
    activation.onStartup
    intentionally as OpenClaw moves away from implicit startup imports. Set it to
    text
    true
    only when the plugin must run during Gateway startup. Set it to
    text
    false
    when the plugin is inert at startup and should load only from narrower triggers. Omitting
    text
    onStartup
    keeps the deprecated legacy implicit startup sidecar fallback for plugins with no static capability metadata; future versions may stop startup-loading those plugins unless they declare
    text
    activation.onStartup: true
    . Plugin status and compatibility reports warn with
    text
    legacy-implicit-startup-sidecar
    when a plugin still relies on that fallback.

    For migration testing, set

    text
    OPENCLAW_DISABLE_LEGACY_IMPLICIT_STARTUP_SIDECARS=1
    to disable only that deprecated fallback. This opt-in mode does not block explicit
    text
    activation.onStartup: true
    plugins or plugins loaded by channel, config, agent-harness, memory, or other narrower activation triggers.

    json
    { "activation": { "onStartup": false, "onProviders": ["openai"], "onCommands": ["models"], "onChannels": ["web"], "onRoutes": ["gateway-webhook"], "onConfigPaths": ["browser"], "onCapabilities": ["provider", "tool"] } }
    FieldRequiredTypeWhat it means
    text
    onStartup
    No
    text
    boolean
    Explicit Gateway startup activation. Every plugin should set this.
    text
    true
    imports the plugin during startup;
    text
    false
    opts out of the deprecated implicit sidecar startup fallback unless another matched trigger requires loading.
    text
    onProviders
    No
    text
    string[]
    Provider ids that should include this plugin in activation/load plans.
    text
    onAgentHarnesses
    No
    text
    string[]
    Embedded agent harness runtime ids that should include this plugin in activation/load plans. Use top-level
    text
    cliBackends
    for CLI backend aliases.
    text
    onCommands
    No
    text
    string[]
    Command ids that should include this plugin in activation/load plans.
    text
    onChannels
    No
    text
    string[]
    Channel ids that should include this plugin in activation/load plans.
    text
    onRoutes
    No
    text
    string[]
    Route kinds that should include this plugin in activation/load plans.
    text
    onConfigPaths
    No
    text
    string[]
    Root-relative config paths that should include this plugin in startup/load plans when the path is present and not explicitly disabled.
    text
    onCapabilities
    No
    text
    Array<"provider" | "channel" | "tool" | "hook">
    Broad capability hints used by control-plane activation planning. Prefer narrower fields when possible.

    Current live consumers:

    • Gateway startup planning uses
      text
      activation.onStartup
      for explicit startup import and opt-out of deprecated implicit sidecar startup fallback
    • command-triggered CLI planning falls back to legacy
      text
      commandAliases[].cliCommand
      or
      text
      commandAliases[].name
    • agent-runtime startup planning uses
      text
      activation.onAgentHarnesses
      for embedded harnesses and top-level
      text
      cliBackends[]
      for CLI runtime aliases
    • channel-triggered setup/channel planning falls back to legacy
      text
      channels[]
      ownership when explicit channel activation metadata is missing
    • startup plugin planning uses
      text
      activation.onConfigPaths
      for non-channel root config surfaces such as the bundled browser plugin's
      text
      browser
      block
    • provider-triggered setup/runtime planning falls back to legacy
      text
      providers[]
      and top-level
      text
      cliBackends[]
      ownership when explicit provider activation metadata is missing

    Planner diagnostics can distinguish explicit activation hints from manifest ownership fallback. For example,

    text
    activation-command-hint
    means
    text
    activation.onCommands
    matched, while
    text
    manifest-command-alias
    means the planner used
    text
    commandAliases
    ownership instead. These reason labels are for host diagnostics and tests; plugin authors should keep declaring the metadata that best describes ownership.

    qaRunners reference

    Use

    text
    qaRunners
    when a plugin contributes one or more transport runners beneath the shared
    text
    openclaw qa
    root. Keep this metadata cheap and static; the plugin runtime still owns actual CLI registration through a lightweight
    text
    runtime-api.ts
    surface that exports
    text
    qaRunnerCliRegistrations
    .

    json
    { "qaRunners": [ { "commandName": "matrix", "description": "Run the Docker-backed Matrix live QA lane against a disposable homeserver" } ] }
    FieldRequiredTypeWhat it means
    text
    commandName
    Yes
    text
    string
    Subcommand mounted beneath
    text
    openclaw qa
    , for example
    text
    matrix
    .
    text
    description
    No
    text
    string
    Fallback help text used when the shared host needs a stub command.

    setup reference

    Use

    text
    setup
    when setup and onboarding surfaces need cheap plugin-owned metadata before runtime loads.

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

    Top-level

    text
    cliBackends
    stays valid and continues to describe CLI inference backends.
    text
    setup.cliBackends
    is the setup-specific descriptor surface for control-plane/setup flows that should stay metadata-only.

    When present,

    text
    setup.providers
    and
    text
    setup.cliBackends
    are the preferred descriptor-first lookup surface for setup discovery. If the descriptor only narrows the candidate plugin and setup still needs richer setup-time runtime hooks, set
    text
    requiresRuntime: true
    and keep
    text
    setup-api
    in place as the fallback execution path.

    OpenClaw also includes

    text
    setup.providers[].envVars
    in generic provider auth and env-var lookups.
    text
    providerAuthEnvVars
    remains supported through a compatibility adapter during the deprecation window, but non-bundled plugins that still use it receive a manifest diagnostic. New plugins should put setup/status env metadata on
    text
    setup.providers[].envVars
    .

    OpenClaw can also derive simple setup choices from

    text
    setup.providers[].authMethods
    when no setup entry is available, or when
    text
    setup.requiresRuntime: false
    declares setup runtime unnecessary. Explicit
    text
    providerAuthChoices
    entries stay preferred for custom labels, CLI flags, onboarding scope, and assistant metadata.

    Set

    text
    requiresRuntime: false
    only when those descriptors are sufficient for the setup surface. OpenClaw treats explicit
    text
    false
    as a descriptor-only contract and will not execute
    text
    setup-api
    or
    text
    openclaw.setupEntry
    for setup lookup. If a descriptor-only plugin still ships one of those setup runtime entries, OpenClaw reports an additive diagnostic and continues ignoring it. Omitted
    text
    requiresRuntime
    keeps legacy fallback behavior so existing plugins that added descriptors without the flag do not break.

    Because setup lookup can execute plugin-owned

    text
    setup-api
    code, normalized
    text
    setup.providers[].id
    and
    text
    setup.cliBackends[]
    values must stay unique across discovered plugins. Ambiguous ownership fails closed instead of picking a winner from discovery order.

    When setup runtime does execute, setup registry diagnostics report descriptor drift if

    text
    setup-api
    registers a provider or CLI backend that the manifest descriptors do not declare, or if a descriptor has no matching runtime registration. These diagnostics are additive and do not reject legacy plugins.

    setup.providers reference

    FieldRequiredTypeWhat it means
    text
    id
    Yes
    text
    string
    Provider id exposed during setup or onboarding. Keep normalized ids globally unique.
    text
    authMethods
    No
    text
    string[]
    Setup/auth method ids this provider supports without loading full runtime.
    text
    envVars
    No
    text
    string[]
    Env vars that generic setup/status surfaces can check before plugin runtime loads.
    text
    authEvidence
    No
    text
    object[]
    Cheap local auth evidence checks for providers that can authenticate through non-secret markers.

    text
    authEvidence
    is for provider-owned local credential markers that can be verified without loading runtime code. These checks must stay cheap and local: no network calls, no keychain or secret-manager reads, no shell commands, and no provider API probes.

    Supported evidence entries:

    FieldRequiredTypeWhat it means
    text
    type
    Yes
    text
    string
    Currently
    text
    local-file-with-env
    .
    text
    fileEnvVar
    No
    text
    string
    Env var containing an explicit credential file path.
    text
    fallbackPaths
    No
    text
    string[]
    Local credential file paths checked when
    text
    fileEnvVar
    is absent or empty. Supports
    text
    ${HOME}
    and
    text
    ${APPDATA}
    .
    text
    requiresAnyEnv
    No
    text
    string[]
    At least one listed env var must be non-empty before the evidence is valid.
    text
    requiresAllEnv
    No
    text
    string[]
    Every listed env var must be non-empty before the evidence is valid.
    text
    credentialMarker
    Yes
    text
    string
    Non-secret marker returned when the evidence is present.
    text
    source
    No
    text
    string
    User-facing source label for auth/status output.

    setup fields

    FieldRequiredTypeWhat it means
    text
    providers
    No
    text
    object[]
    Provider setup descriptors exposed during setup and onboarding.
    text
    cliBackends
    No
    text
    string[]
    Setup-time backend ids used for descriptor-first setup lookup. Keep normalized ids globally unique.
    text
    configMigrations
    No
    text
    string[]
    Config migration ids owned by this plugin's setup surface.
    text
    requiresRuntime
    No
    text
    boolean
    Whether setup still needs
    text
    setup-api
    execution after descriptor lookup.

    uiHints reference

    text
    uiHints
    is a map from config field names to small rendering hints.

    json
    { "uiHints": { "apiKey": { "label": "API key", "help": "Used for OpenRouter requests", "placeholder": "sk-or-v1-...", "sensitive": true } } }

    Each field hint can include:

    FieldTypeWhat it means
    text
    label
    text
    string
    User-facing field label.
    text
    help
    text
    string
    Short helper text.
    text
    tags
    text
    string[]
    Optional UI tags.
    text
    advanced
    text
    boolean
    Marks the field as advanced.
    text
    sensitive
    text
    boolean
    Marks the field as secret or sensitive.
    text
    placeholder
    text
    string
    Placeholder text for form inputs.

    contracts reference

    Use

    text
    contracts
    only for static capability ownership metadata that OpenClaw can read without importing the plugin runtime.

    json
    { "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"] } }

    Each list is optional:

    FieldTypeWhat it means
    text
    embeddedExtensionFactories
    text
    string[]
    Codex app-server extension factory ids, currently
    text
    codex-app-server
    .
    text
    agentToolResultMiddleware
    text
    string[]
    Runtime ids a bundled plugin may register tool-result middleware for.
    text
    externalAuthProviders
    text
    string[]
    Provider ids whose external auth profile hook this plugin owns.
    text
    speechProviders
    text
    string[]
    Speech provider ids this plugin owns.
    text
    realtimeTranscriptionProviders
    text
    string[]
    Realtime-transcription provider ids this plugin owns.
    text
    realtimeVoiceProviders
    text
    string[]
    Realtime-voice provider ids this plugin owns.
    text
    memoryEmbeddingProviders
    text
    string[]
    Memory embedding provider ids this plugin owns.
    text
    mediaUnderstandingProviders
    text
    string[]
    Media-understanding provider ids this plugin owns.
    text
    imageGenerationProviders
    text
    string[]
    Image-generation provider ids this plugin owns.
    text
    videoGenerationProviders
    text
    string[]
    Video-generation provider ids this plugin owns.
    text
    webFetchProviders
    text
    string[]
    Web-fetch provider ids this plugin owns.
    text
    webSearchProviders
    text
    string[]
    Web-search provider ids this plugin owns.
    text
    migrationProviders
    text
    string[]
    Import provider ids this plugin owns for
    text
    openclaw migrate
    .
    text
    tools
    text
    string[]
    Agent tool names this plugin owns for bundled contract checks.

    text
    contracts.embeddedExtensionFactories
    is retained for bundled Codex app-server-only extension factories. Bundled tool-result transforms should declare
    text
    contracts.agentToolResultMiddleware
    and register with
    text
    api.registerAgentToolResultMiddleware(...)
    instead. External plugins cannot register tool-result middleware because the seam can rewrite high-trust tool output before the model sees it.

    Provider plugins that implement

    text
    resolveExternalAuthProfiles
    should declare
    text
    contracts.externalAuthProviders
    . Plugins without the declaration still run through a deprecated compatibility fallback, but that fallback is slower and will be removed after the migration window.

    Bundled memory embedding providers should declare

    text
    contracts.memoryEmbeddingProviders
    for every adapter id they expose, including built-in adapters such as
    text
    local
    . Standalone CLI paths use this manifest contract to load only the owning plugin before the full Gateway runtime has registered providers.

    mediaUnderstandingProviderMetadata reference

    Use

    text
    mediaUnderstandingProviderMetadata
    when a media-understanding provider has default models, auto-auth fallback priority, or native document support that generic core helpers need before runtime loads. Keys must also be declared in
    text
    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"] } } }

    Each provider entry can include:

    FieldTypeWhat it means
    text
    capabilities
    text
    ("image" | "audio" | "video")[]
    Media capabilities exposed by this provider.
    text
    defaultModels
    text
    Record<string, string>
    Capability-to-model defaults used when config does not specify a model.
    text
    autoPriority
    text
    Record<string, number>
    Lower numbers sort earlier for automatic credential-based provider fallback.
    text
    nativeDocumentInputs
    text
    "pdf"[]
    Native document inputs supported by the provider.

    channelConfigs reference

    Use

    text
    channelConfigs
    when a channel plugin needs cheap config metadata before runtime loads. Read-only channel setup/status discovery can use this metadata directly for configured external channels when no setup entry is available, or when
    text
    setup.requiresRuntime: false
    declares setup runtime unnecessary.

    text
    channelConfigs
    is plugin manifest metadata, not a new top-level user config section. Users still configure channel instances under
    text
    channels.<channel-id>
    . OpenClaw reads manifest metadata to decide which plugin owns that configured channel before plugin runtime code executes.

    For a channel plugin,

    text
    configSchema
    and
    text
    channelConfigs
    describe different paths:

    • text
      configSchema
      validates
      text
      plugins.entries.<plugin-id>.config
    • text
      channelConfigs.<channel-id>.schema
      validates
      text
      channels.<channel-id>

    Non-bundled plugins that declare

    text
    channels[]
    should also declare matching
    text
    channelConfigs
    entries. Without them, OpenClaw can still load the plugin, but cold-path config schema, setup, and Control UI surfaces cannot know the channel-owned option shape until plugin runtime executes.

    text
    channelConfigs.<channel-id>.commands.nativeCommandsAutoEnabled
    and
    text
    nativeSkillsAutoEnabled
    can declare static
    text
    auto
    defaults for command config checks that run before channel runtime loads. Bundled channels can also publish the same defaults through
    text
    package.json#openclaw.channel.commands
    alongside their other package-owned channel catalog metadata.

    json
    { "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"] } } }

    Each channel entry can include:

    FieldTypeWhat it means
    text
    schema
    text
    object
    JSON Schema for
    text
    channels.<id>
    . Required for each declared channel config entry.
    text
    uiHints
    text
    Record<string, object>
    Optional UI labels/placeholders/sensitive hints for that channel config section.
    text
    label
    text
    string
    Channel label merged into picker and inspect surfaces when runtime metadata is not ready.
    text
    description
    text
    string
    Short channel description for inspect and catalog surfaces.
    text
    commands
    text
    object
    Static native command and native skill auto-defaults for pre-runtime config checks.
    text
    preferOver
    text
    string[]
    Legacy or lower-priority plugin ids this channel should outrank in selection surfaces.

    Replacing another channel plugin

    Use

    text
    preferOver
    when your plugin is the preferred owner for a channel id that another plugin can also provide. Common cases are a renamed plugin id, a standalone plugin that supersedes a bundled plugin, or a maintained fork that keeps the same channel id for config compatibility.

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

    When

    text
    channels.chat
    is configured, OpenClaw considers both the channel id and the preferred plugin id. If the lower-priority plugin was only selected because it is bundled or enabled by default, OpenClaw disables it in the effective runtime config so one plugin owns the channel and its tools. Explicit user selection still wins: if the user explicitly enables both plugins, OpenClaw preserves that choice and reports duplicate channel/tool diagnostics instead of silently changing the requested plugin set.

    Keep

    text
    preferOver
    scoped to plugin ids that can really provide the same channel. It is not a general priority field and it does not rename user config keys.

    modelSupport reference

    Use

    text
    modelSupport
    when OpenClaw should infer your provider plugin from shorthand model ids like
    text
    gpt-5.5
    or
    text
    claude-sonnet-4.6
    before plugin runtime loads.

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

    OpenClaw applies this precedence:

    • explicit
      text
      provider/model
      refs use the owning
      text
      providers
      manifest metadata
    • text
      modelPatterns
      beat
      text
      modelPrefixes
    • if one non-bundled plugin and one bundled plugin both match, the non-bundled plugin wins
    • remaining ambiguity is ignored until the user or config specifies a provider

    Fields:

    FieldTypeWhat it means
    text
    modelPrefixes
    text
    string[]
    Prefixes matched with
    text
    startsWith
    against shorthand model ids.
    text
    modelPatterns
    text
    string[]
    Regex sources matched against shorthand model ids after profile suffix removal.

    modelCatalog reference

    Use

    text
    modelCatalog
    when OpenClaw should know provider model metadata before loading plugin runtime. This is the manifest-owned source for fixed catalog rows, provider aliases, suppression rules, and discovery mode. Runtime refresh still belongs in provider runtime code, but the manifest tells core when runtime is required.

    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": "not available on Azure OpenAI Responses" } ], "discovery": { "openai": "static" } } }

    Top-level fields:

    FieldTypeWhat it means
    text
    providers
    text
    Record<string, object>
    Catalog rows for provider ids owned by this plugin. Keys should also appear in top-level
    text
    providers
    .
    text
    aliases
    text
    Record<string, object>
    Provider aliases that should resolve to an owned provider for catalog or suppression planning.
    text
    suppressions
    text
    object[]
    Model rows from another source that this plugin suppresses for a provider-specific reason.
    text
    discovery
    text
    Record<string, "static" | "refreshable" | "runtime">
    Whether the provider catalog can be read from manifest metadata, refreshed into cache, or requires runtime.

    text
    aliases
    participates in provider ownership lookup for model-catalog planning. Alias targets must be top-level providers owned by the same plugin. When a provider-filtered list uses an alias, OpenClaw can read the owning manifest and apply alias API/base URL overrides without loading provider runtime. Aliases do not expand unfiltered catalog listings; broad lists emit the owning canonical provider rows only.

    text
    suppressions
    replaces the old provider runtime
    text
    suppressBuiltInModel
    hook. Suppression entries are honored only when the provider is owned by the plugin or declared as a
    text
    modelCatalog.aliases
    key that targets an owned provider. Runtime suppression hooks are no longer called during model resolution.

    Provider fields:

    FieldTypeWhat it means
    text
    baseUrl
    text
    string
    Optional default base URL for models in this provider catalog.
    text
    api
    text
    ModelApi
    Optional default API adapter for models in this provider catalog.
    text
    headers
    text
    Record<string, string>
    Optional static headers that apply to this provider catalog.
    text
    models
    text
    object[]
    Required model rows. Rows without an
    text
    id
    are ignored.

    Model fields:

    FieldTypeWhat it means
    text
    id
    text
    string
    Provider-local model id, without the
    text
    provider/
    prefix.
    text
    name
    text
    string
    Optional display name.
    text
    api
    text
    ModelApi
    Optional per-model API override.
    text
    baseUrl
    text
    string
    Optional per-model base URL override.
    text
    headers
    text
    Record<string, string>
    Optional per-model static headers.
    text
    input
    text
    Array<"text" | "image" | "document" | "audio" | "video">
    Modalities the model accepts.
    text
    reasoning
    text
    boolean
    Whether the model exposes reasoning behavior.
    text
    contextWindow
    text
    number
    Native provider context window.
    text
    contextTokens
    text
    number
    Optional effective runtime context cap when different from
    text
    contextWindow
    .
    text
    maxTokens
    text
    number
    Maximum output tokens when known.
    text
    cost
    text
    object
    Optional USD per million token pricing, including optional
    text
    tieredPricing
    .
    text
    compat
    text
    object
    Optional compatibility flags matching OpenClaw model config compatibility.
    text
    status
    text
    "available"
    |
    text
    "preview"
    |
    text
    "deprecated"
    |
    text
    "disabled"
    Listing status. Suppress only when the row must not appear at all.
    text
    statusReason
    text
    string
    Optional reason shown with non-available status.
    text
    replaces
    text
    string[]
    Older provider-local model ids this model supersedes.
    text
    replacedBy
    text
    string
    Replacement provider-local model id for deprecated rows.
    text
    tags
    text
    string[]
    Stable tags used by pickers and filters.

    Suppression fields:

    FieldTypeWhat it means
    text
    provider
    text
    string
    Provider id for the upstream row to suppress. Must be owned by this plugin or declared as an owned alias.
    text
    model
    text
    string
    Provider-local model id to suppress.
    text
    reason
    text
    string
    Optional message shown when the suppressed row is requested directly.
    text
    when.baseUrlHosts
    text
    string[]
    Optional list of effective provider base URL hosts required before the suppression applies.
    text
    when.providerConfigApiIn
    text
    string[]
    Optional list of exact provider-config
    text
    api
    values required before the suppression applies.

    Do not put runtime-only data in

    text
    modelCatalog
    . Use
    text
    static
    only when manifest rows are complete enough for provider-filtered list and picker surfaces to skip registry/runtime discovery. Use
    text
    refreshable
    when manifest rows are useful listable seeds or supplements but a refresh/cache can add more rows later; refreshable rows are not authoritative by themselves. Use
    text
    runtime
    when OpenClaw must load provider runtime to know the list.

    modelIdNormalization reference

    Use

    text
    modelIdNormalization
    for cheap provider-owned model-id cleanup that must happen before provider runtime loads. This keeps aliases such as short model names, provider-local legacy ids, and proxy prefix rules in the owning plugin manifest instead of in core model-selection tables.

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

    Provider fields:

    FieldTypeWhat it means
    text
    aliases
    text
    Record<string,string>
    Case-insensitive exact model-id aliases. Values are returned as written.
    text
    stripPrefixes
    text
    string[]
    Prefixes to remove before alias lookup, useful for legacy provider/model duplication.
    text
    prefixWhenBare
    text
    string
    Prefix to add when the normalized model id does not already contain
    text
    /
    .
    text
    prefixWhenBareAfterAliasStartsWith
    text
    object[]
    Conditional bare-id prefix rules after alias lookup, keyed by
    text
    modelPrefix
    and
    text
    prefix
    .

    providerEndpoints reference

    Use

    text
    providerEndpoints
    for endpoint classification that generic request policy must know before provider runtime loads. Core still owns the meaning of each
    text
    endpointClass
    ; plugin manifests own the host and base URL metadata.

    Endpoint fields:

    FieldTypeWhat it means
    text
    endpointClass
    text
    string
    Known core endpoint class, such as
    text
    openrouter
    ,
    text
    moonshot-native
    , or
    text
    google-vertex
    .
    text
    hosts
    text
    string[]
    Exact hostnames that map to the endpoint class.
    text
    hostSuffixes
    text
    string[]
    Host suffixes that map to the endpoint class. Prefix with
    text
    .
    for domain suffix-only matching.
    text
    baseUrls
    text
    string[]
    Exact normalized HTTP(S) base URLs that map to the endpoint class.
    text
    googleVertexRegion
    text
    string
    Static Google Vertex region for exact global hosts.
    text
    googleVertexRegionHostSuffix
    text
    string
    Suffix to strip from matching hosts to expose the Google Vertex region prefix.

    providerRequest reference

    Use

    text
    providerRequest
    for cheap request-compatibility metadata that generic request policy needs without loading provider runtime. Keep behavior-specific payload rewriting in provider runtime hooks or shared provider-family helpers.

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

    Provider fields:

    FieldTypeWhat it means
    text
    family
    text
    string
    Provider family label used by generic request compatibility decisions and diagnostics.
    text
    compatibilityFamily
    text
    "moonshot"
    Optional provider-family compatibility bucket for shared request helpers.
    text
    openAICompletions
    text
    object
    OpenAI-compatible completions request flags, currently
    text
    supportsStreamingUsage
    .

    modelPricing reference

    Use

    text
    modelPricing
    when a provider needs control-plane pricing behavior before runtime loads. The Gateway pricing cache reads this metadata without importing provider runtime code.

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

    Provider fields:

    FieldTypeWhat it means
    text
    external
    text
    boolean
    Set
    text
    false
    for local/self-hosted providers that should never fetch OpenRouter or LiteLLM pricing.
    text
    openRouter
    text
    false | object
    OpenRouter pricing lookup mapping.
    text
    false
    disables OpenRouter lookup for this provider.
    text
    liteLLM
    text
    false | object
    LiteLLM pricing lookup mapping.
    text
    false
    disables LiteLLM lookup for this provider.

    Source fields:

    FieldTypeWhat it means
    text
    provider
    text
    string
    External catalog provider id when it differs from the OpenClaw provider id, for example
    text
    z-ai
    for a
    text
    zai
    provider.
    text
    passthroughProviderModel
    text
    boolean
    Treat slash-containing model ids as nested provider/model refs, useful for proxy providers such as OpenRouter.
    text
    modelIdTransforms
    text
    "version-dots"[]
    Extra external catalog model-id variants.
    text
    version-dots
    tries dotted version ids like
    text
    claude-opus-4.6
    .

    OpenClaw Provider Index

    The OpenClaw Provider Index is OpenClaw-owned preview metadata for providers whose plugins may not be installed yet. It is not part of a plugin manifest. Plugin manifests remain the installed-plugin authority. The Provider Index is the internal fallback contract that future installable-provider and pre-install model picker surfaces will consume when a provider plugin is not installed.

    Catalog authority order:

    1. User config.
    2. Installed plugin manifest
      text
      modelCatalog
      .
    3. Model catalog cache from explicit refresh.
    4. OpenClaw Provider Index preview rows.

    The Provider Index must not contain secrets, enabled state, runtime hooks, or live account-specific model data. Its preview catalogs use the same

    text
    modelCatalog
    provider row shape as plugin manifests, but should stay limited to stable display metadata unless runtime adapter fields such as
    text
    api
    ,
    text
    baseUrl
    , pricing, or compatibility flags are intentionally kept aligned with the installed plugin manifest. Providers with live
    text
    /models
    discovery should write refreshed rows through the explicit model catalog cache path instead of making normal listing or onboarding call provider APIs.

    Provider Index entries may also carry installable-plugin metadata for providers whose plugin has moved out of core or is otherwise not installed yet. This metadata mirrors the channel catalog pattern: package name, npm install spec, expected integrity, and cheap auth-choice labels are enough to show an installable setup option. Once the plugin is installed, its manifest wins and the Provider Index entry is ignored for that provider.

    Legacy top-level capability keys are deprecated. Use

    text
    openclaw doctor --fix
    to move
    text
    speechProviders
    ,
    text
    realtimeTranscriptionProviders
    ,
    text
    realtimeVoiceProviders
    ,
    text
    mediaUnderstandingProviders
    ,
    text
    imageGenerationProviders
    ,
    text
    videoGenerationProviders
    ,
    text
    webFetchProviders
    , and
    text
    webSearchProviders
    under
    text
    contracts
    ; normal manifest loading no longer treats those top-level fields as capability ownership.

    Manifest versus package.json

    The two files serve different jobs:

    FileUse it for
    text
    openclaw.plugin.json
    Discovery, config validation, auth-choice metadata, and UI hints that must exist before plugin code runs
    text
    package.json
    npm metadata, dependency installation, and the
    text
    openclaw
    block used for entrypoints, install gating, setup, or catalog metadata

    If you are unsure where a piece of metadata belongs, use this rule:

    • if OpenClaw must know it before loading plugin code, put it in
      text
      openclaw.plugin.json
    • if it is about packaging, entry files, or npm install behavior, put it in
      text
      package.json

    package.json fields that affect discovery

    Some pre-runtime plugin metadata intentionally lives in

    text
    package.json
    under the
    text
    openclaw
    block instead of
    text
    openclaw.plugin.json
    .

    Important examples:

    FieldWhat it means
    text
    openclaw.extensions
    Declares native plugin entrypoints. Must stay inside the plugin package directory.
    text
    openclaw.runtimeExtensions
    Declares built JavaScript runtime entrypoints for installed packages. Must stay inside the plugin package directory.
    text
    openclaw.setupEntry
    Lightweight setup-only entrypoint used during onboarding, deferred channel startup, and read-only channel status/SecretRef discovery. Must stay inside the plugin package directory.
    text
    openclaw.runtimeSetupEntry
    Declares the built JavaScript setup entrypoint for installed packages. Must stay inside the plugin package directory.
    text
    openclaw.channel
    Cheap channel catalog metadata like labels, docs paths, aliases, and selection copy.
    text
    openclaw.channel.commands
    Static native command and native skill auto-default metadata used by config, audit, and command-list surfaces before channel runtime loads.
    text
    openclaw.channel.configuredState
    Lightweight configured-state checker metadata that can answer "does env-only setup already exist?" without loading the full channel runtime.
    text
    openclaw.channel.persistedAuthState
    Lightweight persisted-auth checker metadata that can answer "is anything already signed in?" without loading the full channel runtime.
    text
    openclaw.install.npmSpec
    /
    text
    openclaw.install.localPath
    Install/update hints for bundled and externally published plugins.
    text
    openclaw.install.defaultChoice
    Preferred install path when multiple install sources are available.
    text
    openclaw.install.minHostVersion
    Minimum supported OpenClaw host version, using a semver floor like
    text
    >=2026.3.22
    .
    text
    openclaw.install.expectedIntegrity
    Expected npm dist integrity string such as
    text
    sha512-...
    ; install and update flows verify the fetched artifact against it.
    text
    openclaw.install.allowInvalidConfigRecovery
    Allows a narrow bundled-plugin reinstall recovery path when config is invalid.
    text
    openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen
    Lets setup-only channel surfaces load before the full channel plugin during startup.

    Manifest metadata decides which provider/channel/setup choices appear in onboarding before runtime loads.

    text
    package.json#openclaw.install
    tells onboarding how to fetch or enable that plugin when the user picks one of those choices. Do not move install hints into
    text
    openclaw.plugin.json
    .

    text
    openclaw.install.minHostVersion
    is enforced during install and manifest registry loading. Invalid values are rejected; newer-but-valid values skip the plugin on older hosts.

    Exact npm version pinning already lives in

    text
    npmSpec
    , for example
    text
    "npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3"
    . Official external catalog entries should pair exact specs with
    text
    expectedIntegrity
    so update flows fail closed if the fetched npm artifact no longer matches the pinned release. Interactive onboarding still offers trusted registry npm specs, including bare package names and dist-tags, for compatibility. Catalog diagnostics can distinguish exact, floating, integrity-pinned, missing-integrity, package-name mismatch, and invalid default-choice sources. They also warn when
    text
    expectedIntegrity
    is present but there is no valid npm source it can pin. When
    text
    expectedIntegrity
    is present, install/update flows enforce it; when it is omitted, the registry resolution is recorded without an integrity pin.

    Channel plugins should provide

    text
    openclaw.setupEntry
    when status, channel list, or SecretRef scans need to identify configured accounts without loading the full runtime. The setup entry should expose channel metadata plus setup-safe config, status, and secrets adapters; keep network clients, gateway listeners, and transport runtimes in the main extension entrypoint.

    Runtime entrypoint fields do not override package-boundary checks for source entrypoint fields. For example,

    text
    openclaw.runtimeExtensions
    cannot make an escaping
    text
    openclaw.extensions
    path loadable.

    text
    openclaw.install.allowInvalidConfigRecovery
    is intentionally narrow. It does not make arbitrary broken configs installable. Today it only allows install flows to recover from specific stale bundled-plugin upgrade failures, such as a missing bundled plugin path or a stale
    text
    channels.<id>
    entry for that same bundled plugin. Unrelated config errors still block install and send operators to
    text
    openclaw doctor --fix
    .

    text
    openclaw.channel.persistedAuthState
    is package metadata for a tiny checker module:

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

    Use it when setup, doctor, status, or read-only presence flows need a cheap yes/no auth probe before the full channel plugin loads. Persisted auth state is not configured channel state: do not use this metadata to auto-enable plugins, repair runtime dependencies, or decide whether a channel runtime should load. The target export should be a small function that reads persisted state only; do not route it through the full channel runtime barrel.

    text
    openclaw.channel.configuredState
    follows the same shape for cheap env-only configured checks:

    json
    { "openclaw": { "channel": { "id": "telegram", "configuredState": { "specifier": "./configured-state", "exportName": "hasTelegramConfiguredState" } } } }

    Use it when a channel can answer configured-state from env or other tiny non-runtime inputs. If the check needs full config resolution or the real channel runtime, keep that logic in the plugin

    text
    config.hasConfiguredState
    hook instead.

    Discovery precedence (duplicate plugin ids)

    OpenClaw discovers plugins from several roots (bundled, global install, workspace, explicit config-selected paths). If two discoveries share the same

    text
    id
    , only the highest-precedence manifest is kept; lower-precedence duplicates are dropped instead of loading beside it.

    Precedence, highest to lowest:

    1. Config-selected — a path explicitly pinned in
      text
      plugins.entries.<id>
    2. Bundled — plugins shipped with OpenClaw
    3. Global install — plugins installed into the global OpenClaw plugin root
    4. Workspace — plugins discovered relative to the current workspace

    Implications:

    • A forked or stale copy of a bundled plugin sitting in the workspace will not shadow the bundled build.
    • To actually override a bundled plugin with a local one, pin it via
      text
      plugins.entries.<id>
      so it wins by precedence rather than relying on workspace discovery.
    • Duplicate drops are logged so Doctor and startup diagnostics can point at the discarded copy.

    JSON Schema requirements

    • Every plugin must ship a JSON Schema, even if it accepts no config.
    • An empty schema is acceptable (for example,
      text
      { "type": "object", "additionalProperties": false }
      ).
    • Schemas are validated at config read/write time, not at runtime.

    Validation behavior

    • Unknown
      text
      channels.*
      keys are errors, unless the channel id is declared by a plugin manifest.
    • text
      plugins.entries.<id>
      ,
      text
      plugins.allow
      ,
      text
      plugins.deny
      , and
      text
      plugins.slots.*
      must reference discoverable plugin ids. Unknown ids are errors.
    • If a plugin is installed but has a broken or missing manifest or schema, validation fails and Doctor reports the plugin error.
    • If plugin config exists but the plugin is disabled, the config is kept and a warning is surfaced in Doctor + logs.

    See Configuration reference for the full

    text
    plugins.*
    schema.

    Notes

    • The manifest is required for native OpenClaw plugins, including local filesystem loads. Runtime still loads the plugin module separately; the manifest is only for discovery + validation.
    • Native manifests are parsed with JSON5, so comments, trailing commas, and unquoted keys are accepted as long as the final value is still an object.
    • Only documented manifest fields are read by the manifest loader. Avoid custom top-level keys.
    • text
      channels
      ,
      text
      providers
      ,
      text
      cliBackends
      , and
      text
      skills
      can all be omitted when a plugin does not need them.
    • text
      providerDiscoveryEntry
      must stay lightweight and should not import broad runtime code; use it for static provider catalog metadata or narrow discovery descriptors, not request-time execution.
    • Exclusive plugin kinds are selected through
      text
      plugins.slots.*
      :
      text
      kind: "memory"
      via
      text
      plugins.slots.memory
      ,
      text
      kind: "context-engine"
      via
      text
      plugins.slots.contextEngine
      (default
      text
      legacy
      ).
    • Declare exclusive plugin kind in this manifest. Runtime-entry
      text
      OpenClawPluginDefinition.kind
      is deprecated and remains only as a compatibility fallback for older plugins.
    • Env-var metadata (
      text
      setup.providers[].envVars
      , deprecated
      text
      providerAuthEnvVars
      , and
      text
      channelEnvVars
      ) is declarative only. Status, audit, cron delivery validation, and other read-only surfaces still apply plugin trust and effective activation policy before treating an env var as configured.
    • For runtime wizard metadata that requires provider code, see Provider runtime hooks.
    • If your plugin depends on native modules, document the build steps and any package-manager allowlist requirements (for example, pnpm
      text
      allow-build-scripts
      +
      text
      pnpm rebuild <package>
      ).

    Related

    Building plugins

    Getting started with plugins.

    Plugin architecture

    Internal architecture and capability model.

    SDK overview

    Plugin SDK reference and subpath imports.

    © 2024 TaskFlow Mirror

    Powered by TaskFlow Sync Engine