chore(i18n): refresh es translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-09 01:35:03 +00:00
parent 77940525e9
commit 96b4470fb0
21 changed files with 3920 additions and 4322 deletions

View File

@ -1,26 +1,26 @@
---
read_when:
- Trabajando en funciones del canal de Discord
summary: Estado de compatibilidad, capacidades y configuración del bot de Discord
summary: Estado del soporte del bot de Discord, capacidades y configuración
title: Discord
x-i18n:
generated_at: "2026-04-06T03:08:07Z"
generated_at: "2026-04-09T01:29:29Z"
model: gpt-5.4
provider: openai
source_hash: 54af2176a1b4fa1681e3f07494def0c652a2730165058848000e71a59e2a9d08
source_hash: 3cd2886fad941ae2129e681911309539e9a65a2352b777b538d7f4686a68f73f
source_path: channels/discord.md
workflow: 15
---
# Discord (API de bot)
Estado: listo para mensajes directos y canales de servidor mediante el gateway oficial de Discord.
Estado: listo para mensajes directos y canales de servidor mediante la gateway oficial de Discord.
<CardGroup cols={3}>
<Card title="Vinculación" icon="link" href="/es/channels/pairing">
Los mensajes directos de Discord usan el modo de vinculación de forma predeterminada.
<Card title="Emparejamiento" icon="link" href="/es/channels/pairing">
Los mensajes directos de Discord usan el modo de emparejamiento de forma predeterminada.
</Card>
<Card title="Comandos slash" icon="terminal" href="/es/tools/slash-commands">
<Card title="Comandos de barra inclinada" icon="terminal" href="/es/tools/slash-commands">
Comportamiento nativo de comandos y catálogo de comandos.
</Card>
<Card title="Solución de problemas del canal" icon="wrench" href="/es/channels/troubleshooting">
@ -30,7 +30,7 @@ Estado: listo para mensajes directos y canales de servidor mediante el gateway o
## Configuración rápida
Necesitarás crear una nueva aplicación con un bot, añadir el bot a tu servidor y vincularlo con OpenClaw. Recomendamos añadir tu bot a tu propio servidor privado. Si aún no tienes uno, [crea uno primero](https://support.discord.com/hc/en-us/articles/204849977-How-do-I-create-a-server) (elige **Create My Own > For me and my friends**).
Necesitarás crear una aplicación nueva con un bot, añadir el bot a tu servidor y emparejarlo con OpenClaw. Recomendamos añadir tu bot a tu propio servidor privado. Si todavía no tienes uno, [crea uno primero](https://support.discord.com/hc/en-us/articles/204849977-How-do-I-create-a-server) (elige **Create My Own > For me and my friends**).
<Steps>
<Step title="Crear una aplicación de Discord y un bot">
@ -41,16 +41,16 @@ Necesitarás crear una nueva aplicación con un bot, añadir el bot a tu servido
</Step>
<Step title="Habilitar intents privilegiados">
Sigue en la página **Bot**, desplázate hacia abajo hasta **Privileged Gateway Intents** y habilita:
Aún en la página **Bot**, desplázate hacia abajo hasta **Privileged Gateway Intents** y habilita:
- **Message Content Intent** (obligatorio)
- **Server Members Intent** (recomendado; obligatorio para listas de permitidos basadas en roles y coincidencia de nombre a ID)
- **Server Members Intent** (recomendado; obligatorio para listas de permitidos por rol y coincidencia de nombre a ID)
- **Presence Intent** (opcional; solo se necesita para actualizaciones de presencia)
</Step>
<Step title="Copiar el token de tu bot">
Vuelve a desplazarte hacia arriba en la página **Bot** y haz clic en **Reset Token**.
Vuelve a subir en la página **Bot** y haz clic en **Reset Token**.
<Note>
A pesar del nombre, esto genera tu primer token; no se está "restableciendo" nada.
@ -61,7 +61,7 @@ Necesitarás crear una nueva aplicación con un bot, añadir el bot a tu servido
</Step>
<Step title="Generar una URL de invitación y añadir el bot a tu servidor">
Haz clic en **OAuth2** en la barra lateral. Generarás una URL de invitación con los permisos correctos para añadir el bot a tu servidor.
Haz clic en **OAuth2** en la barra lateral. Generarás una URL de invitación con los permisos adecuados para añadir el bot a tu servidor.
Desplázate hacia abajo hasta **OAuth2 URL Generator** y habilita:
@ -81,26 +81,26 @@ Necesitarás crear una nueva aplicación con un bot, añadir el bot a tu servido
</Step>
<Step title="Habilitar el modo desarrollador y recopilar tus IDs">
De vuelta en la app de Discord, debes habilitar el modo desarrollador para poder copiar los IDs internos.
<Step title="Habilitar el modo desarrollador y recopilar tus ID">
De vuelta en la app de Discord, debes habilitar el modo desarrollador para poder copiar IDs internas.
1. Haz clic en **User Settings** (icono de engranaje junto a tu avatar) → **Advanced** → activa **Developer Mode**
2. Haz clic derecho en el **icono de tu servidor** en la barra lateral → **Copy Server ID**
3. Haz clic derecho en **tu propio avatar** → **Copy User ID**
3. Haz clic derecho en tu **propio avatar** → **Copy User ID**
Guarda tu **Server ID** y tu **User ID** junto con tu Bot Token; enviarás los tres a OpenClaw en el siguiente paso.
Guarda tu **Server ID** y **User ID** junto con tu Bot Token; enviarás los tres a OpenClaw en el siguiente paso.
</Step>
<Step title="Permitir mensajes directos de miembros del servidor">
Para que la vinculación funcione, Discord debe permitir que tu bot te envíe mensajes directos. Haz clic derecho en el **icono de tu servidor****Privacy Settings** → activa **Direct Messages**.
Para que el emparejamiento funcione, Discord debe permitir que tu bot te envíe mensajes directos. Haz clic derecho en el **icono de tu servidor****Privacy Settings** → activa **Direct Messages**.
Esto permite que los miembros del servidor (incluidos los bots) te envíen mensajes directos. Mantén esto habilitado si quieres usar mensajes directos de Discord con OpenClaw. Si solo planeas usar canales del servidor, puedes desactivar los mensajes directos después de la vinculación.
Esto permite que los miembros del servidor (incluidos los bots) te envíen mensajes directos. Mantén esto habilitado si quieres usar mensajes directos de Discord con OpenClaw. Si solo planeas usar canales de servidor, puedes desactivar los mensajes directos después del emparejamiento.
</Step>
<Step title="Configurar tu token de bot de forma segura (no lo envíes por chat)">
El token de tu bot de Discord es un secreto (como una contraseña). Configúralo en la máquina donde se ejecuta OpenClaw antes de enviar mensajes a tu agente.
<Step title="Establecer el token de tu bot de forma segura (no lo envíes en el chat)">
El token de tu bot de Discord es un secreto (como una contraseña). Establécelo en la máquina que ejecuta OpenClaw antes de enviar mensajes a tu agente.
```bash
export DISCORD_BOT_TOKEN="YOUR_BOT_TOKEN"
@ -110,17 +110,17 @@ openclaw config set channels.discord.enabled true --strict-json
openclaw gateway
```
Si OpenClaw ya se está ejecutando como servicio en segundo plano, reinícialo mediante la app de OpenClaw para Mac o deteniendo y reiniciando el proceso `openclaw gateway run`.
Si OpenClaw ya se está ejecutando como servicio en segundo plano, reinícialo mediante la app OpenClaw para Mac o deteniendo y reiniciando el proceso `openclaw gateway run`.
</Step>
<Step title="Configurar OpenClaw y vincularlo">
<Step title="Configurar OpenClaw y emparejar">
<Tabs>
<Tab title="Pregúntale a tu agente">
Chatea con tu agente de OpenClaw en cualquier canal existente (por ejemplo, Telegram) y díselo. Si Discord es tu primer canal, usa en su lugar la pestaña de CLI / config.
> "Ya configuré mi token de bot de Discord en la configuración. Por favor, termina la configuración de Discord con el User ID `<user_id>` y el Server ID `<server_id>`."
> "Ya configuré el token de mi bot de Discord en la configuración. Completa la configuración de Discord con User ID `<user_id>` y Server ID `<server_id>`."
</Tab>
<Tab title="CLI / config">
Si prefieres una configuración basada en archivos, establece:
@ -140,27 +140,27 @@ openclaw gateway
}
```
Respaldo de entorno para la cuenta predeterminada:
Respaldo por variable de entorno para la cuenta predeterminada:
```bash
DISCORD_BOT_TOKEN=...
```
Se admiten valores `token` en texto plano. También se admiten valores SecretRef para `channels.discord.token` en proveedores env/file/exec. Consulta [Gestión de secretos](/es/gateway/secrets).
Se admiten valores `token` en texto plano. También se admiten valores SecretRef para `channels.discord.token` en proveedores env/file/exec. Consulta [Secrets Management](/es/gateway/secrets).
</Tab>
</Tabs>
</Step>
<Step title="Aprobar la primera vinculación por mensaje directo">
Espera hasta que el gateway esté en ejecución y luego envía un mensaje directo a tu bot en Discord. Responderá con un código de vinculación.
<Step title="Aprobar el primer emparejamiento por mensaje directo">
Espera hasta que la gateway esté en ejecución y luego envía un mensaje directo a tu bot en Discord. Responderá con un código de emparejamiento.
<Tabs>
<Tab title="Pregúntale a tu agente">
Envía el código de vinculación a tu agente en tu canal existente:
Envía el código de emparejamiento a tu agente en tu canal existente:
> "Aprueba este código de vinculación de Discord: `<CODE>`"
> "Aprueba este código de emparejamiento de Discord: `<CODE>`"
</Tab>
<Tab title="CLI">
@ -172,7 +172,7 @@ openclaw pairing approve discord <CODE>
</Tab>
</Tabs>
Los códigos de vinculación caducan después de 1 hora.
Los códigos de emparejamiento caducan después de 1 hora.
Ahora deberías poder chatear con tu agente en Discord mediante mensaje directo.
@ -180,13 +180,13 @@ openclaw pairing approve discord <CODE>
</Steps>
<Note>
La resolución del token tiene en cuenta la cuenta. Los valores de token en la configuración prevalecen sobre el respaldo del entorno. `DISCORD_BOT_TOKEN` solo se usa para la cuenta predeterminada.
Para llamadas salientes avanzadas (herramienta de mensajes/acciones de canal), se usa un `token` explícito por llamada para esa llamada. Esto se aplica a acciones de envío y de lectura/sondeo (por ejemplo read/search/fetch/thread/pins/permissions). La política de cuenta y la configuración de reintentos siguen viniendo de la cuenta seleccionada en la instantánea activa del runtime.
La resolución del token tiene en cuenta la cuenta. Los valores del token en la configuración tienen prioridad sobre el respaldo por variable de entorno. `DISCORD_BOT_TOKEN` solo se usa para la cuenta predeterminada.
Para llamadas salientes avanzadas (acciones de canal/herramienta de mensajes), se usa un `token` explícito por llamada para esa llamada. Esto se aplica a acciones de envío y de lectura/sondeo (por ejemplo read/search/fetch/thread/pins/permissions). La política de cuenta y la configuración de reintentos siguen viniendo de la cuenta seleccionada en la instantánea activa del runtime.
</Note>
## Recomendado: configurar un espacio de trabajo de servidor
Una vez que los mensajes directos funcionen, puedes configurar tu servidor de Discord como un espacio de trabajo completo donde cada canal obtiene su propia sesión de agente con su propio contexto. Esto se recomienda para servidores privados donde solo están tú y tu bot.
Una vez que los mensajes directos funcionen, puedes configurar tu servidor de Discord como un espacio de trabajo completo donde cada canal obtiene su propia sesión de agente con su propio contexto. Esto se recomienda para servidores privados donde solo estáis tú y tu bot.
<Steps>
<Step title="Añadir tu servidor a la lista de permitidos de servidores">
@ -220,11 +220,11 @@ Una vez que los mensajes directos funcionen, puedes configurar tu servidor de Di
</Step>
<Step title="Permitir respuestas sin @mention">
De forma predeterminada, tu agente solo responde en canales del servidor cuando se le menciona con @. En un servidor privado, probablemente quieras que responda a cada mensaje.
De forma predeterminada, tu agente solo responde en canales de servidor cuando se le menciona con @. En un servidor privado, probablemente quieras que responda a todos los mensajes.
<Tabs>
<Tab title="Pregúntale a tu agente">
> "Permite que mi agente responda en este servidor sin tener que mencionarlo con @"
> "Permite que mi agente responda en este servidor sin necesidad de que se le mencione con @"
</Tab>
<Tab title="Config">
Establece `requireMention: false` en la configuración de tu servidor:
@ -248,40 +248,40 @@ Una vez que los mensajes directos funcionen, puedes configurar tu servidor de Di
</Step>
<Step title="Planificar la memoria en canales del servidor">
De forma predeterminada, la memoria a largo plazo (MEMORY.md) solo se carga en sesiones de mensajes directos. Los canales del servidor no cargan automáticamente MEMORY.md.
<Step title="Planificar la memoria en canales de servidor">
De forma predeterminada, la memoria a largo plazo (MEMORY.md) solo se carga en sesiones de mensajes directos. Los canales de servidor no cargan automáticamente MEMORY.md.
<Tabs>
<Tab title="Pregúntale a tu agente">
> "Cuando haga preguntas en canales de Discord, usa memory_search o memory_get si necesitas contexto a largo plazo de MEMORY.md."
</Tab>
<Tab title="Manual">
Si necesitas contexto compartido en cada canal, coloca las instrucciones estables en `AGENTS.md` o `USER.md` (se inyectan en cada sesión). Mantén las notas a largo plazo en `MEMORY.md` y accede a ellas bajo demanda con las herramientas de memoria.
Si necesitas contexto compartido en cada canal, coloca las instrucciones estables en `AGENTS.md` o `USER.md` (se inyectan en cada sesión). Mantén las notas a largo plazo en `MEMORY.md` y accede a ellas bajo demanda con herramientas de memoria.
</Tab>
</Tabs>
</Step>
</Steps>
Ahora crea algunos canales en tu servidor de Discord y empieza a chatear. Tu agente puede ver el nombre del canal, y cada canal obtiene su propia sesión aislada, así que puedes configurar `#coding`, `#home`, `#research` o lo que mejor se adapte a tu flujo de trabajo.
Ahora crea algunos canales en tu servidor de Discord y empieza a chatear. Tu agente puede ver el nombre del canal, y cada canal obtiene su propia sesión aislada, por lo que puedes configurar `#coding`, `#home`, `#research` o lo que mejor se adapte a tu flujo de trabajo.
## Modelo de runtime
- El gateway gestiona la conexión de Discord.
- La gateway es propietaria de la conexión de Discord.
- El enrutamiento de respuestas es determinista: las respuestas entrantes de Discord vuelven a Discord.
- De forma predeterminada (`session.dmScope=main`), los chats directos comparten la sesión principal del agente (`agent:main:main`).
- Los canales del servidor usan claves de sesión aisladas (`agent:<agentId>:discord:channel:<channelId>`).
- Los mensajes directos grupales se ignoran de forma predeterminada (`channels.discord.dm.groupEnabled=false`).
- Los comandos slash nativos se ejecutan en sesiones de comando aisladas (`agent:<agentId>:discord:slash:<userId>`), mientras siguen llevando `CommandTargetSessionKey` a la sesión de conversación enrutada.
- Los canales de servidor usan claves de sesión aisladas (`agent:<agentId>:discord:channel:<channelId>`).
- Los mensajes directos de grupo se ignoran de forma predeterminada (`channels.discord.dm.groupEnabled=false`).
- Los comandos nativos de barra inclinada se ejecutan en sesiones de comando aisladas (`agent:<agentId>:discord:slash:<userId>`), mientras siguen llevando `CommandTargetSessionKey` a la sesión de conversación enrutada.
## Canales de foro
Los canales de foro y multimedia de Discord solo aceptan publicaciones en hilos. OpenClaw admite dos formas de crearlos:
- Envía un mensaje al foro principal (`channel:<forumId>`) para crear automáticamente un hilo. El título del hilo usa la primera línea no vacía de tu mensaje.
- Envía un mensaje al padre del foro (`channel:<forumId>`) para crear automáticamente un hilo. El título del hilo usa la primera línea no vacía de tu mensaje.
- Usa `openclaw message thread create` para crear un hilo directamente. No pases `--message-id` para canales de foro.
Ejemplo: enviar al foro principal para crear un hilo
Ejemplo: enviar al padre del foro para crear un hilo
```bash
openclaw message send --channel discord --target channel:<forumId> \
@ -295,35 +295,35 @@ openclaw message thread create --channel discord --target channel:<forumId> \
--thread-name "Topic title" --message "Body of the post"
```
Los foros principales no aceptan componentes de Discord. Si necesitas componentes, envía el mensaje al hilo mismo (`channel:<threadId>`).
Los padres de foro no aceptan componentes de Discord. Si necesitas componentes, envíalos al propio hilo (`channel:<threadId>`).
## Componentes interactivos
OpenClaw admite contenedores de componentes v2 de Discord para mensajes del agente. Usa la herramienta de mensajes con una carga `components`. Los resultados de interacción se enrutan de vuelta al agente como mensajes entrantes normales y siguen la configuración existente de Discord `replyToMode`.
OpenClaw admite contenedores de componentes v2 de Discord para mensajes del agente. Usa la herramienta de mensajes con una carga útil `components`. Los resultados de interacción se enrutan de vuelta al agente como mensajes entrantes normales y siguen la configuración existente de `replyToMode` de Discord.
Bloques compatibles:
- `text`, `section`, `separator`, `actions`, `media-gallery`, `file`
- Las filas de acciones permiten hasta 5 botones o un solo menú de selección
- Las filas de acciones permiten hasta 5 botones o un único menú de selección
- Tipos de selección: `string`, `user`, `role`, `mentionable`, `channel`
De forma predeterminada, los componentes son de un solo uso. Establece `components.reusable=true` para permitir que botones, selecciones y formularios se usen varias veces hasta que caduquen.
De forma predeterminada, los componentes son de un solo uso. Establece `components.reusable=true` para permitir que botones, selectores y formularios se usen varias veces hasta que caduquen.
Para restringir quién puede hacer clic en un botón, establece `allowedUsers` en ese botón (IDs de usuario de Discord, etiquetas o `*`). Cuando está configurado, los usuarios que no coincidan reciben una denegación efímera.
Los comandos slash `/model` y `/models` abren un selector de modelo interactivo con menús desplegables de proveedor y modelo, además de un paso de envío. La respuesta del selector es efímera y solo el usuario que lo invocó puede usarla.
Los comandos de barra inclinada `/model` y `/models` abren un selector interactivo de modelo con menús desplegables de proveedor y modelo, además de un paso Submit. La respuesta del selector es efímera y solo el usuario que lo invocó puede usarla.
Archivos adjuntos:
- Los bloques `file` deben apuntar a una referencia de adjunto (`attachment://<filename>`)
- Proporciona el adjunto mediante `media`/`path`/`filePath` (archivo único); usa `media-gallery` para varios archivos
- Usa `filename` para anular el nombre de carga cuando deba coincidir con la referencia del adjunto
- Usa `filename` para reemplazar el nombre de carga cuando deba coincidir con la referencia del adjunto
Formularios modales:
- Añade `components.modal` con hasta 5 campos
- Tipos de campo: `text`, `checkbox`, `radio`, `select`, `role-select`, `user-select`
- OpenClaw añade automáticamente un botón activador
- OpenClaw añade un botón disparador automáticamente
Ejemplo:
@ -383,32 +383,32 @@ Ejemplo:
<Tabs>
<Tab title="Política de mensajes directos">
`channels.discord.dmPolicy` controla el acceso por mensaje directo (heredado: `channels.discord.dm.policy`):
`channels.discord.dmPolicy` controla el acceso a mensajes directos (heredado: `channels.discord.dm.policy`):
- `pairing` (predeterminado)
- `allowlist`
- `open` (requiere que `channels.discord.allowFrom` incluya `"*"`; heredado: `channels.discord.dm.allowFrom`)
- `disabled`
Si la política de mensajes directos no es abierta, los usuarios desconocidos se bloquean (o se les pide vinculación en modo `pairing`).
Si la política de mensajes directos no es abierta, los usuarios desconocidos se bloquean (o se les solicita emparejamiento en modo `pairing`).
Precedencia de múltiples cuentas:
Precedencia en múltiples cuentas:
- `channels.discord.accounts.default.allowFrom` se aplica solo a la cuenta `default`.
- Las cuentas con nombre heredan `channels.discord.allowFrom` cuando su propio `allowFrom` no está establecido.
- Las cuentas con nombre heredan `channels.discord.allowFrom` cuando su propio `allowFrom` no está definido.
- Las cuentas con nombre no heredan `channels.discord.accounts.default.allowFrom`.
Formato de destino de mensaje directo para la entrega:
Formato de destino de mensajes directos para la entrega:
- `user:<id>`
- mención `<@id>`
Los IDs numéricos sin prefijo son ambiguos y se rechazan a menos que se proporcione un tipo de destino explícito de usuario/canal.
Los ID numéricos sin prefijo son ambiguos y se rechazan a menos que se proporcione un tipo de destino explícito de usuario/canal.
</Tab>
<Tab title="Política de servidores">
El manejo de servidores se controla con `channels.discord.groupPolicy`:
<Tab title="Política de servidor">
El manejo de servidores está controlado por `channels.discord.groupPolicy`:
- `open`
- `allowlist`
@ -418,12 +418,12 @@ Ejemplo:
Comportamiento de `allowlist`:
- el servidor debe coincidir con `channels.discord.guilds` (`id` preferido, se acepta slug)
- listas de remitentes opcionales: `users` (se recomiendan IDs estables) y `roles` (solo IDs de rol); si se configura cualquiera de las dos, los remitentes se permiten cuando coinciden con `users` O `roles`
- la coincidencia directa por nombre/etiqueta está desactivada de forma predeterminada; habilita `channels.discord.dangerouslyAllowNameMatching: true` solo como modo de compatibilidad de último recurso
- se admiten nombres/etiquetas para `users`, pero los IDs son más seguros; `openclaw security audit` avisa cuando se usan entradas de nombre/etiqueta
- el servidor debe coincidir con `channels.discord.guilds` (`id` preferido, slug aceptado)
- listas de permitidos opcionales para remitentes: `users` (se recomiendan IDs estables) y `roles` (solo IDs de rol); si cualquiera está configurado, los remitentes están permitidos cuando coinciden con `users` O `roles`
- la coincidencia directa por nombre/etiqueta está desactivada de forma predeterminada; habilita `channels.discord.dangerouslyAllowNameMatching: true` solo como modo de compatibilidad de emergencia
- se admiten nombres/etiquetas para `users`, pero los IDs son más seguros; `openclaw security audit` advierte cuando se usan entradas de nombre/etiqueta
- si un servidor tiene `channels` configurado, los canales no listados se deniegan
- si un servidor no tiene bloque `channels`, se permiten todos los canales de ese servidor incluido en la lista de permitidos
- si un servidor no tiene bloque `channels`, todos los canales de ese servidor en la lista de permitidos están permitidos
Ejemplo:
@ -449,23 +449,23 @@ Ejemplo:
}
```
Si solo estableces `DISCORD_BOT_TOKEN` y no creas un bloque `channels.discord`, el respaldo del runtime será `groupPolicy="allowlist"` (con una advertencia en los registros), incluso si `channels.defaults.groupPolicy` es `open`.
Si solo configuras `DISCORD_BOT_TOKEN` y no creas un bloque `channels.discord`, el respaldo del runtime es `groupPolicy="allowlist"` (con una advertencia en los registros), incluso si `channels.defaults.groupPolicy` es `open`.
</Tab>
<Tab title="Menciones y mensajes directos grupales">
Los mensajes del servidor requieren mención de forma predeterminada.
<Tab title="Menciones y mensajes directos de grupo">
Los mensajes de servidor están restringidos por mención de forma predeterminada.
La detección de mención incluye:
- mención explícita al bot
- mención explícita del bot
- patrones de mención configurados (`agents.list[].groupChat.mentionPatterns`, respaldo `messages.groupChat.mentionPatterns`)
- comportamiento implícito de respuesta al bot en casos compatibles
- comportamiento implícito de respuesta al bot en los casos compatibles
`requireMention` se configura por servidor/canal (`channels.discord.guilds...`).
`ignoreOtherMentions` opcionalmente descarta mensajes que mencionen a otro usuario/rol pero no al bot (excluyendo @everyone/@here).
`ignoreOtherMentions` descarta opcionalmente mensajes que mencionan a otro usuario/rol pero no al bot (excepto @everyone/@here).
Mensajes directos grupales:
Mensajes directos de grupo:
- predeterminado: ignorados (`dm.groupEnabled=false`)
- lista de permitidos opcional mediante `dm.groupChannels` (IDs o slugs de canal)
@ -475,7 +475,7 @@ Ejemplo:
### Enrutamiento de agentes basado en roles
Usa `bindings[].match.roles` para enrutar miembros de servidores de Discord a distintos agentes según el ID del rol. Los bindings basados en roles aceptan solo IDs de rol y se evalúan después de los bindings de peer o parent-peer y antes de los bindings solo de servidor. Si un binding también establece otros campos de coincidencia (por ejemplo `peer` + `guildId` + `roles`), todos los campos configurados deben coincidir.
Usa `bindings[].match.roles` para enrutar miembros de servidores de Discord a distintos agentes por ID de rol. Las vinculaciones basadas en rol aceptan solo IDs de rol y se evalúan después de las vinculaciones de par o par padre y antes de las vinculaciones solo de servidor. Si una vinculación también establece otros campos de coincidencia (por ejemplo `peer` + `guildId` + `roles`), todos los campos configurados deben coincidir.
```json5
{
@ -499,10 +499,10 @@ Usa `bindings[].match.roles` para enrutar miembros de servidores de Discord a di
}
```
## Configuración del Developer Portal
## Configuración del portal para desarrolladores
<AccordionGroup>
<Accordion title="Crear aplicación y bot">
<Accordion title="Crear app y bot">
1. Discord Developer Portal -> **Applications** -> **New Application**
2. **Bot** -> **Add Bot**
@ -516,7 +516,7 @@ Usa `bindings[].match.roles` para enrutar miembros de servidores de Discord a di
- Message Content Intent
- Server Members Intent (recomendado)
Presence intent es opcional y solo es obligatorio si quieres recibir actualizaciones de presencia. Establecer la presencia del bot (`setPresence`) no requiere habilitar actualizaciones de presencia para miembros.
Presence intent es opcional y solo es obligatorio si quieres recibir actualizaciones de presencia. Configurar la presencia del bot (`setPresence`) no requiere habilitar actualizaciones de presencia para los miembros.
</Accordion>
@ -534,12 +534,12 @@ Usa `bindings[].match.roles` para enrutar miembros de servidores de Discord a di
- Attach Files
- Add Reactions (opcional)
Evita `Administrator` a menos que sea explícitamente necesario.
Evita `Administrator` salvo que sea explícitamente necesario.
</Accordion>
<Accordion title="Copiar IDs">
Habilita el modo desarrollador de Discord y luego copia:
Habilita Discord Developer Mode y luego copia:
- ID del servidor
- ID del canal
@ -553,14 +553,14 @@ Usa `bindings[].match.roles` para enrutar miembros de servidores de Discord a di
## Comandos nativos y autenticación de comandos
- `commands.native` usa `"auto"` de forma predeterminada y está habilitado para Discord.
- Anulación por canal: `channels.discord.commands.native`.
- `commands.native=false` borra explícitamente los comandos nativos de Discord registrados anteriormente.
- Reemplazo por canal: `channels.discord.commands.native`.
- `commands.native=false` borra explícitamente comandos nativos de Discord registrados anteriormente.
- La autenticación de comandos nativos usa las mismas listas de permitidos/políticas de Discord que el manejo normal de mensajes.
- Los comandos pueden seguir siendo visibles en la interfaz de Discord para usuarios no autorizados; la ejecución sigue aplicando la autorización de OpenClaw y devuelve "not authorized".
- Los comandos pueden seguir siendo visibles en la interfaz de Discord para usuarios que no están autorizados; la ejecución sigue aplicando la autenticación de OpenClaw y devuelve "no autorizado".
Consulta [Comandos slash](/es/tools/slash-commands) para ver el catálogo y comportamiento de comandos.
Consulta [Slash commands](/es/tools/slash-commands) para el catálogo y el comportamiento de los comandos.
Configuración predeterminada de comandos slash:
Configuración predeterminada de comandos de barra inclinada:
- `ephemeral: true`
@ -581,20 +581,22 @@ Configuración predeterminada de comandos slash:
- `batched`
Nota: `off` desactiva el encadenamiento implícito de respuestas. Las etiquetas explícitas `[[reply_to_*]]` siguen respetándose.
`first` siempre adjunta la referencia de respuesta nativa implícita a la primera salida de mensaje de Discord del turno.
`batched` solo adjunta la referencia de respuesta nativa implícita de Discord cuando el turno entrante fue un lote con debounce de varios mensajes. Esto es útil
cuando quieres respuestas nativas principalmente para chats ambiguos y con ráfagas, no para cada turno de mensaje único.
`first` siempre adjunta la referencia implícita de respuesta nativa al primer mensaje saliente de Discord del turno.
`batched` solo adjunta la referencia implícita de respuesta nativa de Discord cuando el
turno entrante fue un lote con antirrebote de varios mensajes. Esto es útil
cuando quieres respuestas nativas principalmente para chats ambiguos con ráfagas, no para cada
turno de un solo mensaje.
Los IDs de mensaje se muestran en el contexto/historial para que los agentes puedan dirigirse a mensajes específicos.
Los IDs de mensaje se muestran en el contexto/historial para que los agentes puedan dirigirse a mensajes concretos.
</Accordion>
<Accordion title="Vista previa de streaming en vivo">
OpenClaw puede transmitir respuestas preliminares enviando un mensaje temporal y editándolo a medida que llega el texto.
<Accordion title="Vista previa de transmisión en vivo">
OpenClaw puede transmitir borradores de respuesta enviando un mensaje temporal y editándolo a medida que llega texto.
- `channels.discord.streaming` controla el streaming de vista previa (`off` | `partial` | `block` | `progress`, predeterminado: `off`).
- El valor predeterminado sigue siendo `off` porque las ediciones de vista previa de Discord pueden alcanzar rápidamente los límites de tasa, especialmente cuando varios bots o gateways comparten la misma cuenta o el tráfico del servidor.
- `progress` se acepta para mantener coherencia entre canales y se asigna a `partial` en Discord.
- `channels.discord.streaming` controla la transmisión de vista previa (`off` | `partial` | `block` | `progress`, predeterminado: `off`).
- El valor predeterminado sigue siendo `off` porque las ediciones de vista previa de Discord pueden alcanzar rápidamente los límites de tasa, especialmente cuando varios bots o gateways comparten la misma cuenta o tráfico de servidor.
- `progress` se acepta por consistencia entre canales y se asigna a `partial` en Discord.
- `channels.discord.streamMode` es un alias heredado y se migra automáticamente.
- `partial` edita un único mensaje de vista previa a medida que llegan los tokens.
- `block` emite fragmentos del tamaño del borrador (usa `draftChunk` para ajustar tamaño y puntos de corte).
@ -611,7 +613,7 @@ Configuración predeterminada de comandos slash:
}
```
Valores predeterminados de fragmentación en modo `block` (limitados por `channels.discord.textChunkLimit`):
Valores predeterminados de fragmentación del modo `block` (limitados a `channels.discord.textChunkLimit`):
```json5
{
@ -628,21 +630,21 @@ Configuración predeterminada de comandos slash:
}
```
La vista previa de streaming es solo de texto; las respuestas multimedia vuelven al envío normal.
La transmisión de vista previa es solo de texto; las respuestas con archivos multimedia vuelven a la entrega normal.
Nota: la vista previa de streaming es independiente del streaming por bloques. Cuando el streaming por bloques está habilitado explícitamente
para Discord, OpenClaw omite la vista previa de streaming para evitar streaming doble.
Nota: la transmisión de vista previa es independiente de la transmisión por bloques. Cuando la transmisión por bloques está explícitamente
habilitada para Discord, OpenClaw omite la vista previa para evitar transmisión doble.
</Accordion>
<Accordion title="Historial, contexto y comportamiento de hilos">
Contexto de historial del servidor:
Contexto del historial de servidores:
- `channels.discord.historyLimit` predeterminado `20`
- respaldo: `messages.groupChat.historyLimit`
- `0` lo desactiva
- `0` desactiva
Controles de historial de mensajes directos:
Controles del historial de mensajes directos:
- `channels.discord.dmHistoryLimit`
- `channels.discord.dms["<user_id>"].historyLimit`
@ -650,25 +652,25 @@ Configuración predeterminada de comandos slash:
Comportamiento de hilos:
- los hilos de Discord se enrutan como sesiones de canal
- los metadatos del hilo principal pueden usarse para vincular con la sesión principal
- la configuración del hilo hereda la configuración del canal principal a menos que exista una entrada específica para el hilo
- los metadatos del hilo padre pueden usarse para el enlace de sesión padre
- la configuración del hilo hereda la configuración del canal padre, salvo que exista una entrada específica para el hilo
Los temas del canal se inyectan como contexto **no confiable** (no como prompt del sistema).
El contexto de respuesta y de mensaje citado actualmente se mantiene tal como se recibió.
Las listas de permitidos de Discord bloquean principalmente quién puede activar al agente, no constituyen un límite completo de redacción de contexto suplementario.
Los temas de canal se inyectan como contexto **no confiable** (no como prompt del sistema).
El contexto de respuestas y mensajes citados actualmente permanece tal como se recibe.
Las listas de permitidos de Discord controlan principalmente quién puede activar el agente, no son un límite completo de redacción de contexto suplementario.
</Accordion>
<Accordion title="Sesiones vinculadas a hilos para subagentes">
Discord puede vincular un hilo a un destino de sesión para que los mensajes posteriores de ese hilo sigan enrutándose a la misma sesión (incluidas sesiones de subagentes).
Discord puede vincular un hilo a un destino de sesión para que los mensajes posteriores en ese hilo sigan enrutándose a la misma sesión (incluidas sesiones de subagentes).
Comandos:
- `/focus <target>` vincula el hilo actual/nuevo a un destino de subagente/sesión
- `/unfocus` elimina la vinculación actual del hilo
- `/agents` muestra ejecuciones activas y estado de vinculación
- `/session idle <duration|off>` inspecciona/actualiza la desvinculación automática por inactividad para bindings enfocados
- `/session max-age <duration|off>` inspecciona/actualiza la antigüedad máxima estricta para bindings enfocados
- `/unfocus` elimina la vinculación del hilo actual
- `/agents` muestra ejecuciones activas y estado de la vinculación
- `/session idle <duration|off>` inspecciona/actualiza el desenfoque automático por inactividad para vinculaciones enfocadas
- `/session max-age <duration|off>` inspecciona/actualiza la antigüedad máxima estricta para vinculaciones enfocadas
Configuración:
@ -687,7 +689,7 @@ Configuración predeterminada de comandos slash:
enabled: true,
idleHours: 24,
maxAgeHours: 0,
spawnSubagentSessions: false, // opt-in
spawnSubagentSessions: false, // activación opcional
},
},
},
@ -697,17 +699,17 @@ Configuración predeterminada de comandos slash:
Notas:
- `session.threadBindings.*` establece los valores predeterminados globales.
- `channels.discord.threadBindings.*` anula el comportamiento de Discord.
- `spawnSubagentSessions` debe ser true para crear/vincular hilos automáticamente para `sessions_spawn({ thread: true })`.
- `spawnAcpSessions` debe ser true para crear/vincular hilos automáticamente para ACP (`/acp spawn ... --thread ...` o `sessions_spawn({ runtime: "acp", thread: true })`).
- Si los thread bindings están deshabilitados para una cuenta, `/focus` y las operaciones relacionadas con thread binding no están disponibles.
- `channels.discord.threadBindings.*` reemplaza el comportamiento de Discord.
- `spawnSubagentSessions` debe ser true para crear/vincular automáticamente hilos para `sessions_spawn({ thread: true })`.
- `spawnAcpSessions` debe ser true para crear/vincular automáticamente hilos para ACP (`/acp spawn ... --thread ...` o `sessions_spawn({ runtime: "acp", thread: true })`).
- Si las vinculaciones de hilos están deshabilitadas para una cuenta, `/focus` y las operaciones relacionadas no están disponibles.
Consulta [Subagentes](/es/tools/subagents), [Agentes ACP](/es/tools/acp-agents) y [Referencia de configuración](/es/gateway/configuration-reference).
Consulta [Sub-agents](/es/tools/subagents), [ACP Agents](/es/tools/acp-agents) y [Configuration Reference](/es/gateway/configuration-reference).
</Accordion>
<Accordion title="Bindings persistentes de canal ACP">
Para espacios de trabajo ACP estables "siempre activos", configura bindings ACP tipados de nivel superior dirigidos a conversaciones de Discord.
<Accordion title="Vinculaciones persistentes de canal ACP">
Para espacios de trabajo ACP estables "siempre activos", configura vinculaciones ACP tipadas de nivel superior dirigidas a conversaciones de Discord.
Ruta de configuración:
@ -763,15 +765,15 @@ Configuración predeterminada de comandos slash:
Notas:
- `/acp spawn codex --bind here` vincula el canal o hilo actual de Discord en su lugar y mantiene los mensajes futuros enrutados a la misma sesión ACP.
- Eso aún puede significar "iniciar una sesión ACP nueva de Codex", pero no crea por sí solo un nuevo hilo de Discord. El canal existente sigue siendo la superficie del chat.
- Codex aún puede ejecutarse en su propio `cwd` o espacio de trabajo de backend en disco. Ese espacio de trabajo es estado del runtime, no un hilo de Discord.
- Los mensajes de hilo pueden heredar el binding ACP del canal principal.
- En un canal o hilo vinculado, `/new` y `/reset` reinician la misma sesión ACP en el mismo lugar.
- Los thread bindings temporales siguen funcionando y pueden anular la resolución del destino mientras estén activos.
- `spawnAcpSessions` solo es obligatorio cuando OpenClaw necesita crear/vincular un hilo secundario mediante `--thread auto|here`. No es obligatorio para `/acp spawn ... --bind here` en el canal actual.
- `/acp spawn codex --bind here` vincula el canal o hilo actual de Discord en el lugar y mantiene los mensajes futuros enrutados a la misma sesión ACP.
- Esto todavía puede significar "iniciar una sesión ACP nueva de Codex", pero no crea por sí solo un hilo nuevo de Discord. El canal existente sigue siendo la superficie de chat.
- Codex puede seguir ejecutándose en su propio `cwd` o espacio de trabajo de backend en disco. Ese espacio de trabajo es estado de runtime, no un hilo de Discord.
- Los mensajes del hilo pueden heredar la vinculación ACP del canal padre.
- En un canal o hilo vinculado, `/new` y `/reset` restablecen la misma sesión ACP en el lugar.
- Las vinculaciones temporales de hilos siguen funcionando y pueden reemplazar la resolución de destino mientras estén activas.
- `spawnAcpSessions` solo es obligatorio cuando OpenClaw necesita crear/vincular un hilo hijo mediante `--thread auto|here`. No es obligatorio para `/acp spawn ... --bind here` en el canal actual.
Consulta [Agentes ACP](/es/tools/acp-agents) para ver detalles del comportamiento de los bindings.
Consulta [ACP Agents](/es/tools/acp-agents) para obtener detalles sobre el comportamiento de las vinculaciones.
</Accordion>
@ -795,11 +797,11 @@ Configuración predeterminada de comandos slash:
- `channels.discord.accounts.<accountId>.ackReaction`
- `channels.discord.ackReaction`
- `messages.ackReaction`
- respaldo del emoji de identidad del agente (`agents.list[].identity.emoji`, si no "👀")
- respaldo al emoji de identidad del agente (`agents.list[].identity.emoji`, o "👀" si no existe)
Notas:
- Discord acepta emoji Unicode o nombres de emoji personalizados.
- Discord acepta emoji unicode o nombres de emoji personalizados.
- Usa `""` para desactivar la reacción para un canal o cuenta.
</Accordion>
@ -807,7 +809,7 @@ Configuración predeterminada de comandos slash:
<Accordion title="Escrituras de configuración">
Las escrituras de configuración iniciadas desde el canal están habilitadas de forma predeterminada.
Esto afecta a los flujos `/config set|unset` (cuando las funciones de comando están habilitadas).
Esto afecta a los flujos `/config set|unset` (cuando las funciones de comandos están habilitadas).
Desactivar:
@ -823,8 +825,8 @@ Configuración predeterminada de comandos slash:
</Accordion>
<Accordion title="Proxy del gateway">
Enruta el tráfico WebSocket del gateway de Discord y las búsquedas REST de inicio (ID de aplicación + resolución de lista de permitidos) a través de un proxy HTTP(S) con `channels.discord.proxy`.
<Accordion title="Proxy de gateway">
Enruta el tráfico WebSocket de la gateway de Discord y las búsquedas REST de inicio (ID de aplicación + resolución de lista de permitidos) mediante un proxy HTTP(S) con `channels.discord.proxy`.
```json5
{
@ -836,7 +838,7 @@ Configuración predeterminada de comandos slash:
}
```
Anulación por cuenta:
Reemplazo por cuenta:
```json5
{
@ -854,8 +856,8 @@ Configuración predeterminada de comandos slash:
</Accordion>
<Accordion title="Compatibilidad con PluralKit">
Habilita la resolución de PluralKit para asignar mensajes proxy a la identidad del miembro del sistema:
<Accordion title="Soporte para PluralKit">
Habilita la resolución de PluralKit para asignar mensajes proxificados a la identidad del miembro del sistema:
```json5
{
@ -873,14 +875,14 @@ Configuración predeterminada de comandos slash:
Notas:
- las listas de permitidos pueden usar `pk:<memberId>`
- los nombres de visualización de miembros se comparan por nombre/slug solo cuando `channels.discord.dangerouslyAllowNameMatching: true`
- las búsquedas usan el ID del mensaje original y están limitadas por ventana temporal
- si la búsqueda falla, los mensajes proxy se tratan como mensajes de bot y se descartan a menos que `allowBots=true`
- los nombres visibles de miembro coinciden por nombre/slug solo cuando `channels.discord.dangerouslyAllowNameMatching: true`
- las búsquedas usan el ID del mensaje original y están limitadas por una ventana temporal
- si la búsqueda falla, los mensajes proxificados se tratan como mensajes de bot y se descartan salvo que `allowBots=true`
</Accordion>
<Accordion title="Configuración de presencia">
Las actualizaciones de presencia se aplican cuando estableces un campo de estado o actividad, o cuando habilitas la presencia automática.
Las actualizaciones de presencia se aplican cuando estableces un campo de estado o actividad, o cuando habilitas presencia automática.
Ejemplo solo de estado:
@ -894,7 +896,7 @@ Configuración predeterminada de comandos slash:
}
```
Ejemplo de actividad (el tipo de actividad predeterminado es estado personalizado):
Ejemplo de actividad (el estado personalizado es el tipo de actividad predeterminado):
```json5
{
@ -907,7 +909,7 @@ Configuración predeterminada de comandos slash:
}
```
Ejemplo de streaming:
Ejemplo de transmisión:
```json5
{
@ -930,7 +932,7 @@ Configuración predeterminada de comandos slash:
- 4: Custom (usa el texto de actividad como estado; el emoji es opcional)
- 5: Competing
Ejemplo de presencia automática (señal de estado del runtime):
Ejemplo de presencia automática (señal de estado de salud del runtime):
```json5
{
@ -947,7 +949,7 @@ Configuración predeterminada de comandos slash:
}
```
La presencia automática asigna la disponibilidad del runtime al estado de Discord: saludable => online, degradado o desconocido => idle, agotado o no disponible => dnd. Anulaciones opcionales de texto:
La presencia automática asigna la disponibilidad del runtime al estado de Discord: healthy => online, degraded o unknown => idle, exhausted o unavailable => dnd. Reemplazos de texto opcionales:
- `autoPresence.healthyText`
- `autoPresence.degradedText`
@ -956,43 +958,43 @@ Configuración predeterminada de comandos slash:
</Accordion>
<Accordion title="Aprobaciones en Discord">
Discord admite el manejo de aprobaciones mediante botones en mensajes directos y, opcionalmente, puede publicar solicitudes de aprobación en el canal de origen.
Discord admite manejo de aprobaciones con botones en mensajes directos y puede, de forma opcional, publicar solicitudes de aprobación en el canal de origen.
Ruta de configuración:
- `channels.discord.execApprovals.enabled`
- `channels.discord.execApprovals.approvers` (opcional; usa como respaldo `commands.ownerAllowFrom` cuando sea posible)
- `channels.discord.execApprovals.approvers` (opcional; usa `commands.ownerAllowFrom` como respaldo cuando es posible)
- `channels.discord.execApprovals.target` (`dm` | `channel` | `both`, predeterminado: `dm`)
- `agentFilter`, `sessionFilter`, `cleanupAfterResolve`
Discord habilita automáticamente las aprobaciones nativas de ejecución cuando `enabled` no está establecido o es `"auto"` y al menos se puede resolver un aprobador, ya sea desde `execApprovals.approvers` o desde `commands.ownerAllowFrom`. Discord no infiere aprobadores de ejecución desde `allowFrom` del canal, `dm.allowFrom` heredado ni `defaultTo` de mensaje directo. Establece `enabled: false` para desactivar explícitamente Discord como cliente nativo de aprobación.
Discord habilita automáticamente las aprobaciones nativas de ejecución cuando `enabled` no está definido o es `"auto"` y al menos un aprobador puede resolverse, ya sea desde `execApprovals.approvers` o desde `commands.ownerAllowFrom`. Discord no infiere aprobadores de ejecución desde `allowFrom` del canal, `dm.allowFrom` heredado ni `defaultTo` de mensajes directos. Establece `enabled: false` para desactivar Discord explícitamente como cliente de aprobación nativo.
Cuando `target` es `channel` o `both`, la solicitud de aprobación es visible en el canal. Solo los aprobadores resueltos pueden usar los botones; los demás usuarios reciben una denegación efímera. Las solicitudes de aprobación incluyen el texto del comando, así que habilita la entrega en canal solo en canales de confianza. Si el ID del canal no puede derivarse de la clave de sesión, OpenClaw vuelve a la entrega por mensaje directo.
Cuando `target` es `channel` o `both`, la solicitud de aprobación es visible en el canal. Solo los aprobadores resueltos pueden usar los botones; otros usuarios reciben una denegación efímera. Las solicitudes de aprobación incluyen el texto del comando, así que habilita la entrega en canal solo en canales de confianza. Si el ID del canal no puede derivarse de la clave de sesión, OpenClaw vuelve a la entrega por mensaje directo.
Discord también renderiza los botones compartidos de aprobación usados por otros canales de chat. El adaptador nativo de Discord añade principalmente el enrutamiento de mensajes directos a aprobadores y la distribución en canal.
Cuando esos botones están presentes, son la UX principal de aprobación; OpenClaw
Discord también renderiza los botones de aprobación compartidos usados por otros canales de chat. El adaptador nativo de Discord añade principalmente enrutamiento por mensaje directo para aprobadores y difusión al canal.
Cuando esos botones están presentes, son la experiencia principal de aprobación; OpenClaw
solo debería incluir un comando manual `/approve` cuando el resultado de la herramienta indique
que las aprobaciones por chat no están disponibles o que la aprobación manual es la única vía.
La autenticación del gateway para este controlador usa el mismo contrato compartido de resolución de credenciales que otros clientes del gateway:
La autenticación de gateway para este manejador usa el mismo contrato compartido de resolución de credenciales que otros clientes de Gateway:
- autenticación local con prioridad de entorno (`OPENCLAW_GATEWAY_TOKEN` / `OPENCLAW_GATEWAY_PASSWORD` y luego `gateway.auth.*`)
- en modo local, `gateway.remote.*` puede usarse como respaldo solo cuando `gateway.auth.*` no está establecido; los SecretRef locales configurados pero no resueltos fallan en modo cerrado
- compatibilidad con modo remoto mediante `gateway.remote.*` cuando corresponda
- las anulaciones de URL son seguras para anulación: las anulaciones de CLI no reutilizan credenciales implícitas, y las anulaciones de entorno usan solo credenciales del entorno
- autenticación local con prioridad a entorno (`OPENCLAW_GATEWAY_TOKEN` / `OPENCLAW_GATEWAY_PASSWORD` y luego `gateway.auth.*`)
- en modo local, `gateway.remote.*` puede usarse como respaldo solo cuando `gateway.auth.*` no está configurado; los SecretRef locales configurados pero no resueltos fallan en modo cerrado
- soporte de modo remoto mediante `gateway.remote.*` cuando corresponda
- los reemplazos de URL son seguros para reemplazo: los reemplazos de CLI no reutilizan credenciales implícitas, y los reemplazos de entorno usan solo credenciales del entorno
Comportamiento de resolución de aprobación:
- Los IDs con prefijo `plugin:` se resuelven mediante `plugin.approval.resolve`.
- Los demás IDs se resuelven mediante `exec.approval.resolve`.
- Discord no realiza aquí un salto adicional de respaldo de exec a plugin; el prefijo
del ID decide qué método del gateway llama.
- Otros IDs se resuelven mediante `exec.approval.resolve`.
- Discord no realiza aquí un salto adicional de respaldo de exec a plugin; el
prefijo del ID decide qué método de gateway llama.
Las aprobaciones de ejecución caducan después de 30 minutos de forma predeterminada. Si las aprobaciones fallan con
IDs de aprobación desconocidos, verifica la resolución de aprobadores, la habilitación de la función y
IDs de aprobación desconocidos, verifica la resolución de aprobadores, la habilitación de funciones y
que el tipo de ID de aprobación entregado coincida con la solicitud pendiente.
Documentación relacionada: [Aprobaciones de ejecución](/es/tools/exec-approvals)
Documentación relacionada: [Exec approvals](/es/tools/exec-approvals)
</Accordion>
</AccordionGroup>
@ -1008,24 +1010,26 @@ Ejemplos principales:
- moderación: `timeout`, `kick`, `ban`
- presencia: `setPresence`
Los controles de acciones se encuentran en `channels.discord.actions.*`.
La acción `event-create` acepta un parámetro `image` opcional (URL o ruta de archivo local) para establecer la imagen de portada del evento programado.
Comportamiento predeterminado de controles:
Los controles de acciones están en `channels.discord.actions.*`.
| Grupo de acciones | Predeterminado |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- |
Comportamiento predeterminado de los controles:
| Grupo de acciones | Predeterminado |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------- |
| reactions, messages, threads, pins, polls, search, memberInfo, roleInfo, channelInfo, channels, voiceStatus, events, stickers, emojiUploads, stickerUploads, permissions | habilitado |
| roles | deshabilitado |
| moderation | deshabilitado |
| presence | deshabilitado |
| roles | deshabilitado |
| moderation | deshabilitado |
| presence | deshabilitado |
## UI de componentes v2
## Interfaz Components v2
OpenClaw usa componentes v2 de Discord para aprobaciones de ejecución y marcadores entre contextos. Las acciones de mensajes de Discord también pueden aceptar `components` para UI personalizada (avanzado; requiere construir una carga de componente mediante la herramienta de Discord), mientras que los `embeds` heredados siguen disponibles pero no se recomiendan.
OpenClaw usa Discord components v2 para aprobaciones de ejecución y marcadores entre contextos. Las acciones de mensajes de Discord también pueden aceptar `components` para una interfaz personalizada (avanzado; requiere construir una carga útil de componentes mediante la herramienta de Discord), mientras que los `embeds` heredados siguen estando disponibles, pero no se recomiendan.
- `channels.discord.ui.components.accentColor` establece el color de acento usado por los contenedores de componentes de Discord (hex).
- Establécelo por cuenta con `channels.discord.accounts.<id>.ui.components.accentColor`.
- `embeds` se ignoran cuando hay componentes v2 presentes.
- `embeds` se ignoran cuando hay components v2 presentes.
Ejemplo:
@ -1045,15 +1049,15 @@ Ejemplo:
## Canales de voz
OpenClaw puede unirse a canales de voz de Discord para conversaciones continuas en tiempo real. Esto es independiente de los archivos adjuntos de mensajes de voz.
OpenClaw puede unirse a canales de voz de Discord para conversaciones continuas en tiempo real. Esto es independiente de los adjuntos de mensajes de voz.
Requisitos:
- Habilita comandos nativos (`commands.native` o `channels.discord.commands.native`).
- Configura `channels.discord.voice`.
- El bot necesita permisos de Connect + Speak en el canal de voz de destino.
- El bot necesita permisos Connect + Speak en el canal de voz de destino.
Usa el comando nativo exclusivo de Discord `/vc join|leave|status` para controlar las sesiones. El comando usa el agente predeterminado de la cuenta y sigue las mismas reglas de lista de permitidos y política de grupo que otros comandos de Discord.
Usa el comando nativo exclusivo de Discord `/vc join|leave|status` para controlar sesiones. El comando usa el agente predeterminado de la cuenta y sigue las mismas reglas de lista de permitidos y política de grupo que otros comandos de Discord.
Ejemplo de unión automática:
@ -1083,23 +1087,23 @@ Ejemplo de unión automática:
Notas:
- `voice.tts` anula `messages.tts` solo para la reproducción de voz.
- Los turnos de transcripción de voz derivan el estado de propietario de `allowFrom` de Discord (o `dm.allowFrom`); los hablantes que no son propietarios no pueden acceder a herramientas exclusivas del propietario (por ejemplo `gateway` y `cron`).
- La voz está habilitada de forma predeterminada; establece `channels.discord.voice.enabled=false` para deshabilitarla.
- `voice.daveEncryption` y `voice.decryptionFailureTolerance` se transfieren a las opciones de unión de `@discordjs/voice`.
- `voice.tts` reemplaza `messages.tts` solo para la reproducción de voz.
- Los turnos de transcripción de voz derivan el estado de propietario desde `allowFrom` de Discord (o `dm.allowFrom`); los hablantes que no son propietarios no pueden acceder a herramientas exclusivas del propietario (por ejemplo `gateway` y `cron`).
- La voz está habilitada de forma predeterminada; establece `channels.discord.voice.enabled=false` para desactivarla.
- `voice.daveEncryption` y `voice.decryptionFailureTolerance` se pasan directamente a las opciones de unión de `@discordjs/voice`.
- Los valores predeterminados de `@discordjs/voice` son `daveEncryption=true` y `decryptionFailureTolerance=24` si no se establecen.
- OpenClaw también observa fallos de descifrado en recepción y se recupera automáticamente saliendo y volviendo a unirse al canal de voz después de fallos repetidos en una ventana corta.
- Si los registros de recepción muestran repetidamente `DecryptionFailed(UnencryptedWhenPassthroughDisabled)`, esto puede ser el error ascendente de recepción de `@discordjs/voice` registrado en [discord.js #11419](https://github.com/discordjs/discord.js/issues/11419).
- OpenClaw también supervisa los fallos de descifrado de recepción y se recupera automáticamente saliendo y volviendo a unirse al canal de voz después de fallos repetidos en una ventana corta.
- Si los registros de recepción muestran repetidamente `DecryptionFailed(UnencryptedWhenPassthroughDisabled)`, esto puede ser el error upstream de recepción de `@discordjs/voice` rastreado en [discord.js #11419](https://github.com/discordjs/discord.js/issues/11419).
## Mensajes de voz
Los mensajes de voz de Discord muestran una vista previa de forma de onda y requieren audio OGG/Opus más metadatos. OpenClaw genera la forma de onda automáticamente, pero necesita `ffmpeg` y `ffprobe` disponibles en el host del gateway para inspeccionar y convertir archivos de audio.
Los mensajes de voz de Discord muestran una vista previa de forma de onda y requieren audio OGG/Opus más metadatos. OpenClaw genera la forma de onda automáticamente, pero necesita que `ffmpeg` y `ffprobe` estén disponibles en el host de la gateway para inspeccionar y convertir archivos de audio.
Requisitos y restricciones:
- Proporciona una **ruta de archivo local** (las URL se rechazan).
- Omite el contenido de texto (Discord no permite texto + mensaje de voz en la misma carga).
- Se acepta cualquier formato de audio; OpenClaw lo convierte a OGG/Opus cuando sea necesario.
- Proporciona una **ruta de archivo local** (las URLs se rechazan).
- Omite el contenido de texto (Discord no permite texto + mensaje de voz en la misma carga útil).
- Se acepta cualquier formato de audio; OpenClaw convierte a OGG/Opus cuando es necesario.
Ejemplo:
@ -1110,18 +1114,18 @@ message(action="send", channel="discord", target="channel:123", path="/path/to/a
## Solución de problemas
<AccordionGroup>
<Accordion title="Se usaron intents no permitidos o el bot no ve mensajes del servidor">
<Accordion title="Se usaron intents no permitidos o el bot no ve mensajes de servidor">
- habilita Message Content Intent
- habilita Server Members Intent cuando dependas de la resolución de usuario/miembro
- reinicia el gateway después de cambiar los intents
- reinicia la gateway después de cambiar intents
</Accordion>
<Accordion title="Mensajes del servidor bloqueados inesperadamente">
<Accordion title="Los mensajes de servidor se bloquean inesperadamente">
- verifica `groupPolicy`
- verifica la lista de permitidos de servidores en `channels.discord.guilds`
- verifica la lista de permitidos del servidor en `channels.discord.guilds`
- si existe el mapa `guild.channels`, solo se permiten los canales listados
- verifica el comportamiento de `requireMention` y los patrones de mención
@ -1138,13 +1142,13 @@ openclaw logs --follow
<Accordion title="Require mention false pero sigue bloqueado">
Causas comunes:
- `groupPolicy="allowlist"` sin una lista de permitidos coincidente de servidor/canal
- `requireMention` configurado en el lugar incorrecto (debe estar en `channels.discord.guilds` o en la entrada del canal)
- `groupPolicy="allowlist"` sin una lista de permitidos de servidor/canal que coincida
- `requireMention` configurado en el lugar equivocado (debe estar en `channels.discord.guilds` o en la entrada del canal)
- remitente bloqueado por la lista de permitidos `users` del servidor/canal
</Accordion>
<Accordion title="Los controladores de larga duración agotan el tiempo o duplican respuestas">
<Accordion title="Los manejadores de larga duración agotan el tiempo o duplican respuestas">
Registros típicos:
@ -1152,16 +1156,16 @@ openclaw logs --follow
- `Slow listener detected ...`
- `discord inbound worker timed out after ...`
Control de presupuesto del listener:
Ajuste del presupuesto del listener:
- cuenta única: `channels.discord.eventQueue.listenerTimeout`
- varias cuentas: `channels.discord.accounts.<accountId>.eventQueue.listenerTimeout`
- múltiples cuentas: `channels.discord.accounts.<accountId>.eventQueue.listenerTimeout`
Control de tiempo de espera de ejecución del worker:
Ajuste del tiempo límite de ejecución del worker:
- cuenta única: `channels.discord.inboundWorker.runTimeoutMs`
- varias cuentas: `channels.discord.accounts.<accountId>.inboundWorker.runTimeoutMs`
- predeterminado: `1800000` (30 minutos); establece `0` para deshabilitarlo
- múltiples cuentas: `channels.discord.accounts.<accountId>.inboundWorker.runTimeoutMs`
- predeterminado: `1800000` (30 minutos); establece `0` para desactivar
Línea base recomendada:
@ -1185,22 +1189,22 @@ openclaw logs --follow
```
Usa `eventQueue.listenerTimeout` para una configuración lenta del listener y `inboundWorker.runTimeoutMs`
solo si quieres una válvula de seguridad independiente para turnos de agente en cola.
solo si quieres una válvula de seguridad independiente para turnos del agente en cola.
</Accordion>
<Accordion title="Desajustes en la auditoría de permisos">
Las comprobaciones de permisos de `channels status --probe` solo funcionan para IDs numéricos de canal.
Las comprobaciones de permisos de `channels status --probe` solo funcionan con IDs numéricos de canal.
Si usas claves slug, la coincidencia en runtime puede seguir funcionando, pero el sondeo no puede verificar completamente los permisos.
Si usas claves slug, la coincidencia en runtime aún puede funcionar, pero el sondeo no puede verificar completamente los permisos.
</Accordion>
<Accordion title="Problemas de mensajes directos y vinculación">
<Accordion title="Problemas de mensajes directos y emparejamiento">
- mensaje directo deshabilitado: `channels.discord.dm.enabled=false`
- mensajes directos deshabilitados: `channels.discord.dm.enabled=false`
- política de mensajes directos deshabilitada: `channels.discord.dmPolicy="disabled"` (heredado: `channels.discord.dm.policy`)
- esperando aprobación de vinculación en modo `pairing`
- esperando aprobación de emparejamiento en modo `pairing`
</Accordion>
@ -1208,19 +1212,19 @@ openclaw logs --follow
De forma predeterminada, los mensajes creados por bots se ignoran.
Si estableces `channels.discord.allowBots=true`, usa reglas estrictas de mención y lista de permitidos para evitar comportamientos en bucle.
Prefiere `channels.discord.allowBots="mentions"` para aceptar solo mensajes de bots que mencionen al bot.
Prefiere `channels.discord.allowBots="mentions"` para aceptar solo mensajes de bot que mencionen al bot.
</Accordion>
<Accordion title="La STT de voz se pierde con DecryptionFailed(...)">
<Accordion title="Las transcripciones de voz STT se pierden con DecryptionFailed(...)">
- mantén OpenClaw actualizado (`openclaw update`) para que esté presente la lógica de recuperación de recepción de voz de Discord
- confirma `channels.discord.voice.daveEncryption=true` (predeterminado)
- empieza desde `channels.discord.voice.decryptionFailureTolerance=24` (valor predeterminado ascendente) y ajusta solo si hace falta
- empieza con `channels.discord.voice.decryptionFailureTolerance=24` (valor predeterminado upstream) y ajústalo solo si es necesario
- observa los registros para:
- `discord voice: DAVE decrypt failures detected`
- `discord voice: repeated decrypt failures; attempting rejoin`
- si los fallos continúan después de la reconexión automática, recopila registros y compáralos con [discord.js #11419](https://github.com/discordjs/discord.js/issues/11419)
- si los fallos continúan después de volver a unirse automáticamente, recopila registros y compáralos con [discord.js #11419](https://github.com/discordjs/discord.js/issues/11419)
</Accordion>
</AccordionGroup>
@ -1229,20 +1233,20 @@ openclaw logs --follow
Referencia principal:
- [Referencia de configuración - Discord](/es/gateway/configuration-reference#discord)
- [Configuration reference - Discord](/es/gateway/configuration-reference#discord)
Campos de Discord de alta señal:
- inicio/autenticación: `enabled`, `token`, `accounts.*`, `allowBots`
- política: `groupPolicy`, `dm.*`, `guilds.*`, `guilds.*.channels.*`
- comando: `commands.native`, `commands.useAccessGroups`, `configWrites`, `slashCommand.*`
- comandos: `commands.native`, `commands.useAccessGroups`, `configWrites`, `slashCommand.*`
- cola de eventos: `eventQueue.listenerTimeout` (presupuesto del listener), `eventQueue.maxQueueSize`, `eventQueue.maxConcurrency`
- worker entrante: `inboundWorker.runTimeoutMs`
- respuesta/historial: `replyToMode`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
- entrega: `textChunkLimit`, `chunkMode`, `maxLinesPerMessage`
- streaming: `streaming` (alias heredado: `streamMode`), `draftChunk`, `blockStreaming`, `blockStreamingCoalesce`
- transmisión: `streaming` (alias heredado: `streamMode`), `draftChunk`, `blockStreaming`, `blockStreamingCoalesce`
- multimedia/reintentos: `mediaMaxMb`, `retry`
- `mediaMaxMb` limita las cargas salientes a Discord (predeterminado: `100MB`)
- `mediaMaxMb` limita las subidas salientes a Discord (predeterminado: `100MB`)
- acciones: `actions.*`
- presencia: `activity`, `status`, `activityType`, `activityUrl`
- UI: `ui.components.accentColor`
@ -1250,16 +1254,16 @@ Campos de Discord de alta señal:
## Seguridad y operaciones
- Trata los tokens del bot como secretos (se prefiere `DISCORD_BOT_TOKEN` en entornos supervisados).
- Otorga permisos de Discord con privilegio mínimo.
- Si el despliegue/estado de comandos está obsoleto, reinicia el gateway y vuelve a comprobar con `openclaw channels status --probe`.
- Trata los tokens de bot como secretos (`DISCORD_BOT_TOKEN` es lo preferido en entornos supervisados).
- Otorga permisos de Discord con privilegios mínimos.
- Si el despliegue/estado de comandos está desactualizado, reinicia la gateway y vuelve a comprobar con `openclaw channels status --probe`.
## Relacionado
- [Vinculación](/es/channels/pairing)
- [Emparejamiento](/es/channels/pairing)
- [Grupos](/es/channels/groups)
- [Enrutamiento de canales](/es/channels/channel-routing)
- [Seguridad](/es/gateway/security)
- [Enrutamiento de múltiples agentes](/es/concepts/multi-agent)
- [Enrutamiento multiagente](/es/concepts/multi-agent)
- [Solución de problemas](/es/channels/troubleshooting)
- [Comandos slash](/es/tools/slash-commands)
- [Comandos de barra inclinada](/es/tools/slash-commands)

File diff suppressed because it is too large Load Diff

View File

@ -1,175 +1,176 @@
---
read_when:
- Necesitas un recorrido exacto del bucle del agente o de los eventos del ciclo de vida
summary: Ciclo de vida del bucle del agente, streams y semántica de espera
- Necesitas una guía exacta del bucle del agente o de los eventos del ciclo de vida
summary: Ciclo de vida del bucle del agente, flujos y semántica de espera
title: Bucle del agente
x-i18n:
generated_at: "2026-04-05T12:39:34Z"
generated_at: "2026-04-09T01:27:48Z"
model: gpt-5.4
provider: openai
source_hash: 8e562e63c494881e9c345efcb93c5f972d69aaec61445afc3d4ad026b2d26883
source_hash: 32d3a73df8dabf449211a6183a70dcfd2a9b6f584dc76d0c4c9147582b2ca6a1
source_path: concepts/agent-loop.md
workflow: 15
---
# Bucle del agente (OpenClaw)
Un bucle agéntico es la ejecución completa y “real” de un agente: entrada → ensamblaje de contexto → inferencia del modelo →
Un bucle agéntico es la ejecución “real” completa de un agente: entrada → ensamblaje de contexto → inferencia del modelo →
ejecución de herramientas → respuestas en streaming → persistencia. Es la ruta autoritativa que convierte un mensaje
en acciones y una respuesta final, mientras mantiene coherente el estado de la sesión.
En OpenClaw, un bucle es una única ejecución serializada por sesión que emite eventos de ciclo de vida y de stream
mientras el modelo piensa, llama herramientas y transmite salida. Este documento explica cómo está
conectado de extremo a extremo ese bucle auténtico.
En OpenClaw, un bucle es una sola ejecución serializada por sesión que emite eventos de ciclo de vida y de flujo
mientras el modelo piensa, llama herramientas y transmite la salida. Este documento explica cómo se conecta ese bucle auténtico de extremo a extremo.
## Puntos de entrada
- RPC del Gateway: `agent` y `agent.wait`.
- RPC del gateway: `agent` y `agent.wait`.
- CLI: comando `agent`.
## Cómo funciona (alto nivel)
## Cómo funciona (visión general)
1. El RPC `agent` valida parámetros, resuelve la sesión (`sessionKey`/`sessionId`), conserva los metadatos de la sesión y devuelve `{ runId, acceptedAt }` de inmediato.
1. El RPC `agent` valida los parámetros, resuelve la sesión (sessionKey/sessionId), persiste los metadatos de la sesión y devuelve `{ runId, acceptedAt }` de inmediato.
2. `agentCommand` ejecuta el agente:
- resuelve el modelo y los valores predeterminados de thinking/verbose
- resuelve los valores predeterminados de modelo + thinking/verbose
- carga la instantánea de Skills
- llama a `runEmbeddedPiAgent` (tiempo de ejecución de pi-agent-core)
- llama a `runEmbeddedPiAgent` (runtime de pi-agent-core)
- emite **lifecycle end/error** si el bucle integrado no emite uno
3. `runEmbeddedPiAgent`:
- serializa ejecuciones mediante colas por sesión y una cola global
- resuelve el perfil de modelo y autenticación y construye la sesión de pi
- se suscribe a eventos de pi y transmite deltas del asistente y de herramientas
- serializa las ejecuciones mediante colas por sesión y una cola global
- resuelve el perfil de modelo + autenticación y construye la sesión de Pi
- se suscribe a los eventos de Pi y transmite los deltas del asistente/herramientas
- aplica el tiempo de espera -> aborta la ejecución si se supera
- devuelve cargas útiles y metadatos de uso
4. `subscribeEmbeddedPiSession` conecta los eventos de pi-agent-core al stream `agent` de OpenClaw:
- eventos de herramienta => `stream: "tool"`
- devuelve payloads + metadatos de uso
4. `subscribeEmbeddedPiSession` conecta los eventos de pi-agent-core con el flujo `agent` de OpenClaw:
- eventos de herramientas => `stream: "tool"`
- deltas del asistente => `stream: "assistant"`
- eventos de ciclo de vida => `stream: "lifecycle"` (`phase: "start" | "end" | "error"`)
5. `agent.wait` usa `waitForAgentRun`:
- espera **lifecycle end/error** para `runId`
- devuelve `{ status: ok|error|timeout, startedAt, endedAt, error? }`
## Colas y concurrencia
## Cola + concurrencia
- Las ejecuciones se serializan por clave de sesión (carril de sesión) y, opcionalmente, mediante un carril global.
- Esto evita condiciones de carrera de herramientas o sesiones y mantiene coherente el historial de la sesión.
- Las ejecuciones se serializan por clave de sesión (carril de sesión) y, opcionalmente, a través de un carril global.
- Esto evita condiciones de carrera de herramientas/sesión y mantiene coherente el historial de la sesión.
- Los canales de mensajería pueden elegir modos de cola (collect/steer/followup) que alimentan este sistema de carriles.
Consulta [Command Queue](/concepts/queue).
Consulta [Cola de comandos](/es/concepts/queue).
## Preparación de sesión y espacio de trabajo
## Preparación de sesión + espacio de trabajo
- El espacio de trabajo se resuelve y se crea; las ejecuciones en sandbox pueden redirigirse a una raíz de espacio de trabajo aislada.
- Se cargan Skills (o se reutilizan desde una instantánea) y se inyectan en el entorno y en el prompt.
- Los archivos de bootstrap/contexto se resuelven y se inyectan en el informe del prompt del sistema.
- El espacio de trabajo se resuelve y se crea; las ejecuciones en sandbox pueden redirigirse a una raíz de espacio de trabajo en sandbox.
- Las Skills se cargan (o se reutilizan desde una instantánea) y se inyectan en el entorno y en el prompt.
- Los archivos de bootstrap/contexto se resuelven y se inyectan en el informe del system prompt.
- Se adquiere un bloqueo de escritura de sesión; `SessionManager` se abre y se prepara antes del streaming.
## Ensamblaje del prompt y prompt del sistema
## Ensamblaje del prompt + system prompt
- El prompt del sistema se construye a partir del prompt base de OpenClaw, el prompt de Skills, el contexto de bootstrap y las anulaciones por ejecución.
- Se aplican límites específicos del modelo y reservas de tokens para compactación.
- Consulta [System prompt](/concepts/system-prompt) para ver lo que ve el modelo.
- El system prompt se construye a partir del prompt base de OpenClaw, el prompt de Skills, el contexto de bootstrap y las anulaciones por ejecución.
- Se aplican los límites específicos del modelo y los tokens reservados para compactación.
- Consulta [System prompt](/es/concepts/system-prompt) para ver lo que ve el modelo.
## Puntos de hook (donde puedes interceptar)
OpenClaw tiene dos sistemas de hooks:
- **Hooks internos** (hooks del Gateway): scripts controlados por eventos para comandos y eventos del ciclo de vida.
- **Hooks de plugin**: puntos de extensión dentro del ciclo de vida del agente o herramienta y de la canalización del gateway.
- **Hooks internos** (hooks del gateway): scripts impulsados por eventos para comandos y eventos del ciclo de vida.
- **Hooks de plugin**: puntos de extensión dentro del ciclo de vida del agente/herramientas y del pipeline del gateway.
### Hooks internos (hooks del Gateway)
### Hooks internos (hooks del gateway)
- **`agent:bootstrap`**: se ejecuta mientras se construyen archivos de bootstrap antes de que el prompt del sistema se finalice.
Úsalo para añadir o eliminar archivos de contexto de bootstrap.
- **Hooks de comandos**: `/new`, `/reset`, `/stop` y otros eventos de comandos (consulta la documentación de Hooks).
- **`agent:bootstrap`**: se ejecuta mientras se construyen los archivos de bootstrap antes de que se finalice el system prompt.
Úsalo para agregar o eliminar archivos de contexto de bootstrap.
- **Hooks de comandos**: `/new`, `/reset`, `/stop` y otros eventos de comandos (consulta el documento de Hooks).
Consulta [Hooks](/automation/hooks) para ver configuración y ejemplos.
Consulta [Hooks](/es/automation/hooks) para la configuración y ejemplos.
### Hooks de plugin (ciclo de vida del agente y del gateway)
### Hooks de plugin (ciclo de vida del agente + gateway)
Se ejecutan dentro del bucle del agente o de la canalización del gateway:
Estos se ejecutan dentro del bucle del agente o del pipeline del gateway:
- **`before_model_resolve`**: se ejecuta antes de la sesión (sin `messages`) para anular de forma determinista el proveedor o modelo antes de la resolución del modelo.
- **`before_prompt_build`**: se ejecuta después de cargar la sesión (con `messages`) para inyectar `prependContext`, `systemPrompt`, `prependSystemContext` o `appendSystemContext` antes del envío del prompt. Usa `prependContext` para texto dinámico por turno y campos de contexto del sistema para guía estable que deba situarse en el espacio del prompt del sistema.
- **`before_agent_start`**: hook heredado de compatibilidad que puede ejecutarse en cualquiera de las fases; prefiere los hooks explícitos anteriores.
- **`before_agent_reply`**: se ejecuta después de las acciones en línea y antes de la llamada al LLM, permitiendo que un plugin reclame el turno y devuelva una respuesta sintética o silencie completamente el turno.
- **`agent_end`**: inspecciona la lista final de mensajes y los metadatos de la ejecución tras completarse.
- **`before_compaction` / `after_compaction`**: observan o anotan ciclos de compactación.
- **`before_tool_call` / `after_tool_call`**: interceptan parámetros y resultados de herramientas.
- **`before_install`**: inspecciona hallazgos del análisis integrado y, opcionalmente, bloquea instalaciones de Skills o plugins.
- **`tool_result_persist`**: transforma sincrónicamente resultados de herramientas antes de que se escriban en la transcripción de la sesión.
- **`message_received` / `message_sending` / `message_sent`**: hooks de mensajes entrantes y salientes.
- **`before_model_resolve`**: se ejecuta antes de la sesión (sin `messages`) para anular de forma determinista el proveedor/modelo antes de la resolución del modelo.
- **`before_prompt_build`**: se ejecuta después de cargar la sesión (con `messages`) para inyectar `prependContext`, `systemPrompt`, `prependSystemContext` o `appendSystemContext` antes de enviar el prompt. Usa `prependContext` para texto dinámico por turno y los campos de contexto del sistema para guía estable que deba ubicarse en el espacio del system prompt.
- **`before_agent_start`**: hook heredado de compatibilidad que puede ejecutarse en cualquiera de las dos fases; prefiere los hooks explícitos anteriores.
- **`before_agent_reply`**: se ejecuta después de las acciones en línea y antes de la llamada al LLM, permitiendo que un plugin reclame el turno y devuelva una respuesta sintética o silencie el turno por completo.
- **`agent_end`**: inspecciona la lista final de mensajes y los metadatos de ejecución tras completarse.
- **`before_compaction` / `after_compaction`**: observan o anotan los ciclos de compactación.
- **`before_tool_call` / `after_tool_call`**: interceptan los parámetros/resultados de las herramientas.
- **`before_install`**: inspecciona los resultados del análisis integrado y, opcionalmente, bloquea instalaciones de Skills o plugins.
- **`tool_result_persist`**: transforma de forma síncrona los resultados de herramientas antes de que se escriban en la transcripción de la sesión.
- **`message_received` / `message_sending` / `message_sent`**: hooks de mensajes entrantes + salientes.
- **`session_start` / `session_end`**: límites del ciclo de vida de la sesión.
- **`gateway_start` / `gateway_stop`**: eventos del ciclo de vida del gateway.
Reglas de decisión de hooks para controles de salida y herramientas:
Reglas de decisión de hooks para guardas de salida/herramientas:
- `before_tool_call`: `{ block: true }` es terminal y detiene controladores de menor prioridad.
- `before_tool_call`: `{ block: false }` es una operación nula y no elimina un bloqueo previo.
- `before_install`: `{ block: true }` es terminal y detiene controladores de menor prioridad.
- `before_install`: `{ block: false }` es una operación nula y no elimina un bloqueo previo.
- `message_sending`: `{ cancel: true }` es terminal y detiene controladores de menor prioridad.
- `message_sending`: `{ cancel: false }` es una operación nula y no elimina una cancelación previa.
- `before_tool_call`: `{ block: true }` es terminal y detiene los manejadores de menor prioridad.
- `before_tool_call`: `{ block: false }` no hace nada y no elimina un bloqueo previo.
- `before_install`: `{ block: true }` es terminal y detiene los manejadores de menor prioridad.
- `before_install`: `{ block: false }` no hace nada y no elimina un bloqueo previo.
- `message_sending`: `{ cancel: true }` es terminal y detiene los manejadores de menor prioridad.
- `message_sending`: `{ cancel: false }` no hace nada y no elimina una cancelación previa.
Consulta [Plugin hooks](/plugins/architecture#provider-runtime-hooks) para ver la API de hooks y los detalles de registro.
Consulta [Hooks de plugin](/es/plugins/architecture#provider-runtime-hooks) para la API de hooks y los detalles de registro.
## Streaming y respuestas parciales
## Streaming + respuestas parciales
- Los deltas del asistente se transmiten desde pi-agent-core y se emiten como eventos `assistant`.
- El streaming por bloques puede emitir respuestas parciales en `text_end` o `message_end`.
- El streaming de razonamiento puede emitirse como un stream separado o como respuestas por bloques.
- Consulta [Streaming](/concepts/streaming) para ver el comportamiento de fragmentación y respuestas por bloques.
- El streaming por bloques puede emitir respuestas parciales en `text_end` o en `message_end`.
- El streaming de razonamiento puede emitirse como un flujo independiente o como respuestas por bloques.
- Consulta [Streaming](/es/concepts/streaming) para el comportamiento de fragmentación y respuestas por bloques.
## Ejecución de herramientas y herramientas de mensajería
## Ejecución de herramientas + herramientas de mensajería
- Los eventos de inicio, actualización y fin de herramientas se emiten en el stream `tool`.
- Los resultados de herramientas se sanean en cuanto a tamaño y cargas útiles de imágenes antes de registrarse o emitirse.
- Los eventos de inicio/actualización/fin de herramientas se emiten en el flujo `tool`.
- Los resultados de herramientas se sanean por tamaño y payloads de imagen antes de registrarlos/emitirlos.
- Los envíos de herramientas de mensajería se rastrean para suprimir confirmaciones duplicadas del asistente.
## Modelado de la respuesta y supresión
## Modelado de respuestas + supresión
- Las cargas útiles finales se ensamblan a partir de:
- Los payloads finales se ensamblan a partir de:
- texto del asistente (y razonamiento opcional)
- resúmenes de herramientas en línea (cuando verbose + allowed)
- texto de error del asistente cuando el modelo falla
- El token silencioso exacto `NO_REPLY` / `no_reply` se filtra de las
cargas útiles salientes.
- Los duplicados de herramientas de mensajería se eliminan de la lista final de cargas útiles.
- Si no quedan cargas útiles representables y una herramienta falló, se emite
una respuesta alternativa de error de herramienta (a menos que una herramienta de mensajería ya haya enviado una respuesta visible para el usuario).
- resúmenes de herramientas en línea (cuando verbose + permitido)
- texto de error del asistente cuando falla el modelo
- El token silencioso exacto `NO_REPLY` / `no_reply` se filtra de los
payloads salientes.
- Los duplicados de herramientas de mensajería se eliminan de la lista final de payloads.
- Si no quedan payloads renderizables y una herramienta falló, se emite
una respuesta de error de herramienta de respaldo
(a menos que una herramienta de mensajería ya haya enviado una respuesta visible para el usuario).
## Compactación y reintentos
## Compactación + reintentos
- La compactación automática emite eventos de stream `compaction` y puede activar un reintento.
- En el reintento, se restablecen los búferes en memoria y los resúmenes de herramientas para evitar salida duplicada.
- Consulta [Compaction](/concepts/compaction) para ver la canalización de compactación.
- La compactación automática emite eventos de flujo `compaction` y puede activar un reintento.
- En un reintento, los búferes en memoria y los resúmenes de herramientas se restablecen para evitar salida duplicada.
- Consulta [Compactación](/es/concepts/compaction) para el pipeline de compactación.
## Streams de eventos (actualmente)
## Flujos de eventos (hoy)
- `lifecycle`: emitido por `subscribeEmbeddedPiSession` (y como respaldo por `agentCommand`)
- `assistant`: deltas transmitidos desde pi-agent-core
- `tool`: eventos de herramientas transmitidos desde pi-agent-core
- `assistant`: deltas en streaming desde pi-agent-core
- `tool`: eventos de herramientas en streaming desde pi-agent-core
## Manejo del canal de chat
- Los deltas del asistente se almacenan en búfer en mensajes `delta` del chat.
- Se emite un `final` del chat en **lifecycle end/error**.
- Se emite un `final` de chat en **lifecycle end/error**.
## Tiempos de espera
- Predeterminado de `agent.wait`: 30 s (solo la espera). El parámetro `timeoutMs` lo sustituye.
- Tiempo de ejecución del agente: valor predeterminado de `agents.defaults.timeoutSeconds` 172800 s (48 horas); se aplica en el temporizador de aborto de `runEmbeddedPiAgent`.
- Valor predeterminado de `agent.wait`: 30 s (solo la espera). El parámetro `timeoutMs` lo reemplaza.
- Runtime del agente: `agents.defaults.timeoutSeconds`, valor predeterminado 172800 s (48 horas); se aplica en el temporizador de aborto de `runEmbeddedPiAgent`.
- Tiempo de espera inactivo del LLM: `agents.defaults.llm.idleTimeoutSeconds` aborta una solicitud al modelo cuando no llegan fragmentos de respuesta antes de la ventana de inactividad. Establécelo explícitamente para modelos locales lentos o proveedores de razonamiento/llamadas a herramientas; establécelo en 0 para desactivarlo. Si no se establece, OpenClaw usa `agents.defaults.timeoutSeconds` cuando está configurado; de lo contrario, 60 s. Las ejecuciones activadas por cron sin tiempo de espera explícito del LLM o del agente desactivan el watchdog de inactividad y dependen del tiempo de espera externo del cron.
## Dónde puede terminar antes de tiempo
## Dónde las cosas pueden terminar antes de tiempo
- Tiempo de espera del agente (aborto)
- AbortSignal (cancelación)
- Desconexión del gateway o tiempo de espera de RPC
- Tiempo de espera de `agent.wait` (solo espera, no detiene al agente)
- Tiempo de espera de `agent.wait` (solo de espera, no detiene al agente)
## Relacionado
- [Tools](/tools) — herramientas disponibles del agente
- [Hooks](/automation/hooks) — scripts controlados por eventos activados por eventos del ciclo de vida del agente
- [Compaction](/concepts/compaction) — cómo se resumen las conversaciones largas
- [Exec Approvals](/tools/exec-approvals) — puertas de aprobación para comandos de shell
- [Thinking](/tools/thinking) — configuración del nivel de thinking/razonamiento
- [Herramientas](/es/tools) — herramientas disponibles del agente
- [Hooks](/es/automation/hooks) — scripts impulsados por eventos activados por eventos del ciclo de vida del agente
- [Compactación](/es/concepts/compaction) — cómo se resumen las conversaciones largas
- [Aprobaciones de Exec](/es/tools/exec-approvals) — puertas de aprobación para comandos de shell
- [Thinking](/es/tools/thinking) — configuración del nivel de thinking/razonamiento

View File

@ -2,32 +2,32 @@
read_when:
- Quieres que la promoción de memoria se ejecute automáticamente
- Quieres entender qué hace cada fase de dreaming
- Quieres ajustar la consolidación sin contaminar MEMORY.md
- Quieres ajustar la consolidación sin contaminar `MEMORY.md`
summary: Consolidación de memoria en segundo plano con fases ligera, profunda y REM, además de un Diario de Sueños
title: Dreaming (experimental)
x-i18n:
generated_at: "2026-04-06T05:12:22Z"
generated_at: "2026-04-09T01:27:48Z"
model: gpt-5.4
provider: openai
source_hash: 36c4b1e70801d662090dc8ce20608c2f141c23cd7ce53c54e3dcf332c801fd4e
source_hash: 26476eddb8260e1554098a6adbb069cf7f5e284cf2e09479c6d9d8f8b93280ef
source_path: concepts/dreaming.md
workflow: 15
---
# Dreaming (experimental)
Dreaming es el sistema de consolidación de memoria en segundo plano de `memory-core`.
Ayuda a OpenClaw a mover señales fuertes de corto plazo a memoria duradera, mientras
Dreaming es el sistema de consolidación de memoria en segundo plano en `memory-core`.
Ayuda a OpenClaw a mover señales sólidas de corto plazo a memoria duradera mientras
mantiene el proceso explicable y revisable.
Dreaming es **optativo** y está desactivado de forma predeterminada.
Dreaming es **optativo** y está deshabilitado de forma predeterminada.
## Qué escribe dreaming
Dreaming mantiene dos tipos de salida:
- **Estado de máquina** en `memory/.dreams/` (almacén de recuperación, señales de fase, puntos de control de ingestión, bloqueos).
- **Salida legible por humanos** en `DREAMS.md` (o `dreams.md` existente) y archivos opcionales de informes de fase en `memory/dreaming/<phase>/YYYY-MM-DD.md`.
- **Estado de máquina** en `memory/.dreams/` (almacén de recuperación, señales de fase, puntos de control de ingesta, bloqueos).
- **Salida legible por humanos** en `DREAMS.md` (o `dreams.md` existente) y archivos opcionales de informe de fase en `memory/dreaming/<phase>/YYYY-MM-DD.md`.
La promoción a largo plazo sigue escribiendo solo en `MEMORY.md`.
@ -35,33 +35,33 @@ La promoción a largo plazo sigue escribiendo solo en `MEMORY.md`.
Dreaming usa tres fases cooperativas:
| Fase | Propósito | Escritura duradera |
| ----- | --------- | ------------------ |
| Ligera | Ordenar y preparar material reciente de corto plazo | No |
| Profunda | Puntuar y promover candidatos duraderos | Sí (`MEMORY.md`) |
| REM | Reflexionar sobre temas e ideas recurrentes | No |
| Fase | Propósito | Escritura duradera |
| ----- | ----------------------------------------- | ------------------ |
| Light | Ordenar y preparar material reciente de corto plazo | No |
| Deep | Puntuar y promover candidatos duraderos | Sí (`MEMORY.md`) |
| REM | Reflexionar sobre temas e ideas recurrentes | No |
Estas fases son detalles internos de implementación, no "modos"
separados configurados por el usuario.
configurables por el usuario por separado.
### Fase ligera
### Fase Light
La fase ligera ingiere señales recientes de memoria diaria y rastros de recuperación, los deduplica
La fase Light ingiere señales recientes de memoria diaria y rastros de recuperación, los deduplica
y prepara líneas candidatas.
- Lee del estado de recuperación a corto plazo y de archivos recientes de memoria diaria.
- Lee del estado de recuperación de corto plazo, archivos recientes de memoria diaria y transcripciones de sesión redactadas cuando están disponibles.
- Escribe un bloque administrado `## Light Sleep` cuando el almacenamiento incluye salida en línea.
- Registra señales de refuerzo para una clasificación profunda posterior.
- Nunca escribe en `MEMORY.md`.
### Fase profunda
### Fase Deep
La fase profunda decide qué se convierte en memoria a largo plazo.
La fase Deep decide qué pasa a convertirse en memoria a largo plazo.
- Clasifica candidatos usando puntuación ponderada y umbrales de acceso.
- Clasifica los candidatos usando puntuación ponderada y umbrales de validación.
- Requiere que `minScore`, `minRecallCount` y `minUniqueQueries` se cumplan.
- Rehidrata fragmentos desde archivos diarios activos antes de escribir, por lo que se omiten los fragmentos obsoletos o eliminados.
- Agrega entradas promovidas a `MEMORY.md`.
- Agrega las entradas promovidas a `MEMORY.md`.
- Escribe un resumen `## Deep Sleep` en `DREAMS.md` y, opcionalmente, escribe `memory/dreaming/deep/YYYY-MM-DD.md`.
### Fase REM
@ -73,40 +73,62 @@ La fase REM extrae patrones y señales reflexivas.
- Registra señales de refuerzo REM usadas por la clasificación profunda.
- Nunca escribe en `MEMORY.md`.
## Ingesta de transcripciones de sesión
Dreaming puede ingerir transcripciones de sesión redactadas en el corpus de dreaming. Cuando
las transcripciones están disponibles, se incorporan en la fase Light junto con señales de
memoria diaria y rastros de recuperación. El contenido personal y sensible se redacta
antes de la ingesta.
## Diario de Sueños
Dreaming también mantiene un **Diario de Sueños** narrativo en `DREAMS.md`.
Después de que cada fase tiene suficiente material, `memory-core` ejecuta un turno
de subagente en segundo plano de mejor esfuerzo (usando el modelo de runtime predeterminado) y agrega una entrada breve al diario.
de subagente en segundo plano de mejor esfuerzo (usando el modelo de runtime predeterminado)
y agrega una entrada breve del diario.
Este diario es para lectura humana en la UI de Dreams, no una fuente de promoción.
Este diario es para lectura humana en la IU de Dreams, no una fuente de promoción.
También existe una vía de relleno histórico fundamentado para trabajo de revisión y recuperación:
- `memory rem-harness --path ... --grounded` previsualiza la salida del diario fundamentado a partir de notas históricas `YYYY-MM-DD.md`.
- `memory rem-backfill --path ...` escribe entradas fundamentadas reversibles del diario en `DREAMS.md`.
- `memory rem-backfill --path ... --stage-short-term` prepara candidatos duraderos fundamentados en el mismo almacén de evidencias de corto plazo que la fase Deep normal ya usa.
- `memory rem-backfill --rollback` y `--rollback-short-term` eliminan esos artefactos de relleno preparados sin tocar las entradas normales del diario ni la recuperación activa de corto plazo.
La IU de Control expone el mismo flujo de relleno/restablecimiento del diario para que puedas inspeccionar
los resultados en la escena de Dreams antes de decidir si los candidatos fundamentados
merecen promoción. La escena también muestra una vía fundamentada distinta para que puedas ver
qué entradas preparadas de corto plazo provinieron de la reproducción histórica, qué elementos promovidos
fueron impulsados por la vía fundamentada, y borrar solo las entradas preparadas exclusivamente fundamentadas sin
tocar el estado normal activo de corto plazo.
## Señales de clasificación profunda
La clasificación profunda usa seis señales base ponderadas más refuerzo de fase:
| Señal | Peso | Descripción |
| ------ | ---- | ----------- |
| Frecuencia | 0.24 | Cuántas señales de corto plazo acumuló la entrada |
| Relevancia | 0.30 | Calidad media de recuperación de la entrada |
| Señal | Peso | Descripción |
| ------------------- | ---- | ------------------------------------------------- |
| Frecuencia | 0.24 | Cuántas señales de corto plazo acumuló la entrada |
| Relevancia | 0.30 | Calidad media de recuperación de la entrada |
| Diversidad de consultas | 0.15 | Contextos distintos de consulta/día en que apareció |
| Recencia | 0.15 | Puntuación de frescura con decaimiento temporal |
| Consolidación | 0.10 | Fuerza de recurrencia en varios días |
| Riqueza conceptual | 0.06 | Densidad de etiquetas conceptuales del fragmento/ruta |
| Recencia | 0.15 | Puntuación de frescura con decaimiento temporal |
| Consolidación | 0.10 | Fuerza de recurrencia en varios días |
| Riqueza conceptual | 0.06 | Densidad de etiquetas conceptuales del fragmento/ruta |
Los aciertos de las fases ligera y REM añaden un pequeño refuerzo con decaimiento por recencia desde
Los aciertos de las fases Light y REM agregan un pequeño impulso con decaimiento por recencia desde
`memory/.dreams/phase-signals.json`.
## Programación
Cuando está habilitado, `memory-core` administra automáticamente una tarea cron para un barrido
completo de dreaming. Cada barrido ejecuta las fases en orden: ligera -> REM -> profunda.
Cuando está habilitado, `memory-core` administra automáticamente un trabajo cron para un barrido
completo de dreaming. Cada barrido ejecuta las fases en orden: light -> REM -> deep.
Comportamiento predeterminado de la cadencia:
| Configuración | Predeterminado |
| ------------- | -------------- |
| `dreaming.frequency` | `0 3 * * *` |
| Ajuste | Predeterminado |
| -------------------- | -------------- |
| `dreaming.frequency` | `0 3 * * *` |
## Inicio rápido
@ -148,7 +170,7 @@ Habilitar dreaming con una cadencia de barrido personalizada:
}
```
## Comando de barra
## Comando de barra inclinada
```
/dreaming status
@ -159,7 +181,7 @@ Habilitar dreaming con una cadencia de barrido personalizada:
## Flujo de trabajo de la CLI
Usa la promoción de la CLI para vista previa o aplicación manual:
Usa la promoción de la CLI para previsualizar o aplicar manualmente:
```bash
openclaw memory promote
@ -168,8 +190,8 @@ openclaw memory promote --limit 5
openclaw memory status --deep
```
La ejecución manual de `memory promote` usa los umbrales de la fase profunda de forma predeterminada, salvo que se sobrescriban
con flags de la CLI.
`memory promote` manual usa umbrales de la fase Deep de forma predeterminada, a menos que se reemplacen
con banderas de la CLI.
Explica por qué un candidato específico se promovería o no:
@ -178,7 +200,7 @@ openclaw memory promote-explain "router vlan"
openclaw memory promote-explain "router vlan" --json
```
Obtén una vista previa de reflexiones REM, verdades candidatas y salida de promoción profunda sin
Previsualiza reflexiones REM, verdades candidatas y salida de promoción profunda sin
escribir nada:
```bash
@ -188,28 +210,29 @@ openclaw memory rem-harness --json
## Valores predeterminados clave
Todas las configuraciones viven en `plugins.entries.memory-core.config.dreaming`.
Todos los ajustes están en `plugins.entries.memory-core.config.dreaming`.
| Clave | Predeterminado |
| ----- | -------------- |
| `enabled` | `false` |
| `frequency` | `0 3 * * *` |
| Clave | Predeterminado |
| ----------- | -------------- |
| `enabled` | `false` |
| `frequency` | `0 3 * * *` |
La política de fases, los umbrales y el comportamiento de almacenamiento son detalles internos de implementación
(no son configuración orientada al usuario).
(no configuración orientada al usuario).
Consulta la [referencia de configuración de Memory](/es/reference/memory-config#dreaming-experimental)
para ver la lista completa de claves.
## UI de Dreams
## IU de Dreams
Cuando está habilitada, la pestaña **Dreams** del Gateway muestra:
Cuando está habilitada, la pestaña **Dreams** de Gateway muestra:
- estado actual de habilitación de dreaming
- estado actual de dreaming habilitado
- estado a nivel de fase y presencia de barrido administrado
- recuentos de corto plazo, largo plazo y promovidos hoy
- hora de la siguiente ejecución programada
- un lector expandible del Diario de Sueños respaldado por `doctor.memory.dreamDiary`
- recuentos de corto plazo, fundamentados, de señales y promovidos hoy
- hora de la próxima ejecución programada
- una vía de escena fundamentada distinta para entradas preparadas de reproducción histórica
- un lector expandible de Diario de Sueños respaldado por `doctor.memory.dreamDiary`
## Relacionado

View File

@ -5,10 +5,10 @@ read_when:
summary: Cómo OpenClaw recuerda cosas entre sesiones
title: Descripción general de la memoria
x-i18n:
generated_at: "2026-04-08T05:03:03Z"
generated_at: "2026-04-09T01:27:44Z"
model: gpt-5.4
provider: openai
source_hash: 3bb8552341b0b651609edaaae826a22fdc535d240aed4fad4af4b069454004af
source_hash: 2fe47910f5bf1c44be379e971c605f1cb3a29befcf2a7ee11fb3833cbe3b9059
source_path: concepts/memory.md
workflow: 15
---
@ -28,76 +28,80 @@ Tu agente tiene tres archivos relacionados con la memoria:
- **`memory/YYYY-MM-DD.md`** -- notas diarias. Contexto y observaciones en
curso. Las notas de hoy y de ayer se cargan automáticamente.
- **`DREAMS.md`** (experimental, opcional) -- Diario de sueños y resúmenes de
barridos de sueño para revisión humana.
barridos de sueño para revisión humana, incluidas entradas de relleno
histórico fundamentado.
Estos archivos viven en el espacio de trabajo del agente (predeterminado `~/.openclaw/workspace`).
<Tip>
Si quieres que tu agente recuerde algo, solo pídeselo: "Recuerda que prefiero
TypeScript." Lo escribirá en el archivo adecuado.
TypeScript". Lo escribirá en el archivo adecuado.
</Tip>
## Herramientas de memoria
El agente tiene dos herramientas para trabajar con la memoria:
- **`memory_search`** -- encuentra notas relevantes mediante búsqueda
semántica, incluso cuando la redacción difiere de la original.
- **`memory_get`** -- lee un archivo de memoria específico o un intervalo de
líneas.
- **`memory_search`** -- encuentra notas relevantes usando búsqueda semántica,
incluso cuando la redacción difiere del original.
- **`memory_get`** -- lee un archivo de memoria específico o un rango de líneas.
Ambas herramientas las proporciona el plugin de memoria activo (predeterminado: `memory-core`).
Ambas herramientas las proporciona el plugin de memoria activo
(predeterminado: `memory-core`).
## Plugin complementario Memory Wiki
## Plugin complementario de Wiki de memoria
Si quieres que la memoria duradera se comporte más como una base de conocimiento mantenida que
como simples notas sin procesar, usa el plugin integrado `memory-wiki`.
Si quieres que la memoria duradera se comporte más como una base de
conocimiento mantenida que como simples notas sin procesar, usa el plugin
incluido `memory-wiki`.
`memory-wiki` compila el conocimiento duradero en una bóveda wiki con:
- estructura de páginas determinista
- afirmaciones y evidencia estructuradas
- seguimiento de contradicciones y vigencia
- afirmaciones y evidencias estructuradas
- seguimiento de contradicciones y actualidad
- paneles generados
- resúmenes compilados para consumidores del agente/runtime
- resúmenes compilados para consumidores de agente/runtime
- herramientas nativas de wiki como `wiki_search`, `wiki_get`, `wiki_apply` y `wiki_lint`
No reemplaza al plugin de memoria activo. El plugin de memoria activo sigue
encargándose de la recuperación, la promoción y el sueño. `memory-wiki` añade una
capa de conocimiento rica en procedencia a su lado.
siendo responsable de la recuperación, la promoción y el sueño. `memory-wiki`
añade una capa de conocimiento rica en procedencia junto a él.
Consulta [Memory Wiki](/es/plugins/memory-wiki).
## Búsqueda en memoria
## Búsqueda de memoria
Cuando hay configurado un proveedor de embeddings, `memory_search` usa
**búsqueda híbrida** -- combinando similitud vectorial (significado semántico) con coincidencia por palabras clave
(términos exactos como ID y símbolos de código). Esto funciona de inmediato en cuanto tengas
una clave de API para cualquier proveedor compatible.
Cuando se configura un proveedor de embeddings, `memory_search` usa **búsqueda
híbrida**: combina similitud vectorial (significado semántico) con coincidencia
por palabras clave (términos exactos como identificadores y símbolos de código).
Esto funciona de inmediato en cuanto tengas una clave de API para cualquier
proveedor compatible.
<Info>
OpenClaw detecta automáticamente tu proveedor de embeddings a partir de las claves de API disponibles. Si
tienes configurada una clave de OpenAI, Gemini, Voyage o Mistral, la búsqueda en memoria se
habilita automáticamente.
OpenClaw detecta automáticamente tu proveedor de embeddings a partir de las
claves de API disponibles. Si tienes configurada una clave de OpenAI, Gemini,
Voyage o Mistral, la búsqueda de memoria se habilita automáticamente.
</Info>
Para obtener detalles sobre cómo funciona la búsqueda, las opciones de ajuste y la configuración del proveedor, consulta
Para obtener detalles sobre cómo funciona la búsqueda, las opciones de ajuste y
la configuración del proveedor, consulta
[Memory Search](/es/concepts/memory-search).
## Backends de memoria
<CardGroup cols={3}>
<Card title="Integrado (predeterminado)" icon="database" href="/es/concepts/memory-builtin">
Basado en SQLite. Funciona de inmediato con búsqueda por palabras clave, similitud vectorial y
búsqueda híbrida. Sin dependencias adicionales.
Basado en SQLite. Funciona de inmediato con búsqueda por palabras clave,
similitud vectorial y búsqueda híbrida. Sin dependencias adicionales.
</Card>
<Card title="QMD" icon="search" href="/es/concepts/memory-qmd">
Sidecar local-first con reranking, expansión de consultas y la capacidad de indexar
directorios fuera del espacio de trabajo.
Sidecar local-first con reranking, expansión de consultas y la capacidad de
indexar directorios fuera del espacio de trabajo.
</Card>
<Card title="Honcho" icon="brain" href="/es/concepts/memory-honcho">
Memoria entre sesiones nativa para IA con modelado de usuario, búsqueda semántica y
conocimiento de múltiples agentes. Instalación mediante plugin.
Memoria nativa de IA entre sesiones con modelado de usuario, búsqueda semántica
y conocimiento multiagente. Requiere instalación del plugin.
</Card>
</CardGroup>
@ -105,59 +109,100 @@ conocimiento de múltiples agentes. Instalación mediante plugin.
<CardGroup cols={1}>
<Card title="Memory Wiki" icon="book" href="/es/plugins/memory-wiki">
Compila la memoria duradera en una bóveda wiki rica en procedencia con afirmaciones,
paneles, modo puente y flujos de trabajo compatibles con Obsidian.
Compila la memoria duradera en una bóveda wiki rica en procedencia con
afirmaciones, paneles, modo puente y flujos de trabajo compatibles con Obsidian.
</Card>
</CardGroup>
## Vaciado automático de memoria
Antes de que la [compactación](/es/concepts/compaction) resuma tu conversación, OpenClaw
ejecuta un turno silencioso que recuerda al agente que guarde el contexto importante en archivos
de memoria. Esto está activado de forma predeterminada; no necesitas configurar nada.
Antes de que la [compactación](/es/concepts/compaction) resuma tu conversación,
OpenClaw ejecuta un turno silencioso que recuerda al agente que guarde el
contexto importante en archivos de memoria. Esto está activado de forma
predeterminada; no necesitas configurar nada.
<Tip>
El vaciado de memoria evita la pérdida de contexto durante la compactación. Si tu agente tiene
hechos importantes en la conversación que todavía no se han escrito en un archivo,
se guardarán automáticamente antes de que ocurra el resumen.
El vaciado de memoria evita la pérdida de contexto durante la compactación. Si
tu agente tiene hechos importantes en la conversación que todavía no están
escritos en un archivo, se guardarán automáticamente antes de que ocurra el
resumen.
</Tip>
## Sueño (experimental)
El sueño es un proceso opcional de consolidación en segundo plano para la memoria. Recopila
señales a corto plazo, puntúa candidatos y promueve solo los elementos que cumplen los requisitos a la
memoria a largo plazo (`MEMORY.md`).
El sueño es un proceso opcional de consolidación de memoria en segundo plano.
Recopila señales a corto plazo, puntúa candidatos y promueve solo los elementos
que cumplen los requisitos a la memoria a largo plazo (`MEMORY.md`).
Está diseñado para mantener alta la relación señal-ruido de la memoria a largo plazo:
Está diseñado para mantener la memoria a largo plazo con alta señal:
- **Optativo**: desactivado de forma predeterminada.
- **Programado**: cuando está activado, `memory-core` gestiona automáticamente un trabajo cron recurrente
para un barrido completo de sueño.
- **Con umbrales**: las promociones deben superar filtros de puntuación, frecuencia de recuperación y
diversidad de consultas.
- **Revisable**: los resúmenes de fase y las entradas del diario se escriben en `DREAMS.md`
para revisión humana.
- **Participación voluntaria**: desactivado de forma predeterminada.
- **Programado**: cuando está activado, `memory-core` gestiona automáticamente
un trabajo cron recurrente para un barrido completo de sueño.
- **Con umbrales**: las promociones deben superar filtros de puntuación,
frecuencia de recuperación y diversidad de consultas.
- **Revisable**: los resúmenes de fase y las entradas del diario se escriben en
`DREAMS.md` para revisión humana.
Para conocer el comportamiento por fases, las señales de puntuación y los detalles del Diario de sueños, consulta
[Sueño (experimental)](/es/concepts/dreaming).
Para el comportamiento de las fases, las señales de puntuación y los detalles
del Diario de sueños, consulta [Dreaming (experimental)](/es/concepts/dreaming).
## Relleno fundamentado y promoción en vivo
El sistema de sueño ahora tiene dos vías de revisión estrechamente
relacionadas:
- **Sueño en vivo** funciona a partir del almacén de sueño a corto plazo en
`memory/.dreams/` y es lo que usa la fase profunda normal al decidir qué
puede graduarse a `MEMORY.md`.
- **Relleno fundamentado** lee notas históricas `memory/YYYY-MM-DD.md` como
archivos de día independientes y escribe una salida de revisión estructurada
en `DREAMS.md`.
El relleno fundamentado es útil cuando quieres volver a procesar notas antiguas
e inspeccionar lo que el sistema considera duradero sin editar manualmente
`MEMORY.md`.
Cuando usas:
```bash
openclaw memory rem-backfill --path ./memory --stage-short-term
```
los candidatos duraderos fundamentados no se promueven directamente. Se preparan
en el mismo almacén de sueño a corto plazo que la fase profunda normal ya usa.
Eso significa que:
- `DREAMS.md` sigue siendo la superficie de revisión humana.
- el almacén a corto plazo sigue siendo la superficie de clasificación orientada a máquinas.
- `MEMORY.md` sigue siendo escrito solo por la promoción profunda.
Si decides que la repetición no fue útil, puedes eliminar los artefactos
preparados sin tocar las entradas normales del diario ni el estado normal de
recuperación:
```bash
openclaw memory rem-backfill --rollback
openclaw memory rem-backfill --rollback-short-term
```
## CLI
```bash
openclaw memory status # Check index status and provider
openclaw memory search "query" # Search from the command line
openclaw memory index --force # Rebuild the index
openclaw memory status # Comprobar el estado del índice y el proveedor
openclaw memory search "query" # Buscar desde la línea de comandos
openclaw memory index --force # Reconstruir el índice
```
## Más información
## Lecturas adicionales
- [Builtin Memory Engine](/es/concepts/memory-builtin) -- backend SQLite predeterminado
- [Builtin Memory Engine](/es/concepts/memory-builtin) -- backend predeterminado de SQLite
- [QMD Memory Engine](/es/concepts/memory-qmd) -- sidecar local-first avanzado
- [Honcho Memory](/es/concepts/memory-honcho) -- memoria entre sesiones nativa para IA
- [Honcho Memory](/es/concepts/memory-honcho) -- memoria nativa de IA entre sesiones
- [Memory Wiki](/es/plugins/memory-wiki) -- bóveda de conocimiento compilada y herramientas nativas de wiki
- [Memory Search](/es/concepts/memory-search) -- canalización de búsqueda, proveedores y
ajuste
- [Dreaming (experimental)](/es/concepts/dreaming) -- promoción en segundo plano
de la recuperación a corto plazo a la memoria a largo plazo
desde la recuperación a corto plazo hasta la memoria a largo plazo
- [Memory configuration reference](/es/reference/memory-config) -- todas las opciones de configuración
- [Compaction](/es/concepts/compaction) -- cómo interactúa la compactación con la memoria

View File

@ -1,14 +1,14 @@
---
read_when:
- Necesitas una referencia de configuración de modelos proveedor por proveedor
- Quieres configuraciones de ejemplo o comandos de incorporación de la CLI para proveedores de modelos
summary: Descripción general de los proveedores de modelos con configuraciones de ejemplo + flujos de la CLI
- Quieres configuraciones de ejemplo o comandos de incorporación por CLI para proveedores de modelos
summary: Resumen de proveedores de modelos con configuraciones de ejemplo + flujos de CLI
title: Proveedores de modelos
x-i18n:
generated_at: "2026-04-08T05:04:33Z"
generated_at: "2026-04-09T01:29:09Z"
model: gpt-5.4
provider: openai
source_hash: 558ac9e34b67fcc3dd6791a01bebc17e1c34152fa6c5611593d681e8cfa532d9
source_hash: 53e3141256781002bbe1d7e7b78724a18d061fcf36a203baae04a091b8c9ea1b
source_path: concepts/model-providers.md
workflow: 15
---
@ -20,21 +20,22 @@ Para las reglas de selección de modelos, consulta [/concepts/models](/es/concep
## Reglas rápidas
- Las referencias de modelo usan `provider/model` (ejemplo: `opencode/claude-opus-4-6`).
- Si configuras `agents.defaults.models`, se convierte en la lista permitida.
- Ayudantes de la CLI: `openclaw onboard`, `openclaw models list`, `openclaw models set <provider/model>`.
- Las reglas de runtime de fallback, las sondas de enfriamiento y la persistencia de las anulaciones de sesión
se documentan en [/concepts/model-failover](/es/concepts/model-failover).
- Las referencias de modelos usan `provider/model` (ejemplo: `opencode/claude-opus-4-6`).
- Si configuras `agents.defaults.models`, se convierte en la lista de permitidos.
- Ayudantes de CLI: `openclaw onboard`, `openclaw models list`, `openclaw models set <provider/model>`.
- Las reglas de tiempo de ejecución de respaldo, las sondas de enfriamiento y la persistencia de anulaciones por sesión
están documentadas en [/concepts/model-failover](/es/concepts/model-failover).
- `models.providers.*.models[].contextWindow` son metadatos nativos del modelo;
`models.providers.*.models[].contextTokens` es el límite efectivo del runtime.
- Los plugins de proveedor pueden inyectar catálogos de modelos mediante `registerProvider({ catalog })`;
`models.providers.*.models[].contextTokens` es el límite efectivo en tiempo de ejecución.
- Los plugins de proveedores pueden inyectar catálogos de modelos mediante `registerProvider({ catalog })`;
OpenClaw fusiona esa salida en `models.providers` antes de escribir
`models.json`.
- Los manifiestos de proveedor pueden declarar `providerAuthEnvVars` para que las
sondas genéricas de autenticación basadas en variables de entorno no necesiten cargar el runtime del plugin. El mapa restante de variables de entorno del núcleo
ahora es solo para proveedores no plugin/del núcleo y algunos casos de precedencia genérica
como la incorporación de Anthropic priorizando la API key.
- Los plugins de proveedor también pueden encargarse del comportamiento de runtime del proveedor mediante
- Los manifiestos de proveedores pueden declarar `providerAuthEnvVars` y
`providerAuthAliases` para que las sondas genéricas de autenticación basadas en variables de entorno y las variantes de proveedores
no necesiten cargar el tiempo de ejecución del plugin. El mapa restante de variables de entorno del núcleo ahora
es solo para proveedores no basados en plugins/del núcleo y unos pocos casos de precedencia genérica
como la incorporación con prioridad de clave API de Anthropic.
- Los plugins de proveedores también pueden encargarse del comportamiento en tiempo de ejecución del proveedor mediante
`normalizeModelId`, `normalizeTransport`, `normalizeConfig`,
`applyNativeStreamingUsageCompat`, `resolveConfigApiKey`,
`resolveSyntheticAuth`, `shouldDeferSyntheticProfileAuth`,
@ -50,200 +51,200 @@ Para las reglas de selección de modelos, consulta [/concepts/models](/es/concep
`isCacheTtlEligible`, `buildMissingAuthMessage`, `suppressBuiltInModel`,
`augmentModelCatalog`, `isBinaryThinking`, `supportsXHighThinking`,
`resolveDefaultThinkingLevel`, `applyConfigDefaults`, `isModernModelRef`,
`prepareRuntimeAuth`, `resolveUsageAuth`, `fetchUsageSnapshot`, y
`prepareRuntimeAuth`, `resolveUsageAuth`, `fetchUsageSnapshot`, and
`onModelSelected`.
- Nota: `capabilities` del runtime del proveedor son metadatos compartidos del ejecutor (familia del proveedor,
peculiaridades de transcripción/herramientas, sugerencias de transporte/caché). No es lo
mismo que el [modelo de capacidades público](/es/plugins/architecture#public-capability-model)
- Nota: `capabilities` del tiempo de ejecución del proveedor son metadatos compartidos del ejecutor (familia del proveedor,
particularidades de transcripción/herramientas, pistas de transporte/caché). No es lo
mismo que el [modelo público de capacidades](/es/plugins/architecture#public-capability-model)
que describe lo que registra un plugin (inferencia de texto, voz, etc.).
## Comportamiento de proveedor controlado por plugins
## Comportamiento del proveedor propiedad del plugin
Los plugins de proveedor ahora pueden encargarse de la mayor parte de la lógica específica de cada proveedor mientras OpenClaw mantiene
el bucle de inferencia genérico.
Los plugins de proveedores ahora pueden encargarse de la mayor parte de la lógica específica del proveedor mientras OpenClaw mantiene
el bucle genérico de inferencia.
División típica:
- `auth[].run` / `auth[].runNonInteractive`: el proveedor se encarga de los flujos de incorporación/inicio de sesión
para `openclaw onboard`, `openclaw models auth` y la configuración sin interfaz
- `wizard.setup` / `wizard.modelPicker`: el proveedor se encarga de las etiquetas de elección de autenticación,
alias heredados, sugerencias de listas permitidas para incorporación y entradas de configuración en los selectores de incorporación/modelo
alias heredados, pistas de lista de permitidos para incorporación y entradas de configuración en los selectores de incorporación/modelos
- `catalog`: el proveedor aparece en `models.providers`
- `normalizeModelId`: el proveedor normaliza ids de modelo heredados/de vista previa antes de
la búsqueda o canonicalización
- `normalizeTransport`: el proveedor normaliza `api` / `baseUrl` de la familia de transporte
- `normalizeModelId`: el proveedor normaliza identificadores de modelos heredados/de vista previa antes de
la búsqueda o la canonicalización
- `normalizeTransport`: el proveedor normaliza la familia de transporte `api` / `baseUrl`
antes del ensamblaje genérico del modelo; OpenClaw comprueba primero el proveedor coincidente,
luego otros plugins de proveedor con capacidad de hook hasta que uno cambie realmente el
luego otros plugins de proveedores con capacidad de hook hasta que uno realmente cambie el
transporte
- `normalizeConfig`: el proveedor normaliza la configuración `models.providers.<id>` antes de
que el runtime la use; OpenClaw comprueba primero el proveedor coincidente, luego otros
plugins de proveedor con capacidad de hook hasta que uno cambie realmente la configuración. Si ningún
hook de proveedor reescribe la configuración, los ayudantes agrupados de la familia Google siguen
normalizando las entradas de proveedor Google compatibles.
- `normalizeConfig`: el proveedor normaliza la configuración `models.providers.<id>` antes de que
el tiempo de ejecución la use; OpenClaw comprueba primero el proveedor coincidente, luego otros
plugins de proveedores con capacidad de hook hasta que uno realmente cambie la configuración. Si ningún
hook de proveedor reescribe la configuración, los ayudantes integrados de la familia Google siguen
normalizando las entradas de proveedores Google admitidas.
- `applyNativeStreamingUsageCompat`: el proveedor aplica reescrituras de compatibilidad de uso de streaming nativo impulsadas por el endpoint para proveedores configurados
- `resolveConfigApiKey`: el proveedor resuelve la autenticación con marcador de entorno para proveedores configurados
sin forzar la carga completa de la autenticación del runtime. `amazon-bedrock` también tiene un
resolvedor integrado de marcador de entorno de AWS aquí, aunque la autenticación de runtime de Bedrock usa
- `resolveConfigApiKey`: el proveedor resuelve la autenticación de marcadores de variables de entorno para proveedores configurados
sin forzar la carga completa de la autenticación en tiempo de ejecución. `amazon-bedrock` también tiene aquí un
resolvedor integrado de marcadores de variables de entorno de AWS, aunque la autenticación en tiempo de ejecución de Bedrock usa
la cadena predeterminada del SDK de AWS.
- `resolveSyntheticAuth`: el proveedor puede exponer disponibilidad de autenticación local/alojada por uno mismo u otra
autenticación basada en configuración sin persistir secretos en texto sin formato
- `resolveSyntheticAuth`: el proveedor puede exponer disponibilidad de autenticación
local/alojada por el usuario u otra basada en configuración sin persistir secretos en texto plano
- `shouldDeferSyntheticProfileAuth`: el proveedor puede marcar marcadores de posición de perfiles sintéticos almacenados
como de menor precedencia que la autenticación basada en entorno/configuración
- `resolveDynamicModel`: el proveedor acepta ids de modelo que todavía no están presentes en el
con menor precedencia que la autenticación basada en variables de entorno/configuración
- `resolveDynamicModel`: el proveedor acepta identificadores de modelos que aún no están presentes en el
catálogo estático local
- `prepareDynamicModel`: el proveedor necesita una actualización de metadatos antes de volver a intentar
- `prepareDynamicModel`: el proveedor necesita una actualización de metadatos antes de reintentar
la resolución dinámica
- `normalizeResolvedModel`: el proveedor necesita reescrituras de transporte o URL base
- `contributeResolvedModelCompat`: el proveedor aporta banderas de compatibilidad para sus
modelos del proveedor incluso cuando llegan mediante otro transporte compatible
- `capabilities`: el proveedor publica peculiaridades de transcripción/herramientas/familia de proveedor
modelos del proveedor incluso cuando llegan a través de otro transporte compatible
- `capabilities`: el proveedor publica particularidades de transcripción/herramientas/familia de proveedor
- `normalizeToolSchemas`: el proveedor limpia los esquemas de herramientas antes de que el
ejecutor integrado los vea
- `inspectToolSchemas`: el proveedor expone advertencias de esquemas específicas del transporte
- `inspectToolSchemas`: el proveedor muestra advertencias de esquemas específicas del transporte
después de la normalización
- `resolveReasoningOutputMode`: el proveedor elige contratos de salida de razonamiento
nativos frente a etiquetados
- `prepareExtraParams`: el proveedor establece valores predeterminados o normaliza parámetros de solicitud por modelo
- `createStreamFn`: el proveedor reemplaza la ruta normal de streaming por un
transporte totalmente personalizado
- `wrapStreamFn`: el proveedor aplica envoltorios de compatibilidad de encabezados/cuerpo/modelo de solicitud
- `resolveTransportTurnState`: el proveedor suministra encabezados nativos o metadatos
por turno para el transporte
- `resolveWebSocketSessionPolicy`: el proveedor suministra encabezados de sesión WebSocket nativos
o política de enfriamiento de sesión
- `createEmbeddingProvider`: el proveedor se encarga del comportamiento de embedding de memoria cuando
corresponde al plugin del proveedor en lugar del selector central de embeddings
- `formatApiKey`: el proveedor formatea perfiles de autenticación almacenados en la cadena
`apiKey` de runtime esperada por el transporte
- `refreshOAuth`: el proveedor se encarga de la actualización de OAuth cuando los actualizadores compartidos de `pi-ai`
no son suficientes
- `buildAuthDoctorHint`: el proveedor agrega orientación de reparación cuando falla la
actualización de OAuth
- `resolveReasoningOutputMode`: el proveedor elige contratos nativos o etiquetados
para la salida de razonamiento
- `prepareExtraParams`: el proveedor aplica valores predeterminados o normaliza parámetros de solicitud por modelo
- `createStreamFn`: el proveedor reemplaza la ruta normal de stream por un transporte
completamente personalizado
- `wrapStreamFn`: el proveedor aplica envoltorios de compatibilidad para encabezados/cuerpo/modelo de la solicitud
- `resolveTransportTurnState`: el proveedor suministra encabezados o metadatos
nativos de transporte por turno
- `resolveWebSocketSessionPolicy`: el proveedor suministra encabezados nativos de sesión WebSocket
o una política de enfriamiento de sesión
- `createEmbeddingProvider`: el proveedor se encarga del comportamiento de embeddings de memoria cuando
corresponde al plugin del proveedor en lugar del conmutador central de embeddings
- `formatApiKey`: el proveedor formatea los perfiles de autenticación almacenados en la cadena
`apiKey` esperada por el transporte en tiempo de ejecución
- `refreshOAuth`: el proveedor se encarga de la actualización de OAuth cuando los
actualizadores compartidos `pi-ai` no son suficientes
- `buildAuthDoctorHint`: el proveedor agrega orientación de reparación cuando falla la actualización de OAuth
- `matchesContextOverflowError`: el proveedor reconoce errores específicos del proveedor
de desbordamiento de ventana de contexto que las heurísticas genéricas pasarían por alto
- `classifyFailoverReason`: el proveedor asigna errores sin procesar específicos del proveedor del transporte/API
a motivos de failover como límite de tasa o sobrecarga
- `isCacheTtlEligible`: el proveedor decide qué ids de modelo del upstream admiten TTL de caché de prompt
por desbordamiento de ventana de contexto que las heurísticas genéricas no detectarían
- `classifyFailoverReason`: el proveedor asigna errores sin procesar específicos del proveedor de transporte/API
a motivos de failover como límite de velocidad o sobrecarga
- `isCacheTtlEligible`: el proveedor decide qué identificadores de modelos ascendentes admiten TTL de caché de prompt
- `buildMissingAuthMessage`: el proveedor reemplaza el error genérico del almacén de autenticación
por una sugerencia de recuperación específica del proveedor
- `suppressBuiltInModel`: el proveedor oculta filas obsoletas del upstream y puede devolver un
error controlado por el proveedor para fallos de resolución directa
- `augmentModelCatalog`: el proveedor agrega filas sintéticas/finales al catálogo después de
la detección y fusión de configuración
- `isBinaryThinking`: el proveedor se encarga de la UX de razonamiento binario activado/desactivado
- `supportsXHighThinking`: el proveedor habilita `xhigh` para los modelos seleccionados
por una pista de recuperación específica del proveedor
- `suppressBuiltInModel`: el proveedor oculta filas ascendentes obsoletas y puede devolver un
error propiedad del proveedor para fallos de resolución directa
- `augmentModelCatalog`: el proveedor agrega filas sintéticas/finales del catálogo después del
descubrimiento y la fusión de configuración
- `isBinaryThinking`: el proveedor se encarga de la UX binaria de activado/desactivado para thinking
- `supportsXHighThinking`: el proveedor habilita `xhigh` para modelos seleccionados
- `resolveDefaultThinkingLevel`: el proveedor se encarga de la política predeterminada de `/think` para una
familia de modelos
- `applyConfigDefaults`: el proveedor aplica valores globales predeterminados específicos del proveedor
durante la materialización de la configuración según el modo de autenticación, el entorno o la familia del modelo
- `isModernModelRef`: el proveedor se encarga de la coincidencia de modelos preferidos en vivo/smoke
- `prepareRuntimeAuth`: el proveedor convierte una credencial configurada en un token de runtime
de corta duración
- `applyConfigDefaults`: el proveedor aplica valores predeterminados globales específicos del proveedor
durante la materialización de la configuración según el modo de autenticación, el entorno o la familia de modelos
- `isModernModelRef`: el proveedor se encarga de la coincidencia de modelos preferidos para live/smoke
- `prepareRuntimeAuth`: el proveedor convierte una credencial configurada en un token
de tiempo de ejecución de corta duración
- `resolveUsageAuth`: el proveedor resuelve credenciales de uso/cuota para `/usage`
y superficies relacionadas de estado/informes
- `fetchUsageSnapshot`: el proveedor se encarga de obtener/analizar el endpoint de uso mientras
el núcleo sigue encargándose de la estructura del resumen y el formato
- `fetchUsageSnapshot`: el proveedor se encarga de la obtención/análisis del endpoint de uso mientras
el núcleo sigue encargándose de la carcasa de resumen y el formato
- `onModelSelected`: el proveedor ejecuta efectos secundarios posteriores a la selección, como
telemetría o gestión de sesión controlada por el proveedor
telemetría o mantenimiento de sesión propiedad del proveedor
Ejemplos agrupados actuales:
Ejemplos integrados actuales:
- `anthropic`: fallback de compatibilidad futura de Claude 4.6, sugerencias de reparación de autenticación, obtención de endpoint
de uso, metadatos de TTL de caché/familia de proveedor y valores globales predeterminados de configuración
conscientes de la autenticación
- `amazon-bedrock`: coincidencia de desbordamiento de contexto controlada por el proveedor y clasificación
de motivos de failover para errores específicos de Bedrock de limitación/no listo, además
de la familia compartida de repetición `anthropic-by-model` para protecciones de política de repetición exclusivas de Claude
de uso, metadatos de TTL de caché/familia de proveedor, y valores predeterminados globales
de configuración conscientes de la autenticación
- `amazon-bedrock`: coincidencia de desbordamiento de contexto propiedad del proveedor y clasificación de motivos
de failover para errores de Bedrock específicos de limitación/no listo, además de
la familia compartida de reproducción `anthropic-by-model` para protecciones de política de reproducción solo de Claude
en tráfico de Anthropic
- `anthropic-vertex`: protecciones de política de repetición exclusivas de Claude en tráfico
de mensajes de Anthropic
- `openrouter`: ids de modelo pass-through, envoltorios de solicitud, sugerencias de capacidades
del proveedor, saneamiento de firmas de pensamiento de Gemini en tráfico Gemini por proxy,
inyección de razonamiento de proxy mediante la familia de stream `openrouter-thinking`,
reenvío de metadatos de enrutamiento y política de TTL de caché
- `github-copilot`: incorporación/inicio de sesión del dispositivo, fallback de modelo de compatibilidad futura,
sugerencias de transcripción de razonamiento de Claude, intercambio de token de runtime y obtención de endpoint
de uso
- `openai`: fallback de compatibilidad futura de GPT-5.4, normalización directa del transporte de OpenAI,
sugerencias de autenticación faltante adaptadas a Codex, supresión de Spark, filas sintéticas
de catálogo OpenAI/Codex, política de razonamiento/modelos en vivo, normalización de alias
de token de uso (`input` / `output` y familias `prompt` / `completion`), la
familia compartida de stream `openai-responses-defaults` para envoltorios nativos de OpenAI/Codex,
metadatos de familia de proveedor, registro agrupado de proveedor de generación de imágenes
para `gpt-image-1` y registro agrupado de proveedor de generación de video
- `anthropic-vertex`: protecciones de política de reproducción solo de Claude en tráfico
de mensajes Anthropic
- `openrouter`: identificadores de modelo pass-through, envoltorios de solicitudes, sugerencias de capacidades
del proveedor, saneamiento de firmas de pensamiento Gemini en tráfico proxy Gemini,
inyección de razonamiento por proxy a través de la familia de stream `openrouter-thinking`, reenvío de metadatos
de enrutamiento y política de TTL de caché
- `github-copilot`: incorporación/inicio de sesión del dispositivo, fallback de compatibilidad futura de modelos,
sugerencias de transcripción de thinking de Claude, intercambio de tokens en tiempo de ejecución y obtención
de endpoint de uso
- `openai`: fallback de compatibilidad futura de GPT-5.4, normalización de transporte
directo de OpenAI, sugerencias de autenticación faltante conscientes de Codex, supresión de Spark, filas
sintéticas del catálogo OpenAI/Codex, política de thinking/modelos live, normalización de alias de tokens
de uso (`input` / `output` y familias `prompt` / `completion`), la familia compartida de stream
`openai-responses-defaults` para envoltorios nativos de OpenAI/Codex,
metadatos de familia del proveedor, registro integrado del proveedor de generación de imágenes
para `gpt-image-1`, y registro integrado del proveedor de generación de video
para `sora-2`
- `google` y `google-gemini-cli`: fallback de compatibilidad futura de Gemini 3.1,
validación nativa de repetición de Gemini, saneamiento de repetición de bootstrap, modo
de salida de razonamiento etiquetado, coincidencia de modelos modernos, registro agrupado de proveedor de generación de imágenes
para modelos Gemini image-preview y registro agrupado
de proveedor de generación de video para modelos Veo; Gemini CLI OAuth también
se encarga del formato de token de perfiles de autenticación, del análisis de token de uso y de la obtención
de endpoint de cuota para superficies de uso
- `moonshot`: transporte compartido, normalización de payload de razonamiento controlada por plugin
- `kilocode`: transporte compartido, encabezados de solicitud controlados por plugin, normalización del payload de razonamiento,
saneamiento de firmas de pensamiento de Gemini por proxy y política de TTL de caché
validación nativa de reproducción de Gemini, saneamiento de reproducción en bootstrap, modo etiquetado
de salida de razonamiento, coincidencia de modelos modernos, registro integrado del proveedor de generación de imágenes
para modelos Gemini image-preview, y registro integrado
del proveedor de generación de video para modelos Veo; Gemini CLI OAuth también
se encarga del formateo de tokens de perfiles de autenticación, análisis de tokens de uso y
obtención del endpoint de cuota para superficies de uso
- `moonshot`: transporte compartido, normalización de payload de thinking propiedad del plugin
- `kilocode`: transporte compartido, encabezados de solicitud propiedad del plugin, normalización de payload
de razonamiento, saneamiento de firmas de pensamiento de Gemini por proxy y política
de TTL de caché
- `zai`: fallback de compatibilidad futura de GLM-5, valores predeterminados de `tool_stream`, política de TTL de caché,
política de razonamiento binario/modelos en vivo y autenticación de uso + obtención de cuota;
ids desconocidos `glm-5*` se sintetizan a partir de la plantilla agrupada `glm-4.7`
política binaria de thinking/modelos live, y autenticación de uso + obtención de cuota;
los identificadores desconocidos `glm-5*` se sintetizan a partir de la plantilla integrada `glm-4.7`
- `xai`: normalización nativa del transporte Responses, reescrituras de alias `/fast` para
variantes rápidas de Grok, valor predeterminado de `tool_stream`, limpieza de esquemas de herramientas /
payload de razonamiento específica de xAI y registro agrupado de proveedor de generación de video
variantes rápidas de Grok, `tool_stream` predeterminado, limpieza específica de xAI de esquemas de herramientas /
payload de razonamiento, y registro integrado del proveedor de generación de video
para `grok-imagine-video`
- `mistral`: metadatos de capacidades controlados por plugin
- `opencode` y `opencode-go`: metadatos de capacidades controlados por plugin más
saneamiento de firmas de pensamiento de Gemini por proxy
- `alibaba`: catálogo de generación de video controlado por plugin para referencias directas a modelos Wan
- `mistral`: metadatos de capacidades propiedad del plugin
- `opencode` y `opencode-go`: metadatos de capacidades propiedad del plugin más saneamiento
de firmas de pensamiento Gemini por proxy
- `alibaba`: catálogo de generación de video propiedad del plugin para referencias directas de modelos Wan
como `alibaba/wan2.6-t2v`
- `byteplus`: catálogos controlados por plugin más registro agrupado de proveedor de generación de video
- `byteplus`: catálogos propiedad del plugin más registro integrado del proveedor de generación de video
para modelos Seedance de texto a video/imagen a video
- `fal`: registro agrupado de proveedor de generación de video para terceros alojados
registro agrupado de proveedor de generación de imágenes para modelos de imagen FLUX más registro agrupado
de proveedor de generación de video para modelos de video de terceros alojados
- `fal`: registro integrado del proveedor de generación de video para proveedores de terceros alojados y
registro del proveedor de generación de imágenes para modelos de imagen FLUX, además de registro integrado
del proveedor de generación de video para modelos de video de terceros alojados
- `cloudflare-ai-gateway`, `huggingface`, `kimi`, `nvidia`, `qianfan`,
`stepfun`, `synthetic`, `venice`, `vercel-ai-gateway` y `volcengine`:
solo catálogos controlados por plugin
- `qwen`: catálogos controlados por plugin para modelos de texto más registros compartidos
`stepfun`, `synthetic`, `venice`, `vercel-ai-gateway`, y `volcengine`:
solo catálogos propiedad del plugin
- `qwen`: catálogos propiedad del plugin para modelos de texto más registros compartidos
de proveedores de comprensión multimedia y generación de video para sus
superficies multimodales; la generación de video de Qwen usa los endpoints de video DashScope Standard
con modelos Wan agrupados como `wan2.6-t2v` y `wan2.7-r2v`
- `runway`: registro de proveedor de generación de video controlado por plugin para modelos nativos
basados en tareas de Runway como `gen4.5`
- `minimax`: catálogos controlados por plugin, registro agrupado de proveedor de generación de video
para modelos de video Hailuo, registro agrupado de proveedor de generación de imágenes
para `image-01`, selección híbrida de política de repetición Anthropic/OpenAI
y lógica de autenticación/instantánea de uso
- `together`: catálogos controlados por plugin más registro agrupado de proveedor de generación de video
superficies multimodales; la generación de video de Qwen usa los endpoints de video Standard DashScope
con modelos Wan integrados como `wan2.6-t2v` y `wan2.7-r2v`
- `runway`: registro de proveedor de generación de video propiedad del plugin para modelos
nativos de Runway basados en tareas como `gen4.5`
- `minimax`: catálogos propiedad del plugin, registro integrado del proveedor de generación de video
para modelos de video Hailuo, registro integrado del proveedor de generación de imágenes
para `image-01`, selección híbrida de política de reproducción Anthropic/OpenAI,
y lógica de autenticación/snapshot de uso
- `together`: catálogos propiedad del plugin más registro integrado del proveedor de generación de video
para modelos de video Wan
- `xiaomi`: catálogos controlados por plugin más lógica de autenticación/instantánea de uso
- `xiaomi`: catálogos propiedad del plugin más lógica de autenticación/snapshot de uso
El plugin agrupado `openai` ahora se encarga de ambos ids de proveedor: `openai` y
El plugin integrado `openai` ahora se encarga de ambos identificadores de proveedor: `openai` y
`openai-codex`.
Eso cubre los proveedores que aún encajan en los transportes normales de OpenClaw. Un proveedor
que necesita un ejecutor de solicitudes totalmente personalizado es una superficie de extensión
Eso cubre los proveedores que todavía encajan en los transportes normales de OpenClaw. Un proveedor
que necesita un ejecutor de solicitudes completamente personalizado es una superficie de extensión
separada y más profunda.
## Rotación de API keys
## Rotación de claves API
- Admite rotación genérica del proveedor para proveedores seleccionados.
- Admite rotación genérica de proveedores para proveedores seleccionados.
- Configura varias claves mediante:
- `OPENCLAW_LIVE_<PROVIDER>_KEY` (anulación única en vivo, máxima prioridad)
- `OPENCLAW_LIVE_<PROVIDER>_KEY` (anulación única live, máxima prioridad)
- `<PROVIDER>_API_KEYS` (lista separada por comas o punto y coma)
- `<PROVIDER>_API_KEY` (clave principal)
- `<PROVIDER>_API_KEY_*` (lista numerada, por ejemplo `<PROVIDER>_API_KEY_1`)
- `<PROVIDER>_API_KEY_*` (lista numerada, p. ej. `<PROVIDER>_API_KEY_1`)
- Para los proveedores de Google, `GOOGLE_API_KEY` también se incluye como fallback.
- El orden de selección de claves preserva la prioridad y elimina duplicados.
- Las solicitudes se reintentan con la siguiente clave solo en respuestas de límite de tasa (por
- Las solicitudes se reintentan con la siguiente clave solo ante respuestas de límite de velocidad (por
ejemplo `429`, `rate_limit`, `quota`, `resource exhausted`, `Too many
concurrent requests`, `ThrottlingException`, `concurrency limit reached`,
`workers_ai ... quota limit exceeded` o mensajes periódicos de límite de uso).
- Los fallos que no son de límite de tasa fallan inmediatamente; no se intenta rotación de claves.
- Cuando fallan todas las claves candidatas, se devuelve el error final del último intento.
`workers_ai ... quota limit exceeded`, o mensajes periódicos de límite de uso).
- Los fallos que no son de límite de velocidad fallan inmediatamente; no se intenta rotación de claves.
- Cuando todas las claves candidatas fallan, se devuelve el error final del último intento.
## Proveedores integrados (catálogo pi-ai)
OpenClaw incluye el catálogo piai. Estos proveedores no requieren
configuración `models.providers`; solo configura la autenticación y elige un modelo.
OpenClaw incluye el catálogo piai. Estos proveedores no requieren configuración de
`models.providers`; solo configura la autenticación y elige un modelo.
### OpenAI
@ -252,18 +253,18 @@ configuración `models.providers`; solo configura la autenticación y elige un m
- Rotación opcional: `OPENAI_API_KEYS`, `OPENAI_API_KEY_1`, `OPENAI_API_KEY_2`, además de `OPENCLAW_LIVE_OPENAI_KEY` (anulación única)
- Modelos de ejemplo: `openai/gpt-5.4`, `openai/gpt-5.4-pro`
- CLI: `openclaw onboard --auth-choice openai-api-key`
- El transporte predeterminado es `auto` (primero WebSocket, fallback a SSE)
- Anulación por modelo mediante `agents.defaults.models["openai/<model>"].params.transport` (`"sse"`, `"websocket"` o `"auto"`)
- El precalentamiento de WebSocket de OpenAI Responses está habilitado de forma predeterminada mediante `params.openaiWsWarmup` (`true`/`false`)
- El transporte predeterminado es `auto` (WebSocket primero, fallback a SSE)
- Anula por modelo mediante `agents.defaults.models["openai/<model>"].params.transport` (`"sse"`, `"websocket"`, o `"auto"`)
- El calentamiento de WebSocket de OpenAI Responses está habilitado de forma predeterminada mediante `params.openaiWsWarmup` (`true`/`false`)
- El procesamiento prioritario de OpenAI puede habilitarse mediante `agents.defaults.models["openai/<model>"].params.serviceTier`
- `/fast` y `params.fastMode` asignan solicitudes directas de Responses `openai/*` a `service_tier=priority` en `api.openai.com`
- Usa `params.serviceTier` cuando quieras un nivel explícito en lugar del selector compartido `/fast`
- `/fast` y `params.fastMode` asignan las solicitudes directas de Responses `openai/*` a `service_tier=priority` en `api.openai.com`
- Usa `params.serviceTier` cuando quieras un nivel explícito en lugar del conmutador compartido `/fast`
- Los encabezados de atribución ocultos de OpenClaw (`originator`, `version`,
`User-Agent`) se aplican solo en tráfico nativo de OpenAI hacia `api.openai.com`, no
en proxies genéricos compatibles con OpenAI
- Las rutas nativas de OpenAI también mantienen `store` de Responses, sugerencias de caché de prompt y
conformación de payload de compatibilidad de razonamiento de OpenAI; las rutas por proxy no
- `openai/gpt-5.3-codex-spark` está intencionalmente suprimido en OpenClaw porque la API en vivo de OpenAI lo rechaza; Spark se trata solo como Codex
modelado de payload de compatibilidad de razonamiento de OpenAI; las rutas proxy no
- `openai/gpt-5.3-codex-spark` se suprime intencionalmente en OpenClaw porque la API live de OpenAI lo rechaza; Spark se trata solo como Codex
```json5
{
@ -278,9 +279,9 @@ configuración `models.providers`; solo configura la autenticación y elige un m
- Rotación opcional: `ANTHROPIC_API_KEYS`, `ANTHROPIC_API_KEY_1`, `ANTHROPIC_API_KEY_2`, además de `OPENCLAW_LIVE_ANTHROPIC_KEY` (anulación única)
- Modelo de ejemplo: `anthropic/claude-opus-4-6`
- CLI: `openclaw onboard --auth-choice apiKey`
- Las solicitudes públicas directas de Anthropic admiten el selector compartido `/fast` y `params.fastMode`, incluido el tráfico autenticado con API key y OAuth enviado a `api.anthropic.com`; OpenClaw lo asigna a Anthropic `service_tier` (`auto` frente a `standard_only`)
- Nota sobre Anthropic: el personal de Anthropic nos dijo que el uso estilo Claude CLI de OpenClaw vuelve a estar permitido, por lo que OpenClaw considera autorizados para esta integración tanto la reutilización de Claude CLI como el uso de `claude -p`, salvo que Anthropic publique una nueva política.
- El token de configuración de Anthropic sigue disponible como ruta de token compatible con OpenClaw, pero OpenClaw ahora prefiere la reutilización de Claude CLI y `claude -p` cuando están disponibles.
- Las solicitudes directas a Anthropic público admiten el conmutador compartido `/fast` y `params.fastMode`, incluido el tráfico autenticado con clave API y OAuth enviado a `api.anthropic.com`; OpenClaw lo asigna a Anthropic `service_tier` (`auto` vs `standard_only`)
- Nota de Anthropic: el personal de Anthropic nos dijo que el uso al estilo Claude CLI de OpenClaw vuelve a estar permitido, por lo que OpenClaw trata la reutilización de Claude CLI y el uso de `claude -p` como autorizados para esta integración, a menos que Anthropic publique una política nueva.
- El token de configuración de Anthropic sigue disponible como ruta de token admitida por OpenClaw, pero OpenClaw ahora prefiere reutilizar Claude CLI y `claude -p` cuando están disponibles.
```json5
{
@ -294,16 +295,16 @@ configuración `models.providers`; solo configura la autenticación y elige un m
- Autenticación: OAuth (ChatGPT)
- Modelo de ejemplo: `openai-codex/gpt-5.4`
- CLI: `openclaw onboard --auth-choice openai-codex` o `openclaw models auth login --provider openai-codex`
- El transporte predeterminado es `auto` (primero WebSocket, fallback a SSE)
- Anulación por modelo mediante `agents.defaults.models["openai-codex/<model>"].params.transport` (`"sse"`, `"websocket"` o `"auto"`)
- El transporte predeterminado es `auto` (WebSocket primero, fallback a SSE)
- Anula por modelo mediante `agents.defaults.models["openai-codex/<model>"].params.transport` (`"sse"`, `"websocket"`, o `"auto"`)
- `params.serviceTier` también se reenvía en solicitudes nativas de Codex Responses (`chatgpt.com/backend-api`)
- Los encabezados de atribución ocultos de OpenClaw (`originator`, `version`,
`User-Agent`) solo se adjuntan en tráfico nativo de Codex hacia
`chatgpt.com/backend-api`, no en proxies genéricos compatibles con OpenAI
- Comparte el mismo selector `/fast` y la misma configuración `params.fastMode` que `openai/*` directo; OpenClaw lo asigna a `service_tier=priority`
- Comparte el mismo conmutador `/fast` y la misma configuración `params.fastMode` que `openai/*` directo; OpenClaw lo asigna a `service_tier=priority`
- `openai-codex/gpt-5.3-codex-spark` sigue disponible cuando el catálogo OAuth de Codex lo expone; depende de la autorización
- `openai-codex/gpt-5.4` mantiene `contextWindow = 1050000` nativo y un `contextTokens = 272000` de runtime predeterminado; anula el límite de runtime con `models.providers.openai-codex.models[].contextTokens`
- Nota de política: OpenAI Codex OAuth es compatible explícitamente para herramientas/flujos de trabajo externos como OpenClaw.
- `openai-codex/gpt-5.4` mantiene `contextWindow = 1050000` nativo y un `contextTokens = 272000` de tiempo de ejecución predeterminado; anula el límite de tiempo de ejecución con `models.providers.openai-codex.models[].contextTokens`
- Nota de política: OpenAI Codex OAuth es compatible explícitamente con herramientas/flujos de trabajo externos como OpenClaw.
```json5
{
@ -326,14 +327,14 @@ configuración `models.providers`; solo configura la autenticación y elige un m
### Otras opciones alojadas de estilo suscripción
- [Qwen Cloud](/es/providers/qwen): superficie del proveedor Qwen Cloud más asignación de endpoints de Alibaba DashScope y Coding Plan
- [MiniMax](/es/providers/minimax): acceso por OAuth o API key a MiniMax Coding Plan
- [GLM Models](/es/providers/glm): endpoints de Z.AI Coding Plan o API general
- [MiniMax](/es/providers/minimax): acceso por OAuth o clave API de MiniMax Coding Plan
- [GLM Models](/es/providers/glm): Z.AI Coding Plan o endpoints generales de API
### OpenCode
- Autenticación: `OPENCODE_API_KEY` (o `OPENCODE_ZEN_API_KEY`)
- Proveedor de runtime Zen: `opencode`
- Proveedor de runtime Go: `opencode-go`
- Proveedor de tiempo de ejecución Zen: `opencode`
- Proveedor de tiempo de ejecución Go: `opencode-go`
- Modelos de ejemplo: `opencode/claude-opus-4-6`, `opencode-go/kimi-k2.5`
- CLI: `openclaw onboard --auth-choice opencode-zen` o `openclaw onboard --auth-choice opencode-go`
@ -343,35 +344,35 @@ configuración `models.providers`; solo configura la autenticación y elige un m
}
```
### Google Gemini (API key)
### Google Gemini (clave API)
- Proveedor: `google`
- Autenticación: `GEMINI_API_KEY`
- Rotación opcional: `GEMINI_API_KEYS`, `GEMINI_API_KEY_1`, `GEMINI_API_KEY_2`, fallback `GOOGLE_API_KEY` y `OPENCLAW_LIVE_GEMINI_KEY` (anulación única)
- Rotación opcional: `GEMINI_API_KEYS`, `GEMINI_API_KEY_1`, `GEMINI_API_KEY_2`, fallback a `GOOGLE_API_KEY`, y `OPENCLAW_LIVE_GEMINI_KEY` (anulación única)
- Modelos de ejemplo: `google/gemini-3.1-pro-preview`, `google/gemini-3-flash-preview`
- Compatibilidad: la configuración heredada de OpenClaw que usa `google/gemini-3.1-flash-preview` se normaliza a `google/gemini-3-flash-preview`
- CLI: `openclaw onboard --auth-choice gemini-api-key`
- Las ejecuciones directas de Gemini también aceptan `agents.defaults.models["google/<model>"].params.cachedContent`
(o el heredado `cached_content`) para reenviar un identificador nativo del proveedor
`cachedContents/...`; los aciertos de caché de Gemini se muestran como `cacheRead` de OpenClaw
`cachedContents/...`; los aciertos de caché de Gemini aparecen como `cacheRead` de OpenClaw
### Google Vertex y Gemini CLI
- Proveedores: `google-vertex`, `google-gemini-cli`
- Autenticación: Vertex usa gcloud ADC; Gemini CLI usa su flujo OAuth
- Precaución: Gemini CLI OAuth en OpenClaw es una integración no oficial. Algunos usuarios han informado restricciones en cuentas de Google después de usar clientes de terceros. Revisa las condiciones de Google y usa una cuenta no crítica si decides continuar.
- Gemini CLI OAuth se distribuye como parte del plugin agrupado `google`.
- Instala Gemini CLI primero:
- Precaución: Gemini CLI OAuth en OpenClaw es una integración no oficial. Algunos usuarios han informado de restricciones en sus cuentas de Google después de usar clientes de terceros. Revisa las condiciones de Google y usa una cuenta no crítica si decides continuar.
- Gemini CLI OAuth se distribuye como parte del plugin integrado `google`.
- Instala primero Gemini CLI:
- `brew install gemini-cli`
- o `npm install -g @google/gemini-cli`
- Habilita: `openclaw plugins enable google`
- Inicia sesión: `openclaw models auth login --provider google-gemini-cli --set-default`
- Modelo predeterminado: `google-gemini-cli/gemini-3-flash-preview`
- Nota: **no** pegues un client id ni un secret en `openclaw.json`. El flujo de inicio de sesión de la CLI almacena
- Nota: **no** pegas un client id ni un secreto en `openclaw.json`. El flujo de inicio de sesión de CLI almacena
tokens en perfiles de autenticación en el host de la gateway.
- Si las solicitudes fallan después de iniciar sesión, configura `GOOGLE_CLOUD_PROJECT` o `GOOGLE_CLOUD_PROJECT_ID` en el host de la gateway.
- Las respuestas JSON de Gemini CLI se analizan desde `response`; el uso recurre a
`stats`, con `stats.cached` normalizado a `cacheRead` de OpenClaw.
`stats`, con `stats.cached` normalizado en `cacheRead` de OpenClaw.
### Z.AI (GLM)
@ -380,7 +381,7 @@ configuración `models.providers`; solo configura la autenticación y elige un m
- Modelo de ejemplo: `zai/glm-5.1`
- CLI: `openclaw onboard --auth-choice zai-api-key`
- Alias: `z.ai/*` y `z-ai/*` se normalizan a `zai/*`
- `zai-api-key` detecta automáticamente el endpoint de Z.AI coincidente; `zai-coding-global`, `zai-coding-cn`, `zai-global` y `zai-cn` fuerzan una superficie específica
- `zai-api-key` detecta automáticamente el endpoint Z.AI coincidente; `zai-coding-global`, `zai-coding-cn`, `zai-global` y `zai-cn` fuerzan una superficie específica
### Vercel AI Gateway
@ -396,44 +397,45 @@ configuración `models.providers`; solo configura la autenticación y elige un m
- Modelo de ejemplo: `kilocode/kilo/auto`
- CLI: `openclaw onboard --auth-choice kilocode-api-key`
- URL base: `https://api.kilo.ai/api/gateway/`
- El catálogo estático de fallback incluye `kilocode/kilo/auto`; el descubrimiento en vivo en
- El catálogo estático de fallback incluye `kilocode/kilo/auto`; el descubrimiento live en
`https://api.kilo.ai/api/gateway/models` puede ampliar aún más el catálogo
de runtime.
- El enrutamiento exacto del upstream detrás de `kilocode/kilo/auto` es responsabilidad de Kilo Gateway,
no está codificado de forma rígida en OpenClaw.
en tiempo de ejecución.
- El enrutamiento ascendente exacto detrás de `kilocode/kilo/auto` es propiedad de Kilo Gateway,
no está codificado de forma fija en OpenClaw.
Consulta [/providers/kilocode](/es/providers/kilocode) para los detalles de configuración.
Consulta [/providers/kilocode](/es/providers/kilocode) para obtener detalles de configuración.
### Otros plugins de proveedor agrupados
### Otros plugins integrados de proveedores
- OpenRouter: `openrouter` (`OPENROUTER_API_KEY`)
- Modelo de ejemplo: `openrouter/auto`
- OpenClaw aplica los encabezados documentados de atribución de aplicación de OpenRouter solo cuando
- OpenClaw aplica los encabezados de atribución de aplicación documentados por OpenRouter solo cuando
la solicitud realmente apunta a `openrouter.ai`
- Los marcadores `cache_control` específicos de Anthropic para OpenRouter también están restringidos a
rutas OpenRouter verificadas, no a URLs arbitrarias de proxy
- OpenRouter permanece en la ruta de estilo proxy compatible con OpenAI, por lo que la conformación de solicitudes solo nativa de OpenAI (`serviceTier`, `store` de Responses,
- Los marcadores `cache_control` específicos de Anthropic de OpenRouter también están restringidos a
rutas OpenRouter verificadas, no a URL proxy arbitrarias
- OpenRouter sigue en la ruta de estilo proxy compatible con OpenAI, por lo que el modelado nativo
de solicitudes exclusivo de OpenAI (`serviceTier`, `store` de Responses,
sugerencias de caché de prompt, payloads de compatibilidad de razonamiento de OpenAI) no se reenvía
- Las referencias de OpenRouter respaldadas por Gemini solo mantienen el saneamiento de firmas de pensamiento de Gemini por proxy;
la validación nativa de repetición de Gemini y las reescrituras de bootstrap permanecen desactivadas
- Las referencias OpenRouter respaldadas por Gemini mantienen solo el saneamiento de firmas de pensamiento Gemini por proxy;
la validación nativa de reproducción de Gemini y las reescrituras de bootstrap siguen desactivadas
- Kilo Gateway: `kilocode` (`KILOCODE_API_KEY`)
- Modelo de ejemplo: `kilocode/kilo/auto`
- Las referencias de Kilo respaldadas por Gemini mantienen la misma ruta de saneamiento
de firmas de pensamiento de Gemini por proxy; `kilocode/kilo/auto` y otras sugerencias
de razonamiento por proxy no compatible omiten la inyección de razonamiento por proxy
- MiniMax: `minimax` (API key) y `minimax-portal` (OAuth)
de firmas de pensamiento Gemini por proxy; `kilocode/kilo/auto` y otras
sugerencias no admitidas de razonamiento por proxy omiten la inyección de razonamiento por proxy
- MiniMax: `minimax` (clave API) y `minimax-portal` (OAuth)
- Autenticación: `MINIMAX_API_KEY` para `minimax`; `MINIMAX_OAUTH_TOKEN` o `MINIMAX_API_KEY` para `minimax-portal`
- Modelo de ejemplo: `minimax/MiniMax-M2.7` o `minimax-portal/MiniMax-M2.7`
- La incorporación/configuración con API key de MiniMax escribe definiciones explícitas del modelo M2.7 con
`input: ["text", "image"]`; el catálogo agrupado del proveedor mantiene las referencias de chat
solo texto hasta que se materializa la configuración de ese proveedor
- La incorporación/configuración con clave API de MiniMax escribe definiciones explícitas del modelo M2.7 con
`input: ["text", "image"]`; el catálogo integrado del proveedor mantiene las referencias de chat
solo de texto hasta que se materializa esa configuración del proveedor
- Moonshot: `moonshot` (`MOONSHOT_API_KEY`)
- Modelo de ejemplo: `moonshot/kimi-k2.5`
- Kimi Coding: `kimi` (`KIMI_API_KEY` o `KIMICODE_API_KEY`)
- Modelo de ejemplo: `kimi/kimi-code`
- Qianfan: `qianfan` (`QIANFAN_API_KEY`)
- Modelo de ejemplo: `qianfan/deepseek-v3.2`
- Qwen Cloud: `qwen` (`QWEN_API_KEY`, `MODELSTUDIO_API_KEY` o `DASHSCOPE_API_KEY`)
- Qwen Cloud: `qwen` (`QWEN_API_KEY`, `MODELSTUDIO_API_KEY`, o `DASHSCOPE_API_KEY`)
- Modelo de ejemplo: `qwen/qwen3.5-plus`
- NVIDIA: `nvidia` (`NVIDIA_API_KEY`)
- Modelo de ejemplo: `nvidia/nvidia/llama-3.1-nemotron-70b-instruct`
@ -452,9 +454,9 @@ Consulta [/providers/kilocode](/es/providers/kilocode) para los detalles de conf
- BytePlus: `byteplus` (`BYTEPLUS_API_KEY`)
- Modelo de ejemplo: `byteplus-plan/ark-code-latest`
- xAI: `xai` (`XAI_API_KEY`)
- Las solicitudes nativas agrupadas de xAI usan la ruta xAI Responses
- Las solicitudes xAI nativas integradas usan la ruta xAI Responses
- `/fast` o `params.fastMode: true` reescriben `grok-3`, `grok-3-mini`,
`grok-4` y `grok-4-0709` a sus variantes `*-fast`
`grok-4`, y `grok-4-0709` a sus variantes `*-fast`
- `tool_stream` está activado de forma predeterminada; configura
`agents.defaults.models["xai/<model>"].params.tool_stream` en `false` para
desactivarlo
@ -463,24 +465,24 @@ Consulta [/providers/kilocode](/es/providers/kilocode) para los detalles de conf
- CLI: `openclaw onboard --auth-choice mistral-api-key`
- Groq: `groq` (`GROQ_API_KEY`)
- Cerebras: `cerebras` (`CEREBRAS_API_KEY`)
- Los modelos GLM en Cerebras usan los ids `zai-glm-4.7` y `zai-glm-4.6`.
- Los modelos GLM en Cerebras usan los identificadores `zai-glm-4.7` y `zai-glm-4.6`.
- URL base compatible con OpenAI: `https://api.cerebras.ai/v1`.
- GitHub Copilot: `github-copilot` (`COPILOT_GITHUB_TOKEN` / `GH_TOKEN` / `GITHUB_TOKEN`)
- Modelo de ejemplo de Hugging Face Inference: `huggingface/deepseek-ai/DeepSeek-R1`; CLI: `openclaw onboard --auth-choice huggingface-api-key`. Consulta [Hugging Face (Inference)](/es/providers/huggingface).
## Proveedores mediante `models.providers` (personalizado/URL base)
## Proveedores mediante `models.providers` (personalizados/URL base)
Usa `models.providers` (o `models.json`) para agregar proveedores **personalizados** o
proxies compatibles con OpenAI/Anthropic.
Muchos de los plugins de proveedor agrupados a continuación ya publican un catálogo predeterminado.
Usa entradas explícitas `models.providers.<id>` solo cuando quieras anular la
Muchos de los plugins integrados de proveedores a continuación ya publican un catálogo predeterminado.
Usa entradas explícitas de `models.providers.<id>` solo cuando quieras anular la
URL base, los encabezados o la lista de modelos predeterminados.
### Moonshot AI (Kimi)
Moonshot se incluye como plugin de proveedor agrupado. Usa el proveedor integrado de
forma predeterminada y agrega una entrada explícita `models.providers.moonshot` solo cuando
Moonshot se distribuye como un plugin integrado de proveedor. Usa el proveedor integrado de forma
predeterminada y agrega una entrada explícita `models.providers.moonshot` solo cuando
necesites anular la URL base o los metadatos del modelo:
- Proveedor: `moonshot`
@ -488,7 +490,7 @@ necesites anular la URL base o los metadatos del modelo:
- Modelo de ejemplo: `moonshot/kimi-k2.5`
- CLI: `openclaw onboard --auth-choice moonshot-api-key` o `openclaw onboard --auth-choice moonshot-api-key-cn`
Ids de modelo Kimi K2:
Identificadores de modelo Kimi K2:
[//]: # "moonshot-kimi-k2-model-refs:start"
@ -535,7 +537,7 @@ Kimi Coding usa el endpoint compatible con Anthropic de Moonshot AI:
}
```
El heredado `kimi/k2p5` sigue aceptándose como id de modelo de compatibilidad.
El heredado `kimi/k2p5` sigue aceptándose como identificador de modelo de compatibilidad.
### Volcano Engine (Doubao)
@ -554,13 +556,13 @@ Volcano Engine (火山引擎) proporciona acceso a Doubao y otros modelos en Chi
}
```
La incorporación usa de forma predeterminada la superficie de coding, pero el catálogo general `volcengine/*`
La incorporación usa por defecto la superficie de coding, pero el catálogo general `volcengine/*`
se registra al mismo tiempo.
En los selectores de modelos de incorporación/configuración, la opción de autenticación de Volcengine prefiere tanto las filas
`volcengine/*` como `volcengine-plan/*`. Si esos modelos aún no se han cargado,
En los selectores de incorporación/configuración de modelos, la opción de autenticación de Volcengine prefiere tanto
las filas `volcengine/*` como `volcengine-plan/*`. Si esos modelos aún no se han cargado,
OpenClaw recurre al catálogo sin filtrar en lugar de mostrar un selector
vacío limitado al proveedor.
de ámbito de proveedor vacío.
Modelos disponibles:
@ -578,7 +580,7 @@ Modelos de coding (`volcengine-plan`):
- `volcengine-plan/kimi-k2-thinking`
- `volcengine-plan/glm-4.7`
### BytePlus (Internacional)
### BytePlus (internacional)
BytePlus ARK proporciona acceso a los mismos modelos que Volcano Engine para usuarios internacionales.
@ -595,13 +597,13 @@ BytePlus ARK proporciona acceso a los mismos modelos que Volcano Engine para usu
}
```
La incorporación usa de forma predeterminada la superficie de coding, pero el catálogo general `byteplus/*`
La incorporación usa por defecto la superficie de coding, pero el catálogo general `byteplus/*`
se registra al mismo tiempo.
En los selectores de modelos de incorporación/configuración, la opción de autenticación de BytePlus prefiere tanto las filas
`byteplus/*` como `byteplus-plan/*`. Si esos modelos aún no se han cargado,
En los selectores de incorporación/configuración de modelos, la opción de autenticación de BytePlus prefiere tanto
las filas `byteplus/*` como `byteplus-plan/*`. Si esos modelos aún no se han cargado,
OpenClaw recurre al catálogo sin filtrar en lugar de mostrar un selector
vacío limitado al proveedor.
de ámbito de proveedor vacío.
Modelos disponibles:
@ -649,29 +651,29 @@ Synthetic proporciona modelos compatibles con Anthropic detrás del proveedor `s
MiniMax se configura mediante `models.providers` porque usa endpoints personalizados:
- MiniMax OAuth (Global): `--auth-choice minimax-global-oauth`
- MiniMax OAuth (global): `--auth-choice minimax-global-oauth`
- MiniMax OAuth (CN): `--auth-choice minimax-cn-oauth`
- MiniMax API key (Global): `--auth-choice minimax-global-api`
- MiniMax API key (CN): `--auth-choice minimax-cn-api`
- Clave API de MiniMax (global): `--auth-choice minimax-global-api`
- Clave API de MiniMax (CN): `--auth-choice minimax-cn-api`
- Autenticación: `MINIMAX_API_KEY` para `minimax`; `MINIMAX_OAUTH_TOKEN` o
`MINIMAX_API_KEY` para `minimax-portal`
Consulta [/providers/minimax](/es/providers/minimax) para detalles de configuración, opciones de modelo y fragmentos de configuración.
Consulta [/providers/minimax](/es/providers/minimax) para obtener detalles de configuración, opciones de modelo y fragmentos de configuración.
En la ruta de streaming compatible con Anthropic de MiniMax, OpenClaw desactiva el razonamiento de
forma predeterminada a menos que lo configures explícitamente, y `/fast on` reescribe
En la ruta de streaming compatible con Anthropic de MiniMax, OpenClaw desactiva thinking de forma
predeterminada a menos que lo configures explícitamente, y `/fast on` reescribe
`MiniMax-M2.7` a `MiniMax-M2.7-highspeed`.
División de capacidades controlada por plugins:
División de capacidades propiedad del plugin:
- Los valores predeterminados de texto/chat permanecen en `minimax/MiniMax-M2.7`
- Los valores predeterminados de texto/chat siguen en `minimax/MiniMax-M2.7`
- La generación de imágenes es `minimax/image-01` o `minimax-portal/image-01`
- La comprensión de imágenes es `MiniMax-VL-01` controlado por plugin en ambas rutas de autenticación de MiniMax
- La búsqueda web permanece en el id de proveedor `minimax`
- La comprensión de imágenes es `MiniMax-VL-01` propiedad del plugin en ambas rutas de autenticación de MiniMax
- La búsqueda web permanece en el identificador de proveedor `minimax`
### Ollama
Ollama se incluye como plugin de proveedor agrupado y usa la API nativa de Ollama:
Ollama se distribuye como un plugin integrado de proveedor y usa la API nativa de Ollama:
- Proveedor: `ollama`
- Autenticación: no se requiere (servidor local)
@ -691,27 +693,27 @@ ollama pull llama3.3
}
```
Ollama se detecta localmente en `http://127.0.0.1:11434` cuando activas la opción con
`OLLAMA_API_KEY`, y el plugin de proveedor agrupado añade Ollama directamente a
Ollama se detecta localmente en `http://127.0.0.1:11434` cuando participas mediante
`OLLAMA_API_KEY`, y el plugin integrado del proveedor agrega Ollama directamente a
`openclaw onboard` y al selector de modelos. Consulta [/providers/ollama](/es/providers/ollama)
para la incorporación, el modo en la nube/local y la configuración personalizada.
para incorporación, modo local/en la nube y configuración personalizada.
### vLLM
vLLM se incluye como plugin de proveedor agrupado para servidores
compatibles con OpenAI locales/alojados por uno mismo:
vLLM se distribuye como un plugin integrado de proveedor para servidores
compatibles con OpenAI locales/alojados por el usuario:
- Proveedor: `vllm`
- Autenticación: opcional (depende de tu servidor)
- URL base predeterminada: `http://127.0.0.1:8000/v1`
Para activar la detección automática localmente (cualquier valor sirve si tu servidor no exige autenticación):
Para participar en el descubrimiento automático localmente (cualquier valor funciona si tu servidor no exige autenticación):
```bash
export VLLM_API_KEY="vllm-local"
```
Luego configura un modelo (sustitúyelo por uno de los ids devueltos por `/v1/models`):
Luego configura un modelo (sustitúyelo por uno de los identificadores devueltos por `/v1/models`):
```json5
{
@ -725,21 +727,21 @@ Consulta [/providers/vllm](/es/providers/vllm) para más detalles.
### SGLang
SGLang se incluye como plugin de proveedor agrupado para servidores
compatibles con OpenAI autoalojados de alto rendimiento:
SGLang se distribuye como un plugin integrado de proveedor para servidores
compatibles con OpenAI autohospedados y rápidos:
- Proveedor: `sglang`
- Autenticación: opcional (depende de tu servidor)
- URL base predeterminada: `http://127.0.0.1:30000/v1`
Para activar la detección automática localmente (cualquier valor sirve si tu servidor no
Para participar en el descubrimiento automático localmente (cualquier valor funciona si tu servidor no
exige autenticación):
```bash
export SGLANG_API_KEY="sglang-local"
```
Luego configura un modelo (sustitúyelo por uno de los ids devueltos por `/v1/models`):
Luego configura un modelo (sustitúyelo por uno de los identificadores devueltos por `/v1/models`):
```json5
{
@ -788,7 +790,7 @@ Ejemplo (compatible con OpenAI):
Notas:
- Para proveedores personalizados, `reasoning`, `input`, `cost`, `contextWindow` y `maxTokens` son opcionales.
- Para proveedores personalizados, `reasoning`, `input`, `cost`, `contextWindow`, y `maxTokens` son opcionales.
Cuando se omiten, OpenClaw usa estos valores predeterminados:
- `reasoning: false`
- `input: ["text"]`
@ -797,14 +799,14 @@ Notas:
- `maxTokens: 8192`
- Recomendado: configura valores explícitos que coincidan con los límites de tu proxy/modelo.
- Para `api: "openai-completions"` en endpoints no nativos (cualquier `baseUrl` no vacío cuyo host no sea `api.openai.com`), OpenClaw fuerza `compat.supportsDeveloperRole: false` para evitar errores 400 del proveedor por roles `developer` no compatibles.
- Las rutas de estilo proxy compatibles con OpenAI también omiten la conformación de solicitudes solo nativa de OpenAI:
no `service_tier`, no `store` de Responses, no sugerencias de caché de prompt, no
conformación de payload de compatibilidad de razonamiento de OpenAI y no encabezados
ocultos de atribución de OpenClaw.
- Si `baseUrl` está vacío o se omite, OpenClaw mantiene el comportamiento predeterminado de OpenAI (que resuelve a `api.openai.com`).
- Por seguridad, un `compat.supportsDeveloperRole: true` explícito sigue siendo reemplazado en endpoints no nativos de `openai-completions`.
- Las rutas proxy de estilo compatible con OpenAI también omiten el modelado nativo de solicitudes exclusivo de OpenAI:
no hay `service_tier`, no hay `store` de Responses, no hay sugerencias de caché de prompt, no hay
modelado de payload de compatibilidad de razonamiento de OpenAI y no hay encabezados ocultos
de atribución de OpenClaw.
- Si `baseUrl` está vacío/se omite, OpenClaw mantiene el comportamiento predeterminado de OpenAI (que se resuelve en `api.openai.com`).
- Por seguridad, una opción explícita `compat.supportsDeveloperRole: true` sigue siendo anulada en endpoints no nativos `openai-completions`.
## Ejemplos de la CLI
## Ejemplos de CLI
```bash
openclaw onboard --auth-choice opencode-zen
@ -812,7 +814,7 @@ openclaw models set opencode/claude-opus-4-6
openclaw models list
```
Consulta también: [/gateway/configuration](/es/gateway/configuration) para ejemplos completos de configuración.
Consulta también: [/gateway/configuration](/es/gateway/configuration) para ver ejemplos completos de configuración.
## Relacionado

View File

@ -2,50 +2,50 @@
read_when:
- Ampliar qa-lab o qa-channel
- Agregar escenarios de QA respaldados por el repositorio
- Crear una automatización de QA con mayor realismo alrededor del panel del Gateway
- Crear automatización de QA de mayor realismo alrededor del panel del Gateway
summary: Estructura de automatización de QA privada para qa-lab, qa-channel, escenarios sembrados e informes de protocolo
title: Automatización E2E de QA
x-i18n:
generated_at: "2026-04-08T05:02:50Z"
generated_at: "2026-04-09T01:27:42Z"
model: gpt-5.4
provider: openai
source_hash: 57da147dc06abf9620290104e01a83b42182db1806514114fd9e8467492cda99
source_hash: c922607d67e0f3a2489ac82bc9f510f7294ced039c1014c15b676d826441d833
source_path: concepts/qa-e2e-automation.md
workflow: 15
---
# Automatización E2E de QA
La pila de QA privada está pensada para ejercitar OpenClaw de una forma más realista,
La pila de QA privada está pensada para ejercitar OpenClaw de una manera más realista,
con forma de canal, de lo que puede hacerlo una sola prueba unitaria.
Partes actuales:
- `extensions/qa-channel`: canal de mensajes sintético con superficies de DM, canal, hilo,
- `extensions/qa-channel`: canal de mensajes sintético con superficies de MD, canal, hilo,
reacción, edición y eliminación.
- `extensions/qa-lab`: interfaz de depuración y bus de QA para observar la transcripción,
inyectar mensajes entrantes y exportar un informe en Markdown.
- `qa/`: recursos semilla respaldados por el repositorio para la tarea inicial y los
escenarios de QA de referencia.
escenarios base de QA.
El flujo actual del operador de QA es un sitio de QA de dos paneles:
- Izquierda: panel del Gateway (Control UI) con el agente.
- Derecha: QA Lab, que muestra la transcripción tipo Slack y el plan del escenario.
Ejecútalo con:
Ejecuta esto con:
```bash
pnpm qa:lab:up
```
Eso compila el sitio de QA, inicia la a del gateway respaldada por Docker y expone la
página de QA Lab donde un operador o un bucle de automatización puede darle al agente una
Eso compila el sitio de QA, inicia la ruta del gateway respaldada por Docker y expone la
página de QA Lab donde un operador o un bucle de automatización puede dar al agente una
misión de QA, observar el comportamiento real del canal y registrar qué funcionó, qué falló o
qué siguió bloqueado.
Para una iteración más rápida de la interfaz de QA Lab sin reconstruir la imagen de Docker cada vez,
inicia la pila con un paquete de QA Lab montado mediante bind mount:
Para iterar más rápido en la UI de QA Lab sin reconstruir la imagen de Docker cada vez,
inicia la pila con un paquete de QA Lab montado mediante bind:
```bash
pnpm openclaw qa docker-build-image
@ -54,7 +54,7 @@ pnpm qa:lab:up:fast
pnpm qa:lab:watch
```
`qa:lab:up:fast` mantiene los servicios de Docker sobre una imagen precompilada y monta mediante bind mount
`qa:lab:up:fast` mantiene los servicios de Docker sobre una imagen precompilada y monta mediante bind
`extensions/qa-lab/web/dist` dentro del contenedor `qa-lab`. `qa:lab:watch`
recompila ese paquete cuando hay cambios, y el navegador se recarga automáticamente cuando cambia el hash
de recursos de QA Lab.
@ -67,21 +67,21 @@ Los recursos semilla viven en `qa/`:
- `qa/scenarios/*.md`
Estos están intencionalmente en git para que el plan de QA sea visible tanto para las personas como para el
agente. La lista de referencia debe seguir siendo lo bastante amplia como para cubrir:
agente. La lista base debe seguir siendo lo bastante amplia como para cubrir:
- chat de DM y de canal
- chat por MD y por canal
- comportamiento de hilos
- ciclo de vida de las acciones de mensajes
- ciclo de vida de acciones de mensajes
- callbacks de cron
- recuperación de memoria
- cambio de modelo
- transferencia a subagentes
- transferencia a subagente
- lectura del repositorio y de la documentación
- una pequeña tarea de compilación como Lobster Invaders
## Informes
`qa-lab` exporta un informe de protocolo en Markdown a partir de la línea temporal del bus observado.
`qa-lab` exporta un informe de protocolo en Markdown a partir de la línea de tiempo observada del bus.
El informe debe responder:
- Qué funcionó
@ -89,8 +89,61 @@ El informe debe responder:
- Qué siguió bloqueado
- Qué escenarios de seguimiento vale la pena agregar
Para comprobaciones de carácter y estilo, ejecuta el mismo escenario en múltiples refs de modelos en vivo
y escribe un informe en Markdown evaluado:
```bash
pnpm openclaw qa character-eval \
--model openai/gpt-5.4,thinking=xhigh \
--model openai/gpt-5.2,thinking=xhigh \
--model openai/gpt-5,thinking=xhigh \
--model anthropic/claude-opus-4-6,thinking=high \
--model anthropic/claude-sonnet-4-6,thinking=high \
--model zai/glm-5.1,thinking=high \
--model moonshot/kimi-k2.5,thinking=high \
--model google/gemini-3.1-pro-preview,thinking=high \
--judge-model openai/gpt-5.4,thinking=xhigh,fast \
--judge-model anthropic/claude-opus-4-6,thinking=high \
--blind-judge-models \
--concurrency 16 \
--judge-concurrency 16
```
El comando ejecuta procesos hijo locales del gateway de QA, no Docker. Los escenarios de evaluación de carácter
deben establecer la persona mediante `SOUL.md`, y luego ejecutar turnos de usuario normales
como chat, ayuda del espacio de trabajo y pequeñas tareas de archivos. No se le debe decir al modelo
candidato que está siendo evaluado. El comando conserva cada transcripción completa,
registra estadísticas básicas de ejecución y luego pide a los modelos juez en modo fast con
razonamiento `xhigh` que clasifiquen las ejecuciones por naturalidad, vibra y humor.
Usa `--blind-judge-models` al comparar proveedores: el prompt del juez sigue recibiendo
cada transcripción y estado de ejecución, pero las refs candidatas se sustituyen por
etiquetas neutras como `candidate-01`; el informe vuelve a asignar las clasificaciones a las refs reales después
del análisis.
Las ejecuciones candidatas usan de forma predeterminada pensamiento `high`, con `xhigh` para los modelos de OpenAI que
lo admiten. Sustituye un candidato específico en línea con
`--model provider/model,thinking=<level>`. `--thinking <level>` sigue estableciendo un
respaldo global, y la forma anterior `--model-thinking <provider/model=level>` se
mantiene por compatibilidad.
Las refs candidatas de OpenAI usan de forma predeterminada el modo fast para que se use el procesamiento prioritario allí
donde el proveedor lo admita. Agrega `,fast`, `,no-fast` o `,fast=false` en línea cuando un
solo candidato o juez necesite una sustitución. Pasa `--fast` solo cuando quieras
forzar el modo fast para todos los modelos candidatos. Las duraciones de candidatos y jueces se
registran en el informe para el análisis comparativo, pero los prompts de los jueces dicen explícitamente que
no clasifiquen por velocidad.
Tanto las ejecuciones de modelos candidatos como las de jueces usan por defecto una concurrencia de 16. Reduce
`--concurrency` o `--judge-concurrency` cuando los límites del proveedor o la presión del gateway local
hagan que una ejecución sea demasiado ruidosa.
Cuando no se pasa ningún `--model` candidato, la evaluación de carácter usa por defecto
`openai/gpt-5.4`, `openai/gpt-5.2`, `openai/gpt-5`, `anthropic/claude-opus-4-6`,
`anthropic/claude-sonnet-4-6`, `zai/glm-5.1`,
`moonshot/kimi-k2.5` y
`google/gemini-3.1-pro-preview` cuando no se pasa `--model`.
Cuando no se pasa `--judge-model`, los jueces usan por defecto
`openai/gpt-5.4,thinking=xhigh,fast` y
`anthropic/claude-opus-4-6,thinking=high`.
## Documentación relacionada
- [Pruebas](/es/help/testing)
- [Canal de QA](/es/channels/qa-channel)
- [Panel](/web/dashboard)
- [Testing](/es/help/testing)
- [QA Channel](/es/channels/qa-channel)
- [Dashboard](/web/dashboard)

View File

@ -1,34 +1,34 @@
---
read_when:
- Quieres una alternativa confiable cuando fallen los proveedores de API
- Estás ejecutando Codex CLI u otros CLI de IA locales y quieres reutilizarlos
- Quieres entender el puente loopback de MCP para el acceso a herramientas del backend de CLI
summary: 'Backends de CLI: alternativa local de CLI de IA con puente de herramientas MCP opcional'
- Quieres un respaldo confiable cuando fallen los proveedores de API
- Estás ejecutando Codex CLI u otras CLI de IA locales y quieres reutilizarlas
- Quieres comprender el puente loopback de MCP para el acceso a herramientas del backend de CLI
summary: 'Backends de CLI: respaldo con CLI de IA local con puente de herramientas MCP opcional'
title: Backends de CLI
x-i18n:
generated_at: "2026-04-08T02:14:38Z"
generated_at: "2026-04-09T01:27:53Z"
model: gpt-5.4
provider: openai
source_hash: b0e8c41f5f5a8e34466f6b765e5c08585ef1788fa9e9d953257324bcc6cbc414
source_hash: 9b458f9fe6fa64c47864c8c180f3dedfd35c5647de470a2a4d31c26165663c20
source_path: gateway/cli-backends.md
workflow: 15
---
# Backends de CLI (runtime alternativo)
# Backends de CLI (entorno de ejecución de respaldo)
OpenClaw puede ejecutar **CLI de IA locales** como una **alternativa solo de texto** cuando los proveedores de API no están disponibles,
están limitados por tasa o se comportan mal temporalmente. Esto es intencionalmente conservador:
OpenClaw puede ejecutar **CLI de IA locales** como **respaldo solo de texto** cuando los proveedores de API no están disponibles,
tienen límite de tasa o presentan un comportamiento incorrecto temporal. Esto es intencionalmente conservador:
- **Las herramientas de OpenClaw no se inyectan directamente**, pero los backends con `bundleMcp: true`
pueden recibir herramientas del gateway mediante un puente MCP loopback.
- **Streaming JSONL** para los CLI que lo admiten.
- **Se admiten sesiones** (para que los turnos de seguimiento sigan siendo coherentes).
- **Las imágenes pueden pasarse** si el CLI acepta rutas de imágenes.
pueden recibir herramientas del gateway mediante un puente loopback de MCP.
- **Streaming JSONL** para las CLI que lo admiten.
- **Se admiten sesiones** (para que los turnos de seguimiento mantengan la coherencia).
- **Las imágenes pueden pasarse** si la CLI acepta rutas de imágenes.
Esto está diseñado como una **red de seguridad** más que como una ruta principal. Úsalo cuando
quieras respuestas de texto de “siempre funciona” sin depender de API externas.
Esto está diseñado como una **red de seguridad** en lugar de una ruta principal. Úsalo cuando
quieras respuestas de texto que “siempre funcionen” sin depender de APIs externas.
Si quieres un runtime de arnés completo con controles de sesión ACP, tareas en segundo plano,
Si quieres un entorno de ejecución completo con controles de sesión ACP, tareas en segundo plano,
vinculación de hilo/conversación y sesiones externas de programación persistentes, usa
[ACP Agents](/es/tools/acp-agents) en su lugar. Los backends de CLI no son ACP.
@ -58,16 +58,16 @@ ruta del comando:
}
```
Eso es todo. No se necesitan claves ni configuración de autenticación adicional más allá del propio CLI.
Eso es todo. No se necesitan claves ni configuración de autenticación extra más allá de la propia CLI.
Si usas un backend de CLI incluido como **proveedor principal de mensajes** en un
host de gateway, OpenClaw ahora carga automáticamente el plugin incluido propietario cuando tu configuración
hace referencia explícita a ese backend en una referencia de modelo o en
`agents.defaults.cliBackends`.
## Uso como alternativa
## Uso como respaldo
Agrega un backend de CLI a tu lista de alternativas para que solo se ejecute cuando fallen los modelos principales:
Agrega un backend de CLI a tu lista de respaldo para que solo se ejecute cuando fallen los modelos principales:
```json5
{
@ -88,9 +88,9 @@ Agrega un backend de CLI a tu lista de alternativas para que solo se ejecute cua
Notas:
- Si usas `agents.defaults.models` (lista permitida), también debes incluir ahí los modelos de tu backend de CLI.
- Si usas `agents.defaults.models` (lista de permitidos), también debes incluir allí los modelos de tu backend de CLI.
- Si falla el proveedor principal (autenticación, límites de tasa, tiempos de espera), OpenClaw
probará después el backend de CLI.
probará luego el backend de CLI.
## Resumen de configuración
@ -100,8 +100,8 @@ Todos los backends de CLI viven en:
agents.defaults.cliBackends
```
Cada entrada se identifica con un **id de proveedor** (por ejemplo, `codex-cli`, `my-cli`).
El id del proveedor se convierte en la parte izquierda de tu referencia de modelo:
Cada entrada está indexada por un **id de proveedor** (por ejemplo, `codex-cli`, `my-cli`).
El id de proveedor pasa a ser el lado izquierdo de tu referencia de modelo:
```
<provider>/<model>
@ -131,6 +131,9 @@ El id del proveedor se convierte en la parte izquierda de tu referencia de model
sessionMode: "existing",
sessionIdFields: ["session_id", "conversation_id"],
systemPromptArg: "--system",
// Las CLI de estilo Codex pueden apuntar a un archivo de prompt en su lugar:
// systemPromptFileConfigArg: "-c",
// systemPromptFileConfigKey: "model_instructions_file",
systemPromptWhen: "first",
imageArg: "--image",
imageMode: "repeat",
@ -145,65 +148,71 @@ El id del proveedor se convierte en la parte izquierda de tu referencia de model
## Cómo funciona
1. **Selecciona un backend** según el prefijo del proveedor (`codex-cli/...`).
2. **Construye un prompt del sistema** usando el mismo prompt de OpenClaw + contexto del espacio de trabajo.
3. **Ejecuta el CLI** con un id de sesión (si se admite) para que el historial siga siendo consistente.
4. **Analiza la salida** (JSON o texto sin formato) y devuelve el texto final.
5. **Persiste los id de sesión** por backend, para que los seguimientos reutilicen la misma sesión del CLI.
2. **Construye un prompt de sistema** usando el mismo prompt de OpenClaw + contexto del espacio de trabajo.
3. **Ejecuta la CLI** con un id de sesión (si se admite) para que el historial se mantenga consistente.
4. **Analiza la salida** (JSON o texto plano) y devuelve el texto final.
5. **Persiste los id de sesión** por backend, para que los seguimientos reutilicen la misma sesión de la CLI.
<Note>
El backend incluido `claude-cli` de Anthropic vuelve a ser compatible. El personal de Anthropic
nos dijo que el uso de Claude CLI al estilo de OpenClaw vuelve a estar permitido, por lo que OpenClaw trata
El backend `claude-cli` incluido de Anthropic vuelve a ser compatible. El personal de Anthropic
nos dijo que el uso de Claude CLI al estilo OpenClaw vuelve a estar permitido, por lo que OpenClaw trata
el uso de `claude -p` como autorizado para esta integración, a menos que Anthropic publique
una nueva política.
</Note>
El backend `codex-cli` incluido de OpenAI pasa el prompt de sistema de OpenClaw a través de
la anulación de configuración `model_instructions_file` de Codex (`-c
model_instructions_file="..."`). Codex no expone una bandera de estilo Claude
`--append-system-prompt`, por lo que OpenClaw escribe el prompt ensamblado en un
archivo temporal para cada sesión nueva de Codex CLI.
## Sesiones
- Si el CLI admite sesiones, configura `sessionArg` (por ejemplo, `--session-id`) o
- Si la CLI admite sesiones, establece `sessionArg` (por ejemplo, `--session-id`) o
`sessionArgs` (marcador `{sessionId}`) cuando el ID deba insertarse
en varias banderas.
- Si el CLI usa un **subcomando de reanudación** con banderas diferentes, configura
`resumeArgs` (reemplaza `args` al reanudar) y, opcionalmente, `resumeOutput`
(para reanudaciones no JSON).
- Si la CLI usa un **subcomando de reanudación** con banderas diferentes, establece
`resumeArgs` (reemplaza `args` al reanudar) y opcionalmente `resumeOutput`
(para reanudaciones que no son JSON).
- `sessionMode`:
- `always`: siempre envía un id de sesión (un UUID nuevo si no hay ninguno almacenado).
- `existing`: solo envía un id de sesión si ya se había almacenado antes.
- `none`: nunca envía un id de sesión.
- `always`: envía siempre un id de sesión (UUID nuevo si no hay ninguno almacenado).
- `existing`: envía un id de sesión solo si ya había uno almacenado.
- `none`: no envía nunca un id de sesión.
Notas sobre serialización:
- `serialize: true` mantiene ordenadas las ejecuciones del mismo carril.
- La mayoría de los CLI serializan en un carril de proveedor.
- OpenClaw descarta la reutilización de sesiones de CLI almacenadas cuando cambia el estado de autenticación del backend, incluido relogin, rotación de tokens o un cambio en las credenciales del perfil de autenticación.
- `serialize: true` mantiene ordenadas las ejecuciones en la misma vía.
- La mayoría de las CLI serializan en una vía de proveedor.
- OpenClaw descarta la reutilización de sesión almacenada de la CLI cuando cambia el estado de autenticación del backend, lo que incluye volver a iniciar sesión, rotación de tokens o un cambio en la credencial del perfil de autenticación.
## Imágenes (paso directo)
Si tu CLI acepta rutas de imágenes, configura `imageArg`:
Si tu CLI acepta rutas de imágenes, establece `imageArg`:
```json5
imageArg: "--image",
imageMode: "repeat"
```
OpenClaw escribirá las imágenes base64 en archivos temporales. Si `imageArg` está configurado, esas
rutas se pasan como argumentos del CLI. Si falta `imageArg`, OpenClaw agrega las
rutas de archivo al prompt (inyección de ruta), lo que es suficiente para los CLI que cargan automáticamente
archivos locales a partir de rutas simples.
OpenClaw escribirá las imágenes base64 en archivos temporales. Si `imageArg` está establecido, esas
rutas se pasan como argumentos de CLI. Si falta `imageArg`, OpenClaw agrega las
rutas de archivo al prompt (inyección de ruta), lo cual es suficiente para las CLI que cargan
automáticamente archivos locales desde rutas simples.
## Entradas / salidas
- `output: "json"` (predeterminado) intenta analizar JSON y extraer texto + id de sesión.
- Para la salida JSON de Gemini CLI, OpenClaw lee el texto de respuesta de `response` y
el uso de `stats` cuando falta `usage` o está vacío.
- `output: "jsonl"` analiza streams JSONL (por ejemplo Codex CLI `--json`) y extrae el mensaje final del agente, además de los identificadores de sesión
cuando están presentes.
- Para la salida JSON de Gemini CLI, OpenClaw lee el texto de respuesta desde `response` y
el uso desde `stats` cuando falta `usage` o está vacío.
- `output: "jsonl"` analiza flujos JSONL (por ejemplo Codex CLI `--json`) y extrae el mensaje final del agente más los identificadores
de sesión cuando están presentes.
- `output: "text"` trata stdout como la respuesta final.
Modos de entrada:
- `input: "arg"` (predeterminado) pasa el prompt como el último argumento del CLI.
- `input: "stdin"` envía el prompt mediante stdin.
- Si el prompt es muy largo y `maxPromptArgChars` está configurado, se usa stdin.
- `input: "arg"` (predeterminado) pasa el prompt como el último argumento de CLI.
- `input: "stdin"` envía el prompt por stdin.
- Si el prompt es muy largo y se establece `maxPromptArgChars`, se usa stdin.
## Valores predeterminados (propiedad del plugin)
@ -229,31 +238,31 @@ El plugin Google incluido también registra un valor predeterminado para `google
- `sessionMode: "existing"`
- `sessionIdFields: ["session_id", "sessionId"]`
Requisito previo: el Gemini CLI local debe estar instalado y disponible como
Requisito previo: la Gemini CLI local debe estar instalada y disponible como
`gemini` en `PATH` (`brew install gemini-cli` o
`npm install -g @google/gemini-cli`).
Notas sobre JSON de Gemini CLI:
- El texto de respuesta se lee del campo JSON `response`.
- El uso recurre a `stats` cuando `usage` está ausente o vacío.
- `stats.cached` se normaliza en OpenClaw como `cacheRead`.
- Si falta `stats.input`, OpenClaw deriva los tokens de entrada de
- El uso recurre a `stats` cuando `usage` no está presente o está vacío.
- `stats.cached` se normaliza como `cacheRead` en OpenClaw.
- Si falta `stats.input`, OpenClaw deriva los tokens de entrada a partir de
`stats.input_tokens - stats.cached`.
Sobrescribe esto solo si es necesario (lo más común: ruta absoluta de `command`).
Anúlalo solo si es necesario (algo común: ruta `command` absoluta).
## Valores predeterminados propiedad del plugin
Los valores predeterminados de los backends de CLI ahora forman parte de la superficie del plugin:
Los valores predeterminados del backend de CLI ahora forman parte de la superficie del plugin:
- Los plugins los registran con `api.registerCliBackend(...)`.
- El `id` del backend se convierte en el prefijo del proveedor en las referencias de modelo.
- La configuración de usuario en `agents.defaults.cliBackends.<id>` sigue sobrescribiendo el valor predeterminado del plugin.
- El `id` del backend pasa a ser el prefijo de proveedor en las referencias de modelo.
- La configuración del usuario en `agents.defaults.cliBackends.<id>` sigue anulando el valor predeterminado del plugin.
- La limpieza de configuración específica del backend sigue siendo propiedad del plugin mediante el hook opcional
`normalizeConfig`.
## Superposiciones Bundle MCP
## Superposiciones de MCP incluidas
Los backends de CLI **no** reciben llamadas de herramientas de OpenClaw directamente, pero un backend puede
optar por una superposición de configuración MCP generada con `bundleMcp: true`.
@ -261,37 +270,37 @@ optar por una superposición de configuración MCP generada con `bundleMcp: true
Comportamiento incluido actual:
- `claude-cli`: archivo de configuración MCP estricto generado
- `codex-cli`: sobrescrituras de configuración en línea para `mcp_servers`
- `codex-cli`: anulaciones de configuración en línea para `mcp_servers`
- `google-gemini-cli`: archivo de configuración del sistema Gemini generado
Cuando Bundle MCP está habilitado, OpenClaw:
Cuando bundle MCP está habilitado, OpenClaw:
- genera un servidor HTTP MCP loopback que expone herramientas del gateway al proceso del CLI
- inicia un servidor HTTP MCP loopback que expone herramientas del gateway al proceso de CLI
- autentica el puente con un token por sesión (`OPENCLAW_MCP_TOKEN`)
- limita el acceso a herramientas a la sesión, cuenta y contexto de canal actuales
- limita el acceso a herramientas a la sesión, cuenta y contexto del canal actuales
- carga los servidores bundle-MCP habilitados para el espacio de trabajo actual
- los combina con cualquier forma existente de configuración/ajustes MCP del backend
- los fusiona con cualquier forma existente de configuración/ajustes MCP del backend
- reescribe la configuración de inicio usando el modo de integración propiedad del backend desde la extensión propietaria
Si no hay servidores MCP habilitados, OpenClaw sigue inyectando una configuración estricta cuando un
backend opta por Bundle MCP para que las ejecuciones en segundo plano permanezcan aisladas.
Si no hay servidores MCP habilitados, OpenClaw igualmente inyecta una configuración estricta cuando un
backend opta por bundle MCP para que las ejecuciones en segundo plano sigan aisladas.
## Limitaciones
- **No hay llamadas directas a herramientas de OpenClaw.** OpenClaw no inyecta llamadas de herramientas en
el protocolo del backend de CLI. Los backends solo ven herramientas del gateway cuando optan por
`bundleMcp: true`.
- **El streaming es específico del backend.** Algunos backends transmiten JSONL; otros almacenan
en búfer hasta la salida.
- **Las salidas estructuradas** dependen del formato JSON del CLI.
- **Las sesiones de Codex CLI** se reanudan mediante salida de texto (sin JSONL), lo que es menos
- **El streaming es específico del backend.** Algunos backends transmiten JSONL; otros almacenan en búfer
hasta salir.
- **Las salidas estructuradas** dependen del formato JSON de la CLI.
- **Las sesiones de Codex CLI** se reanudan mediante salida de texto (sin JSONL), lo que es menos
estructurado que la ejecución inicial con `--json`. Las sesiones de OpenClaw siguen funcionando
normalmente.
## Solución de problemas
- **CLI no encontrado**: configura `command` con una ruta completa.
- **Nombre de modelo incorrecto**: usa `modelAliases` para mapear `provider/model` → modelo del CLI.
- **Sin continuidad de sesión**: asegúrate de que `sessionArg` esté configurado y que `sessionMode` no sea
- **CLI no encontrada**: establece `command` en una ruta completa.
- **Nombre de modelo incorrecto**: usa `modelAliases` para asignar `provider/model` → modelo de CLI.
- **Sin continuidad de sesión**: asegúrate de que `sessionArg` esté establecido y de que `sessionMode` no sea
`none` (actualmente Codex CLI no puede reanudarse con salida JSON).
- **Imágenes ignoradas**: configura `imageArg` (y verifica que el CLI admita rutas de archivo).
- **Imágenes ignoradas**: establece `imageArg` (y verifica que la CLI admita rutas de archivo).

File diff suppressed because it is too large Load Diff

View File

@ -1,22 +1,23 @@
---
read_when:
- Agregar o modificar migraciones de Doctor
- Introducir cambios de configuración incompatibles
- Agregar o modificar migraciones de doctor
- Introducir cambios incompatibles de configuración
summary: 'Comando Doctor: comprobaciones de estado, migraciones de configuración y pasos de reparación'
title: Doctor
x-i18n:
generated_at: "2026-04-08T02:15:35Z"
generated_at: "2026-04-09T01:29:12Z"
model: gpt-5.4
provider: openai
source_hash: 3761a222d9db7088f78215575fa84e5896794ad701aa716e8bf9039a4424dca6
source_hash: 75d321bd1ad0e16c29f2382e249c51edfc3a8d33b55bdceea39e7dbcd4901fce
source_path: gateway/doctor.md
workflow: 15
---
# Doctor
`openclaw doctor` es la herramienta de reparación y migración de OpenClaw. Corrige
configuración/estado obsoletos, comprueba el estado y proporciona pasos de reparación accionables.
`openclaw doctor` es la herramienta de reparación + migración de OpenClaw. Corrige
configuración/estado obsoletos, comprueba el estado y proporciona pasos de
reparación accionables.
## Inicio rápido
@ -24,19 +25,19 @@ configuración/estado obsoletos, comprueba el estado y proporciona pasos de repa
openclaw doctor
```
### Sin interfaz / automatización
### Modo sin interfaz / automatización
```bash
openclaw doctor --yes
```
Acepta los valores predeterminados sin solicitar confirmación (incluidos los pasos de reparación de reinicio/servicio/sandbox cuando corresponda).
Acepta los valores predeterminados sin preguntar (incluidos los pasos de reparación de reinicio/servicio/sandbox cuando corresponda).
```bash
openclaw doctor --repair
```
Aplica las reparaciones recomendadas sin solicitar confirmación (reparaciones + reinicios cuando sea seguro).
Aplica las reparaciones recomendadas sin preguntar (reparaciones + reinicios cuando sea seguro).
```bash
openclaw doctor --repair --force
@ -48,7 +49,7 @@ Aplica también reparaciones agresivas (sobrescribe configuraciones personalizad
openclaw doctor --non-interactive
```
Se ejecuta sin solicitudes y solo aplica migraciones seguras (normalización de configuración + movimientos de estado en disco). Omite acciones de reinicio/servicio/sandbox que requieren confirmación humana.
Se ejecuta sin preguntas y solo aplica migraciones seguras (normalización de configuración + movimientos de estado en disco). Omite acciones de reinicio/servicio/sandbox que requieren confirmación humana.
Las migraciones de estado heredado se ejecutan automáticamente cuando se detectan.
```bash
@ -57,7 +58,7 @@ openclaw doctor --deep
Analiza los servicios del sistema para detectar instalaciones adicionales del gateway (launchd/systemd/schtasks).
Si quiere revisar los cambios antes de escribirlos, abra primero el archivo de configuración:
Si quieres revisar los cambios antes de escribir, abre primero el archivo de configuración:
```bash
cat ~/.openclaw/openclaw.json
@ -66,61 +67,95 @@ cat ~/.openclaw/openclaw.json
## Qué hace (resumen)
- Actualización previa opcional para instalaciones de git (solo interactivo).
- Comprobación de actualización del protocolo de la UI (reconstruye Control UI cuando el esquema del protocolo es más reciente).
- Comprobación de estado + solicitud de reinicio.
- Resumen del estado de Skills (aptas/faltantes/bloqueadas) y estado de plugins.
- Comprobación de vigencia del protocolo de IU (reconstruye la Control UI cuando el esquema del protocolo es más reciente).
- Comprobación de estado + aviso para reiniciar.
- Resumen del estado de Skills (aptas/faltantes/bloqueadas) y estado de los plugins.
- Normalización de configuración para valores heredados.
- Migración de la configuración de Talk desde los campos planos heredados `talk.*` a `talk.provider` + `talk.providers.<provider>`.
- Migración de configuración de Talk desde campos planos heredados `talk.*` hacia `talk.provider` + `talk.providers.<provider>`.
- Comprobaciones de migración del navegador para configuraciones heredadas de la extensión de Chrome y preparación de Chrome MCP.
- Advertencias de sobrescritura del proveedor OpenCode (`models.providers.opencode` / `models.providers.opencode-go`).
- Advertencias de enmascaramiento de OAuth de Codex (`models.providers.openai-codex`).
- Comprobación de requisitos previos de TLS para perfiles OAuth de OpenAI Codex.
- Migración de estado heredado en disco (sesiones/directorio de agente/autenticación de WhatsApp).
- Migración de claves de contrato heredadas del manifiesto de plugins (`speechProviders`, `realtimeTranscriptionProviders`, `realtimeVoiceProviders`, `mediaUnderstandingProviders`, `imageGenerationProviders`, `videoGenerationProviders`, `webFetchProviders`, `webSearchProviders``contracts`).
- Migración del almacén cron heredado (`jobId`, `schedule.cron`, campos de entrega/carga útil de nivel superior, `provider` en la carga útil, trabajos de respaldo webhook simples con `notify: true`).
- Advertencias de anulaciones del proveedor OpenCode (`models.providers.opencode` / `models.providers.opencode-go`).
- Advertencias de sombreado de OAuth de Codex (`models.providers.openai-codex`).
- Comprobación de requisitos previos de TLS de OAuth para perfiles de OAuth de OpenAI Codex.
- Migración heredada de estado en disco (sesiones/directorio del agente/autenticación de WhatsApp).
- Migración heredada de claves de contrato en manifiestos de plugins (`speechProviders`, `realtimeTranscriptionProviders`, `realtimeVoiceProviders`, `mediaUnderstandingProviders`, `imageGenerationProviders`, `videoGenerationProviders`, `webFetchProviders`, `webSearchProviders``contracts`).
- Migración heredada del almacén cron (`jobId`, `schedule.cron`, campos de entrega/carga útil de nivel superior, `provider` en la carga útil, trabajos simples de respaldo webhook con `notify: true`).
- Inspección de archivos de bloqueo de sesión y limpieza de bloqueos obsoletos.
- Comprobaciones de integridad y permisos del estado (sesiones, transcripciones, directorio de estado).
- Comprobaciones de permisos del archivo de configuración (`chmod 600`) cuando se ejecuta localmente.
- Estado de autenticación de modelos: comprueba el vencimiento de OAuth, puede renovar tokens próximos a vencer y reporta estados de enfriamiento/deshabilitación de perfiles de autenticación.
- Estado de autenticación del modelo: comprueba vencimiento de OAuth, puede actualizar tokens próximos a vencer e informa de estados de enfriamiento/desactivación del perfil de autenticación.
- Detección de directorio de espacio de trabajo adicional (`~/openclaw`).
- Reparación de imagen de sandbox cuando el aislamiento está habilitado.
- Migración de servicios heredados y detección de gateways adicionales.
- Migración de estado heredado del canal Matrix (en modo `--fix` / `--repair`).
- Comprobaciones del tiempo de ejecución del gateway (servicio instalado pero no en ejecución; etiqueta launchd en caché).
- Reparación de imagen de sandbox cuando el sandbox está habilitado.
- Migración de servicio heredado y detección de gateways adicionales.
- Migración heredada del estado del canal Matrix (en modo `--fix` / `--repair`).
- Comprobaciones del runtime del gateway (servicio instalado pero no en ejecución; etiqueta launchd en caché).
- Advertencias de estado de canales (sondeadas desde el gateway en ejecución).
- Auditoría de configuración del supervisor (launchd/systemd/schtasks) con reparación opcional.
- Comprobaciones de buenas prácticas del tiempo de ejecución del gateway (Node frente a Bun, rutas de gestores de versiones).
- Diagnóstico de colisiones de puerto del gateway (predeterminado `18789`).
- Advertencias de seguridad para políticas de DM abiertas.
- Comprobaciones de autenticación del gateway para el modo de token local (ofrece generar un token cuando no existe una fuente de token; no sobrescribe configuraciones de token con SecretRef).
- Comprobación de linger de systemd en Linux.
- Comprobación del tamaño de archivos de arranque del espacio de trabajo (advertencias de truncamiento o cercanía al límite para archivos de contexto).
- Comprobación del estado del autocompletado del shell e instalación/actualización automática.
- Comprobaciones de buenas prácticas del runtime del gateway (Node frente a Bun, rutas de gestores de versiones).
- Diagnósticos de colisión de puertos del gateway (predeterminado `18789`).
- Advertencias de seguridad para políticas de MD abiertas.
- Comprobaciones de autenticación del gateway para modo de token local (ofrece generar un token cuando no existe una fuente de token; no sobrescribe configuraciones de token SecretRef).
- Comprobación de systemd linger en Linux.
- Comprobación del tamaño de archivos bootstrap del espacio de trabajo (advertencias por truncamiento/cercanía al límite para archivos de contexto).
- Comprobación del estado de autocompletado del shell e instalación/actualización automática.
- Comprobación de preparación del proveedor de embeddings para búsqueda en memoria (modelo local, clave de API remota o binario QMD).
- Comprobaciones de instalación desde código fuente (desajuste del espacio de trabajo pnpm, recursos de UI faltantes, binario tsx faltante).
- Comprobaciones de instalación desde código fuente (desajuste de espacio de trabajo pnpm, recursos de IU faltantes, binario tsx faltante).
- Escribe la configuración actualizada + metadatos del asistente.
## Comportamiento detallado y fundamento
## Backfill y restablecimiento de la IU de Dreams
La escena Dreams de la Control UI incluye acciones de **Backfill**, **Reset** y **Clear Grounded**
para el flujo de trabajo de sueños fundamentados. Estas acciones usan métodos RPC
de estilo doctor del gateway, pero **no** forman parte de la reparación/migración
de la CLI `openclaw doctor`.
Qué hacen:
- **Backfill** analiza archivos históricos `memory/YYYY-MM-DD.md` en el espacio
de trabajo activo, ejecuta el proceso fundamentado del diario REM y escribe
entradas reversibles de backfill en `DREAMS.md`.
- **Reset** elimina solo esas entradas del diario de backfill marcadas de `DREAMS.md`.
- **Clear Grounded** elimina solo las entradas preparadas a corto plazo de tipo
grounded-only que provinieron de una reproducción histórica y que aún no han
acumulado recuperación en vivo ni soporte diario.
Qué **no** hacen por sí solas:
- no editan `MEMORY.md`
- no ejecutan migraciones completas de doctor
- no preparan automáticamente candidatos fundamentados en el almacén de promoción
activa a corto plazo a menos que ejecutes explícitamente primero la ruta de la CLI preparada
Si quieres que la reproducción histórica fundamentada influya en la vía normal
de promoción profunda, usa en su lugar el flujo de CLI:
```bash
openclaw memory rem-backfill --path ./memory --stage-short-term
```
Eso prepara candidatos duraderos fundamentados en el almacén de sueños a corto plazo,
manteniendo `DREAMS.md` como la superficie de revisión.
## Comportamiento detallado y justificación
### 0) Actualización opcional (instalaciones de git)
Si esto es una extracción de git y doctor se está ejecutando de forma interactiva, ofrece
Si esto es un checkout de git y doctor se ejecuta de forma interactiva, ofrece
actualizar (fetch/rebase/build) antes de ejecutar doctor.
### 1) Normalización de configuración
Si la configuración contiene formas de valores heredados (por ejemplo `messages.ackReaction`
sin una sobrescritura específica del canal), doctor los normaliza al esquema actual.
Si la configuración contiene formas heredadas de valores (por ejemplo `messages.ackReaction`
sin una anulación específica por canal), doctor las normaliza al esquema actual.
Eso incluye los campos planos heredados de Talk. La configuración pública actual de Talk es
Eso incluye campos planos heredados de Talk. La configuración pública actual de Talk es
`talk.provider` + `talk.providers.<provider>`. Doctor reescribe las formas antiguas
`talk.voiceId` / `talk.voiceAliases` / `talk.modelId` / `talk.outputFormat` /
`talk.apiKey` en el mapa de proveedores.
`talk.apiKey` en el mapa del proveedor.
### 2) Migraciones de claves de configuración heredadas
### 2) Migraciones de claves heredadas de configuración
Cuando la configuración contiene claves obsoletas, otros comandos se niegan a ejecutarse y piden
que ejecute `openclaw doctor`.
Cuando la configuración contiene claves obsoletas, otros comandos se niegan a ejecutarse y te piden
que ejecutes `openclaw doctor`.
Doctor hará lo siguiente:
@ -128,8 +163,8 @@ Doctor hará lo siguiente:
- Mostrar la migración que aplicó.
- Reescribir `~/.openclaw/openclaw.json` con el esquema actualizado.
El Gateway también ejecuta automáticamente las migraciones de doctor al iniciarse cuando detecta un
formato de configuración heredado, por lo que las configuraciones obsoletas se reparan sin intervención manual.
El Gateway también ejecuta automáticamente las migraciones de doctor al iniciarse cuando detecta
un formato heredado de configuración, de modo que las configuraciones obsoletas se reparan sin intervención manual.
Las migraciones del almacén de trabajos cron se gestionan con `openclaw doctor --fix`.
Migraciones actuales:
@ -141,7 +176,7 @@ Migraciones actuales:
- `routing.queue``messages.queue`
- `routing.bindings``bindings` de nivel superior
- `routing.agents`/`routing.defaultAgentId` → `agents.list` + `agents.list[].default`
- `talk.voiceId`/`talk.voiceAliases`/`talk.modelId`/`talk.outputFormat`/`talk.apiKey` heredados`talk.provider` + `talk.providers.<provider>`
- heredado `talk.voiceId`/`talk.voiceAliases`/`talk.modelId`/`talk.outputFormat`/`talk.apiKey` → `talk.provider` + `talk.providers.<provider>`
- `routing.agentToAgent``tools.agentToAgent`
- `routing.transcribeAudio``tools.media.audio.models`
- `messages.tts.<provider>` (`openai`/`elevenlabs`/`microsoft`/`edge`) → `messages.tts.providers.<provider>`
@ -154,7 +189,7 @@ Migraciones actuales:
- `plugins.entries.voice-call.config.streaming.openaiApiKey|sttModel|silenceDurationMs|vadThreshold`
`plugins.entries.voice-call.config.streaming.providers.openai.*`
- `bindings[].match.accountID``bindings[].match.accountId`
- Para canales con `accounts` con nombre pero con valores de canal de cuenta única aún presentes en el nivel superior, mover esos valores con alcance de cuenta a la cuenta promovida elegida para ese canal (`accounts.default` para la mayoría de los canales; Matrix puede conservar un destino coincidente con nombre/predeterminado existente)
- Para canales con `accounts` con nombre pero con valores persistentes de canal de cuenta única en el nivel superior, mover esos valores con alcance de cuenta a la cuenta promovida elegida para ese canal (`accounts.default` para la mayoría de los canales; Matrix puede conservar un destino con nombre/predeterminado coincidente ya existente)
- `identity``agents.list[].identity`
- `agent.*``agents.defaults` + `tools.*` (tools/elevated/exec/sandbox/subagents)
- `agent.model`/`allowedModels`/`modelAliases`/`modelFallbacks`/`imageModelFallbacks`
@ -163,74 +198,75 @@ Migraciones actuales:
- `browser.profiles.*.driver: "extension"``"existing-session"`
- eliminar `browser.relayBindHost` (configuración heredada del relay de la extensión)
Las advertencias de Doctor también incluyen orientación sobre cuentas predeterminadas para canales con varias cuentas:
Las advertencias de doctor también incluyen orientación sobre cuentas predeterminadas para canales con varias cuentas:
- Si se configuran dos o más entradas `channels.<channel>.accounts` sin `channels.<channel>.defaultAccount` o `accounts.default`, doctor advierte que el enrutamiento de respaldo puede elegir una cuenta inesperada.
- Si `channels.<channel>.defaultAccount` está configurado con un ID de cuenta desconocido, doctor advierte y enumera los ID de cuenta configurados.
- Si se configuran dos o más entradas `channels.<channel>.accounts` sin `channels.<channel>.defaultAccount` ni `accounts.default`, doctor advierte que el enrutamiento de respaldo puede elegir una cuenta inesperada.
- Si `channels.<channel>.defaultAccount` está establecido en un ID de cuenta desconocido, doctor advierte y enumera los ID de cuenta configurados.
### 2b) Sobrescrituras del proveedor OpenCode
### 2b) Anulaciones del proveedor OpenCode
Si agregó manualmente `models.providers.opencode`, `opencode-zen` u `opencode-go`,
sobrescribe el catálogo integrado de OpenCode de `@mariozechner/pi-ai`.
Eso puede forzar modelos a la API incorrecta o dejar los costos en cero. Doctor advierte para que
pueda eliminar la sobrescritura y restaurar el enrutamiento por modelo + costos.
Si agregaste manualmente `models.providers.opencode`, `opencode-zen` o `opencode-go`,
eso sobrescribe el catálogo integrado de OpenCode de `@mariozechner/pi-ai`.
Eso puede forzar modelos a la API equivocada o poner los costos a cero. Doctor advierte
para que puedas eliminar la anulación y restaurar el enrutamiento por modelo + costos.
### 2c) Migración del navegador y preparación de Chrome MCP
Si su configuración del navegador aún apunta a la ruta eliminada de la extensión de Chrome, doctor
la normaliza al modelo actual de conexión de Chrome MCP local al host:
Si tu configuración del navegador aún apunta a la ruta eliminada de la extensión de Chrome, doctor
la normaliza al modelo actual de conexión host-local de Chrome MCP:
- `browser.profiles.*.driver: "extension"` pasa a ser `"existing-session"`
- se elimina `browser.relayBindHost`
Doctor también audita la ruta de Chrome MCP local al host cuando usa `defaultProfile:
Doctor también audita la ruta host-local de Chrome MCP cuando usas `defaultProfile:
"user"` o un perfil `existing-session` configurado:
- comprueba si Google Chrome está instalado en el mismo host para perfiles predeterminados
de conexión automática
- comprueba si Google Chrome está instalado en el mismo host para perfiles de
conexión automática predeterminados
- comprueba la versión detectada de Chrome y advierte cuando es inferior a Chrome 144
- recuerda habilitar la depuración remota en la página de inspección del navegador (por
ejemplo `chrome://inspect/#remote-debugging`, `brave://inspect/#remote-debugging`,
o `edge://inspect/#remote-debugging`)
Doctor no puede habilitar la configuración del lado de Chrome por usted. El Chrome MCP
local al host aún requiere:
Doctor no puede habilitar la configuración del lado de Chrome por ti. Chrome MCP host-local
todavía requiere:
- un navegador basado en Chromium 144+ en el host gateway/nodo
- un navegador basado en Chromium 144+ en el host del gateway/nodo
- el navegador ejecutándose localmente
- depuración remota habilitada en ese navegador
- aprobar la primera solicitud de consentimiento de conexión en el navegador
- aprobar el primer aviso de consentimiento de conexión en el navegador
La preparación aquí solo se refiere a los requisitos previos de conexión local. Existing-session mantiene
los límites de ruta actuales de Chrome MCP; las rutas avanzadas como `responsebody`, exportación PDF,
intercepción de descargas y acciones por lotes siguen requiriendo un navegador gestionado
o un perfil CDP sin procesar.
La preparación aquí se refiere solo a los requisitos previos de conexión local. Existing-session mantiene
los límites actuales de rutas de Chrome MCP; rutas avanzadas como `responsebody`, exportación
a PDF, interceptación de descargas y acciones por lotes siguen requiriendo un
navegador gestionado o un perfil CDP sin procesar.
Esta comprobación **no** se aplica a Docker, sandbox, remote-browser ni a otros
Esta comprobación **no** se aplica a Docker, sandbox, remote-browser ni otros
flujos sin interfaz. Esos siguen usando CDP sin procesar.
### 2d) Requisitos previos de TLS para OAuth
Cuando se configura un perfil OAuth de OpenAI Codex, doctor sondea el endpoint de autorización de OpenAI
para verificar que la pila TLS local de Node/OpenSSL pueda validar la cadena de certificados. Si el sondeo falla con un error de certificado (por
Cuando se configura un perfil de OAuth de OpenAI Codex, doctor sondea el endpoint de autorización de OpenAI
para verificar que la pila TLS local de Node/OpenSSL pueda validar la cadena de certificados.
Si el sondeo falla con un error de certificado (por
ejemplo `UNABLE_TO_GET_ISSUER_CERT_LOCALLY`, certificado vencido o certificado autofirmado),
doctor muestra orientación de corrección específica para cada plataforma. En macOS con Node de Homebrew, la
doctor imprime orientación de corrección específica de la plataforma. En macOS con un Node de Homebrew, la
corrección suele ser `brew postinstall ca-certificates`. Con `--deep`, el sondeo se ejecuta
incluso si el gateway está en buen estado.
### 2c) Sobrescrituras del proveedor OAuth de Codex
### 2c) Anulaciones del proveedor OAuth de Codex
Si anteriormente agregó configuraciones heredadas de transporte OpenAI en
`models.providers.openai-codex`, pueden enmascarar la ruta integrada del
proveedor OAuth de Codex que las versiones más recientes usan automáticamente. Doctor advierte cuando ve
esas configuraciones antiguas de transporte junto con OAuth de Codex para que pueda eliminar o reescribir
la sobrescritura de transporte obsoleta y recuperar el comportamiento integrado de enrutamiento/respaldo.
Los proxies personalizados y las sobrescrituras solo de encabezados siguen siendo compatibles y no
activan esta advertencia.
Si anteriormente agregaste configuraciones heredadas de transporte de OpenAI en
`models.providers.openai-codex`, estas pueden ocultar la ruta integrada del
proveedor OAuth de Codex que las versiones más recientes usan automáticamente. Doctor
advierte cuando ve esas configuraciones antiguas de transporte junto con OAuth de Codex
para que puedas eliminar o reescribir la anulación obsoleta de transporte y recuperar
el comportamiento integrado de enrutamiento/respaldo. Los proxies personalizados y las anulaciones
solo de encabezados siguen siendo compatibles y no activan esta advertencia.
### 3) Migraciones de estado heredado (diseño en disco)
### 3) Migraciones heredadas de estado (disposición en disco)
Doctor puede migrar diseños antiguos en disco a la estructura actual:
Doctor puede migrar disposiciones antiguas en disco a la estructura actual:
- Almacén de sesiones + transcripciones:
- de `~/.openclaw/sessions/` a `~/.openclaw/agents/<agentId>/sessions/`
@ -238,34 +274,34 @@ Doctor puede migrar diseños antiguos en disco a la estructura actual:
- de `~/.openclaw/agent/` a `~/.openclaw/agents/<agentId>/agent/`
- Estado de autenticación de WhatsApp (Baileys):
- desde `~/.openclaw/credentials/*.json` heredado (excepto `oauth.json`)
- hacia `~/.openclaw/credentials/whatsapp/<accountId>/...` (id de cuenta predeterminada: `default`)
- a `~/.openclaw/credentials/whatsapp/<accountId>/...` (ID de cuenta predeterminado: `default`)
Estas migraciones son de mejor esfuerzo e idempotentes; doctor emitirá advertencias cuando
Estas migraciones son por mejor esfuerzo e idempotentes; doctor emitirá advertencias cuando
deje carpetas heredadas como copias de seguridad. El Gateway/CLI también migra automáticamente
las sesiones heredadas + el directorio del agente al iniciarse, de modo que el historial/autenticación/modelos
terminen en la ruta por agente sin ejecutar doctor manualmente. La autenticación de WhatsApp se migra intencionalmente solo
mediante `openclaw doctor`. La normalización del proveedor/mapa de proveedores de Talk ahora
compara por igualdad estructural, por lo que las diferencias solo en el orden de las claves ya no activan
cambios repetidos de `doctor --fix` sin efecto.
las sesiones heredadas + el directorio del agente al iniciarse, para que el historial/autenticación/modelos
terminen en la ruta por agente sin una ejecución manual de doctor. La autenticación de WhatsApp se migra
intencionalmente solo mediante `openclaw doctor`. La normalización de proveedor/mapa de proveedores de Talk ahora
compara por igualdad estructural, por lo que las diferencias solo en el orden de claves ya no provocan
cambios repetidos sin efecto de `doctor --fix`.
### 3a) Migraciones heredadas del manifiesto de plugins
### 3a) Migraciones heredadas de manifiestos de plugins
Doctor analiza todos los manifiestos de plugins instalados para detectar claves obsoletas de capacidades
de nivel superior (`speechProviders`, `realtimeTranscriptionProviders`,
Doctor analiza todos los manifiestos de plugins instalados en busca de claves
obsoletas de capacidades de nivel superior (`speechProviders`, `realtimeTranscriptionProviders`,
`realtimeVoiceProviders`, `mediaUnderstandingProviders`,
`imageGenerationProviders`, `videoGenerationProviders`, `webFetchProviders`,
`webSearchProviders`). Cuando las encuentra, ofrece moverlas al objeto `contracts`
y reescribir el archivo de manifiesto in situ. Esta migración es idempotente;
y reescribir el archivo del manifiesto in situ. Esta migración es idempotente;
si la clave `contracts` ya tiene los mismos valores, la clave heredada se elimina
sin duplicar los datos.
### 3b) Migraciones heredadas del almacén cron
Doctor también comprueba el almacén de trabajos cron (`~/.openclaw/cron/jobs.json` de forma predeterminada,
o `cron.store` cuando se sobrescribe) para detectar formas antiguas de trabajos que el planificador aún
o `cron.store` si se ha sobrescrito) en busca de formas antiguas de trabajos que el planificador aún
acepta por compatibilidad.
Las limpiezas cron actuales incluyen:
Las limpiezas actuales de cron incluyen:
- `jobId``id`
- `schedule.cron``schedule.expr`
@ -275,130 +311,133 @@ Las limpiezas cron actuales incluyen:
- trabajos heredados simples de respaldo webhook con `notify: true``delivery.mode="webhook"` explícito con `delivery.to=cron.webhook`
Doctor solo migra automáticamente trabajos `notify: true` cuando puede hacerlo sin
cambiar el comportamiento. Si un trabajo combina el respaldo heredado de notify con un modo de entrega
existente no webhook, doctor advierte y deja ese trabajo para revisión manual.
cambiar el comportamiento. Si un trabajo combina un respaldo notify heredado con un modo de
entrega existente no webhook, doctor advierte y deja ese trabajo para revisión manual.
### 3c) Limpieza de bloqueos de sesión
Doctor analiza cada directorio de sesión de agente para detectar archivos de bloqueo de escritura obsoletos:
archivos que quedaron atrás cuando una sesión salió de forma anómala. Para cada archivo de bloqueo encontrado informa:
Doctor analiza cada directorio de sesiones de agente en busca de archivos obsoletos de bloqueo de escritura:
archivos que quedan cuando una sesión salió de forma anómala. Para cada archivo de bloqueo encontrado informa:
la ruta, el PID, si el PID sigue activo, la antigüedad del bloqueo y si se
considera obsoleto (PID muerto o más de 30 minutos). En modo `--fix` / `--repair`
elimina automáticamente los archivos de bloqueo obsoletos; en caso contrario, muestra una nota y
le indica volver a ejecutar con `--fix`.
considera obsoleto (PID muerto o con más de 30 minutos). En modo `--fix` / `--repair`
elimina automáticamente los archivos de bloqueo obsoletos; de lo contrario imprime una nota e
indica que lo vuelvas a ejecutar con `--fix`.
### 4) Comprobaciones de integridad del estado (persistencia de sesión, enrutamiento y seguridad)
El directorio de estado es el tronco encefálico operativo. Si desaparece, pierde
sesiones, credenciales, registros y configuración (a menos que tenga copias de seguridad en otro lugar).
El directorio de estado es el tronco operativo principal. Si desaparece, pierdes
sesiones, credenciales, registros y configuración (a menos que tengas copias de seguridad en otro lugar).
Doctor comprueba:
- **Falta el directorio de estado**: advierte sobre una pérdida catastrófica del estado, solicita volver a crear
el directorio y recuerda que no puede recuperar los datos faltantes.
- **Permisos del directorio de estado**: verifica que se pueda escribir; ofrece reparar permisos
(y emite una sugerencia de `chown` cuando detecta discrepancia de propietario/grupo).
- **Directorio de estado sincronizado en la nube de macOS**: advierte cuando el estado se resuelve bajo iCloud Drive
- **Falta el directorio de estado**: advierte sobre pérdida catastrófica de estado, ofrece recrear
el directorio y recuerda que no puede recuperar datos faltantes.
- **Permisos del directorio de estado**: verifica que sea escribible; ofrece reparar permisos
(y emite una sugerencia de `chown` cuando detecta desajuste de propietario/grupo).
- **Directorio de estado sincronizado en la nube en macOS**: advierte cuando el estado se resuelve bajo iCloud Drive
(`~/Library/Mobile Documents/com~apple~CloudDocs/...`) o
`~/Library/CloudStorage/...` porque las rutas respaldadas por sincronización pueden causar E/S más lentas
y condiciones de carrera de bloqueo/sincronización.
- **Directorio de estado en SD o eMMC de Linux**: advierte cuando el estado se resuelve a una fuente de montaje `mmcblk*`,
porque la E/S aleatoria respaldada por SD o eMMC puede ser más lenta y desgastarse
más rápido con las escrituras de sesión y credenciales.
- **Directorio de estado en SD o eMMC en Linux**: advierte cuando el estado se resuelve a un origen de montaje `mmcblk*`,
porque la E/S aleatoria respaldada por SD o eMMC puede ser más lenta y desgastarse más rápido con escrituras de sesiones y credenciales.
- **Faltan directorios de sesión**: `sessions/` y el directorio del almacén de sesiones son
necesarios para persistir el historial y evitar fallos `ENOENT`.
- **Desajuste de transcripción**: advierte cuando las entradas recientes de sesión tienen
archivos de transcripción faltantes.
- **Sesión principal con “JSONL de 1 línea”**: marca cuando la transcripción principal solo tiene una
necesarios para conservar el historial y evitar fallos `ENOENT`.
- **Desajuste de transcripciones**: advierte cuando entradas recientes de sesión tienen archivos
de transcripción faltantes.
- **Sesión principal “JSONL de 1 línea”**: marca cuando la transcripción principal tiene solo una
línea (el historial no se está acumulando).
- **Varios directorios de estado**: advierte cuando existen varias carpetas `~/.openclaw` entre
directorios de inicio o cuando `OPENCLAW_STATE_DIR` apunta a otro lugar (el historial puede
dividirse entre instalaciones).
directorios personales o cuando `OPENCLAW_STATE_DIR` apunta a otro sitio (el historial puede dividirse entre instalaciones).
- **Recordatorio de modo remoto**: si `gateway.mode=remote`, doctor recuerda ejecutarlo en
el host remoto (el estado vive allí).
- **Permisos del archivo de configuración**: advierte si `~/.openclaw/openclaw.json` es
legible por grupo/mundo y ofrece restringirlo a `600`.
### 5) Estado de autenticación de modelos (vencimiento de OAuth)
### 5) Estado de autenticación del modelo (vencimiento de OAuth)
Doctor inspecciona los perfiles OAuth en el almacén de autenticación, advierte cuando los tokens están
próximos a vencer o vencidos, y puede renovarlos cuando es seguro. Si el perfil OAuth/token
de Anthropic está obsoleto, sugiere una clave de API de Anthropic o la
ruta de token de configuración de Anthropic.
Las solicitudes de renovación solo aparecen cuando se ejecuta de forma interactiva (TTY); `--non-interactive`
omite los intentos de renovación.
Doctor inspecciona perfiles OAuth en el almacén de autenticación, advierte cuando los tokens
están por vencer o vencidos, y puede actualizarlos cuando sea seguro. Si el perfil
de OAuth/token de Anthropic está obsoleto, sugiere una clave de API de Anthropic o la
ruta de setup-token de Anthropic.
Los avisos de actualización solo aparecen cuando se ejecuta de forma interactiva (TTY); `--non-interactive`
omite los intentos de actualización.
Doctor también informa perfiles de autenticación que están temporalmente inutilizables debido a:
Cuando una actualización de OAuth falla de forma permanente (por ejemplo `refresh_token_reused`,
`invalid_grant` o un proveedor te indica que vuelvas a iniciar sesión), doctor informa
que se requiere reautenticación e imprime el comando exacto `openclaw models auth login --provider ...`
que debes ejecutar.
- enfriamientos breves (límites de velocidad/tiempos de espera/fallos de autenticación)
- deshabilitaciones más largas (fallos de facturación/crédito)
Doctor también informa de perfiles de autenticación temporalmente inutilizables debido a:
### 6) Validación del modelo de hooks
- enfriamientos cortos (límites de tasa/tiempos de espera/fallos de autenticación)
- desactivaciones más largas (fallos de facturación/crédito)
Si `hooks.gmail.model` está configurado, doctor valida la referencia del modelo con el
### 6) Validación del modelo de Hooks
Si `hooks.gmail.model` está configurado, doctor valida la referencia del modelo frente al
catálogo y la lista de permitidos y advierte cuando no se resolverá o no está permitido.
### 7) Reparación de imagen de sandbox
Cuando el aislamiento está habilitado, doctor comprueba las imágenes de Docker y ofrece compilar o
Cuando el sandbox está habilitado, doctor comprueba las imágenes de Docker y ofrece compilar o
cambiar a nombres heredados si falta la imagen actual.
### 7b) Dependencias de tiempo de ejecución de plugins integrados
### 7b) Dependencias de runtime de plugins incluidos
Doctor verifica que las dependencias de tiempo de ejecución de plugins integrados (por ejemplo, los
paquetes de tiempo de ejecución del plugin de Discord) estén presentes en la raíz de instalación de OpenClaw.
Si falta alguna, doctor informa los paquetes y los instala en
modo `openclaw doctor --fix` / `openclaw doctor --repair`.
Doctor verifica que las dependencias de runtime de los plugins incluidos (por ejemplo los
paquetes de runtime del plugin de Discord) estén presentes en la raíz de instalación de OpenClaw.
Si falta alguna, doctor informa de los paquetes y los instala en modo
`openclaw doctor --fix` / `openclaw doctor --repair`.
### 8) Migraciones de servicios del gateway y sugerencias de limpieza
Doctor detecta servicios heredados del gateway (launchd/systemd/schtasks) y
ofrece eliminarlos e instalar el servicio de OpenClaw usando el puerto actual del gateway.
También puede buscar servicios adicionales similares al gateway y mostrar sugerencias de limpieza.
Los servicios de gateway de OpenClaw con nombre de perfil se consideran de primera clase y no
se marcan como “adicionales”.
También puede buscar servicios adicionales similares al gateway e imprimir sugerencias de limpieza.
Los servicios de gateway de OpenClaw con nombre de perfil se consideran de primera clase y no se
marcan como "adicionales".
### 8b) Migración de Matrix al inicio
### 8b) Migración de Matrix al iniciar
Cuando una cuenta del canal Matrix tiene una migración de estado heredado pendiente o procesable,
Cuando una cuenta del canal Matrix tiene una migración heredada de estado pendiente o aplicable,
doctor (en modo `--fix` / `--repair`) crea una instantánea previa a la migración y luego
ejecuta los pasos de migración de mejor esfuerzo: migración del estado heredado de Matrix y preparación
del estado cifrado heredado. Ambos pasos no son fatales; los errores se registran y el
inicio continúa. En modo de solo lectura (`openclaw doctor` sin `--fix`) esta comprobación
ejecuta los pasos de migración por mejor esfuerzo: migración heredada del estado de Matrix
y preparación heredada del estado cifrado. Ambos pasos no son fatales; los errores se registran y
el inicio continúa. En modo de solo lectura (`openclaw doctor` sin `--fix`) esta comprobación
se omite por completo.
### 9) Advertencias de seguridad
Doctor emite advertencias cuando un proveedor está abierto a DM sin una lista de permitidos, o
Doctor emite advertencias cuando un proveedor está abierto a MD sin lista de permitidos, o
cuando una política está configurada de forma peligrosa.
### 10) Linger de systemd (Linux)
### 10) systemd linger (Linux)
Si se ejecuta como servicio de usuario de systemd, doctor asegura que linger esté habilitado para que el
gateway siga activo después de cerrar sesión.
Si se ejecuta como servicio de usuario systemd, doctor se asegura de que lingering esté habilitado para que el
gateway siga activo después del cierre de sesión.
### 11) Estado del espacio de trabajo (Skills, plugins y directorios heredados)
Doctor muestra un resumen del estado del espacio de trabajo para el agente predeterminado:
Doctor imprime un resumen del estado del espacio de trabajo para el agente predeterminado:
- **Estado de Skills**: cuenta las Skills aptas, con requisitos faltantes y bloqueadas por lista de permitidos.
- **Directorios heredados del espacio de trabajo**: advierte cuando `~/openclaw` u otros directorios heredados del espacio de trabajo
existen junto al espacio de trabajo actual.
- **Estado de plugins**: cuenta plugins cargados/deshabilitados/con error; enumera los ID de plugins con
errores; informa las capacidades de plugins integrados.
- **Estado de Skills**: cuenta Skills aptas, con requisitos faltantes y bloqueadas por la lista de permitidos.
- **Directorios heredados del espacio de trabajo**: advierte cuando existen `~/openclaw` u otros directorios heredados del espacio de trabajo
junto al espacio de trabajo actual.
- **Estado de plugins**: cuenta plugins cargados/deshabilitados/con errores; enumera los ID de plugin para cualquier
error; informa de las capacidades de los plugins del bundle.
- **Advertencias de compatibilidad de plugins**: marca plugins que tienen problemas de compatibilidad con
el tiempo de ejecución actual.
- **Diagnóstico de plugins**: muestra cualquier advertencia o error en tiempo de carga emitido por el
el runtime actual.
- **Diagnósticos de plugins**: muestra cualquier advertencia o error de carga emitido por el
registro de plugins.
### 11b) Tamaño del archivo de arranque
### 11b) Tamaño del archivo bootstrap
Doctor comprueba si los archivos de arranque del espacio de trabajo (por ejemplo `AGENTS.md`,
`CLAUDE.md` u otros archivos de contexto inyectados) están cerca o por encima del presupuesto de
caracteres configurado. Informa por archivo los recuentos de caracteres sin procesar frente a inyectados, el
porcentaje de truncamiento, la causa del truncamiento (`max/file` o `max/total`) y el total de caracteres inyectados
como fracción del presupuesto total. Cuando los archivos están truncados o cerca
del límite, doctor muestra consejos para ajustar `agents.defaults.bootstrapMaxChars`
Doctor comprueba si los archivos bootstrap del espacio de trabajo (por ejemplo `AGENTS.md`,
`CLAUDE.md` u otros archivos de contexto inyectados) están cerca o por encima del presupuesto
configurado de caracteres. Informa por archivo del recuento de caracteres sin procesar frente al inyectado, el porcentaje
de truncamiento, la causa del truncamiento (`max/file` o `max/total`) y el total de caracteres
inyectados como fracción del presupuesto total. Cuando los archivos están truncados o cerca
del límite, doctor imprime sugerencias para ajustar `agents.defaults.bootstrapMaxChars`
y `agents.defaults.bootstrapTotalMaxChars`.
### 11c) Autocompletado del shell
@ -408,103 +447,102 @@ Doctor comprueba si el autocompletado con tabulador está instalado para el shel
- Si el perfil del shell usa un patrón lento de autocompletado dinámico
(`source <(openclaw completion ...)`), doctor lo actualiza a la variante más rápida
de archivo en caché.
con archivo en caché.
- Si el autocompletado está configurado en el perfil pero falta el archivo de caché,
doctor regenera automáticamente la caché.
- Si no hay ningún autocompletado configurado, doctor solicita instalarlo
doctor regenera la caché automáticamente.
- Si no hay ningún autocompletado configurado, doctor ofrece instalarlo
(solo en modo interactivo; se omite con `--non-interactive`).
Ejecute `openclaw completion --write-state` para regenerar manualmente la caché.
Ejecuta `openclaw completion --write-state` para regenerar la caché manualmente.
### 12) Comprobaciones de autenticación del gateway (token local)
Doctor comprueba la preparación de la autenticación por token del gateway local.
Doctor comprueba la preparación de autenticación por token del gateway local.
- Si el modo de token necesita un token y no existe una fuente de token, doctor ofrece generar uno.
- Si `gateway.auth.token` está gestionado por SecretRef pero no está disponible, doctor advierte y no lo sobrescribe con texto sin formato.
- `openclaw doctor --generate-gateway-token` fuerza la generación solo cuando no hay ningún token SecretRef configurado.
- Si el modo token necesita un token y no existe una fuente de token, doctor ofrece generar uno.
- Si `gateway.auth.token` está gestionado por SecretRef pero no disponible, doctor advierte y no lo sobrescribe con texto sin formato.
- `openclaw doctor --generate-gateway-token` fuerza la generación solo cuando no hay un token SecretRef configurado.
### 12b) Reparaciones de solo lectura con reconocimiento de SecretRef
### 12b) Reparaciones de solo lectura compatibles con SecretRef
Algunos flujos de reparación necesitan inspeccionar las credenciales configuradas sin debilitar el comportamiento de fallo rápido del tiempo de ejecución.
Algunos flujos de reparación necesitan inspeccionar credenciales configuradas sin debilitar el comportamiento fail-fast del runtime.
- `openclaw doctor --fix` ahora usa el mismo modelo resumido de SecretRef de solo lectura que la familia de comandos de estado para reparaciones de configuración específicas.
- Ejemplo: la reparación de `@username` en Telegram para `allowFrom` / `groupAllowFrom` intenta usar credenciales del bot configuradas cuando están disponibles.
- Si el token del bot de Telegram está configurado mediante SecretRef pero no está disponible en la ruta actual del comando, doctor informa que la credencial está configurada-pero-no-disponible y omite la resolución automática en lugar de fallar o informar erróneamente que falta el token.
- `openclaw doctor --fix` ahora usa el mismo modelo resumido de SecretRef de solo lectura que los comandos de la familia status para reparaciones específicas de configuración.
- Ejemplo: la reparación de Telegram `allowFrom` / `groupAllowFrom` con `@username` intenta usar credenciales configuradas del bot cuando están disponibles.
- Si el token del bot de Telegram está configurado mediante SecretRef pero no está disponible en la ruta actual del comando, doctor informa que la credencial está configurada pero no disponible y omite la resolución automática en lugar de fallar o informar incorrectamente que falta el token.
### 13) Comprobación de estado del gateway + reinicio
Doctor ejecuta una comprobación de estado y ofrece reiniciar el gateway cuando parece
no estar en buen estado.
### 13b) Preparación de búsqueda en memoria
### 13b) Preparación de la búsqueda en memoria
Doctor comprueba si el proveedor de embeddings configurado para búsqueda en memoria está preparado
Doctor comprueba si el proveedor de embeddings configurado para búsqueda en memoria está listo
para el agente predeterminado. El comportamiento depende del backend y del proveedor configurados:
- **Backend QMD**: sondea si el binario `qmd` está disponible y puede iniciarse.
Si no, muestra orientación de corrección, incluido el paquete npm y una opción manual de ruta binaria.
- **Proveedor local explícito**: comprueba si existe un archivo de modelo local o una URL
reconocida de modelo remoto/descargable. Si falta, sugiere cambiar a un proveedor remoto.
Si no, imprime orientación para corregirlo, incluido el paquete npm y una opción manual de ruta al binario.
- **Proveedor local explícito**: comprueba si hay un archivo de modelo local o una URL de modelo remota/descargable reconocida. Si falta, sugiere cambiar a un proveedor remoto.
- **Proveedor remoto explícito** (`openai`, `voyage`, etc.): verifica que haya una clave de API
presente en el entorno o en el almacén de autenticación. Muestra sugerencias de corrección accionables si falta.
- **Proveedor automático**: comprueba primero la disponibilidad de modelos locales y luego prueba cada proveedor remoto
en el orden de selección automática.
presente en el entorno o en el almacén de autenticación. Imprime sugerencias de corrección accionables si falta.
- **Proveedor automático**: comprueba primero la disponibilidad del modelo local y luego prueba cada
proveedor remoto en orden de selección automática.
Cuando hay disponible un resultado de sondeo del gateway (el gateway estaba en buen estado en el momento de la
comprobación), doctor cruza ese resultado con la configuración visible desde la CLI y señala
Cuando hay disponible un resultado del sondeo del gateway (el gateway estaba en buen estado en el momento de la
comprobación), doctor lo cruza con la configuración visible desde la CLI y señala
cualquier discrepancia.
Use `openclaw memory status --deep` para verificar la preparación de embeddings en tiempo de ejecución.
Usa `openclaw memory status --deep` para verificar en runtime la preparación de embeddings.
### 14) Advertencias de estado de canales
### 14) Advertencias de estado de los canales
Si el gateway está en buen estado, doctor ejecuta un sondeo de estado de los canales e informa
Si el gateway está en buen estado, doctor ejecuta un sondeo de estado de canales e informa
advertencias con correcciones sugeridas.
### 15) Auditoría + reparación de configuración del supervisor
Doctor comprueba si la configuración del supervisor instalado (launchd/systemd/schtasks) tiene
valores predeterminados faltantes u obsoletos (por ejemplo, dependencias de systemd network-online y
Doctor comprueba la configuración instalada del supervisor (launchd/systemd/schtasks) en busca de
valores predeterminados ausentes o desactualizados (p. ej., dependencias de systemd network-online y
retraso de reinicio). Cuando encuentra una discrepancia, recomienda una actualización y puede
reescribir el archivo de servicio/tarea a los valores predeterminados actuales.
Notas:
- `openclaw doctor` solicita confirmación antes de reescribir la configuración del supervisor.
- `openclaw doctor --yes` acepta las solicitudes de reparación predeterminadas.
- `openclaw doctor --repair` aplica las correcciones recomendadas sin solicitudes.
- `openclaw doctor` pregunta antes de reescribir la configuración del supervisor.
- `openclaw doctor --yes` acepta los avisos de reparación predeterminados.
- `openclaw doctor --repair` aplica las correcciones recomendadas sin preguntas.
- `openclaw doctor --repair --force` sobrescribe configuraciones personalizadas del supervisor.
- Si la autenticación por token requiere un token y `gateway.auth.token` está gestionado por SecretRef, la instalación/reparación del servicio de doctor valida el SecretRef, pero no persiste valores resueltos de token en texto sin formato en los metadatos de entorno del servicio supervisor.
- Si la autenticación por token requiere un token y `gateway.auth.token` está gestionado por SecretRef, la instalación/reparación del servicio valida el SecretRef pero no conserva valores de token resueltos en texto sin formato en los metadatos del entorno del servicio del supervisor.
- Si la autenticación por token requiere un token y el token SecretRef configurado no está resuelto, doctor bloquea la ruta de instalación/reparación con orientación accionable.
- Si tanto `gateway.auth.token` como `gateway.auth.password` están configurados y `gateway.auth.mode` no está definido, doctor bloquea la instalación/reparación hasta que el modo se establezca explícitamente.
- Para unidades user-systemd de Linux, las comprobaciones de deriva de token de doctor ahora incluyen tanto fuentes `Environment=` como `EnvironmentFile=` al comparar metadatos de autenticación del servicio.
- Siempre puede forzar una reescritura completa mediante `openclaw gateway install --force`.
- Si tanto `gateway.auth.token` como `gateway.auth.password` están configurados y `gateway.auth.mode` no está establecido, doctor bloquea la instalación/reparación hasta que el modo se configure explícitamente.
- Para unidades user-systemd en Linux, las comprobaciones de divergencia del token de doctor ahora incluyen tanto las fuentes `Environment=` como `EnvironmentFile=` al comparar metadatos de autenticación del servicio.
- Siempre puedes forzar una reescritura completa mediante `openclaw gateway install --force`.
### 16) Diagnóstico del tiempo de ejecución del gateway + puerto
### 16) Diagnósticos del runtime del gateway + puerto
Doctor inspecciona el tiempo de ejecución del servicio (PID, último estado de salida) y advierte cuando el
Doctor inspecciona el runtime del servicio (PID, último estado de salida) y advierte cuando el
servicio está instalado pero en realidad no se está ejecutando. También comprueba colisiones
de puerto en el puerto del gateway (predeterminado `18789`) e informa causas probables (gateway ya
de puertos en el puerto del gateway (predeterminado `18789`) e informa causas probables (gateway ya
en ejecución, túnel SSH).
### 17) Buenas prácticas del tiempo de ejecución del gateway
### 17) Buenas prácticas del runtime del gateway
Doctor advierte cuando el servicio del gateway se ejecuta con Bun o con una ruta de Node gestionada por versiones
Doctor advierte cuando el servicio del gateway se ejecuta con Bun o una ruta de Node gestionada por versiones
(`nvm`, `fnm`, `volta`, `asdf`, etc.). Los canales de WhatsApp + Telegram requieren Node,
y las rutas de gestores de versiones pueden fallar después de actualizaciones porque el servicio no
carga la inicialización de su shell. Doctor ofrece migrar a una instalación de Node del sistema cuando
carga la inicialización de tu shell. Doctor ofrece migrar a una instalación de Node del sistema cuando
está disponible (Homebrew/apt/choco).
### 18) Escritura de configuración + metadatos del asistente
Doctor conserva cualquier cambio de configuración y marca metadatos del asistente para registrar la
ejecución de doctor.
Doctor guarda cualquier cambio de configuración y registra metadatos del asistente para anotar la ejecución
de doctor.
### 19) Consejos del espacio de trabajo (copia de seguridad + sistema de memoria)
### 19) Sugerencias del espacio de trabajo (copia de seguridad + sistema de memoria)
Doctor sugiere un sistema de memoria del espacio de trabajo cuando falta y muestra un consejo de copia de seguridad
si el espacio de trabajo todavía no está bajo git.
Doctor sugiere un sistema de memoria para el espacio de trabajo cuando falta y muestra una sugerencia de copia de seguridad
si el espacio de trabajo aún no está bajo git.
Consulte [/concepts/agent-workspace](/es/concepts/agent-workspace) para ver una guía completa sobre
la estructura del espacio de trabajo y la copia de seguridad con git (se recomienda GitHub o GitLab privados).
Consulta [/concepts/agent-workspace](/es/concepts/agent-workspace) para obtener una guía completa sobre la
estructura del espacio de trabajo y la copia de seguridad con git (se recomienda GitHub o GitLab privados).

File diff suppressed because it is too large Load Diff

View File

@ -1,584 +0,0 @@
---
date: 2026-04-05T00:00:00Z
status: active
title: 'refactor: Convertir plugin-sdk en un paquete real del workspace de forma incremental'
type: refactor
x-i18n:
generated_at: "2026-04-07T05:04:02Z"
model: gpt-5.4
provider: openai
source_hash: ea1ca41846363c506a0db6dbca746e840d7c71ca82bbfc5277af9e2ae7f6b070
source_path: plans/2026-04-05-002-refactor-real-plugin-sdk-workspace-plan.md
workflow: 15
---
# refactor: Convertir plugin-sdk en un paquete real del workspace de forma incremental
## Descripción general
Este plan introduce un paquete real del workspace para el SDK de plugins en
`packages/plugin-sdk` y lo usa para incorporar una pequeña primera ola de extensiones a
límites de paquetes aplicados por el compilador. El objetivo es hacer que las
importaciones relativas no permitidas fallen bajo `tsc` normal para un conjunto seleccionado de extensiones
de proveedor empaquetadas, sin forzar una migración en todo el repositorio ni una enorme
superficie de conflictos de fusión.
El movimiento incremental clave es ejecutar dos modos en paralelo durante un tiempo:
| Modo legado | Forma de importación | Quién lo usa | Aplicación |
| ----------- | -------------------------- | ------------------------------------ | --------------------------------------------- |
| Modo legado | `openclaw/plugin-sdk/*` | todas las extensiones existentes no incorporadas | se mantiene el comportamiento permisivo actual |
| Modo opt-in | `@openclaw/plugin-sdk/*` | solo las extensiones de la primera ola | `rootDir` local al paquete + referencias de proyecto |
## Planteamiento del problema
El repositorio actual exporta una gran superficie pública del SDK de plugins, pero no es un
paquete real del workspace. En su lugar:
- el `tsconfig.json` raíz asigna `openclaw/plugin-sdk/*` directamente a
`src/plugin-sdk/*.ts`
- las extensiones que no se incorporaron al experimento anterior siguen compartiendo ese
comportamiento global de alias de origen
- agregar `rootDir` solo funciona cuando las importaciones permitidas del SDK dejan de resolverse hacia código fuente
sin procesar del repositorio
Eso significa que el repositorio puede describir la política de límites deseada, pero TypeScript
no la aplica limpiamente para la mayoría de las extensiones.
Quieres una ruta incremental que:
- convierta `plugin-sdk` en algo real
- mueva el SDK hacia un paquete del workspace llamado `@openclaw/plugin-sdk`
- cambie solo alrededor de 10 extensiones en el primer PR
- deje el resto del árbol de extensiones en el esquema antiguo hasta una limpieza posterior
- evite el flujo de trabajo `tsconfig.plugin-sdk.dts.json` + declaraciones generadas en postinstall
como mecanismo principal para el despliegue de la primera ola
## Trazabilidad de requisitos
- R1. Crear un paquete real del workspace para el SDK bajo `packages/`.
- R2. Nombrar el nuevo paquete `@openclaw/plugin-sdk`.
- R3. Dar al nuevo paquete SDK su propio `package.json` y `tsconfig.json`.
- R4. Mantener las importaciones heredadas `openclaw/plugin-sdk/*` funcionando para las extensiones
no incorporadas durante la ventana de migración.
- R5. Incorporar solo una pequeña primera ola de extensiones en el primer PR.
- R6. Las extensiones de la primera ola deben fallar de forma cerrada para las importaciones relativas que salgan
de la raíz de su paquete.
- R7. Las extensiones de la primera ola deben consumir el SDK mediante una
dependencia de paquete y una referencia de proyecto de TS, no mediante alias `paths` de la raíz.
- R8. El plan debe evitar un paso obligatorio de generación en postinstall para todo el repositorio
para la corrección en el editor.
- R9. El despliegue de la primera ola debe ser revisable e integrable como un PR moderado,
no como una refactorización de más de 300 archivos en todo el repositorio.
## Límites del alcance
- No migrar completamente todas las extensiones empaquetadas en el primer PR.
- No es necesario eliminar `src/plugin-sdk` en el primer PR.
- No es necesario reconfigurar inmediatamente cada ruta de compilación o prueba raíz para usar el nuevo paquete.
- No se intenta forzar errores visuales de VS Code para todas las extensiones no incorporadas.
- No hay limpieza amplia de lint para el resto del árbol de extensiones.
- No hay cambios grandes en el comportamiento en tiempo de ejecución más allá de la resolución de importaciones, la
propiedad del paquete y la aplicación de límites para las extensiones incorporadas.
## Contexto e investigación
### Código y patrones relevantes
- `pnpm-workspace.yaml` ya incluye `packages/*` y `extensions/*`, por lo que un
nuevo paquete del workspace bajo `packages/plugin-sdk` encaja en el diseño existente del
repositorio.
- Los paquetes existentes del workspace, como `packages/memory-host-sdk/package.json`
y `packages/plugin-package-contract/package.json`, ya usan mapas `exports` locales al paquete
enraizados en `src/*.ts`.
- El `package.json` raíz actualmente publica la superficie del SDK mediante `./plugin-sdk`
y `./plugin-sdk/*` exports respaldados por `dist/plugin-sdk/*.js` y
`dist/plugin-sdk/*.d.ts`.
- `src/plugin-sdk/entrypoints.ts` y `scripts/lib/plugin-sdk-entrypoints.json`
ya actúan como el inventario canónico de entrypoints para la superficie del SDK.
- El `tsconfig.json` raíz actualmente asigna:
- `openclaw/plugin-sdk` -> `src/plugin-sdk/index.ts`
- `openclaw/plugin-sdk/*` -> `src/plugin-sdk/*.ts`
- El experimento anterior de límites mostró que `rootDir` local al paquete funciona para
importaciones relativas no permitidas solo después de que las importaciones permitidas del SDK dejan de resolverse hacia código fuente
sin procesar fuera del paquete de extensión.
### Conjunto de extensiones de la primera ola
Este plan asume que la primera ola es el conjunto con muchos proveedores que tiene menos probabilidades
de arrastrar casos límite complejos del tiempo de ejecución de canales:
- `extensions/anthropic`
- `extensions/exa`
- `extensions/firecrawl`
- `extensions/groq`
- `extensions/mistral`
- `extensions/openai`
- `extensions/perplexity`
- `extensions/tavily`
- `extensions/together`
- `extensions/xai`
### Inventario de superficie del SDK de la primera ola
Las extensiones de la primera ola actualmente importan un subconjunto manejable de subrutas del SDK.
El paquete inicial `@openclaw/plugin-sdk` solo necesita cubrir estas:
- `agent-runtime`
- `cli-runtime`
- `config-runtime`
- `core`
- `image-generation`
- `media-runtime`
- `media-understanding`
- `plugin-entry`
- `plugin-runtime`
- `provider-auth`
- `provider-auth-api-key`
- `provider-auth-login`
- `provider-auth-runtime`
- `provider-catalog-shared`
- `provider-entry`
- `provider-http`
- `provider-model-shared`
- `provider-onboard`
- `provider-stream-family`
- `provider-stream-shared`
- `provider-tools`
- `provider-usage`
- `provider-web-fetch`
- `provider-web-search`
- `realtime-transcription`
- `realtime-voice`
- `runtime-env`
- `secret-input`
- `security-runtime`
- `speech`
- `testing`
### Aprendizajes institucionales
- No había entradas relevantes en `docs/solutions/` en este árbol de trabajo.
### Referencias externas
- No fue necesaria investigación externa para este plan. El repositorio ya contiene los
patrones relevantes de paquete del workspace y exportación del SDK.
## Decisiones técnicas clave
- Introducir `@openclaw/plugin-sdk` como un nuevo paquete del workspace mientras se mantiene activa la
superficie heredada raíz `openclaw/plugin-sdk/*` durante la migración.
Justificación: esto permite que un conjunto de extensiones de la primera ola pase a una resolución real de paquetes
sin forzar que todas las extensiones y todas las rutas de compilación raíz cambien
de una sola vez.
- Usar una configuración base dedicada de límites opt-in, como
`extensions/tsconfig.package-boundary.base.json`, en lugar de reemplazar la
base existente de extensiones para todos.
Justificación: el repositorio necesita admitir simultáneamente tanto el modo heredado como el opt-in para extensiones
durante la migración.
- Usar referencias de proyecto de TS desde las extensiones de la primera ola hacia
`packages/plugin-sdk/tsconfig.json` y establecer
`disableSourceOfProjectReferenceRedirect` para el modo opt-in de límites.
Justificación: esto da a `tsc` un grafo real de paquetes mientras desalienta al editor y
al compilador de recurrir al recorrido del código fuente sin procesar.
- Mantener `@openclaw/plugin-sdk` como privado en la primera ola.
Justificación: el objetivo inmediato es la aplicación interna de límites y la seguridad de migración,
no publicar un segundo contrato externo del SDK antes de que la superficie sea
estable.
- Mover solo las subrutas del SDK de la primera ola en el primer corte de implementación, y
mantener puentes de compatibilidad para el resto.
Justificación: mover físicamente los 315 archivos `src/plugin-sdk/*.ts` en un solo PR es
exactamente la superficie de conflicto de fusión que este plan intenta evitar.
- No depender de `scripts/postinstall-bundled-plugins.mjs` para construir
declaraciones del SDK para la primera ola.
Justificación: los flujos explícitos de compilación/referencia son más fáciles de razonar y mantienen
el comportamiento del repositorio más predecible.
## Preguntas abiertas
### Resueltas durante la planificación
- ¿Qué extensiones deben estar en la primera ola?
Usar las 10 extensiones de proveedor/búsqueda web enumeradas arriba porque están más
aisladas estructuralmente que los paquetes de canal más pesados.
- ¿Debe el primer PR reemplazar todo el árbol de extensiones?
No. El primer PR debe admitir dos modos en paralelo e incorporar solo la
primera ola.
- ¿Debe la primera ola requerir una compilación de declaraciones en postinstall?
No. El grafo de paquete/referencia debe ser explícito, y CI debe ejecutar
intencionalmente la verificación de tipos local al paquete correspondiente.
### Aplazadas para la implementación
- Si el paquete de la primera ola puede apuntar directamente a `src/*.ts` local al paquete
solo mediante referencias de proyecto, o si aún se requiere un pequeño paso de emisión de declaraciones
para el paquete `@openclaw/plugin-sdk`.
Esta es una cuestión de validación del grafo de TS propia de la implementación.
- Si el paquete raíz `openclaw` debe redirigir inmediatamente las subrutas del SDK de la primera ola a
las salidas de `packages/plugin-sdk` o seguir usando shims de compatibilidad generados bajo `src/plugin-sdk`.
Este es un detalle de compatibilidad y forma de compilación que depende de la
ruta mínima de implementación que mantenga CI en verde.
## Diseño técnico de alto nivel
> Esto ilustra el enfoque previsto y sirve como guía direccional para la revisión, no como especificación de implementación. El agente encargado de implementar debe tratarlo como contexto, no como código para reproducir.
```mermaid
flowchart TB
subgraph Legacy["Extensiones heredadas (sin cambios)"]
L1["extensions/*\nopenclaw/plugin-sdk/*"]
L2["root tsconfig paths"]
L1 --> L2
L2 --> L3["src/plugin-sdk/*"]
end
subgraph OptIn["Extensiones de la primera ola"]
O1["10 extensiones incorporadas"]
O2["extensions/tsconfig.package-boundary.base.json"]
O3["rootDir = '.'\nproject reference"]
O4["@openclaw/plugin-sdk"]
O1 --> O2
O2 --> O3
O3 --> O4
end
subgraph SDK["Nuevo paquete del workspace"]
P1["packages/plugin-sdk/package.json"]
P2["packages/plugin-sdk/tsconfig.json"]
P3["packages/plugin-sdk/src/<first-wave-subpaths>.ts"]
P1 --> P2
P2 --> P3
end
O4 --> SDK
```
## Unidades de implementación
- [ ] **Unidad 1: Introducir el paquete real del workspace `@openclaw/plugin-sdk`**
**Objetivo:** Crear un paquete real del workspace para el SDK que pueda ser propietario de la
superficie de subrutas de la primera ola sin forzar una migración en todo el repositorio.
**Requisitos:** R1, R2, R3, R8, R9
**Dependencias:** Ninguna
**Archivos:**
- Crear: `packages/plugin-sdk/package.json`
- Crear: `packages/plugin-sdk/tsconfig.json`
- Crear: `packages/plugin-sdk/src/index.ts`
- Crear: `packages/plugin-sdk/src/*.ts` para las subrutas del SDK de la primera ola
- Modificar: `pnpm-workspace.yaml` solo si se necesitan ajustes en los globs de paquetes
- Modificar: `package.json`
- Modificar: `src/plugin-sdk/entrypoints.ts`
- Modificar: `scripts/lib/plugin-sdk-entrypoints.json`
- Probar: `src/plugins/contracts/plugin-sdk-workspace-package.contract.test.ts`
**Enfoque:**
- Agregar un nuevo paquete del workspace llamado `@openclaw/plugin-sdk`.
- Comenzar solo con las subrutas del SDK de la primera ola, no con todo el árbol de 315 archivos.
- Si mover directamente un entrypoint de la primera ola creara un diff demasiado grande, el
primer PR puede introducir primero esa subruta en `packages/plugin-sdk/src` como un wrapper
delgado del paquete y luego cambiar la fuente de verdad al paquete en un PR de seguimiento
para ese grupo de subrutas.
- Reutilizar la maquinaria existente de inventario de entrypoints para que la superficie del paquete de la primera ola
se declare en un único lugar canónico.
- Mantener activas las exportaciones del paquete raíz para los usuarios heredados mientras el paquete del workspace
se convierte en el nuevo contrato opt-in.
**Patrones a seguir:**
- `packages/memory-host-sdk/package.json`
- `packages/plugin-package-contract/package.json`
- `src/plugin-sdk/entrypoints.ts`
**Escenarios de prueba:**
- Caso satisfactorio: el paquete del workspace exporta cada subruta de la primera ola enumerada
en el plan y no falta ninguna exportación requerida de la primera ola.
- Caso límite: los metadatos de exportación del paquete permanecen estables cuando la lista de entradas de la primera ola
se vuelve a generar o se compara con el inventario canónico.
- Integración: las exportaciones heredadas del SDK en el paquete raíz siguen presentes tras introducir
el nuevo paquete del workspace.
**Verificación:**
- El repositorio contiene un paquete válido del workspace `@openclaw/plugin-sdk` con un
mapa estable de exportaciones de la primera ola y sin regresión de exportaciones heredadas en el
`package.json` raíz.
- [ ] **Unidad 2: Agregar un modo opt-in de límites de TS para extensiones con aplicación por paquete**
**Objetivo:** Definir el modo de configuración de TS que usarán las extensiones incorporadas,
mientras se deja sin cambios el comportamiento existente de TS para extensiones del resto.
**Requisitos:** R4, R6, R7, R8, R9
**Dependencias:** Unidad 1
**Archivos:**
- Crear: `extensions/tsconfig.package-boundary.base.json`
- Crear: `tsconfig.boundary-optin.json`
- Modificar: `extensions/xai/tsconfig.json`
- Modificar: `extensions/openai/tsconfig.json`
- Modificar: `extensions/anthropic/tsconfig.json`
- Modificar: `extensions/mistral/tsconfig.json`
- Modificar: `extensions/groq/tsconfig.json`
- Modificar: `extensions/together/tsconfig.json`
- Modificar: `extensions/perplexity/tsconfig.json`
- Modificar: `extensions/tavily/tsconfig.json`
- Modificar: `extensions/exa/tsconfig.json`
- Modificar: `extensions/firecrawl/tsconfig.json`
- Probar: `src/plugins/contracts/extension-package-project-boundaries.test.ts`
- Probar: `test/extension-package-tsc-boundary.test.ts`
**Enfoque:**
- Dejar `extensions/tsconfig.base.json` en su lugar para las extensiones heredadas.
- Agregar una nueva configuración base opt-in que:
- establezca `rootDir: "."`
- haga referencia a `packages/plugin-sdk`
- habilite `composite`
- deshabilite la redirección de fuente de referencia de proyecto cuando sea necesario
- Agregar una configuración de solución dedicada para el grafo de typecheck de la primera ola en lugar de
reformar el proyecto TS raíz del repositorio en el mismo PR.
**Nota de ejecución:** comenzar con una comprobación canaria fallida de typecheck local al paquete para una
extensión incorporada antes de aplicar el patrón a las 10.
**Patrones a seguir:**
- Patrón existente de `tsconfig.json` local a extensiones del trabajo anterior
de límites
- Patrón de paquete del workspace de `packages/memory-host-sdk`
**Escenarios de prueba:**
- Caso satisfactorio: cada extensión incorporada supera correctamente el typecheck mediante la
configuración TS de límites de paquete.
- Ruta de error: una importación relativa canaria desde `../../src/cli/acp-cli.ts` falla
con `TS6059` para una extensión incorporada.
- Integración: las extensiones no incorporadas permanecen intactas y no necesitan
participar todavía en la nueva configuración de solución.
**Verificación:**
- Existe un grafo de typecheck dedicado para las 10 extensiones incorporadas, y las
malas importaciones relativas desde una de ellas fallan mediante `tsc` normal.
- [ ] **Unidad 3: Migrar las extensiones de la primera ola a `@openclaw/plugin-sdk`**
**Objetivo:** Cambiar las extensiones de la primera ola para que consuman el paquete real del SDK
mediante metadatos de dependencia, referencias de proyecto e importaciones por nombre de paquete.
**Requisitos:** R5, R6, R7, R9
**Dependencias:** Unidad 2
**Archivos:**
- Modificar: `extensions/anthropic/package.json`
- Modificar: `extensions/exa/package.json`
- Modificar: `extensions/firecrawl/package.json`
- Modificar: `extensions/groq/package.json`
- Modificar: `extensions/mistral/package.json`
- Modificar: `extensions/openai/package.json`
- Modificar: `extensions/perplexity/package.json`
- Modificar: `extensions/tavily/package.json`
- Modificar: `extensions/together/package.json`
- Modificar: `extensions/xai/package.json`
- Modificar: las importaciones de producción y prueba bajo cada una de las 10 raíces de extensión que
actualmente hacen referencia a `openclaw/plugin-sdk/*`
**Enfoque:**
- Agregar `@openclaw/plugin-sdk: workspace:*` a `devDependencies` de las extensiones
de la primera ola.
- Reemplazar las importaciones `openclaw/plugin-sdk/*` en esos paquetes por
`@openclaw/plugin-sdk/*`.
- Mantener las importaciones internas locales de la extensión en barriles locales como `./api.ts` y
`./runtime-api.ts`.
- No cambiar las extensiones no incorporadas en este PR.
**Patrones a seguir:**
- Barriles existentes de importación local de extensiones (`api.ts`, `runtime-api.ts`)
- Forma de dependencia de paquete usada por otros paquetes del workspace `@openclaw/*`
**Escenarios de prueba:**
- Caso satisfactorio: cada extensión migrada sigue registrándose/cargándose mediante sus pruebas
existentes del plugin después de la reescritura de importaciones.
- Caso límite: las importaciones del SDK solo para pruebas en el conjunto de extensiones incorporadas siguen resolviéndose
correctamente mediante el nuevo paquete.
- Integración: las extensiones migradas no requieren alias raíz `openclaw/plugin-sdk/*`
para el typechecking.
**Verificación:**
- Las extensiones de la primera ola compilan y se prueban contra `@openclaw/plugin-sdk`
sin necesitar la ruta heredada de alias del SDK en la raíz.
- [ ] **Unidad 4: Preservar la compatibilidad heredada mientras la migración es parcial**
**Objetivo:** Mantener el resto del repositorio funcionando mientras el SDK existe tanto en forma heredada
como en forma de nuevo paquete durante la migración.
**Requisitos:** R4, R8, R9
**Dependencias:** Unidades 1-3
**Archivos:**
- Modificar: `src/plugin-sdk/*.ts` para shims de compatibilidad de la primera ola según sea necesario
- Modificar: `package.json`
- Modificar: la infraestructura de compilación o exportación que ensambla los artefactos del SDK
- Probar: `src/plugins/contracts/plugin-sdk-runtime-api-guardrails.test.ts`
- Probar: `src/plugins/contracts/plugin-sdk-index.bundle.test.ts`
**Enfoque:**
- Mantener `openclaw/plugin-sdk/*` en la raíz como superficie de compatibilidad para las
extensiones heredadas y para consumidores externos que aún no se están moviendo.
- Usar ya sea shims generados o cableado de proxy de exportación raíz para las subrutas
de la primera ola que se hayan movido a `packages/plugin-sdk`.
- No intentar retirar la superficie del SDK en la raíz en esta fase.
**Patrones a seguir:**
- Generación existente de exportaciones del SDK raíz mediante `src/plugin-sdk/entrypoints.ts`
- Compatibilidad existente de exportación de paquetes en el `package.json` raíz
**Escenarios de prueba:**
- Caso satisfactorio: una importación heredada del SDK raíz sigue resolviéndose para una extensión
no incorporada después de que exista el nuevo paquete.
- Caso límite: una subruta de la primera ola funciona tanto mediante la superficie heredada raíz como
mediante la nueva superficie del paquete durante la ventana de migración.
- Integración: las pruebas de contrato del índice/bundle de plugin-sdk siguen viendo una
superficie pública coherente.
**Verificación:**
- El repositorio admite tanto modos heredados como modos opt-in de consumo del SDK sin
romper las extensiones no modificadas.
- [ ] **Unidad 5: Agregar aplicación acotada y documentar el contrato de migración**
**Objetivo:** Incorporar CI y una guía para contribuidores que apliquen el nuevo comportamiento para la
primera ola sin fingir que todo el árbol de extensiones ya está migrado.
**Requisitos:** R5, R6, R8, R9
**Dependencias:** Unidades 1-4
**Archivos:**
- Modificar: `package.json`
- Modificar: los archivos de workflow de CI que deben ejecutar el typecheck opt-in de límites
- Modificar: `AGENTS.md`
- Modificar: `docs/plugins/sdk-overview.md`
- Modificar: `docs/plugins/sdk-entrypoints.md`
- Modificar: `docs/plans/2026-04-05-001-refactor-extension-package-resolution-boundary-plan.md`
**Enfoque:**
- Agregar una compuerta explícita para la primera ola, como una ejecución dedicada de `tsc -b` para
`packages/plugin-sdk` más las 10 extensiones incorporadas.
- Documentar que el repositorio ahora admite tanto modos heredados como modos opt-in de extensiones,
y que el nuevo trabajo de límites de extensiones debe preferir la nueva ruta de paquete.
- Registrar la regla de migración de la siguiente ola para que PR posteriores puedan agregar más extensiones
sin volver a debatir la arquitectura.
**Patrones a seguir:**
- Pruebas de contrato existentes bajo `src/plugins/contracts/`
- Actualizaciones existentes de documentación que explican migraciones por etapas
**Escenarios de prueba:**
- Caso satisfactorio: la nueva compuerta de typecheck de la primera ola pasa para el paquete del workspace
y las extensiones incorporadas.
- Ruta de error: introducir una nueva importación relativa no permitida en una
extensión incorporada hace fallar la compuerta de typecheck acotada.
- Integración: CI aún no exige que las extensiones no incorporadas satisfagan el nuevo
modo de límites de paquete.
**Verificación:**
- La ruta de aplicación de la primera ola está documentada, probada y se puede ejecutar sin
obligar a migrar todo el árbol de extensiones.
## Impacto en todo el sistema
- **Grafo de interacción:** este trabajo toca la fuente de verdad del SDK, las
exportaciones del paquete raíz, los metadatos de paquetes de extensiones, el diseño del grafo de TS y la verificación en CI.
- **Propagación de errores:** el modo principal de fallo previsto pasa a ser errores de TS en tiempo de compilación
(`TS6059`) en extensiones incorporadas en lugar de fallos solo de scripts personalizados.
- **Riesgos del ciclo de vida del estado:** la migración de doble superficie introduce riesgo de divergencia entre
las exportaciones de compatibilidad raíz y el nuevo paquete del workspace.
- **Paridad de superficie de API:** las subrutas de la primera ola deben seguir siendo semánticamente idénticas
tanto a través de `openclaw/plugin-sdk/*` como de `@openclaw/plugin-sdk/*` durante la
transición.
- **Cobertura de integración:** las pruebas unitarias no son suficientes; se requieren typechecks
acotados del grafo de paquetes para demostrar el límite.
- **Invariantes sin cambios:** las extensiones no incorporadas mantienen su comportamiento actual
en el PR 1. Este plan no afirma una aplicación de límites de importación en todo el repositorio.
## Riesgos y dependencias
| Riesgo | Mitigación |
| -------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| El paquete de la primera ola sigue resolviéndose hacia código fuente sin procesar y `rootDir` en realidad no falla de forma cerrada | Hacer que el primer paso de implementación sea un canario de referencia de paquete sobre una extensión incorporada antes de ampliarlo al conjunto completo |
| Mover demasiado código fuente del SDK de una vez recrea el problema original de conflictos de fusión | Mover solo las subrutas de la primera ola en el primer PR y mantener puentes de compatibilidad en la raíz |
| Las superficies heredadas y nuevas del SDK divergen semánticamente | Mantener un único inventario de entrypoints, agregar pruebas de contrato de compatibilidad y hacer explícita la paridad de doble superficie |
| Las rutas de compilación/prueba del repositorio raíz empiezan accidentalmente a depender del nuevo paquete de formas no controladas | Usar una configuración de solución opt-in dedicada y mantener fuera del primer PR los cambios de topología TS para todo el repositorio |
## Entrega por fases
### Fase 1
- Introducir `@openclaw/plugin-sdk`
- Definir la superficie de subrutas de la primera ola
- Demostrar que una extensión incorporada puede fallar de forma cerrada mediante `rootDir`
### Fase 2
- Incorporar las 10 extensiones de la primera ola
- Mantener activa la compatibilidad en la raíz para todos los demás
### Fase 3
- Agregar más extensiones en PR posteriores
- Mover más subrutas del SDK al paquete del workspace
- Retirar la compatibilidad en la raíz solo después de que desaparezca el conjunto heredado de extensiones
## Notas operativas / de documentación
- El primer PR debe describirse explícitamente como una migración de modo dual, no como la
finalización de la aplicación en todo el repositorio.
- La guía de migración debe facilitar que PR posteriores agreguen más extensiones
siguiendo el mismo patrón de paquete/dependencia/referencia.
## Fuentes y referencias
- Plan previo: `docs/plans/2026-04-05-001-refactor-extension-package-resolution-boundary-plan.md`
- Configuración del workspace: `pnpm-workspace.yaml`
- Inventario existente de entrypoints del SDK: `src/plugin-sdk/entrypoints.ts`
- Exportaciones existentes del SDK raíz: `package.json`
- Patrones existentes de paquetes del workspace:
- `packages/memory-host-sdk/package.json`
- `packages/plugin-package-contract/package.json`

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,14 @@
---
read_when:
- Estás creando un plugin de OpenClaw
- Necesitas distribuir un esquema de configuración del plugin o depurar errores de validación del plugin
- Necesitas distribuir un esquema de configuración de plugin o depurar errores de validación de plugins
summary: Manifiesto del plugin + requisitos del esquema JSON (validación estricta de configuración)
title: Manifiesto del plugin
x-i18n:
generated_at: "2026-04-07T05:04:40Z"
generated_at: "2026-04-09T01:28:54Z"
model: gpt-5.4
provider: openai
source_hash: 22d41b9f8748b1b1b066ee856be4a8f41e88b9a8bc073d74fc79d2bb0982f01a
source_hash: 9a7ee4b621a801d2a8f32f8976b0e1d9433c7810eb360aca466031fc0ffb286a
source_path: plugins/manifest.md
workflow: 15
---
@ -19,7 +19,7 @@ Esta página es solo para el **manifiesto nativo de plugins de OpenClaw**.
Para diseños de paquetes compatibles, consulta [Paquetes de plugins](/es/plugins/bundles).
Los formatos de paquetes compatibles usan archivos de manifiesto distintos:
Los formatos de paquetes compatibles usan archivos de manifiesto diferentes:
- Paquete Codex: `.codex-plugin/plugin.json`
- Paquete Claude: `.claude-plugin/plugin.json` o el diseño predeterminado de componentes de Claude
@ -27,20 +27,20 @@ Los formatos de paquetes compatibles usan archivos de manifiesto distintos:
- Paquete Cursor: `.cursor-plugin/plugin.json`
OpenClaw también detecta automáticamente esos diseños de paquetes, pero no se validan
contra el esquema `openclaw.plugin.json` descrito aquí.
con el esquema `openclaw.plugin.json` descrito aquí.
Para los paquetes compatibles, OpenClaw actualmente lee los metadatos del paquete más las raíces de
Skills declaradas, las raíces de comandos de Claude, los valores predeterminados de `settings.json` del paquete Claude,
los valores predeterminados de LSP del paquete Claude y los paquetes de hooks compatibles cuando el diseño coincide
con las expectativas de ejecución de OpenClaw.
Para los paquetes compatibles, OpenClaw actualmente lee los metadatos del paquete más las
raíces de Skills declaradas, las raíces de comandos de Claude, los valores predeterminados de `settings.json` del paquete Claude,
los valores predeterminados de LSP del paquete Claude y los paquetes de hooks compatibles cuando el diseño coincide con
las expectativas del entorno de ejecución de OpenClaw.
Todo plugin nativo de OpenClaw **debe** incluir un archivo `openclaw.plugin.json` en la
**raíz del plugin**. OpenClaw usa este manifiesto para validar la configuración
**sin ejecutar código del plugin**. Los manifiestos ausentes o no válidos se tratan como
errores del plugin y bloquean la validación de la configuración.
**sin ejecutar el código del plugin**. Los manifiestos faltantes o no válidos se tratan como
errores del plugin y bloquean la validación de configuración.
Consulta la guía completa del sistema de plugins: [Plugins](/es/tools/plugin).
Para el modelo de capacidades nativas y la guía actual de compatibilidad externa:
Para el modelo nativo de capacidades y la guía actual de compatibilidad externa:
[Modelo de capacidades](/es/plugins/architecture#public-capability-model).
## Qué hace este archivo
@ -52,24 +52,24 @@ código de tu plugin.
- identidad del plugin
- validación de configuración
- metadatos de autenticación e incorporación que deban estar disponibles sin iniciar el
tiempo de ejecución del plugin
- metadatos de alias y activación automática que deban resolverse antes de que se cargue el tiempo de ejecución del plugin
- metadatos abreviados de propiedad de familias de modelos que deban activar automáticamente el
plugin antes de que se cargue el tiempo de ejecución
- instantáneas estáticas de propiedad de capacidades usadas para el cableado de compatibilidad integrado y
- metadatos de autenticación e incorporación que deben estar disponibles sin iniciar el
entorno de ejecución del plugin
- metadatos de alias y autoactivación que deben resolverse antes de que se cargue el entorno de ejecución del plugin
- metadatos abreviados de pertenencia de familias de modelos que deben activar automáticamente el
plugin antes de que se cargue el entorno de ejecución
- instantáneas estáticas de pertenencia de capacidades usadas para el cableado de compatibilidad incluido y
la cobertura de contratos
- metadatos de configuración específicos del canal que deban fusionarse en las superficies
de catálogo y validación sin cargar el tiempo de ejecución
- pistas de UI de configuración
- metadatos de configuración específicos del canal que deben fusionarse en el catálogo y las superficies de validación
sin cargar el entorno de ejecución
- sugerencias de UI de configuración
No lo uses para:
- registrar comportamiento en tiempo de ejecución
- declarar entrypoints de código
- metadatos de instalación npm
- declarar puntos de entrada de código
- metadatos de instalación de npm
Eso corresponde al código de tu plugin y a `package.json`.
Eso pertenece al código de tu plugin y a `package.json`.
## Ejemplo mínimo
@ -90,7 +90,7 @@ Eso corresponde al código de tu plugin y a `package.json`.
{
"id": "openrouter",
"name": "OpenRouter",
"description": "Plugin de proveedor de OpenRouter",
"description": "Plugin de proveedor OpenRouter",
"version": "1.0.0",
"providers": ["openrouter"],
"modelSupport": {
@ -100,6 +100,9 @@ Eso corresponde al código de tu plugin y a `package.json`.
"providerAuthEnvVars": {
"openrouter": ["OPENROUTER_API_KEY"]
},
"providerAuthAliases": {
"openrouter-coding": "openrouter"
},
"channelEnvVars": {
"openrouter-chatops": ["OPENROUTER_CHATOPS_TOKEN"]
},
@ -108,19 +111,19 @@ Eso corresponde al código de tu plugin y a `package.json`.
"provider": "openrouter",
"method": "api-key",
"choiceId": "openrouter-api-key",
"choiceLabel": "Clave de API de OpenRouter",
"choiceLabel": "Clave API de OpenRouter",
"groupId": "openrouter",
"groupLabel": "OpenRouter",
"optionKey": "openrouterApiKey",
"cliFlag": "--openrouter-api-key",
"cliOption": "--openrouter-api-key <key>",
"cliDescription": "Clave de API de OpenRouter",
"cliDescription": "Clave API de OpenRouter",
"onboardingScopes": ["text-inference"]
}
],
"uiHints": {
"apiKey": {
"label": "Clave de API",
"label": "Clave API",
"placeholder": "sk-or-v1-...",
"sensitive": true
}
@ -141,61 +144,62 @@ Eso corresponde al código de tu plugin y a `package.json`.
| Field | Required | Type | What it means |
| ----------------------------------- | -------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `id` | Sí | `string` | ID canónico del plugin. Este es el ID usado en `plugins.entries.<id>`. |
| `id` | Sí | `string` | Id canónico del plugin. Este es el id usado en `plugins.entries.<id>`. |
| `configSchema` | Sí | `object` | JSON Schema en línea para la configuración de este plugin. |
| `enabledByDefault` | No | `true` | Marca un plugin integrado como habilitado de forma predeterminada. Omítelo, o establece cualquier valor distinto de `true`, para dejar el plugin deshabilitado de forma predeterminada. |
| `legacyPluginIds` | No | `string[]` | IDs heredados que se normalizan a este ID canónico del plugin. |
| `autoEnableWhenConfiguredProviders` | No | `string[]` | IDs de proveedor que deberían habilitar automáticamente este plugin cuando la autenticación, la configuración o las referencias de modelo los mencionen. |
| `kind` | No | `"memory"` \| `"context-engine"` | Declara un tipo exclusivo de plugin usado por `plugins.slots.*`. |
| `channels` | No | `string[]` | IDs de canal controlados por este plugin. Se usan para descubrimiento y validación de configuración. |
| `providers` | No | `string[]` | IDs de proveedor controlados por este plugin. |
| `modelSupport` | No | `object` | Metadatos abreviados de familia de modelos controlados por el manifiesto usados para cargar automáticamente el plugin antes del tiempo de ejecución. |
| `cliBackends` | No | `string[]` | IDs de backend de inferencia de CLI controlados por este plugin. Se usan para la activación automática al inicio a partir de referencias explícitas de configuración. |
| `providerAuthEnvVars` | No | `Record<string, string[]>` | Metadatos ligeros de autenticación de proveedor en variables de entorno que OpenClaw puede inspeccionar sin cargar el código del plugin. |
| `channelEnvVars` | No | `Record<string, string[]>` | Metadatos ligeros de variables de entorno del canal que OpenClaw puede inspeccionar sin cargar el código del plugin. Usa esto para superficies de configuración o autenticación de canal basadas en entorno que los ayudantes genéricos de inicio/configuración deberían ver. |
| `providerAuthChoices` | No | `object[]` | Metadatos ligeros de opciones de autenticación para selectores de incorporación, resolución de proveedor preferido y cableado simple de flags de CLI. |
| `contracts` | No | `object` | Instantánea estática de capacidades integradas para voz, transcripción en tiempo real, voz en tiempo real, comprensión multimedia, generación de imágenes, generación de música, generación de video, web-fetch, búsqueda web y propiedad de herramientas. |
| `channelConfigs` | No | `Record<string, object>` | Metadatos de configuración de canal controlados por el manifiesto que se fusionan en las superficies de descubrimiento y validación antes de que se cargue el tiempo de ejecución. |
| `skills` | No | `string[]` | Directorios de Skills que se deben cargar, relativos a la raíz del plugin. |
| `name` | No | `string` | Nombre legible del plugin. |
| `description` | No | `string` | Resumen breve mostrado en las superficies del plugin. |
| `version` | No | `string` | Versión informativa del plugin. |
| `uiHints` | No | `Record<string, object>` | Etiquetas de UI, placeholders y pistas de sensibilidad para campos de configuración. |
| `enabledByDefault` | No | `true` | Marca un plugin incluido como habilitado de forma predeterminada. Omítelo, o establece cualquier valor distinto de `true`, para dejar el plugin deshabilitado de forma predeterminada. |
| `legacyPluginIds` | No | `string[]` | Id heredados que se normalizan a este id canónico de plugin. |
| `autoEnableWhenConfiguredProviders` | No | `string[]` | Id de proveedores que deben autohabilitar este plugin cuando la autenticación, la configuración o las referencias de modelos los mencionan. |
| `kind` | No | `"memory"` \| `"context-engine"` | Declara un tipo exclusivo de plugin usado por `plugins.slots.*`. |
| `channels` | No | `string[]` | Id de canales propiedad de este plugin. Se usan para descubrimiento y validación de configuración. |
| `providers` | No | `string[]` | Id de proveedores propiedad de este plugin. |
| `modelSupport` | No | `object` | Metadatos abreviados de familias de modelos propiedad del manifiesto usados para cargar automáticamente el plugin antes del entorno de ejecución. |
| `cliBackends` | No | `string[]` | Id de backends de inferencia por CLI propiedad de este plugin. Se usan para la autoactivación al inicio a partir de referencias explícitas en la configuración. |
| `providerAuthEnvVars` | No | `Record<string, string[]>` | Metadatos ligeros de autenticación del proveedor mediante variables de entorno que OpenClaw puede inspeccionar sin cargar el código del plugin. |
| `providerAuthAliases` | No | `Record<string, string>` | Id de proveedores que deben reutilizar otro id de proveedor para la búsqueda de autenticación, por ejemplo un proveedor de programación que comparte la clave API y los perfiles de autenticación del proveedor base. |
| `channelEnvVars` | No | `Record<string, string[]>` | Metadatos ligeros de variables de entorno del canal que OpenClaw puede inspeccionar sin cargar el código del plugin. Usa esto para configuraciones de canal guiadas por entorno o superficies de autenticación que los ayudantes genéricos de inicio/configuración deberían ver. |
| `providerAuthChoices` | No | `object[]` | Metadatos ligeros de opciones de autenticación para selectores de incorporación, resolución de proveedores preferidos y cableado sencillo de banderas CLI. |
| `contracts` | No | `object` | Instantánea estática de capacidades incluidas para voz, transcripción en tiempo real, voz en tiempo real, comprensión de medios, generación de imágenes, generación musical, generación de video, web-fetch, búsqueda web y propiedad de herramientas. |
| `channelConfigs` | No | `Record<string, object>` | Metadatos de configuración de canal propiedad del manifiesto fusionados en las superficies de descubrimiento y validación antes de que se cargue el entorno de ejecución. |
| `skills` | No | `string[]` | Directorios de Skills que se cargarán, relativos a la raíz del plugin. |
| `name` | No | `string` | Nombre legible del plugin. |
| `description` | No | `string` | Resumen corto mostrado en superficies del plugin. |
| `version` | No | `string` | Versión informativa del plugin. |
| `uiHints` | No | `Record<string, object>` | Etiquetas de UI, marcadores de posición y sugerencias de sensibilidad para campos de configuración. |
## Referencia de `providerAuthChoices`
Cada entrada de `providerAuthChoices` describe una opción de incorporación o autenticación.
OpenClaw la lee antes de que se cargue el tiempo de ejecución del proveedor.
OpenClaw la lee antes de que se cargue el entorno de ejecución del proveedor.
| Field | Required | Type | What it means |
| --------------------- | -------- | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| `provider` | Sí | `string` | ID del proveedor al que pertenece esta opción. |
| `method` | Sí | `string` | ID del método de autenticación al que se enviará. |
| `choiceId` | Sí | `string` | ID estable de opción de autenticación usado por los flujos de incorporación y CLI. |
| `choiceLabel` | No | `string` | Etiqueta visible para el usuario. Si se omite, OpenClaw usa `choiceId` como respaldo. |
| `choiceHint` | No | `string` | Texto de ayuda breve para el selector. |
| `assistantPriority` | No | `number` | Los valores más bajos se ordenan antes en los selectores interactivos guiados por el asistente. |
| `assistantVisibility` | No | `"visible"` \| `"manual-only"` | Oculta la opción en los selectores del asistente, pero sigue permitiendo la selección manual por CLI. |
| `deprecatedChoiceIds` | No | `string[]` | IDs heredados de opciones que deberían redirigir a los usuarios a esta opción de reemplazo. |
| `groupId` | No | `string` | ID de grupo opcional para agrupar opciones relacionadas. |
| `provider` | Sí | `string` | Id del proveedor al que pertenece esta opción. |
| `method` | Sí | `string` | Id del método de autenticación al que se enviará. |
| `choiceId` | Sí | `string` | Id estable de opción de autenticación usado por los flujos de incorporación y CLI. |
| `choiceLabel` | No | `string` | Etiqueta visible para el usuario. Si se omite, OpenClaw usa `choiceId` como valor alternativo. |
| `choiceHint` | No | `string` | Texto de ayuda corto para el selector. |
| `assistantPriority` | No | `number` | Los valores más bajos se ordenan antes en los selectores interactivos controlados por el asistente. |
| `assistantVisibility` | No | `"visible"` \| `"manual-only"` | Oculta la opción de los selectores del asistente, pero sigue permitiendo la selección manual por CLI. |
| `deprecatedChoiceIds` | No | `string[]` | Id heredados de opciones que deben redirigir a los usuarios a esta opción de reemplazo. |
| `groupId` | No | `string` | Id de grupo opcional para agrupar opciones relacionadas. |
| `groupLabel` | No | `string` | Etiqueta visible para el usuario de ese grupo. |
| `groupHint` | No | `string` | Texto de ayuda breve para el grupo. |
| `optionKey` | No | `string` | Clave de opción interna para flujos simples de autenticación con un solo flag. |
| `cliFlag` | No | `string` | Nombre del flag de CLI, como `--openrouter-api-key`. |
| `cliOption` | No | `string` | Forma completa de la opción de CLI, como `--openrouter-api-key <key>`. |
| `cliDescription` | No | `string` | Descripción usada en la ayuda de CLI. |
| `groupHint` | No | `string` | Texto de ayuda corto para el grupo. |
| `optionKey` | No | `string` | Clave interna de opción para flujos de autenticación simples de una sola bandera. |
| `cliFlag` | No | `string` | Nombre de la bandera CLI, como `--openrouter-api-key`. |
| `cliOption` | No | `string` | Forma completa de la opción CLI, como `--openrouter-api-key <key>`. |
| `cliDescription` | No | `string` | Descripción usada en la ayuda de la CLI. |
| `onboardingScopes` | No | `Array<"text-inference" \| "image-generation">` | En qué superficies de incorporación debe aparecer esta opción. Si se omite, el valor predeterminado es `["text-inference"]`. |
## Referencia de `uiHints`
`uiHints` es un mapa de nombres de campos de configuración a pequeñas pistas de renderizado.
`uiHints` es un mapa de nombres de campos de configuración a pequeñas sugerencias de representación.
```json
{
"uiHints": {
"apiKey": {
"label": "Clave de API",
"help": "Se usa para solicitudes de OpenRouter",
"label": "Clave API",
"help": "Se usa para solicitudes a OpenRouter",
"placeholder": "sk-or-v1-...",
"sensitive": true
}
@ -203,21 +207,21 @@ OpenClaw la lee antes de que se cargue el tiempo de ejecución del proveedor.
}
```
Cada pista de campo puede incluir:
Cada sugerencia de campo puede incluir:
| Field | Type | What it means |
| ------------- | ---------- | --------------------------------------- |
| `label` | `string` | Etiqueta del campo visible para el usuario. |
| `help` | `string` | Texto de ayuda breve. |
| `help` | `string` | Texto de ayuda corto. |
| `tags` | `string[]` | Etiquetas opcionales de UI. |
| `advanced` | `boolean` | Marca el campo como avanzado. |
| `sensitive` | `boolean` | Marca el campo como secreto o sensible. |
| `placeholder` | `string` | Texto de placeholder para entradas de formularios. |
| `placeholder` | `string` | Texto de marcador de posición para entradas de formulario. |
## Referencia de `contracts`
Usa `contracts` solo para metadatos estáticos de propiedad de capacidades que OpenClaw pueda
leer sin importar el tiempo de ejecución del plugin.
Usa `contracts` solo para metadatos estáticos de propiedad de capacidades que OpenClaw puede
leer sin importar el entorno de ejecución del plugin.
```json
{
@ -239,20 +243,20 @@ Cada lista es opcional:
| Field | Type | What it means |
| -------------------------------- | ---------- | -------------------------------------------------------------- |
| `speechProviders` | `string[]` | IDs de proveedor de voz que controla este plugin. |
| `realtimeTranscriptionProviders` | `string[]` | IDs de proveedor de transcripción en tiempo real que controla este plugin. |
| `realtimeVoiceProviders` | `string[]` | IDs de proveedor de voz en tiempo real que controla este plugin. |
| `mediaUnderstandingProviders` | `string[]` | IDs de proveedor de comprensión multimedia que controla este plugin. |
| `imageGenerationProviders` | `string[]` | IDs de proveedor de generación de imágenes que controla este plugin. |
| `videoGenerationProviders` | `string[]` | IDs de proveedor de generación de video que controla este plugin. |
| `webFetchProviders` | `string[]` | IDs de proveedor de web-fetch que controla este plugin. |
| `webSearchProviders` | `string[]` | IDs de proveedor de búsqueda web que controla este plugin. |
| `tools` | `string[]` | Nombres de herramientas del agente que controla este plugin para comprobaciones integradas de contratos. |
| `speechProviders` | `string[]` | Id de proveedores de voz propiedad de este plugin. |
| `realtimeTranscriptionProviders` | `string[]` | Id de proveedores de transcripción en tiempo real propiedad de este plugin. |
| `realtimeVoiceProviders` | `string[]` | Id de proveedores de voz en tiempo real propiedad de este plugin. |
| `mediaUnderstandingProviders` | `string[]` | Id de proveedores de comprensión de medios propiedad de este plugin. |
| `imageGenerationProviders` | `string[]` | Id de proveedores de generación de imágenes propiedad de este plugin. |
| `videoGenerationProviders` | `string[]` | Id de proveedores de generación de video propiedad de este plugin. |
| `webFetchProviders` | `string[]` | Id de proveedores de web-fetch propiedad de este plugin. |
| `webSearchProviders` | `string[]` | Id de proveedores de búsqueda web propiedad de este plugin. |
| `tools` | `string[]` | Nombres de herramientas del agente propiedad de este plugin para verificaciones de contratos incluidos. |
## Referencia de `channelConfigs`
Usa `channelConfigs` cuando un plugin de canal necesite metadatos de configuración ligeros antes de que
se cargue el tiempo de ejecución.
Usa `channelConfigs` cuando un plugin de canal necesita metadatos ligeros de configuración antes de que
se cargue el entorno de ejecución.
```json
{
@ -283,16 +287,16 @@ Cada entrada de canal puede incluir:
| Field | Type | What it means |
| ------------- | ------------------------ | ----------------------------------------------------------------------------------------- |
| `schema` | `object` | JSON Schema para `channels.<id>`. Obligatorio para cada entrada de configuración de canal declarada. |
| `uiHints` | `Record<string, object>` | Etiquetas/placeholders/pistas de sensibilidad de UI opcionales para esa sección de configuración del canal. |
| `label` | `string` | Etiqueta del canal fusionada en superficies de selector e inspección cuando los metadatos de tiempo de ejecución no están listos. |
| `description` | `string` | Descripción breve del canal para superficies de inspección y catálogo. |
| `preferOver` | `string[]` | IDs heredados o de menor prioridad de plugins que este canal debe superar en las superficies de selección. |
| `schema` | `object` | JSON Schema para `channels.<id>`. Obligatorio para cada entrada declarada de configuración de canal. |
| `uiHints` | `Record<string, object>` | Etiquetas/placeholders/sugerencias de sensibilidad opcionales de UI para esa sección de configuración del canal. |
| `label` | `string` | Etiqueta del canal fusionada en las superficies de selector e inspección cuando los metadatos del entorno de ejecución no están listos. |
| `description` | `string` | Descripción corta del canal para las superficies de inspección y catálogo. |
| `preferOver` | `string[]` | Id de plugins heredados o de menor prioridad que este canal debe superar en las superficies de selección. |
## Referencia de `modelSupport`
Usa `modelSupport` cuando OpenClaw deba inferir tu plugin de proveedor a partir de
IDs abreviados de modelo como `gpt-5.4` o `claude-sonnet-4.6` antes de que se cargue el tiempo de ejecución del plugin.
id abreviados de modelos como `gpt-5.4` o `claude-sonnet-4.6` antes de que se cargue el entorno de ejecución del plugin.
```json
{
@ -305,73 +309,74 @@ IDs abreviados de modelo como `gpt-5.4` o `claude-sonnet-4.6` antes de que se ca
OpenClaw aplica esta precedencia:
- las referencias explícitas `provider/model` usan los metadatos de manifiesto `providers` del propietario
- las referencias explícitas `provider/model` usan los metadatos del manifiesto `providers` propietario
- `modelPatterns` tienen prioridad sobre `modelPrefixes`
- si coinciden un plugin no integrado y uno integrado, gana el plugin no integrado
- la ambigüedad restante se ignora hasta que el usuario o la configuración especifiquen un proveedor
- si coinciden un plugin no incluido y un plugin incluido, el plugin no incluido
gana
- la ambigüedad restante se ignora hasta que el usuario o la configuración especifique un proveedor
Campos:
| Field | Type | What it means |
| --------------- | ---------- | ------------------------------------------------------------------------------- |
| `modelPrefixes` | `string[]` | Prefijos comparados con `startsWith` frente a IDs abreviados de modelo. |
| `modelPatterns` | `string[]` | Fuentes regex comparadas con IDs abreviados de modelo después de eliminar el sufijo del perfil. |
| `modelPrefixes` | `string[]` | Prefijos comparados con `startsWith` frente a id abreviados de modelos. |
| `modelPatterns` | `string[]` | Fuentes regex comparadas con id abreviados de modelos tras eliminar el sufijo del perfil. |
Las claves heredadas de capacidades de nivel superior están obsoletas. Usa `openclaw doctor --fix` para
mover `speechProviders`, `realtimeTranscriptionProviders`,
`realtimeVoiceProviders`, `mediaUnderstandingProviders`,
`imageGenerationProviders`, `videoGenerationProviders`,
`webFetchProviders` y `webSearchProviders` bajo `contracts`; la carga normal
del manifiesto ya no trata esos campos de nivel superior como propiedad
de capacidades.
del manifiesto ya no trata esos campos de nivel superior como
propiedad de capacidades.
## Manifiesto frente a package.json
Los dos archivos tienen funciones distintas:
Los dos archivos cumplen funciones distintas:
| File | Use it for |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `openclaw.plugin.json` | Descubrimiento, validación de configuración, metadatos de opciones de autenticación y pistas de UI que deben existir antes de que se ejecute el código del plugin |
| `package.json` | Metadatos npm, instalación de dependencias y el bloque `openclaw` usado para entrypoints, control de instalación, configuración o metadatos de catálogo |
| `openclaw.plugin.json` | Descubrimiento, validación de configuración, metadatos de opciones de autenticación y sugerencias de UI que deben existir antes de que se ejecute el código del plugin |
| `package.json` | Metadatos de npm, instalación de dependencias y el bloque `openclaw` usado para puntos de entrada, control de instalación, configuración o metadatos de catálogo |
Si no tienes claro dónde debe ir un dato, usa esta regla:
Si no estás seguro de dónde debe ir un dato, usa esta regla:
- si OpenClaw debe conocerlo antes de cargar el código del plugin, colócalo en `openclaw.plugin.json`
- si trata sobre empaquetado, archivos de entrada o comportamiento de instalación npm, colócalo en `package.json`
- si OpenClaw debe conocerlo antes de cargar el código del plugin, ponlo en `openclaw.plugin.json`
- si trata sobre empaquetado, archivos de entrada o comportamiento de instalación de npm, ponlo en `package.json`
### Campos de package.json que afectan al descubrimiento
Algunos metadatos del plugin previos al tiempo de ejecución viven intencionadamente en `package.json` dentro del
Algunos metadatos del plugin previos al entorno de ejecución viven intencionalmente en `package.json` bajo el
bloque `openclaw` en lugar de `openclaw.plugin.json`.
Ejemplos importantes:
| Field | What it means |
| ----------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `openclaw.extensions` | Declara entrypoints nativos del plugin. |
| `openclaw.setupEntry` | Entrypoint ligero solo de configuración usado durante la incorporación y el inicio diferido de canales. |
| `openclaw.extensions` | Declara puntos de entrada nativos del plugin. |
| `openclaw.setupEntry` | Punto de entrada ligero solo para configuración usado durante la incorporación y el arranque diferido del canal. |
| `openclaw.channel` | Metadatos ligeros del catálogo de canales, como etiquetas, rutas de documentación, alias y texto de selección. |
| `openclaw.channel.configuredState` | Metadatos ligeros del comprobador de estado configurado que pueden responder a "¿ya existe una configuración solo con entorno?" sin cargar el tiempo de ejecución completo del canal. |
| `openclaw.channel.persistedAuthState` | Metadatos ligeros del comprobador de autenticación persistida que pueden responder a "¿ya hay algo con sesión iniciada?" sin cargar el tiempo de ejecución completo del canal. |
| `openclaw.install.npmSpec` / `openclaw.install.localPath` | Pistas de instalación/actualización para plugins integrados y publicados externamente. |
| `openclaw.install.defaultChoice` | Ruta de instalación preferida cuando hay varias fuentes de instalación disponibles. |
| `openclaw.install.minHostVersion` | Versión mínima compatible del host de OpenClaw, usando un piso semver como `>=2026.3.22`. |
| `openclaw.install.allowInvalidConfigRecovery` | Permite una ruta de recuperación de reinstalación limitada para plugins integrados cuando la configuración no es válida. |
| `openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen` | Permite que las superficies del canal solo de configuración se carguen antes del plugin completo del canal durante el inicio. |
| `openclaw.channel.configuredState` | Metadatos ligeros del verificador de estado configurado que pueden responder “¿ya existe una configuración solo por entorno?” sin cargar el entorno de ejecución completo del canal. |
| `openclaw.channel.persistedAuthState` | Metadatos ligeros del verificador de autenticación persistida que pueden responder “¿ya hay algo con sesión iniciada?” sin cargar el entorno de ejecución completo del canal. |
| `openclaw.install.npmSpec` / `openclaw.install.localPath` | Sugerencias de instalación/actualización para plugins incluidos y publicados externamente. |
| `openclaw.install.defaultChoice` | Ruta de instalación preferida cuando hay varias fuentes de instalación disponibles. |
| `openclaw.install.minHostVersion` | Versión mínima compatible del host de OpenClaw, usando un umbral semver como `>=2026.3.22`. |
| `openclaw.install.allowInvalidConfigRecovery` | Permite una ruta limitada de recuperación por reinstalación de plugins incluidos cuando la configuración no es válida. |
| `openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen` | Permite que las superficies de canal solo de configuración se carguen antes que el plugin de canal completo durante el arranque. |
`openclaw.install.minHostVersion` se aplica durante la instalación y la carga del registro
del manifiesto. Los valores no válidos se rechazan; los valores válidos pero más recientes omiten el
`openclaw.install.minHostVersion` se aplica durante la instalación y la carga del
registro de manifiestos. Los valores no válidos se rechazan; los valores válidos pero más recientes omiten el
plugin en hosts más antiguos.
`openclaw.install.allowInvalidConfigRecovery` es intencionadamente limitado. No
hace instalables configuraciones rotas arbitrarias. Hoy solo permite que los flujos de instalación
se recuperen de fallos concretos de actualización de plugins integrados obsoletos, como una
ruta faltante del plugin integrado o una entrada obsoleta `channels.<id>` para ese mismo
plugin integrado. Los errores de configuración no relacionados siguen bloqueando la instalación y envían a los operadores
`openclaw.install.allowInvalidConfigRecovery` es intencionalmente limitado. No
permite instalar configuraciones arbitrariamente rotas. Actualmente solo permite que los flujos de instalación
se recuperen de errores concretos de actualización obsoleta de plugins incluidos, como una
ruta faltante del plugin incluido o una entrada obsoleta `channels.<id>` para ese mismo
plugin incluido. Los errores de configuración no relacionados siguen bloqueando la instalación y envían a los operadores
a `openclaw doctor --fix`.
`openclaw.channel.persistedAuthState` es un metadato de paquete para un módulo
comprobador diminuto:
`openclaw.channel.persistedAuthState` son metadatos de paquete para un módulo
verificador diminuto:
```json
{
@ -387,13 +392,13 @@ comprobador diminuto:
}
```
Úsalo cuando los flujos de configuración, doctor o estado configurado necesiten una sonda de autenticación
ligera de sí/no antes de que se cargue el plugin completo del canal. La exportación de destino debe ser una
función pequeña que lea solo el estado persistido; no la encamines a través del barrel completo
de tiempo de ejecución del canal.
Úsalo cuando los flujos de configuración, doctor o estado configurado necesiten una sonda barata de autenticación sí/no
antes de que se cargue el plugin completo del canal. La exportación de destino debe ser una función pequeña
que lea solo el estado persistido; no la enrutes a través del barrel completo del entorno de ejecución
del canal.
`openclaw.channel.configuredState` sigue la misma forma para comprobaciones ligeras
de estado configurado solo con entorno:
`openclaw.channel.configuredState` sigue la misma forma para verificaciones ligeras
de estado configurado solo por entorno:
```json
{
@ -409,10 +414,9 @@ de estado configurado solo con entorno:
}
```
Úsalo cuando un canal pueda responder al estado configurado desde el entorno u otras entradas
mínimas no relacionadas con el tiempo de ejecución. Si la comprobación necesita resolución completa de configuración o el
tiempo de ejecución real del canal, mantén esa lógica en el hook `config.hasConfiguredState`
del plugin.
Úsalo cuando un canal pueda responder el estado configurado desde el entorno u otras
entradas mínimas ajenas al entorno de ejecución. Si la verificación necesita la resolución completa de configuración o el
entorno de ejecución real del canal, deja esa lógica en el hook del plugin `config.hasConfiguredState`.
## Requisitos de JSON Schema
@ -422,49 +426,52 @@ del plugin.
## Comportamiento de validación
- Las claves desconocidas `channels.*` son **errores**, salvo que el ID del canal esté declarado por
- Las claves desconocidas `channels.*` son **errores**, a menos que el id del canal esté declarado por
un manifiesto de plugin.
- `plugins.entries.<id>`, `plugins.allow`, `plugins.deny` y `plugins.slots.*`
deben hacer referencia a IDs de plugin **detectables**. Los IDs desconocidos son **errores**.
- Si un plugin está instalado pero tiene un manifiesto o esquema roto o ausente,
deben hacer referencia a id de plugins **detectables**. Los id desconocidos son **errores**.
- Si un plugin está instalado pero tiene un manifiesto o esquema roto o faltante,
la validación falla y Doctor informa del error del plugin.
- Si existe configuración del plugin pero el plugin está **deshabilitado**, la configuración se conserva y
se muestra una **advertencia** en Doctor + los registros.
se muestra una **advertencia** en Doctor + registros.
Consulta [Referencia de configuración](/es/gateway/configuration) para ver el esquema completo de `plugins.*`.
## Notas
- El manifiesto es **obligatorio para los plugins nativos de OpenClaw**, incluidas las cargas desde el sistema de archivos local.
- El tiempo de ejecución sigue cargando el módulo del plugin por separado; el manifiesto es solo para
- El entorno de ejecución sigue cargando el módulo del plugin por separado; el manifiesto es solo para
descubrimiento + validación.
- Los manifiestos nativos se analizan con JSON5, por lo que se aceptan comentarios, comas finales y
claves sin comillas siempre que el valor final siga siendo un objeto.
- El cargador de manifiestos solo lee los campos de manifiesto documentados. Evita añadir
- El cargador de manifiestos solo lee los campos documentados del manifiesto. Evita agregar
aquí claves personalizadas de nivel superior.
- `providerAuthEnvVars` es la ruta ligera de metadatos para sondas de autenticación, validación
de marcadores de entorno y superficies similares de autenticación de proveedor que no deberían iniciar el
tiempo de ejecución del plugin solo para inspeccionar nombres de variables de entorno.
- `channelEnvVars` es la ruta ligera de metadatos para respaldo de variables de entorno del shell, prompts
de configuración y superficies similares de canal que no deberían iniciar el tiempo de ejecución del plugin
solo para inspeccionar nombres de variables de entorno.
- `providerAuthChoices` es la ruta ligera de metadatos para selectores de opciones de autenticación,
resolución de `--auth-choice`, asignación de proveedor preferido y registro simple
de flags de CLI de incorporación antes de que se cargue el tiempo de ejecución del proveedor. Para metadatos
del asistente en tiempo de ejecución que requieran código del proveedor, consulta
[Hooks de tiempo de ejecución del proveedor](/es/plugins/architecture#provider-runtime-hooks).
- Los tipos exclusivos de plugins se seleccionan mediante `plugins.slots.*`.
- `providerAuthEnvVars` es la ruta de metadatos ligera para sondeos de autenticación, validación
de marcadores de entorno y superficies similares de autenticación del proveedor que no deberían iniciar el entorno de ejecución del plugin
solo para inspeccionar nombres de entorno.
- `providerAuthAliases` permite que variantes de proveedores reutilicen la autenticación
por variables de entorno, perfiles de autenticación, autenticación respaldada por configuración y la opción de incorporación
por clave API de otro proveedor sin codificar esa relación en el núcleo.
- `channelEnvVars` es la ruta de metadatos ligera para fallback de entorno de shell, prompts
de configuración y superficies de canal similares que no deberían iniciar el entorno de ejecución del plugin
solo para inspeccionar nombres de entorno.
- `providerAuthChoices` es la ruta de metadatos ligera para selectores de opciones de autenticación,
resolución de `--auth-choice`, mapeo de proveedores preferidos y registro simple
de banderas CLI de incorporación antes de que se cargue el entorno de ejecución del proveedor. Para metadatos de asistente en tiempo de ejecución
que requieren código del proveedor, consulta
[Hooks de runtime del proveedor](/es/plugins/architecture#provider-runtime-hooks).
- Los tipos exclusivos de plugin se seleccionan mediante `plugins.slots.*`.
- `kind: "memory"` se selecciona mediante `plugins.slots.memory`.
- `kind: "context-engine"` se selecciona mediante `plugins.slots.contextEngine`
(predeterminado: `legacy` integrado).
- `channels`, `providers`, `cliBackends` y `skills` pueden omitirse cuando un
plugin no los necesite.
plugin no los necesita.
- Si tu plugin depende de módulos nativos, documenta los pasos de compilación y cualquier
requisito de lista permitida del gestor de paquetes (por ejemplo, pnpm `allow-build-scripts`
requisito de lista de permitidos del administrador de paquetes (por ejemplo, pnpm `allow-build-scripts`
- `pnpm rebuild <package>`).
## Relacionado
- [Building Plugins](/es/plugins/building-plugins) — primeros pasos con plugins
- [Plugin Architecture](/es/plugins/architecture) — arquitectura interna
- [SDK Overview](/es/plugins/sdk-overview) — referencia del SDK de plugins
- [Creación de plugins](/es/plugins/building-plugins) — introducción a los plugins
- [Arquitectura de plugins](/es/plugins/architecture) — arquitectura interna
- [Resumen del SDK](/es/plugins/sdk-overview) — referencia del SDK de plugins

View File

@ -5,40 +5,40 @@ read_when:
- Estás actualizando un plugin a la arquitectura moderna de plugins
- Mantienes un plugin externo de OpenClaw
sidebarTitle: Migrate to SDK
summary: Migra desde la capa heredada de compatibilidad hacia atrás al moderno plugin SDK
title: Migración del Plugin SDK
summary: Migra desde la capa heredada de compatibilidad retroactiva al SDK de plugins moderno
title: Migración del SDK de plugins
x-i18n:
generated_at: "2026-04-08T02:17:07Z"
generated_at: "2026-04-09T01:30:19Z"
model: gpt-5.4
provider: openai
source_hash: 155a8b14bc345319c8516ebdb8a0ccdea2c5f7fa07dad343442996daee21ecad
source_hash: 60cbb6c8be30d17770887d490c14e3a4538563339a5206fb419e51e0558bbc07
source_path: plugins/sdk-migration.md
workflow: 15
---
# Migración del Plugin SDK
# Migración del SDK de plugins
OpenClaw ha pasado de una amplia capa de compatibilidad hacia atrás a una arquitectura
moderna de plugins con importaciones enfocadas y documentadas. Si tu plugin se creó antes
de la nueva arquitectura, esta guía te ayuda a migrarlo.
OpenClaw ha pasado de una capa amplia de compatibilidad retroactiva a una arquitectura moderna de plugins
con importaciones específicas y documentadas. Si tu plugin se creó antes de
la nueva arquitectura, esta guía te ayuda a migrarlo.
## Qué está cambiando
El sistema anterior de plugins proporcionaba dos superficies muy abiertas que permitían a los plugins importar
cualquier cosa que necesitaran desde un único punto de entrada:
todo lo que necesitaran desde un único punto de entrada:
- **`openclaw/plugin-sdk/compat`** — una sola importación que reexportaba decenas de
helpers. Se introdujo para mantener en funcionamiento plugins más antiguos basados en hooks mientras se
ayudantes. Se introdujo para mantener funcionando los plugins basados en hooks más antiguos mientras se
construía la nueva arquitectura de plugins.
- **`openclaw/extension-api`** — un puente que daba a los plugins acceso directo a
helpers del lado del host, como el ejecutor de agente embebido.
ayudantes del lado del host, como el ejecutor de agentes integrado.
Ambas superficies ahora están **obsoletas**. Siguen funcionando en tiempo de ejecución, pero los
plugins nuevos no deben usarlas, y los plugins existentes deberían migrar antes de que la próxima
Ambas superficies ahora están **obsoletas**. Siguen funcionando en tiempo de ejecución, pero los plugins
nuevos no deben usarlas, y los plugins existentes deberían migrar antes de que la próxima
versión principal las elimine.
<Warning>
La capa de compatibilidad hacia atrás se eliminará en una futura versión principal.
La capa de compatibilidad retroactiva se eliminará en una futura versión principal.
Los plugins que sigan importando desde estas superficies dejarán de funcionar cuando eso ocurra.
</Warning>
@ -46,64 +46,63 @@ versión principal las elimine.
El enfoque anterior causaba problemas:
- **Inicio lento** — importar un helper cargaba decenas de módulos no relacionados
- **Inicio lento** — importar un ayudante cargaba decenas de módulos no relacionados
- **Dependencias circulares** — las reexportaciones amplias facilitaban la creación de ciclos de importación
- **Superficie API poco clara** — no había forma de saber qué exportaciones eran estables y cuáles eran internas
- **Superficie de API poco clara** — no había forma de saber qué exportaciones eran estables y cuáles eran internas
El moderno plugin SDK soluciona esto: cada ruta de importación (`openclaw/plugin-sdk/\<subpath\>`)
es un módulo pequeño, autocontenido, con un propósito claro y un contrato documentado.
El SDK de plugins moderno corrige esto: cada ruta de importación (`openclaw/plugin-sdk/\<subpath\>`)
es un módulo pequeño, autónomo, con un propósito claro y un contrato documentado.
Las superficies heredadas de conveniencia para proveedores de canales empaquetados también han desaparecido. Las importaciones
Las uniones heredadas de conveniencia para proveedores de canales incluidos también han desaparecido. Importaciones
como `openclaw/plugin-sdk/slack`, `openclaw/plugin-sdk/discord`,
`openclaw/plugin-sdk/signal`, `openclaw/plugin-sdk/whatsapp`,
las superficies helper con marca de canal y
las uniones de ayudantes con marca de canal y
`openclaw/plugin-sdk/telegram-core` eran atajos privados del monorepo, no
contratos estables para plugins. Usa en su lugar subrutas genéricas y específicas del SDK. Dentro del
espacio de trabajo de plugins empaquetados, mantén los helpers propiedad del proveedor en el propio
contratos estables de plugins. Usa en su lugar subrutas genéricas y estrechas del SDK. Dentro del
espacio de trabajo de plugins incluidos, conserva los ayudantes propios del proveedor en el
`api.ts` o `runtime-api.ts` de ese plugin.
Ejemplos actuales de proveedores empaquetados:
Ejemplos actuales de proveedores incluidos:
- Anthropic mantiene helpers de flujo específicos de Claude en su propia superficie `api.ts` /
- Anthropic mantiene los ayudantes de streaming específicos de Claude en su propia unión `api.ts` /
`contract-api.ts`
- OpenAI mantiene constructores de proveedores, helpers de modelos predeterminados y constructores de proveedores
realtime en su propio `api.ts`
- OpenRouter mantiene el constructor del proveedor y los helpers de onboarding/configuración en su propio
- OpenAI mantiene los constructores de proveedores, los ayudantes de modelos predeterminados y los constructores
de proveedores en tiempo real en su propio `api.ts`
- OpenRouter mantiene el constructor del proveedor y los ayudantes de incorporación/configuración en su propio
`api.ts`
## Cómo migrar
<Steps>
<Step title="Migra los handlers nativos de aprobación a hechos de capacidad">
<Step title="Migra los controladores nativos de aprobación a hechos de capacidad">
Los plugins de canal con capacidad de aprobación ahora exponen el comportamiento nativo de aprobación mediante
`approvalCapability.nativeRuntime` más el registro compartido de contexto de runtime.
`approvalCapability.nativeRuntime` más el registro compartido de contexto de ejecución.
Cambios clave:
Cambios principales:
- Reemplaza `approvalCapability.handler.loadRuntime(...)` por
`approvalCapability.nativeRuntime`
- Mueve la autenticación/entrega específica de aprobación fuera del cableado heredado `plugin.auth` /
`plugin.approvals` y colócalo en `approvalCapability`
- `ChannelPlugin.approvals` se ha eliminado del contrato público
de plugins de canal; mueve los campos delivery/native/render a `approvalCapability`
- `plugin.auth` se mantiene solo para flujos de login/logout del canal; los hooks de autenticación
de aprobación allí ya no son leídos por el núcleo
- Registra objetos de runtime propiedad del canal, como clientes, tokens o apps Bolt,
mediante `openclaw/plugin-sdk/channel-runtime-context`
- No envíes avisos de redirección propiedad del plugin desde handlers nativos de aprobación;
el núcleo ahora se encarga de los avisos de enrutado a otro lugar a partir de resultados reales de entrega
- Mueve la autenticación/entrega específica de aprobaciones fuera del cableado heredado `plugin.auth` /
`plugin.approvals` y hacia `approvalCapability`
- `ChannelPlugin.approvals` se eliminó del contrato público de
plugin de canal; mueve los campos delivery/native/render a `approvalCapability`
- `plugin.auth` permanece solo para los flujos de inicio/cierre de sesión del canal; los hooks
de autenticación de aprobación ahí ya no son leídos por el núcleo
- Registra objetos de entorno de ejecución propiedad del canal, como clientes, tokens o aplicaciones
Bolt, mediante `openclaw/plugin-sdk/channel-runtime-context`
- No envíes avisos de redirección propiedad del plugin desde controladores nativos de aprobación;
el núcleo ahora es propietario de los avisos de “enrutado a otro lugar” a partir de los resultados reales de entrega
- Al pasar `channelRuntime` a `createChannelManager(...)`, proporciona una
superficie real `createPluginRuntime().channel`. Los stubs parciales se rechazan.
superficie real de `createPluginRuntime().channel`. Los stubs parciales se rechazan.
Consulta `/plugins/sdk-channel-plugins` para ver el diseño actual de
capacidades de aprobación.
Consulta `/plugins/sdk-channel-plugins` para ver el diseño actual
de la capacidad de aprobación.
</Step>
<Step title="Audita el comportamiento de respaldo del wrapper de Windows">
Si tu plugin usa `openclaw/plugin-sdk/windows-spawn`, los wrappers `.cmd`/`.bat`
no resueltos de Windows ahora fallan en modo cerrado, a menos que pases explícitamente
`allowShellFallback: true`.
<Step title="Audita el comportamiento de fallback del wrapper de Windows">
Si tu plugin usa `openclaw/plugin-sdk/windows-spawn`, los wrappers `.cmd`/`.bat` de Windows no resueltos ahora fallan de forma cerrada a menos que pases
explícitamente `allowShellFallback: true`.
```typescript
// Antes
@ -112,19 +111,19 @@ Ejemplos actuales de proveedores empaquetados:
// Después
const program = applyWindowsSpawnProgramPolicy({
candidate,
// Establece esto solo para llamantes de compatibilidad de confianza que
// aceptan intencionalmente el respaldo mediado por shell.
// Establece esto solo para llamadores de compatibilidad de confianza que
// aceptan intencionalmente el fallback mediado por shell.
allowShellFallback: true,
});
```
Si tu llamante no depende intencionalmente del respaldo por shell, no establezcas
`allowShellFallback` y maneja el error lanzado en su lugar.
Si tu llamador no depende intencionalmente del fallback de shell, no establezcas
`allowShellFallback` y maneja en su lugar el error lanzado.
</Step>
<Step title="Encuentra importaciones obsoletas">
Busca en tu plugin importaciones desde cualquiera de estas dos superficies obsoletas:
<Step title="Busca importaciones obsoletas">
Busca en tu plugin importaciones desde cualquiera de las dos superficies obsoletas:
```bash
grep -r "plugin-sdk/compat" my-plugin/
@ -133,24 +132,24 @@ Ejemplos actuales de proveedores empaquetados:
</Step>
<Step title="Reemplázalas por importaciones enfocadas">
Cada exportación de la superficie antigua se corresponde con una ruta de importación moderna específica:
<Step title="Reemplázalas por importaciones específicas">
Cada exportación de la superficie anterior se asigna a una ruta de importación moderna específica:
```typescript
// Antes (capa obsoleta de compatibilidad hacia atrás)
// Antes (capa obsoleta de compatibilidad retroactiva)
import {
createChannelReplyPipeline,
createPluginRuntimeStore,
resolveControlCommandGate,
} from "openclaw/plugin-sdk/compat";
// Después (importaciones modernas y enfocadas)
// Después (importaciones modernas específicas)
import { createChannelReplyPipeline } from "openclaw/plugin-sdk/channel-reply-pipeline";
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
import { resolveControlCommandGate } from "openclaw/plugin-sdk/command-auth";
```
Para helpers del lado del host, usa el runtime de plugin inyectado en lugar de importar
Para los ayudantes del lado del host, usa el entorno de ejecución del plugin inyectado en lugar de importar
directamente:
```typescript
@ -158,11 +157,11 @@ Ejemplos actuales de proveedores empaquetados:
import { runEmbeddedPiAgent } from "openclaw/extension-api";
const result = await runEmbeddedPiAgent({ sessionId, prompt });
// Después (runtime inyectado)
// Después (entorno de ejecución inyectado)
const result = await api.runtime.agent.runEmbeddedPiAgent({ sessionId, prompt });
```
El mismo patrón se aplica a otros helpers heredados del puente:
El mismo patrón se aplica a otros ayudantes heredados del puente:
| Importación antigua | Equivalente moderno |
| --- | --- |
@ -172,7 +171,7 @@ Ejemplos actuales de proveedores empaquetados:
| `resolveThinkingDefault` | `api.runtime.agent.resolveThinkingDefault` |
| `resolveAgentTimeoutMs` | `api.runtime.agent.resolveAgentTimeoutMs` |
| `ensureAgentWorkspace` | `api.runtime.agent.ensureAgentWorkspace` |
| helpers del almacén de sesiones | `api.runtime.agent.session.*` |
| ayudantes de almacén de sesiones | `api.runtime.agent.session.*` |
</Step>
@ -189,178 +188,181 @@ Ejemplos actuales de proveedores empaquetados:
<Accordion title="Tabla común de rutas de importación">
| Ruta de importación | Propósito | Exportaciones clave |
| --- | --- | --- |
| `plugin-sdk/plugin-entry` | Helper canónico de entrada de plugin | `definePluginEntry` |
| `plugin-sdk/plugin-entry` | Ayudante canónico de entrada de plugin | `definePluginEntry` |
| `plugin-sdk/core` | Reexportación paraguas heredada para definiciones/constructores de entrada de canal | `defineChannelPluginEntry`, `createChatChannelPlugin` |
| `plugin-sdk/config-schema` | Exportación del esquema raíz de configuración | `OpenClawSchema` |
| `plugin-sdk/provider-entry` | Helper de entrada de proveedor único | `defineSingleProviderPluginEntry` |
| `plugin-sdk/channel-core` | Definiciones y constructores enfocados de entrada de canal | `defineChannelPluginEntry`, `defineSetupPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase` |
| `plugin-sdk/setup` | Helpers compartidos del asistente de configuración | Prompts de listas de permitidos, constructores de estado de configuración |
| `plugin-sdk/setup-runtime` | Helpers de runtime en tiempo de configuración | Adaptadores de parches de configuración seguros para importación, helpers de notas de búsqueda, `promptResolvedAllowFrom`, `splitSetupEntries`, proxies delegados de configuración |
| `plugin-sdk/setup-adapter-runtime` | Helpers del adaptador de configuración | `createEnvPatchedAccountSetupAdapter` |
| `plugin-sdk/setup-tools` | Helpers de herramientas de configuración | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
| `plugin-sdk/account-core` | Helpers de múltiples cuentas | Helpers de lista/configuración/compuertas de acciones de cuenta |
| `plugin-sdk/account-id` | Helpers de id de cuenta | `DEFAULT_ACCOUNT_ID`, normalización de id de cuenta |
| `plugin-sdk/account-resolution` | Helpers de búsqueda de cuenta | Helpers de búsqueda de cuenta + respaldo predeterminado |
| `plugin-sdk/account-helpers` | Helpers de cuenta específicos | Helpers de lista de cuentas/acción de cuenta |
| `plugin-sdk/config-schema` | Exportación del esquema de configuración raíz | `OpenClawSchema` |
| `plugin-sdk/provider-entry` | Ayudante de entrada de proveedor único | `defineSingleProviderPluginEntry` |
| `plugin-sdk/channel-core` | Definiciones y constructores específicos de entrada de canal | `defineChannelPluginEntry`, `defineSetupPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase` |
| `plugin-sdk/setup` | Ayudantes compartidos del asistente de configuración | Prompts de lista de permitidos, constructores de estado de configuración |
| `plugin-sdk/setup-runtime` | Ayudantes de entorno de ejecución en tiempo de configuración | Adaptadores de parcheo de configuración seguros para importación, ayudantes de notas de búsqueda, `promptResolvedAllowFrom`, `splitSetupEntries`, proxies de configuración delegados |
| `plugin-sdk/setup-adapter-runtime` | Ayudantes del adaptador de configuración | `createEnvPatchedAccountSetupAdapter` |
| `plugin-sdk/setup-tools` | Ayudantes de herramientas de configuración | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
| `plugin-sdk/account-core` | Ayudantes de múltiples cuentas | Ayudantes de lista/configuración/puerta de acciones de cuenta |
| `plugin-sdk/account-id` | Ayudantes de id de cuenta | `DEFAULT_ACCOUNT_ID`, normalización de id de cuenta |
| `plugin-sdk/account-resolution` | Ayudantes de búsqueda de cuentas | Ayudantes de búsqueda de cuentas + fallback predeterminado |
| `plugin-sdk/account-helpers` | Ayudantes de cuenta específicos | Ayudantes de lista de cuentas/acciones de cuenta |
| `plugin-sdk/channel-setup` | Adaptadores del asistente de configuración | `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`, `createOptionalChannelSetupWizard`, además de `DEFAULT_ACCOUNT_ID`, `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, `splitSetupEntries` |
| `plugin-sdk/channel-pairing` | Primitivas de emparejamiento de DM | `createChannelPairingController` |
| `plugin-sdk/channel-reply-pipeline` | Cableado de prefijo de respuesta + escritura | `createChannelReplyPipeline` |
| `plugin-sdk/channel-pairing` | Primitivas de emparejamiento DM | `createChannelPairingController` |
| `plugin-sdk/channel-reply-pipeline` | Cableado de prefijo de respuesta + indicador de escritura | `createChannelReplyPipeline` |
| `plugin-sdk/channel-config-helpers` | Fábricas de adaptadores de configuración | `createHybridChannelConfigAdapter` |
| `plugin-sdk/channel-config-schema` | Constructores de esquema de configuración | Tipos de esquema de configuración de canal |
| `plugin-sdk/telegram-command-config` | Helpers de configuración de comandos de Telegram | Normalización de nombres de comando, recorte de descripciones, validación de duplicados/conflictos |
| `plugin-sdk/channel-config-schema` | Constructores de esquemas de configuración | Tipos de esquema de configuración de canal |
| `plugin-sdk/telegram-command-config` | Ayudantes de configuración de comandos de Telegram | Normalización de nombres de comandos, recorte de descripciones, validación de duplicados/conflictos |
| `plugin-sdk/channel-policy` | Resolución de políticas de grupo/DM | `resolveChannelGroupRequireMention` |
| `plugin-sdk/channel-lifecycle` | Seguimiento del estado de cuenta | `createAccountStatusSink` |
| `plugin-sdk/inbound-envelope` | Helpers de envoltorio entrante | Helpers compartidos de ruta + construcción de envoltorio |
| `plugin-sdk/inbound-reply-dispatch` | Helpers de respuesta entrante | Helpers compartidos de registro y despacho |
| `plugin-sdk/messaging-targets` | Análisis de objetivos de mensajería | Helpers de análisis/coincidencia de objetivos |
| `plugin-sdk/outbound-media` | Helpers de medios salientes | Carga compartida de medios salientes |
| `plugin-sdk/outbound-runtime` | Helpers de runtime saliente | Helpers delegados de identidad/envío saliente |
| `plugin-sdk/thread-bindings-runtime` | Helpers de bindings de hilo | Ciclo de vida de bindings de hilo y helpers de adaptador |
| `plugin-sdk/agent-media-payload` | Helpers heredados de carga útil de medios | Constructor de carga útil de medios de agente para diseños heredados de campos |
| `plugin-sdk/channel-runtime` | Shim obsoleto de compatibilidad | Solo utilidades heredadas de runtime de canal |
| `plugin-sdk/channel-lifecycle` | Seguimiento de estado de cuenta | `createAccountStatusSink` |
| `plugin-sdk/inbound-envelope` | Ayudantes de envelope de entrada | Ayudantes compartidos de enrutamiento + construcción de envelope |
| `plugin-sdk/inbound-reply-dispatch` | Ayudantes de respuesta entrante | Ayudantes compartidos de registro y despacho |
| `plugin-sdk/messaging-targets` | Análisis de destinos de mensajería | Ayudantes de análisis/coincidencia de destinos |
| `plugin-sdk/outbound-media` | Ayudantes de medios salientes | Carga compartida de medios salientes |
| `plugin-sdk/outbound-runtime` | Ayudantes de entorno de ejecución saliente | Ayudantes de identidad saliente/delegados de envío |
| `plugin-sdk/thread-bindings-runtime` | Ayudantes de asociación de hilos | Ciclo de vida y ayudantes de adaptadores de asociación de hilos |
| `plugin-sdk/agent-media-payload` | Ayudantes heredados de payload de medios | Constructor de payload de medios del agente para diseños heredados de campos |
| `plugin-sdk/channel-runtime` | Shim de compatibilidad obsoleto | Solo utilidades heredadas de entorno de ejecución de canal |
| `plugin-sdk/channel-send-result` | Tipos de resultado de envío | Tipos de resultado de respuesta |
| `plugin-sdk/runtime-store` | Almacenamiento persistente del plugin | `createPluginRuntimeStore` |
| `plugin-sdk/runtime` | Helpers amplios de runtime | Helpers de runtime/logging/backup/instalación de plugins |
| `plugin-sdk/runtime-env` | Helpers específicos de entorno de runtime | Logger/entorno de runtime, timeout, retry y helpers de backoff |
| `plugin-sdk/plugin-runtime` | Helpers compartidos de runtime de plugin | Helpers de comandos/hooks/http/interactivos de plugin |
| `plugin-sdk/hook-runtime` | Helpers de pipeline de hooks | Helpers compartidos del pipeline de hooks webhook/internos |
| `plugin-sdk/lazy-runtime` | Helpers de runtime diferido | `createLazyRuntimeModule`, `createLazyRuntimeMethod`, `createLazyRuntimeMethodBinder`, `createLazyRuntimeNamedExport`, `createLazyRuntimeSurface` |
| `plugin-sdk/process-runtime` | Helpers de proceso | Helpers compartidos de exec |
| `plugin-sdk/cli-runtime` | Helpers de runtime de CLI | Formato de comandos, esperas, helpers de versión |
| `plugin-sdk/gateway-runtime` | Helpers del Gateway | Cliente Gateway y helpers de parcheo de estado de canal |
| `plugin-sdk/config-runtime` | Helpers de configuración | Helpers de carga/escritura de configuración |
| `plugin-sdk/telegram-command-config` | Helpers de comandos de Telegram | Helpers de validación de comandos de Telegram estables como respaldo cuando la superficie de contrato empaquetada de Telegram no está disponible |
| `plugin-sdk/approval-runtime` | Helpers de prompts de aprobación | Carga útil de aprobación de exec/plugin, helpers de capacidad/perfil de aprobación, helpers nativos de routing/runtime de aprobación |
| `plugin-sdk/approval-auth-runtime` | Helpers de auth de aprobación | Resolución del aprobador, auth de acción en el mismo chat |
| `plugin-sdk/approval-client-runtime` | Helpers de cliente de aprobación | Helpers de perfil/filtro nativos de aprobación de exec |
| `plugin-sdk/approval-delivery-runtime` | Helpers de entrega de aprobación | Adaptadores nativos de capacidad/entrega de aprobación |
| `plugin-sdk/approval-gateway-runtime` | Helpers de Gateway de aprobación | Helper compartido de resolución de gateway de aprobación |
| `plugin-sdk/approval-handler-adapter-runtime` | Helpers de adaptador de aprobación | Helpers ligeros de carga de adaptadores nativos de aprobación para puntos de entrada de canal activos |
| `plugin-sdk/approval-handler-runtime` | Helpers de handler de aprobación | Helpers más amplios de runtime de handlers de aprobación; prefiere las superficies más específicas de adaptador/gateway cuando sean suficientes |
| `plugin-sdk/approval-native-runtime` | Helpers de objetivos de aprobación | Helpers nativos de binding de objetivo/cuenta de aprobación |
| `plugin-sdk/approval-reply-runtime` | Helpers de respuesta de aprobación | Helpers de carga útil de respuesta de aprobación de exec/plugin |
| `plugin-sdk/channel-runtime-context` | Helpers de contexto de runtime de canal | Helpers genéricos de registro/obtención/observación del contexto de runtime de canal |
| `plugin-sdk/security-runtime` | Helpers de seguridad | Helpers compartidos de confianza, restricción de DM, contenido externo y recopilación de secretos |
| `plugin-sdk/ssrf-policy` | Helpers de política SSRF | Helpers de lista de permitidos de hosts y política de red privada |
| `plugin-sdk/ssrf-runtime` | Helpers de runtime SSRF | Helpers de dispatcher fijado, fetch protegido y política SSRF |
| `plugin-sdk/collection-runtime` | Helpers de caché limitada | `pruneMapToMaxSize` |
| `plugin-sdk/diagnostic-runtime` | Helpers de restricción diagnóstica | `isDiagnosticFlagEnabled`, `isDiagnosticsEnabled` |
| `plugin-sdk/error-runtime` | Helpers de formato de errores | `formatUncaughtError`, `isApprovalNotFoundError`, helpers de grafo de errores |
| `plugin-sdk/fetch-runtime` | Helpers envueltos de fetch/proxy | `resolveFetch`, helpers de proxy |
| `plugin-sdk/host-runtime` | Helpers de normalización del host | `normalizeHostname`, `normalizeScpRemoteHost` |
| `plugin-sdk/retry-runtime` | Helpers de retry | `RetryConfig`, `retryAsync`, ejecutores de políticas |
| `plugin-sdk/allow-from` | Formateo de lista de permitidos | `formatAllowFromLowercase` |
| `plugin-sdk/allowlist-resolution` | Mapeo de entradas de lista de permitidos | `mapAllowlistResolutionInputs` |
| `plugin-sdk/command-auth` | Restricción de comandos y helpers de superficie de comandos | `resolveControlCommandGate`, helpers de autorización de remitente, helpers de registro de comandos |
| `plugin-sdk/secret-input` | Análisis de entrada secreta | Helpers de entrada secreta |
| `plugin-sdk/webhook-ingress` | Helpers de solicitud webhook | Utilidades de objetivo webhook |
| `plugin-sdk/webhook-request-guards` | Helpers de guardas de cuerpo webhook | Helpers de lectura/límite del cuerpo de solicitud |
| `plugin-sdk/reply-runtime` | Runtime compartido de respuesta | Despacho entrante, heartbeat, planificador de respuesta, fragmentación |
| `plugin-sdk/reply-dispatch-runtime` | Helpers específicos de despacho de respuesta | Helpers de finalización + despacho de proveedor |
| `plugin-sdk/reply-history` | Helpers de historial de respuesta | `buildHistoryContext`, `buildPendingHistoryContextFromMap`, `recordPendingHistoryEntry`, `clearHistoryEntriesIfEnabled` |
| `plugin-sdk/runtime-store` | Almacenamiento persistente de plugins | `createPluginRuntimeStore` |
| `plugin-sdk/runtime` | Ayudantes amplios de entorno de ejecución | Ayudantes de entorno de ejecución/logs/backup/instalación de plugins |
| `plugin-sdk/runtime-env` | Ayudantes específicos de entorno de ejecución | Logger/entorno de ejecución, tiempo de espera, reintentos y ayudantes de backoff |
| `plugin-sdk/plugin-runtime` | Ayudantes compartidos de entorno de ejecución de plugins | Ayudantes de comandos/hooks/http/interactividad de plugins |
| `plugin-sdk/hook-runtime` | Ayudantes de canalización de hooks | Ayudantes compartidos de canalización de webhooks/hooks internos |
| `plugin-sdk/lazy-runtime` | Ayudantes de entorno de ejecución perezoso | `createLazyRuntimeModule`, `createLazyRuntimeMethod`, `createLazyRuntimeMethodBinder`, `createLazyRuntimeNamedExport`, `createLazyRuntimeSurface` |
| `plugin-sdk/process-runtime` | Ayudantes de procesos | Ayudantes compartidos de exec |
| `plugin-sdk/cli-runtime` | Ayudantes de entorno de ejecución de CLI | Formateo de comandos, esperas, ayudantes de versión |
| `plugin-sdk/gateway-runtime` | Ayudantes de gateway | Cliente de gateway y ayudantes de parcheo de estado de canal |
| `plugin-sdk/config-runtime` | Ayudantes de configuración | Ayudantes de carga/escritura de configuración |
| `plugin-sdk/telegram-command-config` | Ayudantes de comandos de Telegram | Ayudantes de validación de comandos de Telegram con fallback estable cuando la superficie contractual incluida de Telegram no está disponible |
| `plugin-sdk/approval-runtime` | Ayudantes de prompts de aprobación | Payload de aprobación de exec/plugin, ayudantes de capacidad/perfil de aprobación, ayudantes nativos de enrutamiento/entorno de ejecución de aprobaciones |
| `plugin-sdk/approval-auth-runtime` | Ayudantes de autenticación de aprobación | Resolución de aprobadores, autenticación de acciones en el mismo chat |
| `plugin-sdk/approval-client-runtime` | Ayudantes de cliente de aprobación | Ayudantes nativos de perfil/filtro de aprobación de exec |
| `plugin-sdk/approval-delivery-runtime` | Ayudantes de entrega de aprobación | Adaptadores nativos de capacidad/entrega de aprobación |
| `plugin-sdk/approval-gateway-runtime` | Ayudantes de gateway de aprobación | Ayudante compartido de resolución de gateway de aprobación |
| `plugin-sdk/approval-handler-adapter-runtime` | Ayudantes de adaptador de aprobación | Ayudantes ligeros de carga de adaptadores nativos de aprobación para puntos de entrada de canal activos |
| `plugin-sdk/approval-handler-runtime` | Ayudantes de controlador de aprobación | Ayudantes más amplios del entorno de ejecución del controlador de aprobación; prefiere las uniones más específicas de adaptador/gateway cuando sean suficientes |
| `plugin-sdk/approval-native-runtime` | Ayudantes de destino de aprobación | Ayudantes nativos de asociación de destino/cuenta de aprobación |
| `plugin-sdk/approval-reply-runtime` | Ayudantes de respuesta de aprobación | Ayudantes de payload de respuesta de aprobación de exec/plugin |
| `plugin-sdk/channel-runtime-context` | Ayudantes de contexto de entorno de ejecución de canal | Ayudantes genéricos de registro/obtención/observación de contexto de entorno de ejecución de canal |
| `plugin-sdk/security-runtime` | Ayudantes de seguridad | Ayudantes compartidos de confianza, control DM, contenido externo y recopilación de secretos |
| `plugin-sdk/ssrf-policy` | Ayudantes de políticas SSRF | Ayudantes de lista de permitidos de hosts y políticas de red privada |
| `plugin-sdk/ssrf-runtime` | Ayudantes de entorno de ejecución SSRF | Dispatcher fijado, fetch protegido, ayudantes de políticas SSRF |
| `plugin-sdk/collection-runtime` | Ayudantes de caché acotada | `pruneMapToMaxSize` |
| `plugin-sdk/diagnostic-runtime` | Ayudantes de control de diagnósticos | `isDiagnosticFlagEnabled`, `isDiagnosticsEnabled` |
| `plugin-sdk/error-runtime` | Ayudantes de formato de errores | `formatUncaughtError`, `isApprovalNotFoundError`, ayudantes de grafo de errores |
| `plugin-sdk/fetch-runtime` | Ayudantes de fetch/proxy envueltos | `resolveFetch`, ayudantes de proxy |
| `plugin-sdk/host-runtime` | Ayudantes de normalización del host | `normalizeHostname`, `normalizeScpRemoteHost` |
| `plugin-sdk/retry-runtime` | Ayudantes de reintento | `RetryConfig`, `retryAsync`, ejecutores de políticas |
| `plugin-sdk/allow-from` | Formateo de listas de permitidos | `formatAllowFromLowercase` |
| `plugin-sdk/allowlist-resolution` | Mapeo de entrada de listas de permitidos | `mapAllowlistResolutionInputs` |
| `plugin-sdk/command-auth` | Control de comandos y ayudantes de superficie de comandos | `resolveControlCommandGate`, ayudantes de autorización de remitente, ayudantes de registro de comandos |
| `plugin-sdk/command-status` | Renderizadores de estado/ayuda de comandos | `buildCommandsMessage`, `buildCommandsMessagePaginated`, `buildHelpMessage` |
| `plugin-sdk/secret-input` | Análisis de entrada de secretos | Ayudantes de entrada de secretos |
| `plugin-sdk/webhook-ingress` | Ayudantes de solicitudes webhook | Utilidades de destino webhook |
| `plugin-sdk/webhook-request-guards` | Ayudantes de protección de solicitudes webhook | Ayudantes de lectura/límite de cuerpo de solicitud |
| `plugin-sdk/reply-runtime` | Entorno de ejecución compartido de respuestas | Despacho entrante, heartbeat, planificador de respuestas, fragmentación |
| `plugin-sdk/reply-dispatch-runtime` | Ayudantes específicos de despacho de respuestas | Ayudantes de finalización + despacho de proveedor |
| `plugin-sdk/reply-history` | Ayudantes de historial de respuestas | `buildHistoryContext`, `buildPendingHistoryContextFromMap`, `recordPendingHistoryEntry`, `clearHistoryEntriesIfEnabled` |
| `plugin-sdk/reply-reference` | Planificación de referencias de respuesta | `createReplyReferencePlanner` |
| `plugin-sdk/reply-chunking` | Helpers de fragmentación de respuesta | Helpers de fragmentación de texto/markdown |
| `plugin-sdk/session-store-runtime` | Helpers de almacén de sesiones | Ruta del almacén + helpers de updated-at |
| `plugin-sdk/state-paths` | Helpers de rutas de estado | Helpers de directorios de estado y OAuth |
| `plugin-sdk/routing` | Helpers de routing/clave de sesión | `resolveAgentRoute`, `buildAgentSessionKey`, `resolveDefaultAgentBoundAccountId`, helpers de normalización de clave de sesión |
| `plugin-sdk/status-helpers` | Helpers de estado de canal | Constructores de resúmenes de estado de canal/cuenta, valores predeterminados de estado de runtime, helpers de metadatos de incidencias |
| `plugin-sdk/target-resolver-runtime` | Helpers de resolución de objetivos | Helpers compartidos de resolución de objetivos |
| `plugin-sdk/string-normalization-runtime` | Helpers de normalización de cadenas | Helpers de normalización de slug/cadenas |
| `plugin-sdk/request-url` | Helpers de URL de solicitud | Extrae URLs de cadena de entradas similares a solicitudes |
| `plugin-sdk/run-command` | Helpers de comandos temporizados | Ejecutor de comandos temporizados con stdout/stderr normalizados |
| `plugin-sdk/reply-chunking` | Ayudantes de fragmentación de respuestas | Ayudantes de fragmentación de texto/Markdown |
| `plugin-sdk/session-store-runtime` | Ayudantes de almacén de sesiones | Ayudantes de ruta de almacén + updated-at |
| `plugin-sdk/state-paths` | Ayudantes de rutas de estado | Ayudantes de directorios de estado y OAuth |
| `plugin-sdk/routing` | Ayudantes de enrutamiento/clave de sesión | `resolveAgentRoute`, `buildAgentSessionKey`, `resolveDefaultAgentBoundAccountId`, ayudantes de normalización de claves de sesión |
| `plugin-sdk/status-helpers` | Ayudantes de estado de canal | Constructores de resúmenes de estado de canal/cuenta, valores predeterminados de estado de entorno de ejecución, ayudantes de metadatos de incidencias |
| `plugin-sdk/target-resolver-runtime` | Ayudantes de resolución de destino | Ayudantes compartidos de resolución de destino |
| `plugin-sdk/string-normalization-runtime` | Ayudantes de normalización de cadenas | Ayudantes de normalización de slug/cadenas |
| `plugin-sdk/request-url` | Ayudantes de URL de solicitud | Extrae URL de cadena de entradas tipo solicitud |
| `plugin-sdk/run-command` | Ayudantes de comandos temporizados | Ejecutor de comandos temporizados con stdout/stderr normalizados |
| `plugin-sdk/param-readers` | Lectores de parámetros | Lectores comunes de parámetros de herramientas/CLI |
| `plugin-sdk/tool-send` | Extracción de envío de herramientas | Extrae campos canónicos de objetivo de envío desde argumentos de herramientas |
| `plugin-sdk/temp-path` | Helpers de ruta temporal | Helpers compartidos de ruta temporal de descarga |
| `plugin-sdk/logging-core` | Helpers de logging | Logger de subsistema y helpers de redacción |
| `plugin-sdk/markdown-table-runtime` | Helpers de tablas Markdown | Helpers de modo de tabla Markdown |
| `plugin-sdk/reply-payload` | Tipos de respuesta de mensaje | Tipos de carga útil de respuesta |
| `plugin-sdk/provider-setup` | Helpers seleccionados de configuración de proveedores locales/autohospedados | Helpers de descubrimiento/configuración de proveedores autohospedados |
| `plugin-sdk/self-hosted-provider-setup` | Helpers enfocados de configuración de proveedores autohospedados compatibles con OpenAI | Los mismos helpers de descubrimiento/configuración de proveedores autohospedados |
| `plugin-sdk/provider-auth-runtime` | Helpers de auth de runtime del proveedor | Helpers de resolución de API key en runtime |
| `plugin-sdk/provider-auth-api-key` | Helpers de configuración de API key del proveedor | Helpers de onboarding/escritura de perfil de API key |
| `plugin-sdk/provider-auth-result` | Helpers de resultado de auth del proveedor | Constructor estándar de resultado de auth OAuth |
| `plugin-sdk/provider-auth-login` | Helpers de login interactivo del proveedor | Helpers compartidos de login interactivo |
| `plugin-sdk/provider-env-vars` | Helpers de variables de entorno del proveedor | Helpers de búsqueda de variables de entorno de auth del proveedor |
| `plugin-sdk/provider-model-shared` | Helpers compartidos de modelo/repetición del proveedor | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, constructores compartidos de políticas de repetición, helpers de endpoints del proveedor y helpers de normalización de id de modelo |
| `plugin-sdk/provider-catalog-shared` | Helpers compartidos de catálogo del proveedor | `findCatalogTemplate`, `buildSingleProviderApiKeyCatalog`, `supportsNativeStreamingUsageCompat`, `applyProviderNativeStreamingUsageCompat` |
| `plugin-sdk/provider-onboard` | Parches de onboarding del proveedor | Helpers de configuración de onboarding |
| `plugin-sdk/provider-http` | Helpers HTTP del proveedor | Helpers genéricos de HTTP/capacidades de endpoint del proveedor |
| `plugin-sdk/provider-web-fetch` | Helpers de web-fetch del proveedor | Helpers de registro/caché del proveedor web-fetch |
| `plugin-sdk/provider-web-search-contract` | Helpers de contrato de búsqueda web del proveedor | Helpers específicos de contrato de configuración/credenciales de búsqueda web como `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig` y setters/getters de credenciales con alcance |
| `plugin-sdk/provider-web-search` | Helpers de búsqueda web del proveedor | Helpers de registro/caché/runtime del proveedor de búsqueda web |
| `plugin-sdk/provider-tools` | Helpers de compatibilidad de herramientas/esquema del proveedor | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, limpieza + diagnósticos de esquema Gemini y helpers de compatibilidad xAI como `resolveXaiModelCompatPatch` / `applyXaiModelCompat` |
| `plugin-sdk/provider-usage` | Helpers de uso del proveedor | `fetchClaudeUsage`, `fetchGeminiUsage`, `fetchGithubCopilotUsage` y otros helpers de uso del proveedor |
| `plugin-sdk/provider-stream` | Helpers de wrapper de flujo del proveedor | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, tipos de wrapper de flujo y helpers compartidos de wrappers Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot |
| `plugin-sdk/keyed-async-queue` | Cola async ordenada | `KeyedAsyncQueue` |
| `plugin-sdk/media-runtime` | Helpers compartidos de medios | Helpers de obtención/transformación/almacenamiento de medios más constructores de carga útil de medios |
| `plugin-sdk/media-generation-runtime` | Helpers compartidos de generación de medios | Helpers compartidos de failover, selección de candidatos y mensajes de modelo ausente para generación de imagen/video/música |
| `plugin-sdk/media-understanding` | Helpers de comprensión de medios | Tipos de proveedor de comprensión de medios más exportaciones de helpers de imagen/audio orientados al proveedor |
| `plugin-sdk/text-runtime` | Helpers compartidos de texto | Eliminación de texto visible para el asistente, helpers de renderizado/fragmentación/tablas Markdown, helpers de redacción, helpers de etiquetas de directiva, utilidades de texto seguro y helpers relacionados de texto/logging |
| `plugin-sdk/text-chunking` | Helpers de fragmentación de texto | Helper de fragmentación de texto saliente |
| `plugin-sdk/speech` | Helpers de voz | Tipos de proveedor de voz más helpers orientados al proveedor para directivas, registro y validación |
| `plugin-sdk/speech-core` | Núcleo compartido de voz | Tipos de proveedor de voz, registro, directivas, normalización |
| `plugin-sdk/realtime-transcription` | Helpers de transcripción en tiempo real | Tipos de proveedor y helpers de registro |
| `plugin-sdk/realtime-voice` | Helpers de voz en tiempo real | Tipos de proveedor y helpers de registro |
| `plugin-sdk/image-generation-core` | Núcleo compartido de generación de imágenes | Tipos de generación de imágenes, failover, auth y helpers de registro |
| `plugin-sdk/music-generation` | Helpers de generación musical | Tipos de proveedor/solicitud/resultado de generación musical |
| `plugin-sdk/music-generation-core` | Núcleo compartido de generación musical | Tipos de generación musical, helpers de failover, búsqueda de proveedor y análisis de model-ref |
| `plugin-sdk/video-generation` | Helpers de generación de video | Tipos de proveedor/solicitud/resultado de generación de video |
| `plugin-sdk/video-generation-core` | Núcleo compartido de generación de video | Tipos de generación de video, helpers de failover, búsqueda de proveedor y análisis de model-ref |
| `plugin-sdk/interactive-runtime` | Helpers de respuesta interactiva | Normalización/reducción de carga útil de respuesta interactiva |
| `plugin-sdk/tool-payload` | Extracción de payload de herramientas | Extrae payloads normalizados de objetos de resultado de herramientas |
| `plugin-sdk/tool-send` | Extracción de envío de herramientas | Extrae campos canónicos de destino de envío desde argumentos de herramientas |
| `plugin-sdk/temp-path` | Ayudantes de rutas temporales | Ayudantes compartidos de rutas temporales de descarga |
| `plugin-sdk/logging-core` | Ayudantes de logging | Logger de subsistema y ayudantes de redacción |
| `plugin-sdk/markdown-table-runtime` | Ayudantes de tablas Markdown | Ayudantes de modo de tabla Markdown |
| `plugin-sdk/reply-payload` | Tipos de respuesta de mensajes | Tipos de payload de respuesta |
| `plugin-sdk/provider-setup` | Ayudantes curados de configuración de proveedores locales/autohospedados | Ayudantes de detección/configuración de proveedores autohospedados |
| `plugin-sdk/self-hosted-provider-setup` | Ayudantes específicos de configuración de proveedores autohospedados compatibles con OpenAI | Los mismos ayudantes de detección/configuración de proveedores autohospedados |
| `plugin-sdk/provider-auth-runtime` | Ayudantes de autenticación de proveedores en tiempo de ejecución | Ayudantes de resolución de claves API en tiempo de ejecución |
| `plugin-sdk/provider-auth-api-key` | Ayudantes de configuración de claves API de proveedores | Ayudantes de incorporación/escritura de perfil de clave API |
| `plugin-sdk/provider-auth-result` | Ayudantes de resultado de autenticación de proveedores | Constructor estándar de resultado de autenticación OAuth |
| `plugin-sdk/provider-auth-login` | Ayudantes de inicio de sesión interactivo de proveedores | Ayudantes compartidos de inicio de sesión interactivo |
| `plugin-sdk/provider-env-vars` | Ayudantes de variables de entorno de proveedores | Ayudantes de búsqueda de variables de entorno de autenticación del proveedor |
| `plugin-sdk/provider-model-shared` | Ayudantes compartidos de modelos/replay de proveedores | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, constructores compartidos de políticas de replay, ayudantes de endpoints de proveedores y ayudantes de normalización de id de modelos |
| `plugin-sdk/provider-catalog-shared` | Ayudantes compartidos de catálogo de proveedores | `findCatalogTemplate`, `buildSingleProviderApiKeyCatalog`, `supportsNativeStreamingUsageCompat`, `applyProviderNativeStreamingUsageCompat` |
| `plugin-sdk/provider-onboard` | Parches de incorporación de proveedores | Ayudantes de configuración de incorporación |
| `plugin-sdk/provider-http` | Ayudantes HTTP de proveedores | Ayudantes genéricos de HTTP/capacidades de endpoints de proveedores |
| `plugin-sdk/provider-web-fetch` | Ayudantes de web-fetch de proveedores | Ayudantes de registro/caché de proveedores web-fetch |
| `plugin-sdk/provider-web-search-config-contract` | Ayudantes de configuración de búsqueda web de proveedores | Ayudantes específicos de configuración/credenciales de búsqueda web para proveedores que no necesitan cableado de habilitación del plugin |
| `plugin-sdk/provider-web-search-contract` | Ayudantes contractuales de búsqueda web de proveedores | Ayudantes contractuales específicos de configuración/credenciales de búsqueda web como `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig` y setters/getters de credenciales con alcance |
| `plugin-sdk/provider-web-search` | Ayudantes de búsqueda web de proveedores | Ayudantes de registro/caché/entorno de ejecución de proveedores de búsqueda web |
| `plugin-sdk/provider-tools` | Ayudantes de compatibilidad de herramientas/esquemas de proveedores | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, limpieza + diagnósticos de esquemas Gemini y ayudantes de compatibilidad xAI como `resolveXaiModelCompatPatch` / `applyXaiModelCompat` |
| `plugin-sdk/provider-usage` | Ayudantes de uso de proveedores | `fetchClaudeUsage`, `fetchGeminiUsage`, `fetchGithubCopilotUsage` y otros ayudantes de uso de proveedores |
| `plugin-sdk/provider-stream` | Ayudantes de envoltorio de streams de proveedores | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, tipos de envoltorios de streams y ayudantes compartidos de envoltorios Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot |
| `plugin-sdk/keyed-async-queue` | Cola asíncrona ordenada | `KeyedAsyncQueue` |
| `plugin-sdk/media-runtime` | Ayudantes compartidos de medios | Ayudantes de fetch/transformación/almacenamiento de medios más constructores de payload de medios |
| `plugin-sdk/media-generation-runtime` | Ayudantes compartidos de generación de medios | Ayudantes compartidos de failover, selección de candidatos y mensajes de modelo faltante para generación de imágenes/video/música |
| `plugin-sdk/media-understanding` | Ayudantes de comprensión de medios | Tipos de proveedores de comprensión de medios más exportaciones de ayudantes de imagen/audio orientados a proveedores |
| `plugin-sdk/text-runtime` | Ayudantes compartidos de texto | Eliminación de texto visible para el asistente, renderizado/fragmentación/tablas Markdown, ayudantes de redacción, ayudantes de etiquetas de directivas, utilidades de texto seguro y ayudantes relacionados de texto/logging |
| `plugin-sdk/text-chunking` | Ayudantes de fragmentación de texto | Ayudante de fragmentación de texto saliente |
| `plugin-sdk/speech` | Ayudantes de voz | Tipos de proveedores de voz más exportaciones orientadas a proveedores de directivas, registro y validación |
| `plugin-sdk/speech-core` | Núcleo compartido de voz | Tipos de proveedores de voz, registro, directivas, normalización |
| `plugin-sdk/realtime-transcription` | Ayudantes de transcripción en tiempo real | Tipos de proveedores y ayudantes de registro |
| `plugin-sdk/realtime-voice` | Ayudantes de voz en tiempo real | Tipos de proveedores y ayudantes de registro |
| `plugin-sdk/image-generation-core` | Núcleo compartido de generación de imágenes | Tipos de generación de imágenes, failover, autenticación y ayudantes de registro |
| `plugin-sdk/music-generation` | Ayudantes de generación musical | Tipos de proveedor/solicitud/resultado de generación musical |
| `plugin-sdk/music-generation-core` | Núcleo compartido de generación musical | Tipos de generación musical, ayudantes de failover, búsqueda de proveedores y análisis de referencias de modelos |
| `plugin-sdk/video-generation` | Ayudantes de generación de video | Tipos de proveedor/solicitud/resultado de generación de video |
| `plugin-sdk/video-generation-core` | Núcleo compartido de generación de video | Tipos de generación de video, ayudantes de failover, búsqueda de proveedores y análisis de referencias de modelos |
| `plugin-sdk/interactive-runtime` | Ayudantes de respuestas interactivas | Normalización/reducción de payload de respuestas interactivas |
| `plugin-sdk/channel-config-primitives` | Primitivas de configuración de canal | Primitivas específicas de esquema de configuración de canal |
| `plugin-sdk/channel-config-writes` | Helpers de escritura de configuración de canal | Helpers de autorización de escritura de configuración de canal |
| `plugin-sdk/channel-plugin-common` | Preludio compartido de canal | Exportaciones compartidas del preludio de plugin de canal |
| `plugin-sdk/channel-status` | Helpers de estado de canal | Helpers compartidos de instantánea/resumen de estado de canal |
| `plugin-sdk/allowlist-config-edit` | Helpers de configuración de lista de permitidos | Helpers de edición/lectura de configuración de lista de permitidos |
| `plugin-sdk/group-access` | Helpers de acceso a grupos | Helpers compartidos de decisión de acceso a grupos |
| `plugin-sdk/direct-dm` | Helpers de DM directo | Helpers compartidos de auth/protección para DM directo |
| `plugin-sdk/extension-shared` | Helpers compartidos de extensiones | Primitivas de canal pasivo/estado y helper de proxy ambiental |
| `plugin-sdk/webhook-targets` | Helpers de objetivos webhook | Registro de objetivos webhook y helpers de instalación de rutas |
| `plugin-sdk/webhook-path` | Helpers de ruta webhook | Helpers de normalización de ruta webhook |
| `plugin-sdk/web-media` | Helpers compartidos de medios web | Helpers de carga de medios remotos/locales |
| `plugin-sdk/zod` | Reexportación de Zod | `zod` reexportado para consumidores del plugin SDK |
| `plugin-sdk/memory-core` | Helpers empaquetados de memory-core | Superficie helper de administrador/configuración/archivo/CLI de memoria |
| `plugin-sdk/memory-core-engine-runtime` | Fachada de runtime del motor de memoria | Fachada de runtime de índice/búsqueda de memoria |
| `plugin-sdk/channel-config-writes` | Ayudantes de escritura de configuración de canal | Ayudantes de autorización de escritura de configuración de canal |
| `plugin-sdk/channel-plugin-common` | Preludio compartido de canal | Exportaciones compartidas de preludio de plugin de canal |
| `plugin-sdk/channel-status` | Ayudantes de estado de canal | Ayudantes compartidos de instantáneas/resúmenes de estado de canal |
| `plugin-sdk/allowlist-config-edit` | Ayudantes de configuración de lista de permitidos | Ayudantes de edición/lectura de lista de permitidos |
| `plugin-sdk/group-access` | Ayudantes de acceso a grupos | Ayudantes compartidos de decisiones de acceso a grupos |
| `plugin-sdk/direct-dm` | Ayudantes de DM directo | Ayudantes compartidos de autenticación/protección de DM directo |
| `plugin-sdk/extension-shared` | Ayudantes compartidos de extensiones | Primitivas de canal/estado pasivo y ayudantes de proxy ambiental |
| `plugin-sdk/webhook-targets` | Ayudantes de destino webhook | Registro de destinos webhook y ayudantes de instalación de rutas |
| `plugin-sdk/webhook-path` | Ayudantes de ruta webhook | Ayudantes de normalización de rutas webhook |
| `plugin-sdk/web-media` | Ayudantes compartidos de medios web | Ayudantes de carga de medios remotos/locales |
| `plugin-sdk/zod` | Reexportación de Zod | Reexportación de `zod` para consumidores del SDK de plugins |
| `plugin-sdk/memory-core` | Ayudantes incluidos de memory-core | Superficie de ayudantes de gestor/configuración/archivo/CLI de memoria |
| `plugin-sdk/memory-core-engine-runtime` | Fachada de entorno de ejecución del motor de memoria | Fachada de entorno de ejecución de índice/búsqueda de memoria |
| `plugin-sdk/memory-core-host-engine-foundation` | Motor base del host de memoria | Exportaciones del motor base del host de memoria |
| `plugin-sdk/memory-core-host-engine-embeddings` | Motor de embeddings del host de memoria | Exportaciones del motor de embeddings del host de memoria |
| `plugin-sdk/memory-core-host-engine-qmd` | Motor QMD del host de memoria | Exportaciones del motor QMD del host de memoria |
| `plugin-sdk/memory-core-host-engine-storage` | Motor de almacenamiento del host de memoria | Exportaciones del motor de almacenamiento del host de memoria |
| `plugin-sdk/memory-core-host-multimodal` | Helpers multimodales del host de memoria | Helpers multimodales del host de memoria |
| `plugin-sdk/memory-core-host-query` | Helpers de consultas del host de memoria | Helpers de consultas del host de memoria |
| `plugin-sdk/memory-core-host-secret` | Helpers de secretos del host de memoria | Helpers de secretos del host de memoria |
| `plugin-sdk/memory-core-host-events` | Helpers de diario de eventos del host de memoria | Helpers de diario de eventos del host de memoria |
| `plugin-sdk/memory-core-host-status` | Helpers de estado del host de memoria | Helpers de estado del host de memoria |
| `plugin-sdk/memory-core-host-runtime-cli` | Runtime CLI del host de memoria | Helpers de runtime CLI del host de memoria |
| `plugin-sdk/memory-core-host-runtime-core` | Runtime principal del host de memoria | Helpers de runtime principal del host de memoria |
| `plugin-sdk/memory-core-host-runtime-files` | Helpers de archivos/runtime del host de memoria | Helpers de archivos/runtime del host de memoria |
| `plugin-sdk/memory-host-core` | Alias de runtime principal del host de memoria | Alias neutral de proveedor para helpers del runtime principal del host de memoria |
| `plugin-sdk/memory-host-events` | Alias del diario de eventos del host de memoria | Alias neutral de proveedor para helpers del diario de eventos del host de memoria |
| `plugin-sdk/memory-host-files` | Alias de archivos/runtime del host de memoria | Alias neutral de proveedor para helpers de archivos/runtime del host de memoria |
| `plugin-sdk/memory-host-markdown` | Helpers de markdown gestionado | Helpers compartidos de markdown gestionado para plugins adyacentes a memoria |
| `plugin-sdk/memory-host-search` | Fachada activa de búsqueda en memoria | Fachada lazy del runtime del administrador de búsqueda de memoria activa |
| `plugin-sdk/memory-host-status` | Alias de estado del host de memoria | Alias neutral de proveedor para helpers de estado del host de memoria |
| `plugin-sdk/memory-lancedb` | Helpers empaquetados de memory-lancedb | Superficie helper de memory-lancedb |
| `plugin-sdk/testing` | Utilidades de prueba | Helpers y mocks de prueba |
| `plugin-sdk/memory-core-host-multimodal` | Ayudantes multimodales del host de memoria | Ayudantes multimodales del host de memoria |
| `plugin-sdk/memory-core-host-query` | Ayudantes de consultas del host de memoria | Ayudantes de consultas del host de memoria |
| `plugin-sdk/memory-core-host-secret` | Ayudantes de secretos del host de memoria | Ayudantes de secretos del host de memoria |
| `plugin-sdk/memory-core-host-events` | Ayudantes de registro de eventos del host de memoria | Ayudantes de registro de eventos del host de memoria |
| `plugin-sdk/memory-core-host-status` | Ayudantes de estado del host de memoria | Ayudantes de estado del host de memoria |
| `plugin-sdk/memory-core-host-runtime-cli` | Entorno de ejecución CLI del host de memoria | Ayudantes de entorno de ejecución CLI del host de memoria |
| `plugin-sdk/memory-core-host-runtime-core` | Entorno de ejecución central del host de memoria | Ayudantes del entorno de ejecución central del host de memoria |
| `plugin-sdk/memory-core-host-runtime-files` | Ayudantes de archivos/entorno de ejecución del host de memoria | Ayudantes de archivos/entorno de ejecución del host de memoria |
| `plugin-sdk/memory-host-core` | Alias de entorno de ejecución central del host de memoria | Alias neutral respecto al proveedor para ayudantes del entorno de ejecución central del host de memoria |
| `plugin-sdk/memory-host-events` | Alias de registro de eventos del host de memoria | Alias neutral respecto al proveedor para ayudantes del registro de eventos del host de memoria |
| `plugin-sdk/memory-host-files` | Alias de archivos/entorno de ejecución del host de memoria | Alias neutral respecto al proveedor para ayudantes de archivos/entorno de ejecución del host de memoria |
| `plugin-sdk/memory-host-markdown` | Ayudantes de Markdown gestionado | Ayudantes compartidos de Markdown gestionado para plugins cercanos a la memoria |
| `plugin-sdk/memory-host-search` | Fachada de búsqueda activa de memoria | Fachada perezosa del entorno de ejecución del gestor de búsqueda de memoria activa |
| `plugin-sdk/memory-host-status` | Alias de estado del host de memoria | Alias neutral respecto al proveedor para ayudantes de estado del host de memoria |
| `plugin-sdk/memory-lancedb` | Ayudantes incluidos de memory-lancedb | Superficie de ayudantes de memory-lancedb |
| `plugin-sdk/testing` | Utilidades de prueba | Ayudantes y mocks de prueba |
</Accordion>
Esta tabla es intencionalmente el subconjunto común de migración, no toda la
superficie del SDK. La lista completa de más de 200 puntos de entrada está en
Esta tabla es intencionalmente el subconjunto común de migración, no la superficie completa del SDK.
La lista completa de más de 200 puntos de entrada se encuentra en
`scripts/lib/plugin-sdk-entrypoints.json`.
Esa lista todavía incluye algunas superficies helper de plugins empaquetados como
Esa lista sigue incluyendo algunas uniones de ayudantes de plugins incluidos como
`plugin-sdk/feishu`, `plugin-sdk/feishu-setup`, `plugin-sdk/zalo`,
`plugin-sdk/zalo-setup` y `plugin-sdk/matrix*`. Siguen exportándose para
mantenimiento y compatibilidad de plugins empaquetados, pero se omiten intencionalmente
mantenimiento y compatibilidad de plugins incluidos, pero se omiten intencionalmente
de la tabla común de migración y no son el objetivo recomendado para
código nuevo de plugins.
La misma regla se aplica a otras familias de helpers empaquetados como:
La misma regla se aplica a otras familias de ayudantes incluidos como:
- helpers de compatibilidad con navegador: `plugin-sdk/browser-cdp`, `plugin-sdk/browser-config-runtime`, `plugin-sdk/browser-config-support`, `plugin-sdk/browser-control-auth`, `plugin-sdk/browser-node-runtime`, `plugin-sdk/browser-profiles`, `plugin-sdk/browser-security-runtime`, `plugin-sdk/browser-setup-tools`, `plugin-sdk/browser-support`
- ayudantes de soporte de navegador: `plugin-sdk/browser-cdp`, `plugin-sdk/browser-config-runtime`, `plugin-sdk/browser-config-support`, `plugin-sdk/browser-control-auth`, `plugin-sdk/browser-node-runtime`, `plugin-sdk/browser-profiles`, `plugin-sdk/browser-security-runtime`, `plugin-sdk/browser-setup-tools`, `plugin-sdk/browser-support`
- Matrix: `plugin-sdk/matrix*`
- LINE: `plugin-sdk/line*`
- IRC: `plugin-sdk/irc*`
- superficies de helpers/plugins empaquetados como `plugin-sdk/googlechat`,
- superficies de ayudantes/plugins incluidos como `plugin-sdk/googlechat`,
`plugin-sdk/zalouser`, `plugin-sdk/bluebubbles*`,
`plugin-sdk/mattermost*`, `plugin-sdk/msteams`,
`plugin-sdk/nextcloud-talk`, `plugin-sdk/nostr`, `plugin-sdk/tlon`,
@ -369,39 +371,39 @@ La misma regla se aplica a otras familias de helpers empaquetados como:
`plugin-sdk/diagnostics-otel`, `plugin-sdk/diffs`, `plugin-sdk/llm-task`,
`plugin-sdk/thread-ownership` y `plugin-sdk/voice-call`
`plugin-sdk/github-copilot-token` expone actualmente la superficie específica de helpers de token
`plugin-sdk/github-copilot-token` actualmente expone la superficie específica de ayudantes de token
`DEFAULT_COPILOT_API_BASE_URL`,
`deriveCopilotApiBaseUrlFromToken` y `resolveCopilotApiToken`.
Usa la importación más específica que se ajuste a la tarea. Si no encuentras una exportación,
consulta el código fuente en `src/plugin-sdk/` o pregunta en Discord.
Usa la importación más específica que se ajuste al trabajo. Si no puedes encontrar una exportación,
revisa el código fuente en `src/plugin-sdk/` o pregunta en Discord.
## Cronograma de eliminación
| Cuándo | Qué ocurre |
| -------------------- | --------------------------------------------------------------------- |
| **Ahora** | Las superficies obsoletas emiten advertencias en tiempo de ejecución |
| Cuándo | Qué ocurre |
| ---------------------- | ----------------------------------------------------------------------- |
| **Ahora** | Las superficies obsoletas emiten advertencias en tiempo de ejecución |
| **Próxima versión principal** | Las superficies obsoletas se eliminarán; los plugins que sigan usándolas fallarán |
Todos los plugins principales ya se han migrado. Los plugins externos deberían migrar
antes de la próxima versión principal.
## Suprimir temporalmente las advertencias
## Cómo suprimir temporalmente las advertencias
Configura estas variables de entorno mientras trabajas en la migración:
Establece estas variables de entorno mientras trabajas en la migración:
```bash
OPENCLAW_SUPPRESS_PLUGIN_SDK_COMPAT_WARNING=1 openclaw gateway run
OPENCLAW_SUPPRESS_EXTENSION_API_WARNING=1 openclaw gateway run
```
Esto es una vía de escape temporal, no una solución permanente.
Esta es una vía de escape temporal, no una solución permanente.
## Relacionado
- [Primeros pasos](/es/plugins/building-plugins) — crea tu primer plugin
- [Resumen del SDK](/es/plugins/sdk-overview) — referencia completa de importación por subrutas
- [Plugins de canal](/es/plugins/sdk-channel-plugins) — crear plugins de canal
- [Plugins de proveedor](/es/plugins/sdk-provider-plugins) — crear plugins de proveedor
- [Internals de plugins](/es/plugins/architecture) — análisis profundo de la arquitectura
- [Resumen del SDK](/es/plugins/sdk-overview) — referencia completa de importaciones por subruta
- [Plugins de canal](/es/plugins/sdk-channel-plugins) — creación de plugins de canal
- [Plugins de proveedor](/es/plugins/sdk-provider-plugins) — creación de plugins de proveedor
- [Aspectos internos de plugins](/es/plugins/architecture) — análisis detallado de la arquitectura
- [Manifiesto del plugin](/es/plugins/manifest) — referencia del esquema del manifiesto

View File

@ -1,35 +1,35 @@
---
read_when:
- Necesita saber desde qué subruta del SDK importar
- Quiere una referencia de todos los métodos de registro en OpenClawPluginApi
- Está buscando una exportación específica del SDK
- Necesitas saber desde qué subruta del SDK importar
- Quieres una referencia de todos los métodos de registro en OpenClawPluginApi
- Estás buscando una exportación específica del SDK
sidebarTitle: SDK Overview
summary: Mapa de importaciones, referencia de la API de registro y arquitectura del SDK
title: Descripción general del Plugin SDK
summary: Mapa de importación, referencia de la API de registro y arquitectura del SDK
title: Resumen del Plugin SDK
x-i18n:
generated_at: "2026-04-08T02:18:05Z"
generated_at: "2026-04-09T01:30:49Z"
model: gpt-5.4
provider: openai
source_hash: c5a41bd82d165dfbb7fbd6e4528cf322e9133a51efe55fa8518a7a0a626d9d30
source_hash: bf205af060971931df97dca4af5110ce173d2b7c12f56ad7c62d664a402f2381
source_path: plugins/sdk-overview.md
workflow: 15
---
# Descripción general del Plugin SDK
# Resumen del Plugin SDK
El Plugin SDK es el contrato tipado entre los plugins y el núcleo. Esta página es la
referencia de **qué importar** y **qué se puede registrar**.
El plugin SDK es el contrato tipado entre los plugins y el núcleo. Esta página es la
referencia para **qué importar** y **qué puedes registrar**.
<Tip>
**¿Busca una guía práctica?**
- ¿Su primer plugin? Empiece con [Primeros pasos](/es/plugins/building-plugins)
- ¿Plugin de canal? Vea [Plugins de canal](/es/plugins/sdk-channel-plugins)
- ¿Plugin de proveedor? Vea [Plugins de proveedor](/es/plugins/sdk-provider-plugins)
**¿Buscas una guía práctica?**
- ¿Tu primer plugin? Empieza con [Getting Started](/es/plugins/building-plugins)
- ¿Plugin de canal? Consulta [Channel Plugins](/es/plugins/sdk-channel-plugins)
- ¿Plugin de proveedor? Consulta [Provider Plugins](/es/plugins/sdk-provider-plugins)
</Tip>
## Convención de importación
Importe siempre desde una subruta específica:
Importa siempre desde una subruta específica:
```typescript
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
@ -37,35 +37,36 @@ import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core";
```
Cada subruta es un módulo pequeño y autocontenido. Esto mantiene un inicio rápido y
evita problemas de dependencias circulares. Para los auxiliares específicos de entrada/compilación de canales,
prefiera `openclaw/plugin-sdk/channel-core`; reserve `openclaw/plugin-sdk/core` para
la superficie paraguas más amplia y auxiliares compartidos como
evita problemas de dependencias circulares. Para ayudantes de entrada/construcción específicos de canal,
prefiere `openclaw/plugin-sdk/channel-core`; conserva `openclaw/plugin-sdk/core` para
la superficie paraguas más amplia y ayudantes compartidos como
`buildChannelConfigSchema`.
No agregue ni dependa de capas de conveniencia con nombre de proveedor como
No agregues ni dependas de puntos de acceso de conveniencia con nombre de proveedor como
`openclaw/plugin-sdk/slack`, `openclaw/plugin-sdk/discord`,
`openclaw/plugin-sdk/signal`, `openclaw/plugin-sdk/whatsapp`, ni de
capas auxiliares con marca de canal. Los plugins integrados deben componer subrutas
genéricas del SDK dentro de sus propios archivos barril `api.ts` o `runtime-api.ts`, y el núcleo
debe usar esos barriles locales del plugin o agregar un contrato del SDK genérico y acotado
cuando la necesidad sea realmente transversal a varios canales.
puntos de acceso auxiliares con marca de canal. Los plugins integrados deben componer subrutas
genéricas del SDK dentro de sus propios barrels `api.ts` o `runtime-api.ts`, y el núcleo
debe usar esos barrels locales del plugin o agregar un contrato genérico y acotado del SDK
cuando la necesidad sea realmente entre canales.
El mapa de exportaciones generado aún contiene un pequeño conjunto de
capas auxiliares para plugins integrados como `plugin-sdk/feishu`, `plugin-sdk/feishu-setup`,
`plugin-sdk/zalo`, `plugin-sdk/zalo-setup` y `plugin-sdk/matrix*`. Esas
El mapa de exportación generado todavía contiene un pequeño conjunto de puntos de acceso auxiliares
de plugins integrados como `plugin-sdk/feishu`, `plugin-sdk/feishu-setup`,
`plugin-sdk/zalo`, `plugin-sdk/zalo-setup`, y `plugin-sdk/matrix*`. Esas
subrutas existen solo para mantenimiento y compatibilidad de plugins integrados; se
omiten intencionalmente de la tabla común a continuación y no son la ruta de importación recomendada para plugins nuevos de terceros.
omiten intencionalmente de la tabla común a continuación y no son la ruta de
importación recomendada para nuevos plugins de terceros.
## Referencia de subrutas
Las subrutas de uso más común, agrupadas por propósito. La lista completa generada de
Las subrutas más utilizadas, agrupadas por propósito. La lista completa generada de
más de 200 subrutas está en `scripts/lib/plugin-sdk-entrypoints.json`.
Las subrutas auxiliares reservadas para plugins integrados siguen apareciendo en esa lista generada.
Trátelas como detalles de implementación o superficies de compatibilidad, a menos que una página de documentación
Trátalas como superficies de detalle de implementación/compatibilidad a menos que una página de documentación
promocione explícitamente una como pública.
### Entrada de plugin
### Entrada del plugin
| Subruta | Exportaciones clave |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
@ -81,226 +82,229 @@ promocione explícitamente una como pública.
| `plugin-sdk/channel-core` | `defineChannelPluginEntry`, `defineSetupPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase` |
| `plugin-sdk/config-schema` | Exportación del esquema Zod raíz de `openclaw.json` (`OpenClawSchema`) |
| `plugin-sdk/channel-setup` | `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`, `createOptionalChannelSetupWizard`, además de `DEFAULT_ACCOUNT_ID`, `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, `splitSetupEntries` |
| `plugin-sdk/setup` | Auxiliares compartidos para el asistente de configuración, prompts de lista de permitidos y constructores de estado de configuración |
| `plugin-sdk/setup` | Ayudantes compartidos del asistente de configuración, prompts de lista de permitidos, constructores de estado de configuración |
| `plugin-sdk/setup-runtime` | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
| `plugin-sdk/setup-adapter-runtime` | `createEnvPatchedAccountSetupAdapter` |
| `plugin-sdk/setup-tools` | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
| `plugin-sdk/account-core` | Auxiliares de configuración/múltiples cuentas/bloqueo de acciones, y auxiliares de respaldo para cuenta predeterminada |
| `plugin-sdk/account-id` | `DEFAULT_ACCOUNT_ID`, auxiliares de normalización de id de cuenta |
| `plugin-sdk/account-resolution` | Búsqueda de cuentas + auxiliares de respaldo predeterminado |
| `plugin-sdk/account-helpers` | Auxiliares acotados para lista de cuentas/acciones de cuenta |
| `plugin-sdk/account-core` | Ayudantes de configuración de múltiples cuentas/puerta de acciones, ayudantes de fallback de cuenta predeterminada |
| `plugin-sdk/account-id` | `DEFAULT_ACCOUNT_ID`, ayudantes de normalización de id de cuenta |
| `plugin-sdk/account-resolution` | Búsqueda de cuentas + ayudantes de fallback predeterminado |
| `plugin-sdk/account-helpers` | Ayudantes acotados para lista de cuentas/acciones de cuenta |
| `plugin-sdk/channel-pairing` | `createChannelPairingController` |
| `plugin-sdk/channel-reply-pipeline` | `createChannelReplyPipeline` |
| `plugin-sdk/channel-config-helpers` | `createHybridChannelConfigAdapter` |
| `plugin-sdk/channel-config-schema` | Tipos de esquema de configuración de canal |
| `plugin-sdk/telegram-command-config` | Auxiliares de normalización/validación de comandos personalizados de Telegram con respaldo de contrato integrado |
| `plugin-sdk/telegram-command-config` | Ayudantes de normalización/validación de comandos personalizados de Telegram con fallback de contrato integrado |
| `plugin-sdk/channel-policy` | `resolveChannelGroupRequireMention` |
| `plugin-sdk/channel-lifecycle` | `createAccountStatusSink` |
| `plugin-sdk/inbound-envelope` | Auxiliares compartidos para rutas entrantes y construcción de sobres |
| `plugin-sdk/inbound-reply-dispatch` | Auxiliares compartidos para registrar y despachar entradas |
| `plugin-sdk/messaging-targets` | Auxiliares de análisis/coincidencia de destinos |
| `plugin-sdk/outbound-media` | Auxiliares compartidos para carga de medios salientes |
| `plugin-sdk/outbound-runtime` | Auxiliares de identidad saliente y delegado de envío |
| `plugin-sdk/thread-bindings-runtime` | Auxiliares de ciclo de vida y adaptadores para enlaces de hilos |
| `plugin-sdk/agent-media-payload` | Constructor heredado de carga útil multimedia del agente |
| `plugin-sdk/conversation-runtime` | Auxiliares de enlaces de conversación/hilo, pairing y enlaces configurados |
| `plugin-sdk/runtime-config-snapshot` | Auxiliar de instantánea de configuración en tiempo de ejecución |
| `plugin-sdk/runtime-group-policy` | Auxiliares de resolución de políticas de grupo en tiempo de ejecución |
| `plugin-sdk/channel-status` | Auxiliares compartidos para instantáneas/resúmenes de estado del canal |
| `plugin-sdk/inbound-envelope` | Ayudantes compartidos de ruta entrante + construcción de sobre |
| `plugin-sdk/inbound-reply-dispatch` | Ayudantes compartidos de registro y despacho entrante |
| `plugin-sdk/messaging-targets` | Ayudantes de análisis/coincidencia de destinos |
| `plugin-sdk/outbound-media` | Ayudantes compartidos de carga de medios salientes |
| `plugin-sdk/outbound-runtime` | Ayudantes de identidad saliente/delegado de envío |
| `plugin-sdk/thread-bindings-runtime` | Ayudantes de ciclo de vida y adaptador de vinculaciones de hilo |
| `plugin-sdk/agent-media-payload` | Constructor heredado de payload de medios del agente |
| `plugin-sdk/conversation-runtime` | Ayudantes de vinculación de conversación/hilo, emparejamiento y vinculación configurada |
| `plugin-sdk/runtime-config-snapshot` | Ayudante de snapshot de configuración en tiempo de ejecución |
| `plugin-sdk/runtime-group-policy` | Ayudantes de resolución de políticas de grupo en tiempo de ejecución |
| `plugin-sdk/channel-status` | Ayudantes compartidos de snapshot/resumen del estado del canal |
| `plugin-sdk/channel-config-primitives` | Primitivas acotadas de esquema de configuración de canal |
| `plugin-sdk/channel-config-writes` | Auxiliares de autorización para escritura de configuración de canal |
| `plugin-sdk/channel-plugin-common` | Exportaciones de preludio compartidas para plugins de canal |
| `plugin-sdk/allowlist-config-edit` | Auxiliares para leer/editar configuración de listas de permitidos |
| `plugin-sdk/group-access` | Auxiliares compartidos para decisiones de acceso a grupos |
| `plugin-sdk/direct-dm` | Auxiliares compartidos de autenticación/protección de DM directos |
| `plugin-sdk/interactive-runtime` | Auxiliares de normalización/reducción de cargas útiles de respuestas interactivas |
| `plugin-sdk/channel-inbound` | Auxiliares para debounce de entrada, coincidencia de menciones, políticas de mención y sobres |
| `plugin-sdk/channel-send-result` | Tipos de resultados de respuesta |
| `plugin-sdk/channel-config-writes` | Ayudantes de autorización para escrituras de configuración de canal |
| `plugin-sdk/channel-plugin-common` | Exportaciones de preludio compartidas de plugins de canal |
| `plugin-sdk/allowlist-config-edit` | Ayudantes de edición/lectura de configuración de lista de permitidos |
| `plugin-sdk/group-access` | Ayudantes compartidos de decisión de acceso a grupos |
| `plugin-sdk/direct-dm` | Ayudantes compartidos de autenticación/protección de DM directa |
| `plugin-sdk/interactive-runtime` | Ayudantes de normalización/reducción de payload de respuesta interactiva |
| `plugin-sdk/channel-inbound` | Ayudantes de debounce entrante, coincidencia de menciones, política de menciones y sobres |
| `plugin-sdk/channel-send-result` | Tipos de resultado de respuesta |
| `plugin-sdk/channel-actions` | `createMessageToolButtonsSchema`, `createMessageToolCardSchema` |
| `plugin-sdk/channel-targets` | Auxiliares de análisis/coincidencia de destinos |
| `plugin-sdk/channel-contract` | Tipos de contratos de canal |
| `plugin-sdk/channel-targets` | Ayudantes de análisis/coincidencia de destinos |
| `plugin-sdk/channel-contract` | Tipos de contrato de canal |
| `plugin-sdk/channel-feedback` | Cableado de feedback/reacciones |
| `plugin-sdk/channel-secret-runtime` | Auxiliares acotados de contrato de secretos como `collectSimpleChannelFieldAssignments`, `getChannelSurface`, `pushAssignment` y tipos de destino de secretos |
| `plugin-sdk/channel-secret-runtime` | Ayudantes acotados de contrato de secretos como `collectSimpleChannelFieldAssignments`, `getChannelSurface`, `pushAssignment`, y tipos de destino de secretos |
</Accordion>
<Accordion title="Subrutas de proveedor">
| Subruta | Exportaciones clave |
| --- | --- |
| `plugin-sdk/provider-entry` | `defineSingleProviderPluginEntry` |
| `plugin-sdk/provider-setup` | Auxiliares seleccionados para configurar proveedores locales/autohospedados |
| `plugin-sdk/self-hosted-provider-setup` | Auxiliares centrados en la configuración de proveedores autohospedados compatibles con OpenAI |
| `plugin-sdk/cli-backend` | Valores predeterminados del backend de CLI + constantes de watchdog |
| `plugin-sdk/provider-auth-runtime` | Auxiliares de resolución de claves de API en tiempo de ejecución para plugins de proveedor |
| `plugin-sdk/provider-auth-api-key` | Auxiliares de incorporación/escritura de perfiles de claves de API como `upsertApiKeyProfile` |
| `plugin-sdk/provider-setup` | Ayudantes curados de configuración de proveedores locales/autohospedados |
| `plugin-sdk/self-hosted-provider-setup` | Ayudantes centrados en la configuración de proveedores autohospedados compatibles con OpenAI |
| `plugin-sdk/cli-backend` | Valores predeterminados del backend CLI + constantes watchdog |
| `plugin-sdk/provider-auth-runtime` | Ayudantes de resolución de claves API en tiempo de ejecución para plugins de proveedores |
| `plugin-sdk/provider-auth-api-key` | Ayudantes de incorporación/escritura de perfiles para claves API como `upsertApiKeyProfile` |
| `plugin-sdk/provider-auth-result` | Constructor estándar de resultados de autenticación OAuth |
| `plugin-sdk/provider-auth-login` | Auxiliares interactivos compartidos de inicio de sesión para plugins de proveedor |
| `plugin-sdk/provider-env-vars` | Auxiliares de búsqueda de variables de entorno para autenticación de proveedor |
| `plugin-sdk/provider-auth-login` | Ayudantes compartidos de inicio de sesión interactivo para plugins de proveedores |
| `plugin-sdk/provider-env-vars` | Ayudantes de búsqueda de variables de entorno de autenticación de proveedor |
| `plugin-sdk/provider-auth` | `createProviderApiKeyAuthMethod`, `ensureApiKeyFromOptionEnvOrPrompt`, `upsertAuthProfile`, `upsertApiKeyProfile`, `writeOAuthCredentials` |
| `plugin-sdk/provider-model-shared` | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, constructores compartidos de políticas de repetición, auxiliares de endpoint de proveedor y normalización de id de modelo como `normalizeNativeXaiModelId` |
| `plugin-sdk/provider-model-shared` | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, constructores compartidos de política de reproducción, ayudantes de endpoints de proveedor, y ayudantes de normalización de identificadores de modelo como `normalizeNativeXaiModelId` |
| `plugin-sdk/provider-catalog-shared` | `findCatalogTemplate`, `buildSingleProviderApiKeyCatalog`, `supportsNativeStreamingUsageCompat`, `applyProviderNativeStreamingUsageCompat` |
| `plugin-sdk/provider-http` | Auxiliares genéricos de HTTP/capacidades de endpoint para proveedores |
| `plugin-sdk/provider-web-fetch-contract` | Auxiliares acotados para contratos de configuración/selección de web fetch como `enablePluginInConfig` y `WebFetchProviderPlugin` |
| `plugin-sdk/provider-web-fetch` | Auxiliares de registro/caché de proveedores de web fetch |
| `plugin-sdk/provider-web-search-contract` | Auxiliares acotados para contratos de configuración/credenciales de búsqueda web como `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig` y setters/getters de credenciales con alcance |
| `plugin-sdk/provider-web-search` | Auxiliares de registro/caché/tiempo de ejecución para proveedores de búsqueda web |
| `plugin-sdk/provider-tools` | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, limpieza + diagnósticos de esquemas Gemini y auxiliares de compatibilidad de xAI como `resolveXaiModelCompatPatch` / `applyXaiModelCompat` |
| `plugin-sdk/provider-http` | Ayudantes genéricos de capacidades HTTP/endpoint para proveedores |
| `plugin-sdk/provider-web-fetch-contract` | Ayudantes acotados de contrato para configuración/selección de web-fetch como `enablePluginInConfig` y `WebFetchProviderPlugin` |
| `plugin-sdk/provider-web-fetch` | Ayudantes de registro/caché de proveedores web-fetch |
| `plugin-sdk/provider-web-search-config-contract` | Ayudantes acotados de configuración/credenciales de búsqueda web para proveedores que no necesitan cableado de habilitación del plugin |
| `plugin-sdk/provider-web-search-contract` | Ayudantes acotados de contrato para configuración/credenciales de búsqueda web como `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig`, y setters/getters de credenciales con ámbito |
| `plugin-sdk/provider-web-search` | Ayudantes de registro/caché/tiempo de ejecución de proveedores de búsqueda web |
| `plugin-sdk/provider-tools` | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, limpieza + diagnósticos de esquemas Gemini, y ayudantes de compatibilidad xAI como `resolveXaiModelCompatPatch` / `applyXaiModelCompat` |
| `plugin-sdk/provider-usage` | `fetchClaudeUsage` y similares |
| `plugin-sdk/provider-stream` | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, tipos de envoltorios de streaming y auxiliares compartidos de envoltorios para Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot |
| `plugin-sdk/provider-onboard` | Auxiliares de parches de configuración para onboarding |
| `plugin-sdk/global-singleton` | Auxiliares de singleton/mapa/caché locales al proceso |
| `plugin-sdk/provider-stream` | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, tipos de envoltorios de stream, y ayudantes compartidos de envoltorios para Anthropic/Bedrock/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot |
| `plugin-sdk/provider-onboard` | Ayudantes de parcheo de configuración para onboarding |
| `plugin-sdk/global-singleton` | Ayudantes de singleton/mapa/caché locales al proceso |
</Accordion>
<Accordion title="Subrutas de autenticación y seguridad">
| Subruta | Exportaciones clave |
| --- | --- |
| `plugin-sdk/command-auth` | `resolveControlCommandGate`, auxiliares de registro de comandos, auxiliares de autorización de remitentes |
| `plugin-sdk/approval-auth-runtime` | Resolución de aprobadores y auxiliares de autenticación de acciones en el mismo chat |
| `plugin-sdk/approval-client-runtime` | Auxiliares nativos de perfiles/filtros de aprobación de exec |
| `plugin-sdk/approval-delivery-runtime` | Adaptadores nativos de capacidad/entrega de aprobaciones |
| `plugin-sdk/approval-gateway-runtime` | Auxiliar compartido de resolución del gateway de aprobaciones |
| `plugin-sdk/approval-handler-adapter-runtime` | Auxiliares ligeros de carga de adaptadores nativos de aprobación para puntos de entrada de canales de acceso frecuente |
| `plugin-sdk/approval-handler-runtime` | Auxiliares más amplios de tiempo de ejecución para controladores de aprobación; prefiera las capas más acotadas de adaptador/gateway cuando sean suficientes |
| `plugin-sdk/approval-native-runtime` | Auxiliares nativos de destino de aprobación y enlace de cuentas |
| `plugin-sdk/approval-reply-runtime` | Auxiliares de cargas útiles de respuesta para aprobaciones de exec/plugin |
| `plugin-sdk/command-auth-native` | Autenticación nativa de comandos + auxiliares nativos de destino de sesión |
| `plugin-sdk/command-detection` | Auxiliares compartidos de detección de comandos |
| `plugin-sdk/command-surface` | Auxiliares de normalización del cuerpo del comando y de superficie de comandos |
| `plugin-sdk/command-auth` | `resolveControlCommandGate`, ayudantes de registro de comandos, ayudantes de autorización del remitente |
| `plugin-sdk/command-status` | Constructores de mensajes de comando/ayuda como `buildCommandsMessagePaginated` y `buildHelpMessage` |
| `plugin-sdk/approval-auth-runtime` | Resolución de aprobadores y ayudantes de autenticación de acciones en el mismo chat |
| `plugin-sdk/approval-client-runtime` | Ayudantes de perfiles/filtros de aprobación nativa de ejecución |
| `plugin-sdk/approval-delivery-runtime` | Adaptadores compartidos de capacidad/entrega de aprobación nativa |
| `plugin-sdk/approval-gateway-runtime` | Ayudante compartido de resolución de gateway de aprobación |
| `plugin-sdk/approval-handler-adapter-runtime` | Ayudantes ligeros de carga de adaptadores de aprobación nativa para entrypoints rápidos de canal |
| `plugin-sdk/approval-handler-runtime` | Ayudantes más amplios del tiempo de ejecución del manejador de aprobación; prefiere los puntos de acceso más acotados de adaptador/gateway cuando sean suficientes |
| `plugin-sdk/approval-native-runtime` | Ayudantes de destino de aprobación nativa + vinculación de cuenta |
| `plugin-sdk/approval-reply-runtime` | Ayudantes de payload de respuesta de aprobación de exec/plugin |
| `plugin-sdk/command-auth-native` | Ayudantes de autenticación de comandos nativos + destinos de sesión nativa |
| `plugin-sdk/command-detection` | Ayudantes compartidos de detección de comandos |
| `plugin-sdk/command-surface` | Ayudantes de normalización del cuerpo de comandos y superficie de comandos |
| `plugin-sdk/allow-from` | `formatAllowFromLowercase` |
| `plugin-sdk/channel-secret-runtime` | Auxiliares acotados de recopilación de contratos de secretos para superficies de secretos de canales/plugins |
| `plugin-sdk/secret-ref-runtime` | Auxiliares acotados `coerceSecretRef` y de tipado de SecretRef para análisis de contratos/configuración de secretos |
| `plugin-sdk/security-runtime` | Auxiliares compartidos de confianza, control de DM, contenido externo y recopilación de secretos |
| `plugin-sdk/ssrf-policy` | Auxiliares de lista de permitidos de hosts y política SSRF de red privada |
| `plugin-sdk/ssrf-runtime` | Dispatcher fijado, fetch protegido por SSRF y auxiliares de política SSRF |
| `plugin-sdk/secret-input` | Auxiliares de análisis de entradas secretas |
| `plugin-sdk/webhook-ingress` | Auxiliares para solicitudes/destinos de webhook |
| `plugin-sdk/webhook-request-guards` | Auxiliares para tamaño de cuerpo/tiempo de espera de solicitudes |
| `plugin-sdk/channel-secret-runtime` | Ayudantes acotados de recopilación de contratos de secretos para superficies secretas de canal/plugin |
| `plugin-sdk/secret-ref-runtime` | Ayudantes acotados `coerceSecretRef` y de tipado SecretRef para análisis de contratos/configuración de secretos |
| `plugin-sdk/security-runtime` | Ayudantes compartidos de confianza, protección de DM, contenido externo y recopilación de secretos |
| `plugin-sdk/ssrf-policy` | Ayudantes de lista de permitidos de hosts y política SSRF de red privada |
| `plugin-sdk/ssrf-runtime` | Ayudantes de dispatcher fijado, fetch protegido con SSRF y política SSRF |
| `plugin-sdk/secret-input` | Ayudantes de análisis de entradas secretas |
| `plugin-sdk/webhook-ingress` | Ayudantes de solicitudes/destinos de webhook |
| `plugin-sdk/webhook-request-guards` | Ayudantes de tamaño del cuerpo de la solicitud/timeout |
</Accordion>
<Accordion title="Subrutas de tiempo de ejecución y almacenamiento">
| Subruta | Exportaciones clave |
| --- | --- |
| `plugin-sdk/runtime` | Auxiliares amplios de tiempo de ejecución/registro/copias de seguridad/instalación de plugins |
| `plugin-sdk/runtime-env` | Auxiliares acotados de entorno de ejecución, logger, timeout, retry y backoff |
| `plugin-sdk/channel-runtime-context` | Auxiliares genéricos de registro y búsqueda de contexto de tiempo de ejecución del canal |
| `plugin-sdk/runtime` | Ayudantes amplios de tiempo de ejecución/logging/copias de seguridad/instalación de plugins |
| `plugin-sdk/runtime-env` | Ayudantes acotados de entorno de ejecución, logger, timeout, reintento y backoff |
| `plugin-sdk/channel-runtime-context` | Ayudantes genéricos de registro y búsqueda de contexto de tiempo de ejecución de canal |
| `plugin-sdk/runtime-store` | `createPluginRuntimeStore` |
| `plugin-sdk/plugin-runtime` | Auxiliares compartidos para comandos/hooks/http/elementos interactivos del plugin |
| `plugin-sdk/hook-runtime` | Auxiliares compartidos del flujo de webhook/hooks internos |
| `plugin-sdk/lazy-runtime` | Auxiliares de importación/vinculación diferida del tiempo de ejecución como `createLazyRuntimeModule`, `createLazyRuntimeMethod` y `createLazyRuntimeSurface` |
| `plugin-sdk/process-runtime` | Auxiliares para ejecución de procesos |
| `plugin-sdk/cli-runtime` | Auxiliares de formato, espera y versión para CLI |
| `plugin-sdk/gateway-runtime` | Cliente del gateway y auxiliares de parches para estado de canales |
| `plugin-sdk/config-runtime` | Auxiliares para cargar/escribir configuración |
| `plugin-sdk/telegram-command-config` | Normalización de nombre/descripción de comandos de Telegram y comprobaciones de duplicados/conflictos, incluso cuando la superficie de contrato integrada de Telegram no está disponible |
| `plugin-sdk/approval-runtime` | Auxiliares de aprobación de exec/plugin, constructores de capacidades de aprobación, auxiliares de autenticación/perfiles y auxiliares nativos de enrutamiento/tiempo de ejecución |
| `plugin-sdk/reply-runtime` | Auxiliares compartidos para entradas/respuestas en tiempo de ejecución, fragmentación, despacho, heartbeat y planificador de respuestas |
| `plugin-sdk/reply-dispatch-runtime` | Auxiliares acotados para despacho/finalización de respuestas |
| `plugin-sdk/reply-history` | Auxiliares compartidos para historial de respuestas en ventanas cortas como `buildHistoryContext`, `recordPendingHistoryEntry` y `clearHistoryEntriesIfEnabled` |
| `plugin-sdk/plugin-runtime` | Ayudantes compartidos de comandos/hooks/http/interacción de plugins |
| `plugin-sdk/hook-runtime` | Ayudantes compartidos de pipeline de hooks webhook/internos |
| `plugin-sdk/lazy-runtime` | Ayudantes de importación/vinculación lazy en tiempo de ejecución como `createLazyRuntimeModule`, `createLazyRuntimeMethod`, y `createLazyRuntimeSurface` |
| `plugin-sdk/process-runtime` | Ayudantes de ejecución de procesos |
| `plugin-sdk/cli-runtime` | Ayudantes de formato CLI, espera y versión |
| `plugin-sdk/gateway-runtime` | Ayudantes de cliente de gateway y parcheo de estado de canal |
| `plugin-sdk/config-runtime` | Ayudantes de carga/escritura de configuración |
| `plugin-sdk/telegram-command-config` | Normalización de nombres/descripciones de comandos de Telegram y comprobaciones de duplicados/conflictos, incluso cuando la superficie de contrato integrada de Telegram no está disponible |
| `plugin-sdk/approval-runtime` | Ayudantes de aprobación de exec/plugin, constructores de capacidad de aprobación, ayudantes de autenticación/perfiles, y ayudantes nativos de enrutamiento/tiempo de ejecución |
| `plugin-sdk/reply-runtime` | Ayudantes compartidos de tiempo de ejecución para entrada/respuesta, fragmentación, despacho, heartbeat, planificador de respuestas |
| `plugin-sdk/reply-dispatch-runtime` | Ayudantes acotados para despacho/finalización de respuestas |
| `plugin-sdk/reply-history` | Ayudantes compartidos de historial de respuestas de ventana corta como `buildHistoryContext`, `recordPendingHistoryEntry`, y `clearHistoryEntriesIfEnabled` |
| `plugin-sdk/reply-reference` | `createReplyReferencePlanner` |
| `plugin-sdk/reply-chunking` | Auxiliares acotados de fragmentación de texto/Markdown |
| `plugin-sdk/session-store-runtime` | Auxiliares de rutas del almacén de sesiones + `updated-at` |
| `plugin-sdk/state-paths` | Auxiliares de rutas de directorios de estado/OAuth |
| `plugin-sdk/routing` | Auxiliares de ruta/clave de sesión/enlace de cuenta como `resolveAgentRoute`, `buildAgentSessionKey` y `resolveDefaultAgentBoundAccountId` |
| `plugin-sdk/status-helpers` | Auxiliares compartidos para resúmenes de estado de canal/cuenta, valores predeterminados del estado de ejecución y auxiliares de metadatos de incidencias |
| `plugin-sdk/target-resolver-runtime` | Auxiliares compartidos de resolución de destinos |
| `plugin-sdk/string-normalization-runtime` | Auxiliares de normalización de slug/cadenas |
| `plugin-sdk/request-url` | Extrae URL en cadena de entradas tipo fetch/request |
| `plugin-sdk/run-command` | Ejecutor de comandos temporizado con resultados normalizados de stdout/stderr |
| `plugin-sdk/param-readers` | Lectores comunes de parámetros de herramientas/CLI |
| `plugin-sdk/tool-send` | Extrae campos canónicos de destino de envío a partir de argumentos de herramientas |
| `plugin-sdk/temp-path` | Auxiliares compartidos para rutas temporales de descarga |
| `plugin-sdk/logging-core` | Logger de subsistema y auxiliares de redacción |
| `plugin-sdk/markdown-table-runtime` | Auxiliares del modo de tablas Markdown |
| `plugin-sdk/json-store` | Auxiliares pequeños para leer/escribir estado JSON |
| `plugin-sdk/file-lock` | Auxiliares reentrantes de bloqueo de archivos |
| `plugin-sdk/persistent-dedupe` | Auxiliares de caché de deduplicación respaldada por disco |
| `plugin-sdk/acp-runtime` | Auxiliares de tiempo de ejecución/sesión ACP y despacho de respuestas |
| `plugin-sdk/reply-chunking` | Ayudantes acotados de fragmentación de texto/markdown |
| `plugin-sdk/session-store-runtime` | Ayudantes de ruta de almacén de sesiones + `updated-at` |
| `plugin-sdk/state-paths` | Ayudantes de rutas de directorios de estado/OAuth |
| `plugin-sdk/routing` | Ayudantes de vinculación de rutas/claves de sesión/cuentas como `resolveAgentRoute`, `buildAgentSessionKey`, y `resolveDefaultAgentBoundAccountId` |
| `plugin-sdk/status-helpers` | Ayudantes compartidos de resumen de estado de canal/cuenta, valores predeterminados de estado de tiempo de ejecución y ayudantes de metadatos de incidencias |
| `plugin-sdk/target-resolver-runtime` | Ayudantes compartidos de resolución de destinos |
| `plugin-sdk/string-normalization-runtime` | Ayudantes de normalización de slug/cadenas |
| `plugin-sdk/request-url` | Extrae URL de cadena desde entradas tipo fetch/request |
| `plugin-sdk/run-command` | Ejecutor de comandos temporizado con resultados stdout/stderr normalizados |
| `plugin-sdk/param-readers` | Lectores comunes de parámetros para herramientas/CLI |
| `plugin-sdk/tool-payload` | Extrae payloads normalizados desde objetos de resultado de herramientas |
| `plugin-sdk/tool-send` | Extrae campos de destino de envío canónicos desde argumentos de herramientas |
| `plugin-sdk/temp-path` | Ayudantes compartidos de rutas temporales de descarga |
| `plugin-sdk/logging-core` | Logger de subsistema y ayudantes de redacción |
| `plugin-sdk/markdown-table-runtime` | Ayudantes de modo de tabla Markdown |
| `plugin-sdk/json-store` | Pequeños ayudantes de lectura/escritura de estado JSON |
| `plugin-sdk/file-lock` | Ayudantes reentrantes de bloqueo de archivos |
| `plugin-sdk/persistent-dedupe` | Ayudantes de caché de deduplicación persistente en disco |
| `plugin-sdk/acp-runtime` | Ayudantes de tiempo de ejecución/sesión ACP y de despacho de respuestas |
| `plugin-sdk/agent-config-primitives` | Primitivas acotadas de esquema de configuración de tiempo de ejecución del agente |
| `plugin-sdk/boolean-param` | Lector flexible de parámetros booleanos |
| `plugin-sdk/dangerous-name-runtime` | Auxiliares de resolución para coincidencias de nombres peligrosos |
| `plugin-sdk/device-bootstrap` | Auxiliares de arranque de dispositivos y tokens de pairing |
| `plugin-sdk/extension-shared` | Primitivas auxiliares compartidas para canales pasivos, estado y proxy ambiental |
| `plugin-sdk/models-provider-runtime` | Auxiliares de comandos `/models` y respuestas de proveedor |
| `plugin-sdk/skill-commands-runtime` | Auxiliares para listados de comandos de Skills |
| `plugin-sdk/native-command-registry` | Auxiliares nativos de registro/construcción/serialización de comandos |
| `plugin-sdk/provider-zai-endpoint` | Auxiliares de detección de endpoints de Z.AI |
| `plugin-sdk/infra-runtime` | Auxiliares de eventos del sistema/heartbeat |
| `plugin-sdk/collection-runtime` | Auxiliares pequeños de caché acotada |
| `plugin-sdk/diagnostic-runtime` | Auxiliares de indicadores y eventos de diagnóstico |
| `plugin-sdk/error-runtime` | Grafo de errores, formato, auxiliares compartidos de clasificación de errores, `isApprovalNotFoundError` |
| `plugin-sdk/fetch-runtime` | Fetch envuelto, proxy y auxiliares de búsqueda fijada |
| `plugin-sdk/host-runtime` | Auxiliares de normalización de hostname y host SCP |
| `plugin-sdk/retry-runtime` | Auxiliares de configuración y ejecución de retry |
| `plugin-sdk/agent-runtime` | Auxiliares de directorio/identidad/espacio de trabajo del agente |
| `plugin-sdk/directory-runtime` | Consulta/deduplicación de directorios respaldadas por configuración |
| `plugin-sdk/dangerous-name-runtime` | Ayudantes de resolución para coincidencia de nombres peligrosos |
| `plugin-sdk/device-bootstrap` | Ayudantes de bootstrap del dispositivo y tokens de emparejamiento |
| `plugin-sdk/extension-shared` | Primitivas auxiliares compartidas para canal pasivo, estado y proxy ambiental |
| `plugin-sdk/models-provider-runtime` | Ayudantes del comando `/models` y de respuesta de proveedores |
| `plugin-sdk/skill-commands-runtime` | Ayudantes de listado de comandos de Skills |
| `plugin-sdk/native-command-registry` | Ayudantes de registro/construcción/serialización de comandos nativos |
| `plugin-sdk/provider-zai-endpoint` | Ayudantes de detección de endpoints de Z.AI |
| `plugin-sdk/infra-runtime` | Ayudantes de eventos del sistema/heartbeat |
| `plugin-sdk/collection-runtime` | Pequeños ayudantes de caché acotada |
| `plugin-sdk/diagnostic-runtime` | Ayudantes de indicadores y eventos de diagnóstico |
| `plugin-sdk/error-runtime` | Grafo de errores, formato, ayudantes compartidos de clasificación de errores, `isApprovalNotFoundError` |
| `plugin-sdk/fetch-runtime` | Ayudantes de fetch envuelto, proxy y búsquedas fijadas |
| `plugin-sdk/host-runtime` | Ayudantes de normalización de hostname y host SCP |
| `plugin-sdk/retry-runtime` | Ayudantes de configuración y ejecución de reintentos |
| `plugin-sdk/agent-runtime` | Ayudantes de directorio/identidad/workspace del agente |
| `plugin-sdk/directory-runtime` | Consulta/deduplicación de directorios respaldada por configuración |
| `plugin-sdk/keyed-async-queue` | `KeyedAsyncQueue` |
</Accordion>
<Accordion title="Subrutas de capacidades y pruebas">
| Subruta | Exportaciones clave |
| --- | --- |
| `plugin-sdk/media-runtime` | Auxiliares compartidos para obtener/transformar/almacenar medios, además de constructores de cargas útiles multimedia |
| `plugin-sdk/media-generation-runtime` | Auxiliares compartidos para failover de generación multimedia, selección de candidatos y mensajes de falta de modelo |
| `plugin-sdk/media-understanding` | Tipos de proveedores de comprensión multimedia más exportaciones orientadas a proveedores para auxiliares de imagen/audio |
| `plugin-sdk/text-runtime` | Auxiliares compartidos para texto/Markdown/registro como eliminación de texto visible para el asistente, renderizado/fragmentación/tablas Markdown, auxiliares de redacción, auxiliares de etiquetas de directivas y utilidades de texto seguro |
| `plugin-sdk/text-chunking` | Auxiliar de fragmentación de texto saliente |
| `plugin-sdk/speech` | Tipos de proveedores de voz más auxiliares orientados a proveedores para directivas, registro y validación |
| `plugin-sdk/speech-core` | Tipos compartidos de proveedores de voz, registro, directivas y auxiliares de normalización |
| `plugin-sdk/realtime-transcription` | Tipos de proveedores de transcripción en tiempo real y auxiliares de registro |
| `plugin-sdk/realtime-voice` | Tipos de proveedores de voz en tiempo real y auxiliares de registro |
| `plugin-sdk/image-generation` | Tipos de proveedores de generación de imágenes |
| `plugin-sdk/image-generation-core` | Tipos compartidos de generación de imágenes, failover, autenticación y auxiliares de registro |
| `plugin-sdk/music-generation` | Tipos de proveedores/solicitudes/resultados de generación musical |
| `plugin-sdk/music-generation-core` | Tipos compartidos de generación musical, auxiliares de failover, búsqueda de proveedores y análisis de referencias de modelos |
| `plugin-sdk/video-generation` | Tipos de proveedores/solicitudes/resultados de generación de video |
| `plugin-sdk/video-generation-core` | Tipos compartidos de generación de video, auxiliares de failover, búsqueda de proveedores y análisis de referencias de modelos |
| `plugin-sdk/webhook-targets` | Registro de destinos de webhook y auxiliares de instalación de rutas |
| `plugin-sdk/webhook-path` | Auxiliares de normalización de rutas de webhook |
| `plugin-sdk/web-media` | Auxiliares compartidos para carga de medios remotos/locales |
| `plugin-sdk/zod` | Reexportación de `zod` para consumidores del Plugin SDK |
| `plugin-sdk/media-runtime` | Ayudantes compartidos de obtención/transformación/almacenamiento de medios más constructores de payload de medios |
| `plugin-sdk/media-generation-runtime` | Ayudantes compartidos de failover en generación de medios, selección de candidatos y mensajes de modelo ausente |
| `plugin-sdk/media-understanding` | Tipos de proveedor de comprensión de medios más exportaciones auxiliares de imagen/audio para proveedores |
| `plugin-sdk/text-runtime` | Ayudantes compartidos de texto/markdown/logging como eliminación de texto visible para el asistente, renderizado/fragmentación/tablas de markdown, ayudantes de redacción, ayudantes de etiquetas de directivas y utilidades de texto seguro |
| `plugin-sdk/text-chunking` | Ayudante de fragmentación de texto saliente |
| `plugin-sdk/speech` | Tipos de proveedor de voz más exportaciones auxiliares de directivas, registro y validación para proveedores |
| `plugin-sdk/speech-core` | Tipos compartidos de proveedor de voz, registro, directivas y ayudantes de normalización |
| `plugin-sdk/realtime-transcription` | Tipos de proveedor de transcripción en tiempo real y ayudantes de registro |
| `plugin-sdk/realtime-voice` | Tipos de proveedor de voz en tiempo real y ayudantes de registro |
| `plugin-sdk/image-generation` | Tipos de proveedor de generación de imágenes |
| `plugin-sdk/image-generation-core` | Tipos compartidos de generación de imágenes, failover, autenticación y ayudantes de registro |
| `plugin-sdk/music-generation` | Tipos de proveedor/solicitud/resultado de generación musical |
| `plugin-sdk/music-generation-core` | Tipos compartidos de generación musical, ayudantes de failover, búsqueda de proveedores y análisis de referencias de modelos |
| `plugin-sdk/video-generation` | Tipos de proveedor/solicitud/resultado de generación de video |
| `plugin-sdk/video-generation-core` | Tipos compartidos de generación de video, ayudantes de failover, búsqueda de proveedores y análisis de referencias de modelos |
| `plugin-sdk/webhook-targets` | Registro de destinos webhook y ayudantes de instalación de rutas |
| `plugin-sdk/webhook-path` | Ayudantes de normalización de rutas webhook |
| `plugin-sdk/web-media` | Ayudantes compartidos de carga de medios remotos/locales |
| `plugin-sdk/zod` | `zod` reexportado para consumidores del plugin SDK |
| `plugin-sdk/testing` | `installCommonResolveTargetErrorCases`, `shouldAckReaction` |
</Accordion>
<Accordion title="Subrutas de memoria">
| Subruta | Exportaciones clave |
| --- | --- |
| `plugin-sdk/memory-core` | Superficie auxiliar integrada de memory-core para auxiliares de administrador/configuración/archivos/CLI |
| `plugin-sdk/memory-core-engine-runtime` | Fachada de tiempo de ejecución para indexación/búsqueda en memoria |
| `plugin-sdk/memory-core` | Superficie auxiliar integrada memory-core para ayudantes de manager/config/archivos/CLI |
| `plugin-sdk/memory-core-engine-runtime` | Fachada de tiempo de ejecución para índice/búsqueda de memoria |
| `plugin-sdk/memory-core-host-engine-foundation` | Exportaciones del motor base del host de memoria |
| `plugin-sdk/memory-core-host-engine-embeddings` | Exportaciones del motor de embeddings del host de memoria |
| `plugin-sdk/memory-core-host-engine-qmd` | Exportaciones del motor QMD del host de memoria |
| `plugin-sdk/memory-core-host-engine-storage` | Exportaciones del motor de almacenamiento del host de memoria |
| `plugin-sdk/memory-core-host-multimodal` | Auxiliares multimodales del host de memoria |
| `plugin-sdk/memory-core-host-query` | Auxiliares de consulta del host de memoria |
| `plugin-sdk/memory-core-host-secret` | Auxiliares de secretos del host de memoria |
| `plugin-sdk/memory-core-host-events` | Auxiliares del diario de eventos del host de memoria |
| `plugin-sdk/memory-core-host-status` | Auxiliares de estado del host de memoria |
| `plugin-sdk/memory-core-host-runtime-cli` | Auxiliares de tiempo de ejecución CLI del host de memoria |
| `plugin-sdk/memory-core-host-runtime-core` | Auxiliares principales de tiempo de ejecución del host de memoria |
| `plugin-sdk/memory-core-host-runtime-files` | Auxiliares de archivos/tiempo de ejecución del host de memoria |
| `plugin-sdk/memory-host-core` | Alias neutral respecto al proveedor para auxiliares principales de tiempo de ejecución del host de memoria |
| `plugin-sdk/memory-host-events` | Alias neutral respecto al proveedor para auxiliares del diario de eventos del host de memoria |
| `plugin-sdk/memory-host-files` | Alias neutral respecto al proveedor para auxiliares de archivos/tiempo de ejecución del host de memoria |
| `plugin-sdk/memory-host-markdown` | Auxiliares compartidos de Markdown administrado para plugins adyacentes a memoria |
| `plugin-sdk/memory-host-search` | Fachada de tiempo de ejecución activa de memoria para acceso al administrador de búsqueda |
| `plugin-sdk/memory-host-status` | Alias neutral respecto al proveedor para auxiliares de estado del host de memoria |
| `plugin-sdk/memory-lancedb` | Superficie auxiliar integrada de memory-lancedb |
| `plugin-sdk/memory-core-host-multimodal` | Ayudantes multimodales del host de memoria |
| `plugin-sdk/memory-core-host-query` | Ayudantes de consulta del host de memoria |
| `plugin-sdk/memory-core-host-secret` | Ayudantes de secretos del host de memoria |
| `plugin-sdk/memory-core-host-events` | Ayudantes del diario de eventos del host de memoria |
| `plugin-sdk/memory-core-host-status` | Ayudantes de estado del host de memoria |
| `plugin-sdk/memory-core-host-runtime-cli` | Ayudantes de tiempo de ejecución CLI del host de memoria |
| `plugin-sdk/memory-core-host-runtime-core` | Ayudantes centrales de tiempo de ejecución del host de memoria |
| `plugin-sdk/memory-core-host-runtime-files` | Ayudantes de archivos/tiempo de ejecución del host de memoria |
| `plugin-sdk/memory-host-core` | Alias neutral respecto al proveedor para los ayudantes centrales de tiempo de ejecución del host de memoria |
| `plugin-sdk/memory-host-events` | Alias neutral respecto al proveedor para los ayudantes del diario de eventos del host de memoria |
| `plugin-sdk/memory-host-files` | Alias neutral respecto al proveedor para los ayudantes de archivos/tiempo de ejecución del host de memoria |
| `plugin-sdk/memory-host-markdown` | Ayudantes compartidos de markdown administrado para plugins adyacentes a memoria |
| `plugin-sdk/memory-host-search` | Fachada activa de tiempo de ejecución de memoria para acceso al gestor de búsquedas |
| `plugin-sdk/memory-host-status` | Alias neutral respecto al proveedor para los ayudantes de estado del host de memoria |
| `plugin-sdk/memory-lancedb` | Superficie auxiliar integrada memory-lancedb |
</Accordion>
<Accordion title="Subrutas reservadas de auxiliares integrados">
<Accordion title="Subrutas reservadas de ayudas integradas">
| Familia | Subrutas actuales | Uso previsto |
| --- | --- | --- |
| Browser | `plugin-sdk/browser-cdp`, `plugin-sdk/browser-config-runtime`, `plugin-sdk/browser-config-support`, `plugin-sdk/browser-control-auth`, `plugin-sdk/browser-node-runtime`, `plugin-sdk/browser-profiles`, `plugin-sdk/browser-security-runtime`, `plugin-sdk/browser-setup-tools`, `plugin-sdk/browser-support` | Auxiliares de soporte del plugin Browser integrado (`browser-support` sigue siendo el barril de compatibilidad) |
| Browser | `plugin-sdk/browser-cdp`, `plugin-sdk/browser-config-runtime`, `plugin-sdk/browser-config-support`, `plugin-sdk/browser-control-auth`, `plugin-sdk/browser-node-runtime`, `plugin-sdk/browser-profiles`, `plugin-sdk/browser-security-runtime`, `plugin-sdk/browser-setup-tools`, `plugin-sdk/browser-support` | Ayudantes de soporte para el plugin integrado de navegador (`browser-support` sigue siendo el barrel de compatibilidad) |
| Matrix | `plugin-sdk/matrix`, `plugin-sdk/matrix-helper`, `plugin-sdk/matrix-runtime-heavy`, `plugin-sdk/matrix-runtime-shared`, `plugin-sdk/matrix-runtime-surface`, `plugin-sdk/matrix-surface`, `plugin-sdk/matrix-thread-bindings` | Superficie auxiliar/de tiempo de ejecución integrada de Matrix |
| Line | `plugin-sdk/line`, `plugin-sdk/line-core`, `plugin-sdk/line-runtime`, `plugin-sdk/line-surface` | Superficie auxiliar/de tiempo de ejecución integrada de LINE |
| IRC | `plugin-sdk/irc`, `plugin-sdk/irc-surface` | Superficie auxiliar integrada de IRC |
| Auxiliares específicos de canal | `plugin-sdk/googlechat`, `plugin-sdk/zalouser`, `plugin-sdk/bluebubbles`, `plugin-sdk/bluebubbles-policy`, `plugin-sdk/mattermost`, `plugin-sdk/mattermost-policy`, `plugin-sdk/feishu-conversation`, `plugin-sdk/msteams`, `plugin-sdk/nextcloud-talk`, `plugin-sdk/nostr`, `plugin-sdk/tlon`, `plugin-sdk/twitch` | Capas auxiliares/de compatibilidad para canales integrados |
| Auxiliares específicos de autenticación/plugin | `plugin-sdk/github-copilot-login`, `plugin-sdk/github-copilot-token`, `plugin-sdk/diagnostics-otel`, `plugin-sdk/diffs`, `plugin-sdk/llm-task`, `plugin-sdk/thread-ownership`, `plugin-sdk/voice-call` | Capas auxiliares para funciones/plugins integrados; `plugin-sdk/github-copilot-token` actualmente exporta `DEFAULT_COPILOT_API_BASE_URL`, `deriveCopilotApiBaseUrlFromToken` y `resolveCopilotApiToken` |
| Ayudantes específicos de canal | `plugin-sdk/googlechat`, `plugin-sdk/zalouser`, `plugin-sdk/bluebubbles`, `plugin-sdk/bluebubbles-policy`, `plugin-sdk/mattermost`, `plugin-sdk/mattermost-policy`, `plugin-sdk/feishu-conversation`, `plugin-sdk/msteams`, `plugin-sdk/nextcloud-talk`, `plugin-sdk/nostr`, `plugin-sdk/tlon`, `plugin-sdk/twitch` | Puntos de acceso de compatibilidad/ayuda para canales integrados |
| Ayudantes específicos de auth/plugin | `plugin-sdk/github-copilot-login`, `plugin-sdk/github-copilot-token`, `plugin-sdk/diagnostics-otel`, `plugin-sdk/diffs`, `plugin-sdk/llm-task`, `plugin-sdk/thread-ownership`, `plugin-sdk/voice-call` | Puntos de acceso auxiliares de funciones/plugins integrados; `plugin-sdk/github-copilot-token` exporta actualmente `DEFAULT_COPILOT_API_BASE_URL`, `deriveCopilotApiBaseUrlFromToken`, y `resolveCopilotApiToken` |
</Accordion>
</AccordionGroup>
## API de registro
La devolución de llamada `register(api)` recibe un objeto `OpenClawPluginApi` con estos
El callback `register(api)` recibe un objeto `OpenClawPluginApi` con estos
métodos:
### Registro de capacidades
@ -308,42 +312,42 @@ métodos:
| Método | Qué registra |
| ------------------------------------------------ | ------------------------------- |
| `api.registerProvider(...)` | Inferencia de texto (LLM) |
| `api.registerCliBackend(...)` | Backend de inferencia CLI local |
| `api.registerCliBackend(...)` | Backend local de inferencia CLI |
| `api.registerChannel(...)` | Canal de mensajería |
| `api.registerSpeechProvider(...)` | Síntesis de texto a voz / STT |
| `api.registerRealtimeTranscriptionProvider(...)` | Transcripción en tiempo real por streaming |
| `api.registerRealtimeVoiceProvider(...)` | Sesiones de voz en tiempo real dúplex |
| `api.registerRealtimeVoiceProvider(...)` | Sesiones dúplex de voz en tiempo real |
| `api.registerMediaUnderstandingProvider(...)` | Análisis de imagen/audio/video |
| `api.registerImageGenerationProvider(...)` | Generación de imágenes |
| `api.registerMusicGenerationProvider(...)` | Generación musical |
| `api.registerMusicGenerationProvider(...)` | Generación de música |
| `api.registerVideoGenerationProvider(...)` | Generación de video |
| `api.registerWebFetchProvider(...)` | Proveedor de obtención / scraping web |
| `api.registerWebFetchProvider(...)` | Proveedor de obtención/scraping web |
| `api.registerWebSearchProvider(...)` | Búsqueda web |
### Herramientas y comandos
| Método | Qué registra |
| ------------------------------- | --------------------------------------------- |
| `api.registerTool(tool, opts?)` | Herramienta del agente (obligatoria o `{ optional: true }`) |
| `api.registerCommand(def)` | Comando personalizado (omite el LLM) |
| Método | Qué registra |
| ------------------------------- | -------------------------------------------- |
| `api.registerTool(tool, opts?)` | Herramienta del agente (requerida o `{ optional: true }`) |
| `api.registerCommand(def)` | Comando personalizado (omite el LLM) |
### Infraestructura
| Método | Qué registra |
| ---------------------------------------------- | -------------------------------------- |
| `api.registerHook(events, handler, opts?)` | Hook de eventos |
| `api.registerHttpRoute(params)` | Endpoint HTTP del gateway |
| `api.registerGatewayMethod(name, handler)` | Método RPC del gateway |
| `api.registerCli(registrar, opts?)` | Subcomando CLI |
| `api.registerHttpRoute(params)` | Endpoint HTTP de la gateway |
| `api.registerGatewayMethod(name, handler)` | Método RPC de la gateway |
| `api.registerCli(registrar, opts?)` | Subcomando de CLI |
| `api.registerService(service)` | Servicio en segundo plano |
| `api.registerInteractiveHandler(registration)` | Controlador interactivo |
| `api.registerMemoryPromptSupplement(builder)` | Sección aditiva del prompt adyacente a memoria |
| `api.registerMemoryCorpusSupplement(adapter)` | Corpus aditivo de lectura/búsqueda de memoria |
| `api.registerInteractiveHandler(registration)` | Manejador interactivo |
| `api.registerMemoryPromptSupplement(builder)` | Sección de prompt aditiva adyacente a memoria |
| `api.registerMemoryCorpusSupplement(adapter)` | Corpus aditivo de búsqueda/lectura de memoria |
Los espacios de nombres administrativos reservados del núcleo (`config.*`, `exec.approvals.*`, `wizard.*`,
`update.*`) siempre permanecen como `operator.admin`, incluso si un plugin intenta asignar
un alcance más restringido a un método del gateway. Prefiera prefijos específicos del plugin para
los métodos propiedad del plugin.
`update.*`) siempre permanecen como `operator.admin`, incluso si un plugin intenta asignar un
ámbito más restringido a un método de gateway. Prefiere prefijos específicos del plugin para
métodos propiedad del plugin.
### Metadatos de registro de CLI
@ -351,10 +355,10 @@ los métodos propiedad del plugin.
- `commands`: raíces de comandos explícitas propiedad del registrador
- `descriptors`: descriptores de comandos en tiempo de análisis usados para la ayuda del CLI raíz,
el enrutamiento y el registro diferido del CLI del plugin
enrutamiento y registro lazy del CLI del plugin
Si quiere que un comando del plugin siga cargándose de forma diferida en la ruta normal del CLI raíz,
proporcione `descriptors` que cubran cada raíz de comando de nivel superior expuesta por ese
Si quieres que un comando de plugin permanezca con lazy-loading en la ruta normal del CLI raíz,
proporciona `descriptors` que cubran cada raíz de comando de nivel superior expuesta por ese
registrador.
```typescript
@ -367,7 +371,7 @@ api.registerCli(
descriptors: [
{
name: "matrix",
description: "Administrar cuentas, verificación, dispositivos y estado de perfil de Matrix",
description: "Administra cuentas, verificación, dispositivos y estado de perfil de Matrix",
hasSubcommands: true,
},
],
@ -375,88 +379,87 @@ api.registerCli(
);
```
Use `commands` por sí solo únicamente cuando no necesite registro diferido en el CLI raíz.
Esa ruta de compatibilidad ansiosa sigue siendo compatible, pero no instala
marcadores respaldados por descriptores para la carga diferida en tiempo de análisis.
Usa `commands` por sí solo solo cuando no necesites registro lazy del CLI raíz.
Esa ruta de compatibilidad eager sigue siendo compatible, pero no instala
marcadores de posición respaldados por descriptores para lazy loading en tiempo de análisis.
### Registro de backends de CLI
### Registro de backend CLI
`api.registerCliBackend(...)` permite que un plugin posea la configuración predeterminada de un
backend de CLI de IA local como `codex-cli`.
`api.registerCliBackend(...)` permite que un plugin se encargue de la configuración predeterminada de un
backend CLI local de IA como `codex-cli`.
- El `id` del backend se convierte en el prefijo del proveedor en referencias de modelo como `codex-cli/gpt-5`.
- El `id` del backend se convierte en el prefijo del proveedor en referencias de modelos como `codex-cli/gpt-5`.
- La `config` del backend usa la misma forma que `agents.defaults.cliBackends.<id>`.
- La configuración del usuario sigue teniendo prioridad. OpenClaw fusiona `agents.defaults.cliBackends.<id>` sobre el
valor predeterminado del plugin antes de ejecutar la CLI.
- Use `normalizeConfig` cuando un backend necesite reescrituras de compatibilidad después de la fusión
- La configuración del usuario sigue teniendo prioridad. OpenClaw fusiona `agents.defaults.cliBackends.<id>` sobre la
predeterminada del plugin antes de ejecutar el CLI.
- Usa `normalizeConfig` cuando un backend necesite reescrituras de compatibilidad después de la fusión
(por ejemplo, normalizar formas antiguas de flags).
### Ranuras exclusivas
| Método | Qué registra |
| ------------------------------------------ | -------------------------------------- |
| `api.registerContextEngine(id, factory)` | Motor de contexto (uno activo a la vez) |
| `api.registerMemoryCapability(capability)` | Capacidad de memoria unificada |
| `api.registerMemoryPromptSection(builder)` | Constructor de secciones de prompts de memoria |
| `api.registerMemoryFlushPlan(resolver)` | Resolutor del plan de vaciado de memoria |
| `api.registerMemoryRuntime(runtime)` | Adaptador de tiempo de ejecución de memoria |
| Método | Qué registra |
| ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `api.registerContextEngine(id, factory)` | Motor de contexto (solo uno activo a la vez). El callback `assemble()` recibe `availableTools` y `citationsMode` para que el motor pueda adaptar las adiciones al prompt. |
| `api.registerMemoryCapability(capability)` | Capacidad unificada de memoria |
| `api.registerMemoryPromptSection(builder)` | Constructor de sección de prompt de memoria |
| `api.registerMemoryFlushPlan(resolver)` | Resolvedor de plan de vaciado de memoria |
| `api.registerMemoryRuntime(runtime)` | Adaptador de tiempo de ejecución de memoria |
### Adaptadores de embeddings de memoria
| Método | Qué registra |
| ---------------------------------------------- | ------------------------------------------------ |
| Método | Qué registra |
| ---------------------------------------------- | ---------------------------------------------- |
| `api.registerMemoryEmbeddingProvider(adapter)` | Adaptador de embeddings de memoria para el plugin activo |
- `registerMemoryCapability` es la API exclusiva preferida para plugins de memoria.
- `registerMemoryCapability` es la API exclusiva de plugin de memoria preferida.
- `registerMemoryCapability` también puede exponer `publicArtifacts.listArtifacts(...)`
para que plugins complementarios consuman artefactos de memoria exportados a través de
`openclaw/plugin-sdk/memory-host-core` en lugar de acceder al diseño privado
de un plugin de memoria específico.
- `registerMemoryPromptSection`, `registerMemoryFlushPlan` y
`registerMemoryRuntime` son API exclusivas de plugins de memoria compatibles con versiones heredadas.
para que los plugins complementarios consuman artefactos de memoria exportados mediante
`openclaw/plugin-sdk/memory-host-core` en lugar de acceder al diseño privado de un
plugin de memoria específico.
- `registerMemoryPromptSection`, `registerMemoryFlushPlan`, y
`registerMemoryRuntime` son API exclusivas de plugin de memoria compatibles con el legado.
- `registerMemoryEmbeddingProvider` permite que el plugin de memoria activo registre uno
o más id de adaptadores de embeddings (por ejemplo `openai`, `gemini` o un id
personalizado definido por el plugin).
o más ids de adaptadores de embeddings (por ejemplo `openai`, `gemini`, o un id personalizado definido por el plugin).
- La configuración del usuario, como `agents.defaults.memorySearch.provider` y
`agents.defaults.memorySearch.fallback`, se resuelve contra esos id de adaptadores registrados.
`agents.defaults.memorySearch.fallback`, se resuelve contra esos ids de adaptadores registrados.
### Eventos y ciclo de vida
| Método | Qué hace |
| -------------------------------------------- | ---------------------------- |
| `api.on(hookName, handler, opts?)` | Hook tipado del ciclo de vida |
| `api.onConversationBindingResolved(handler)` | Devolución de llamada de enlace de conversación |
| Método | Qué hace |
| -------------------------------------------- | --------------------------- |
| `api.on(hookName, handler, opts?)` | Hook de ciclo de vida tipado |
| `api.onConversationBindingResolved(handler)` | Callback de vinculación de conversación |
### Semántica de decisión de hooks
- `before_tool_call`: devolver `{ block: true }` es terminal. Una vez que cualquier controlador lo establece, se omiten los controladores de menor prioridad.
- `before_tool_call`: devolver `{ block: false }` se trata como ausencia de decisión (igual que omitir `block`), no como una anulación.
- `before_install`: devolver `{ block: true }` es terminal. Una vez que cualquier controlador lo establece, se omiten los controladores de menor prioridad.
- `before_install`: devolver `{ block: false }` se trata como ausencia de decisión (igual que omitir `block`), no como una anulación.
- `reply_dispatch`: devolver `{ handled: true, ... }` es terminal. Una vez que cualquier controlador reclama el despacho, se omiten los controladores de menor prioridad y la ruta predeterminada de despacho del modelo.
- `message_sending`: devolver `{ cancel: true }` es terminal. Una vez que cualquier controlador lo establece, se omiten los controladores de menor prioridad.
- `message_sending`: devolver `{ cancel: false }` se trata como ausencia de decisión (igual que omitir `cancel`), no como una anulación.
- `before_tool_call`: devolver `{ block: true }` es terminal. Una vez que cualquier manejador lo establece, se omiten los manejadores de menor prioridad.
- `before_tool_call`: devolver `{ block: false }` se trata como sin decisión (igual que omitir `block`), no como una anulación.
- `before_install`: devolver `{ block: true }` es terminal. Una vez que cualquier manejador lo establece, se omiten los manejadores de menor prioridad.
- `before_install`: devolver `{ block: false }` se trata como sin decisión (igual que omitir `block`), no como una anulación.
- `reply_dispatch`: devolver `{ handled: true, ... }` es terminal. Una vez que cualquier manejador reclama el despacho, se omiten los manejadores de menor prioridad y la ruta predeterminada de despacho del modelo.
- `message_sending`: devolver `{ cancel: true }` es terminal. Una vez que cualquier manejador lo establece, se omiten los manejadores de menor prioridad.
- `message_sending`: devolver `{ cancel: false }` se trata como sin decisión (igual que omitir `cancel`), no como una anulación.
### Campos del objeto API
| Campo | Tipo | Descripción |
| ------------------------ | ------------------------- | ------------------------------------------------------------------------------------------ |
| `api.id` | `string` | Id del plugin |
| `api.name` | `string` | Nombre visible |
| `api.version` | `string?` | Versión del plugin (opcional) |
| `api.description` | `string?` | Descripción del plugin (opcional) |
| `api.source` | `string` | Ruta de origen del plugin |
| `api.rootDir` | `string?` | Directorio raíz del plugin (opcional) |
| `api.config` | `OpenClawConfig` | Instantánea actual de configuración (instantánea activa en memoria del tiempo de ejecución cuando está disponible) |
| `api.pluginConfig` | `Record<string, unknown>` | Configuración específica del plugin desde `plugins.entries.<id>.config` |
| `api.runtime` | `PluginRuntime` | [Auxiliares de tiempo de ejecución](/es/plugins/sdk-runtime) |
| `api.logger` | `PluginLogger` | Logger con alcance (`debug`, `info`, `warn`, `error`) |
| Campo | Tipo | Descripción |
| ------------------------ | ------------------------- | -------------------------------------------------------------------------------------------- |
| `api.id` | `string` | Id del plugin |
| `api.name` | `string` | Nombre para mostrar |
| `api.version` | `string?` | Versión del plugin (opcional) |
| `api.description` | `string?` | Descripción del plugin (opcional) |
| `api.source` | `string` | Ruta de origen del plugin |
| `api.rootDir` | `string?` | Directorio raíz del plugin (opcional) |
| `api.config` | `OpenClawConfig` | Snapshot actual de configuración (snapshot activo en memoria del tiempo de ejecución cuando está disponible) |
| `api.pluginConfig` | `Record<string, unknown>` | Configuración específica del plugin desde `plugins.entries.<id>.config` |
| `api.runtime` | `PluginRuntime` | [Ayudantes de tiempo de ejecución](/es/plugins/sdk-runtime) |
| `api.logger` | `PluginLogger` | Logger con ámbito (`debug`, `info`, `warn`, `error`) |
| `api.registrationMode` | `PluginRegistrationMode` | Modo de carga actual; `"setup-runtime"` es la ventana ligera de inicio/configuración previa a la entrada completa |
| `api.resolvePath(input)` | `(string) => string` | Resuelve una ruta relativa a la raíz del plugin |
| `api.resolvePath(input)` | `(string) => string` | Resuelve la ruta relativa a la raíz del plugin |
## Convención de módulos internos
Dentro de su plugin, use archivos barril locales para las importaciones internas:
Dentro de tu plugin, usa archivos barrel locales para las importaciones internas:
```
my-plugin/
@ -467,36 +470,42 @@ my-plugin/
```
<Warning>
Nunca importe su propio plugin mediante `openclaw/plugin-sdk/<your-plugin>`
desde código de producción. Encamine las importaciones internas mediante `./api.ts` o
Nunca importes tu propio plugin mediante `openclaw/plugin-sdk/<your-plugin>`
desde código de producción. Dirige las importaciones internas a través de `./api.ts` o
`./runtime-api.ts`. La ruta del SDK es solo el contrato externo.
</Warning>
Las superficies públicas cargadas mediante fachada de plugins integrados (`api.ts`, `runtime-api.ts`,
`index.ts`, `setup-entry.ts` y archivos de entrada pública similares) ahora prefieren la
instantánea de configuración activa del tiempo de ejecución cuando OpenClaw ya está en ejecución. Si todavía no existe una instantánea de tiempo de ejecución, recurren al archivo de configuración resuelto en disco.
Las superficies públicas de plugins integrados cargadas por fachada (`api.ts`, `runtime-api.ts`,
`index.ts`, `setup-entry.ts`, y archivos de entrada pública similares) ahora prefieren el
snapshot activo de configuración en tiempo de ejecución cuando OpenClaw ya se está ejecutando. Si todavía
no existe un snapshot en tiempo de ejecución, recurren al archivo de configuración resuelto en disco.
Los plugins de proveedor también pueden exponer un barril de contrato local del plugin y de alcance limitado cuando un auxiliar es intencionalmente específico del proveedor y aún no pertenece a una subruta genérica del SDK. Ejemplo integrado actual: el proveedor Anthropic mantiene sus auxiliares de streaming de Claude en su propia capa pública `api.ts` / `contract-api.ts` en lugar de promover la lógica del encabezado beta de Anthropic y `service_tier` a un contrato genérico `plugin-sdk/*`.
Los plugins de proveedores también pueden exponer un barrel local del plugin con un contrato acotado cuando un
ayudante es intencionalmente específico del proveedor y aún no pertenece a una subruta genérica
del SDK. Ejemplo integrado actual: el proveedor Anthropic conserva sus
ayudantes de stream Claude en su propio punto de acceso público `api.ts` / `contract-api.ts` en lugar de
promover la lógica de encabezado beta de Anthropic y `service_tier` a un contrato genérico
`plugin-sdk/*`.
Otros ejemplos integrados actuales:
- `@openclaw/openai-provider`: `api.ts` exporta constructores de proveedores,
auxiliares de modelos predeterminados y constructores de proveedores en tiempo real
ayudantes de modelo predeterminado y constructores de proveedores realtime
- `@openclaw/openrouter-provider`: `api.ts` exporta el constructor del proveedor más
auxiliares de onboarding/configuración
ayudantes de onboarding/configuración
<Warning>
El código de producción de extensiones también debe evitar importaciones desde `openclaw/plugin-sdk/<other-plugin>`.
Si un auxiliar se comparte realmente, promuévalo a una subruta neutral del SDK
como `openclaw/plugin-sdk/speech`, `.../provider-model-shared` u otra
superficie orientada a capacidades, en lugar de acoplar dos plugins entre sí.
El código de producción de extensiones también debe evitar las importaciones
`openclaw/plugin-sdk/<other-plugin>`. Si un ayudante es realmente compartido, promuévelo a una subruta neutra del SDK
como `openclaw/plugin-sdk/speech`, `.../provider-model-shared`, u otra
superficie orientada a capacidades en lugar de acoplar dos plugins entre sí.
</Warning>
## Relacionado
- [Puntos de entrada](/es/plugins/sdk-entrypoints) — opciones de `definePluginEntry` y `defineChannelPluginEntry`
- [Auxiliares de tiempo de ejecución](/es/plugins/sdk-runtime) — referencia completa del espacio de nombres `api.runtime`
- [Configuración y config](/es/plugins/sdk-setup) — empaquetado, manifiestos y esquemas de configuración
- [Pruebas](/es/plugins/sdk-testing) — utilidades de prueba y reglas de lint
- [Migración del SDK](/es/plugins/sdk-migration) — migración desde superficies obsoletas
- [Internos de plugins](/es/plugins/architecture) — arquitectura profunda y modelo de capacidades
- [Entry Points](/es/plugins/sdk-entrypoints) — opciones de `definePluginEntry` y `defineChannelPluginEntry`
- [Runtime Helpers](/es/plugins/sdk-runtime) — referencia completa del espacio de nombres `api.runtime`
- [Setup and Config](/es/plugins/sdk-setup) — empaquetado, manifiestos, esquemas de configuración
- [Testing](/es/plugins/sdk-testing) — utilidades de prueba y reglas de lint
- [SDK Migration](/es/plugins/sdk-migration) — migración desde superficies obsoletas
- [Plugin Internals](/es/plugins/architecture) — arquitectura profunda y modelo de capacidades

View File

@ -1,30 +1,30 @@
---
read_when:
- Estás creando un nuevo plugin de proveedor de modelos
- Quieres añadir un proxy compatible con OpenAI o un LLM personalizado a OpenClaw
- Necesitas entender la autenticación del proveedor, los catálogos y los hooks de tiempo de ejecución
- Quieres añadir a OpenClaw un proxy compatible con OpenAI o un LLM personalizado
- Necesitas entender la autenticación del proveedor, los catálogos y los hooks de runtime
sidebarTitle: Provider Plugins
summary: Guía paso a paso para crear un plugin de proveedor de modelos para OpenClaw
title: Creación de plugins de proveedor
title: Crear plugins de proveedor
x-i18n:
generated_at: "2026-04-07T05:06:01Z"
generated_at: "2026-04-09T01:30:35Z"
model: gpt-5.4
provider: openai
source_hash: 4da82a353e1bf4fe6dc09e14b8614133ac96565679627de51415926014bd3990
source_hash: 38d9af522dc19e49c81203a83a4096f01c2398b1df771c848a30ad98f251e9e1
source_path: plugins/sdk-provider-plugins.md
workflow: 15
---
# Creación de plugins de proveedor
# Crear plugins de proveedor
Esta guía explica cómo crear un plugin de proveedor que añada un proveedor de modelos
Esta guía explica cómo crear 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 de API y resolución dinámica de modelos.
autenticación mediante clave de API y resolución dinámica de modelos.
<Info>
Si todavía no has creado ningún plugin de OpenClaw, lee primero
[Primeros pasos](/es/plugins/building-plugins) para ver la estructura básica del
paquete y la configuración del manifiesto.
Si aún no has creado ningún plugin de OpenClaw, lee primero
[Getting Started](/es/plugins/building-plugins) para conocer la estructura básica
del paquete y la configuración del manifiesto.
</Info>
## Tutorial
@ -57,7 +57,7 @@ autenticación por clave de API y resolución dinámica de modelos.
{
"id": "acme-ai",
"name": "Acme AI",
"description": "Proveedor de modelos Acme AI",
"description": "Acme AI model provider",
"providers": ["acme-ai"],
"modelSupport": {
"modelPrefixes": ["acme-"]
@ -65,17 +65,20 @@ autenticación por clave de API y resolución dinámica de modelos.
"providerAuthEnvVars": {
"acme-ai": ["ACME_AI_API_KEY"]
},
"providerAuthAliases": {
"acme-ai-coding": "acme-ai"
},
"providerAuthChoices": [
{
"provider": "acme-ai",
"method": "api-key",
"choiceId": "acme-ai-api-key",
"choiceLabel": "Clave de API de Acme AI",
"choiceLabel": "Acme AI API key",
"groupId": "acme-ai",
"groupLabel": "Acme AI",
"cliFlag": "--acme-ai-api-key",
"cliOption": "--acme-ai-api-key <key>",
"cliDescription": "Clave de API de Acme AI"
"cliDescription": "Acme AI API key"
}
],
"configSchema": {
@ -87,16 +90,17 @@ autenticación por clave de API y resolución dinámica de modelos.
</CodeGroup>
El manifiesto declara `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 IDs abreviados de modelo
como `acme-large` antes de que existan hooks de tiempo de ejecución. Si publicas el
credenciales sin cargar el runtime de tu plugin. Añade `providerAuthAliases`
cuando una variante del proveedor deba reutilizar la autenticación de otro id de proveedor. `modelSupport`
es opcional y permite que OpenClaw cargue automáticamente tu plugin de proveedor a partir de ids
abreviados de modelo como `acme-large` antes de que existan hooks de runtime. Si publicas el
proveedor en ClawHub, esos campos `openclaw.compat` y `openclaw.build`
son obligatorios en `package.json`.
</Step>
<Step title="Registrar el proveedor">
Un proveedor mínimo necesita `id`, `label`, `auth` y `catalog`:
Un proveedor mínimo necesita un `id`, `label`, `auth` y `catalog`:
```typescript index.ts
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
@ -167,13 +171,14 @@ autenticación por clave de API y resolución dinámica de modelos.
});
```
Ese es un proveedor funcional. Los usuarios ahora pueden ejecutar
`openclaw onboard --acme-ai-api-key <key>` y seleccionar
`acme-ai/acme-large` como modelo.
Ese es un proveedor funcional. Ahora los usuarios pueden
ejecutar `openclaw onboard --acme-ai-api-key <key>` y seleccionar
`acme-ai/acme-large` como su modelo.
Para proveedores integrados que solo registran un proveedor de texto con
autenticación por clave de API más un único tiempo de ejecución respaldado por catálogo, prefiere el helper
más específico `defineSingleProviderPluginEntry(...)`:
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, es preferible
usar el helper más específico
`defineSingleProviderPluginEntry(...)`:
```typescript
import { defineSingleProviderPluginEntry } from "openclaw/plugin-sdk/provider-entry";
@ -208,25 +213,25 @@ autenticación por clave de API y resolución dinámica de modelos.
});
```
Si tu flujo de autenticación también necesita modificar `models.providers.*`, alias y
el modelo predeterminado del agente durante la incorporación, usa los helpers predefinidos de
Si tu flujo de autenticación también necesita aplicar parches a `models.providers.*`, alias y
al 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 en streaming en el
transporte normal `openai-completions`, prefiere los helpers compartidos de catálogo en
transporte normal `openai-completions`, es preferible usar los helpers compartidos de catálogo 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, por lo que los endpoints nativos de estilo Moonshot/DashScope siguen
pudiendo activarse incluso cuando un plugin usa un ID de proveedor personalizado.
del id del proveedor. `supportsNativeStreamingUsageCompat(...)` y
`applyProviderNativeStreamingUsageCompat(...)` detectan la compatibilidad a partir del mapa de capacidades
del endpoint, de modo que los endpoints nativos tipo Moonshot/DashScope sigan
activándose incluso cuando un plugin esté usando un id de proveedor personalizado.
</Step>
<Step title="Añadir resolución dinámica de modelos">
Si tu proveedor acepta IDs arbitrarios de modelo (como un proxy o router),
Si tu proveedor acepta ids de modelo arbitrarios (como un proxy o router),
añade `resolveDynamicModel`:
```typescript
@ -249,17 +254,17 @@ autenticación por clave de API y resolución dinámica de modelos.
```
Si la resolución requiere una llamada de red, usa `prepareDynamicModel` para el
calentamiento asíncrono: `resolveDynamicModel` se vuelve a ejecutar después de que se complete.
calentamiento asíncrono; `resolveDynamicModel` se ejecuta de nuevo cuando se completa.
</Step>
<Step title="Añadir hooks de tiempo de ejecución (según sea necesario)">
<Step title="Añadir hooks de runtime (según sea necesario)">
La mayoría de los proveedores solo necesitan `catalog` + `resolveDynamicModel`. Añade hooks
de forma incremental a medida que tu proveedor los necesite.
de forma incremental según lo requiera tu proveedor.
Los constructores de helpers compartidos ahora cubren las familias más comunes de
compatibilidad de repetición/herramientas, por lo que normalmente los plugins no necesitan conectar
manualmente cada hook uno por uno:
Los generadores de helpers compartidos ahora cubren las familias más habituales de
reproducción/compatibilidad con herramientas, así que normalmente los plugins no necesitan
conectar manualmente cada hook uno por uno:
```typescript
import { buildProviderReplayFamilyHooks } from "openclaw/plugin-sdk/provider-model-shared";
@ -279,17 +284,17 @@ autenticación por clave de API y resolución dinámica de modelos.
});
```
Familias de repetición disponibles actualmente:
Familias de reproducción disponibles actualmente:
| Family | What it wires in |
| --- | --- |
| `openai-compatible` | Política compartida de repetición estilo OpenAI para transportes compatibles con OpenAI, incluido el saneamiento de IDs de llamadas a herramientas, correcciones del orden con el asistente primero y validación genérica de turnos Gemini cuando el transporte lo necesita |
| `anthropic-by-model` | Política de repetición compatible con Claude elegida por `modelId`, para que los transportes `anthropic-message` solo apliquen limpieza de bloques de pensamiento específica de Claude cuando el modelo resuelto sea realmente un ID de Claude |
| `google-gemini` | Política nativa de repetición de Gemini más saneamiento de repetición de arranque y modo de salida de razonamiento etiquetado |
| `passthrough-gemini` | Saneamiento de firmas de pensamiento de Gemini para modelos Gemini que se ejecutan a través de transportes proxy compatibles con OpenAI; no habilita la validación nativa de repetición de Gemini ni las reescrituras de arranque |
| `hybrid-anthropic-openai` | Política híbrida para proveedores que mezclan superficies de modelo `anthropic-message` y compatibles con OpenAI en un solo plugin; la eliminación opcional de bloques de pensamiento solo para Claude sigue limitada al lado Anthropic |
| `openai-compatible` | Política compartida de reproducción de estilo OpenAI para transportes compatibles con OpenAI, incluida la limpieza de `tool-call-id`, correcciones de orden con el asistente primero y validación genérica de turnos de Gemini cuando 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 reciban limpieza de bloques de razonamiento específica de Claude cuando el modelo resuelto sea realmente un id de Claude |
| `google-gemini` | Política nativa de reproducción de Gemini más saneamiento de reproducción bootstrap y modo etiquetado de salida de razonamiento |
| `passthrough-gemini` | Saneamiento de firmas de pensamiento de Gemini para modelos Gemini que se ejecutan mediante transportes proxy compatibles con OpenAI; no habilita validación nativa de reproducción de 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 permanece limitada al lado Anthropic |
Ejemplos integrados reales:
Ejemplos reales incluidos:
- `google` y `google-gemini-cli`: `google-gemini`
- `openrouter`, `kilocode`, `opencode` y `opencode-go`: `passthrough-gemini`
@ -297,19 +302,19 @@ autenticación por clave de API y resolución dinámica de modelos.
- `minimax`: `hybrid-anthropic-openai`
- `moonshot`, `ollama`, `xai` y `zai`: `openai-compatible`
Familias de streaming disponibles actualmente:
Familias de stream disponibles actualmente:
| Family | What it wires in |
| --- | --- |
| `google-thinking` | Normalización de la carga útil de pensamiento de Gemini en la ruta de streaming compartida |
| `kilocode-thinking` | Envoltorio de razonamiento de Kilo en la ruta de streaming proxy compartida, con `kilo/auto` e IDs de razonamiento proxy no compatibles omitiendo el pensamiento inyectado |
| `moonshot-thinking` | Asignación de carga útil de pensamiento nativo binario de Moonshot a partir de la configuración + nivel de `/think` |
| `minimax-fast-mode` | Reescritura de modelo de modo rápido de MiniMax en la ruta de streaming compartida |
| `openai-responses-defaults` | Envoltorios compartidos de Responses nativas de OpenAI/Codex: encabezados de atribución, `/fast`/`serviceTier`, verbosidad del texto, búsqueda web nativa de Codex, conformación de carga útil de compatibilidad de razonamiento y gestión del contexto de Responses |
| `openrouter-thinking` | Envoltorio de razonamiento de OpenRouter para rutas proxy, con los saltos de modelo no compatible/`auto` gestionados de forma centralizada |
| `google-thinking` | Normalización de carga útil de pensamiento de Gemini en la ruta de stream compartida |
| `kilocode-thinking` | Envoltorio de razonamiento de Kilo en la ruta de stream proxy compartida, con `kilo/auto` e ids de razonamiento proxy no compatibles omitiendo el pensamiento inyectado |
| `moonshot-thinking` | Asignación de carga útil binaria nativa de pensamiento de Moonshot a partir de la configuración y del nivel `/think` |
| `minimax-fast-mode` | Reescritura de modelos de modo rápido de MiniMax en la ruta de stream compartida |
| `openai-responses-defaults` | Envoltorios compartidos de Responses nativas de OpenAI/Codex: encabezados de atribución, `/fast`/`serviceTier`, verbosidad del texto, búsqueda web nativa de Codex, ajuste de carga útil compatible con razonamiento y gestión de contexto de Responses |
| `openrouter-thinking` | Envoltorio de razonamiento de OpenRouter para rutas proxy, con omisiones para modelos no compatibles/`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 |
Ejemplos integrados reales:
Ejemplos reales incluidos:
- `google` y `google-gemini-cli`: `google-thinking`
- `kilocode`: `kilocode-thinking`
@ -319,25 +324,25 @@ autenticación por clave de API y resolución dinámica de modelos.
- `openrouter`: `openrouter-thinking`
- `zai`: `tool-stream-default-on`
`openclaw/plugin-sdk/provider-model-shared` también exporta el enum de familia
de repetición más los helpers compartidos sobre los que se construyen esas familias. Las
exportaciones públicas más comunes incluyen:
`openclaw/plugin-sdk/provider-model-shared` también exporta el enum de familias de reproducción
junto con los helpers compartidos sobre los que se construyen esas familias. Las
exportaciones públicas habituales incluyen:
- `ProviderReplayFamily`
- `buildProviderReplayFamilyHooks(...)`
- constructores compartidos de repetición como `buildOpenAICompatibleReplayPolicy(...)`,
- generadores compartidos de reproducción como `buildOpenAICompatibleReplayPolicy(...)`,
`buildAnthropicReplayPolicyForModel(...)`,
`buildGoogleGeminiReplayPolicy(...)` y
`buildHybridAnthropicOrOpenAIReplayPolicy(...)`
- helpers de repetición de Gemini como `sanitizeGoogleGeminiReplayHistory(...)`
- helpers de reproducción de Gemini como `sanitizeGoogleGeminiReplayHistory(...)`
y `resolveTaggedReasoningOutputMode()`
- helpers de endpoint/modelo como `resolveProviderEndpoint(...)`,
`normalizeProviderId(...)`, `normalizeGooglePreviewModelId(...)` y
`normalizeNativeXaiModelId(...)`
`openclaw/plugin-sdk/provider-stream` expone tanto el constructor de familias como
los helpers públicos de envoltorio que esas familias reutilizan. Las exportaciones públicas
más comunes incluyen:
`openclaw/plugin-sdk/provider-stream` expone tanto el generador de familias como
los helpers públicos de envoltorio que reutilizan esas familias. Las
exportaciones públicas habituales incluyen:
- `ProviderStreamFamily`
- `buildProviderStreamFamilyHooks(...)`
@ -351,44 +356,44 @@ autenticación por clave de API y resolución dinámica de modelos.
- envoltorios compartidos de proxy/proveedor como `createOpenRouterWrapper(...)`,
`createToolStreamWrapper(...)` y `createMinimaxFastModeWrapper(...)`
Algunos helpers de streaming permanecen intencionadamente locales al proveedor. Ejemplo
integrado actual: `@openclaw/anthropic-provider` exporta
Algunos helpers de stream se mantienen locales al proveedor de forma intencionada. Ejemplo
actual incluido: `@openclaw/anthropic-provider` exporta
`wrapAnthropicProviderStream`, `resolveAnthropicBetas`,
`resolveAnthropicFastMode`, `resolveAnthropicServiceTier` y los
constructores de envoltorios Anthropic de nivel inferior desde su interfaz pública `api.ts` /
generadores 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 de betas de Claude OAuth y la restricción de `context1m`.
también codifican el manejo beta de OAuth de Claude y el control de `context1m`.
Otros proveedores integrados también mantienen locales los envoltorios específicos del transporte cuando
Otros proveedores incluidos también mantienen envoltorios específicos de transporte como locales cuando
el comportamiento no se comparte limpiamente entre familias. Ejemplo actual: el
plugin integrado de xAI mantiene en su propio
`wrapStreamFn` la conformación nativa de xAI Responses, incluidas las reescrituras de alias `/fast`, el valor predeterminado de `tool_stream`,
la limpieza de herramientas estrictas no compatibles y la eliminación
de carga útil de razonamiento específica de xAI.
plugin xAI incluido mantiene el ajuste nativo de Responses de xAI en su propio
`wrapStreamFn`, incluyendo reescrituras de alias `/fast`, `tool_stream` predeterminado,
limpieza estricta de herramientas 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 esquemas de herramientas más helpers compartidos de esquema/compatibilidad:
- `ProviderToolCompatFamily` documenta el inventario actual de familias compartidas.
- `buildProviderToolCompatFamilyHooks("gemini")` conecta la
limpieza + diagnóstico de esquemas de Gemini para proveedores que necesitan esquemas de herramientas seguros para Gemini.
- `normalizeGeminiToolSchemas(...)` e `inspectGeminiToolSchemas(...)`
son los helpers públicos subyacentes del esquema Gemini.
- `resolveXaiModelCompatPatch()` devuelve el parche de compatibilidad integrado de xAI:
`toolSchemaProfile: "xai"`, palabras clave de esquema no compatibles, compatibilidad
nativa con `web_search` y decodificación de argumentos de llamadas a herramientas con entidades HTML.
- `applyXaiModelCompat(model)` aplica ese mismo parche de compatibilidad de xAI a un
- `ProviderToolCompatFamily` documenta hoy el inventario de familias compartidas.
- `buildProviderToolCompatFamilyHooks("gemini")` conecta limpieza de esquemas Gemini
+ diagnósticos para proveedores que necesitan esquemas de herramientas seguros para Gemini.
- `normalizeGeminiToolSchemas(...)` y `inspectGeminiToolSchemas(...)`
son los helpers públicos subyacentes para esquemas Gemini.
- `resolveXaiModelCompatPatch()` devuelve el parche de compatibilidad xAI incluido:
`toolSchemaProfile: "xai"`, palabras clave de esquema no compatibles, compatibilidad nativa con
`web_search` y decodificación de argumentos de llamadas a herramientas con entidades HTML.
- `applyXaiModelCompat(model)` aplica ese mismo parche de compatibilidad xAI a un
modelo resuelto antes de que llegue al ejecutor.
Ejemplo integrado real: el plugin de xAI usa `normalizeResolvedModel` más
`contributeResolvedModelCompat` para que esos metadatos de compatibilidad sigan siendo propiedad del
proveedor en lugar de codificar reglas de xAI en el núcleo.
Ejemplo real incluido: el plugin xAI usa `normalizeResolvedModel` más
`contributeResolvedModelCompat` para mantener esos metadatos de compatibilidad bajo
propiedad del proveedor en lugar de codificar reglas xAI en el núcleo.
El mismo patrón de raíz de paquete también sustenta otros proveedores integrados:
El mismo patrón de raíz de paquete también respalda otros proveedores incluidos:
- `@openclaw/openai-provider`: `api.ts` exporta constructores de proveedor,
helpers de modelos predeterminados y constructores de proveedores en tiempo real
- `@openclaw/openrouter-provider`: `api.ts` exporta el constructor de proveedor
- `@openclaw/openai-provider`: `api.ts` exporta generadores de proveedor,
helpers de modelo predeterminado y generadores de proveedores realtime
- `@openclaw/openrouter-provider`: `api.ts` exporta el generador de proveedor
más helpers de incorporación/configuración
<Tabs>
@ -424,7 +429,7 @@ autenticación por clave de API y resolución dinámica de modelos.
},
```
</Tab>
<Tab title="Identidad de transporte nativo">
<Tab title="Identidad de transporte nativa">
Para proveedores que necesitan encabezados o metadatos nativos de solicitud/sesión en
transportes HTTP o WebSocket genéricos:
@ -462,73 +467,72 @@ autenticación por clave de API y resolución dinámica de modelos.
</Tabs>
<Accordion title="Todos los hooks de proveedor disponibles">
OpenClaw llama a los hooks en este orden. La mayoría de los proveedores solo usan 2-3:
OpenClaw llama a los hooks en este orden. La mayoría de los proveedores solo usan 2 o 3:
| # | Hook | Cuándo usarlo |
| --- | --- | --- |
| 1 | `catalog` | Catálogo de modelos o valores predeterminados de URL base |
| 2 | `applyConfigDefaults` | Valores globales predeterminados controlados por el proveedor durante la materialización de la configuración |
| 3 | `normalizeModelId` | Limpieza de alias de IDs de modelo heredados/de vista previa antes de la búsqueda |
| 4 | `normalizeTransport` | Limpieza de `api` / `baseUrl` de la familia de proveedor antes del ensamblado genérico del modelo |
| 5 | `normalizeConfig` | Normalizar la configuración `models.providers.<id>` |
| 6 | `applyNativeStreamingUsageCompat` | Reescrituras de compatibilidad de uso de streaming nativo para proveedores configurados |
| 7 | `resolveConfigApiKey` | Resolución de autenticación de marcador de entorno controlada por el proveedor |
| 1 | `catalog` | Catálogo de modelos o valores predeterminados de `baseUrl` |
| 2 | `applyConfigDefaults` | Valores predeterminados globales propiedad del proveedor durante la materialización de la configuración |
| 3 | `normalizeModelId` | Limpieza de alias heredados/de vista previa de ids de modelo antes de la búsqueda |
| 4 | `normalizeTransport` | Limpieza de familia del proveedor `api` / `baseUrl` antes del ensamblado genérico del modelo |
| 5 | `normalizeConfig` | Normalizar configuración `models.providers.<id>` |
| 6 | `applyNativeStreamingUsageCompat` | Reescrituras de compatibilidad de uso nativo en streaming para proveedores de configuración |
| 7 | `resolveConfigApiKey` | Resolución de autenticación de marcadores de entorno propiedad del proveedor |
| 8 | `resolveSyntheticAuth` | Autenticación sintética local/autohospedada o basada en configuración |
| 9 | `shouldDeferSyntheticProfileAuth` | Colocar marcadores de posición sintéticos de perfiles almacenados por detrás de la autenticación de entorno/configuración |
| 10 | `resolveDynamicModel` | Aceptar IDs arbitrarios de modelo ascendente |
| 9 | `shouldDeferSyntheticProfileAuth` | Rebajar placeholders sintéticos de perfiles almacenados por detrás de autenticación env/config |
| 10 | `resolveDynamicModel` | Aceptar ids de modelo arbitrarios del upstream |
| 11 | `prepareDynamicModel` | Obtención asíncrona de metadatos antes de resolver |
| 12 | `normalizeResolvedModel` | Reescrituras de transporte antes del ejecutor |
Notas sobre el comportamiento de respaldo en tiempo de ejecución:
Notas sobre el fallback en runtime:
- `normalizeConfig` comprueba primero el proveedor coincidente y después otros
plugins de proveedor con capacidad de hook hasta que uno cambie realmente la configuración.
Si ningún hook de proveedor reescribe una entrada de configuración compatible de la familia Google,
se sigue aplicando el normalizador integrado de configuración de Google.
- `resolveConfigApiKey` usa el hook del proveedor cuando está expuesto. La ruta integrada
`amazon-bedrock` también tiene aquí un resolvedor integrado de marcadores
de entorno de AWS, aunque la autenticación en tiempo de ejecución de Bedrock siga usando la
cadena predeterminada del SDK de AWS.
| 13 | `contributeResolvedModelCompat` | Banderas de compatibilidad para modelos del proveedor detrás de otro transporte compatible |
| 14 | `capabilities` | Bolsa heredada de capacidades estáticas; solo para compatibilidad |
| 15 | `normalizeToolSchemas` | Limpieza de esquemas de herramientas controlada por el proveedor antes del registro |
| 16 | `inspectToolSchemas` | Diagnóstico de esquemas de herramientas controlado por el proveedor |
- `normalizeConfig` primero comprueba el proveedor coincidente y después otros
plugins de proveedor con capacidad de hooks hasta que uno realmente cambie la configuración.
Si ningún hook de proveedor reescribe una entrada de configuración compatible de la familia Google,
se sigue aplicando el normalizador de configuración de Google incluido.
- `resolveConfigApiKey` usa el hook del proveedor cuando se expone. La ruta incluida
de `amazon-bedrock` también tiene aquí un resolvedor integrado de marcadores de entorno AWS,
aunque la autenticación de runtime de Bedrock siga 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 esquemas de herramientas propiedad del proveedor antes del registro |
| 16 | `inspectToolSchemas` | Diagnósticos de esquemas 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` | Transporte `StreamFn` totalmente personalizado |
| 20 | `wrapStreamFn` | Envoltorios personalizados de encabezados/cuerpo en la ruta normal de streaming |
| 18 | `prepareExtraParams` | Parámetros predeterminados de la solicitud |
| 19 | `createStreamFn` | Transporte `StreamFn` completamente 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` | Orientación para reparar autenticación |
| 26 | `matchesContextOverflowError` | Detección de desbordamiento controlada por el proveedor |
| 27 | `classifyFailoverReason` | Clasificación de límite de velocidad/sobrecarga controlada por el proveedor |
| 28 | `isCacheTtlEligible` | Control de TTL de la caché de prompts |
| 29 | `buildMissingAuthMessage` | Pista personalizada para autenticación faltante |
| 30 | `suppressBuiltInModel` | Ocultar filas ascendentes obsoletas |
| 31 | `augmentModelCatalog` | Filas sintéticas de compatibilidad anticipada |
| 22 | `resolveWebSocketSessionPolicy` | Encabezados/enfriamiento de sesión WS nativos |
| 23 | `formatApiKey` | Forma personalizada del token de runtime |
| 24 | `refreshOAuth` | Actualización OAuth personalizada |
| 25 | `buildAuthDoctorHint` | Orientación de reparación de autenticación |
| 26 | `matchesContextOverflowError` | Detección de desbordamiento propiedad del proveedor |
| 27 | `classifyFailoverReason` | Clasificación propiedad del proveedor de límite de tasa/sobrecarga |
| 28 | `isCacheTtlEligible` | Control TTL de la caché de prompts |
| 29 | `buildMissingAuthMessage` | Sugerencia 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 de razonamiento `xhigh` |
| 33 | `supportsXHighThinking` | Compatibilidad con razonamiento `xhigh` |
| 34 | `resolveDefaultThinkingLevel` | Política predeterminada de `/think` |
| 35 | `isModernModelRef` | Coincidencia de modelos live/smoke |
| 36 | `prepareRuntimeAuth` | Intercambio de tokens antes de la inferencia |
| 37 | `resolveUsageAuth` | Análisis personalizado de credenciales de uso |
| 38 | `fetchUsageSnapshot` | Endpoint de uso personalizado |
| 39 | `createEmbeddingProvider` | Adaptador de embeddings controlado por el proveedor para memoria/búsqueda |
| 40 | `buildReplayPolicy` | Política personalizada de repetición/compactación de transcripciones |
| 41 | `sanitizeReplayHistory` | Reescrituras de repetición específicas del proveedor después de la limpieza genérica |
| 42 | `validateReplayTurns` | Validación estricta de turnos de repetición antes del ejecutor integrado |
| 43 | `onModelSelected` | Callback posterior a la selección (por ejemplo, telemetría) |
| 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 tras la limpieza genérica |
| 42 | `validateReplayTurns` | Validación estricta de turnos de reproducción antes del ejecutor embebido |
| 43 | `onModelSelected` | Callback posterior a la selección (p. ej., telemetría) |
Nota sobre ajuste de prompts:
- `resolveSystemPromptContribution` permite que un proveedor inyecte
orientación de system prompt consciente de la caché para una familia de modelos. Prefiérelo frente a
`before_prompt_build` cuando el comportamiento pertenezca a un proveedor/familia de modelos
y deba preservar la división estable/dinámica de la caché.
orientación de system prompt consciente de la caché para una familia de modelos. Es preferible usarlo en lugar de
`before_prompt_build` cuando el comportamiento pertenece a una familia de proveedor/modelo
y debe conservar la división estable/dinámica de la caché.
Para descripciones detalladas y ejemplos reales, consulta
Para descripciones detalladas y ejemplos del mundo real, consulta
[Internals: Provider Runtime Hooks](/es/plugins/architecture#provider-runtime-hooks).
</Accordion>
@ -536,9 +540,9 @@ autenticación por clave de API y resolución dinámica de modelos.
<Step title="Añadir capacidades adicionales (opcional)">
<a id="step-5-add-extra-capabilities"></a>
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, web fetch
y búsqueda web junto con inferencia de texto:
Un plugin de proveedor puede registrar speech, transcripción realtime, voz
realtime, comprensión multimedia, generación de imágenes, generación de video, web fetch
y búsqueda web junto con la inferencia de texto:
```typescript
register(api) {
@ -650,16 +654,16 @@ autenticación por clave de API y resolución dinámica de modelos.
patrón recomendado para plugins de empresa (un plugin por proveedor). Consulta
[Internals: Capability Ownership](/es/plugins/architecture#capability-ownership-model).
Para la generación de video, prefiere la forma de capacidades consciente del modo que se muestra arriba:
Para la generación de video, es preferible usar la forma de capacidades con reconocimiento de modo que se muestra arriba:
`generate`, `imageToVideo` y `videoToVideo`. Los campos agregados planos como
`maxInputImages`, `maxInputVideos` y `maxDurationSeconds` no
bastan para anunciar claramente compatibilidad con modos de transformación o modos deshabilitados.
`maxInputImages`, `maxInputVideos` y `maxDurationSeconds` no son
suficientes para anunciar limpiamente compatibilidad con modo de transformación o modos deshabilitados.
Los proveedores de generación musical deben seguir el mismo patrón:
`generate` para generación solo con prompt y `edit` para generación basada en imagen
de referencia. Los campos agregados planos como `maxInputImages`,
`supportsLyrics` y `supportsFormat` no bastan para anunciar compatibilidad
con edición; los bloques explícitos `generate` / `edit` son el contrato esperado.
Los proveedores de generación de música deben seguir el mismo patrón:
`generate` para generación solo a partir de prompt y `edit` para generación
basada en imagen de referencia. Los campos agregados planos como `maxInputImages`,
`supportsLyrics` y `supportsFormat` no son suficientes para anunciar compatibilidad
con edición; el contrato esperado son bloques explícitos `generate` / `edit`.
</Step>
@ -714,29 +718,29 @@ No uses aquí el alias heredado de publicación solo para Skills; los paquetes d
```
<bundled-plugin-root>/acme-ai/
├── package.json # openclaw.providers metadata
├── openclaw.plugin.json # Manifest with providerAuthEnvVars
├── package.json # metadatos de openclaw.providers
├── openclaw.plugin.json # manifiesto con metadatos de autenticación del proveedor
├── index.ts # definePluginEntry + registerProvider
└── src/
├── provider.test.ts # Tests
└── usage.ts # Usage endpoint (optional)
├── provider.test.ts # pruebas
└── usage.ts # endpoint de uso (opcional)
```
## Referencia del orden del catálogo
`catalog.order` controla cuándo se fusiona tu catálogo respecto a los proveedores
integrados:
`catalog.order` controla cuándo se fusiona tu catálogo en relación con los
proveedores integrados:
| Order | When | Use case |
| --------- | ------------- | ----------------------------------------------- |
| `simple` | Primera pasada | Proveedores simples con clave de API |
| `profile` | Después de simple | Proveedores condicionados 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) |
| `simple` | Primer paso | Proveedores sencillos con clave de API |
| `profile` | Después de simple | Proveedores condicionados a perfiles de autenticación |
| `paired` | Después de profile | Sintetizar varias entradas relacionadas |
| `late` | Último paso | Sobrescribir proveedores existentes (gana en colisión) |
## Siguientes pasos
## Próximos pasos
- [Plugins de canal](/es/plugins/sdk-channel-plugins) — si tu plugin también proporciona un canal
- [SDK Runtime](/es/plugins/sdk-runtime) — helpers de `api.runtime` (TTS, búsqueda, subagente)
- [Channel Plugins](/es/plugins/sdk-channel-plugins) — si tu plugin también proporciona un canal
- [SDK Runtime](/es/plugins/sdk-runtime) — helpers `api.runtime` (TTS, búsqueda, subagent)
- [SDK Overview](/es/plugins/sdk-overview) — referencia completa de importaciones por subruta
- [Plugin Internals](/es/plugins/architecture#provider-runtime-hooks) — detalles de hooks y ejemplos integrados
- [Plugin Internals](/es/plugins/architecture#provider-runtime-hooks) — detalles de hooks y ejemplos incluidos

View File

@ -1,14 +1,14 @@
---
read_when:
- Quieres usar modelos Google Gemini con OpenClaw
- Necesitas el flujo de autenticación con clave API u OAuth
summary: Configuración de Google Gemini (clave API + OAuth, generación de imágenes, comprensión de medios, búsqueda web)
- Necesitas el flujo de autenticación con clave de API u OAuth
summary: Configuración de Google Gemini (clave de API + OAuth, generación de imágenes, comprensión de medios, búsqueda web)
title: Google (Gemini)
x-i18n:
generated_at: "2026-04-08T02:17:24Z"
generated_at: "2026-04-09T01:29:49Z"
model: gpt-5.4
provider: openai
source_hash: e9e558f5ce35c853e0240350be9a1890460c5f7f7fd30b05813a656497dee516
source_hash: fad2ff68987301bd86145fa6e10de8c7b38d5bd5dbcd13db9c883f7f5b9a4e01
source_path: providers/google.md
workflow: 15
---
@ -26,13 +26,13 @@ Gemini Grounding.
## Inicio rápido
1. Define la clave API:
1. Establece la clave de API:
```bash
openclaw onboard --auth-choice gemini-api-key
```
2. Define un modelo predeterminado:
2. Establece un modelo predeterminado:
```json5
{
@ -55,13 +55,13 @@ openclaw onboard --non-interactive \
## OAuth (Gemini CLI)
Un proveedor alternativo `google-gemini-cli` usa OAuth PKCE en lugar de una
clave API. Esta es una integración no oficial; algunos usuarios informan
restricciones en la cuenta. Úsala bajo tu propia responsabilidad.
Un proveedor alternativo `google-gemini-cli` usa OAuth con PKCE en lugar de una clave de
API. Esta es una integración no oficial; algunos usuarios informan
restricciones de cuenta. Úsalo bajo tu propia responsabilidad.
- Modelo predeterminado: `google-gemini-cli/gemini-3-flash-preview`
- Alias: `gemini-cli`
- Requisito de instalación: Gemini CLI local disponible como `gemini`
- Requisito previo de instalación: Gemini CLI local disponible como `gemini`
- Homebrew: `brew install gemini-cli`
- npm: `npm install -g @google/gemini-cli`
- Inicio de sesión:
@ -77,46 +77,49 @@ Variables de entorno:
(O las variantes `GEMINI_CLI_*`).
Si las solicitudes de OAuth de Gemini CLI fallan después de iniciar sesión, define
`GOOGLE_CLOUD_PROJECT` o `GOOGLE_CLOUD_PROJECT_ID` en el host de la gateway e
inténtalo de nuevo.
Si las solicitudes OAuth de Gemini CLI fallan después del inicio de sesión, establece
`GOOGLE_CLOUD_PROJECT` o `GOOGLE_CLOUD_PROJECT_ID` en el host de la gateway y
vuelve a intentarlo.
Si el inicio de sesión falla antes de que comience el flujo del navegador, asegúrate de que el comando local `gemini`
esté instalado y disponible en `PATH`. OpenClaw admite tanto instalaciones con Homebrew
como instalaciones globales de npm, incluidos diseños comunes de Windows/npm.
esté instalado y en `PATH`. OpenClaw admite tanto instalaciones con Homebrew
como instalaciones globales con npm, incluidos diseños comunes de Windows/npm.
Notas de uso JSON de Gemini CLI:
Notas sobre el uso de JSON de Gemini CLI:
- El texto de la respuesta proviene del campo JSON `response` de CLI.
- El uso recurre a `stats` cuando CLI deja `usage` vacío.
- `stats.cached` se normaliza a `cacheRead` de OpenClaw.
- Si falta `stats.input`, OpenClaw deriva los tokens de entrada de
- El texto de respuesta proviene del campo `response` del JSON de CLI.
- El uso vuelve a `stats` cuando la CLI deja `usage` vacío.
- `stats.cached` se normaliza en `cacheRead` de OpenClaw.
- Si falta `stats.input`, OpenClaw deriva los tokens de entrada a partir de
`stats.input_tokens - stats.cached`.
## Capacidades
| Capacidad | Compatible |
| ---------------------- | ----------------- |
| Finalizaciones de chat | Sí |
| Finalización de chat | Sí |
| Generación de imágenes | Sí |
| Generación de música | Sí |
| Comprensión de imagen | Sí |
| Comprensión de imágenes| Sí |
| Transcripción de audio | Sí |
| Comprensión de video | Sí |
| Búsqueda web (Grounding) | Sí |
| Pensamiento/razonamiento | Sí (Gemini 3.1+) |
| Thinking/reasoning | Sí (Gemini 3.1+) |
| Modelos Gemma 4 | Sí |
Los modelos Gemma 4 (por ejemplo `gemma-4-26b-a4b-it`) admiten el modo thinking. OpenClaw reescribe `thinkingBudget` a un `thinkingLevel` de Google compatible para Gemma 4. Establecer thinking en `off` mantiene thinking desactivado en lugar de asignarlo a `MINIMAL`.
## Reutilización directa de caché de Gemini
Para ejecuciones directas de la API de Gemini (`api: "google-generative-ai"`), OpenClaw ahora
pasa un identificador configurado `cachedContent` a las solicitudes de Gemini.
Para ejecuciones directas con la API de Gemini (`api: "google-generative-ai"`), OpenClaw ahora
pasa un identificador `cachedContent` configurado a las solicitudes de Gemini.
- Configura parámetros por modelo o globales con
`cachedContent` o el heredado `cached_content`
- Si ambos están presentes, `cachedContent` tiene prioridad
- Valor de ejemplo: `cachedContents/prebuilt-context`
- El uso por acierto de caché de Gemini se normaliza a `cacheRead` en OpenClaw a partir de
`cachedContentTokenCount` ascendente
- El uso con aciertos de caché de Gemini se normaliza en `cacheRead` de OpenClaw a partir de
`cachedContentTokenCount` upstream
Ejemplo:
@ -138,17 +141,17 @@ Ejemplo:
## Generación de imágenes
El proveedor integrado de generación de imágenes `google` usa de forma predeterminada
El proveedor empaquetado de generación de imágenes `google` usa de forma predeterminada
`google/gemini-3.1-flash-image-preview`.
- También admite `google/gemini-3-pro-image-preview`
- Generación: hasta 4 imágenes por solicitud
- Modo de edición: habilitado, hasta 5 imágenes de entrada
- Modo edición: habilitado, hasta 5 imágenes de entrada
- Controles de geometría: `size`, `aspectRatio` y `resolution`
El proveedor `google-gemini-cli`, solo con OAuth, es una superficie separada
de inferencia de texto. La generación de imágenes, la comprensión de medios y Gemini Grounding permanecen en
el identificador de proveedor `google`.
El proveedor `google-gemini-cli`, solo con OAuth, es una superficie independiente
de inferencia de texto. La generación de imágenes, la comprensión de medios y Gemini Grounding siguen en
el ID de proveedor `google`.
Para usar Google como proveedor de imágenes predeterminado:
@ -164,18 +167,18 @@ Para usar Google como proveedor de imágenes predeterminado:
}
```
Consulta [Image Generation](/es/tools/image-generation) para conocer los
parámetros compartidos de la herramienta, la selección de proveedor y el comportamiento de failover.
Consulta [Image Generation](/es/tools/image-generation) para ver los parámetros
compartidos de la herramienta, la selección de proveedor y el comportamiento de conmutación por error.
## Generación de video
El plugin integrado `google` también registra generación de video mediante la herramienta compartida
El plugin empaquetado `google` también registra la generación de video mediante la herramienta compartida
`video_generate`.
- Modelo de video predeterminado: `google/veo-3.1-fast-generate-preview`
- Modos: texto a video, imagen a video y flujos de referencia de un solo video
- Admite `aspectRatio`, `resolution` y `audio`
- Límite actual de duración: **4 a 8 segundos**
- Límite actual de duración: **de 4 a 8 segundos**
Para usar Google como proveedor de video predeterminado:
@ -191,17 +194,17 @@ Para usar Google como proveedor de video predeterminado:
}
```
Consulta [Video Generation](/es/tools/video-generation) para conocer los
parámetros compartidos de la herramienta, la selección de proveedor y el comportamiento de failover.
Consulta [Video Generation](/es/tools/video-generation) para ver los parámetros
compartidos de la herramienta, la selección de proveedor y el comportamiento de conmutación por error.
## Generación de música
El plugin integrado `google` también registra generación de música mediante la herramienta compartida
El plugin empaquetado `google` también registra la generación de música mediante la herramienta compartida
`music_generate`.
- Modelo de música predeterminado: `google/lyria-3-clip-preview`
- También admite `google/lyria-3-pro-preview`
- Controles de prompt: `lyrics` e `instrumental`
- Controles del prompt: `lyrics` e `instrumental`
- Formato de salida: `mp3` de forma predeterminada, además de `wav` en `google/lyria-3-pro-preview`
- Entradas de referencia: hasta 10 imágenes
- Las ejecuciones respaldadas por sesión se desacoplan mediante el flujo compartido de tarea/estado, incluido `action: "status"`
@ -220,11 +223,11 @@ Para usar Google como proveedor de música predeterminado:
}
```
Consulta [Music Generation](/es/tools/music-generation) para conocer los
parámetros compartidos de la herramienta, la selección de proveedor y el comportamiento de failover.
Consulta [Music Generation](/es/tools/music-generation) para ver los parámetros
compartidos de la herramienta, la selección de proveedor y el comportamiento de conmutación por error.
## Nota sobre el entorno
Si la gateway se ejecuta como daemon (launchd/systemd), asegúrate de que `GEMINI_API_KEY`
Si la Gateway se ejecuta como daemon (launchd/systemd), asegúrate de que `GEMINI_API_KEY`
esté disponible para ese proceso (por ejemplo, en `~/.openclaw/.env` o mediante
`env.shellEnv`).

View File

@ -6,10 +6,10 @@ read_when:
summary: Ejecuta OpenClaw mediante inferrs (servidor local compatible con OpenAI)
title: inferrs
x-i18n:
generated_at: "2026-04-08T02:17:25Z"
generated_at: "2026-04-09T01:30:07Z"
model: gpt-5.4
provider: openai
source_hash: d84f660d49a682d0c0878707eebe1bc1e83dd115850687076ea3938b9f9c86c6
source_hash: 03b9d5a9935c75fd369068bacb7807a5308cd0bd74303b664227fb664c3a2098
source_path: providers/inferrs.md
workflow: 15
---
@ -17,11 +17,11 @@ x-i18n:
# inferrs
[inferrs](https://github.com/ericcurtin/inferrs) puede servir modelos locales detrás de una
API `/v1` compatible con OpenAI. OpenClaw funciona con `inferrs` mediante la ruta genérica
API `/v1` compatible con OpenAI. OpenClaw funciona con `inferrs` a través de la ruta genérica
`openai-completions`.
Actualmente, lo mejor es tratar `inferrs` como un backend personalizado autoalojado
compatible con OpenAI, no como un plugin de proveedor dedicado de OpenClaw.
Actualmente, lo mejor es tratar `inferrs` como un backend personalizado autohospedado compatible con OpenAI,
no como un plugin de proveedor dedicado de OpenClaw.
## Inicio rápido
@ -30,20 +30,20 @@ compatible con OpenAI, no como un plugin de proveedor dedicado de OpenClaw.
Ejemplo:
```bash
inferrs serve gg-hf-gg/gemma-4-E2B-it \
inferrs serve google/gemma-4-E2B-it \
--host 127.0.0.1 \
--port 8080 \
--device metal
```
2. Verifica que se pueda acceder al servidor.
2. Verifica que el servidor sea accesible.
```bash
curl http://127.0.0.1:8080/health
curl http://127.0.0.1:8080/v1/models
```
3. Añade una entrada explícita de proveedor de OpenClaw y apunta tu modelo predeterminado a ella.
3. Añade una entrada de proveedor explícita de OpenClaw y apunta tu modelo predeterminado a ella.
## Ejemplo completo de configuración
@ -53,9 +53,9 @@ Este ejemplo usa Gemma 4 en un servidor local de `inferrs`.
{
agents: {
defaults: {
model: { primary: "inferrs/gg-hf-gg/gemma-4-E2B-it" },
model: { primary: "inferrs/google/gemma-4-E2B-it" },
models: {
"inferrs/gg-hf-gg/gemma-4-E2B-it": {
"inferrs/google/gemma-4-E2B-it": {
alias: "Gemma 4 (inferrs)",
},
},
@ -70,7 +70,7 @@ Este ejemplo usa Gemma 4 en un servidor local de `inferrs`.
api: "openai-completions",
models: [
{
id: "gg-hf-gg/gemma-4-E2B-it",
id: "google/gemma-4-E2B-it",
name: "Gemma 4 E2B (inferrs)",
reasoning: false,
input: ["text"],
@ -88,12 +88,12 @@ Este ejemplo usa Gemma 4 en un servidor local de `inferrs`.
}
```
## Por qué importa `requiresStringContent`
## Por qué `requiresStringContent` es importante
Algunas rutas Chat Completions de `inferrs` aceptan solo
`messages[].content` de tipo cadena, no matrices estructuradas de partes de contenido.
Algunas rutas de Chat Completions de `inferrs` aceptan solo
`messages[].content` como cadena, no matrices estructuradas de partes de contenido.
Si las ejecuciones de OpenClaw fallan con un error como:
Si las ejecuciones de OpenClaw fallan con un error como este:
```text
messages[1].content: invalid type: sequence, expected a string
@ -112,8 +112,8 @@ la solicitud.
## Advertencia sobre Gemma y el esquema de herramientas
Algunas combinaciones actuales de `inferrs` + Gemma aceptan solicitudes directas pequeñas a
`/v1/chat/completions`, pero aun así fallan en turnos completos del entorno de ejecución de agentes de OpenClaw.
Algunas combinaciones actuales de `inferrs` + Gemma aceptan solicitudes pequeñas directas a
`/v1/chat/completions`, pero aun así fallan en turnos completos del runtime de agente de OpenClaw.
Si eso ocurre, prueba primero esto:
@ -124,30 +124,30 @@ compat: {
}
```
Eso desactiva la superficie de esquema de herramientas de OpenClaw para el modelo y puede reducir la
Eso desactiva la superficie del esquema de herramientas de OpenClaw para el modelo y puede reducir la
presión del prompt en backends locales más estrictos.
Si las solicitudes directas pequeñas siguen funcionando, pero los turnos normales de agentes de OpenClaw continúan
fallando dentro de `inferrs`, el problema restante suele estar en el comportamiento ascendente del modelo/servidor
y no en la capa de transporte de OpenClaw.
Si las solicitudes directas pequeñas siguen funcionando pero los turnos normales del agente de OpenClaw continúan
fallando dentro de `inferrs`, el problema restante suele ser un comportamiento upstream del modelo/servidor
más que de la capa de transporte de OpenClaw.
## Prueba manual rápida
## Prueba manual básica
Una vez configurado, prueba ambas capas:
```bash
curl http://127.0.0.1:8080/v1/chat/completions \
-H 'content-type: application/json' \
-d '{"model":"gg-hf-gg/gemma-4-E2B-it","messages":[{"role":"user","content":"What is 2 + 2?"}],"stream":false}'
-d '{"model":"google/gemma-4-E2B-it","messages":[{"role":"user","content":"What is 2 + 2?"}],"stream":false}'
openclaw infer model run \
--model inferrs/gg-hf-gg/gemma-4-E2B-it \
--model inferrs/google/gemma-4-E2B-it \
--prompt "What is 2 + 2? Reply with one short sentence." \
--json
```
Si el primer comando funciona pero el segundo falla, usa las notas de solución de problemas
de abajo.
que aparecen a continuación.
## Solución de problemas
@ -158,22 +158,22 @@ de abajo.
- Las llamadas directas pequeñas a `/v1/chat/completions` funcionan, pero `openclaw infer model run`
falla: prueba `compat.supportsTools: false`.
- OpenClaw ya no recibe errores de esquema, pero `inferrs` sigue fallando en turnos de
agentes más grandes: trátalo como una limitación ascendente de `inferrs` o del modelo y reduce la
agente más grandes: trátalo como una limitación upstream de `inferrs` o del modelo, y reduce la
presión del prompt o cambia de backend/modelo local.
## Comportamiento de estilo proxy
## Comportamiento de tipo proxy
`inferrs` se trata como un backend `/v1` compatible con OpenAI de estilo proxy, no como un
`inferrs` se trata como un backend `/v1` compatible con OpenAI de tipo proxy, no como un
endpoint nativo de OpenAI.
- aquí no se aplica el modelado de solicitudes exclusivo de OpenAI nativo
- no hay `service_tier`, ni `store` de Responses, ni sugerencias de caché de prompts, ni
modelado de payload de compatibilidad de razonamiento de OpenAI
- no hay `service_tier`, no hay `store` de Responses, no hay sugerencias de caché de prompt ni
modelado de carga útil de compatibilidad de reasoning de OpenAI
- los encabezados ocultos de atribución de OpenClaw (`originator`, `version`, `User-Agent`)
no se inyectan en URLs base personalizadas de `inferrs`
## Ver también
- [Modelos locales](/es/gateway/local-models)
- [Solución de problemas del gateway](/es/gateway/troubleshooting#local-openai-compatible-backend-passes-direct-probes-but-agent-runs-fail)
- [Solución de problemas de Gateway](/es/gateway/troubleshooting#local-openai-compatible-backend-passes-direct-probes-but-agent-runs-fail)
- [Proveedores de modelos](/es/concepts/model-providers)

View File

@ -1,39 +1,39 @@
---
read_when:
- Quieres ejecutar OpenClaw con modelos en la nube o locales mediante Ollama
- Necesitas orientación de configuración y puesta en marcha de Ollama
- Necesitas orientación para la configuración y puesta en marcha de Ollama
summary: Ejecuta OpenClaw con Ollama (modelos en la nube y locales)
title: Ollama
x-i18n:
generated_at: "2026-04-08T02:18:01Z"
generated_at: "2026-04-09T01:30:28Z"
model: gpt-5.4
provider: openai
source_hash: 222ec68f7d4bb29cc7796559ddef1d5059f5159e7a51e2baa3a271ddb3abb716
source_hash: d3295a7c879d3636a2ffdec05aea6e670e54a990ef52bd9b0cae253bc24aa3f7
source_path: providers/ollama.md
workflow: 15
---
# Ollama
Ollama es un runtime de LLM local que facilita ejecutar modelos de código abierto en tu equipo. OpenClaw se integra con la API nativa de Ollama (`/api/chat`), admite streaming y llamadas a herramientas, y puede detectar automáticamente modelos locales de Ollama cuando optas por usar `OLLAMA_API_KEY` (o un perfil de autenticación) y no defines una entrada explícita `models.providers.ollama`.
Ollama es un entorno de ejecución local de LLM que facilita ejecutar modelos de código abierto en tu equipo. OpenClaw se integra con la API nativa de Ollama (`/api/chat`), admite streaming y tool calling, y puede detectar automáticamente modelos locales de Ollama cuando lo habilitas con `OLLAMA_API_KEY` (o un perfil de autenticación) y no defines una entrada explícita `models.providers.ollama`.
<Warning>
**Usuarios de Ollama remoto**: No uses la URL compatible con OpenAI `/v1` (`http://host:11434/v1`) con OpenClaw. Esto rompe las llamadas a herramientas y los modelos pueden generar JSON de herramientas sin procesar como texto plano. Usa en su lugar la URL de la API nativa de Ollama: `baseUrl: "http://host:11434"` (sin `/v1`).
**Usuarios de Ollama remoto**: No uses la URL compatible con OpenAI `/v1` (`http://host:11434/v1`) con OpenClaw. Esto rompe el tool calling y los modelos pueden producir JSON de herramientas sin procesar como texto sin formato. Usa en su lugar la URL de la API nativa de Ollama: `baseUrl: "http://host:11434"` (sin `/v1`).
</Warning>
## Inicio rápido
### Onboarding (recomendado)
### Incorporación guiada (recomendado)
La forma más rápida de configurar Ollama es mediante el onboarding:
La forma más rápida de configurar Ollama es mediante la incorporación guiada:
```bash
openclaw onboard
```
Selecciona **Ollama** en la lista de proveedores. El onboarding hará lo siguiente:
Selecciona **Ollama** en la lista de proveedores. La incorporación guiada hará lo siguiente:
1. Pedirá la URL base de Ollama donde se puede acceder a tu instancia (valor predeterminado `http://127.0.0.1:11434`).
1. Te pedirá la URL base de Ollama en la que se puede acceder a tu instancia (predeterminada: `http://127.0.0.1:11434`).
2. Te permitirá elegir **Cloud + Local** (modelos en la nube y modelos locales) o **Local** (solo modelos locales).
3. Abrirá un flujo de inicio de sesión en el navegador si eliges **Cloud + Local** y no has iniciado sesión en ollama.com.
4. Detectará los modelos disponibles y sugerirá valores predeterminados.
@ -77,7 +77,7 @@ ollama pull llama3.3
ollama signin
```
4. Ejecuta el onboarding y elige `Ollama`:
4. Ejecuta la incorporación guiada y elige `Ollama`:
```bash
openclaw onboard
@ -92,7 +92,7 @@ OpenClaw sugiere actualmente:
- valor predeterminado local: `gemma4`
- valores predeterminados en la nube: `kimi-k2.5:cloud`, `minimax-m2.7:cloud`, `glm-5.1:cloud`
5. Si prefieres una configuración manual, habilita Ollama para OpenClaw directamente (cualquier valor funciona; Ollama no requiere una clave real):
5. Si prefieres la configuración manual, habilita Ollama directamente para OpenClaw (cualquier valor funciona; Ollama no requiere una clave real):
```bash
# Establecer variable de entorno
@ -123,11 +123,12 @@ openclaw models set ollama/gemma4
## Detección de modelos (proveedor implícito)
Cuando estableces `OLLAMA_API_KEY` (o un perfil de autenticación) y **no** defines `models.providers.ollama`, OpenClaw detecta modelos de la instancia local de Ollama en `http://127.0.0.1:11434`:
Cuando estableces `OLLAMA_API_KEY` (o un perfil de autenticación) y **no** defines `models.providers.ollama`, OpenClaw detecta modelos desde la instancia local de Ollama en `http://127.0.0.1:11434`:
- Consulta `/api/tags`
- Usa búsquedas `/api/show` en modo best-effort para leer `contextWindow` cuando está disponible
- Marca `reasoning` con una heurística basada en el nombre del modelo (`r1`, `reasoning`, `think`)
- Usa búsquedas de `/api/show` con mejor esfuerzo para leer `contextWindow` y detectar capacidades (incluida visión) cuando estén disponibles
- Los modelos con una capacidad `vision` informada por `/api/show` se marcan como compatibles con imágenes (`input: ["text", "image"]`), por lo que OpenClaw inyecta automáticamente imágenes en el prompt para esos modelos
- Marca `reasoning` mediante una heurística por nombre de modelo (`r1`, `reasoning`, `think`)
- Establece `maxTokens` en el límite máximo predeterminado de tokens de Ollama usado por OpenClaw
- Establece todos los costos en `0`
@ -146,9 +147,9 @@ Para añadir un modelo nuevo, simplemente haz `pull` con Ollama:
ollama pull mistral
```
El nuevo modelo se detectará automáticamente y estará disponible para usar.
El modelo nuevo se detectará automáticamente y estará disponible para usarse.
Si configuras `models.providers.ollama` explícitamente, la detección automática se omite y debes definir los modelos manualmente (ver más abajo).
Si defines `models.providers.ollama` de forma explícita, se omite la detección automática y debes definir los modelos manualmente (ver más abajo).
## Configuración
@ -164,9 +165,9 @@ export OLLAMA_API_KEY="ollama-local"
Usa configuración explícita cuando:
- Ollama se ejecuta en otro host/puerto.
- Ollama se ejecuta en otro host o puerto.
- Quieres forzar ventanas de contexto o listas de modelos específicas.
- Quieres definiciones de modelos completamente manuales.
- Quieres definiciones de modelos totalmente manuales.
```json5
{
@ -193,11 +194,11 @@ Usa configuración explícita cuando:
}
```
Si `OLLAMA_API_KEY` está establecido, puedes omitir `apiKey` en la entrada del proveedor y OpenClaw lo completará para las comprobaciones de disponibilidad.
Si `OLLAMA_API_KEY` está configurada, puedes omitir `apiKey` en la entrada del proveedor y OpenClaw la completará para las comprobaciones de disponibilidad.
### URL base personalizada (configuración explícita)
Si Ollama se está ejecutando en un host o puerto diferente (la configuración explícita desactiva la detección automática, así que define los modelos manualmente):
Si Ollama se está ejecutando en un host o puerto distintos (la configuración explícita desactiva la detección automática, por lo que debes definir los modelos manualmente):
```json5
{
@ -205,8 +206,8 @@ Si Ollama se está ejecutando en un host o puerto diferente (la configuración e
providers: {
ollama: {
apiKey: "ollama-local",
baseUrl: "http://ollama-host:11434", // Sin /v1: usa la URL nativa de la API de Ollama
api: "ollama", // Establécelo explícitamente para garantizar el comportamiento nativo de llamadas a herramientas
baseUrl: "http://ollama-host:11434", // Sin /v1: usa la URL de la API nativa de Ollama
api: "ollama", // Establécelo explícitamente para garantizar el comportamiento nativo de tool calling
},
},
},
@ -214,10 +215,10 @@ Si Ollama se está ejecutando en un host o puerto diferente (la configuración e
```
<Warning>
No añadas `/v1` a la URL. La ruta `/v1` usa el modo compatible con OpenAI, donde las llamadas a herramientas no son fiables. Usa la URL base de Ollama sin un sufijo de ruta.
No añadas `/v1` a la URL. La ruta `/v1` usa el modo compatible con OpenAI, donde el tool calling no es fiable. Usa la URL base de Ollama sin sufijo de ruta.
</Warning>
### Selección de modelos
### Selección de modelo
Una vez configurado, todos tus modelos de Ollama estarán disponibles:
@ -238,22 +239,19 @@ Una vez configurado, todos tus modelos de Ollama estarán disponibles:
Los modelos en la nube te permiten ejecutar modelos alojados en la nube (por ejemplo, `kimi-k2.5:cloud`, `minimax-m2.7:cloud`, `glm-5.1:cloud`) junto con tus modelos locales.
Para usar modelos en la nube, selecciona el modo **Cloud + Local** durante la configuración. El asistente comprueba si has iniciado sesión y abre un flujo de inicio de sesión en el navegador cuando es necesario. Si no se puede verificar la autenticación, el asistente vuelve a los valores predeterminados de modelos locales.
Para usar modelos en la nube, selecciona el modo **Cloud + Local** durante la configuración. El asistente comprueba si has iniciado sesión y abre un flujo de inicio de sesión en el navegador cuando es necesario. Si no se puede verificar la autenticación, el asistente recurre a los valores predeterminados de modelos locales.
También puedes iniciar sesión directamente en [ollama.com/signin](https://ollama.com/signin).
## Búsqueda web de Ollama
## Ollama Web Search
OpenClaw también es compatible con **Ollama Web Search** como proveedor
empaquetado de `web_search`.
OpenClaw también admite **Ollama Web Search** como proveedor integrado de `web_search`.
- Usa tu host de Ollama configurado (`models.providers.ollama.baseUrl` cuando
está configurado; de lo contrario `http://127.0.0.1:11434`).
- Usa tu host de Ollama configurado (`models.providers.ollama.baseUrl` cuando está definido; de lo contrario, `http://127.0.0.1:11434`).
- No requiere clave.
- Requiere que Ollama esté en ejecución y que hayas iniciado sesión con `ollama signin`.
Elige **Ollama Web Search** durante `openclaw onboard` o
`openclaw configure --section web`, o configura:
Elige **Ollama Web Search** durante `openclaw onboard` o `openclaw configure --section web`, o establece:
```json5
{
@ -267,30 +265,30 @@ Elige **Ollama Web Search** durante `openclaw onboard` o
}
```
Para ver la configuración completa y los detalles del comportamiento, consulta [Ollama Web Search](/es/tools/ollama-search).
Para conocer todos los detalles de configuración y comportamiento, consulta [Ollama Web Search](/es/tools/ollama-search).
## Avanzado
### Modelos de razonamiento
OpenClaw trata de forma predeterminada los modelos con nombres como `deepseek-r1`, `reasoning` o `think` como modelos con capacidad de razonamiento:
OpenClaw trata de forma predeterminada como compatibles con razonamiento a los modelos con nombres como `deepseek-r1`, `reasoning` o `think`:
```bash
ollama pull deepseek-r1:32b
```
### Costos de modelos
### Costos del modelo
Ollama es gratuito y se ejecuta localmente, por lo que todos los costos de los modelos se establecen en $0.
Ollama es gratuito y se ejecuta localmente, por lo que todos los costos de modelo se establecen en $0.
### Configuración de streaming
La integración de Ollama en OpenClaw usa la **API nativa de Ollama** (`/api/chat`) de forma predeterminada, que admite completamente streaming y llamadas a herramientas al mismo tiempo. No se necesita ninguna configuración especial.
La integración de Ollama en OpenClaw usa de forma predeterminada la **API nativa de Ollama** (`/api/chat`), que admite completamente streaming y tool calling al mismo tiempo. No se necesita ninguna configuración especial.
#### Modo heredado compatible con OpenAI
<Warning>
**Las llamadas a herramientas no son fiables en el modo compatible con OpenAI.** Usa este modo solo si necesitas el formato de OpenAI para un proxy y no dependes del comportamiento nativo de llamadas a herramientas.
**El tool calling no es fiable en el modo compatible con OpenAI.** Usa este modo solo si necesitas el formato OpenAI para un proxy y no dependes del comportamiento nativo de tool calling.
</Warning>
Si necesitas usar en su lugar el endpoint compatible con OpenAI (por ejemplo, detrás de un proxy que solo admite formato OpenAI), establece `api: "openai-completions"` explícitamente:
@ -311,9 +309,9 @@ Si necesitas usar en su lugar el endpoint compatible con OpenAI (por ejemplo, de
}
```
Es posible que este modo no admita streaming + llamadas a herramientas simultáneamente. Puede que necesites desactivar el streaming con `params: { streaming: false }` en la configuración del modelo.
Es posible que este modo no admita streaming + tool calling simultáneamente. Puede que necesites desactivar el streaming con `params: { streaming: false }` en la configuración del modelo.
Cuando se usa `api: "openai-completions"` con Ollama, OpenClaw inyecta `options.num_ctx` de forma predeterminada para que Ollama no vuelva silenciosamente a una ventana de contexto de 4096. Si tu proxy/upstream rechaza campos `options` desconocidos, desactiva este comportamiento:
Cuando se usa `api: "openai-completions"` con Ollama, OpenClaw inyecta `options.num_ctx` de forma predeterminada para que Ollama no vuelva silenciosamente a una ventana de contexto de 4096. Si tu proxy o servicio ascendente rechaza campos `options` desconocidos, desactiva este comportamiento:
```json5
{
@ -337,15 +335,15 @@ Para los modelos detectados automáticamente, OpenClaw usa la ventana de context
## Solución de problemas
### No se detecta Ollama
### Ollama no se detecta
Asegúrate de que Ollama se está ejecutando, de que estableciste `OLLAMA_API_KEY` (o un perfil de autenticación) y de que **no** definiste una entrada explícita `models.providers.ollama`:
Asegúrate de que Ollama esté en ejecución, de que hayas configurado `OLLAMA_API_KEY` (o un perfil de autenticación) y de que **no** hayas definido una entrada explícita `models.providers.ollama`:
```bash
ollama serve
```
Y de que la API sea accesible:
Y de que se pueda acceder a la API:
```bash
curl http://localhost:11434/api/tags

View File

@ -1,14 +1,14 @@
---
read_when:
- Quieres usar Qwen con OpenClaw
- Antes usabas OAuth de Qwen
summary: Usa Qwen Cloud mediante el proveedor `qwen` empaquetado de OpenClaw
- Antes usabas Qwen OAuth
summary: Usa Qwen Cloud mediante el proveedor qwen empaquetado de OpenClaw
title: Qwen
x-i18n:
generated_at: "2026-04-06T03:11:04Z"
generated_at: "2026-04-09T01:30:31Z"
model: gpt-5.4
provider: openai
source_hash: f175793693ab6a4c3f1f4d42040e673c15faf7603a500757423e9e06977c989d
source_hash: 4786df2cb6ec1ab29d191d012c61dcb0e5468bf0f8561fbbb50eed741efad325
source_path: providers/qwen.md
workflow: 15
---
@ -17,7 +17,7 @@ x-i18n:
<Warning>
**Se eliminó OAuth de Qwen.** La integración OAuth del nivel gratuito
**Qwen OAuth ha sido eliminado.** La integración OAuth de nivel gratuito
(`qwen-portal`) que usaba endpoints de `portal.qwen.ai` ya no está disponible.
Consulta [Issue #49557](https://github.com/openclaw/openclaw/issues/49557) para
obtener contexto.
@ -26,10 +26,10 @@ obtener contexto.
## Recomendado: Qwen Cloud
OpenClaw ahora trata a Qwen como un proveedor empaquetado de primera clase con el id canónico
OpenClaw ahora trata Qwen como un proveedor empaquetado de primera clase con el id canónico
`qwen`. El proveedor empaquetado apunta a los endpoints de Qwen Cloud / Alibaba DashScope y
Coding Plan, y mantiene los id heredados `modelstudio` funcionando como alias
de compatibilidad.
Coding Plan, y mantiene los ids heredados `modelstudio` funcionando como alias de
compatibilidad.
- Proveedor: `qwen`
- Variable de entorno preferida: `QWEN_API_KEY`
@ -43,21 +43,21 @@ La compatibilidad con Coding Plan puede ir por detrás del catálogo público.
# Endpoint global de Coding Plan
openclaw onboard --auth-choice qwen-api-key
# Endpoint de Coding Plan para China
# Endpoint de Coding Plan en China
openclaw onboard --auth-choice qwen-api-key-cn
# Endpoint global Standard (pay-as-you-go)
openclaw onboard --auth-choice qwen-standard-api-key
# Endpoint para China Standard (pay-as-you-go)
# Endpoint Standard (pay-as-you-go) en China
openclaw onboard --auth-choice qwen-standard-api-key-cn
```
Los id heredados de `auth-choice` `modelstudio-*` y las referencias de modelo `modelstudio/...` todavía
funcionan como alias de compatibilidad, pero los nuevos flujos de configuración deben preferir los id canónicos
de `auth-choice` `qwen-*` y las referencias de modelo `qwen/...`.
Los ids heredados `modelstudio-*` para `auth-choice` y las referencias de modelo `modelstudio/...` siguen
funcionando como alias de compatibilidad, pero los nuevos flujos de configuración deberían preferir los ids canónicos
`qwen-*` para `auth-choice` y las referencias de modelo `qwen/...`.
Después del onboarding, establece un modelo predeterminado:
Después de la configuración inicial, establece un modelo predeterminado:
```json5
{
@ -79,12 +79,12 @@ Después del onboarding, establece un modelo predeterminado:
| Coding Plan (subscription) | Global | `qwen-api-key` | `coding-intl.dashscope.aliyuncs.com/v1` |
El proveedor selecciona automáticamente el endpoint según tu `auth choice`. Las opciones canónicas
usan la familia `qwen-*`; `modelstudio-*` sigue siendo solo de compatibilidad.
Puedes sobrescribirlo con un `baseUrl` personalizado en la configuración.
usan la familia `qwen-*`; `modelstudio-*` queda solo para compatibilidad.
Puedes reemplazarlo con un `baseUrl` personalizado en la configuración.
Los endpoints nativos de Model Studio anuncian compatibilidad de uso de streaming en el
transporte compartido `openai-completions`. OpenClaw ahora basa esto en las capacidades del endpoint,
por lo que los id personalizados de proveedores compatibles con DashScope que apunten a los
transporte compartido `openai-completions`. OpenClaw ahora basa eso en las capacidades del endpoint,
por lo que los ids de proveedor personalizados compatibles con DashScope que apunten a los
mismos hosts nativos heredan el mismo comportamiento de uso de streaming en lugar de
requerir específicamente el id del proveedor integrado `qwen`.
@ -95,25 +95,27 @@ requerir específicamente el id del proveedor integrado `qwen`.
## Catálogo integrado
OpenClaw actualmente incluye este catálogo empaquetado de Qwen:
Actualmente, OpenClaw incluye este catálogo Qwen empaquetado. El catálogo configurado
tiene en cuenta el endpoint: las configuraciones de Coding Plan omiten modelos que solo se sabe que funcionan en
el endpoint Standard.
| Referencia de modelo | Entrada | Contexto | Notas |
| --------------------------- | ----------- | --------- | -------------------------------------------------- |
| `qwen/qwen3.5-plus` | texto, imagen | 1,000,000 | Modelo predeterminado |
| `qwen/qwen3.6-plus` | texto, imagen | 1,000,000 | Prefiere endpoints Standard cuando necesites este modelo |
| `qwen/qwen3-max-2026-01-23` | texto | 262,144 | Línea Qwen Max |
| `qwen/qwen3-coder-next` | texto | 262,144 | Código |
| `qwen/qwen3-coder-plus` | texto | 1,000,000 | Código |
| `qwen/MiniMax-M2.5` | texto | 1,000,000 | Razonamiento habilitado |
| `qwen/glm-5` | texto | 202,752 | GLM |
| `qwen/glm-4.7` | texto | 202,752 | GLM |
| `qwen/kimi-k2.5` | texto, imagen | 262,144 | Moonshot AI a través de Alibaba |
| Referencia de modelo | Entrada | Contexto | Notas |
| -------------------------- | ----------- | --------- | -------------------------------------------------- |
| `qwen/qwen3.5-plus` | text, image | 1,000,000 | Modelo predeterminado |
| `qwen/qwen3.6-plus` | text, image | 1,000,000 | Prefiere endpoints Standard cuando necesites este modelo |
| `qwen/qwen3-max-2026-01-23`| text | 262,144 | Línea Qwen Max |
| `qwen/qwen3-coder-next` | text | 262,144 | Coding |
| `qwen/qwen3-coder-plus` | text | 1,000,000 | Coding |
| `qwen/MiniMax-M2.5` | text | 1,000,000 | Reasoning habilitado |
| `qwen/glm-5` | text | 202,752 | GLM |
| `qwen/glm-4.7` | text | 202,752 | GLM |
| `qwen/kimi-k2.5` | text, image | 262,144 | Moonshot AI mediante Alibaba |
La disponibilidad aún puede variar según el endpoint y el plan de facturación incluso cuando un modelo
está presente en el catálogo empaquetado.
La disponibilidad puede seguir variando según el endpoint y el plan de facturación, incluso cuando un modelo
esté presente en el catálogo empaquetado.
La compatibilidad de uso de streaming nativo se aplica tanto a los hosts de Coding Plan como a
los hosts Standard compatibles con DashScope:
La compatibilidad de uso de streaming nativo se aplica tanto a los hosts de Coding Plan como a los
hosts Standard compatibles con DashScope:
- `https://coding.dashscope.aliyuncs.com/v1`
- `https://coding-intl.dashscope.aliyuncs.com/v1`
@ -122,7 +124,7 @@ los hosts Standard compatibles con DashScope:
## Disponibilidad de Qwen 3.6 Plus
`qwen3.6-plus` está disponible en los endpoints de Model Studio Standard (pay-as-you-go):
`qwen3.6-plus` está disponible en los endpoints Model Studio Standard (pay-as-you-go):
- China: `dashscope.aliyuncs.com/compatible-mode/v1`
- Global: `dashscope-intl.aliyuncs.com/compatible-mode/v1`
@ -133,16 +135,16 @@ endpoint/clave de Coding Plan.
## Plan de capacidades
La extensión `qwen` se está posicionando como el hogar del proveedor para toda la superficie de Qwen
Cloud, no solo para modelos de código/texto.
La extensión `qwen` se está posicionando como la base del proveedor para toda la superficie de Qwen
Cloud, no solo para modelos de coding/texto.
- Modelos de texto/chat: ya incluidos
- Llamada de herramientas, salida estructurada, thinking: heredados del transporte compatible con OpenAI
- Generación de imágenes: planificada en la capa de plugins de proveedor
- Comprensión de imágenes/video: ya incluida en el endpoint Standard
- Voz/audio: planificada en la capa de plugins de proveedor
- Embeddings/reranking de memoria: planificados a través de la superficie del adaptador de embeddings
- Generación de video: ya incluida mediante la capacidad compartida de generación de video
- Modelos de texto/chat: empaquetados ahora
- Llamadas a herramientas, salida estructurada, thinking: heredados del transporte compatible con OpenAI
- Generación de imágenes: planificada en la capa del plugin de proveedor
- Comprensión de imagen/video: empaquetada ahora en el endpoint Standard
- Voz/audio: planificada en la capa del plugin de proveedor
- Embeddings/reranking de memoria: planificados mediante la superficie del adaptador de embeddings
- Generación de video: empaquetada ahora mediante la capacidad compartida de generación de video
## Complementos multimodales
@ -159,17 +161,17 @@ La extensión `qwen` ahora también expone:
Estas superficies multimodales usan los endpoints DashScope **Standard**, no los
endpoints de Coding Plan.
- URL base de Standard global/intl: `https://dashscope-intl.aliyuncs.com/compatible-mode/v1`
- URL base de Standard China: `https://dashscope.aliyuncs.com/compatible-mode/v1`
- URL base Standard global/internacional: `https://dashscope-intl.aliyuncs.com/compatible-mode/v1`
- URL base Standard de China: `https://dashscope.aliyuncs.com/compatible-mode/v1`
Para la generación de video, OpenClaw asigna la región de Qwen configurada al host
AIGC de DashScope correspondiente antes de enviar el trabajo:
Para la generación de video, OpenClaw asigna la región de Qwen configurada al host AIGC de
DashScope correspondiente antes de enviar el trabajo:
- Global/Intl: `https://dashscope-intl.aliyuncs.com`
- Global/internacional: `https://dashscope-intl.aliyuncs.com`
- China: `https://dashscope.aliyuncs.com`
Eso significa que un `models.providers.qwen.baseUrl` normal que apunte a cualquiera de los
hosts de Qwen de Coding Plan o Standard sigue manteniendo la generación de video en el endpoint
hosts Qwen de Coding Plan o Standard sigue manteniendo la generación de video en el endpoint
regional correcto de video de DashScope.
Para la generación de video, establece explícitamente un modelo predeterminado:
@ -184,22 +186,22 @@ Para la generación de video, establece explícitamente un modelo predeterminado
}
```
Límites actuales de generación de video del Qwen empaquetado:
Límites actuales empaquetados de generación de video de Qwen:
- Hasta **1** video de salida por solicitud
- Hasta **1** imagen de entrada
- Hasta **4** videos de entrada
- Hasta **10 segundos** de duración
- Admite `size`, `aspectRatio`, `resolution`, `audio` y `watermark`
- El modo de imagen/video de referencia actualmente requiere **URLs remotas http(s)**. Las
rutas de archivos locales se rechazan de entrada porque el endpoint de video de DashScope no
acepta buffers locales subidos para esas referencias.
- El modo de imagen/video de referencia actualmente requiere **URLs http(s) remotas**. Las
rutas de archivo locales se rechazan de entrada porque el endpoint de video de DashScope no
acepta buffers locales cargados para esas referencias.
Consulta [Generación de video](/tools/video-generation) para ver los parámetros
compartidos de la herramienta, la selección de proveedor y el comportamiento de failover.
Consulta [Video Generation](/es/tools/video-generation) para ver los parámetros
compartidos de la herramienta, la selección de proveedor y el comportamiento de conmutación por error.
## Nota sobre el entorno
Si el Gateway se ejecuta como daemon (launchd/systemd), asegúrate de que `QWEN_API_KEY` esté
Si la Gateway se ejecuta como daemon (launchd/systemd), asegúrate de que `QWEN_API_KEY` esté
disponible para ese proceso (por ejemplo, en `~/.openclaw/.env` o mediante
`env.shellEnv`).