AI-модели в PHP через AI Gateway — SDK openai-php/client
AI Gateway совместим с популярным SDK openai-php/client: весь код — как в его документации, задаются только базовый URI и ключ. Один клиент даёт доступ ко всем моделям каталога — Claude, GPT, Gemini, DeepSeek — сменой параметра model.
Установка
composer require openai-php/clientПервый запрос
<?php
require 'vendor/autoload.php';
$client = OpenAI::factory()
->withBaseUri('ai-gatewey.ru/v1')
->withApiKey('sk-aigate-ваш_ключ')
->make();
$response = $client->chat()->create([
'model' => 'deepseek/deepseek-chat',
'messages' => [
['role' => 'user', 'content' => 'Привет!'],
],
]);
echo $response->choices[0]->message->content;getenv('AIGATE_API_KEY')) или в .env, а не в коде. В withBaseUri указывается хост с путём без схемы — ai-gatewey.ru/v1.Стриминг
Ответ частями через Server-Sent Events — метод createStreamed возвращает итератор, который перебирают циклом foreach:
$stream = $client->chat()->createStreamed([
'model' => 'deepseek/deepseek-chat',
'messages' => [
['role' => 'user', 'content' => 'Расскажи о токенах'],
],
]);
foreach ($stream as $response) {
echo $response->choices[0]->delta->content ?? '';
}Function calling
Вызов инструментов работает прозрачно — выбирайте модель с поддержкой function calling (бейдж «инструменты» в каталоге). Инструменты передаются в поле tools, а модель возвращает toolCalls:
$response = $client->chat()->create([
'model' => 'anthropic/claude-sonnet-5',
'messages' => [
['role' => 'user', 'content' => 'Какая погода в Москве?'],
],
'tools' => [[
'type' => 'function',
'function' => [
'name' => 'get_weather',
'description' => 'Погода в городе',
'parameters' => [
'type' => 'object',
'properties' => ['city' => ['type' => 'string']],
'required' => ['city'],
],
],
]],
]);
var_dump($response->choices[0]->message->toolCalls);Обработка ошибок
401— неверный или отозванный ключ: проверьте значение и что ключ активен в кабинете.403— модель сверх тарифа при пустом балансе: пополните баланс или выберите модель тарифа.429— исчерпана квота или RPM-лимит ключа: дождитесь окна, поднимите лимит или тариф.5xx— сбой апстрима: шлюз сам ретраит и переключает провайдера, но свой retry с экспоненциальной паузой в проде не помешает.
use OpenAI\Exceptions\ErrorException;
try {
$response = $client->chat()->create([
'model' => 'deepseek/deepseek-chat',
'messages' => [
['role' => 'user', 'content' => 'Привет!'],
],
]);
} catch (ErrorException $e) {
// 429 → квота/RPM: подождать и повторить
echo $e->getErrorType() . ': ' . $e->getMessage();
}Какую модель выбрать
| Модель | Ввод, ₽/1М | Вывод, ₽/1М | Контекст |
|---|---|---|---|
| DeepSeek: DeepSeek V3 | 31 | 125 | 128K |
| Anthropic: Claude Sonnet 5 | 314 | 1 568 | 1M |
| OpenAI: GPT-5.4 Mini | 118 | 705 | 400K |
Частые вопросы
Есть ли пакет для Laravel?
Да — openai-php/laravel оборачивает тот же клиент фасадом OpenAI и конфигом. Базовый URI и ключ задаются в config/openai.php (base_uri и api_key), после чего фасад ходит в AI Gateway.
Какой HTTP-клиент нужен?
Пакет использует PSR-18: подойдёт Guzzle или любой совместимый клиент. Обычно достаточно composer require guzzlehttp/guzzle, если он ещё не установлен.
Можно ли переключать модели без нового клиента?
Да — клиент создаётся один раз, а модель задаётся в каждом запросе ключом model, поэтому один клиент работает со всеми моделями каталога.
PHP-приложение с AI — за пять минут
Получить ключ