RPC (Remote Procedure Call)
En el SDK oficial, las funcionalidades más recientes se implementan mediante generación automática de código a partir deapi.schema.json. En la versión Laravel se implementan del mismo modo, tomando como referencia las versiones ya generadas en otros lenguajes.
ServerRpc
Clase RPC asociada al Client.Conexión, modelos, herramientas y cuentas
ping() y connect() comprueban e inician la conexión, y registerExtensionLaunchProvider() registra el proveedor de arranque de extensiones. La lista de modelos, las unidades de precio y el catálogo integrado se obtienen con models(), y la lista de herramientas disponibles con tools(). account() gestiona la cuota, el estado de autenticación, la lista de usuarios con sesión iniciada, el inicio y el cierre de sesión, y accounts() obtiene tokens de Microsoft Entra ID.
MCP, conectores y secretos
mcp() ofrece listar, añadir, actualizar y eliminar configuraciones MCP, así como activarlas, detectarlas, buscar en el registro y planificar y aplicar instalaciones. connectors() permite consultar las capacidades, las cuentas y el catálogo de conectores. Las operaciones de conectores en el lado del servidor se centran en listar y actualizar por cuenta. El método experimental secrets()->addFilterValues() registra en el filtro de redacción de la CLI los secretos dinámicos generados por tu host. A partir de ese momento, la CLI enmascara esos valores en los logs y las exportaciones de la sesión.
Skills, Plugins, Agents, Instructions y Extensions
Cada grupo permite explorar, obtener las rutas disponibles, cambiar la configuración y recargar.commands() ofrece la lista de comandos integrados y hooks() la exploración de hooks antes de iniciar la sesión. Skills y Plugins admiten activar, desactivar y gestionar instalaciones, y Agents también puede obtener información de los agentes integrados. Extensions explora, activa y desactiva extensiones persistidas.
Catálogo e instalación
catalog() busca candidatos, obtiene recomendaciones de productos oficiales, selecciona candidatos y obtiene feeds, y las API de Skills, Plugins y MCP permiten revisar planes de instalación, aplicarlos, consultar su estado y cancelarlos. Planificar y aplicar son operaciones separadas. Consulta los ejemplos concretos de instalación en los apartados posteriores.
Sesiones, host y entorno de ejecución
sessions() gestiona la búsqueda de sesiones persistidas, la lectura de eventos, la consulta de tamaños, la eliminación y limpieza, y el fork. También permite crear y cargar Workspaces y el control remoto. host() arranca el host, publica, lista y retira la publicación de sesiones, gestiona la autenticación, cambia la política de admisión de sesiones y lo destruye. Estas RPC del host sustentan la API de host de alto nivel de AHP (Agent Host Protocol) del SDK. runtime() gestiona el ciclo de vida del runtime.
Tareas del agente en la nube (experimental)
cloudTasks() crea, elimina y obtiene tareas del agente de codificación en la nube, recupera los logs y replays de sesión, cambia el estado de uso compartido y resuelve la sesión que se debe abrir a partir de un ID de tarea. Cada método acepta el tipo Params correspondiente o un array y devuelve un DTO tipado. Cuando ok del resultado de creación es false, consulta reason y message para ver por qué el servicio rechazó la solicitud, y statusCode, errorMessage y errorPayloadJson para la información de fallo de la solicitud HTTP realizada.
Git, entornos, sandbox y políticas
git() obtiene información de ramas, del directorio de trabajo y de los Git remote, y gitHubRepository() y gitHubOwners() permiten explorar repositorios y propietarios de GitHub. environments() gestiona los entornos de Mission Control, sandbox() y sandboxProxyCa() el soporte de sandbox y el Proxy CA, contentExclusion() la validación de políticas de exclusión, y managedSettings() y userSettings() la configuración. Usa settings() para eliminar claves individuales de un archivo de configuración y para ocultar valores al mostrarlos.
gitHubRepository()->getById() resuelve el owner y el nombre a partir de un ID de repositorio de GitHub, y lookupBranchPullRequest() busca en los repositorios indicados, por orden de prioridad, un pull request del head owner y la rama indicados. Ambos reciben authInfo tal cual. El resultado de getById() contiene el owner y el nombre en repository, o null si no se encuentra el repositorio. El status de la búsqueda de pull requests es found, no-token, no-pr o lookup-failed. Los valores desconocidos se conservan como cadenas, por lo que no lanzan excepciones. pullRequest es un array asociativo cuando se encuentra un pull request y null en caso contrario.
gitHubFetch() proporciona solicitudes autenticadas a la API de GitHub y operaciones con nombre, y gitHubRelease() la búsqueda de releases, snapshots, descargas de assets y consulta del progreso. En Fetch, sessionId selecciona la autenticación de una sesión. Si se omite, se usa la autenticación del proceso. Especifica authOwnerId para usar un enlace de autenticación gestionado por el host. En Release, authInfo selecciona credenciales gestionadas por el runtime, y las releases públicas se pueden buscar y descargar de forma anónima. Elimina tú mismo el path descargado después de usarlo.
allocateRequestId(), request() y executeOperation() de Fetch, y abandonRequest(), getSnapshot() y downloadAsset() de Release no se pueden llamar desde Extensions. El SDK de Laravel no expone actualmente la RPC cancel de ninguno de los dos grupos, por lo que no puedes cancelar desde el SDK una operación en curso. abandonRequest() descarta un ID de solicitud de Release no utilizado y no detiene una operación en curso.
Modelos locales, inferencia HTTP y sistema de ficheros
azureMl() ofrece el catálogo, la resolución y la descarga de modelos locales, además de consultar su estado, cancelar y eliminar. llmInference() es una API experimental que reenvía al cliente las peticiones HTTP de la capa de modelos. sessionFs() registra un proveedor de callbacks de sistema de ficheros/SQLite para la sesión.
Callbacks de red (experimental)
network()->setProvider() informa al runtime de los callbacks de resolución de proxy y autenticación Kerberos registrados en el cliente. Normalmente la opción network del Client los registra automáticamente, por lo que no necesitas llamar a este RPC directamente. Los campos de callback de NetworkSetProviderRequest indican que el handler correspondiente está registrado. El RPC no devuelve ningún valor. El runtime debe admitir el RPC network.setProvider. Si no lo admite, el cliente lanza una excepción al iniciarse que te pide actualizar el runtime. Consulta Autenticación para más detalles.
scope es connection por defecto. runtime cubre también la comunicación compartida en segundo plano, pero solo una conexión a la vez puede registrarse con este scope.
RPCs internos y experimentales
Los siguientes RPCs están marcados como internos en el SDK oficial, pero Laravel los expone como@experimental. Pueden cambiar o eliminarse en el futuro, y las restricciones de llamador del runtime siguen aplicándose. Úsalos para crear, listar y eliminar entradas del registro de agentes, abrir una URL de autenticación en el navegador, limpiar salidas grandes de herramientas caducadas y obtener advertencias de concesión de rutas del sandbox. Los resultados de listado no incluyen credenciales de conexión.
Ejemplo básico de llamada
Ejemplos de uso por funcionalidad
A continuación se recogen llamadas representativas de las funcionalidades anteriores.Candidatos de Agent Plugin en el catálogo
Si encatalog.search requieres agent-plugin-discovery e indicas plugin en los kinds de búsqueda, puedes obtener candidatos de Agent Plugin. Para recibir application/vnd.anthropic.claude-plugin+json y application/agent-plugin+json, además del formato estándar application/vnd.github.copilot-plugin, requiere agent-plugin-formats además de agent-plugin-discovery.
agent-plugin-confirmed-installation es una capability que devuelve si se puede instalar y un plan para revisión; también se requiere junto con agent-plugin-discovery. Si se concede, los candidatos incluyen installability, cuyo valor es installable, install-data-unavailable, feature-disabled o not-installable-kind. installPlan solo se incluye cuando installability es installable. El plan es solo un dato para revisión; esta RPC de catalog nunca ejecuta la instalación.
Los sources del plan contienen, por orden de prioridad, candidatos materialization, marketplace y repository. En Marketplace se registran el nombre y el repositorio, y en un Repository directo, el repositorio y una ruta opcional. En los planes que solo tienen materialization se omite pluginName y components está vacío. Confirma el nombre y el contenido que se instalará realmente en la revisión que devuelve plugins.planInstall().
Con plugins.planInstall() puedes crear, para un candidato seleccionado, un plan validado sin efectos secundarios. plugins.applyInstall() solicita una confirmación explícita al usuario y aplica el plan si se autoriza. Tras aplicarlo, el plugin queda registrado en estado desactivado.
Los mcpServers de la revisión muestran el nombre del servidor, el transport y, si es remoto, el host que declaran los ficheros validados. Esto no es una garantía de seguridad, así que el usuario debe revisar el contenido antes de dar la confirmación explícita. La description de un plugin instalado procede del manifest. verifiedSource indica el repositorio de GitHub y un commit fijo, y solo existe en instalaciones directas fijadas a un commit. iconUrl es contenido externo no fiable, así que no envíes credenciales ni credenciales de GitHub al obtenerlo. Las credenciales en sí no se devuelven como motivo de rechazo.
En el network-failure de un resultado de instalación puedes consultar CatalogNetworkFailureReason, el statusCode HTTP, un retryAfterSeconds opcional y un message que se puede mostrar con seguridad.
catalog.planInstallFromReference(). El outcome->kind del resultado es plugin-install-planned, skill-install-planned o refused. Pasa los planes de plugins a plugins.applyInstall() y los de skills a skills.applyInstall().
contentExclusion
Antes de crear una sesión, puedes validar el JSON de una política de exclusión de contenido.policiesJson se pasa a la CLI como una cadena JSON sin analizar. Si falla el análisis del JSON o la validación del esquema, se produce un error RPC de la CLI (JsonRpcException).
Es una RPC con ámbito de servidor que valida la propia política. Para comprobar rutas dentro del directorio de trabajo de la sesión contra la política de exclusión real, usa contentExclusion()->checkPaths() con ámbito de sesión.
managedSettings (experimental: configuración gestionada)
Lee la configuración gestionada, resuelve políticas, obtiene el esquema, valida, previsualiza la composición y descarta la caché.settings (experimental: operaciones con archivos de configuración)
Elimina una clave concreta de un archivo de configuración y oculta valores secretos para mostrarlos.removeRawKey() elimina claves tal cual, incluidas las que no son rutas de configuración canónicas, como claves que no se pudieron cargar. Si el archivo no se puede analizar, la CLI no lo sobrescribe y status es invalid. redactValueForDisplay() reemplaza los valores secretos por marcadores según la posición en el árbol de configuración indicada por basePath, para que puedas mostrar el valor a los usuarios o escribirlo en logs.
Ciclo de vida de Runtime y Host (experimental)
host.unpublishSession() retira la application publication de un host en ejecución del que se es propietario. Retirar la publicación no elimina ni detiene el historial de la sesión original, el worktree ni el trabajo en curso. Si ya no estaba publicada, unpublished es false, y las publication que no son application producen un error.
host.dispose() destruye el listener del host indicando hostId.
host.setSessionCreationPolicy() cambia si un host en ejecución acepta nuevas sesiones remotas. El cambio no desconecta a los clientes existentes y solo se aplica a las admisiones posteriores.
Client::stop() llama a runtime.shutdown después de desconectar las sesiones y antes de cerrar la conexión JSON-RPC y el proceso. La desconexión de sesiones (session.detach) comparte un único plazo total de 10 segundos para todas las sesiones. Una desconexión que supera el plazo se incluye como error en el valor de retorno y el proceso de parada continúa. También espera hasta 10 segundos a que termine la limpieza del runtime y, si falla, incluye el error en el valor de retorno y continúa con el resto del proceso de parada. En conexiones a runtimes externos como cli_url, no llama a esta RPC para no terminar un runtime compartido.
Si la CLI no puede identificar la petición correspondiente y devuelve un error JSON-RPC con id: null, todas las peticiones en curso fallan con una JsonRpcException. La excepción incluye un mensaje de diagnóstico sin los valores entre comillas y con la longitud limitada. La conexión se mantiene abierta. Como es posible que la CLI ya haya procesado la petición, no reintentes automáticamente sin confirmar que es seguro hacerlo. El SDK rechaza antes de enviarlas las peticiones salientes con más de 127 niveles de anidamiento, que la CLI no puede leer, y sustituye por un error JSON-RPC las respuestas de handlers con un anidamiento demasiado profundo.
SessionRpc
Clase RPC asociada a la Session. También permite cosas que no eran posibles con el SDK anterior, como usar el modo plan.Modelo, modo, nombre y plan
model() permite consultar y cambiar el modelo actual, y configurar el reasoning effort, el Auto tier y los modelos permitidos. mode() gestiona el modo, name() el nombre de la sesión y plan() la lectura y escritura del texto del plan y de los todo de SQLite.
Workspace, instrucciones y LSP
workspaces() ofrece listar, leer, escribir, mover y eliminar ficheros, además de operaciones con directorios. instructions() obtiene, recarga y explora instrucciones, y lsp() inicializa la configuración de servidores de lenguaje.
Objetivo de Autopilot
autopilotObjective()->getState() devuelve como objeto tipado el estado actual del objetivo de Autopilot de la sesión. Si no existe ningún objetivo, state es null. Esta API es distinta de workspaces()->autopilotObjectiveExists(), que comprueba si hay un objetivo guardado en el Workspace.
setStayInAutopilot() puedes suprimir la solicitud de volver al modo interactivo cuando un objective se completa o se pausa. Este ajuste se mantiene en la memoria del cliente y su valor predeterminado es true. Pasa false en value para dejar de suprimirla. Vuelve a configurarlo después de reconectarte.
Agentes, Fleet y tareas en segundo plano
agent() lista, selecciona y recarga agentes, y fleet() inicia Fleet. tasks() gestiona el registro de agentes en segundo plano y tareas propiedad del cliente, la obtención y actualización del progreso, la migración, el envío de mensajes, la cancelación y la eliminación.
MCP, Plugins, Extensions y Workflow
mcp() gestiona listar, iniciar, detener y recargar servidores, herramientas, prompts y recursos, OAuth, sampling y la actualización de cabeceras dinámicas. plugins() y extensions() gestionan el estado dentro de la sesión, y customizations() recarga las personalizaciones. workflow() ejecuta y consulta workflows, y diagnostics() y connectors() obtienen información de diagnóstico y conectores.
Tools, Permissions, Commands y UI
tools() y permissions() gestionan las respuestas a solicitudes pendientes recibidas por eventos y su configuración. permissions()->clearResumeEscalation() anula en memoria la escalada de permisos restaurada desde el historial al reanudar y devuelve un resultado de éxito tipado. commands() ofrece listar y ejecutar comandos y responder a eventos, y ui() responde a solicitudes como entrada del usuario, elicitation o aprobación de planes. completions() obtiene sugerencias de entrada.
Accounts, autenticación y Providers
accounts() gestiona la enumeración de cuentas, proveedores y cuentas con sesión iniciada mediante enumerate(), get() y set(), y el inicio de sesión interactivo con begin(), advance() y cancel(). gitHubAuth() gestiona el estado de autenticación y las credenciales de la sesión, provider() y providers() los destinos de conexión de modelos y los adaptadores de proveedores, y connectors() las conexiones de conectores de la sesión.
Historial, cola, logs y uso
history() ofrece compactar (incluida la configuración de compactación), interrumpir, generar resúmenes de traspaso y truncar la conversación, y queue() insertar, mover, editar, eliminar y enviar de inmediato elementos pendientes. log(), eventLog(), usage(), quota() y limitPrediction() gestionan logs, eventos, uso e información de límites. schedule() permite consultar y detener prompts programados.
Ciclo de vida, remoto e integración con el host
sendMessages() ejecuta varios mensajes en un solo turno, y suspend() y shutdown() detienen la sesión. interruptMainTurn() controla el turno principal y cancelAllBackgroundAgents() los agentes en segundo plano, por separado. remote() y visibility() gestionan la publicación remota y el estado de compartición, sandbox() el sandbox de la sesión, managedSettings() la configuración gestionada con ámbito de sesión, contentExclusion() la evaluación de rutas, metadata() los metadatos propiedad del cliente y canvas() la integración con Canvas.
debug (experimental)
Condebug()->collectLogs() puedes recopilar el log de eventos, el log de procesos y el log de shell de la sesión en un archivo .tgz o en un directorio. Por defecto, la información sensible de los logs se redacta. Con additionalEntries puedes añadir ficheros o directorios, y en redaction puedes indicar plain-text, events-jsonl o none. Con none no se redacta nada, así que ten cuidado con el contenido que añades.
DebugCollectLogsDestination::directory('/tmp/copilot-debug'), la salida se escribe en un directorio de staging. Con include puedes indicar individualmente los logs y las rutas de referencia que se recopilan, y comprobar lo recopilado en entries y skippedEntries del resultado. Las rutas del destino y de las entradas adicionales son rutas del lado del servidor CLI. En la configuración estándar, que arranca la CLI por stdio, es el mismo host que la aplicación, pero si te conectas por TCP a un servidor CLI en otro host, indica rutas del servidor y no de la máquina que hace la llamada.
contentExclusion (experimental)
Puedes comprobar si una ruta absoluta local dentro del directorio de trabajo de la sesión está sujeta a la política de exclusión de contenido. Llámalo antes de leer o adjuntar el contenido de un fichero.checkPaths() solo acepta rutas absolutas, y las rutas deben estar dentro del directorio de trabajo de la sesión. checks se devuelve en el mismo orden que la entrada y conserva tal cual las rutas duplicadas. Si la ruta, el sistema de ficheros o la evaluación de políticas no están soportados o disponibles, se devuelve available: false con checks vacío. En ese caso, isExcluded() siempre devuelve true, así que trata todas las rutas como excluidas. Incluso con available: true, las rutas que no aparecen en el resultado se consideran excluidas por precaución.
MCP Apps (experimental)
Desde$session->rpc()->mcp()->apps() puedes llamar a las RPC para MCP Apps. En listTools() y callTool() es obligatorio el nombre del servidor MCP de origen, originServerName. El resultado de callTool() se devuelve como un resultado MCP de formato libre.
readResource() devuelve datos de recursos como HTML. El SDK no renderiza en el navegador ni manipula iframes, por lo que renderizar el contenido obtenido es responsabilidad de la aplicación que hace la llamada.
Ejemplos de uso por funcionalidad
A continuación se recogen llamadas representativas de las funcionalidades anteriores.remote (experimental: soporte de sesiones remotas)
sandbox (experimental: control del sandbox)
requestId de la solicitud pendiente cuando exista $request['sandboxPathGrant']. Como esta RPC responde por sí misma a la solicitud de permiso, si tiene éxito devuelve PermissionDecision::noResult() para no enviar la respuesta normal.
metadata (experimental: información de la sesión)
Gestión de sesiones locales (experimental)
Usa$session->rpc()->management() para configurar, listar, crear, enviar mensajes y cerrar sesiones locales que aceptaron la gestión en el mismo directorio de configuración. Registra un callback del host con setSessionCreationHandler() para recibir la RPC inversa de create(). El callback debe crear la sesión hija con newSessionId, mantener sus restricciones de permisos y modelo, y devolver un SessionManagementCreateResult.
En el siguiente ejemplo, $sessionCreationHandler es un closure que recibe un SessionManagementCreateHostRequest, crea la sesión hija en el host y devuelve un SessionManagementCreateResult.
accepted de message() indica que el mensaje se aceptó para su entrega, no que el destino haya respondido o terminado su tarea. Después de confirmar por separado que una sesión hija terminó su trabajo, usa close() para cerrar solo las sesiones hijas que creaste. El historial guardado no se elimina.
Session canvas
Las RPC de Canvas se llaman desde$session->rpc()->canvas(). list() devuelve
la lista en canvases de CanvasList, y listOpen() en openCanvases de
CanvasListOpenResult. open() devuelve OpenCanvasInstance, y las
llamadas a action devuelven CanvasActionInvokeResult. close() no tiene
valor de retorno.
canvas.open / canvas.close /
canvas.action.invoke) se gestiona con el canvasHandler de
SessionConfig / ResumeSessionConfig. Renderizar el Canvas es responsabilidad de la UI del host.
workflow
Las API RPC experimentales de workflows, conectores, diagnósticos, etc., añadidas en la serie Copilot CLI 1.0.89, también están disponibles desdeSessionRpc. Estos payloads de protocolo variables se pasan como arrays compatibles con JSON y las respuestas también se devuelven como arrays. A cada llamada se le añade automáticamente el sessionId actual.
workflow() llama a las RPC de bajo nivel que proporciona la CLI. En esta sincronización no se ha añadido una API de alto nivel para registrar y ejecutar closures de PHP como workflows, como en el SDK de Node.js. Estos nuevos grupos de RPC dependen de la versión de la CLI y son experimentales, así que úsalos solo con una CLI compatible.
Tipos de callback de SessionFS
Están definidos tipos de callback (Request/Result) para las operaciones de sistema de ficheros con ámbito de sesión. Son los tipos de petición/respuesta que usa Copilot CLI al hacer callback al cliente.SessionFsStatResult / SessionFsReaddirResult / SessionFsReaddirWithTypesResult tienen un error opcional (SessionFsError) que se usa en caso de fallo.
Handlers de SessionFs
El Client reparte al proveedor de laSession las solicitudes sessionFs.readFile / readFileBytes / writeFile / writeFileBytes, además de appendFile, exists, stat, mkdir, readdir, readdirWithTypes, rm, rename, sqliteQuery, sqliteTransaction y sqliteExists. Los fallos de las operaciones de ficheros se devuelven como error ENOENT (ENOENT o errno 2) / UNKNOWN. exists devuelve false ante una excepción, y stat devuelve valores cero + error si falla. Las operaciones que el proveedor no soporta producen un error UNKNOWN (en las de SQLite, un error JSON-RPC). Las excepciones de sqliteQuery/sqliteExists se devuelven como error JSON-RPC, y los fallos de sqliteTransaction como error del resultado (con errorClass).
Las interfaces del lado del proveedor (SessionFsFilesystemProvider, SessionFsSqliteCapableProvider, SessionFsSqliteProvider, SessionFsSqliteTransactionProvider) se han añadido como interfaces independientes para no romper el SessionFsProvider existente (2 métodos).
Tipos de callback de SQLite
Para activar el soporte de SQLite, pasa
SessionFsSetProviderCapabilities(sqlite: true) en capabilities de SessionFsSetProviderRequest.
sessionFs (o session_fs en config/copilot.php), Client::start() envía sessionFs.setProvider una sola vez. La sesión necesita createSessionFsProvider (consulta SessionConfig).
El enum SessionFsSqliteQueryType (src/Enums/) representa el tipo de consulta:
Exec: DDL/varias sentencias (sin resultado)Query: SELECT (devuelve filas)Run: INSERT/UPDATE/DELETE (devuelve rowsAffected)
src/Types/Rpc/.
Paso de argumentos como array
Aunque los argumentos y los valores de retorno usan clases específicas, también puedes pasar los argumentos como array.Tests
El mock conCopilot::fake() no funciona, por lo que debes mockear con Copilot::expects('client') o Copilot::expects('start').
Consulta la información más reciente en el repositorio de GitHub.