Documentation Index
Fetch the complete documentation index at: https://kawax.biz/llms.txt
Use this file to discover all available pages before exploring further.
Build your first Copilot-powered Laravel app
In this guide, you build a command-line assistant with the Laravel Copilot SDK.
You start with a single prompt, then move to sessions, events, and tools.
Prerequisites
Before you begin, make sure you have:
- GitHub Copilot CLI installed and authenticated
- PHP
8.4+
- Laravel
13.x
Verify the CLI is available:
Install the SDK
Install the package with Composer:
composer require revolution/laravel-copilot-sdk
Optional configuration:
php artisan vendor:publish --tag=copilot-config
If needed, set the CLI path in your .env:
Send your first message
Create a command and call 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());
}
}
Run the command:
Keep context with sessions
Use Copilot::start() when you need multiple prompts in one conversation:
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());
});
Handle session events
Register an event handler with on() to inspect assistant messages and failures:
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');
});
Define a tool with a JSON schema and a 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);
Build an interactive assistant
Combine sessions, events, and tools into an interactive Artisan command:
<?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);
}
}
Run the command:
php artisan copilot:assistant
When you define a tool, you provide:
- What the tool does.
- Which parameters it accepts.
- Which handler code should run.
Copilot decides when to call the tool based on user input. The SDK executes your handler and returns the result back to Copilot.
Explore more features
Connect to MCP servers
use Revolution\Copilot\Types\SessionConfig;
$config = new SessionConfig(
mcpServers: [
'github' => [
'type' => 'http',
'url' => 'https://api.githubcopilot.com/mcp/',
],
],
);
Create custom agents
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.',
],
],
);
Customize the system message
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.',
),
);
Connect to an external CLI server
Run the Copilot CLI in server mode:
copilot --headless --port 4321
Then set the URL in .env:
COPILOT_URL=tcp://127.0.0.1:4321
When COPILOT_URL is set, the SDK connects to that server instead of starting a new CLI process.
Telemetry and observability
Configure telemetry in config/copilot.php:
'telemetry' => [
'otlpEndpoint' => 'http://localhost:4318',
],
Or configure it directly:
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\TelemetryConfig;
Copilot::useStdio([
'telemetry' => new TelemetryConfig(
otlpEndpoint: 'http://localhost:4318',
),
]);
Learn more
Next steps
Authentication
Choose the right auth method for local and CI environments.
Tools
Let Copilot call your application code.
Session config
Configure models, hooks, MCP servers, and runtime behavior.
MCP
Connect pre-built tools from MCP servers.
Custom providers
Integrate additional provider and model strategies.
Telemetry
Export traces for debugging and observability.
You now covered the core Laravel Copilot SDK flow from single prompts to tool-enabled sessions.