@openclaw/copilot ejecuta turnos de agente de Copilot
con suscripción integrada mediante la CLI de GitHub Copilot (@github/copilot-sdk) en lugar del
arnés PI integrado de OpenClaw. La sesión de la CLI de Copilot posee el bucle
de agente de bajo nivel: ejecución nativa de herramientas, compaction nativa (infiniteSessions) y
estado de hilos gestionado por la CLI bajo copilotHome. OpenClaw sigue siendo propietario de los
canales de chat, archivos de sesión, selección de modelo, herramientas dinámicas (en puente), aprobaciones,
entrega de medios, espejo visible de la transcripción, preguntas laterales de /btw (consulta
Preguntas laterales (/btw)) y openclaw doctor.
Para la división más amplia entre modelo/proveedor/runtime, empieza con
Runtimes de agente.
Requisitos
- OpenClaw con el plugin
@openclaw/copilotinstalado. - Si tu configuración usa
plugins.allow, incluyecopilot(el id de manifiesto que declara el plugin). Una entrada de allowlist para el nombre del paquete npm@openclaw/copilotno coincidirá y dejará el plugin bloqueado, incluso conagentRuntime.id: "copilot"definido. - Una suscripción de GitHub Copilot que pueda controlar la CLI de Copilot, o una
variable de entorno
gitHubToken/ entrada de perfil de autenticación para ejecuciones sin interfaz o de cron. - Un directorio
copilotHomecon permisos de escritura. El valor predeterminado es<agentDir>/copilotcuando OpenClaw proporciona un directorio de agente; de lo contrario,~/.openclaw/agents/<agentId>/copilot.
openclaw doctor ejecuta el contrato de doctor del plugin para
la propiedad del estado de sesión y futuras migraciones de configuración. No sondea el
entorno de la CLI de Copilot.
Instalación
El runtime de Copilot se distribuye como un plugin externo para que el paquete principalopenclaw no incluya @github/copilot-sdk ni su binario de CLI
@github/copilot-<platform>-<arch> específico de plataforma (aproximadamente 260 MB en conjunto).
Instálalo solo para agentes que opten por este runtime:
github-copilot/* y tu configuración enruta ese modelo (o su
proveedor) al runtime de Copilot mediante agentRuntime: { id: "copilot" }; consulta
Inicio rápido. Sin esa adhesión explícita, OpenClaw usa su proveedor
integrado de GitHub Copilot y nunca instala este plugin.
El runtime resuelve el SDK en este orden:
import("@github/copilot-sdk")desde el paquete@openclaw/copilotinstalado.- El directorio de respaldo
~/.openclaw/npm-runtime/copilot/(destino heredado de instalación bajo demanda).
COPILOT_SDK_MISSING y el
comando de reinstalación anterior.
Inicio rápido
Fija un modelo (o un proveedor) al arnés:agentRuntime.id en una sola entrada de modelo para enrutar solo ese modelo mediante
el arnés, o en un proveedor para enrutar todos los modelos bajo ese proveedor.
github-copilot/auto es el punto de partida portable. Los modelos con nombre de Copilot dependen
de la cuenta y de la política de la organización; confirma que tu CLI de Copilot autenticada
realmente exponga un modelo antes de fijarlo.
Proveedores compatibles
El arnés admite el proveedor canónicogithub-copilot (propiedad de
extensions/github-copilot), además de entradas personalizadas de models.providers cuando el
modelo tiene un baseUrl no vacío y una de estas formas de api:
anthropic-messagesazure-openai-responsesollama(completions compatibles con OpenAI)openai-completionsopenai-responses
openai, anthropic, google, ollama) siguen siendo propiedad de
sus runtimes nativos. Usa un id de proveedor personalizado distinto para enrutar un endpoint
mediante Copilot BYOK en su lugar.
Los endpoints de Copilot BYOK deben ser URL HTTPS públicas. El arnés entrega al
SDK de Copilot un proxy local loopback por intento y luego reenvía el tráfico del proveedor
mediante la ruta de fetch protegida de OpenClaw para que la fijación de DNS y la política SSRF sigan
siendo propiedad de OpenClaw. Usa el runtime nativo de OpenClaw para Ollama local, LM
Studio o servidores de modelos LAN.
BYOK
Copilot BYOK usa el contrato de proveedor personalizado a nivel de sesión del SDK. OpenClaw pasa el endpoint de modelo resuelto, clave de API, modo de token portador, encabezados, id de modelo y límites de contexto/salida; la lógica de transporte del proveedor permanece en el SDK, no en el núcleo.Autenticación
Precedencia, aplicada por agente duranterunCopilotAttempt:
-
useLoggedInUser: trueexplícito en la entrada del intento: usa el usuario con sesión iniciada de la CLI de Copilot bajo elcopilotHomedel agente. -
gitHubTokenexplícito en la entrada del intento (requiereprofileId+profileVersion). Para invocaciones directas de CLI y pruebas que necesitan omitir la resolución de perfiles de autenticación. -
resolvedApiKey+authProfileIdresueltos por contrato: la ruta principal de producción. El núcleo resuelve el perfil de autenticacióngithub-copilotconfigurado para el agente (src/infra/provider-usage.auth.ts:resolveProviderAuths) antes de invocar el arnés, por lo que un perfil de autenticacióngithub-copilot:<profile>funciona de extremo a extremo para configuraciones sin interfaz, cron o con múltiples perfiles sin variables de entorno. -
Respaldo de variables de entorno, comprobadas en este orden (gana el primer valor no vacío;
las cadenas vacías cuentan como ausentes; refleja la precedencia enviada del proveedor
github-copilotenextensions/github-copilot/auth.ts):OPENCLAW_GITHUB_TOKEN: anulación específica del arnés; te permite fijar un token para el arnés de OpenClaw sin alterar la configuración global degh/ la CLI de Copilot.COPILOT_GITHUB_TOKEN: variable de entorno estándar del SDK / CLI de Copilot.GH_TOKEN: variable de entorno estándar de la CLIgh.GITHUB_TOKEN: respaldo genérico de token de GitHub.
env:<NAME>; la versión del perfil es una huella sha256 no reversible del token, por lo que rotar el valor de entorno invalida limpiamente el grupo de clientes. -
useLoggedInUserpredeterminado cuando no hay ninguna señal de token disponible.
copilotHome para que los tokens, sesiones y
configuración de la CLI de Copilot nunca se filtren entre agentes en la misma máquina. Predeterminado:
<agentDir>/copilot (mantiene el estado del SDK fuera del mismo directorio que
models.json / auth-profiles.json de OpenClaw), o
~/.openclaw/agents/<agentId>/copilot cuando no se proporciona ningún directorio de agente.
Anula con copilotHome: <path> en la entrada del intento para una
ubicación personalizada (por ejemplo, un montaje compartido para migración).
Las pruebas en vivo del arnés usan OPENCLAW_COPILOT_AGENT_LIVE_TOKEN para un
token directo. La configuración compartida de pruebas en vivo limpia COPILOT_GITHUB_TOKEN, GH_TOKEN
y GITHUB_TOKEN después de preparar perfiles de autenticación reales en el home de prueba aislado,
por lo que un valor de gh auth token pasado mediante la variable dedicada evita
omisiones falsas sin filtrarse a suites no relacionadas.
Superficie de configuración
El arnés lee la configuración desde la entrada por intento (runCopilotAttempt({...}))
más un pequeño conjunto de valores predeterminados de entorno dentro de extensions/copilot/src/:
| Campo | Propósito |
|---|---|
copilotHome | Directorio de estado de CLI por agente (valores predeterminados arriba). |
model | Cadena o { provider, id, api?, baseUrl?, headers?, authHeader? }. Omítelo para usar la selección normal de modelo del agente; el arnés verifica que el proveedor resuelto sea compatible. |
reasoningEffort | "low" | "medium" | "high" | "xhigh". Se asigna desde la resolución ThinkLevel / ReasoningLevel de OpenClaw en auto-reply/thinking.ts. |
infiniteSessionConfig | Anulación opcional para el bloque infiniteSessions del SDK controlado por harness.compact. Es seguro dejarlo como está. |
hooksConfig | Configuración opcional nativa de SessionHooks del SDK de Copilot para callbacks de herramienta/MCP, prompt de usuario, sesión y error. Separada de los hooks portables de ciclo de vida de OpenClaw. |
permissionPolicy | Anulación opcional para el controlador onPermissionRequest del SDK para tipos de herramientas integradas del SDK (shell, write, read, url, mcp, memory, hook). El valor predeterminado es rejectAllPolicy como red de seguridad; consulta Permisos y ask_user para ver por qué en realidad nunca se ejecuta. |
enableSessionTelemetry | Indicador opcional de telemetría de sesión del SDK. |
before_prompt_build (y el hook de compatibilidad heredado
before_agent_start), llm_input, llm_output y agent_end mediante los
helpers estándar del arnés. Las compactions correctas del SDK también ejecutan
before_compaction y after_compaction. Las herramientas de OpenClaw en puente ejecutan
before_tool_call e informan after_tool_call; hooksConfig permanece para
callbacks solo nativos del SDK sin equivalente portable.
Nada más en OpenClaw necesita conocer estos campos. Otros plugins,
canales y código del núcleo ven solo la forma estándar AgentHarnessAttemptParams /
AgentHarnessAttemptResult.
Compaction
Cuando se ejecutaharness.compact, el arnés del SDK de Copilot:
- Reanuda la sesión del SDK rastreada sin continuar trabajo pendiente.
- Llama a la RPC de compaction de historial con ámbito de sesión del SDK.
- Devuelve el resultado de compaction del SDK sin escribir archivos marcadores de compatibilidad bajo el espacio de trabajo.
Espejo de transcripción
runCopilotAttempt escribe dualmente los mensajes espejables de cada turno en la
transcripción de auditoría de OpenClaw mediante
extensions/copilot/src/dual-write-transcripts.ts. El espejo se delimita por
sesión (copilot:${sessionId}) y se identifica por mensaje
(${role}:${sha256_16(role,content)}), por lo que las entradas de turnos anteriores reemitidas
colisionan con las claves existentes en disco en lugar de duplicarse.
Dos capas de contención de fallos envuelven el espejo para que un fallo al escribir la transcripción nunca haga fallar el intento: un envoltorio interno de mejor esfuerzo, más un .catch(...) de defensa en profundidad en el nivel del intento. Los fallos se registran, no se exponen.
Preguntas secundarias (/btw)
/btw no es nativo en este harness. createCopilotAgentHarness()
deja deliberadamente harness.runSideQuestion sin definir
(comprobado en extensions/copilot/harness.test.ts, describe("runSideQuestion")),
por lo que el despachador /btw de OpenClaw (src/agents/btw.ts) cae en la
misma ruta que usa para cada runtime que no es Codex: se llama directamente al
proveedor de modelos configurado con un prompt breve de pregunta secundaria y se transmite de vuelta mediante
streamSimple (sin sesión de CLI, sin ranura adicional en el pool).
Esto mantiene las sesiones de Copilot CLI reservadas para el bucle de turnos principal del agente, y
mantiene el comportamiento de /btw idéntico al de otros runtimes que no son Codex.
Doctor
extensions/copilot/doctor-contract-api.ts se carga automáticamente mediante
src/plugins/doctor-contract-registry.ts. Aporta:
- Un
legacyConfigRulesvacío (todavía no hay campos retirados). - Un
normalizeCompatibilityConfigsin operación (conservado para que futuras retiradas de campos tengan un lugar estable dentro del árbol). - Una entrada
sessionRouteStateOwners: proveedorgithub-copilot, runtimecopilot, clave de sesión de CLIcopilot, prefijo de perfil de autenticacióngithub-copilot:.
Limitaciones
- El harness reclama
github-copilotmás ids de proveedor BYOK personalizados sin propietario. Los ids de proveedor nativo propiedad del manifiesto permanecen en su runtime propietario incluso cuandoagentRuntime.idse fuerza acopilot. - Sin superficie TUI; la TUI de PI sigue siendo la alternativa para runtimes sin una superficie equivalente.
- El estado de sesión de PI no migra cuando un agente cambia a
copilot. La selección es por intento; las sesiones de PI existentes siguen siendo válidas. ask_userusa la misma ruta de prompt y respuesta de OpenClaw que el harness de Codex: cuando el SDK de Copilot solicita entrada del usuario, OpenClaw publica un prompt bloqueante en el canal/TUI activo, y el siguiente mensaje de usuario en cola resuelve la solicitud del SDK.
Permisos y ask_user
La aplicación de permisos para herramientas OpenClaw puenteadas ocurre dentro del envoltorio de la herramienta, no mediante el callbackonPermissionRequest del SDK. El mismo
wrapToolWithBeforeToolCallHook que usa PI
(src/agents/agent-tools.before-tool-call.ts) lo aplica
createOpenClawCodingTools a cada herramienta de codificación: la detección de bucles, las políticas de Plugin de confianza, los hooks before-tool-call y las aprobaciones de Plugin en dos fases mediante
el Gateway (plugin.approval.request) se ejecutan todos a través de exactamente la misma ruta de código
que los intentos nativos de PI.
La herramienta del SDK devuelta por convertOpenClawToolToSdkTool se marca con:
overridesBuiltInTool: true— reemplaza la herramienta integrada de Copilot CLI con el mismo nombre (edit, read, write, bash, …) para que cada llamada de herramienta vuelva a enrutarse a OpenClaw.skipPermission: true— indica al SDK que no dispareonPermissionRequest({kind: "custom-tool"})antes de invocar la herramienta. Elexecute()envuelto ya realiza la comprobación de políticas más completa de OpenClaw; un prompt a nivel de SDK acortaría la aplicación de OpenClaw (permitir todo) o bloquearía cada llamada de herramienta (rechazar todo), y ninguno de los dos coincide con la paridad con PI.
extensions/codex/src/app-server/dynamic-tools.ts) y los
tipos de aprobación nativos propios de codex-app-server
(item/commandExecution/requestApproval, item/fileChange/requestApproval,
item/permissions/requestApproval) se enrutan mediante plugin.approval.request
(extensions/codex/src/app-server/approval-bridge.ts). El equivalente del SDK de Copilot — rejectAllPolicy con cierre ante fallos para cualquier tipo que no sea custom-tool
que llegue alguna vez a onPermissionRequest — es la misma red de seguridad, y
nunca se dispara en la práctica porque overridesBuiltInTool: true desplaza todas
las herramientas integradas.
Para que la capa de herramienta envuelta tome decisiones de política equivalentes a PI, el
harness reenvía el contexto completo de herramienta de intento de PI a
createOpenClawCodingTools: identidad (senderIsOwner, memberRoleIds,
ownerOnlyToolAllowlist, …), canal/enrutamiento (groupId,
currentChannelId, replyToMode, conmutadores de herramientas de mensaje), autenticación
(authProfileStore), identidad de ejecución (sessionKey / runSessionKey derivados
de sandboxSessionKey, runId), contexto de modelo (modelApi,
modelContextWindowTokens, modelCompat, modelHasVision) y hooks de ejecución
(onToolOutcome, onYield). Sin esos campos, las listas de permitidos solo para propietarios
deniegan silenciosamente de forma predeterminada, las políticas de confianza de Plugin no pueden resolverse al ámbito correcto,
y session_status: "current" se resuelve a una clave de sandbox obsoleta. El
constructor del puente es extensions/copilot/src/tool-bridge.ts, que refleja la llamada
autoritativa de PI en src/agents/embedded-agent-runner/run/attempt.ts:1262.
runAttempt resuelve el contexto de sandbox mediante la costura compartida
resolveSandboxContext, pasa al SDK un directorio de trabajo efectivo,
y reenvía sandbox más el espacio de trabajo de generación de subagente al puente de herramientas. El puente también reenvía los controles acotados de construcción de herramientas que
puede aplicar en el límite del SDK: includeCoreTools, la lista de permitidos de herramientas del runtime
y toolConstructionPlan.
El puente también usa el helper compartido de superficie de herramientas de harness de
openclaw/plugin-sdk/agent-harness-tool-runtime para la paridad con PI. Cuando
la búsqueda de herramientas está habilitada, el SDK ve herramientas de control compactas más un ejecutor de catálogo oculto
en lugar de todos los esquemas de herramientas de OpenClaw. Cuando el modo de código está
habilitado, el helper construye la misma superficie de control de modo de código y el ciclo de vida de catálogo
usados por otros harnesses de agente. Los valores predeterminados ligeros de modelos locales,
el filtrado de esquemas compatible con runtime, la hidratación de directorios y la limpieza de catálogo
permanecen todos en el helper compartido para que Copilot y los harnesses adyacentes a Codex
no diverjan.
Token de GitHub a nivel de sesión
El contrato del SDK de Copilot distingue el token de GitHub a nivel de cliente (CopilotClientOptions.gitHubToken, autentica el propio proceso de CLI)
del token a nivel de sesión (SessionConfig.gitHubToken, determina
la exclusión de contenido, el enrutamiento de modelo y la cuota para esa sesión; se respeta tanto en
createSession como en resumeSession). El harness resuelve la autenticación una vez mediante
resolveCopilotAuth y establece ambos campos cuando el modo de autenticación es gitHubToken
(un auth.gitHubToken explícito o un resolvedApiKey resuelto por contrato desde
un perfil de autenticación github-copilot configurado). Cuando el modo resuelto es
useLoggedInUser, se omite el campo a nivel de sesión para que el SDK siga
derivando la identidad de la identidad con sesión iniciada.
ask_user usa SessionConfig.onUserInputRequest. El puente acepta índices de elección
o etiquetas para solicitudes de elección fija, acepta respuestas de formato libre cuando
la solicitud del SDK las permite y cancela una solicitud pendiente cuando se aborta el intento de OpenClaw.