¿Nuevo en los plugins de OpenClaw? Lee primero Primeros pasos
para conocer la estructura del paquete y la configuración del manifiesto.
Guía paso a paso
Paquete y manifiesto
Paso 1: Paquete y manifiesto
setup.providers[].envVars permite que OpenClaw detecte credenciales sin
cargar el runtime de tu Plugin. Agrega providerAuthAliases cuando una variante
de proveedor deba reutilizar la autenticación de otro id de proveedor. modelSupport es
opcional y permite que OpenClaw cargue automáticamente tu Plugin proveedor a partir de ids
de modelo abreviados como acme-large antes de que existan los hooks de runtime. openclaw.compat
y openclaw.build en package.json son obligatorios para la publicación en ClawHub
(openclaw.compat.pluginApi y openclaw.build.openclawVersion
son los dos campos obligatorios; minGatewayVersion recurre a
openclaw.install.minHostVersion cuando se omite).Registrar el proveedor
Un proveedor de texto mínimo necesita un Usa
id, label, auth y catalog.
catalog es el hook de runtime/configuración propiedad del proveedor; puede llamar a APIs
del proveedor en vivo y devuelve entradas models.providers.index.ts
registerModelCatalogProvider es la superficie de catálogo del plano de control más reciente
para la IU de listas/ayuda/selector, y cubre filas text, voice, image_generation,
video_generation y music_generation. Mantén las llamadas a endpoints del proveedor
y el mapeo de respuestas en el Plugin; OpenClaw posee la forma compartida de las filas,
las etiquetas de origen y el renderizado de ayuda.Ese es un proveedor funcional. Los usuarios ahora pueden ejecutar
openclaw onboard --acme-ai-api-key <key> y seleccionar
acme-ai/acme-large como su modelo.Descubrimiento de modelos en vivo
Si tu proveedor expone una API de estilo/models, mantén el endpoint específico
del proveedor y la proyección de filas en tu Plugin, y usa
openclaw/plugin-sdk/provider-catalog-live-runtime para el ciclo de vida compartido
de fetch. El helper te da fetches HTTP protegidos, encabezados de autenticación del proveedor,
errores HTTP estructurados, caché con TTL y comportamiento de fallback estático sin
poner política de proveedor en el núcleo de OpenClaw.Usa buildLiveModelProviderConfig cuando la API en vivo solo te indica 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 las filas a definiciones de modelos de
OpenClaw por sí mismo:index.ts
run debe permanecer condicionado por autenticación y devolver null cuando no haya
ninguna credencial utilizable disponible. Mantén un staticRun sin conexión o un fallback
estático para que la configuración, la documentación, las pruebas y las superficies de selector
no dependan del acceso a la red en vivo. Usa un TTL apropiado para la frescura de la lista
de modelos, evita el sondeo del sistema de archivos en tiempo de solicitud y pasa un
readRows / readModelId específico del proveedor solo cuando la respuesta upstream
no tenga una forma compatible con OpenAI { data: [{ id, object }] }.Si el proveedor upstream usa tokens de control distintos de OpenClaw, agrega una
pequeña transformación de texto bidireccional en lugar de reemplazar la ruta de streaming: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 la entrega por canal.Para proveedores incluidos que solo registran un proveedor de texto con autenticación
por clave de API más un único runtime respaldado por catálogo, prefiere el helper más acotado
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 descubrimiento específico del proveedor. Usa buildStaticProvider solo para filas sin conexión que sean seguras de mostrar antes de configurar la autenticación; no debe requerir credenciales ni realizar solicitudes de red. La visualización actual de models list --all de OpenClaw ejecuta catálogos estáticos solo para Plugins de proveedor incluidos, con una configuración vacía, un entorno vacío y sin rutas de agente/espacio de trabajo.Si tu flujo de autenticación también necesita aplicar parches a models.providers.*, alias y el modelo predeterminado del agente durante la incorporación, usa los helpers predefinidos de openclaw/plugin-sdk/provider-onboard. Los helpers más específicos son createDefaultModelPresetAppliers(...), createDefaultModelsPresetAppliers(...) y createModelCatalogPresetAppliers(...).Cuando el endpoint nativo de un proveedor admite bloques de uso transmitidos en el transporte normal openai-completions, prefiere los helpers de catálogo compartidos en openclaw/plugin-sdk/provider-catalog-shared en lugar de codificar comprobaciones de id de proveedor. supportsNativeStreamingUsageCompat(...) y applyProviderNativeStreamingUsageCompat(...) detectan la compatibilidad a partir del mapa de capacidades del endpoint, de modo que los endpoints nativos de estilo Moonshot/DashScope sigan participando incluso cuando un Plugin use un id de proveedor personalizado.Los ejemplos de descubrimiento en vivo anteriores cubren APIs de proveedor de estilo /models. Mantén ese descubrimiento dentro de catalog.run, protegido por autenticación utilizable, y mantén staticRun sin red para la generación de catálogos sin conexión.Add dynamic model resolution
Si tu proveedor acepta IDs de modelo arbitrarios (como un proxy o enrutador), agrega Si resolverlo requiere una llamada de red, usa
resolveDynamicModel:prepareDynamicModel para el calentamiento asíncrono: resolveDynamicModel se ejecuta de nuevo cuando termina.Add runtime hooks (as needed)
La mayoría de los proveedores solo necesitan Familias de reproducción disponibles hoy:
Familias de transmisión disponibles hoy:
catalog + resolveDynamicModel. Agrega hooks de forma incremental a medida que tu proveedor los requiera.Los constructores de helpers compartidos ahora cubren las familias de reproducción/compatibilidad con herramientas más comunes, por lo que normalmente los Plugins no necesitan cablear cada hook uno por uno:| Familia | Qué cablea | Ejemplos incluidos |
|---|---|---|
openai-compatible | Política de reproducción compartida de estilo OpenAI para transportes compatibles con OpenAI, incluida la limpieza de ids de llamadas a herramientas, correcciones de orden con el asistente primero y validación genérica de turnos de Gemini cuando el transporte la necesita | moonshot, ollama, xai, zai |
anthropic-by-model | Política de reproducción consciente de Claude elegida por modelId, de modo que los transportes de mensajes de Anthropic solo reciban limpieza de bloques de pensamiento específica de Claude cuando el modelo resuelto sea realmente un id de Claude | amazon-bedrock |
native-anthropic-by-model | La misma política Claude por modelo que anthropic-by-model, además de limpieza de ids de llamadas a herramientas y preservación nativa de ids de uso de herramientas de Anthropic para transportes que deben conservar ids nativos del proveedor | anthropic-vertex, clawrouter |
google-gemini | Política de reproducción nativa de Gemini más limpieza de reproducción de arranque. La familia compartida mantiene la CLI de Gemini con salida de texto en razonamiento etiquetado; el proveedor directo google sobrescribe resolveReasoningOutputMode a native porque el pensamiento de la API de Gemini llega como partes de pensamiento nativas. | google, google-gemini-cli |
passthrough-gemini | Limpieza de firmas de pensamiento de Gemini para modelos Gemini que se ejecutan a través de transportes proxy compatibles con OpenAI; no habilita validación de reproducción nativa de Gemini ni reescrituras de arranque | openrouter, kilocode, opencode, opencode-go |
hybrid-anthropic-openai | Política híbrida para proveedores que mezclan superficies de modelos de mensajes de Anthropic y compatibles con OpenAI en un Plugin; la eliminación opcional de bloques de pensamiento solo de Claude permanece limitada al lado de Anthropic | minimax |
| Familia | Qué cablea | Ejemplos incluidos |
|---|---|---|
google-thinking | Normalización de la carga útil de pensamiento de Gemini en la ruta de transmisión compartida | google, google-gemini-cli |
kilocode-thinking | Envoltura de razonamiento de Kilo en la ruta de transmisión proxy compartida, con kilo/auto e ids de razonamiento proxy no compatibles omitiendo el pensamiento inyectado | kilocode |
moonshot-thinking | Mapeo de carga útil binaria de pensamiento nativo de Moonshot desde configuración + nivel /think | moonshot |
minimax-fast-mode | Reescritura del modelo de modo rápido de MiniMax en la ruta de transmisión compartida | minimax, minimax-portal |
openai-responses-defaults | Envolturas compartidas nativas 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 | openai |
openrouter-thinking | Envoltura de razonamiento de OpenRouter para rutas proxy, con omisiones de modelos no compatibles/auto manejadas de forma centralizada | openrouter |
tool-stream-default-on | Envoltura tool_stream activada de forma predeterminada para proveedores como Z.AI que quieren transmisión de herramientas salvo que se deshabilite explícitamente | zai |
SDK seams powering the family builders
SDK seams powering the family builders
Cada constructor de familia se compone a partir de helpers públicos de nivel inferior exportados desde el mismo paquete, a los que puedes recurrir cuando un proveedor necesita salirse 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 helpers de reproducción de Gemini (sanitizeGoogleGeminiReplayHistory,resolveTaggedReasoningOutputMode) y helpers de endpoint/modelo (resolveProviderEndpoint,normalizeProviderId,normalizeGooglePreviewModelId).openclaw/plugin-sdk/provider-stream-ProviderStreamFamily,buildProviderStreamFamilyHooks(...),composeProviderStreamWrappers(...), además de las envolturas compartidas de OpenAI/Codex (createOpenAIAttributionHeadersWrapper,createOpenAIFastModeWrapper,createOpenAIServiceTierWrapper,createOpenAIResponsesContextManagementWrapper,createCodexNativeWebSearchWrapper), la envoltura DeepSeek V4 compatible con OpenAI (createDeepSeekV4OpenAICompatibleThinkingWrapper), la limpieza de precarga de pensamiento de Anthropic Messages (createAnthropicThinkingPrefillPayloadWrapper), la compatibilidad de llamadas a herramientas en texto plano (createPlainTextToolCallCompatWrapper) y las envolturas compartidas de proxy/proveedor (createOpenRouterWrapper,createToolStreamWrapper,createMinimaxFastModeWrapper).openclaw/plugin-sdk/provider-stream-shared- envolturas ligeras de carga útil y eventos para rutas calientes de proveedor, incluidascreateOpenAICompatibleCompletionsThinkingOffWrapper,createPayloadPatchStreamWrapper,createPlainTextToolCallCompatWrapper,normalizeOpenAICompatibleReasoningPayload(...)ysetQwenChatTemplateThinking(...).openclaw/plugin-sdk/provider-tools-ProviderToolCompatFamily,buildProviderToolCompatFamilyHooks("deepseek" | "gemini" | "openai")y helpers subyacentes de esquema de proveedor.
native para que OpenClaw consuma partes de pensamiento nativas sin agregar directivas de prompt <think> / <final>. Los backends de estilo CLI de Gemini solo de texto que analizan una respuesta final JSON/texto pueden mantener el contrato etiquetado compartido google-gemini.Algunos helpers de transmisión permanecen locales al proveedor a propósito. @openclaw/anthropic-provider mantiene wrapAnthropicProviderStream, resolveAnthropicBetas, resolveAnthropicFastMode, resolveAnthropicServiceTier y los constructores de envolturas de Anthropic de nivel inferior en su propia unión pública api.ts / contract-api.ts porque codifican el manejo de beta de OAuth de Claude y la protección de context1m. El Plugin xAI conserva de forma similar la conformación nativa de xAI Responses en su propio wrapStreamFn (alias /fast, tool_stream predeterminado, limpieza de herramientas estrictas no compatibles, eliminación de carga útil de razonamiento específica de xAI).El mismo patrón de raíz de paquete también respalda @openclaw/openai-provider (constructores de proveedor, helpers de modelo predeterminado, constructores de proveedor en tiempo real) y @openclaw/openrouter-provider (constructor de proveedor más helpers de incorporación/configuración).- Token exchange
- Custom headers
- Native transport identity
- Uso y facturación
Para proveedores que necesitan un intercambio de token antes de cada llamada de inferencia:
Hooks comunes de proveedor
Hooks comunes de proveedor
OpenClaw llama a los hooks aproximadamente en este orden para plugins de modelo/proveedor.
La mayoría de los proveedores solo usan 2 o 3. Este no es el contrato completo de
Notas de alternativa de runtime:
ProviderPlugin; consulta Internos: Hooks de runtime de proveedor para ver la
lista de hooks completa y actualmente precisa, así como las notas de alternativa.
Los campos de proveedor solo de compatibilidad que OpenClaw ya no llama, como
ProviderPlugin.capabilities y suppressBuiltInModel, no se enumeran
aquí.| Hook | Cuándo usarlo |
|---|---|
catalog | Catálogo de modelos o valores predeterminados de URL base |
applyConfigDefaults | Valores predeterminados globales propiedad del proveedor durante la materialización de configuración |
normalizeModelId | Limpieza de alias de id de modelo heredado/vista previa antes de la búsqueda |
normalizeTransport | Limpieza de api / baseUrl de familia de proveedor antes del ensamblaje genérico del modelo |
normalizeConfig | Normalizar la configuración de models.providers.<id> |
applyNativeStreamingUsageCompat | Reescrituras de compatibilidad de uso de streaming nativo para proveedores de configuración |
resolveConfigApiKey | Resolución de autenticación de marcador env propiedad del proveedor |
resolveSyntheticAuth | Autenticación sintética local/autohospedada o respaldada por configuración |
resolveExternalAuthProfiles | Superponer perfiles de autenticación externos propiedad del proveedor para credenciales gestionadas por CLI/app |
shouldDeferSyntheticProfileAuth | Rebajar marcadores de posición de perfiles almacenados sintéticos detrás de autenticación env/config |
resolveDynamicModel | Aceptar IDs arbitrarios de modelos upstream |
prepareDynamicModel | Obtención asíncrona de metadatos antes de resolver |
normalizeResolvedModel | Reescrituras de transporte antes del runner |
normalizeToolSchemas | Limpieza de esquemas de herramientas propiedad del proveedor antes del registro |
inspectToolSchemas | Diagnósticos de esquemas de herramientas propiedad del proveedor |
resolveReasoningOutputMode | Contrato de salida de razonamiento etiquetada frente a nativa |
prepareExtraParams | Parámetros de solicitud predeterminados |
createStreamFn | Transporte StreamFn completamente personalizado |
wrapStreamFn | Envoltorios personalizados de encabezados/cuerpo en la ruta normal de stream |
resolveTransportTurnState | Encabezados/metadatos nativos por turno |
resolveWebSocketSessionPolicy | Encabezados/cool-down de sesión WS nativos |
formatApiKey | Forma personalizada de token de runtime |
refreshOAuth | Actualización OAuth personalizada |
buildAuthDoctorHint | Guía de reparación de autenticación |
matchesContextOverflowError | Detección de desbordamiento propiedad del proveedor |
classifyFailoverReason | Clasificación de límite de tasa/sobrecarga propiedad del proveedor |
isCacheTtlEligible | Control de elegibilidad de TTL de caché de prompts |
buildMissingAuthMessage | Indicación personalizada de autenticación faltante |
augmentModelCatalog | Filas sintéticas de compatibilidad futura (obsoleto; prefiere registerModelCatalogProvider) |
resolveThinkingProfile | Conjunto de opciones /think específico del modelo |
isBinaryThinking | Compatibilidad de razonamiento binario activado/desactivado (obsoleto; prefiere resolveThinkingProfile) |
supportsXHighThinking | Compatibilidad de razonamiento xhigh (obsoleto; prefiere resolveThinkingProfile) |
resolveDefaultThinkingLevel | Compatibilidad de política /think predeterminada (obsoleto; prefiere resolveThinkingProfile) |
isModernModelRef | Coincidencia de modelo en vivo/smoke |
prepareRuntimeAuth | Intercambio de token antes de la inferencia |
resolveUsageAuth | Análisis personalizado de credenciales de uso |
fetchUsageSnapshot | Endpoint de uso personalizado |
createEmbeddingProvider | Adaptador de embeddings propiedad del proveedor para memoria/búsqueda |
buildReplayPolicy | Política personalizada de repetición/Compaction de transcripción |
sanitizeReplayHistory | Reescrituras de repetición específicas del proveedor después de la limpieza genérica |
validateReplayTurns | Validación estricta de turnos de repetición antes del runner incrustado |
onModelSelected | Callback posterior a la selección (por ejemplo, telemetría) |
normalizeConfigresuelve un plugin propietario por id de proveedor (primero proveedores incluidos, luego el plugin de runtime coincidente) y llama solo a ese hook; no hay escaneo entre otros proveedores. El propio hooknormalizeConfigde Google es el que normaliza las entradas de configuración degoogle/google-vertex/google-antigravity; no es una alternativa separada del núcleo.resolveConfigApiKeyusa el hook del proveedor cuando está expuesto. Amazon Bedrock mantiene la resolución de marcadores env de AWS en su plugin de proveedor; la autenticación de runtime en sí sigue usando la cadena predeterminada del SDK de AWS cuando se configura conauth: "aws-sdk".resolveThinkingProfile(ctx)recibe elproviderseleccionado,modelId, la pista opcional fusionada del catálogoreasoningy los datos opcionales fusionados decompatdel modelo. Usacompatsolo para seleccionar la UI/el perfil de pensamiento del proveedor.resolveSystemPromptContributionpermite que un proveedor inyecte guía de prompt del sistema consciente de caché para una familia de modelos. Prefiérelo al hook heredadobefore_prompt_buildde todo el plugin cuando el comportamiento pertenece a una familia de proveedor/modelo y debe preservar la división estable/dinámica de la caché.
Agregar capacidades adicionales (opcional)
Paso 5: Agregar capacidades adicionales
Un plugin de proveedor puede registrar embeddings, voz, transcripción en tiempo real, voz en tiempo real, comprensión de medios, generación de imágenes, generación de video, obtención web y búsqueda web junto con la inferencia de texto. OpenClaw clasifica esto como un plugin de capacidad híbrida: el patrón recomendado para plugins de empresa (un plugin por proveedor). Consulta Internos: Propiedad de capacidades.Registra cada capacidad dentro deregister(api) junto con tu llamada existente a
api.registerProvider(...). Elige solo las pestañas que necesites:- Voz (TTS)
- Transcripción en tiempo real
- Realtime voice
- Media understanding
- Embeddings
- Image and video generation
- Web fetch and search
assertOkOrThrowProviderError(...) para fallos HTTP del proveedor, de modo que
los plugins compartan lecturas acotadas del cuerpo de error, análisis de errores JSON y
sufijos de request-id.Test
Paso 6: Probar
src/provider.test.ts
Publicar en ClawHub
Los plugins de proveedor se publican igual que cualquier otro plugin de código externo:clawhub skill publish <path> es un comando distinto para publicar una carpeta de skill,
no un paquete de plugin; no lo uses aquí.
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 de API |
profile | Después de simple | Proveedores restringidos por perfiles de autenticación |
paired | Después de profile | Sintetizar varias entradas relacionadas |
late | Última pasada | Sobrescribir proveedores existentes (gana en caso de colisión) |
Próximos pasos
- Plugins de canal - si tu plugin también proporciona un canal
- Runtime del SDK - helpers de
api.runtime(TTS, búsqueda, subagente) - Resumen del SDK - referencia completa de importaciones por subruta
- Internos del plugin - detalles de hooks y ejemplos integrados