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Первый запрос
<?phprequire 'vendor/autoload.php';$client = OpenAI::factory()->withBaseUri('ai-gatewey.ru/v1')->withApiKey('sk-aigate-ваш_ключ')->make();$response = $client->chat()->create(['model' => 'deepseek/deepseek-v4-flash','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-v4-flash','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.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— неверный или отозванный ключ: проверьте значение и что ключ активен в кабинете.402— нужна оплата: пуст баланс, исчерпана месячная квота, модель не входит в тариф, либо сработал лимит самого ключа (список моделей, потолок расхода, срок действия). Пополните баланс, смените тариф либо проверьте настройки ключа.429— превышен лимит запросов в минуту: снизьте темп и повторите с экспоненциальной паузой.5xx— сбой апстрима: шлюз сам повторяет запрос, резервные провайдеры модели подставляет апстрим, но свой retry с экспоненциальной паузой в проде не помешает.
use OpenAI\Exceptions\ErrorException;try {$response = $client->chat()->create(['model' => 'deepseek/deepseek-v4-flash','messages' => [['role' => 'user', 'content' => 'Привет!'],],]);} catch (ErrorException $e) {// 429 → превышен RPM: подождать и повторитьecho $e->getErrorType() . ': ' . $e->getMessage();}Какую модель выбрать
Частые вопросы
Есть ли пакет для Laravel?
Да — openai-php/laravel оборачивает тот же клиент фасадом OpenAI и конфигом. Базовый URI и ключ задаются в config/openai.php (base_uri и api_key), после чего фасад ходит в AI Gateway.
Какой HTTP-клиент нужен?
Пакет использует PSR-18: подойдёт Guzzle или любой совместимый клиент. Обычно достаточно composer require guzzlehttp/guzzle, если он ещё не установлен.
Можно ли переключать модели без нового клиента?
Да — клиент создаётся один раз, а модель задаётся в каждом запросе ключом model, поэтому один клиент работает со всеми моделями каталога.