openai-php/client
Community-maintained PHP client for the OpenAI API. Send requests for models, responses and chat, conversations, containers and files, with streaming support and a clean, typed interface. Install via Composer and use in any PHP app (Laravel-friendly).
Installation:
composer require openai-php/client
Add to config/services.php (if not using Laravel's default OpenAI config):
'openai' => [
'api_key' => env('OPENAI_API_KEY'),
'base_uri' => env('OPENAI_BASE_URI', 'https://api.openai.com/v1'),
],
First Use Case: Generate a chat completion in a Laravel controller:
use OpenAI\Laravel\Facades\OpenAI;
public function askChatGPT(Request $request) {
$response = OpenAI::chat()->create([
'model' => 'gpt-4',
'messages' => [
['role' => 'user', 'content' => $request->input('prompt')],
],
]);
return response()->json($response->choices[0]->message->content);
}
Key Starting Points:
vendor/openai-php/client/docs/ (local API reference)php artisan vendor:publish --provider="OpenAI\Laravel\OpenAIServiceProvider" (publish config)Model Selection & Caching:
// Cache model responses (e.g., for rate-limiting)
$response = OpenAI::cache()->remember('gpt-4-prompt-123', now()->addHours(1), function () {
return OpenAI::chat()->create([...]);
});
Streaming Responses:
$response = OpenAI::chat()->create([
'model' => 'gpt-3.5-turbo',
'stream' => true,
'messages' => [...],
]);
foreach ($response->choices as $choice) {
echo $choice->delta->content;
}
Modular Services: Create a dedicated service class:
class AIAssistantService {
public function __construct(private OpenAIClient $client) {}
public function generateSummary(string $text): string {
$response = $this->client->chat()->create([
'model' => 'gpt-3.5-turbo',
'messages' => [
['role' => 'system', 'content' => 'Summarize the following text concisely.'],
['role' => 'user', 'content' => $text],
],
]);
return $response->choices[0]->message->content;
}
}
Laravel Events:
Trigger AI actions on model events (e.g., created:post):
Event::listen('created:post', function (Post $post) {
OpenAI::chat()->create([
'model' => 'gpt-3.5-turbo',
'messages' => [
['role' => 'user', 'content' => "Generate a SEO title for: {$post->title}"],
],
]);
});
Queue Jobs: Offload expensive calls to queues:
class GenerateAIResponseJob implements ShouldQueue {
public function handle() {
OpenAI::chat()->create([...]);
}
}
API Rate Limiting:
Use Laravel's throttle middleware for API key protection:
Route::middleware(['throttle:100,1'])->group(function () {
Route::post('/ai', [AIController::class, 'ask']);
});
API Key Exposure:
.env and env() helper.Rate Limits:
gpt-3.5-turbo, 1 request/second for gpt-4.try {
$response = OpenAI::chat()->create([...]);
} catch (RateLimitException $e) {
sleep($e->retryAfter);
retry();
}
Token Limits:
gpt-3.5-turbo: 4,096 tokens (input + output).gpt-4: 8,192 tokens.OpenAI::moderation()->create() to check content before sending.Streaming Quirks:
$buffer = '';
foreach ($response->choices as $choice) {
$buffer .= $choice->delta->content;
}
Enable Verbose Logging:
OpenAI::setApiKey('...', [
'verbose' => true,
'debug' => true,
]);
Check logs for raw API requests/responses.
Mocking for Tests:
Use Mockery or Venture to stub OpenAI calls:
$mock = Mockery::mock(OpenAIClient::class);
$mock->shouldReceive('chat->create')
->once()
->andReturn(new ChatCompletion('mocked response'));
$this->app->instance(OpenAIClient::class, $mock);
Custom Models: Extend the client for internal models:
class CustomOpenAIClient extends OpenAIClient {
public function customModel() {
return new CustomModel($this->getHttpClient());
}
}
Middleware: Add request/response middleware:
OpenAI::extend(function ($client) {
$client->getHttpClient()->getMiddleware()->push(
new AddHeadersMiddleware(['X-Custom-Header' => 'value'])
);
});
Response Transformers: Decorate responses for consistency:
OpenAI::extend(function ($client) {
$client->setResponseTransformer(function ($response) {
return json_decode($response->getBody(), true);
});
});
Laravel Service Provider: Bind custom configurations:
public function boot() {
OpenAI::setApiKey(config('services.openai.custom_key'));
OpenAI::setBaseUri(config('services.openai.custom_uri'));
}
Batch Processing:
Use files endpoint for bulk operations (e.g., fine-tuning):
$response = OpenAI::files()->create([
'purpose' => 'fine-tune',
'file' => fopen('data.jsonl', 'r'),
]);
Caching Strategies: Cache responses by:
Cache::remember("ai_{$userId}_{$promptHash}", now()->addMinutes(5), function () use ($prompt) {
return OpenAI::chat()->create([...]);
});
How can I help you explore Laravel packages today?