Skip to main content
Cree un plugin de proveedor para añadir un proveedor de modelos (LLM) a OpenClaw: un catálogo de modelos, autenticación mediante clave de API y resolución dinámica de modelos.
¿Es la primera vez que usa plugins de OpenClaw? Lea primero Primeros pasos para conocer la estructura del paquete y la configuración del manifiesto.
Los plugins de proveedor añaden modelos al bucle de inferencia normal de OpenClaw. Si el modelo debe ejecutarse mediante un daemon de agente nativo que gestiona hilos, Compaction o eventos de herramientas, combine el proveedor con un entorno de agente en lugar de incluir los detalles del protocolo del daemon en el núcleo.

Guía paso a paso

1

Paquete y manifiesto

Paso 1: Paquete y manifiesto

setup.providers[].envVars permite que OpenClaw detecte credenciales sin cargar el entorno de ejecución del plugin. Añada providerAuthAliases cuando una variante del proveedor deba reutilizar la autenticación del identificador de otro proveedor. modelSupport es opcional y permite que OpenClaw cargue automáticamente el plugin de proveedor a partir de identificadores abreviados de modelos como acme-large antes de que existan los enlaces del entorno de ejecución. openclaw.compat y openclaw.build en package.json son obligatorios para publicar en ClawHub (openclaw.compat.pluginApi y openclaw.build.openclawVersion son los dos campos obligatorios; minGatewayVersion utiliza openclaw.install.minHostVersion de forma predeterminada cuando se omite).
2

Registrar el proveedor

Un proveedor de texto mínimo necesita id, label, auth y catalog. catalog es el enlace de entorno de ejecución/configuración propiedad del proveedor; puede llamar a las API activas del proveedor y devuelve entradas models.providers.
index.ts
registerModelCatalogProvider es la nueva superficie de catálogo del plano de control para las interfaces de lista, ayuda y selección, que abarca filas text, voice, image_generation, video_generation y music_generation. Mantenga las llamadas a los endpoints del proveedor y la asignación de respuestas en el plugin; OpenClaw gestiona la forma compartida de las filas, las etiquetas de origen y la representación de la ayuda.Con esto ya dispone de un proveedor funcional. Ahora los usuarios pueden ejecutar openclaw onboard --acme-ai-api-key <key> y seleccionar acme-ai/acme-large como modelo.

Detección de modelos en tiempo real

Si el proveedor ofrece una API /models compatible con OpenAI, habilite la detección compartida en el asistente de proveedor único:
liveModelDiscovery: true es un contrato público del SDK de Plugin con los siguientes comportamientos:Para un endpoint de lista que no use Bearer o que no sea estándar, pase opciones en lugar de true:
No use endpointUrl como host alternativo incondicional. Su comprobación requireBaseUrl constituye el límite de aislamiento de credenciales para los proveedores cuyo host de lista de modelos difiere del host de inferencia.Si el proveedor necesita una semántica de modelos personalizada en lugar de la proyección conservadora compatible con OpenAI, mantenga esa proyección en el plugin y use openclaw/plugin-sdk/provider-catalog-live-runtime para el ciclo de vida compartido de las solicitudes. El asistente proporciona solicitudes HTTP protegidas, encabezados de autenticación del proveedor, errores HTTP estructurados, almacenamiento en caché con TTL y comportamiento de reserva estático sin incluir políticas específicas del proveedor en el núcleo de OpenClaw.Use buildLiveModelProviderConfig cuando la API activa solo indique qué filas del catálogo estático propiedad del proveedor están disponibles actualmente:
index.ts
Use getCachedLiveProviderModelRows cuando la API del proveedor devuelva metadatos más completos y el plugin necesite proyectar por sí mismo las filas en definiciones de modelos de OpenClaw:
index.ts
run debe permanecer condicionado por la autenticación y devolver null cuando no haya credenciales utilizables disponibles. Mantenga un staticRun sin conexión o un recurso alternativo estático para que la configuración, la documentación, las pruebas y las superficies de selección no dependan del acceso en vivo a la red. Use un TTL adecuado para la vigencia de la lista de modelos, evite sondear el sistema de archivos durante las solicitudes y proporcione un readRows / readModelId específico del proveedor solo cuando la respuesta del servicio de origen no tenga una estructura { data: [{ id, object }] } compatible con OpenAI.Si el proveedor de origen usa tokens de control distintos de los de OpenClaw, añada una pequeña transformación de texto bidireccional en lugar de sustituir la ruta de transmisión:
input reescribe el prompt final del sistema y el contenido de los mensajes de texto antes del transporte. output reescribe los deltas de texto del asistente y el texto final antes de que OpenClaw analice sus propios marcadores de control o realice la entrega al canal.Para proveedores incluidos que solo registran un proveedor de texto con autenticación mediante clave de API y un único entorno de ejecución respaldado por catálogo, prefiera el asistente más específico defineSingleProviderPluginEntry(...):
buildProvider es la ruta del catálogo en vivo que se usa cuando OpenClaw puede resolver la autenticación real del proveedor. Puede realizar un descubrimiento específico del proveedor. Use buildStaticProvider solo para filas sin conexión que sea seguro mostrar antes de configurar la autenticación; no debe requerir credenciales ni realizar solicitudes de red. Actualmente, la visualización models list --all de OpenClaw ejecuta catálogos estáticos solo para plugins de proveedores incluidos, con una configuración vacía, un entorno vacío y sin rutas de agente ni de espacio de trabajo.Si el flujo de autenticación también necesita modificar models.providers.*, alias y el modelo predeterminado del agente durante la incorporación, use los asistentes de ajustes preestablecidos de openclaw/plugin-sdk/provider-onboard. Los asistentes más específicos son createDefaultModelPresetAppliers(...), createDefaultModelsPresetAppliers(...) y createModelCatalogPresetAppliers(...).Cuando el punto de conexión nativo de un proveedor admita bloques de uso transmitidos en el transporte openai-completions normal, prefiera los asistentes de catálogo compartidos de openclaw/plugin-sdk/provider-catalog-shared en lugar de codificar de forma fija comprobaciones del identificador del proveedor. supportsNativeStreamingUsageCompat(...) y applyProviderNativeStreamingUsageCompat(...) detectan la compatibilidad mediante el mapa de capacidades del punto de conexión, por lo que los puntos de conexión nativos del estilo Moonshot/DashScope siguen habilitándose incluso cuando un plugin usa un identificador de proveedor personalizado.Los ejemplos de descubrimiento en vivo anteriores abarcan las API de proveedores del estilo /models. Mantenga ese descubrimiento dentro de catalog.run, condicionado a una autenticación utilizable, y mantenga staticRun sin acceso a la red para generar catálogos sin conexión.
3

Añadir resolución dinámica de modelos

Si el proveedor acepta identificadores de modelo arbitrarios (como un proxy o enrutador), añada resolveDynamicModel:
Si la resolución requiere una llamada de red, use prepareDynamicModel para el calentamiento asíncrono; resolveDynamicModel vuelve a ejecutarse cuando este finaliza.
4

Añadir hooks de entorno de ejecución (según sea necesario)

La mayoría de los proveedores solo necesitan catalog + resolveDynamicModel. Añada hooks gradualmente a medida que el proveedor los requiera.Los generadores de asistentes compartidos ahora abarcan las familias más comunes de compatibilidad con la reproducción y las herramientas, por lo que normalmente los plugins no necesitan conectar manualmente cada hook uno por uno:
Familias de reproducción disponibles actualmente:Familias de transmisión disponibles actualmente:
Cada constructor de familias se compone a partir de auxiliares públicos de menor nivel exportados desde el mismo paquete, a los que se puede recurrir cuando un proveedor debe apartarse del patrón común:
  • openclaw/plugin-sdk/provider-model-shared - ProviderReplayFamily, buildProviderReplayFamilyHooks(...) y los constructores de reproducción sin procesar (buildOpenAICompatibleReplayPolicy, buildAnthropicReplayPolicyForModel, buildGoogleGeminiReplayPolicy, buildHybridAnthropicOrOpenAIReplayPolicy). También exporta auxiliares de reproducción de Gemini (sanitizeGoogleGeminiReplayHistory, resolveTaggedReasoningOutputMode) y auxiliares de endpoints/modelos (resolveProviderEndpoint, normalizeProviderId, normalizeGooglePreviewModelId).
  • openclaw/plugin-sdk/provider-stream - ProviderStreamFamily, buildProviderStreamFamilyHooks(...), composeProviderStreamWrappers(...), además de los contenedores compartidos de OpenAI/Codex (createOpenAIAttributionHeadersWrapper, createOpenAIFastModeWrapper, createOpenAIServiceTierWrapper, createOpenAIResponsesContextManagementWrapper, createCodexNativeWebSearchWrapper), el contenedor compatible con OpenAI de DeepSeek V4 (createDeepSeekV4OpenAICompatibleThinkingWrapper), la limpieza del prellenado de pensamiento de Anthropic Messages (createAnthropicThinkingPrefillPayloadWrapper), la compatibilidad de llamadas de herramientas con texto sin formato (createPlainTextToolCallCompatWrapper) y los contenedores compartidos de proxies/proveedores (createOpenRouterWrapper, createToolStreamWrapper, createMinimaxFastModeWrapper).
  • openclaw/plugin-sdk/provider-stream-shared - contenedores ligeros de cargas útiles y eventos para rutas críticas de proveedores, incluidos createOpenAICompatibleCompletionsThinkingOffWrapper, createPayloadPatchStreamWrapper, createPlainTextToolCallCompatWrapper, normalizeOpenAICompatibleReasoningPayload(...) y setQwenChatTemplateThinking(...).
  • openclaw/plugin-sdk/provider-tools - ProviderToolCompatFamily, buildProviderToolCompatFamilyHooks("deepseek" | "gemini" | "openai") y auxiliares subyacentes de esquemas de proveedores.
Para los proveedores de la familia Gemini, se debe mantener el modo de salida de razonamiento alineado con el transporte. Los proveedores directos de la API de Google Gemini deben usar la salida de razonamiento native para que OpenClaw consuma las partes de pensamiento nativas sin añadir las directivas de prompt <think> / <final>. Los backends de estilo CLI de Gemini exclusivamente de texto que analizan una respuesta final JSON/de texto pueden conservar el contrato etiquetado compartido google-gemini.Algunos auxiliares de flujo permanecen locales al proveedor de forma intencionada. @openclaw/anthropic-provider mantiene wrapAnthropicProviderStream, resolveAnthropicBetas, resolveAnthropicFastMode, resolveAnthropicServiceTier y los constructores de contenedores de Anthropic de menor nivel en su propio punto de integración público api.ts / contract-api.ts, porque codifican la gestión de la versión beta de OAuth de Claude y el control de context1m. Del mismo modo, el plugin de xAI mantiene la adaptación nativa de Responses de xAI en su propio wrapStreamFn (alias /fast, valor predeterminado tool_stream, limpieza de herramientas estrictas no compatibles y eliminación de la carga útil de razonamiento específica de xAI).El mismo patrón de raíz del paquete también sustenta @openclaw/openai-provider (constructores de proveedores, auxiliares de modelos predeterminados y constructores de proveedores en tiempo real) y @openclaw/openrouter-provider (constructor de proveedores junto con auxiliares de incorporación/configuración).
Para proveedores que requieren un intercambio de tokens antes de cada llamada de inferencia:
OpenClaw llama a los hooks aproximadamente en este orden para los plugins de modelos/proveedores. La mayoría de los proveedores solo utilizan 2-3. Este no es el contrato ProviderPlugin completo; consulte Aspectos internos: hooks del entorno de ejecución de proveedores para ver la lista completa y actualizada de hooks y las notas sobre alternativas. Los campos de proveedores exclusivos para compatibilidad que OpenClaw ya no invoca, como ProviderPlugin.capabilities y suppressBuiltInModel, no se incluyen aquí.Notas sobre las alternativas del entorno de ejecución:
  • normalizeConfig resuelve un Plugin propietario por id de proveedor (primero los proveedores integrados y luego el Plugin de tiempo de ejecución coincidente) y llama únicamente a ese hook; no se examinan otros proveedores. El hook normalizeConfig propio de Google es el que normaliza las entradas de configuración google / google-vertex / google-antigravity; no es un mecanismo de reserva independiente del núcleo.
  • resolveConfigApiKey usa el hook del proveedor cuando está expuesto. Amazon Bedrock mantiene la resolución de marcadores de entorno de AWS en su Plugin de proveedor; la autenticación en tiempo de ejecución sigue usando la cadena predeterminada del SDK de AWS cuando se configura con auth: "aws-sdk".
  • resolveThinkingProfile(ctx) recibe los elementos seleccionados provider, modelId, la indicación opcional combinada del catálogo reasoning y los datos opcionales combinados del modelo compat. Use compat únicamente para seleccionar la interfaz o el perfil de razonamiento del proveedor.
  • resolveSystemPromptContribution permite que un proveedor inserte orientación para el prompt del sistema que tenga en cuenta la caché de una familia de modelos. Se prefiere frente al hook heredado before_prompt_build para todo el Plugin cuando el comportamiento corresponde a una familia de proveedor o modelo y debe preservar la división estable/dinámica de la caché.
5

Añadir capacidades adicionales (opcional)

Paso 5: Añadir capacidades adicionales

Un Plugin de proveedor puede registrar embeddings, voz, transcripción en tiempo real, voz en tiempo real, comprensión multimedia, generación de imágenes, generación de vídeo, obtención web y búsqueda web junto con la inferencia de texto. OpenClaw lo clasifica como un Plugin de capacidades híbridas, el patrón recomendado para los Plugins de empresas (un Plugin por proveedor). Consulte Aspectos internos: propiedad de las capacidades.Registre cada capacidad dentro de register(api) junto con su llamada api.registerProvider(...) existente. Elija únicamente las pestañas que necesite:
Use assertOkOrThrowProviderError(...) para los errores HTTP del proveedor, de modo que los Plugins compartan lecturas limitadas del cuerpo de los errores, análisis de errores JSON y sufijos de identificadores de solicitud.
6

Prueba

Paso 6: Prueba

src/provider.test.ts

Publicación en ClawHub

Los plugins de proveedores se publican del mismo modo que cualquier otro plugin de código externo:
clawhub skill publish <path> es un comando diferente para publicar una carpeta de Skills, no un paquete de plugin; no lo use aquí.

Estructura de archivos

catalog.order controla cuándo se combina el catálogo en relación con los proveedores integrados:

Próximos pasos

Relacionado