Plugins

Criando plugins de backend de CLI

Os plugins de backend CLI permitem que o OpenClaw chame uma CLI de IA local como um backend de inferência de texto. O backend aparece como um prefixo de provedor em refs de modelo:

acme-cli/acme-large

Use um backend CLI quando a integração upstream já estiver exposta como um comando local, quando a CLI possuir o estado de login local ou quando a CLI for uma alternativa útil caso provedores de API estejam indisponíveis.

O que o Plugin possui

Um Plugin de backend CLI tem três contratos:

Contrato Arquivo Finalidade
Entrada do pacote package.json Aponta o OpenClaw para o módulo de runtime do Plugin
Propriedade do manifesto openclaw.plugin.json Declara o id do backend antes do carregamento do runtime
Registro em runtime index.ts Chama api.registerCliBackend(...) com padrões de comando

O manifesto é metadado de descoberta. Ele não executa a CLI e não registra comportamento em runtime. O comportamento em runtime começa quando a entrada do Plugin chama api.registerCliBackend(...).

Plugin de backend mínimo

  • Criar metadados do pacote

    {
      "name": "@acme/openclaw-acme-cli",
      "version": "1.0.0",
      "type": "module",
      "openclaw": {
        "extensions": ["./index.ts"],
        "compat": {
          "pluginApi": ">=2026.3.24-beta.2",
          "minGatewayVersion": "2026.3.24-beta.2"
        },
        "build": {
          "openclawVersion": "2026.3.24-beta.2",
          "pluginSdkVersion": "2026.3.24-beta.2"
        }
      },
      "dependencies": {
        "openclaw": "^2026.3.24"
      },
      "devDependencies": {
        "typescript": "^5.9.0"
      }
    }
    

    Pacotes publicados devem enviar arquivos JavaScript de runtime compilados. Se a entrada de origem for ./src/index.ts, adicione openclaw.runtimeExtensions apontando para o par JavaScript compilado. Consulte Pontos de entrada.

  • Declarar propriedade do backend

    {
      "id": "acme-cli",
      "name": "Acme CLI",
      "description": "Run Acme's local AI CLI through OpenClaw",
      "cliBackends": ["acme-cli"],
      "setup": {
        "cliBackends": ["acme-cli"],
        "requiresRuntime": false
      },
      "activation": {
        "onStartup": false
      },
      "configSchema": {
        "type": "object",
        "additionalProperties": false
      }
    }
    

    cliBackends é a lista de propriedade em runtime. Ela permite que o OpenClaw carregue automaticamente o Plugin quando a configuração ou a seleção de modelo mencionar acme-cli/....

    setup.cliBackends é a superfície de configuração orientada primeiro por descritor. Adicione-a quando descoberta de modelo, onboarding ou status devem reconhecer o backend sem carregar o runtime do Plugin. Use requiresRuntime: false somente quando esses descritores estáticos forem suficientes para a configuração.

  • Registrar o backend

    import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
    import {
      CLI_FRESH_WATCHDOG_DEFAULTS,
      CLI_RESUME_WATCHDOG_DEFAULTS,
      type CliBackendPlugin,
    } from "openclaw/plugin-sdk/cli-backend";
    
    function buildAcmeCliBackend(): CliBackendPlugin {
      return {
        id: "acme-cli",
        liveTest: {
          defaultModelRef: "acme-cli/acme-large",
          defaultImageProbe: false,
          defaultMcpProbe: false,
          docker: {
            npmPackage: "@acme/acme-cli",
            binaryName: "acme",
          },
        },
        config: {
          command: "acme",
          args: ["chat", "--json"],
          output: "json",
          input: "stdin",
          modelArg: "--model",
          sessionArg: "--session",
          sessionMode: "existing",
          sessionIdFields: ["session_id", "conversation_id"],
          systemPromptFileArg: "--system-file",
          systemPromptWhen: "first",
          imageArg: "--image",
          imageMode: "repeat",
          reliability: {
            watchdog: {
              fresh: { ...CLI_FRESH_WATCHDOG_DEFAULTS },
              resume: { ...CLI_RESUME_WATCHDOG_DEFAULTS },
            },
          },
          serialize: true,
        },
      };
    }
    
    export default definePluginEntry({
      id: "acme-cli",
      name: "Acme CLI",
      description: "Run Acme's local AI CLI through OpenClaw",
      register(api) {
        api.registerCliBackend(buildAcmeCliBackend());
      },
    });
    

    O id do backend deve corresponder à entrada cliBackends do manifesto. O config registrado é apenas o padrão; a configuração do usuário em agents.defaults.cliBackends.acme-cli é mesclada sobre ele em runtime.

  • Formato da configuração

    CliBackendConfig descreve como o OpenClaw deve iniciar e analisar a CLI:

    Campo Uso
    command Nome do binário ou caminho absoluto do comando
    args argv base para execuções novas
    resumeArgs argv alternativa para sessões retomadas; aceita {sessionId}
    output / resumeOutput Parser: json, jsonl ou text
    input Transporte do prompt: arg ou stdin
    modelArg Flag usada antes do id do modelo
    modelAliases Mapeia ids de modelo do OpenClaw para ids nativos da CLI
    sessionArg / sessionArgs Como passar um id de sessão
    sessionMode always, existing ou none
    sessionIdFields Campos JSON que o OpenClaw lê da saída da CLI
    systemPromptArg / systemPromptFileArg Transporte do prompt de sistema
    systemPromptWhen first, always ou never
    imageArg / imageMode Suporte a caminho de imagem
    serialize Mantém execuções do mesmo backend ordenadas
    reliability.watchdog Ajuste de timeout sem saída

    Prefira a menor configuração estática que corresponda à CLI. Adicione callbacks do Plugin somente para comportamentos que realmente pertencem ao backend.

    Hooks avançados de backend

    CliBackendPlugin também pode definir:

    Hook Uso
    normalizeConfig(config, context) Reescreve configuração legada do usuário após a mesclagem
    resolveExecutionArgs(ctx) Adiciona flags com escopo da solicitação, como esforço de raciocínio
    prepareExecution(ctx) Cria pontes temporárias de autenticação ou configuração antes da inicialização
    transformSystemPrompt(ctx) Aplica uma transformação final específica da CLI ao prompt de sistema
    textTransforms Substituições bidirecionais de prompt/saída
    defaultAuthProfileId Prefere um perfil de autenticação específico do OpenClaw
    authEpochMode Decide como mudanças de autenticação invalidam sessões CLI armazenadas
    nativeToolMode Declara se a CLI tem ferramentas nativas sempre ativas
    bundleMcp / bundleMcpMode Opta por usar a ponte de ferramentas MCP de loopback do OpenClaw

    Mantenha esses hooks pertencentes ao provedor. Não adicione ramificações específicas de CLI ao core quando um hook de backend puder expressar o comportamento.

    Ponte de ferramentas MCP

    Backends CLI não recebem ferramentas do OpenClaw por padrão. Se a CLI puder consumir uma configuração MCP, opte explicitamente:

    return {
      id: "acme-cli",
      bundleMcp: true,
      bundleMcpMode: "codex-config-overrides",
      config: {
        command: "acme",
        args: ["chat", "--json"],
        output: "json",
      },
    };
    

    Os modos de ponte compatíveis são:

    Modo Uso
    claude-config-file CLIs que aceitam um arquivo de configuração MCP
    codex-config-overrides CLIs que aceitam substituições de configuração em argv
    gemini-system-settings CLIs que leem configurações MCP do diretório de configurações do sistema

    Habilite a ponte somente quando a CLI puder realmente consumi-la. Se a CLI tiver sua própria camada de ferramentas integrada que não pode ser desabilitada, defina nativeToolMode: "always-on" para que o OpenClaw possa falhar fechado quando um chamador exigir ausência de ferramentas nativas.

    Configuração do usuário

    Usuários podem substituir qualquer padrão de backend:

    {
      agents: {
        defaults: {
          cliBackends: {
            "acme-cli": {
              command: "/opt/acme/bin/acme",
              args: ["chat", "--json", "--profile", "work"],
              modelAliases: {
                large: "acme-large-2026",
              },
            },
          },
          model: {
            primary: "openai/gpt-5.5",
            fallbacks: ["acme-cli/large"],
          },
        },
      },
    }
    

    Documente a substituição mínima de que os usuários provavelmente precisarão. Normalmente, é apenas command quando o binário está fora de PATH.

    Verificação

    Para plugins empacotados, adicione um teste focado no builder e no registro de configuração, depois execute a faixa de testes direcionada do Plugin:

    pnpm test extensions/acme-cli
    

    Para plugins locais ou instalados, verifique a descoberta e uma execução real de modelo:

    openclaw plugins inspect acme-cli --runtime --json
    openclaw agent --message "reply exactly: backend ok" --model acme-cli/acme-large
    

    Se o backend for compatível com imagens ou MCP, adicione uma fumaça ao vivo que comprove esses caminhos com a CLI real. Não dependa de inspeção estática para comportamento de prompt, imagem, MCP ou retomada de sessão.

    Checklist

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s package.json tem openclaw.extensions e entradas de runtime compiladas para pacotes publicados OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s openclaw.plugin.json declara cliBackends e activation.onStartup intencional OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s setup.cliBackends está presente quando configuração/descoberta de modelo deve ver o backend a frio OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s api.registerCliBackend(...) usa o mesmo id de backend que o manifesto OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s Substituições do usuário em agents.defaults.cliBackends.<id> ainda vencem OPENCLAW_DOCS_MARKER:calloutClose: