Vai al contenuto principale

Strumenti

Gli strumenti integrati di Copilot CLI sono abilitati di default. Qui puoi specificare gli strumenti personalizzati.

Uso di base

Specifica la definizione degli strumenti in tools di SessionConfig. Tool::define() è un helper analogo a defineTool delle altre versioni di linguaggio. In parameters puoi usare il JsonSchema che Laravel stesso adotta in Laravel MCP. È possibile anche specificare direttamente un array senza JsonSchema.
use Illuminate\Support\Facades\Artisan;
use Illuminate\JsonSchema\JsonSchema;
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\SessionConfig;
use Revolution\Copilot\Types\Tool;
use Revolution\Copilot\Types\ToolResultObject;

use function Laravel\Prompts\{info, note, spin, warning};

Artisan::command('copilot:tools', function () {
    $facts = [
        'PHP' => 'A popular general-purpose scripting language that is especially suited to web development.',
        'Laravel' => 'A web application framework with expressive, elegant syntax.',
    ];

    $parameters = JsonSchema::object(
        properties: [
            'topic' => JsonSchema::string()
                ->description('Topic to look up (e.g., "PHP", "Laravel")')
                ->required(),
        ],
    )->toArray();

    $config = new SessionConfig(
        tools: [
            Tool::define(
                name: 'lookup_fact',
                description: 'Returns a fun fact about a given topic.',
                parameters: $parameters,
                handler: function (array $params, array $invocation) use ($facts): array {
                    $topic = $params['topic'] ?? '';

                    $fact = $facts[$topic] ?? null;

                    if (! $fact) {
                        return new ToolResultObject(
                            textResultForLlm: "No fact stored for {$topic}.",
                            resultType: 'failure',
                            sessionLog: "lookup_fact: missing topic {$topic}",
                            toolTelemetry: [],
                        );
                    }

                    return new ToolResultObject(
                        textResultForLlm: $fact,
                        resultType: 'success',
                        sessionLog: "lookup_fact: served {$topic}",
                        toolTelemetry: [],
                    );
                },
                overridesBuiltInTool: false,
                skipPermission: false, // se true, esegue senza prompt di permesso
                defer: 'auto', // controlla se lo strumento debba essere caricato in modo lazy (via tool search) anziché sempre precaricato. Con `"auto"` è caricato in modo lazy e mostrato dalla ricerca strumenti. Con `"never"` è sempre precaricato. Opzionale. Default `"auto"`.
            ),
        ],
    );

    Copilot::start(function (CopilotSession $session) {
        info('Starting Copilot with tools: '.$session->id());

        $prompt = 'You can call the lookup_fact tool. Use lookup_fact to tell me something about Laravel.';

        warning($prompt);

        $response = spin(
            callback: fn () => $session->sendAndWait($prompt),
            message: 'Copilot thinking...',
        );

        note($response->content());
    }, config: $config);
});

skipPermission

Specificando skipPermission: true, lo strumento può essere eseguito senza prompt di permesso.
Tool::define(
    name: 'read_only_lookup',
    description: 'Read-only data lookup.',
    parameters: $parameters,
    handler: fn ($params) => ['result' => 'data'],
    skipPermission: true,
),

$invocation

Al secondo argomento $invocation dell’handler dello strumento vengono passati i seguenti campi.
[
    'sessionId'  => '...',
    'toolCallId' => '...',
    'toolName'   => 'lookup_fact',
    'arguments'  => [...], // Argomenti dello strumento (stesso contenuto di $params)
    // Inclusi solo se OpenTelemetry è abilitato
    'traceparent' => '...', // W3C Trace Context traceparent
    'tracestate'  => '...', // W3C Trace Context tracestate
]

Dettagli di protocollo

Nel Protocol v3 (default attuale) le chiamate a strumenti vengono trasmesse come eventi di sessione (external_tool.requested) anziché come richieste JSON-RPC. L’SDK elabora questo evento internamente e risponde con l’RPC session.tools.handlePendingToolCall. L’utilizzo di SessionConfig non cambia. Basta passare la definizione in tools: le differenze di protocollo sono assorbite dall’SDK.

Conversione di MCP CallToolResult

Per convertire il risultato di uno strumento MCP (CallToolResult) in ToolResultObject di Copilot SDK, usa McpCallToolResult::convert(). I risultati degli strumenti MCP sono un array di blocchi content (text, image, resource, ecc.), ma Copilot SDK si aspetta il formato ToolResultObject, quindi serve la conversione.
use Revolution\Copilot\Support\McpCallToolResult;

// Formato MCP CallToolResult
$mcpResult = [
    'content' => [
        ['type' => 'text', 'text' => 'File contents here'],
        ['type' => 'image', 'data' => 'base64...', 'mimeType' => 'image/png'],
    ],
    'isError' => false,
];

// Converti in ToolResultObject di Copilot SDK
$toolResult = McpCallToolResult::convert($mcpResult);
// $toolResult->textResultForLlm => 'File contents here'
// $toolResult->resultType => 'success'
// $toolResult->binaryResultsForLlm => [['data' => 'base64...', 'mimeType' => 'image/png', 'type' => 'image']]
Per le informazioni più recenti fai riferimento al repository GitHub.
Ultima modifica il 13 luglio 2026