Creación de plugins de proveedor
Esta guía te lleva paso a paso por la creación de un plugin de proveedor que añade un proveedor de modelos (LLM) a OpenClaw. Al final tendrás un proveedor con un catálogo de modelos, autenticación por clave API y resolución dinámica de modelos.Si todavía no has creado ningún plugin de OpenClaw, lee primero
Primeros pasos para conocer la estructura básica del
paquete y la configuración del manifiesto.
Recorrido
Paquete y manifiesto
providerAuthEnvVars para que OpenClaw pueda detectar
credenciales sin cargar el tiempo de ejecución de tu plugin. modelSupport es opcional
y permite que OpenClaw cargue automáticamente tu plugin de proveedor a partir de identificadores abreviados de modelo
como acme-large antes de que existan hooks de tiempo de ejecución. Si publicas el
proveedor en ClawHub, esos campos openclaw.compat y openclaw.build
son obligatorios en package.json.Registrar el proveedor
Un proveedor mínimo necesita Ese es un proveedor funcional. Las personas usuarias ya pueden usar
Si tu flujo de autenticación también necesita aplicar parches a
id, label, auth y catalog:index.ts
openclaw onboard --acme-ai-api-key <key> y seleccionar
acme-ai/acme-large como su modelo.Para proveedores incluidos que solo registran un proveedor de texto con autenticación
por clave API más un único tiempo de ejecución respaldado por catálogo, prefiere el helper más específico
defineSingleProviderPluginEntry(...):models.providers.*, alias y
el modelo predeterminado del agente durante el onboarding, usa los helpers predefinidos de
openclaw/plugin-sdk/provider-onboard. Los helpers más específicos son
createDefaultModelPresetAppliers(...),
createDefaultModelsPresetAppliers(...) y
createModelCatalogPresetAppliers(...).Cuando un endpoint nativo del proveedor admite bloques de uso en streaming en la ruta
normal openai-completions, prefiere los helpers de catálogo compartidos en
openclaw/plugin-sdk/provider-catalog-shared en lugar de codificar comprobaciones por id de proveedor. supportsNativeStreamingUsageCompat(...) y
applyProviderNativeStreamingUsageCompat(...) detectan la compatibilidad a partir del mapa de capacidades del
endpoint, de modo que los endpoints nativos estilo Moonshot/DashScope sigan
participando incluso cuando un plugin use un id de proveedor personalizado.Añadir resolución dinámica de modelos
Si tu proveedor acepta identificadores de modelo arbitrarios (como un proxy o router),
añade Si la resolución requiere una llamada de red, usa
resolveDynamicModel:prepareDynamicModel para el
calentamiento asíncrono; resolveDynamicModel se ejecuta de nuevo cuando termina.Añadir hooks de tiempo de ejecución (según sea necesario)
La mayoría de proveedores solo necesitan Familias de reproducción disponibles hoy:
Ejemplos reales incluidos:
Ejemplos reales incluidos:
catalog + resolveDynamicModel. Añade hooks
de forma incremental según lo requiera tu proveedor.Los builders de helpers compartidos ahora cubren las familias más comunes de reproducción/compatibilidad de herramientas,
por lo que los plugins normalmente no necesitan cablear cada hook manualmente uno a uno:| Familia | Qué incorpora |
|---|---|
openai-compatible | Política compartida de reproducción estilo OpenAI para transportes compatibles con OpenAI, incluido saneamiento de id de llamadas de herramientas, correcciones de orden asistente-primero y validación genérica de turnos Gemini donde el transporte lo necesita |
anthropic-by-model | Política de reproducción compatible con Claude elegida por modelId, de modo que los transportes Anthropic-message solo reciben limpieza de bloques de razonamiento específica de Claude cuando el modelo resuelto es realmente un id de Claude |
google-gemini | Política nativa de reproducción Gemini más saneamiento de reproducción de bootstrap y modo de salida de razonamiento etiquetado |
passthrough-gemini | Saneamiento de firmas de pensamiento Gemini para modelos Gemini que se ejecutan a través de transportes proxy compatibles con OpenAI; no habilita validación de reproducción nativa Gemini ni reescrituras de bootstrap |
hybrid-anthropic-openai | Política híbrida para proveedores que mezclan superficies de modelos Anthropic-message y compatibles con OpenAI en un solo plugin; la eliminación opcional de bloques de razonamiento solo para Claude queda limitada al lado Anthropic |
googleygoogle-gemini-cli:google-geminiopenrouter,kilocode,opencodeyopencode-go:passthrough-geminiamazon-bedrockyanthropic-vertex:anthropic-by-modelminimax:hybrid-anthropic-openaimoonshot,ollama,xaiyzai:openai-compatible
| Familia | Qué incorpora |
|---|---|
google-thinking | Normalización de carga útil de pensamiento Gemini en la ruta de stream compartida |
kilocode-thinking | Envoltorio de razonamiento Kilo en la ruta compartida de stream proxy, con kilo/auto e ids de razonamiento proxy no compatibles omitiendo el pensamiento inyectado |
moonshot-thinking | Mapeo binario de carga útil de pensamiento nativo Moonshot a partir de la configuración + nivel /think |
minimax-fast-mode | Reescritura de modelo fast-mode de MiniMax en la ruta compartida de stream |
openai-responses-defaults | Envoltorios compartidos nativos de OpenAI/Codex Responses: encabezados de atribución, /fast/serviceTier, verbosidad de texto, búsqueda web nativa de Codex, conformación de carga útil de compatibilidad de razonamiento y gestión de contexto de Responses |
openrouter-thinking | Envoltorio de razonamiento de OpenRouter para rutas proxy, con omisiones de modelo no compatible/auto gestionadas de forma centralizada |
tool-stream-default-on | Envoltorio tool_stream activado por defecto para proveedores como z.ai que quieren streaming de herramientas salvo que se desactive explícitamente |
googleygoogle-gemini-cli:google-thinkingkilocode:kilocode-thinkingmoonshot:moonshot-thinkingminimaxyminimax-portal:minimax-fast-modeopenaiyopenai-codex:openai-responses-defaultsopenrouter:openrouter-thinkingzai:tool-stream-default-on
openclaw/plugin-sdk/provider-model-shared también exporta la enumeración de familias de reproducción
además de los helpers compartidos sobre los que se construyen esas familias. Las
exportaciones públicas comunes incluyen:ProviderReplayFamilybuildProviderReplayFamilyHooks(...)- builders de reproducción compartidos como
buildOpenAICompatibleReplayPolicy(...),buildAnthropicReplayPolicyForModel(...),buildGoogleGeminiReplayPolicy(...)ybuildHybridAnthropicOrOpenAIReplayPolicy(...) - helpers de reproducción Gemini como
sanitizeGoogleGeminiReplayHistory(...)yresolveTaggedReasoningOutputMode() - helpers de endpoint/modelo como
resolveProviderEndpoint(...),normalizeProviderId(...),normalizeGooglePreviewModelId(...)ynormalizeNativeXaiModelId(...)
openclaw/plugin-sdk/provider-stream expone tanto el builder de familias como
los helpers públicos de envoltorio que esas familias reutilizan. Las exportaciones públicas
comunes incluyen:ProviderStreamFamilybuildProviderStreamFamilyHooks(...)composeProviderStreamWrappers(...)- envoltorios compartidos de OpenAI/Codex como
createOpenAIAttributionHeadersWrapper(...),createOpenAIFastModeWrapper(...),createOpenAIServiceTierWrapper(...),createOpenAIResponsesContextManagementWrapper(...)ycreateCodexNativeWebSearchWrapper(...) - envoltorios compartidos de proxy/proveedor como
createOpenRouterWrapper(...),createToolStreamWrapper(...)ycreateMinimaxFastModeWrapper(...)
@openclaw/anthropic-provider exporta
wrapAnthropicProviderStream, resolveAnthropicBetas,
resolveAnthropicFastMode, resolveAnthropicServiceTier y los
builders de envoltorio Anthropic de nivel inferior desde su punto de unión público api.ts /
contract-api.ts. Esos helpers siguen siendo específicos de Anthropic porque
también codifican el manejo beta de OAuth de Claude y la restricción context1m.Otros proveedores incluidos también mantienen envoltorios específicos del transporte como locales cuando
el comportamiento no se comparte limpiamente entre familias. Ejemplo actual: el
plugin xAI incluido mantiene la conformación nativa de xAI Responses en su propio
wrapStreamFn, incluida reescritura de alias /fast, tool_stream
predeterminado, limpieza de herramientas estrictas no compatibles y eliminación de
carga útil de razonamiento específica de xAI.openclaw/plugin-sdk/provider-tools actualmente expone una familia compartida
de esquema de herramientas más helpers compartidos de esquema/compatibilidad:ProviderToolCompatFamilydocumenta hoy el inventario de familias compartidas.buildProviderToolCompatFamilyHooks("gemini")conecta limpieza de esquema Gemini + diagnósticos para proveedores que necesitan esquemas de herramientas seguros para Gemini.normalizeGeminiToolSchemas(...)einspectGeminiToolSchemas(...)son los helpers públicos subyacentes de esquema Gemini.resolveXaiModelCompatPatch()devuelve el parche de compatibilidad incluido de xAI:toolSchemaProfile: "xai", palabras clave de esquema no compatibles, compatibilidad nativa conweb_searchy decodificación de argumentos de llamadas de herramientas con entidades HTML.applyXaiModelCompat(model)aplica ese mismo parche de compatibilidad de xAI a un modelo resuelto antes de que llegue al ejecutor.
normalizeResolvedModel más
contributeResolvedModelCompat para mantener esos metadatos de compatibilidad como propiedad del
proveedor en lugar de codificar reglas de xAI en el núcleo.El mismo patrón de raíz de paquete también respalda a otros proveedores incluidos:@openclaw/openai-provider:api.tsexporta builders de proveedor, helpers de modelo predeterminado y builders de proveedor de tiempo real@openclaw/openrouter-provider:api.tsexporta el builder del proveedor más helpers de onboarding/configuración
- Intercambio de token
- Encabezados personalizados
- Identidad nativa del transporte
- Uso y facturación
Para proveedores que necesitan un intercambio de token antes de cada llamada de inferencia:
Todos los hooks de proveedor disponibles
Todos los hooks de proveedor disponibles
OpenClaw llama a los hooks en este orden. La mayoría de proveedores solo usan 2-3:
Notas sobre el respaldo en tiempo de ejecución:
| # | Hook | Cuándo usarlo |
|---|---|---|
| 1 | catalog | Catálogo de modelos o valores predeterminados de baseUrl |
| 2 | applyConfigDefaults | Valores predeterminados globales del proveedor durante la materialización de configuración |
| 3 | normalizeModelId | Limpieza de alias de id de modelo heredados/preview antes de la búsqueda |
| 4 | normalizeTransport | Limpieza de api / baseUrl de la familia del proveedor antes del ensamblado genérico del modelo |
| 5 | normalizeConfig | Normalizar configuración models.providers.<id> |
| 6 | applyNativeStreamingUsageCompat | Reescrituras de compatibilidad de uso en streaming nativo para proveedores de configuración |
| 7 | resolveConfigApiKey | Resolución de autenticación de marcador de entorno propiedad del proveedor |
| 8 | resolveSyntheticAuth | Autenticación sintética local/autohospedada o respaldada por configuración |
| 9 | shouldDeferSyntheticProfileAuth | Rebajar los marcadores de perfil almacenado sintéticos detrás de autenticación env/config |
| 10 | resolveDynamicModel | Aceptar ids arbitrarios de modelo upstream |
| 11 | prepareDynamicModel | Obtención asíncrona de metadatos antes de resolver |
| 12 | normalizeResolvedModel | Reescrituras de transporte antes del ejecutor |
-
normalizeConfigcomprueba primero el proveedor coincidente y luego otros plugins de proveedor capaces de usar hooks hasta que uno realmente cambia la configuración. Si ningún hook de proveedor reescribe una entrada compatible de la familia Google, la normalización de configuración de Google incluida sigue aplicándose. -
resolveConfigApiKeyusa el hook del proveedor cuando se expone. La ruta incluidaamazon-bedrocktambién tiene aquí un resolvedor integrado de marcadores de entorno de AWS, aunque la autenticación de tiempo de ejecución de Bedrock en sí sigue usando la cadena predeterminada del SDK de AWS. | 13 |contributeResolvedModelCompat| Indicadores de compatibilidad para modelos de proveedor detrás de otro transporte compatible | | 14 |capabilities| Bolsa estática heredada de capacidades; solo compatibilidad | | 15 |normalizeToolSchemas| Limpieza de esquema de herramientas propiedad del proveedor antes del registro | | 16 |inspectToolSchemas| Diagnósticos de esquema de herramientas propiedad del proveedor | | 17 |resolveReasoningOutputMode| Contrato de salida de razonamiento etiquetado frente a nativo | | 18 |prepareExtraParams| Parámetros de solicitud predeterminados | | 19 |createStreamFn| TransporteStreamFntotalmente personalizado | | 20 |wrapStreamFn| Envoltorios personalizados de encabezados/cuerpo en la ruta de stream normal | | 21 |resolveTransportTurnState| Encabezados/metadatos nativos por turno | | 22 |resolveWebSocketSessionPolicy| Encabezados nativos de sesión WS/enfriamiento | | 23 |formatApiKey| Forma personalizada del token en tiempo de ejecución | | 24 |refreshOAuth| Actualización personalizada de OAuth | | 25 |buildAuthDoctorHint| Guía de reparación de autenticación | | 26 |matchesContextOverflowError| Detección de desbordamiento propiedad del proveedor | | 27 |classifyFailoverReason| Clasificación de límite de tasa/sobrecarga propiedad del proveedor | | 28 |isCacheTtlEligible| Restricción de TTL de caché de prompts | | 29 |buildMissingAuthMessage| Pista personalizada de autenticación faltante | | 30 |suppressBuiltInModel| Ocultar filas upstream obsoletas | | 31 |augmentModelCatalog| Filas sintéticas de compatibilidad futura | | 32 |isBinaryThinking| Pensamiento binario activado/desactivado | | 33 |supportsXHighThinking| Compatibilidad con razonamientoxhigh| | 34 |resolveDefaultThinkingLevel| Política predeterminada de/think| | 35 |isModernModelRef| Coincidencia de modelo live/smoke | | 36 |prepareRuntimeAuth| Intercambio de token antes de la inferencia | | 37 |resolveUsageAuth| Análisis personalizado de credenciales de uso | | 38 |fetchUsageSnapshot| Endpoint personalizado de uso | | 39 |createEmbeddingProvider| Adaptador de embeddings propiedad del proveedor para memoria/búsqueda | | 40 |buildReplayPolicy| Política personalizada de reproducción/compactación de transcripciones | | 41 |sanitizeReplayHistory| Reescrituras de reproducción específicas del proveedor después de la limpieza genérica | | 42 |validateReplayTurns| Validación estricta de turnos de reproducción antes del ejecutor integrado | | 43 |onModelSelected| Callback posterior a la selección (por ejemplo, telemetría) | Para descripciones detalladas y ejemplos reales, consulta Internals: Provider Runtime Hooks.
Añadir capacidades extra (opcional)
Un plugin de proveedor puede registrar voz, transcripción en tiempo real, voz en tiempo real,
comprensión multimedia, generación de imágenes, generación de video, recuperación web
y búsqueda web junto con la inferencia de texto:OpenClaw clasifica esto como un plugin de capacidad híbrida. Este es el
patrón recomendado para plugins de empresa (un plugin por proveedor). Consulta
Internals: Capability Ownership.
Publicar en ClawHub
Los plugins de proveedor se publican igual que cualquier otro plugin de código externo:clawhub package publish.
Estructura de archivos
Referencia del orden del catálogo
catalog.order controla cuándo se fusiona tu catálogo en relación con los
proveedores integrados:
| Orden | Cuándo | Caso de uso |
|---|---|---|
simple | Primera pasada | Proveedores simples con clave API |
profile | Después de simple | Proveedores restringidos por perfiles de autenticación |
paired | Después de profile | Sintetizar múltiples entradas relacionadas |
late | Última pasada | Anular proveedores existentes (gana en colisión) |
Siguientes pasos
- Plugins de canal — si tu plugin también proporciona un canal
- Tiempo de ejecución del SDK — helpers
api.runtime(TTS, búsqueda, subagente) - Resumen del SDK — referencia completa de importaciones de subrutas
- Internals de plugins — detalles de hooks y ejemplos incluidos