Plugins
Inicio rápido (¿nuevo en plugins?)
Un plugin es solo un pequeño módulo de código que extiende OpenClaw con características adicionales (comandos, herramientas y Gateway RPC). La mayoría de las veces, usarás plugins cuando quieras una característica que aún no está integrada en el núcleo de OpenClaw (o quieras mantener características opcionales fuera de tu instalación principal). Ruta rápida:
- Ver qué ya está cargado:
openclaw plugins list
- Instalar un plugin oficial (ejemplo: Llamada de Voz):
openclaw plugins install @openclaw/voice-call
Las especificaciones de Npm son solo de registro (nombre del paquete + versión exacta opcional o dist-tag). Las especificaciones Git/URL/archivo y los rangos semver son rechazados. Las especificaciones simples y @latest permanecen en la vía estable. Si npm resuelve cualquiera de esos a una versión preliminar, OpenClaw se detiene y te pide que aceptes explícitamente con una etiqueta preliminar como @beta/@rc o una versión preliminar exacta.
- Reiniciar el Gateway, luego configurar bajo
plugins.entries.<id>.config.
Consulta Llamada de Voz para un ejemplo concreto de plugin. ¿Buscas listados de terceros? Consulta Plugins de la comunidad.
Plugins disponibles (oficiales)
- Microsoft Teams es solo-plugin a partir de 2026.1.15; instala
@openclaw/msteamssi usas Teams. - Memoria (Núcleo) — plugin de búsqueda de memoria incluido (habilitado por defecto vía
plugins.slots.memory) - Memoria (LanceDB) — plugin de memoria a largo plazo incluido (recuperación automática/captura; establece
plugins.slots.memory = "memory-lancedb") - Llamada de Voz —
@openclaw/voice-call - Zalo Personal —
@openclaw/zalouser - Matrix —
@openclaw/matrix - Nostr —
@openclaw/nostr - Zalo —
@openclaw/zalo - Microsoft Teams —
@openclaw/msteams - Google Antigravity OAuth (autenticación de proveedor) — incluido como
google-antigravity-auth(deshabilitado por defecto) - Gemini CLI OAuth (autenticación de proveedor) — incluido como
google-gemini-cli-auth(deshabilitado por defecto) - Qwen OAuth (autenticación de proveedor) — incluido como
qwen-portal-auth(deshabilitado por defecto) - Copilot Proxy (autenticación de proveedor) — puente local del Proxy Copilot de VS Code; distinto del inicio de sesión de dispositivo
github-copilotintegrado (incluido, deshabilitado por defecto)
Los plugins de OpenClaw son módulos TypeScript cargados en tiempo de ejecución vía jiti. La validación de configuración no ejecuta código del plugin; usa el manifiesto del plugin y JSON Schema en su lugar. Consulta Manifiesto del plugin. Los plugins pueden registrar:
- Métodos Gateway RPC
- Rutas HTTP del Gateway
- Herramientas del Agente
- Comandos CLI
- Servicios en segundo plano
- Motores de contexto
- Validación de configuración opcional
- Habilidades (listando directorios
skillsen el manifiesto del plugin) - Comandos de respuesta automática (se ejecutan sin invocar al agente de IA)
Los plugins se ejecutan en proceso con el Gateway, así que trátalos como código confiable. Guía de creación de herramientas: Herramientas del agente del plugin.
Ayudantes de tiempo de ejecución
Los plugins pueden acceder a ayudantes seleccionados del núcleo vía api.runtime. Para TTS de telefonía:
const result = await api.runtime.tts.textToSpeechTelephony({
text: "Hello from OpenClaw",
cfg: api.config,
});
Notas:
- Usa la configuración
messages.ttsdel núcleo (OpenAI o ElevenLabs). - Devuelve búfer de audio PCM + frecuencia de muestreo. Los plugins deben remuestrear/codificar para los proveedores.
- Edge TTS no es compatible para telefonía.
Para STT/transcripción, los plugins pueden llamar:
const { text } = await api.runtime.stt.transcribeAudioFile({
filePath: "/tmp/inbound-audio.ogg",
cfg: api.config,
// Opcional cuando el MIME no se puede inferir de forma confiable:
mime: "audio/ogg",
});
Notas:
- Usa la configuración de audio de comprensión de medios del núcleo (
tools.media.audio) y el orden de respaldo del proveedor. - Devuelve
{ text: undefined }cuando no se produce salida de transcripción (por ejemplo, entrada omitida/no compatible).
Rutas HTTP del Gateway
Los plugins pueden exponer endpoints HTTP con api.registerHttpRoute(...).
api.registerHttpRoute({
path: "/acme/webhook",
auth: "plugin",
match: "exact",
handler: async (_req, res) => {
res.statusCode = 200;
res.end("ok");
return true;
},
});
Campos de la ruta:
path: ruta bajo el servidor HTTP del gateway.auth: requerido. Usa"gateway"para requerir autenticación normal del gateway, o"plugin"para autenticación gestionada por plugin/verificación de webhook.match: opcional."exact"(por defecto) o"prefix".replaceExisting: opcional. Permite que el mismo plugin reemplace su propio registro de ruta existente.handler: devuelvetruecuando la ruta manejó la solicitud.
Notas:
api.registerHttpHandler(...)está obsoleto. Usaapi.registerHttpRoute(...).- Las rutas del plugin deben declarar
authexplícitamente. - Los conflictos exactos de
path + matchson rechazados a menos quereplaceExisting: true, y un plugin no puede reemplazar la ruta de otro plugin. - Las rutas superpuestas con diferentes niveles de
authson rechazadas. Mantén las cadenas de caídaexact/prefixsolo en el mismo nivel de autenticación.
Rutas de importación del SDK del Plugin
Usa subrutas del SDK en lugar de la importación monolítica openclaw/plugin-sdk al crear plugins:
openclaw/plugin-sdk/corepara APIs genéricas de plugins, tipos de autenticación de proveedor y ayudantes compartidos.openclaw/plugin-sdk/compatpara código de plugin incluido/interno que necesita ayudantes de tiempo de ejecución compartidos más amplios quecore.openclaw/plugin-sdk/telegrampara plugins del canal Telegram.openclaw/plugin-sdk/discordpara plugins del canal Discord.openclaw/plugin-sdk/slackpara plugins del canal Slack.openclaw/plugin-sdk/signalpara plugins del canal Signal.openclaw/plugin-sdk/imessagepara plugins del canal iMessage.openclaw/plugin-sdk/whatsapppara plugins del canal WhatsApp.openclaw/plugin-sdk/linepara plugins del canal LINE.openclaw/plugin-sdk/msteamspara la superficie del plugin de Microsoft Teams incluido.- También están disponibles subrutas específicas de extensiones incluidas:
openclaw/plugin-sdk/acpx,openclaw/plugin-sdk/bluebubbles,openclaw/plugin-sdk/copilot-proxy,openclaw/plugin-sdk/device-pair,openclaw/plugin-sdk/diagnostics-otel,openclaw/plugin-sdk/diffs,openclaw/plugin-sdk/feishu,openclaw/plugin-sdk/google-gemini-cli-auth,openclaw/plugin-sdk/googlechat,openclaw/plugin-sdk/irc,openclaw/plugin-sdk/llm-task,openclaw/plugin-sdk/lobster,openclaw/plugin-sdk/matrix,openclaw/plugin-sdk/mattermost,openclaw/plugin-sdk/memory-core,openclaw/plugin-sdk/memory-lancedb,openclaw/plugin-sdk/minimax-portal-auth,openclaw/plugin-sdk/nextcloud-talk,openclaw/plugin-sdk/nostr,openclaw/plugin-sdk/open-prose,openclaw/plugin-sdk/phone-control,openclaw/plugin-sdk/qwen-portal-auth,openclaw/plugin-sdk/synology-chat,openclaw/plugin-sdk/talk-voice,openclaw/plugin-sdk/test-utils,openclaw/plugin-sdk/thread-ownership,openclaw/plugin-sdk/tlon,openclaw/plugin-sdk/twitch,openclaw/plugin-sdk/voice-call,openclaw/plugin-sdk/zalo, yopenclaw/plugin-sdk/zalouser.
Nota de compatibilidad:
openclaw/plugin-sdksigue siendo compatible para plugins externos existentes.- Los plugins incluidos nuevos y migrados deben usar subrutas específicas de canal o extensión; usa
corepara superficies genéricas ycompatsolo cuando se requieran ayudantes compartidos más amplios.
Inspección de canal de solo lectura
Si tu plugin registra un canal, prefiere implementar plugin.config.inspectAccount(cfg, accountId) junto con resolveAccount(...). Por qué:
resolveAccount(...)es la ruta de tiempo de ejecución. Se le permite asumir que las credenciales están completamente materializadas y puede fallar rápidamente cuando faltan secretos requeridos.- Las rutas de comandos de solo lectura como
openclaw status,openclaw status --all,openclaw channels status,openclaw channels resolve, y flujos de reparación de doctor/config no deberían necesitar materializar credenciales de tiempo de ejecución solo para describir la configuración.
Comportamiento recomendado de inspectAccount(...):
- Devuelve solo el estado descriptivo de la cuenta.
- Preserva
enabledyconfigured. - Incluye campos de origen/estado de credenciales cuando sea relevante, como:
tokenSource,tokenStatusbotTokenSource,botTokenStatusappTokenSource,appTokenStatussigningSecretSource,signingSecretStatus
- No necesitas devolver valores de token sin procesar solo para informar disponibilidad de solo lectura. Devolver
tokenStatus: "available"(y el campo de origen coincidente) es suficiente para comandos de tipo estado. - Usa
configured_unavailablecuando una credencial está configurada vía SecretRef pero no está disponible en la ruta de comando actual.
Esto permite que los comandos de solo lectura informen "configurado pero no disponible en esta ruta de comando" en lugar de fallar o informar incorrectamente la cuenta como no configurada. Nota de rendimiento:
- El descubrimiento de plugins y los metadatos del manifiesto usan cachés cortas en proceso para reducir el trabajo de inicio/recarga en ráfagas.
- Establece
OPENCLAW_DISABLE_PLUGIN_DISCOVERY_CACHE=1oOPENCLAW_DISABLE_PLUGIN_MANIFEST_CACHE=1para deshabilitar estas cachés. - Ajusta las ventanas de caché con
OPENCLAW_PLUGIN_DISCOVERY_CACHE_MSyOPENCLAW_PLUGIN_MANIFEST_CACHE_MS.
Descubrimiento y precedencia
OpenClaw escanea, en orden:
- Rutas de configuración
plugins.load.paths(archivo o directorio)
- Extensiones del espacio de trabajo
<workspace>/.openclaw/extensions/*.ts<workspace>/.openclaw/extensions/*/index.ts
- Extensiones globales
~/.openclaw/extensions/*.ts~/.openclaw/extensions/*/index.ts
- Extensiones incluidas (incluidas con OpenClaw, mayormente deshabilitadas por defecto)
<openclaw>/extensions/*
La mayoría de los plugins incluidos deben habilitarse explícitamente vía plugins.entries.<id>.enabled o openclaw plugins enable <id>. Excepciones de plugins incluidos activados por defecto:
device-pairphone-controltalk-voice- plugin de ranura de memoria activa (ranura por defecto:
memory-core)
Los plugins instalados están habilitados por defecto, pero pueden deshabilitarse de la misma manera. Notas de endurecimiento:
- Si
plugins.allowestá vacío y hay plugins no incluidos descubribles, OpenClaw registra una advertencia de inicio con ids de plugins y fuentes. - Las rutas candidatas se verifican por seguridad antes de la admisión de descubrimiento. OpenClaw bloquea candidatos cuando:
- la entrada de extensión se resuelve fuera de la raíz del plugin (incluyendo escapes de enlace simbólico/travesía de ruta),
- la ruta raíz/fuente del plugin es escribible por todos,
- la propiedad de la ruta es sospechosa para plugins no incluidos (el propietario POSIX no es ni el uid actual ni root).
- Los plugins no incluidos cargados sin procedencia de instalación/ruta de carga emiten una advertencia para que puedas fijar la confianza (
plugins.allow) o el seguimiento de instalación (plugins.installs).
Cada plugin debe incluir un archivo openclaw.plugin.json en su raíz. Si una ruta apunta a un archivo, la raíz del plugin es el directorio del archivo y debe contener el manifiesto. Si múltiples plugins se resuelven al mismo id, la primera coincidencia en el orden anterior gana y las copias de menor precedencia se ignoran.
Paquetes de packs
Un directorio de plugin puede incluir un package.json con openclaw.extensions:
{
"name": "my-pack",
"openclaw": {
"extensions": ["./src/safety.ts", "./src/tools.ts"]
}
}
Cada entrada se convierte en un plugin. Si el pack lista múltiples extensiones, el id del plugin se convierte en name/<fileBase>. Si tu plugin importa dependencias de npm, instálalas en ese directorio para que node_modules esté disponible (npm install / pnpm install). Guardarraíl de seguridad: cada entrada de openclaw.extensions debe permanecer dentro del directorio del plugin después de la resolución de enlaces simbólicos. Las entradas que escapan del directorio del paquete son rechazadas. Nota de seguridad: openclaw plugins install instala dependencias del plugin con npm install --ignore-scripts (sin scripts de ciclo de vida). Mantén los árboles de dependencias del plugin "puro JS/TS" y evita paquetes que requieran compilaciones postinstall.
Metadatos del catálogo de canales
Los plugins de canal pueden anunciar metadatos de incorporación vía openclaw.channel y sugerencias de instalación vía openclaw.install. Esto mantiene los datos del catálogo central libres de datos. Ejemplo:
{
"name": "@openclaw/nextcloud-talk",
"openclaw": {
"extensions": ["./index.ts"],
"channel": {
"id": "nextcloud-talk",
"label": "Nextcloud Talk",
"selectionLabel": "Nextcloud Talk (autoalojado)",
"docsPath": "/channels/nextcloud-talk",
"docsLabel": "nextcloud-talk",
"blurb": "Chat autoalojado vía bots de webhook de Nextcloud Talk.",
"order": 65,
"aliases": ["nc-talk", "nc"]
},
"install": {
"npmSpec": "@openclaw/nextcloud-talk",
"localPath": "extensions/nextcloud-talk",
"defaultChoice": "npm"
}
}
}
OpenClaw también puede fusionar catálogos de canales externos (por ejemplo, una exportación del registro MPM). Coloca un archivo JSON en uno de:
~/.openclaw/mpm/plugins.json~/.openclaw/mpm/catalog.json~/.openclaw/plugins/catalog.json
O apunta OPENCLAW_PLUGIN_CATALOG_PATHS (o OPENCLAW_MPM_CATALOG_PATHS) a uno o más archivos JSON (separados por comas/punto y coma/PATH). Cada archivo debe contener { "entries": [ { "name": "@scope/pkg", "openclaw": { "channel": {...}, "install": {...} } } ] }.
IDs de Plugin
Ids de plugin por defecto:
- Paquetes de packs:
package.jsonname - Archivo independiente: nombre base del archivo (
~/.../voice-call.ts→voice-call)
Si un plugin exporta id, OpenClaw lo usa pero advierte cuando no coincide con el id configurado.
Configuración
{
plugins: {
enabled: true,
allow: ["voice-call"],
deny: ["untrusted-plugin"],
load: { paths: ["~/Projects/oss/voice-call-extension"] },
entries: {
"voice-call": { enabled: true, config: { provider: "twilio" } },
},
},
}
Campos:
enabled: interruptor maestro (por defecto: true)allow: lista de permitidos (opcional)deny: lista de denegados (opcional; denegar gana)load.paths: archivos/directorios de plugin adicionalesslots: selectores de ranura exclusivos comomemoryycontextEngineentries.<id>: interruptores por plugin + configuración
Los cambios de configuración requieren un reinicio del gateway. Reglas de validación (estrictas):
- Los ids de plugin desconocidos en
entries,allow,deny, oslotsson errores. - Las claves
channels.<id>desconocidas son errores a menos que un manifiesto de plugin declare el id del canal. - La configuración del plugin se valida usando el JSON Schema incrustado en
openclaw.plugin.json(configSchema). - Si un plugin está deshabilitado, su configuración se preserva y se emite una advertencia.
Ranuras de plugin (categorías exclusivas)
Algunas categorías de plugin son exclusivas (solo una activa a la vez). Usa plugins.slots para seleccionar qué plugin posee la ranura:
{
plugins: {
slots: {
memory: "memory-core", // o "none" para deshabilitar plugins de memoria
contextEngine: "legacy", // o un id de plugin como "lossless-claw"
},
},
}
Ranuras exclusivas compatibles:
memory: plugin de memoria activo ("none"deshabilita plugins de memoria)contextEngine: plugin de motor de contexto activo ("legacy"es el valor por defecto integrado)
Si múltiples plugins declaran kind: "memory" o kind: "context-engine", solo el plugin seleccionado se carga para esa ranura. Los otros se deshabilitan con diagnósticos.
Plugins de motor de contexto
Los plugins de motor de contexto poseen la orquestación de contexto de sesión para ingesta, ensamblaje y compactación. Regístralos desde tu plugin con api.registerContextEngine(id, factory), luego selecciona el motor activo con plugins.slots.contextEngine. Usa esto cuando tu plugin necesite reemplazar o extender la canalización de contexto por defecto en lugar de solo agregar búsqueda de memoria o ganchos.
Interfaz de usuario de control (esquema + etiquetas)
La Interfaz de usuario de control usa config.schema (JSON Schema + uiHints) para renderizar mejores formularios. OpenClaw aumenta uiHints en tiempo de ejecución basado en plugins descubiertos:
- Agrega etiquetas por plugin para
plugins.entries.<id>/.enabled/.config - Fusiona sugerencias de campos de configuración opcionales proporcionadas por el plugin bajo:
plugins.entries.<id>.config.<field>
Si quieres que los campos de configuración de tu plugin muestren buenas etiquetas/marcadores de posición (y marcar secretos como sensibles), proporciona uiHints junto con tu JSON Schema en el manifiesto del plugin. Ejemplo:
{
"id": "my-plugin",
"configSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"apiKey": { "type": "string" },
"region": { "type": "string" }
}
},
"uiHints": {
"apiKey": { "label": "Clave API", "sensitive": true },
"region": { "label": "Región", "placeholder": "us-east-1" }
}
}
CLI
openclaw plugins list
openclaw plugins info <id>
openclaw plugins install <path> # copia un archivo/directorio local en ~/.openclaw/extensions/<id>
openclaw plugins install ./extensions/voice-call # ruta relativa ok
openclaw plugins install ./plugin.tgz # instala desde un tarball local
openclaw plugins install ./plugin.zip # instala desde un zip local
openclaw plugins install -l ./extensions/voice-call # enlace (sin copia) para desarrollo
openclaw plugins install @openclaw/voice-call # instala desde npm
openclaw plugins install @openclaw/voice-call --pin # almacena nombre@versión exacto resuelto
openclaw plugins update <id>
openclaw plugins update --all
openclaw plugins enable <id>
openclaw plugins disable <id>
openclaw plugins doctor
plugins update solo funciona para instalaciones de npm rastreadas bajo plugins.installs. Si los metadatos de integridad almacenados cambian entre actualizaciones, OpenClaw advierte y pide confirmación (usa el global --yes para omitir las solicitudes). Los plugins también pueden registrar sus propios comandos de nivel superior (ejemplo: openclaw voicecall).
API del Plugin (resumen)
Los plugins exportan ya sea:
- Una función:
(api) => { ... } - Un objeto:
{ id, name, configSchema, register(api) { ... } }
Los plugins de motor de contexto también pueden registrar un gestor de contexto propiedad del tiempo de ejecución:
export default function (api) {
api.registerContextEngine("lossless-claw", () => ({
info: { id: "lossless-claw", name: "Lossless Claw", ownsCompaction: true },
async ingest() {
return { ingested: true };
},
async assemble({ messages }) {
return { messages, estimatedTokens: 0 };
},
async compact() {
return { ok: true, compacted: false };
},
}));
}
Luego habilítalo en la configuración:
{
plugins: {
slots: {
contextEngine: "lossless-claw",
},
},
}
Ganchos de Plugin
Los plugins pueden registrar ganchos en tiempo de ejecución. Esto permite que un plugin empaquete automatización impulsada por eventos sin una instalación separada de pack de ganchos.
Ejemplo
export default function register(api) {
api.registerHook(
"command:new",
async () => {
// Lógica del gancho aquí.
},
{
name: "my-plugin.command-new",
description: "Se ejecuta cuando se invoca /new",
},
);
}
Notas:
- Registra ganchos explícitamente vía
api.registerHook(...). - Las reglas de elegibilidad de ganchos aún aplican (requisitos de SO/binarios/entorno/configuración).
- Los ganchos gestionados por plugin aparecen en
openclaw hooks listconplugin:<id>. - No puedes habilitar/deshabilitar ganchos gestionados por plugin vía
openclaw hooks; habilita/deshabilita el plugin en su lugar.
Ganchos del ciclo de vida del agente (api.on)
Para ganchos de ciclo de vida de tiempo de ejecución tipados, usa api.on(...):
export default function register(api) {
api.on(
"before_prompt_build",
(event, ctx) => {
return {
prependSystemContext: "Sigue la guía de estilo de la empresa.",
};
},
{ priority: 10 },
);
}
Ganchos importantes para la construcción de prompts:
before_model_resolve: se ejecuta antes de la carga de la sesión (messagesno están disponibles). Usa esto para anular determinísticamentemodelOverrideoproviderOverride.before_prompt_build: se ejecuta después de la carga de la sesión (messagesestán disponibles). Usa esto para dar forma a la entrada del prompt.before_agent_start: gancho de compatibilidad heredado. Prefiere los dos ganchos explícitos anteriores.
Política de ganchos aplicada por el núcleo:
- Los operadores pueden deshabilitar ganchos de mutación de prompt por plugin vía
plugins.entries.<id>.hooks.allowPromptInjection: false. - Cuando está deshabilitado, OpenClaw bloquea
before_prompt_builde ignora los campos de mutación de prompt devueltos desde el heredadobefore_agent_startmientras preserva los heredadosmodelOverrideyproviderOverride.
Campos de resultado de before_prompt_build:
prependContext: antepone texto al prompt del usuario para esta ejecución. Mejor para contenido específico por turno o dinámico.systemPrompt: anulación completa del prompt del sistema.prependSystemContext: antepone texto al prompt del sistema actual.appendSystemContext: agrega texto al prompt del sistema actual.
Orden de construcción de prompt en tiempo de ejecución integrado:
- Aplica
prependContextal prompt del usuario. - Aplica la anulación
systemPromptcuando se proporciona. - Aplica
prependSystemContext + prompt del sistema actual + appendSystemContext.
Notas de fusión y precedencia:
- Los manejadores de ganchos se ejecutan por prioridad (mayor primero).
- Para campos de contexto fusionados, los valores se concatenan en orden de ejecución.
- Los valores de
before_prompt_buildse aplican antes de los valores de respaldo heredados debefore_agent_start.
Guía de migración:
- Mueve la guía estática de
prependContextaprependSystemContext(oappendSystemContext) para que los proveedores puedan almacenar en caché contenido estable de prefijo del sistema. - Mantén
prependContextpara contexto dinámico por turno que deba permanecer vinculado al mensaje del usuario.
Plugins de proveedor (autenticación de modelo)
Los plugins pueden registrar flujos de autenticación de proveedor de modelo para que los usuarios puedan ejecutar OAuth o configuración de clave API dentro de OpenClaw (sin scripts externos necesarios). Registra un proveedor vía api.registerProvider(...). Cada proveedor expone uno o más métodos de autenticación (OAuth, clave API, código de dispositivo, etc.). Estos métodos impulsan:
openclaw models auth login --provider <id> [--method <id>]
Ejemplo:
api.registerProvider({
id: "acme",
label: "AcmeAI",
auth: [
{
id: "oauth",
label: "OAuth",
kind: "oauth",
run: async (ctx) => {
// Ejecuta flujo OAuth y devuelve perfiles de autenticación.
return {
profiles: [
{
profileId: "acme:default",
credential: {
type: "oauth",
provider: "acme",
access: "...",
refresh: "...",
expires: Date.now() + 3600 * 1000,
},
},
],
defaultModel: "acme/opus-1",
};
},
},
],
});
Notas:
runrecibe unProviderAuthContextcon ayudantesprompter,runtime,openUrl, yoauth.createVpsAwareHandlers.- Devuelve
configPatchcuando necesites agregar modelos por defecto o configuración de proveedor. - Devuelve
defaultModelpara que--set-defaultpueda actualizar los valores por defecto del agente.
Registrar un canal de mensajería
Los plugins pueden registrar plugins de canal que se comportan como canales integrados (WhatsApp, Telegram, etc.). La configuración del canal vive bajo channels.<id> y es validada por tu código de plugin de canal.
const myChannel = {
id: "acmechat",
meta: {
id: "acmechat",
label: "AcmeChat",
selectionLabel: "AcmeChat (API)",
docsPath: "/channels/acmechat",
blurb: "plugin de canal de demostración.",
aliases: ["acme"],
},
capabilities: { chatTypes: ["direct"] },
config: {
listAccountIds: (cfg) => Object.keys(cfg.channels?.acmechat?.accounts ?? {}),
resolveAccount: (cfg, accountId) =>
cfg.channels?.acmechat?.accounts?.[accountId ?? "default"] ?? {
accountId,
},
},
outbound: {
deliveryMode: "direct",
sendText: async () => ({ ok: true }),
},
};
export default function (api) {
api.registerChannel({ plugin: myChannel });
}
Notas:
- Coloca la configuración bajo
channels.<id>(noplugins.entries). meta.labelse usa para etiquetas en listas CLI/UI.meta.aliasesagrega ids alternativos para normalización y entradas CLI.meta.preferOverlista ids de canal para omitir la habilitación automática cuando ambos están configurados.meta.detailLabelymeta.systemImagepermiten que las UIs muestren etiquetas/iconos de canal más ricos.
Ganchos de incorporación de canal
Los plugins de canal pueden definir ganchos de incorporación opcionales en plugin.onboarding:
configure(ctx)es el flujo de configuración básico.configureInteractive(ctx)puede poseer completamente la configuración interactiva para estados configurados y no configurados.configureWhenConfigured(ctx)puede anular el comportamiento solo para canales ya configurados.
Precedencia de ganchos en el asistente:
configureInteractive(si está presente)configureWhenConfigured(solo cuando el estado del canal ya está configurado)- respaldo a
configure
Detalles del contexto:
configureInteractiveyconfigureWhenConfiguredreciben:configured(trueofalse)label(nombre del canal orientado al usuario usado por los prompts)- más los campos compartidos config/runtime/prompter/options
- Devolver
"skip"deja la selección y el seguimiento de cuenta sin cambios. - Devolver
{ cfg, accountId? }aplica actualizaciones de configuración y registra la selección de cuenta.
Escribir un nuevo canal de mensajería (paso a paso)
Usa esto cuando quieras una nueva superficie de chat (un "canal de mensajería"), no un proveedor de modelo. La documentación del proveedor de modelo vive bajo `/prov