tigusigalpa/gigachat-php

πŸš€ GigaChat PHP SDK - ΠΏΠΎΠ»Π½ΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с Sber GigaChat API. ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ GigaChat ΠΊ PHP-прилоТСниям с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Laravel. ГСнСрация тСкста, Ρ‡Π°Ρ‚-Π±ΠΎΡ‚Ρ‹, AI-ассистСнты. Полная докумСнтация, ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π°, OAuth авторизация.

Maintainers

Package info

github.com/tigusigalpa/gigachat-php

Documentation

pkg:composer/tigusigalpa/gigachat-php

Statistics

Installs: 367

Dependents: 0

Suggesters: 0

Stars: 18

Open Issues: 0

v1.1.0 2025-10-11 09:32 UTC

This package is auto-updated.

Last update: 2026-03-21 03:41:22 UTC


README

GigaChat PHP SDK

PHP SDK для Sber GigaChat API с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Laravel. Streaming ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ запросы.

Latest Version PHP Version License

Π―Π·Ρ‹ΠΊ: Русский | English

Π”Ρ€ΡƒΠ³ΠΈΠ΅ вСрсии: Golang SDK

ВозмоТности

  • Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с GigaChat API
  • Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ OAuth-Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌΠΈ (Π°Π²Ρ‚ΠΎΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅)
  • ВсС ΠΌΠΎΠ΄Π΅Π»ΠΈ GigaChat (GigaChat, GigaChat-Pro, GigaChat-Max)
  • Laravel 8-12 (Service Provider, Facades)
  • Π”ΠΈΠ°Π»ΠΎΠ³ΠΈ ΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅ запросы
  • Streaming-ΠΎΡ‚Π²Π΅Ρ‚Ρ‹
  • ГСнСрация ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Ρ‡Π΅Ρ€Π΅Π· text2image
  • Π‘ΠΊΠ°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
  • Бтилизация Ρ‡Π΅Ρ€Π΅Π· систСмныС ΠΏΡ€ΠΎΠΌΠΏΡ‚Ρ‹
  • Helper-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹
  • Rate limiting middleware
  • Artisan-ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

Установка

Из Packagist

Π§Π΅Ρ€Π΅Π· Composer:

composer require tigusigalpa/gigachat-php

Laravel

ΠŸΠ°ΠΊΠ΅Ρ‚ рСгистрируСтся автоматичСски. ΠžΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³:

php artisan vendor:publish --tag=gigachat-config

Настройка

1. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ

  1. Π—Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ΡΡŒ Π² Sber AI
  2. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Client ID ΠΈ Client Secret
  3. Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ Authorization Key (Base64 ΠΎΡ‚ "Client ID:Client Secret")

Π‘ΠΌ.: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ

2. ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² .env:

# Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 1: Π“ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ Authorization Key
GIGACHAT_AUTH_KEY=your_base64_encoded_auth_key

# Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 2: Client ID + Secret (auth_key гСнСрируСтся автоматичСски)
GIGACHAT_CLIENT_ID=your_client_id
GIGACHAT_CLIENT_SECRET=your_client_secret

# Настройки
GIGACHAT_SCOPE=GIGACHAT_API_PERS
GIGACHAT_DEFAULT_MODEL=GigaChat
GIGACHAT_TEMPERATURE=0.7
GIGACHAT_MAX_TOKENS=1000

# ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ SSL (ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… с сСртификатами)
GIGACHAT_CERT_PATH=false

ИспользованиС

Π‘Π΅Π· Laravel

<?php

use Tigusigalpa\GigaChat\Auth\TokenManager;
use Tigusigalpa\GigaChat\GigaChatClient;

// Π’ΠΎΠΊΠ΅Π½-ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€
$authKey = base64_encode('your_client_id:your_client_secret');
$tokenManager = new TokenManager($authKey);

// ΠšΠ»ΠΈΠ΅Π½Ρ‚
$client = new GigaChatClient($tokenManager);

// ДоступныС ΠΌΠΎΠ΄Π΅Π»ΠΈ
$models = $client->models();
print_r($models);

// ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСния
$messages = [
    ['role' => 'user', 'content' => 'ΠŸΡ€ΠΈΠ²Π΅Ρ‚! Как Π΄Π΅Π»Π°?']
];

$response = $client->chat($messages);
echo $response['choices'][0]['message']['content'];

Π‘ Laravel

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Facade:

<?php

use Tigusigalpa\GigaChat\Laravel\GigaChat;
use Tigusigalpa\GigaChat\Models\GigaChatModels;

// Вопрос-ΠΎΡ‚Π²Π΅Ρ‚
$answer = GigaChat::ask('РасскаТи Π°Π½Π΅ΠΊΠ΄ΠΎΡ‚');
echo $answer;

// Бписок модСлСй
$models = GigaChat::models();

// Π‘ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ
$response = GigaChat::chat([
    ['role' => 'user', 'content' => 'Объясни ΠΊΠ²Π°Π½Ρ‚ΠΎΠ²ΡƒΡŽ Ρ„ΠΈΠ·ΠΈΠΊΡƒ']
], [
    'temperature' => 0.7,
    'max_tokens' => 1000,
    'model' => GigaChatModels::GIGACHAT_2_PRO
]);

echo $response['choices'][0]['message']['content'];

Π”ΠΈΠ°Π»ΠΎΠ³ΠΈ

<?php

use Tigusigalpa\GigaChat\Laravel\GigaChat;
use Tigusigalpa\GigaChat\Laravel\GigaChatHelper;

// Π‘ систСмным ΠΏΡ€ΠΎΠΌΠΏΡ‚ΠΎΠΌ
$conversation = GigaChatHelper::conversation(
    'Π’Ρ‹ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ программиста',
    'Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ REST API Π² Laravel?'
);

$response = GigaChat::chat($conversation);
echo GigaChatHelper::extractContent($response);

// ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΈΠ°Π»ΠΎΠ³Π°
$conversation = GigaChat::continueChat($conversation, 'А ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ?');

Streaming

<?php

use Tigusigalpa\GigaChat\Laravel\GigaChat;

$messages = [
    ['role' => 'user', 'content' => 'Напиши Π΄Π»ΠΈΠ½Π½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΎ космосС']
];

// Callback
GigaChat::chatStream($messages, [], function($event, $error) {
    if ($error) {
        echo "Ошибка: " . $error;
        return;
    }
    
    if ($event === '[DONE]') {
        echo "\nβœ… Π“ΠΎΡ‚ΠΎΠ²ΠΎ!";
        return;
    }
    
    if (isset($event['choices'][0]['delta']['content'])) {
        echo $event['choices'][0]['delta']['content'];
    }
});

// Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€
$stream = GigaChat::chatStream($messages);
foreach ($stream as $event) {
    if (isset($event['choices'][0]['delta']['content'])) {
        echo $event['choices'][0]['delta']['content'];
    }
}

Eloquent Trait

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Tigusigalpa\GigaChat\Laravel\Traits\HasGigaChat;

class Article extends Model
{
    use HasGigaChat;

    protected $fillable = ['title', 'content', 'category'];

    public function generateSummary(): string
    {
        return $this->summarize('content');
    }

    // ГСнСрация Ρ‚Π΅Π³ΠΎΠ²
    public function generateTags(): array
    {
        return $this->generateTags('content', 5);
    }

    // ΠŸΠ΅Ρ€ΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚
    public function generateRelatedContent(): string
    {
        return $this->generateContent(
            'Π‘ΠΎΠ·Π΄Π°ΠΉ ΠΏΠΎΡ…ΠΎΠΆΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ Π½Π° основС этой',
            ['title', 'category']
        );
    }
}

МодСли

ΠΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ список: ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ докумСнтация

ГСнСрация тСкста

МодСль ОписаниС ИспользованиС
GigaChat-2 Базовая модСль Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ поколСния ΠžΠ±Ρ‰ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ, Π΄ΠΈΠ°Π»ΠΎΠ³ΠΈ
GigaChat-2-Pro ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Π°Ρ модСль с ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½Ρ‹ΠΌΠΈ возмоТностями Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΡ€Π΅Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ письмо
GigaChat-2-Max Максимальная модСль для самых слоТных Π·Π°Π΄Π°Ρ‡ ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ, Π°Π½Π°Π»ΠΈΠ·

Π­ΠΌΠ±Π΅Π΄Π΄ΠΈΠ½Π³ΠΈ

МодСль ОписаниС ИспользованиС
Embeddings Базовая модСль для Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ прСдставлСния Поиск ΠΏΠΎ смыслу, кластСризация
EmbeddingsGigaR Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ модСль для создания эмбСддингов Π’ΠΎΡ‡Π½Ρ‹ΠΉ поиск, сСмантичСский Π°Π½Π°Π»ΠΈΠ·

ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ

use Tigusigalpa\GigaChat\Models\GigaChatModels;
use Tigusigalpa\GigaChat\Laravel\GigaChat;

$response = GigaChat::chat($messages, [
    'model' => GigaChatModels::GIGACHAT_2_PRO
]);

$generationModels = GigaChatModels::getGenerationModels();
$embeddingModels = GigaChatModels::getEmbeddingModels();

if (GigaChatModels::isValidGenerationModel('GigaChat-2')) {
    // Π²Π°Π»ΠΈΠ΄Π½Π°
}

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ

use Tigusigalpa\GigaChat\Models\GigaChatModels;

$options = [
    'model' => GigaChatModels::GIGACHAT_2_PRO, // МодСль для использования
    'temperature' => 0.7,                      // ΠšΡ€Π΅Π°Ρ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ (0.0 - 2.0)
    'top_p' => 0.9,                           // Nucleus sampling (0.0 - 1.0)
    'max_tokens' => 1000,                     // МаксимальноС количСство Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²
    'repetition_penalty' => 1.1,              // Π¨Ρ‚Ρ€Π°Ρ„ Π·Π° повторСния (0.0 - 2.0)
    'update_interval' => 0                    // Π˜Π½Ρ‚Π΅Ρ€Π²Π°Π» обновлСния для streaming
];

$response = GigaChat::chat($messages, $options);

## ГСнСрация ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

ВстроСнная функция text2image. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ "нарисуй" Π² ΠΏΡ€ΠΎΠΌΠΏΡ‚Π΅ с `function_call: auto`.

### Π‘Π°Π·ΠΎΠ²ΠΎΠ΅

```php
<?php

use Tigusigalpa\GigaChat\Auth\TokenManager;
use Tigusigalpa\GigaChat\GigaChatClient;

$tokenManager = new TokenManager($authKey);
$client = new GigaChatClient($tokenManager);

$response = $client->generateImage("Нарисуй красивый Π·Π°ΠΊΠ°Ρ‚ Π½Π°Π΄ ΠΌΠΎΡ€Π΅ΠΌ");

// Π˜Π·Π²Π»Π΅Ρ‡ΡŒ ID изобраТСния
$content = $response['choices'][0]['message']['content'];
if (preg_match('/<img[^>]+src=["']([^"']+)["'][^>]*>/i', $content, $matches)) {
    $fileId = $matches[1];
    $imageData = $client->downloadImage($fileId);
    file_put_contents('sunset.jpg', base64_decode($imageData));
}

### Бтилизация

```php
$response = $client->generateImage("Нарисуй Ρ€ΠΎΠ·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΡ‚Π°", [
    'system_message' => 'Π’Ρ‹ β€” Василий Кандинский'
]);

$response = $client->generateImage("Нарисуй космичСский ΠΊΠΎΡ€Π°Π±Π»ΡŒ", [
    'system_message' => 'Π’Ρ‹ β€” Ρ…ΡƒΠ΄ΠΎΠΆΠ½ΠΈΠΊ-концСптуалист Π½Π°ΡƒΡ‡Π½ΠΎΠΉ фантастики',
    'temperature' => 0.8
]);

### createImage

Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ скачиваСт Π² ΠΎΠ΄Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅:

```php
$result = $client->createImage("Нарисуй футуристичСский Π³ΠΎΡ€ΠΎΠ΄", [
    'system_message' => 'Π’Ρ‹ β€” Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΠΎΡ€ Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ'
]);

// $result: content (base64), file_id, response
file_put_contents('city.jpg', base64_decode($result['content']));

### Laravel

```php
use Tigusigalpa\GigaChat\Laravel\GigaChat;

// drawImage добавляСт "Нарисуй" автоматичСски
$result = GigaChat::drawImage("красивый ΠΏΠ΅ΠΉΠ·Π°ΠΆ");

// Π‘ΠΎ стилСм Ρ…ΡƒΠ΄ΠΎΠΆΠ½ΠΈΠΊΠ°
$result = GigaChat::drawImageInStyle("ΠΏΠΎΡ€Ρ‚Ρ€Π΅Ρ‚ ΠΊΠΎΡ‚Π°", "Π›Π΅ΠΎΠ½Π°Ρ€Π΄ΠΎ Π΄Π° Π’ΠΈΠ½Ρ‡ΠΈ");

// Π˜Π·Π²Π»Π΅Ρ‡ΡŒ ID изобраТСния
$response = GigaChat::generateImage("Нарисуй Π΄Ρ€Π°ΠΊΠΎΠ½Π°");
$imageId = GigaChat::extractImageId($response['choices'][0]['message']['content']);
if ($imageId) {
    $imageData = GigaChat::downloadImage($imageId);
    file_put_contents("dragon.jpg", base64_decode($imageData));
}

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

ΠœΠ΅Ρ‚ΠΎΠ΄ ОписаниС Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚
generateImage($prompt, $options) ГСнСрация, ΠΎΡ‚Π²Π΅Ρ‚ API array
downloadImage($fileId) Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΏΠΎ ID string (base64)
createImage($prompt, $options) ГСнСрация + скачиваниС array
drawImage($description, $options) Laravel: добавляСт "Нарисуй" array
drawImageInStyle($description, $style, $options) Laravel: со стилСм Ρ…ΡƒΠ΄ΠΎΠΆΠ½ΠΈΠΊΠ° array
extractImageId($content) Π˜Π·Π²Π»Π΅Ρ‡ΡŒ ID ΠΈΠ· HTML string|null

Ошибки ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

use Tigusigalpa\GigaChat\Exceptions\GigaChatException;
use Tigusigalpa\GigaChat\Exceptions\ValidationException;

try {
    $result = $client->createImage("Нарисуй Π΄Ρ€Π°ΠΊΠΎΠ½Π°");
} catch (ValidationException $e) {
    echo "Ошибка Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ: " . $e->getMessage();
} catch (GigaChatException $e) {
    echo "Ошибка Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ: " . $e->getMessage();
}

Π’Π°ΠΆΠ½ΠΎ: ΠŸΡ€ΠΎΠΌΠΏΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ "нарисуй". API Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ text2image ΠΏΡ€ΠΈ function_call: auto.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ:

<?php

use Tigusigalpa\GigaChat\Exceptions\GigaChatException;
use Tigusigalpa\GigaChat\Exceptions\AuthenticationException;
use Tigusigalpa\GigaChat\Exceptions\ValidationException;

try {
    $response = GigaChat::chat($messages);
} catch (AuthenticationException $e) {
    // Ошибки Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ (Π½Π΅Π²Π΅Ρ€Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ, ΠΈΡΡ‚Π΅ΠΊΡˆΠΈΠΉ Ρ‚ΠΎΠΊΠ΅Π½)
    echo "Ошибка Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ: " . $e->getMessage();
} catch (ValidationException $e) {
    // Ошибки Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ (Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ сообщСний)
    echo "Ошибка Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ: " . $e->getMessage();
} catch (GigaChatException $e) {
    // ΠžΠ±Ρ‰ΠΈΠ΅ ошибки GigaChat API
    echo "Ошибка GigaChat: " . $e->getMessage();
}

ΠšΠΎΠ΄Ρ‹ ошибок

Авторизация (400-401)

Код HTTP ОписаниС РСшСниС
1 400 scope data format invalid ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ поля scope
4 401 Can't decode 'Authorization' header ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π° Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ
5 400 scope is empty Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ scope: GIGACHAT_API_PERS, GIGACHAT_API_B2B ΠΈΠ»ΠΈ GIGACHAT_API_CORP
6 401 credentials doesn't match db data ΠŸΠ΅Ρ€Π΅Π²Ρ‹ΠΏΡƒΡΡ‚ΠΈΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Π»ΠΈΡ‡Π½ΠΎΠΌ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚Π΅
7 401 scope from db not fully includes consumed scope Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ API Π² scope
// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ
try {
    $client = new GigaChatClient($tokenManager);
    $response = $client->chat($messages);
} catch (AuthenticationException $e) {
    $message = $e->getMessage();
    
    if (str_contains($message, 'scope is empty')) {
        echo "НС ΡƒΠΊΠ°Π·Π°Π½ scope. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ GIGACHAT_API_PERS Π² настройки.";
    } elseif (str_contains($message, 'Authorization')) {
        echo "НСвСрный ΠΊΠ»ΡŽΡ‡ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ CLIENT_ID ΠΈ CLIENT_SECRET.";
    } elseif (str_contains($message, 'credentials doesn\'t match')) {
        echo "ΠšΠ»ΡŽΡ‡ Π½Π΅ соотвСтствуСт вСрсии API. ΠŸΠ΅Ρ€Π΅Π²Ρ‹ΠΏΡƒΡΡ‚ΠΈΡ‚Π΅ ΠΊΠ»ΡŽΡ‡.";
    }
}

Π›ΠΈΠΌΠΈΡ‚Ρ‹ (402-403)

HTTP ОписаниС ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° РСшСниС
402 Payment Required Π—Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈΡΡŒ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π»ΠΈΠΌΠΈΡ‚ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π² Π»ΠΈΡ‡Π½ΠΎΠΌ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚Π΅
403 Permission denied НСт доступа ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ‚Π°Ρ€ΠΈΡ„Π½Ρ‹ΠΉ ΠΏΠ»Π°Π½ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, GET /balance нСдоступСн для pay-as-you-go)
try {
    $response = $client->chat($messages);
} catch (GigaChatException $e) {
    $code = $e->getCode();
    
    switch ($code) {
        case 402:
            echo "Π—Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈΡΡŒ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹. ΠŸΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ баланс ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π»ΠΈΠΌΠΈΡ‚Ρ‹.";
            break;
        case 403:
            echo "НСт доступа ΠΊ этому ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ‚Π°Ρ€ΠΈΡ„Π½Ρ‹ΠΉ ΠΏΠ»Π°Π½.";
            break;
    }
}

Π Π°Π·ΠΌΠ΅Ρ€ Π΄Π°Π½Π½Ρ‹Ρ… (413)

HTTP ОписаниС ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° РСшСниС
413 Payload too large ΠŸΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠΌΠΏΡ‚Π° ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²
try {
    $response = $client->generateImage($longPrompt);
} catch (GigaChatException $e) {
    if ($e->getCode() === 413) {
        echo "ΠŸΡ€ΠΎΠΌΠΏΡ‚ слишком Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ. Π‘ΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚Π΅ тСкст.";
        // МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ POST /tokens/count для подсчСта Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²
    }
}

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ (422)

HTTP ОписаниС ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° РСшСниС
422 Requested model does not support functions МодСль Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΄Ρ€ΡƒΠ³ΡƒΡŽ модСль ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
422 system message must be the first message НСвСрный порядок сообщСний БистСмноС сообщСниС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ
422 Unprocessable Entity Π€Π°ΠΉΠ» ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ контСкста Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΈΠ»ΠΈ сократитС Ρ„Π°ΠΉΠ»
try {
    $messages = [
        ['role' => 'user', 'content' => 'ΠŸΡ€ΠΈΠ²Π΅Ρ‚'],
        ['role' => 'system', 'content' => 'Π’Ρ‹ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ'], // НСвСрно!
    ];
    $response = $client->chat($messages);
} catch (GigaChatException $e) {
    if (str_contains($e->getMessage(), 'system message must be the first')) {
        echo "БистСмноС сообщСниС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π² спискС.";
        
        // Π˜ΡΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ порядок
        $fixedMessages = [
            ['role' => 'system', 'content' => 'Π’Ρ‹ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ'],
            ['role' => 'user', 'content' => 'ΠŸΡ€ΠΈΠ²Π΅Ρ‚'],
        ];
    }
}

Rate Limit (429)

HTTP ОписаниС ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° РСшСниС
429 Too Many Requests ΠŸΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ Π»ΠΈΠΌΠΈΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… запросов Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚Π΅ частоту запросов, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ
try {
    $response = $client->chat($messages);
} catch (GigaChatException $e) {
    if ($e->getCode() === 429) {
        echo "Блишком ΠΌΠ½ΠΎΠ³ΠΎ запросов. ΠŸΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅ ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅.";
        
        // ДобавляСм Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΈ повторяСм
        sleep(2);
        $response = $client->chat($messages);
    }
}

Π‘Π΅Ρ€Π²Π΅Ρ€ (500)

HTTP ОписаниС ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° РСшСниС
500 Internal Server Error Ошибка сСрвиса GigaChat ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ Π² слуТбу ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ
try {
    $response = $client->chat($messages);
} catch (GigaChatException $e) {
    if ($e->getCode() === 500) {
        echo "Ошибка сСрвСра GigaChat. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΏΠΎΠ·ΠΆΠ΅ ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ Π² ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ.";
        
        // Π›ΠΎΠ³ΠΈΡ€ΡƒΠ΅ΠΌ для Π°Π½Π°Π»ΠΈΠ·Π°
        error_log("GigaChat 500 error: " . $e->getMessage());
    }
}

Retry-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ

<?php

use Tigusigalpa\GigaChat\Laravel\GigaChat;
use Tigusigalpa\GigaChat\Exceptions\GigaChatException;
use Tigusigalpa\GigaChat\Exceptions\AuthenticationException;
use Tigusigalpa\GigaChat\Exceptions\ValidationException;

function handleGigaChatRequest(callable $request): array
{
    $maxRetries = 3;
    $retryDelay = 1; // сСкунды
    
    for ($attempt = 1; $attempt <= $maxRetries; $attempt++) {
        try {
            return $request();
            
        } catch (ValidationException $e) {
            // Ошибки Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Π½Π΅ повторяСм
            throw $e;
            
        } catch (AuthenticationException $e) {
            if ($attempt === $maxRetries) {
                throw $e;
            }
            
            // ΠŸΡ‹Ρ‚Π°Π΅ΠΌΡΡ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½
            sleep($retryDelay);
            
        } catch (GigaChatException $e) {
            $code = $e->getCode();
            
            // ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ошибок
            if (in_array($code, [429, 500]) && $attempt < $maxRetries) {
                sleep($retryDelay * $attempt); // Π­ΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°
                continue;
            }
            
            throw $e;
        }
    }
}

// ИспользованиС
try {
    $result = handleGigaChatRequest(function() {
        return GigaChat::createImage("Нарисуй ΠΊΠΎΡ‚Π°");
    });
    
    echo "Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ создано: " . $result['file_id'];
    
} catch (Exception $e) {
    echo "НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅: " . $e->getMessage();
}

ΠžΡ‚Π»Π°Π΄ΠΊΠ°

try {
    $response = $client->chat($messages);
} catch (GigaChatException $e) {
    error_log('GigaChat Error: ' . json_encode([
        'message' => $e->getMessage(),
        'code' => $e->getCode(),
    ], JSON_UNESCAPED_UNICODE));
}

Бм.: Ошибки GigaChat API

Artisan-ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

# ВСстированиС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ API
php artisan gigachat:test

# ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСния
php artisan gigachat:chat "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΊΠ°ΠΊ Π΄Π΅Π»Π°?"

# ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ
php artisan gigachat:chat "РасскаТи ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ" --model=GigaChat-Pro --temperature=0.8 --max-tokens=500

# Streaming Ρ€Π΅ΠΆΠΈΠΌ
php artisan gigachat:chat "Напиши Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ рассказ" --stream

Rate Limiting

// Π’ routes/api.php
Route::middleware(['gigachat.rate_limit:30,1'])->group(function () {
    Route::post('/chat', [ChatController::class, 'chat']);
});

// Настройка Π² config/gigachat.php
'rate_limit' => [
    'enabled' => true,
    'max_attempts' => 60,        // ΠœΠ°ΠΊΡΠΈΠΌΡƒΠΌ запросов
    'decay_minutes' => 1,        // Π—Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π² ΠΌΠΈΠ½ΡƒΡ‚Π°Ρ…
],

ВСстированиС

Запуск

# Установка зависимостСй для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ
composer install --dev

# Запуск всСх тСстов
composer test
# ΠΈΠ»ΠΈ
php run-tests.php

# Запуск Ρ‚ΠΎΠ»ΡŒΠΊΠΎ unit тСстов
php run-tests.php --unit

# Запуск с ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ ΠΊΠΎΠ΄Π°
composer test-coverage
# ΠΈΠ»ΠΈ
php run-tests.php --coverage

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ тСсты

Для запуска ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… тСстов с Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ API:

# УстановитС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния
export GIGACHAT_CLIENT_ID=your_client_id
export GIGACHAT_CLIENT_SECRET=your_client_secret
export GIGACHAT_INTEGRATION_TEST=true

# ЗапуститС ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ тСсты
php run-tests.php --integration

ΠŸΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅

  • ГСнСрация тСкста (chat, streaming)
  • ГСнСрация ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
  • АутСнтификация (Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, кСш)
  • Laravel (фасады, helpers, service provider)
  • Валидация
  • Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ тСсты

Π‘ΠΌ. tests/README.md

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π§Π°Ρ‚-Π±ΠΎΡ‚

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Tigusigalpa\GigaChat\Laravel\GigaChat;

class ChatController extends Controller
{
    public function chat(Request $request)
    {
        $request->validate([
            'message' => 'required|string|max:2000'
        ]);

        try {
            $response = GigaChat::askWithContext(
                'Π’Ρ‹ Π΄Ρ€ΡƒΠΆΠ΅Π»ΡŽΠ±Π½Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ',
                $request->input('message'),
                ['temperature' => 0.7]
            );

            return response()->json([
                'success' => true,
                'reply' => $response
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'error' => $e->getMessage()
            ], 500);
        }
    }
}

ГСнСрация ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°

<?php

use Tigusigalpa\GigaChat\Laravel\GigaChat;

class ContentGenerator
{
    public function generateArticle(string $topic, string $style = 'ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ'): string
    {
        return GigaChat::askWithContext(
            "Π’Ρ‹ ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΏΠΈΡ€Π°ΠΉΡ‚Π΅Ρ€. Пиши Π² {$style} стилС.",
            "Напиши ΡΡ‚Π°Ρ‚ΡŒΡŽ Π½Π° Ρ‚Π΅ΠΌΡƒ: {$topic}",
            ['temperature' => 0.8, 'max_tokens' => 1500]
        );
    }

    public function translateText(string $text, string $targetLang = 'английский'): string
    {
        return GigaChat::ask(
            "ΠŸΠ΅Ρ€Π΅Π²Π΅Π΄ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ тСкст Π½Π° {$targetLang} язык:\n\n{$text}",
            ['temperature' => 0.2]
        );
    }

    public function summarizeText(string $text, int $maxWords = 100): string
    {
        return GigaChat::ask(
            "Π‘ΠΎΠ·Π΄Π°ΠΉ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (Π½Π΅ Π±ΠΎΠ»Π΅Π΅ {$maxWords} слов):\n\n{$text}",
            ['temperature' => 0.3, 'max_tokens' => $maxWords * 2]
        );
    }
}

Streaming

<?php

// Π’ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅
public function streamChat(Request $request)
{
    $messages = [['role' => 'user', 'content' => $request->input('message')]];

    return response()->stream(function () use ($messages) {
        echo "data: " . json_encode(['type' => 'start']) . "\n\n";
        
        GigaChat::chatStream($messages, [], function($event, $error) {
            if ($error) {
                echo "data: " . json_encode(['type' => 'error', 'error' => $error]) . "\n\n";
                return;
            }
            
            if ($event === '[DONE]') {
                echo "data: " . json_encode(['type' => 'done']) . "\n\n";
                return;
            }
            
            if (isset($event['choices'][0]['delta']['content'])) {
                echo "data: " . json_encode([
                    'type' => 'content',
                    'content' => $event['choices'][0]['delta']['content']
                ]) . "\n\n";
            }
            
            flush();
        });
    }, 200, [
        'Content-Type' => 'text/event-stream',
        'Cache-Control' => 'no-cache',
    ]);
}

Laravel-тСсты

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Tigusigalpa\GigaChat\Laravel\GigaChat;

class GigaChatTest extends TestCase
{
    public function test_gigachat_basic_functionality()
    {
        $response = GigaChat::ask('ΠŸΡ€ΠΈΠ²Π΅Ρ‚!');
        
        $this->assertNotEmpty($response);
        $this->assertIsString($response);
    }

    public function test_gigachat_with_context()
    {
        $response = GigaChat::askWithContext(
            'Π’Ρ‹ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊ',
            'Бколько Π±ΡƒΠ΄Π΅Ρ‚ 2+2?'
        );
        
        $this->assertStringContainsString('4', $response);
    }
}

FAQ

Как ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Client ID ΠΈ Client Secret?
Π—Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ΡΡŒ Π² Sber AI ΠΈ создайтС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

Ошибка "Invalid token response"?
ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Client ID/Secret ΠΈ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ сСрвиса Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ.

SSL-сСртификаты?
УстановитС GIGACHAT_CERT_PATH Π² ΠΏΡƒΡ‚ΡŒ ΠΊ сСртификату ΠΈΠ»ΠΈ false.

Production?
Π”Π°. НастройтС SSL ΠΈ rate limiting.

Π’Π°Ρ€ΠΈΡ„Ρ‹?
ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ докумСнтация

SSL-ошибки

cURL error 60: SSL certificate problem
# Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°
GIGACHAT_CERT_PATH=false

# Production
GIGACHAT_CERT_PATH=/path/to/certificate.pem

ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚Π΅ кэш послС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ:

php artisan config:clear
php artisan config:cache

Полная конфигурация

config/gigachat.php:

<?php

return [
    // Authorization key (Base64(Client ID:Client Secret))
    'auth_key' => env('GIGACHAT_AUTH_KEY', null),

    // ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ, ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ Client ID ΠΈ Client Secret
    'client_id' => env('GIGACHAT_CLIENT_ID', null),
    'client_secret' => env('GIGACHAT_CLIENT_SECRET', null),

    // ΠžΠ±Π»Π°ΡΡ‚ΡŒ доступа API: GIGACHAT_API_PERS | GIGACHAT_API_B2B | GIGACHAT_API_CORP
    'scope' => env('GIGACHAT_SCOPE', 'GIGACHAT_API_PERS'),

    // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° TLS сСртификатов
    'verify' => env('GIGACHAT_CERT_PATH', true),

    // Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ URI
    'base_uri' => env('GIGACHAT_BASE_URI', 'https://gigachat.devices.sberbank.ru'),
    'oauth_uri' => env('GIGACHAT_OAUTH_URI', 'https://ngw.devices.sberbank.ru:9443'),

    // МодСль ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
    'default_model' => env('GIGACHAT_DEFAULT_MODEL', 'GigaChat'),

    // ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
    'default_options' => [
        'temperature' => (float) env('GIGACHAT_TEMPERATURE', 0.7),
        'max_tokens' => (int) env('GIGACHAT_MAX_TOKENS', 1000),
        'top_p' => (float) env('GIGACHAT_TOP_P', 0.9),
        'repetition_penalty' => (float) env('GIGACHAT_REPETITION_PENALTY', 1.1),
    ],

    // Rate limiting настройки
    'rate_limit' => [
        'enabled' => env('GIGACHAT_RATE_LIMIT_ENABLED', true),
        'max_attempts' => (int) env('GIGACHAT_RATE_LIMIT_MAX_ATTEMPTS', 60),
        'decay_minutes' => (int) env('GIGACHAT_RATE_LIMIT_DECAY_MINUTES', 1),
    ],

    // Настройки логирования
    'logging' => [
        'enabled' => env('GIGACHAT_LOGGING_ENABLED', false),
        'channel' => env('GIGACHAT_LOG_CHANNEL', 'default'),
        'level' => env('GIGACHAT_LOG_LEVEL', 'info'),
    ],
];

ВрСбования

  • PHP 8.2+
  • Laravel 8+ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ 11, 12)
  • Guzzle HTTP 7.8.2+
  • Π£Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ GigaChat API

ЛицСнзия

MIT. Π‘ΠΌ. LICENSE.

Бсылки

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°

УчастиС

  1. Π€ΠΎΡ€ΠΊΠ½ΠΈΡ‚Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ
  2. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π²Π΅Ρ‚ΠΊΡƒ (git checkout -b feature/name)
  3. ЗафиксируйтС измСнСния (git commit -m 'Add feature')
  4. ΠžΡ‚ΠΏΡ€Π°Π²ΡŒΡ‚Π΅ (git push origin feature/name)
  5. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Pull Request

Π‘Π»Π΅Π΄ΡƒΠΉΡ‚Π΅ PSR-12, добавляйтС тСсты, обновляйтС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ.

Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ

Уязвимости отправляйтС Π½Π° sovletig@gmail.com (Π½Π΅ Π² ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ issues).

Laravel 12

Полная ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ:

  • Service Provider авторСгистрация
  • GigaChat Facade
  • Artisan-ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
  • Rate limit middleware
  • HasGigaChat trait

Roadmap

  • ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
  • ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ
  • WebSocket
  • Π”Ρ€ΡƒΠ³ΠΈΠ΅ PHP-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ