Building Provider Plugins
Este guia mostra passo a passo como criar um plugin de provedor que adiciona um provedor de modelo (LLM) ao OpenClaw. Ao final, você terá um provedor com catálogo de modelos, autenticação por chave de API e resolução dinâmica de modelos.Se você ainda não criou nenhum plugin do OpenClaw antes, leia
Getting Started primeiro para entender a estrutura
básica do pacote e a configuração do manifesto.
Passo a passo
Pacote e manifesto
providerAuthEnvVars para que o OpenClaw possa detectar
credenciais sem carregar o runtime do seu plugin. modelSupport é opcional
e permite que o OpenClaw carregue automaticamente seu plugin de provedor a partir de ids curtos de modelo
como acme-large antes de existirem hooks de runtime. Se você publicar o
provedor no ClawHub, esses campos openclaw.compat e openclaw.build
são obrigatórios no package.json.Registre o provedor
Um provedor mínimo precisa de Esse já é um provedor funcional. Agora os usuários podem
Se o fluxo de autenticação do seu provedor também precisar ajustar
id, label, auth e catalog:index.ts
openclaw onboard --acme-ai-api-key <key> e selecionar
acme-ai/acme-large como modelo.Para provedores empacotados que registram apenas um provedor de texto com
autenticação por chave de API mais um único runtime baseado em catálogo, prefira o helper mais específico
defineSingleProviderPluginEntry(...):models.providers.*, aliases e
o modelo padrão do agente durante o onboarding, use os helpers predefinidos de
openclaw/plugin-sdk/provider-onboard. Os helpers mais específicos são
createDefaultModelPresetAppliers(...),
createDefaultModelsPresetAppliers(...) e
createModelCatalogPresetAppliers(...).Quando o endpoint nativo de um provedor oferecer suporte a blocos de uso transmitidos no
transporte normal openai-completions, prefira os helpers de catálogo compartilhados em
openclaw/plugin-sdk/provider-catalog-shared em vez de codificar verificações por id de provedor.supportsNativeStreamingUsageCompat(...) e
applyProviderNativeStreamingUsageCompat(...) detectam suporte a partir do mapa de capacidades do
endpoint, para que endpoints nativos no estilo Moonshot/DashScope ainda
participem mesmo quando um plugin estiver usando um id de provedor personalizado.Adicione resolução dinâmica de modelo
Se o seu provedor aceitar ids arbitrários de modelo (como um proxy ou roteador),
adicione Se a resolução exigir uma chamada de rede, use
resolveDynamicModel:prepareDynamicModel para
aquecimento assíncrono — resolveDynamicModel será executado novamente depois que ele concluir.Adicione hooks de runtime (conforme necessário)
A maioria dos provedores só precisa de Famílias de replay disponíveis hoje:
Exemplos reais empacotados:
Exemplos reais empacotados:
catalog + resolveDynamicModel. Adicione hooks
gradualmente conforme seu provedor exigir.Builders de helpers compartilhados agora cobrem as famílias mais comuns de replay e compatibilidade com ferramentas,
então normalmente os plugins não precisam conectar manualmente cada hook um por um:| Família | O que ela conecta |
|---|---|
openai-compatible | Política compartilhada de replay no estilo OpenAI para transportes compatíveis com OpenAI, incluindo saneamento de tool-call-id, correções de ordenação assistant-first e validação genérica de turnos Gemini quando o transporte precisar disso |
anthropic-by-model | Política de replay compatível com Claude escolhida por modelId, para que transportes de mensagens Anthropic só recebam limpeza de thinking blocks específica do Claude quando o modelo resolvido realmente for um id de Claude |
google-gemini | Política nativa de replay do Gemini mais saneamento de replay de bootstrap e modo de saída de raciocínio com tags |
passthrough-gemini | Saneamento de thought-signature do Gemini para modelos Gemini executados por transportes proxy compatíveis com OpenAI; não habilita validação nativa de replay do Gemini nem reescritas de bootstrap |
hybrid-anthropic-openai | Política híbrida para provedores que misturam superfícies de modelo de mensagens Anthropic e compatíveis com OpenAI em um único plugin; a remoção opcional de thinking blocks apenas para Claude continua restrita ao lado Anthropic |
googleegoogle-gemini-cli:google-geminiopenrouter,kilocode,opencodeeopencode-go:passthrough-geminiamazon-bedrockeanthropic-vertex:anthropic-by-modelminimax:hybrid-anthropic-openaimoonshot,ollama,xaiezai:openai-compatible
| Família | O que ela conecta |
|---|---|
google-thinking | Normalização de payload de thinking do Gemini no caminho de stream compartilhado |
kilocode-thinking | Wrapper de raciocínio do Kilo no caminho de stream de proxy compartilhado, com kilo/auto e ids de raciocínio de proxy não compatíveis ignorando thinking injetado |
moonshot-thinking | Mapeamento binário de payload native-thinking do Moonshot a partir da configuração + nível /think |
minimax-fast-mode | Reescrita de modelo fast-mode do MiniMax no caminho de stream compartilhado |
openai-responses-defaults | Wrappers compartilhados nativos de OpenAI/Codex Responses: headers de atribuição, /fast/serviceTier, verbosidade de texto, pesquisa nativa na web do Codex, modelagem de payload compatível com raciocínio e gerenciamento de contexto de Responses |
openrouter-thinking | Wrapper de raciocínio do OpenRouter para rotas de proxy, com ignorar modelos não compatíveis/auto tratado de forma central |
tool-stream-default-on | Wrapper tool_stream ativado por padrão para provedores como Z.AI que querem streaming de ferramentas, a menos que seja desabilitado explicitamente |
googleegoogle-gemini-cli:google-thinkingkilocode:kilocode-thinkingmoonshot:moonshot-thinkingminimaxeminimax-portal:minimax-fast-modeopenaieopenai-codex:openai-responses-defaultsopenrouter:openrouter-thinkingzai:tool-stream-default-on
openclaw/plugin-sdk/provider-model-shared também exporta o enum da família de replay
junto com os helpers compartilhados sobre os quais essas famílias são construídas. Entre
as exportações públicas comuns estão:ProviderReplayFamilybuildProviderReplayFamilyHooks(...)- builders compartilhados de replay como
buildOpenAICompatibleReplayPolicy(...),buildAnthropicReplayPolicyForModel(...),buildGoogleGeminiReplayPolicy(...)ebuildHybridAnthropicOrOpenAIReplayPolicy(...) - helpers de replay do Gemini como
sanitizeGoogleGeminiReplayHistory(...)eresolveTaggedReasoningOutputMode() - helpers de endpoint/modelo como
resolveProviderEndpoint(...),normalizeProviderId(...),normalizeGooglePreviewModelId(...)enormalizeNativeXaiModelId(...)
openclaw/plugin-sdk/provider-stream expõe tanto o builder de família quanto
os helpers públicos de wrapper reutilizados por essas famílias. Entre as exportações públicas comuns
estão:ProviderStreamFamilybuildProviderStreamFamilyHooks(...)composeProviderStreamWrappers(...)- wrappers compartilhados de OpenAI/Codex como
createOpenAIAttributionHeadersWrapper(...),createOpenAIFastModeWrapper(...),createOpenAIServiceTierWrapper(...),createOpenAIResponsesContextManagementWrapper(...)ecreateCodexNativeWebSearchWrapper(...) - wrappers compartilhados de proxy/provedor como
createOpenRouterWrapper(...),createToolStreamWrapper(...)ecreateMinimaxFastModeWrapper(...)
@openclaw/anthropic-provider exporta
wrapAnthropicProviderStream, resolveAnthropicBetas,
resolveAnthropicFastMode, resolveAnthropicServiceTier e os
builders de wrapper Anthropic de nível mais baixo a partir de sua separação pública api.ts /
contract-api.ts. Esses helpers permanecem específicos do Anthropic porque
também codificam o tratamento beta do OAuth do Claude e o controle de context1m.Outros provedores empacotados também mantêm wrappers específicos do transporte localmente quando
o comportamento não é compartilhado de forma limpa entre famílias. Exemplo atual: o
plugin xAI empacotado mantém a modelagem nativa de Responses do xAI no próprio
wrapStreamFn, incluindo reescritas de alias /fast, tool_stream padrão,
limpeza de strict-tool não compatível e remoção de payload de raciocínio
específica do xAI.openclaw/plugin-sdk/provider-tools atualmente expõe uma família compartilhada de esquema de ferramenta
mais helpers compartilhados de esquema/compatibilidade:ProviderToolCompatFamilydocumenta hoje o inventário compartilhado de famílias.buildProviderToolCompatFamilyHooks("gemini")conecta limpeza de esquema- diagnósticos para provedores que precisam de esquemas de ferramenta compatíveis com Gemini.
normalizeGeminiToolSchemas(...)einspectGeminiToolSchemas(...)são os helpers públicos subjacentes de esquema do Gemini.resolveXaiModelCompatPatch()retorna o patch de compatibilidade xAI empacotado:toolSchemaProfile: "xai", palavras-chave de esquema não compatíveis, suporte nativo aweb_searche decodificação de argumentos de chamada de ferramenta com entidades HTML.applyXaiModelCompat(model)aplica esse mesmo patch de compatibilidade xAI a um modelo resolvido antes que ele chegue ao runner.
normalizeResolvedModel junto com
contributeResolvedModelCompat para manter esses metadados de compatibilidade sob propriedade do
provedor em vez de codificar regras xAI no core.O mesmo padrão de separação na raiz do pacote também sustenta outros provedores empacotados:@openclaw/openai-provider:api.tsexporta builders de provedor, helpers de modelo padrão e builders de provedor em tempo real@openclaw/openrouter-provider:api.tsexporta o builder de provedor mais helpers de onboarding/configuração
- Troca de token
- Headers personalizados
- Identidade nativa do transporte
- Uso e cobrança
Para provedores que precisam de uma troca de token antes de cada chamada de inferência:
Todos os hooks de provedor disponíveis
Todos os hooks de provedor disponíveis
O OpenClaw chama os hooks nesta ordem. A maioria dos provedores usa apenas 2-3:
Observações sobre fallback de runtime:
| # | Hook | Quando usar |
|---|---|---|
| 1 | catalog | Catálogo de modelos ou padrões de baseUrl |
| 2 | applyConfigDefaults | Padrões globais sob propriedade do provedor durante a materialização da configuração |
| 3 | normalizeModelId | Limpeza de aliases de id de modelo legado/prévia antes da busca |
| 4 | normalizeTransport | Limpeza de api / baseUrl da família do provedor antes da montagem genérica do modelo |
| 5 | normalizeConfig | Normalizar a configuração models.providers.<id> |
| 6 | applyNativeStreamingUsageCompat | Reescritas de compatibilidade de uso em streaming nativo para provedores de configuração |
| 7 | resolveConfigApiKey | Resolução de autenticação por marcador de ambiente sob propriedade do provedor |
| 8 | resolveSyntheticAuth | Autenticação sintética local/self-hosted ou baseada em configuração |
| 9 | shouldDeferSyntheticProfileAuth | Priorizar placeholders sintéticos de perfil armazenado abaixo da autenticação por ambiente/configuração |
| 10 | resolveDynamicModel | Aceitar ids arbitrários de modelo upstream |
| 11 | prepareDynamicModel | Busca assíncrona de metadados antes de resolver |
| 12 | normalizeResolvedModel | Reescritas de transporte antes do runner |
normalizeConfigverifica primeiro o provedor correspondente e, depois, outros plugins de provedor com hooks até que um realmente altere a configuração. Se nenhum hook de provedor reescrever uma entrada de configuração compatível com a família Google, o normalizador de configuração Google empacotado ainda será aplicado.resolveConfigApiKeyusa o hook do provedor quando ele é exposto. O caminho empacotadoamazon-bedrocktambém tem um resolvedor integrado de marcador de ambiente AWS aqui, embora a autenticação de runtime do Bedrock ainda use a cadeia padrão do AWS SDK. | 13 |contributeResolvedModelCompat| Flags de compatibilidade para modelos de fornecedor por trás de outro transporte compatível | | 14 |capabilities| Bolsa estática de capacidades legada; apenas compatibilidade | | 15 |normalizeToolSchemas| Limpeza de esquema de ferramenta sob propriedade do provedor antes do registro | | 16 |inspectToolSchemas| Diagnósticos de esquema de ferramenta sob propriedade do provedor | | 17 |resolveReasoningOutputMode| Contrato de saída de raciocínio com tag vs nativo | | 18 |prepareExtraParams| Parâmetros padrão de solicitação | | 19 |createStreamFn| TransporteStreamFntotalmente personalizado | | 20 |wrapStreamFn| Wrappers personalizados de header/corpo no caminho normal de stream | | 21 |resolveTransportTurnState| Headers/metadados nativos por turno | | 22 |resolveWebSocketSessionPolicy| Headers/resfriamento de sessão WS nativos | | 23 |formatApiKey| Formato personalizado de token em runtime | | 24 |refreshOAuth| Atualização personalizada de OAuth | | 25 |buildAuthDoctorHint| Orientação para reparo de autenticação | | 26 |matchesContextOverflowError| Detecção de overflow sob propriedade do provedor | | 27 |classifyFailoverReason| Classificação sob propriedade do provedor de limite de taxa/sobrecarga | | 28 |isCacheTtlEligible| Controle de TTL do cache de prompt | | 29 |buildMissingAuthMessage| Dica personalizada para autenticação ausente | | 30 |suppressBuiltInModel| Ocultar linhas upstream desatualizadas | | 31 |augmentModelCatalog| Linhas sintéticas de compatibilidade futura | | 32 |isBinaryThinking| Thinking binário ligado/desligado | | 33 |supportsXHighThinking| Suporte a raciocínioxhigh| | 34 |resolveDefaultThinkingLevel| Política padrão de/think| | 35 |isModernModelRef| Correspondência de modelo live/smoke | | 36 |prepareRuntimeAuth| Troca de token antes da inferência | | 37 |resolveUsageAuth| Análise personalizada de credencial de uso | | 38 |fetchUsageSnapshot| Endpoint personalizado de uso | | 39 |createEmbeddingProvider| Adaptador de embedding sob propriedade do provedor para memória/pesquisa | | 40 |buildReplayPolicy| Política personalizada de replay/compactação de transcrição | | 41 |sanitizeReplayHistory| Reescritas específicas do provedor após a limpeza genérica | | 42 |validateReplayTurns| Validação estrita de turnos de replay antes do runner embutido | | 43 |onModelSelected| Callback após seleção (por exemplo, telemetria) |
Adicione capacidades extras (opcional)
Um plugin de provedor pode registrar fala, transcrição em tempo real, voz em
tempo real, entendimento de mídia, geração de imagens, geração de vídeo, busca na web
e pesquisa na web junto com inferência de texto:O OpenClaw classifica isso como um plugin de capacidade híbrida. Esse é o
padrão recomendado para plugins de empresa (um plugin por fornecedor). Consulte
Internals: Capability Ownership.
Publicar no ClawHub
Plugins de provedor são publicados da mesma forma que qualquer outro plugin de código externo:clawhub package publish.
Estrutura de arquivos
Referência da ordem do catálogo
catalog.order controla quando seu catálogo é mesclado em relação aos
provedores integrados:
| Ordem | Quando | Caso de uso |
|---|---|---|
simple | Primeira passagem | Provedores simples com chave de API |
profile | Depois de simple | Provedores condicionados a perfis de autenticação |
paired | Depois de profile | Sintetizar várias entradas relacionadas |
late | Última passagem | Substituir provedores existentes (vence em colisão) |
Próximos passos
- Channel Plugins — se seu plugin também fornecer um canal
- SDK Runtime — helpers
api.runtime(TTS, search, subagent) - SDK Overview — referência completa de importação por subcaminho
- Plugin Internals — detalhes dos hooks e exemplos empacotados