¿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.
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 No use Use
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: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
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 Si la resolución requiere una llamada de red, use
resolveDynamicModel: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 Familias de reproducción disponibles actualmente:
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 transmisión disponibles actualmente:
Puntos de integración del SDK que sustentan los constructores de familias
Puntos de integración del SDK que sustentan los constructores de familias
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, incluidoscreateOpenAICompatibleCompletionsThinkingOffWrapper,createPayloadPatchStreamWrapper,createPlainTextToolCallCompatWrapper,normalizeOpenAICompatibleReasoningPayload(...)ysetQwenChatTemplateThinking(...).openclaw/plugin-sdk/provider-tools-ProviderToolCompatFamily,buildProviderToolCompatFamilyHooks("deepseek" | "gemini" | "openai")y auxiliares subyacentes de esquemas de proveedores.
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).- Intercambio de tokens
- Encabezados personalizados
- Identidad de transporte nativa
- Uso y facturación
Para proveedores que requieren un intercambio de tokens antes de cada llamada de inferencia:
Hooks comunes de proveedores
Hooks comunes de proveedores
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:
normalizeConfigresuelve 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 hooknormalizeConfigpropio de Google es el que normaliza las entradas de configuracióngoogle/google-vertex/google-antigravity; no es un mecanismo de reserva independiente del núcleo.resolveConfigApiKeyusa 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 conauth: "aws-sdk".resolveThinkingProfile(ctx)recibe los elementos seleccionadosprovider,modelId, la indicación opcional combinada del catálogoreasoningy los datos opcionales combinados del modelocompat. Usecompatúnicamente para seleccionar la interfaz o el perfil de razonamiento del proveedor.resolveSystemPromptContributionpermite 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 heredadobefore_prompt_buildpara 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 deregister(api) junto con su llamada
api.registerProvider(...) existente. Elija únicamente las pestañas que necesite:- Voz (TTS)
- Transcripción en tiempo real
- Voz en tiempo real
- Comprensión multimedia
- Embeddings
- Generación de imágenes y vídeo
- Obtención y búsqueda web
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
Referencia del orden del catálogo
catalog.order controla cuándo se combina el catálogo en relación con los proveedores
integrados:
Próximos pasos
- Plugins de canal - si el plugin también proporciona un canal
- Entorno de ejecución del SDK - asistentes de
api.runtime(TTS, búsqueda, subagente) - Descripción general del SDK - referencia completa de importaciones de subrutas
- Funcionamiento interno de los plugins - detalles de los hooks y ejemplos integrados