<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
mohamed-ashraf-elsaed / claude-agent-sdk-laravel example snippets
use ClaudeAgentSDK\Facades\ClaudeAgent;
$result = ClaudeAgent::query('What files are in this directory?');
echo $result->text(); // Final text result
echo $result->costUsd(); // Cost in USD
echo $result->sessionId; // Session ID for resuming
use ClaudeAgentSDK\Options\ClaudeAgentOptions;
$options = ClaudeAgentOptions::make()
->tools(['Read', 'Edit', 'Bash', 'Grep', 'Glob'])
->permission('acceptEdits')
->maxTurns(10)
->maxBudgetUsd(5.00)
->cwd('/path/to/project');
$result = ClaudeAgent::query('Find and fix the bug in auth.php', $options);
if ($result->isSuccess()) {
echo $result->text();
}
use ClaudeAgentSDK\Messages\AssistantMessage;
use ClaudeAgentSDK\Messages\ResultMessage;
foreach (ClaudeAgent::stream('Refactor the User model') as $message) {
if ($message instanceof AssistantMessage) {
echo $message->text();
}
if ($message instanceof ResultMessage) {
echo "\nDone! Cost: $" . $message->totalCostUsd;
}
}
$result = ClaudeAgent::streamCollect(
prompt: 'Create a REST API for products',
onMessage: function ($message) {
if ($message instanceof AssistantMessage) {
Log::info($message->text());
}
},
options: ClaudeAgentOptions::make()->tools(['Read', 'Write', 'Bash']),
);
echo $result->text();
// First query
$result = ClaudeAgent::query('Read the auth module');
$sessionId = $result->sessionId;
// Resume later with full context
$result2 = ClaudeAgent::query(
'Now find all places that call it',
ClaudeAgentOptions::make()->resume($sessionId),
);
// Fork a session to try different approaches
$result3 = ClaudeAgent::query(
'Try refactoring it with a different pattern',
ClaudeAgentOptions::make()->resume($sessionId, fork: true),
);
$result = ClaudeAgent::query('Analyze this codebase');
// Basic info
$result->text(); // Final text result
$result->isSuccess(); // bool — true if subtype is 'success'
$result->isError(); // bool — true if error or no result
$result->costUsd(); // float|null — total cost in USD
$result->turns(); // int — number of conversation turns
$result->durationMs(); // int — total duration in milliseconds
$result->sessionId; // string|null — for session resumption
// Error types
$result->subtype(); // 'success', 'error_max_turns', 'error_max_budget_usd', etc.
$result->isMaxTurnsError(); // true if stopped at turn limit
$result->isBudgetError(); // true if budget exceeded
$result->permissionDenials(); // array of denied tool uses
$result->errors(); // array of execution errors
// Session introspection
$result->model(); // Model used
$result->availableTools(); // Tools available
$result->mcpServerStatus(); // MCP server statuses
$result->supportedCommands(); // Available slash commands
// Messages
$result->messages; // All Message objects
$result->assistantMessages(); // AssistantMessage[] only
$result->fullText(); // Concatenated text from all assistant messages
$result->toolUses(); // All ToolUseBlock objects across messages
$result->structured(); // Structured output array (if outputFormat set)
// Per-model usage & cache metrics
$result->modelUsage(); // array<string, ModelUsage> — per-model breakdown
$result->cacheReadTokens(); // int — total cache-read tokens across all models
$result->cacheCreationTokens(); // int — total cache-creation tokens
foreach ($result->modelUsage() as $model => $usage) {
echo "{$model}: {$usage->inputTokens} in, {$usage->outputTokens} out\n";
echo " Cache hit rate: " . round($usage->cacheHitRate() * 100) . "%\n";
echo " Cost: \${$usage->costUsd}\n";
}
use ClaudeAgentSDK\Messages\AssistantMessage;
use ClaudeAgentSDK\Messages\SystemMessage;
use ClaudeAgentSDK\Messages\ResultMessage;
foreach (ClaudeAgent::stream('Do something') as $message) {
match (true) {
$message instanceof SystemMessage => handleSystem($message),
$message instanceof AssistantMessage => handleAssistant($message),
$message instanceof ResultMessage => handleResult($message),
default => null,
};
}
function handleAssistant(AssistantMessage $msg): void
{
// Text content
echo $msg->text();
// Tool calls made by Claude
foreach ($msg->toolUses() as $toolUse) {
echo "Tool: {$toolUse->name}, Input: " . json_encode($toolUse->input);
}
// Metadata
echo $msg->model; // Model used
echo $msg->id; // Message ID
echo $msg->parentToolUseId; // If this is a subagent response
}
// Run in a sandboxed environment with command isolation
$options = ClaudeAgentOptions::make()
->sandbox([
'enabled' => true,
'autoAllowBashIfSandboxed' => true,
'excludedCommands' => ['docker'],
'network' => [
'allowLocalBinding' => true,
'allowUnixSockets' => ['/var/run/docker.sock'],
],
]);
// Load a local plugin
$options = ClaudeAgentOptions::make()
->plugin('/path/to/my-plugin');
// Enable beta features
$options = ClaudeAgentOptions::make()
->betas(['context-1m-2025-08-07']);
// Set a fallback model
$options = ClaudeAgentOptions::make()
->model('claude-sonnet-4-5-20250929')
->fallbackModel('claude-haiku-4-5');
$manager = app('claude-agent');
$manager->interrupt(); // Graceful interrupt (sends SIGINT to the process)
$manager->isRunning(); // Check if a process is currently running
use ClaudeAgentSDK\Exceptions\CliNotFoundException;
use ClaudeAgentSDK\Exceptions\ProcessException;
use ClaudeAgentSDK\Exceptions\JsonParseException;
use ClaudeAgentSDK\Exceptions\ClaudeAgentException;
try {
$result = ClaudeAgent::query('Do something');
} catch (CliNotFoundException $e) {
// Claude Code CLI not installed
// $e->getMessage()