Saltar al contenido principal

Crear tu primera app Laravel compatible con Copilot

En esta guía crearás un asistente de línea de comandos con Laravel Copilot SDK. Empezarás enviando un único prompt y avanzarás hacia sesiones, eventos y herramientas.

Requisitos previos

Antes de empezar comprueba lo siguiente:
  • Tener instalado y autenticado GitHub Copilot CLI
  • PHP 8.4+
  • Laravel 13.x
Verifica que el CLI está disponible:
copilot --version

Instala el SDK

Instala el paquete con Composer.
composer require revolution/laravel-copilot-sdk
Publica la configuración si lo necesitas:
php artisan vendor:publish --tag=copilot-config
Si es necesario, configura la ruta del CLI en .env:
COPILOT_CLI_PATH=copilot

Envía tu primer mensaje

Crea un comando y llama a Copilot::run().
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Revolution\Copilot\Facades\Copilot;

class CopilotDemo extends Command
{
    protected $signature = 'copilot:demo';
    protected $description = 'Demo Copilot SDK';

    public function handle()
    {
        $response = Copilot::run(prompt: 'What is 2 + 2?');

        $this->info($response->content());
    }
}
Ejecuta el comando:
php artisan copilot:demo

Mantén el contexto con una sesión

Si vas a usar varios prompts en una misma conversación, utiliza Copilot::start().
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;

Copilot::start(function (CopilotSession $session) {
    $response = $session->sendAndWait(prompt: 'What is 2 + 2?');
    $this->info('Answer: '.$response->content());

    $response = $session->sendAndWait(prompt: 'Now multiply that by 3');
    $this->info('Answer: '.$response->content());
});

Procesa eventos de sesión

Registra un handler de eventos con on() para inspeccionar los mensajes del assistant y los fallos.
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\SessionEvent;

Copilot::start(function (CopilotSession $session) {
    $session->on(function (SessionEvent $event): void {
        if ($event->isAssistantMessage()) {
            $this->info($event->content());
        } elseif ($event->failed()) {
            $this->error($event->errorMessage() ?? 'Unknown error');
        }
    });

    $session->sendAndWait(prompt: 'Tell me a short Laravel joke');
});

Añade una herramienta personalizada

Define una herramienta con un JSON schema y un handler.
use Illuminate\JsonSchema\JsonSchema;
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\SessionConfig;
use Revolution\Copilot\Types\Tool;

$parameters = JsonSchema::object([
    'topic' => JsonSchema::string()
        ->description('Topic to look up')
        ->required(),
])->toArray();

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

                return [
                    'textResultForLlm' => "Fact for {$topic}",
                    'resultType' => 'success',
                    'sessionLog' => "lookup_fact: {$topic}",
                    'toolTelemetry' => [],
                ];
            },
        ),
    ],
);

Copilot::start(function (CopilotSession $session) {
    $response = $session->sendAndWait(
        prompt: 'Use lookup_fact to tell me something about Laravel.'
    );

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

Crea un asistente interactivo

Al combinar sesiones, eventos y herramientas puedes crear un comando Artisan interactivo.
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\JsonSchema\JsonSchema;
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\SessionConfig;
use Revolution\Copilot\Types\SessionEvent;
use Revolution\Copilot\Types\Tool;
use Revolution\Copilot\Types\ToolResultObject;

use function Laravel\Prompts\error;
use function Laravel\Prompts\info;
use function Laravel\Prompts\note;
use function Laravel\Prompts\spin;
use function Laravel\Prompts\text;

class CopilotAssistant extends Command
{
    protected $signature = 'copilot:assistant';
    protected $description = 'Interactive Copilot assistant';

    public function handle()
    {
        $facts = [
            'PHP' => 'A popular general-purpose scripting language for web development.',
            'Laravel' => 'A web application framework with expressive, elegant syntax.',
            'Composer' => 'Dependency manager for PHP.',
        ];

        $parameters = JsonSchema::object([
            'topic' => JsonSchema::string()
                ->description('Topic to look up')
                ->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) use ($facts) {
                        $topic = $params['topic'] ?? '';
                        $fact = $facts[$topic] ?? "No fact available for {$topic}.";

                        return new ToolResultObject(
                            textResultForLlm: $fact,
                            resultType: 'success',
                            sessionLog: "lookup_fact: {$topic}",
                            toolTelemetry: [],
                        );
                    },
                ),
            ],
        );

        Copilot::start(function (CopilotSession $session) {
            info('Copilot assistant');
            info("Session: {$session->id()}");
            info("Try: Use lookup_fact to tell me about Laravel");

            $session->on(function (SessionEvent $event): void {
                if ($event->isAssistantMessage()) {
                    note($event->content());
                } elseif ($event->failed()) {
                    error($event->errorMessage() ?? 'Unknown error');
                }
            });

            while (true) {
                $prompt = text(
                    label: 'You',
                    placeholder: 'Ask me anything...',
                    required: true,
                    hint: 'Ctrl+C to exit',
                );

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

                echo "\n";
            }
        }, config: $config);
    }
}
Ejecuta el comando:
php artisan copilot:assistant

Cómo funcionan las herramientas

Al definir una herramienta indicas estos tres puntos:
  1. Qué hace la herramienta.
  2. Qué parámetros recibe.
  3. Qué código del handler se ejecuta.
Copilot decide cuándo invocar la herramienta según el input del usuario, el SDK ejecuta el handler y devuelve el resultado.

Prueba estas funciones a continuación

Conecta un servidor MCP

use Revolution\Copilot\Types\SessionConfig;

$config = new SessionConfig(
    mcpServers: [
        'github' => [
            'type' => 'http',
            'url' => 'https://api.githubcopilot.com/mcp/',
        ],
    ],
);

Crea un agente personalizado

use Revolution\Copilot\Types\SessionConfig;

$config = new SessionConfig(
    customAgents: [
        [
            'name' => 'pr-reviewer',
            'displayName' => 'PR Reviewer',
            'description' => 'Reviews pull requests for best practices',
            'prompt' => 'You are an expert code reviewer. Focus on security, performance, and maintainability.',
        ],
    ],
);

Personaliza el mensaje de sistema

use Revolution\Copilot\Types\SessionConfig;
use Revolution\Copilot\Types\SystemMessageConfig;

$config = new SessionConfig(
    systemMessage: new SystemMessageConfig(
        content: 'You are a helpful assistant for our engineering team. Always be concise.',
    ),
);

Conecta con un servidor CLI externo

Levanta Copilot CLI en modo servidor:
copilot --headless --port 4321
Después configura la URL de conexión en .env:
COPILOT_URL=tcp://127.0.0.1:4321
Si defines COPILOT_URL, el SDK no lanza un proceso CLI nuevo y se conecta al servidor existente.

Telemetría y observabilidad

Configura la telemetría en config/copilot.php:
'telemetry' => [
    'otlpEndpoint' => 'http://localhost:4318',
],
O configúrala directamente:
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\TelemetryConfig;

Copilot::useStdio([
    'telemetry' => new TelemetryConfig(
        otlpEndpoint: 'http://localhost:4318',
    ),
]);

Más recursos

Siguientes pasos

Autenticación

Elige el método de autenticación más adecuado para tu entorno local y para CI.

SessionConfig

Configura modelo, hooks, servidores MCP y el comportamiento en tiempo de ejecución.

SessionEvent

Comprende los helpers de eventos específicos de Laravel y el manejo del ciclo de vida.

Solicitudes de permiso

Revisa el flujo de permisos para ejecutar herramientas con aprobación explícita.

Herramientas

Llama al código de tu aplicación desde Copilot.

MCP

Conecta herramientas listas para usar de servidores MCP.
Con esto has recorrido el flujo principal de Laravel Copilot SDK, desde un prompt aislado hasta una sesión con herramientas integradas.
Última modificación el 13 de julio de 2026