RPC (Remote Procedure Call)
Im offiziellen SDK werden neuere Features über automatische Codegenerierung auf Basis vonapi.schema.json abgebildet. In der Laravel-Version orientiert sich die Umsetzung an den entsprechend generierten Versionen anderer Sprachen.
ServerRpc
Eine an den Client gebundene RPC-Klasse.use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\Rpc\ModelList;
// Modell-Liste abrufen
// Rückgabetyp: ModelList
$result = Copilot::client()->rpc()->models()->list();
// models ist ein Array aus ModelInfo
$models = $result->models;
// Fast identisch mit dem ursprünglichen listModels()
// Rückgabetyp: Array aus ModelInfo
Copilot::client()->listModels();
Methodenübersicht
Copilot::client()->rpc()->ping();
// models
Copilot::client()->rpc()->models()->list();
// Mit sessionspezifischem GitHub-Token abrufen
Copilot::client()->rpc()->models()->list(new ModelsListRequest(gitHubToken: $token));
// tools
Copilot::client()->rpc()->tools()->list();
// account
Copilot::client()->rpc()->account()->getQuota();
// Mit sessionspezifischem GitHub-Token abrufen
Copilot::client()->rpc()->account()->getQuota(new AccountGetQuotaRequest(gitHubToken: $token));
// mcp config (Verwaltung der MCP-Server-Konfiguration)
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'));
// MCP-Server aktivieren/deaktivieren (globale Einstellung)
Copilot::client()->rpc()->mcp()->enable(new McpConfigEnableRequest(names: ['my-server']));
Copilot::client()->rpc()->mcp()->disable(new McpConfigDisableRequest(names: ['my-server']));
// mcp discover (Automatische Erkennung von MCP-Servern)
Copilot::client()->rpc()->mcp()->discover(new McpDiscoverRequest(
workingDirectory: '/path/to/project',
));
// Aufruf ohne Argumente möglich
$result = Copilot::client()->rpc()->mcp()->discover();
// $result->servers ist ein Array aus DiscoveredMcpServer
// sessionFs (Registrierung eines Session-Dateisystemproviders)
Copilot::client()->rpc()->sessionFs()->setProvider(new SessionFsSetProviderRequest(
initialCwd: '/path/to/project',
sessionStatePath: '.copilot/sessions',
conventions: 'posix',
));
// sessions (experimental: Fork einer Session)
Copilot::client()->rpc()->sessions()->fork(new SessionsForkRequest(
sessionId: 'source-session-id',
toEventId: 'evt-boundary', // Optional: nur Events vor dieser ID einbeziehen
));
// skills (Skill-Verwaltung auf Serverebene)
// Skills entdecken
$result = Copilot::client()->rpc()->skills()->discover();
// $result->skills ist ein Array aus ServerSkill
// Optional Projektpfad angeben
$result = Copilot::client()->rpc()->skills()->discover(new SkillsDiscoverRequest(
projectPaths: ['/path/to/project'],
skillDirectories: ['/custom/skills'],
));
// Zu deaktivierende Skills konfigurieren
Copilot::client()->rpc()->skills()->config()->setDisabledSkills(
new SkillsConfigSetDisabledSkillsRequest(disabledSkills: ['skill-name'])
);
SessionRpc
Eine an eine Session gebundene RPC-Klasse. Auch Funktionen wie der zuvor im SDK nicht mögliche Plan-Modus lassen sich nun nutzen.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());
});
Methodenübersicht
// model
$session->rpc()->model()->getCurrent();
$session->rpc()->model()->switchTo(new ModelSwitchToRequest(modelId: 'gpt-4'));
// Bei reasoningEffort (nur unterstützte Modelle)
$session->rpc()->model()->switchTo(new ModelSwitchToRequest(modelId: 'claude-opus-4.7', reasoningEffort: ReasoningEffort::HIGH));
// Bei Override der modelCapabilities
$session->rpc()->model()->switchTo(new ModelSwitchToRequest(
modelId: 'gpt-4',
modelCapabilities: new ModelCapabilitiesOverride(
supports: new ModelCapabilitiesOverrideSupports(vision: true),
),
));
// Der Helper setModel() akzeptiert ebenfalls reasoningEffort und 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]]); // Auch als Array möglich
// 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 (Instruktionsquellen der Session abrufen)
$result = $session->rpc()->instructions()->getSources();
// $result->sources - Array aus InstructionsSources
// fleet
$session->rpc()->fleet()->start(new FleetStartRequest(prompt: '...'));
// Details siehe Fleet Mode
// 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: Skill-Verwaltung)
$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: MCP-Server-Verwaltung)
$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();
// MCP OAuth-Login (für MCP-Server mit erforderlicher Authentifizierung)
$result = $session->rpc()->mcp()->login(new McpOauthLoginRequest(serverName: 'my-server'));
// $result->authorizationUrl - URL des OAuth-Flows (falls Authentifizierung erforderlich)
// plugins (experimental: Plugin-Liste)
$session->rpc()->plugins()->list();
// extensions (experimental: Verwaltung von 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 → umbenannt in history
$session->rpc()->history()->compact();
// Verlauf ab einem bestimmten Event kürzen
$session->rpc()->history()->truncate(new HistoryTruncateRequest(
eventId: 'evt-123', // Dieses Event und alle nachfolgenden werden gelöscht
));
// tools (Protocol v3+: Antwort auf external_tool.requested-Event)
$session->rpc()->tools()->handlePendingToolCall(new ToolsHandlePendingToolCallRequest(
requestId: '...',
result: 'ツールの実行結果',
));
// permissions (Protocol v3+: Antwort auf permission.requested-Event)
$session->rpc()->permissions()->handlePendingPermissionRequest(new PermissionDecisionRequest(
requestId: '...',
result: PermissionRequestResultKind::approveOnce(),
));
// Alle Berechtigungsanfragen in der Session automatisch genehmigen
$session->rpc()->permissions()->setApproveAll(new PermissionsSetApproveAllRequest(enabled: true));
// Sessionbezogene Berechtigungsgenehmigungen zurücksetzen
$session->rpc()->permissions()->resetSessionApprovals();
// commands: Antwort auf Command-Aufruf-Events
$session->rpc()->commands()->handlePendingCommand(new CommandsHandlePendingCommandRequest(
requestId: '...',
));
// ui: Antwort auf UI-Elicitation-Requests
$session->rpc()->ui()->elicitation(new UIElicitationRequest(
message: 'ユーザーへの質問',
requestedSchema: ['type' => 'object', 'properties' => [...]],
));
// ui: Antwort auf ausstehende Elicitation-Requests (via elicitation.requested-Event)
$session->rpc()->ui()->handlePendingElicitation(new UIHandlePendingElicitationRequest(
requestId: '...',
result: ['action' => 'accept', 'content' => ['name' => 'John']],
));
// log: Nachrichten in die Session-Timeline schreiben
$session->rpc()->log()->log(new LogRequest(message: '処理を開始しました'));
$session->rpc()->log()->log(new LogRequest(message: 'ディスク使用量が多い', level: LogLevel::WARNING));
$session->rpc()->log()->log(new LogRequest(message: 'エラーが発生しました', level: LogLevel::ERROR));
$session->rpc()->log()->log(new LogRequest(message: 'デバッグ情報', ephemeral: true));
// shell: Shell-Kommandos innerhalb der Session ausführen
$result = $session->rpc()->shell()->exec(new ShellExecRequest(command: 'ls -la'));
// Über $result->processId erhalten Sie die Prozess-ID für Kill oder Output-Tracking
$session->rpc()->shell()->exec(new ShellExecRequest(
command: 'npm test',
cwd: '/path/to/project',
timeout: 60000, // Millisekunden
));
// Laufenden Shell-Prozess stoppen
$session->rpc()->shell()->kill(new ShellKillRequest(
processId: $result->processId,
signal: 'SIGTERM', // SIGTERM (Standard), SIGKILL, SIGINT
));
// usage (experimental: Session-Nutzungsmetriken)
$metrics = $session->rpc()->usage()->getMetrics();
// $metrics->totalPremiumRequestCost - Gesamtkosten für Premium-Requests
// $metrics->totalUserRequests - Gesamtzahl der Nutzeranfragen
// $metrics->codeChanges - Code-Änderungsmetriken (hinzugefügte Zeilen, gelöschte Zeilen, geänderte Dateien)
// $metrics->modelMetrics - Token-Nutzung und Request-Anzahl pro Modell
// $metrics->currentModel - Bezeichner des aktuellen Modells
// auth: Authentifizierungsstatus der Session abrufen
$status = $session->rpc()->auth()->getStatus();
// $status->isAuthenticated - Ob authentifiziert
// $status->authType - Authentifizierungstyp (AuthInfoType enum: gh-cli, token, env u. a.)
// $status->login - GitHub-Login-Name
// $status->host - GitHub-Host
// $status->copilotPlan - Copilot-Plan (individual, business u. a.)
// $status->statusMessage - Nachricht zum Authentifizierungsstatus
SessionFS-Callback-Typen
Für sessionbezogene Dateisystemoperationen sind Callback-Typen (Request/Result) definiert. Es sind die Request-/Response-Typen, die die Copilot CLI bei Callbacks an den Client verwendet.| Typ-Klasse | Zweck |
|---|---|
SessionFsReadFileRequest / SessionFsReadFileResult | Datei lesen |
SessionFsWriteFileRequest | Datei schreiben |
SessionFsAppendFileRequest | Datei ergänzen |
SessionFsExistsRequest / SessionFsExistsResult | Existenzprüfung |
SessionFsStatRequest / SessionFsStatResult | Datei-Metadaten abrufen |
SessionFsMkdirRequest | Verzeichnis erstellen |
SessionFsReaddirRequest / SessionFsReaddirResult | Verzeichnisliste |
SessionFsReaddirWithTypesRequest / SessionFsReaddirWithTypesResult | Typisierte Verzeichnisliste |
SessionFsRmRequest | Datei/Verzeichnis löschen |
SessionFsRenameRequest | Datei/Verzeichnis umbenennen |
src/Types/Rpc/.
Argumente als Array angeben
Sowohl Argumente als auch Rückgabewerte nutzen dedizierte Klassen; die Argumente lassen sich jedoch auch als Array übergeben.$session->rpc()->mode()->set(['mode' => 'plan']);
Testing
DaCopilot::fake() hier nicht als Mock funktioniert, verwenden Sie stattdessen Copilot::expects('client') oder Copilot::expects('start').
Aktuelle Informationen finden Sie im GitHub-Repository.