Installation
composer require google-gemini-php/laravel
php artisan vendor:publish --provider="GoogleGemini\Laravel\GeminiServiceProvider" --tag="config"
config/gemini.php.Configure API Key
Add your Google Gemini API key to .env:
GEMINI_API_KEY=your_api_key_here
config/gemini.php under api_key.First Use Case: Text Generation
use GoogleGemini\Laravel\Facades\Gemini;
$response = Gemini::chat()->text('What is Laravel?')->send();
dd($response->content);
config/gemini.php (API key, endpoint, and default settings).GoogleGemini\Laravel\Facades\Gemini (primary entry point).Basic Chat Requests
$response = Gemini::chat()
->model('gemini-1.5-pro') // Optional: Specify model
->temperature(0.7) // Optional: Adjust creativity
->send('Explain Laravel Eloquent ORM');
Multi-Turn Conversations
$chat = Gemini::chat()->start('Hello, I need help with Laravel.');
$response = $chat->send('How do I use relationships?');
$chat->addMessage($response); // Persist context
Image Generation
$response = Gemini::generate()
->prompt('A futuristic cityscape')
->size('1024x1024')
->send();
Streaming Responses
Gemini::chat()->stream('Explain Laravel queues')
->onResponse(function ($chunk) {
echo $chunk->text;
});
class GeminiService {
public function summarizeText(string $text): string {
return Gemini::chat()->send("Summarize this: $text")->content;
}
}
Gemini::generate()->prompt('Complex image')->dispatch();
$response = Cache::remember("gemini_faq_{$question}", now()->addHours(1), fn() =>
Gemini::chat()->send($question)->content
);
API Key Management
.env and validate the key exists in config/gemini.php:
if (empty(config('gemini.api_key'))) {
throw new \RuntimeException('Gemini API key not configured.');
}
.env.Rate Limits
429 Too Many Requests:
try {
$response = Gemini::chat()->send('...');
} catch (\GoogleGemini\Exceptions\RateLimitException $e) {
retry()->times(3)->later(5)->try(fn() => $response);
}
Model Availability
gemini-pro; explicitly set if needed:
Gemini::chat()->model('gemini-1.5-pro-latest');
Streaming Quirks
debug: true in config/gemini.php to log raw API responses:
'debug' => env('GEMINI_DEBUG', false),
$prompt = htmlspecialchars($userInput, ENT_QUOTES);
try {
$response = Gemini::chat()->send($prompt);
} catch (\GoogleGemini\Exceptions\InvalidRequestException $e) {
Log::error("Invalid prompt: {$e->getMessage()}");
}
Custom Responses
Extend the GeminiResponse class to add domain-specific methods:
class CustomGeminiResponse extends \GoogleGemini\Laravel\Responses\GeminiResponse {
public function extractEntities(): array {
// Custom logic to parse response for entities
}
}
Middleware Add middleware to modify requests/responses globally:
Gemini::extend(function ($gemini) {
$gemini->macro('logRequest', function ($prompt) {
Log::info("Gemini Prompt: {$prompt}");
return $this;
});
});
Gemini::chat()->logRequest($prompt)->send().Testing Mock Gemini responses in tests using Laravel’s HTTP testing:
$response = Gemini::fake()->chat()->thenReturn(
new \GoogleGemini\Laravel\Responses\GeminiResponse(['content' => 'Mocked response'])
);
google-gemini-php/laravel-testing for helpers.Webhooks
For async operations (e.g., image generation), use Laravel’s queue:work with webhook callbacks:
Gemini::generate()->prompt('...')->queue(function ($job, $response) {
event(new GeminiImageGenerated($response->url));
});
How can I help you explore Laravel packages today?