SessionConfig
La classeSessionConfig permet un large éventail de réglages.
Elle s’utilise ainsi : Copilot::run(prompt: '...', config: $config) ou Copilot::start(function (CopilotSession $session) { ... }, config: $config).
Lorsque vous voulez juste indiquer un modèle sans passer par la classe SessionConfig, un tableau suffit : Copilot::run(prompt: '...', config: ['model' => 'auto']).
Racines de découverte
skillDirectories, agentDirectories, hookDirectories et instructionDirectories sont des racines de découverte uniquement, destinées aux skills, agents personnalisés, hooks de fichiers et instructions personnalisées.
Elles n’accordent pas à l’agent un accès général aux fichiers.
Pour ajouter des emplacements d’accès aux fichiers classiques, utilisez additionalDirectories.
Vous pouvez définir des racines de découverte que enableConfigDiscovery soit activé ou non.
Le SDK résout les chemins relatifs une seule fois, par rapport au workingDirectory effectif au moment où vous les définissez.
Les racines ne bougent pas si le répertoire de travail change par la suite.
Omettre une clé ou passer null laisse les sources de découverte par défaut inchangées.
Passer [] efface uniquement les racines définies explicitement par le SDK.
Les réglages de désactivation par source et les Managed Settings pour les skills, agents, hooks et instructions continuent de s’appliquer.
Pour reprendre une session, utilisez la classe ResumeSessionConfig. Elle ressemble beaucoup à SessionConfig avec quelques différences. ResumeSessionConfig ne spécifie que les champs à changer ; les autres sont hérités de la configuration initiale.
Le SDK envoie les mêmes options de session dans les payloads RPC de création et de reprise.
Cela inclut les fournisseurs et modèles BYOK, la mémoire, enableMcpApps, interactiveUser, enableGitHubCacheStore, les racines de découverte et les gestionnaires tels que onMcpAuthRequest, onExitPlanModeRequest et onAutoModeSwitchRequest.
Lors d’une reprise, passez-les dans ResumeSessionConfig ou dans un tableau avec les mêmes clés.
Les closures et objets fournisseurs ne sont pas persistés : fournissez-les à nouveau à chaque reprise.
Fournisseurs de canvas
Déclarez les canvas aveccanvases et traitez les requêtes d’ouverture et d’action avec un canvasHandler.
Le runtime appelle votre gestionnaire via RPC inverse lorsque l’agent ouvre un canvas ou invoque l’une de ses actions.
Définissez requestCanvasRenderer: true pour vous déclarer comme renderer : le runtime expose alors au modèle les outils d’agent liés aux canvas pour cette connexion.
Cette option est désactivée par défaut afin que les appelants du SDK incapables d’afficher des canvas ne soient pas affectés.
requestExtensions: trueactive la surface d’extensions. Le runtime branche alors les outils de gestion des extensions dans les sessions de cette connexion. Désactivé par défaut.extensionInfo: new ExtensionInfo(source: 'github-app', name: 'my-extension')définit un ID d’extension stable pour les fournisseurs de canvas de cette connexion. Le runtime utilise${source}:${name}au lieu de l’ID propre à chaque connexion. Un tableau est également accepté.
canvases et canvasHandler.
Le canvasHandler s’exécute uniquement dans le processus PHP. Le SDK n’envoie que les métadonnées de déclaration dans le payload RPC.
ResumeSessionConfig accepte aussi openCanvases, un instantané des canvas ouverts au moment de l’arrêt de la session.
Le runtime s’en sert pour réhydrater l’état des canvas, sans que vous ayez à les rouvrir.
Récupérez les canvas actuellement ouverts avec $session->openCanvases(). Le SDK maintient cette liste synchronisée avec les événements session.canvas.opened et session.canvas.closed.
Fournisseurs de système de fichiers de session
Callbacks de skills et de système de fichiers
UtilisezskillProvider pour charger des skills depuis une source gérée par l’application.
Les callbacks appartiennent à cette session et ne sont pas sérialisés vers le runtime Copilot.
Les cloud sessions ne prennent pas en charge les fournisseurs de skills personnalisés.
SkillProviderCallOptions::$signal expose le jeton d’annulation du callback.
L’annulation est coopérative : vos callbacks doivent observer le signal et annuler eux-mêmes le travail en cours.
Au lieu du tableau de callbacks, vous pouvez implémenter Revolution\Copilot\Contracts\SkillProvider.
sessionFsProvider utilise la même configuration à portée de session.
Les callbacks texte sont readFile(path) et writeFile(path, content, mode).
Pour prendre en charge les fichiers binaires, fournissez à la fois readFileBytes(path) et writeFileBytes(path, bytes, mode), ou implémentez SessionFsBinaryProvider.
Ces callbacks reçoivent et renvoient les octets d’origine. Le SDK gère l’encodage base64 sur le fil JSON-RPC.
Limitez l’accès au système de fichiers aux chemins que votre application entend exposer.
Déléguer tout l’état de session avec sessionFs
Définissez l’option client sessionFs (alias session_fs) pour déplacer l’intégralité de l’état de session de Copilot CLI, y compris les fichiers d’état de session et la base SQLite propre à chaque session, vers votre propre stockage.
Lorsque vous la définissez, chaque configuration de session doit fournir une factory createSessionFsProvider.
Le SDK appelle la factory pour createSession() comme pour resumeSession(), une fois l’ID de session connu et avant l’envoi de la requête au runtime.
Copilot, définissez session_fs dans config/copilot.php.
initialCwd, sessionStatePath et conventions (posix ou windows) sont obligatoires.
Un champ manquant ou une valeur conventions invalide lève une InvalidArgumentException.
createSessionFsProvider est une Closure. Elle fonctionne aussi avec les tableaux, fromArray() et toArray() de SessionConfig et ResumeSessionConfig.
Le fournisseur renvoyé peut être un objet ou un tableau de callables. Chaque capacité optionnelle a sa propre interface :
Si le fournisseur ne satisfait pas les capacités déclarées, le SDK lève une
InvalidArgumentException.
Appeler une opération non prise en charge par le fournisseur renvoie une erreur UNKNOWN.
Les fournisseurs signalent les échecs en levant une exception. Une exception dont le code est ENOENT (ou errno 2) devient ENOENT ; toute autre devient UNKNOWN.
Levez SessionFsSqliteTransactionFailure depuis transaction() pour signaler un errorClass (busyOrLocked, fatal ou postCommitAmbiguous).
Sans l’option client sessionFs, le SDK n’appelle jamais createSessionFsProvider, et le sessionFsProvider existant (readFile et writeFile) continue de fonctionner.
Mode empty pour les applications multi-locataires
Définissez lemode du client sur empty pour désactiver par défaut les fonctionnalités qui dépendent de l’environnement hôte de Copilot CLI ou d’un état partagé entre sessions.
La valeur par défaut est copilot-cli, qui conserve le comportement existant.
En mode empty, vous devez définir une cible de persistance : base_directory, session_fs ou l’url d’un serveur externe.
availableTools.
Utilisez ToolSet pour construire des filtres d’outils qualifiés par source (builtin:, custom:, mcp:).
BuiltInTools::Isolated n’autorise que les outils intégrés confinés à une seule session, sans accès au système de fichiers de l’hôte, à l’environnement, au réseau ni aux autres sessions.
/^[a-zA-Z0-9_-]+$/ ou être le joker *. Sinon, ToolSet lève une InvalidArgumentException.
Le mode empty applique des valeurs par défaut sûres à la télémétrie de session, au stockage persistant des tokens OAuth MCP, à la récupération et au cache d’embeddings, à la découverte des instructions, aux hooks de fichiers, aux opérations git de l’hôte, au session store, au GitHub cache store, aux skills, à la mémoire et au mode expérimental.
Les options de session définies explicitement priment sur ces valeurs par défaut.
Un systemMessage en mode replace est utilisé tel quel ; les autres modes suppriment la section environment_context.
Le SDK définit également COPILOT_DISABLE_KEYTAR=1 pour le processus CLI.
GitHub cache store
DéfinissezenableGitHubCacheStore: true pour demander le GitHub cache store en lecture seule.
La CLI n’enregistre l’outil github_sql que si son feature flag GITHUB_CACHE_STORE est activé.
Pour les dernières informations, consultez le dépôt GitHub.