Passer au contenu principal

RPC (Remote Procedure Call)

Dans le SDK officiel, les nouveautés récentes s’appuient sur une génération de code automatique à partir de api.schema.json. La version Laravel s’inspire des versions générées dans d’autres langages pour proposer une implémentation similaire.

ServerRpc

Classe RPC associée au Client.
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\Rpc\ModelList;

// Récupérer la liste des modèles
// Le retour est ModelList
$result = Copilot::client()->rpc()->models()->list();
// models est un tableau de ModelInfo
$models = $result->models;

// Presque identique à listModels() d'origine
// Le retour est un tableau de ModelInfo
Copilot::client()->listModels();
Les fonctionnalités déjà présentes à l’origine sont également disponibles via la génération automatique.

Liste des méthodes

Copilot::client()->rpc()->ping();

// models
Copilot::client()->rpc()->models()->list();
// Récupération avec un token GitHub par session
Copilot::client()->rpc()->models()->list(new ModelsListRequest(gitHubToken: $token));

// tools
Copilot::client()->rpc()->tools()->list();

// account
Copilot::client()->rpc()->account()->getQuota();
// Récupération avec un token GitHub par session
Copilot::client()->rpc()->account()->getQuota(new AccountGetQuotaRequest(gitHubToken: $token));

// mcp config (gestion de la configuration des serveurs MCP)
Copilot::client()->rpc()->mcp()->list();
Copilot::client()->rpc()->mcp()->add(new McpConfigAddRequest(
    name: 'my-server',
    config: new McpServerValue(type: 'local', command: 'php', args: ['artisan', 'mcp']),
));
Copilot::client()->rpc()->mcp()->update(new McpConfigUpdateRequest(
    name: 'my-server',
    config: new McpServerValue(type: 'http', url: 'https://mcp.example.com'),
));
Copilot::client()->rpc()->mcp()->remove(new McpConfigRemoveRequest(name: 'my-server'));
// Activer/désactiver un serveur MCP (configuration globale)
Copilot::client()->rpc()->mcp()->enable(new McpConfigEnableRequest(names: ['my-server']));
Copilot::client()->rpc()->mcp()->disable(new McpConfigDisableRequest(names: ['my-server']));

// mcp discover (auto-détection des serveurs MCP)
Copilot::client()->rpc()->mcp()->discover(new McpDiscoverRequest(
    workingDirectory: '/path/to/project',
));
// Exécutable sans argument
$result = Copilot::client()->rpc()->mcp()->discover();
// $result->servers is an array of DiscoveredMcpServer

// sessionFs (enregistrement d'un provider de système de fichiers de session)
Copilot::client()->rpc()->sessionFs()->setProvider(new SessionFsSetProviderRequest(
    initialCwd: '/path/to/project',
    sessionStatePath: '.copilot/sessions',
    conventions: 'posix',
));

// sessions (experimental : fork de session)
Copilot::client()->rpc()->sessions()->fork(new SessionsForkRequest(
    sessionId: 'source-session-id',
    toEventId: 'evt-boundary', // Optionnel : n'inclut que les événements antérieurs à cet ID
));

// skills (gestion des skills au niveau serveur)
// Découverte des skills
$result = Copilot::client()->rpc()->skills()->discover();
// $result->skills est un tableau de ServerSkill
// Optionnellement, spécifiez des chemins de projet
$result = Copilot::client()->rpc()->skills()->discover(new SkillsDiscoverRequest(
    projectPaths: ['/path/to/project'],
    skillDirectories: ['/custom/skills'],
));

// Configuration des skills à désactiver
Copilot::client()->rpc()->skills()->config()->setDisabledSkills(
    new SkillsConfigSetDisabledSkillsRequest(disabledSkills: ['skill-name'])
);

SessionRpc

Classe RPC associée à une Session. Elle permet notamment d’utiliser le Plan Mode, absent de l’ancien SDK.
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\Rpc\ModeSetRequest;
use Revolution\Copilot\Types\Rpc\PlanReadResult;

Copilot::start(function (CopilotSession $session) {
    $session->rpc()->mode()->set(new ModeSetRequest(mode: 'plan'));

    $response = $session->sendAndWait(prompt: '〇〇のプランを作成');

    $result = $session->rpc()->plan()->read();
    dump($result->content);

    $session->rpc()->mode()->set(new ModeSetRequest(mode: 'autopilot'));

    $response = $session->sendAndWait(prompt: 'プランに従って実装');
    dump($response->content());
});

Liste des méthodes

// model
$session->rpc()->model()->getCurrent();
$session->rpc()->model()->switchTo(new ModelSwitchToRequest(modelId: 'gpt-4'));
// Avec reasoningEffort (modèles compatibles uniquement)
$session->rpc()->model()->switchTo(new ModelSwitchToRequest(modelId: 'claude-opus-4.7', reasoningEffort: ReasoningEffort::HIGH));
// Avec surcharge de modelCapabilities
$session->rpc()->model()->switchTo(new ModelSwitchToRequest(
    modelId: 'gpt-4',
    modelCapabilities: new ModelCapabilitiesOverride(
        supports: new ModelCapabilitiesOverrideSupports(vision: true),
    ),
));

// Le helper setModel() accepte aussi reasoningEffort et modelCapabilities
$session->setModel('claude-opus-4.7', ReasoningEffort::HIGH);
$session->setModel('claude-opus-4.7', 'high'); // String is also supported
$session->setModel('gpt-4', modelCapabilities: ['supports' => ['vision' => true]]); // Tableau accepté

// mode
$session->rpc()->mode()->get();
$session->rpc()->mode()->set(new ModeSetRequest(mode: 'plan'));

// name
$session->rpc()->name()->get();
$session->rpc()->name()->set(new NameSetRequest(name: 'My Session'));

// plan
$session->rpc()->plan()->read();
$session->rpc()->plan()->update(new PlanUpdateRequest(content: '...'));
$session->rpc()->plan()->delete();

// workspaces
$session->rpc()->workspaces()->getWorkspace();
$session->rpc()->workspaces()->listFiles();
$session->rpc()->workspaces()->readFile(new WorkspacesReadFileRequest(path: 'file.txt'));
$session->rpc()->workspaces()->createFile(new WorkspacesCreateFileRequest(path: 'file.txt', content: '...'));

// instructions (récupérer les sources d'instructions de la session)
$result = $session->rpc()->instructions()->getSources();
// $result->sources - tableau de InstructionsSources

// fleet
$session->rpc()->fleet()->start(new FleetStartRequest(prompt: '...'));
// Voir Fleet Mode pour les détails

// agent
$session->rpc()->agent()->list();
$session->rpc()->agent()->getCurrent();
$session->rpc()->agent()->select(new AgentSelectRequest(agentId: '...'));
$session->rpc()->agent()->deselect();
$session->rpc()->agent()->reload();

// skills (experimental : gestion des skills)
$session->rpc()->skills()->list();
$session->rpc()->skills()->enable(new SkillsEnableRequest(name: 'skill-name'));
$session->rpc()->skills()->disable(new SkillsDisableRequest(name: 'skill-name'));
$session->rpc()->skills()->reload();

// mcp (experimental : gestion des serveurs MCP)
$session->rpc()->mcp()->list();
$session->rpc()->mcp()->enable(new McpEnableRequest(serverName: 'server-name'));
$session->rpc()->mcp()->disable(new McpDisableRequest(serverName: 'server-name'));
$session->rpc()->mcp()->reload();
// Connexion OAuth MCP (pour les serveurs MCP nécessitant une authentification)
$result = $session->rpc()->mcp()->login(new McpOauthLoginRequest(serverName: 'my-server'));
// $result->authorizationUrl - URL du flux OAuth (si authentification requise)

// plugins (experimental : liste des plugins)
$session->rpc()->plugins()->list();

// extensions (experimental : gestion des extensions)
$session->rpc()->extensions()->list();
$session->rpc()->extensions()->enable(new ExtensionsEnableRequest(id: 'project:my-ext'));
$session->rpc()->extensions()->disable(new ExtensionsDisableRequest(id: 'project:my-ext'));
$session->rpc()->extensions()->reload();

// compaction → renommé en history
$session->rpc()->history()->compact();
// Tronquer l'historique à partir d'un événement donné
$session->rpc()->history()->truncate(new HistoryTruncateRequest(
    eventId: 'evt-123', // Cet événement et tous ceux qui suivent sont supprimés
));

// tools (protocole v3+ : réponse aux événements external_tool.requested)
$session->rpc()->tools()->handlePendingToolCall(new ToolsHandlePendingToolCallRequest(
    requestId: '...',
    result: 'Résultat de l\'exécution de l\'outil',
));

// permissions (protocole v3+ : réponse aux événements permission.requested)
$session->rpc()->permissions()->handlePendingPermissionRequest(new PermissionDecisionRequest(
    requestId: '...',
    result: PermissionRequestResultKind::approveOnce(),
));
// Approuver automatiquement toutes les demandes de permission de la session
$session->rpc()->permissions()->setApproveAll(new PermissionsSetApproveAllRequest(enabled: true));
// Réinitialiser les approbations de permissions à portée de session
$session->rpc()->permissions()->resetSessionApprovals();

// commands : réponse aux événements d'appel de commande
$session->rpc()->commands()->handlePendingCommand(new CommandsHandlePendingCommandRequest(
    requestId: '...',
));

// ui : réponse aux requêtes d'elicitation UI
$session->rpc()->ui()->elicitation(new UIElicitationRequest(
    message: 'Question adressée à l\'utilisateur',
    requestedSchema: ['type' => 'object', 'properties' => [...]],
));

// ui : réponse aux requêtes d'elicitation en attente (via l'événement elicitation.requested)
$session->rpc()->ui()->handlePendingElicitation(new UIHandlePendingElicitationRequest(
    requestId: '...',
    result: ['action' => 'accept', 'content' => ['name' => 'John']],
));

// log : enregistrer un message sur la timeline de la session
$session->rpc()->log()->log(new LogRequest(message: 'Traitement démarré'));
$session->rpc()->log()->log(new LogRequest(message: 'Utilisation disque élevée', level: LogLevel::WARNING));
$session->rpc()->log()->log(new LogRequest(message: 'Une erreur est survenue', level: LogLevel::ERROR));
$session->rpc()->log()->log(new LogRequest(message: 'Info de debug', ephemeral: true));

// shell : exécuter une commande shell dans la session
$result = $session->rpc()->shell()->exec(new ShellExecRequest(command: 'ls -la'));
// Utilisez $result->processId pour tuer le processus ou suivre sa sortie

$session->rpc()->shell()->exec(new ShellExecRequest(
    command: 'npm test',
    cwd: '/path/to/project',
    timeout: 60000, // millisecondes
));

// Arrêter un processus shell en cours
$session->rpc()->shell()->kill(new ShellKillRequest(
    processId: $result->processId,
    signal: 'SIGTERM', // SIGTERM (défaut), SIGKILL, SIGINT
));

// usage (experimental : métriques d'utilisation de la session)
$metrics = $session->rpc()->usage()->getMetrics();
// $metrics->totalPremiumRequestCost - coût total des requêtes premium
// $metrics->totalUserRequests - nombre total de requêtes utilisateur
// $metrics->codeChanges - métriques de changements de code (lignes ajoutées, supprimées, nombre de fichiers)
// $metrics->modelMetrics - usage tokens et requêtes par modèle
// $metrics->currentModel - identifiant du modèle courant

// auth : obtenir l'état d'authentification de la session
$status = $session->rpc()->auth()->getStatus();
// $status->isAuthenticated - authentifié ou non
// $status->authType - type d'authentification (enum AuthInfoType : gh-cli, token, env, etc.)
// $status->login - nom de connexion GitHub
// $status->host - hôte GitHub
// $status->copilotPlan - plan Copilot (individual, business, etc.)
// $status->statusMessage - message d'état d'authentification

Types de callbacks SessionFS

Pour les opérations de système de fichiers à la portée d’une session, des types de callback (Request/Result) sont définis. Ce sont les types de requête/réponse utilisés lorsque le Copilot CLI rappelle le client.
Classe de typeUsage
SessionFsReadFileRequest / SessionFsReadFileResultLecture de fichier
SessionFsWriteFileRequestÉcriture de fichier
SessionFsAppendFileRequestAjout à un fichier
SessionFsExistsRequest / SessionFsExistsResultVérification d’existence
SessionFsStatRequest / SessionFsStatResultMétadonnées d’un fichier
SessionFsMkdirRequestCréation de répertoire
SessionFsReaddirRequest / SessionFsReaddirResultListing de répertoire
SessionFsReaddirWithTypesRequest / SessionFsReaddirWithTypesResultListing typé de répertoire
SessionFsRmRequestSuppression fichier/répertoire
SessionFsRenameRequestRenommage fichier/répertoire
Ces classes se trouvent dans src/Types/Rpc/.

Passer les arguments sous forme de tableau

Les arguments et les valeurs de retour utilisent des classes dédiées, mais les arguments peuvent aussi être fournis sous forme de tableau.
$session->rpc()->mode()->set(['mode' => 'plan']);

Tests

Le mock via Copilot::fake() n’est pas utilisable ici ; utilisez Copilot::expects('client') ou Copilot::expects('start') pour créer les mocks.
Pour les dernières informations, consultez le dépôt GitHub.
Dernière modification le 13 juillet 2026