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 y conectores
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.
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 y 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, y lo destruye; runtime() gestiona el ciclo de vida del runtime.
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.
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.
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é.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.
Client::stop() llama a runtime.shutdown después de desconectar las sesiones y antes de cerrar la conexión JSON-RPC y el proceso. 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.
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.
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. 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, 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: metadatos propiedad del cliente)
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.