Skip to content

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

Notifications You must be signed in to change notification settings

tigusigalpa/gigachat-php

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

3 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸš€ GigaChat PHP SDK

English version

GigaChat PHP SDK

ΠŸΠΎΠ»Π½ΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ PHP SDK для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Sber GigaChat API с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Laravel. ΠŸΠ°ΠΊΠ΅Ρ‚ прСдоставляСт ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ интСрфСйс для ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с AI модСлями Sber GigaChat, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ streaming ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… запросов.

Latest Version PHP Version License

πŸš€ ВозмоТности

  • πŸ”Œ ΠŸΡ€ΠΎΡΡ‚Π°Ρ интСграция с 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

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

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

βš™οΈ Настройка

1. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с GigaChat API Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅:

  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 ΠΈ Client 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' => 'Напиши Π΄Π»ΠΈΠ½Π½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΎ космосС']
];

// Бпособ 1: Π‘ 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'];
    }
});

// Бпособ 2: Π‘ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ
$stream = GigaChat::chatStream($messages);
foreach ($stream as $event) {
    if (isset($event['choices'][0]['delta']['content'])) {
        echo $event['choices'][0]['delta']['content'];
    }
}

ИспользованиС Π² модСлях Eloquent

<?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 ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ нСсколько ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. ΠΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ список ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ доступСн Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

МодСли для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ тСкста

МодСль ОписаниС ИспользованиС
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);

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

GigaChat ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ text2image. Для создания ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π³Π»Π°Π³ΠΎΠ» "нарисуй" Π² ΠΏΡ€ΠΎΠΌΠΏΡ‚Π΅ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ function_call: auto.

Π‘Π°Π·ΠΎΠ²ΠΎΠ΅ использованиС

<?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'];
// ΠžΡ‚Π²Π΅Ρ‚ содСрТит: <img src="file-id" fuse="true"/>

// Π‘ΠΊΠ°Ρ‡ΠΈΠ²Π°Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
if (preg_match('/<img[^>]+src=["\']([^"\']+)["\'][^>]*>/i', $content, $matches)) {
    $fileId = $matches[1];
    $imageData = $client->downloadImage($fileId);
    
    // БохраняСм Ρ„Π°ΠΉΠ»
    file_put_contents('sunset.jpg', base64_decode($imageData));
}

ГСнСрация с систСмным ΠΏΡ€ΠΎΠΌΠΏΡ‚ΠΎΠΌ (стилизация)

// ГСнСрация Π² стилС ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ…ΡƒΠ΄ΠΎΠΆΠ½ΠΈΠΊΠ°
$response = $client->generateImage("Нарисуй Ρ€ΠΎΠ·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΡ‚Π°", [
    'system_message' => 'Π’Ρ‹ β€” Василий Кандинский'
]);

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

Π£ΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ createImage

Для удобства доступСн ΠΌΠ΅Ρ‚ΠΎΠ΄ createImage, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ сразу скачиваСт ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

// ГСнСрация ΠΈ скачиваниС Π² ΠΎΠ΄Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅
$result = $client->createImage("Нарисуй футуристичСский Π³ΠΎΡ€ΠΎΠ΄", [
    'system_message' => 'Π’Ρ‹ β€” Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΠΎΡ€ Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ'
]);

// Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ содСрТит:
// - content: base64-ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
// - file_id: ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ„Π°ΠΉΠ»Π°
// - response: ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ API

file_put_contents('city.jpg', base64_decode($result['content']));
echo "Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ сохранСно с ID: " . $result['file_id'];

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

<?php

namespace App\Http\Controllers;

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

class ImageController extends Controller
{
    public function generateImage(Request $request)
    {
        $request->validate([
            'prompt' => 'required|string|max:500',
            'style' => 'nullable|string|max:200'
        ]);

        try {
            $options = [];
            if ($request->has('style')) {
                $options['system_message'] = $request->input('style');
            }

            // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ фасад Laravel
            $result = GigaChat::createImage(
                "Нарисуй " . $request->input('prompt'),
                $options
            );

            // БохраняСм Π² storage
            $filename = 'images/' . $result['file_id'] . '.jpg';
            Storage::put($filename, base64_decode($result['content']));

            return response()->json([
                'success' => true,
                'file_id' => $result['file_id'],
                'url' => Storage::url($filename)
            ]);

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

Laravel Helper ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹

Для удобства Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Laravel доступны ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ helper ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹:

use Tigusigalpa\GigaChat\Laravel\GigaChat;

// Быстрая гСнСрация изобраТСния (автоматичСски добавляСт "Нарисуй")
$result = GigaChat::drawImage("красивый ΠΏΠ΅ΠΉΠ·Π°ΠΆ");
// Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΠΎ: GigaChat::createImage("Нарисуй красивый ΠΏΠ΅ΠΉΠ·Π°ΠΆ")

// Π’Ρ‹Π²ΠΎΠ΄ изобраТСния Π² HTML для просмотра Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅
echo '<img src="data:image/jpeg;base64,' . $result['content'] . '" alt="ΠšΡ€Π°ΡΠΈΠ²Ρ‹ΠΉ ΠΏΠ΅ΠΉΠ·Π°ΠΆ" style="max-width: 500px;">';

// ГСнСрация Π² стилС ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ…ΡƒΠ΄ΠΎΠΆΠ½ΠΈΠΊΠ°
$result = GigaChat::drawImageInStyle("ΠΏΠΎΡ€Ρ‚Ρ€Π΅Ρ‚ ΠΊΠΎΡ‚Π°", "Π›Π΅ΠΎΠ½Π°Ρ€Π΄ΠΎ Π΄Π° Π’ΠΈΠ½Ρ‡ΠΈ");
// Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΠΎ: GigaChat::createImage("Нарисуй ΠΏΠΎΡ€Ρ‚Ρ€Π΅Ρ‚ ΠΊΠΎΡ‚Π°", ['system_message' => 'Π’Ρ‹ β€” Π›Π΅ΠΎΠ½Π°Ρ€Π΄ΠΎ Π΄Π° Π’ΠΈΠ½Ρ‡ΠΈ'])

// Π’Ρ‹Π²ΠΎΠ΄ стилизованного изобраТСния Π² HTML
echo '<img src="data:image/jpeg;base64,' . $result['content'] . '" alt="ΠŸΠΎΡ€Ρ‚Ρ€Π΅Ρ‚ ΠΊΠΎΡ‚Π° Π² стилС Π΄Π° Π’ΠΈΠ½Ρ‡ΠΈ" style="max-width: 400px; border: 2px solid gold;">';

// Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ID изобраТСния ΠΈΠ· ΠΎΡ‚Π²Π΅Ρ‚Π° API
$response = GigaChat::generateImage("Нарисуй Π΄Ρ€Π°ΠΊΠΎΠ½Π°");
$content = $response['choices'][0]['message']['content'];
$imageId = GigaChat::extractImageId($content);

if ($imageId) {
    $imageData = GigaChat::downloadImage($imageId);
    file_put_contents("dragon.jpg", base64_decode($imageData));
}

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ HTML-страницы с Π³Π°Π»Π΅Ρ€Π΅Π΅ΠΉ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
$images = [
    GigaChat::drawImage("Π·Π°ΠΊΠ°Ρ‚ Π½Π°Π΄ ΠΎΠΊΠ΅Π°Π½ΠΎΠΌ"),
    GigaChat::drawImageInStyle("Π³ΠΎΡ€Π½Ρ‹ΠΉ ΠΏΠ΅ΠΉΠ·Π°ΠΆ", "Иван Шишкин"),
    GigaChat::drawImageInStyle("абстрактная композиция", "Василий Кандинский")
];

$html = '<html><head><title>ГалСрСя GigaChat</title></head><body>';
$html .= '<h1>Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ, созданныС GigaChat</h1>';
foreach ($images as $index => $image) {
    $html .= '<div style="margin: 20px; text-align: center;">';
    $html .= '<img src="data:image/jpeg;base64,' . $image['content'] . '" ';
    $html .= 'alt="Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ' . ($index + 1) . '" style="max-width: 300px; border-radius: 10px; box-shadow: 0 4px 8px rgba(0,0,0,0.3);">';
    $html .= '<p>ID: ' . $image['file_id'] . '</p>';
    $html .= '</div>';
}
$html .= '</body></html>';

file_put_contents('gallery.html', $html);
echo "ГалСрСя сохранСна Π² gallery.html";

ДоступныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с изобраТСниями

ΠœΠ΅Ρ‚ΠΎΠ΄ ОписаниС Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚
generateImage($prompt, $options) Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ API array - ΠΎΡ‚Π²Π΅Ρ‚ с ID изобраТСния
downloadImage($fileId) Π‘ΠΊΠ°Ρ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ID string - base64-ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
createImage($prompt, $options) Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ сразу скачиваСт ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ array - содСрТит content, file_id, response
drawImage($description, $options) Laravel helper - быстрая гСнСрация (добавляСт "Нарисуй") array - Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ createImage
drawImageInStyle($description, $style, $options) Laravel helper - гСнСрация Π² стилС Ρ…ΡƒΠ΄ΠΎΠΆΠ½ΠΈΠΊΠ° array - Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ createImage
extractImageId($content) Laravel helper - ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ID изобраТСния ΠΈΠ· HTML string|null - ID Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ null

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок ΠΏΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

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

try {
    $result = $client->createImage("Нарисуй Π΄Ρ€Π°ΠΊΠΎΠ½Π°");
} catch (ValidationException $e) {
    // Ошибки Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ (пустой ΠΏΡ€ΠΎΠΌΠΏΡ‚ ΠΈ Ρ‚.Π΄.)
    echo "Ошибка Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ: " . $e->getMessage();
} catch (GigaChatException $e) {
    // Ошибки API ΠΈΠ»ΠΈ извлСчСния ID изобраТСния
    echo "Ошибка Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ: " . $e->getMessage();
}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΠΎΠΌΠΏΡ‚ΠΎΠ² для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ

// Π₯ΠΎΡ€ΠΎΡˆΠΈΠ΅ ΠΏΡ€ΠΎΠΌΠΏΡ‚Ρ‹ (содСрТат "нарисуй")
$client->generateImage("Нарисуй Π·Π°ΠΊΠ°Ρ‚ Π² Π³ΠΎΡ€Π°Ρ…");
$client->generateImage("Нарисуй ΠΏΠΎΡ€Ρ‚Ρ€Π΅Ρ‚ ΠΊΠΎΡ‚Π° Π² стилС рСнСссанса");
$client->generateImage("Нарисуй Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ‚Π½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ");

// Бтилизация Ρ‡Π΅Ρ€Π΅Π· system_message
$client->generateImage("Нарисуй Ρ†Π²Π΅Ρ‚Ρ‹", [
    'system_message' => 'Π’Ρ‹ β€” Клод МонС, Ρ€ΠΈΡΡƒΠ΅ΡˆΡŒ Π² стилС импрСссионизма'
]);

$client->generateImage("Нарисуй Ρ€ΠΎΠ±ΠΎΡ‚Π°", [
    'system_message' => 'Π’Ρ‹ β€” ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚-Ρ…ΡƒΠ΄ΠΎΠΆΠ½ΠΈΠΊ для Π½Π°ΡƒΡ‡Π½ΠΎ-фантастичСских Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ²'
]);

Π’Π°ΠΆΠ½ΠΎ: Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΡ€ΠΎΠΌΠΏΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π³Π»Π°Π³ΠΎΠ» "нарисуй" ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ рисования. API автоматичСски опрСдСляСт Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ text2image ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° function_call: auto.

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

SDK прСдоставляСт спСциализированныС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ошибок:

<?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();
}

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

πŸ” Ошибки Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ (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' => 'ΠŸΡ€ΠΈΠ²Π΅Ρ‚'],
        ];
    }
}

🚦 Ошибки Π»ΠΈΠΌΠΈΡ‚ΠΎΠ² запросов (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());
    }
}

Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ошибок

<?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) {
    // Полная информация ΠΎΠ± ошибкС
    $errorInfo = [
        'message' => $e->getMessage(),
        'code' => $e->getCode(),
        'file' => $e->getFile(),
        'line' => $e->getLine(),
        'trace' => $e->getTraceAsString()
    ];
    
    error_log('GigaChat Error: ' . json_encode($errorInfo, JSON_UNESCAPED_UNICODE));
    
    // ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π² систСму ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°
    // Sentry::captureException($e);
}

πŸ“– ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…: ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ докумСнтация GigaChat API

πŸ› οΈ Artisan ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

SDK прСдоставляСт ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‡Π΅Ρ€Π΅Π· консоль:

# ВСстированиС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ 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

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ middleware для ограничСния количСства запросов:

// Π’ 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
  • βœ… ГСнСрация ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ - созданиС, скачиваниС, ΠΏΠΎΠ»Π½Ρ‹ΠΉ workflow
  • βœ… АутСнтификация - ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌΠΈ, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
  • βœ… Laravel интСграция - фасады, helper ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, сСрвис-ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€
  • βœ… Валидация - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок
  • βœ… Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ тСсты - Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ запросы ΠΊ API

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ см. tests/README.md

πŸ“š ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования

Π§Π°Ρ‚-Π±ΠΎΡ‚ для Laravel

<?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',
    ]);
}

πŸ§ͺ ВСстированиС

Запуск тСстов ΠΏΠ°ΠΊΠ΅Ρ‚Π°

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

# ВСстированиС с собствСнным сообщСниСм
php artisan gigachat:test "ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ API"

ВСстированиС Π² 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);
    }
}

❓ Troubleshooting ΠΈ FAQ

Часто Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ вопросы

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

Q: Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ошибкС "Invalid token response"? A: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ Client ID ΠΈ Client Secret, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ сСрвиса Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Q: Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ собствСнныС SSL сСртификаты? A: УстановитС GIGACHAT_CERT_PATH Π² ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ сСртификата ΠΈΠ»ΠΈ false для ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ.

Q: ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ΡΡ Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° Π² production? A: Π”Π°, SDK Π³ΠΎΡ‚ΠΎΠ² для использования Π² production. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ настройкС SSL ΠΈ rate limiting.

Q: Π“Π΄Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚Π°Ρ€ΠΈΡ„Π°Ρ…? A: ΠΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ информация ΠΎ Ρ‚Π°Ρ€ΠΈΡ„Π°Ρ… доступна Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

РСшСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Ошибки SSL/TLS

ΠŸΡ€ΠΈ запросС ΠΊ GigaChat API ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ошибка:

OAuth token request failed: cURL error 60: SSL certificate problem: self-signed certificate in certificate chain

РСшСния:

# РСшСниС 1: ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ SSL (рСкомСндуСтся для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ)
GIGACHAT_CERT_PATH=false

# РСшСниС 2: Π£ΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΊ сСртификату (для ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π°)
GIGACHAT_CERT_PATH=/path/to/certificate.pem

ПослС добавлСния GIGACHAT_CERT_PATH=false Π² Ρ„Π°ΠΉΠ» .env очиститС кэш ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

php artisan config:clear
php artisan config:cache

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Π’ΠΎΠΊΠ΅Π½ истСкаСт слишком быстро

// SDK автоматичСски обновляСт Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ систСмноС врСмя
// ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ настроСк Client ID/Secret

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Rate limiting ошибки

// НастройтС Π»ΠΈΠΌΠΈΡ‚Ρ‹ Π² config/gigachat.php
'rate_limit' => [
    'max_attempts' => 30,    // Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚Π΅ количСство запросов
    'decay_minutes' => 1,    // Или ΡƒΠ²Π΅Π»ΠΈΡ‡ΡŒΡ‚Π΅ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄
],

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

Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ для получСния ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ:

// Π’ Laravel - Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² config/gigachat.php
'logging' => [
    'enabled' => true,
    'channel' => 'daily',
    'level' => 'debug',
],

// Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ запросов
use Illuminate\Support\Facades\Log;

try {
    $response = GigaChat::chat($messages);
    Log::info('GigaChat response', ['response' => $response]);
} catch (\Exception $e) {
    Log::error('GigaChat error', [
        'message' => $e->getMessage(),
        'trace' => $e->getTraceAsString()
    ]);
}

πŸ›‘οΈ ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ

ΠŸΠΎΠ»Π½Ρ‹ΠΉ список настроСк Π² 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+ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Laravel 11 ΠΈ 12)
  • Guzzle HTTP: 7.8.2+
  • Π”Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Sber GigaChat API

πŸ“„ ЛицСнзия

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π»ΠΈΡ†Π΅Π½Π·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ MIT. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ см. Π² Ρ„Π°ΠΉΠ»Π΅ LICENSE.

πŸ”— ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ссылки

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

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

πŸ§‘β€πŸ’» УчастиС Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅

ΠœΡ‹ привСтствуСм Π²ΠΊΠ»Π°Π΄ Π² Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°! ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°:

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

ΠŸΡ€Π°Π²ΠΈΠ»Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

  • Π‘Π»Π΅Π΄ΡƒΠΉΡ‚Π΅ стандартам PSR-12
  • ДобавляйтС тСсты для Π½ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ
  • ΠžΠ±Π½ΠΎΠ²Π»ΡΠΉΡ‚Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ понятныС commit сообщСния

πŸ›‘οΈ Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ

Если Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ бСзопасности, поТалуйста, ΠΎΡ‚ΠΏΡ€Π°Π²ΡŒΡ‚Π΅ email Π½Π° [email protected] вмСсто создания ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ issue.

πŸ†• Laravel 12 Support

SDK ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ совмСстим с Laravel 12! ВсС возмоТности Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ:

  • βœ… Service Provider автоматичСски рСгистрируСтся
  • βœ… Facade GigaChat доступСн ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ
  • βœ… Artisan ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ gigachat:test ΠΈ gigachat:chat
  • βœ… Middleware gigachat.rate_limit
  • βœ… Trait HasGigaChat для ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ

πŸ“ˆ Roadmap

  • ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²
  • ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΈ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ°
  • WebSocket ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°
  • Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ PHP Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ

Π‘Π΄Π΅Π»Π°Π½ΠΎ с ❀️ для сообщСства PHP Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²

πŸ’‘ Π‘ΠΎΠ²Π΅Ρ‚: НачнитС с простых ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΈ постСпСнно ΠΈΠ·ΡƒΡ‡Π°ΠΉΡ‚Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ возмоТности SDK. ДокумСнтация GigaChat API: https://developers.sber.ru/docs/ru/gigachat/api/overview

use Tigusigalpa\GigaChat\Laravel\GigaChat;

$messages = [
['role' => 'user', 'content' => 'ΠŸΡ€ΠΈΠ²Π΅Ρ‚! Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠΉ ΠΎΡ‚Π²Π΅Ρ‚.'],
];

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

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

ΠŸΠΎΡ‚ΠΎΠΊΠΎΠ²Π°Ρ гСнСрация (SSE)

GigaChat::chatStream($messages, ['model' => 'GigaChat'], function ($event, $error) {
    if ($event === '[DONE]') {
        return; // Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°
    }
    $delta = $event['choices'][0]['delta']['content'] ?? '';
    echo $delta;
});

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

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

$authKey = base64_encode('CLIENT_ID:CLIENT_SECRET');
$tm = new TokenManager($authKey, 'GIGACHAT_API_PERS');
$client = new GigaChatClient($tm);

$messages = [
    ['role' => 'user', 'content' => 'Hello!'],
];
$response = $client->chat($messages);

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ

  • Для получСния Ρ‚ΠΎΠΊΠ΅Π½Π° доступа отправляйтС запрос POST https://ngw.devices.sberbank.ru:9443/api/v2/oauth c Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ Content-Type: application/x-www-form-urlencoded, Accept: application/json, Authorization: Basic Base64(ClientID:ClientSecret) ΠΈ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ RqUID (uuid4). Π’ Ρ‚Π΅Π»Π΅ указываСтся scope=GIGACHAT_API_PERS|GIGACHAT_API_B2B|GIGACHAT_API_CORP.
  • Π’ΠΎΠΊΠ΅Π½ дСйствуСт ~30 ΠΌΠΈΠ½ΡƒΡ‚, SDK обновляСт Π΅Π³ΠΎ автоматичСски ΠΏΡ€ΠΈ нСобходимости.
  • Если срСда Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ явный сСртификат, Π·Π°Π΄Π°ΠΉΡ‚Π΅ GIGACHAT_CERT_PATH Π½Π° ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ сСртификатов NGW (ΠΈΠ»ΠΈ ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ verify=true для систСмного Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°).

ВрСбования

  • PHP >= 7.4
  • guzzlehttp/guzzle ^7.8
  • Laravel 8+ (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ)

ЛицСнзия

MIT

About

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

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •  

Languages