tigusigalpa / gigachat-php
π GigaChat PHP SDK - ΠΏΠΎΠ»Π½ΠΎΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ Sber GigaChat API. ΠΡΠΎΡΡΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ GigaChat ΠΊ PHP-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ Laravel. ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΡΠ΅ΠΊΡΡΠ°, ΡΠ°Ρ-Π±ΠΎΡΡ, AI-Π°ΡΡΠΈΡΡΠ΅Π½ΡΡ. ΠΠΎΠ»Π½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΊΠΎΠ΄Π°, OAuth Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ.
Installs: 5
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/tigusigalpa/gigachat-php
Requires
- php: ^8.2
- guzzlehttp/guzzle: ^7.8.2
- illuminate/support: ^8|^9|^10|^11|^12
Requires (Dev)
- mockery/mockery: ^1.6
- orchestra/testbench: ^8.0|^9.0
- phpunit/phpunit: ^10.0|^11.0
README
ΠΠΎΠ»Π½ΠΎΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ PHP SDK Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Sber GigaChat API Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ Laravel. ΠΠ°ΠΊΠ΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ AI ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ Sber GigaChat, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ streaming ΠΈ ΠΎΠ±ΡΡΠ½ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ².
π ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
- π ΠΡΠΎΡΡΠ°Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ 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 Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅:
- ΠΠ°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠΉΡΠ΅ΡΡ Π² Π»ΠΈΡΠ½ΠΎΠΌ ΠΊΠ°Π±ΠΈΠ½Π΅ΡΠ΅ Sber AI
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Client ID ΠΈ Client Secret
- Π‘Π³Π΅Π½Π΅ΡΠΈΡΡΠΉΡΠ΅ 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
- π **Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Client ID **: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°
- π ΠΠ°ΡΠ°Π»ΠΎ ΡΠ°Π±ΠΎΡΡ Ρ API: ΠΡΡΡΡΡΠΉ ΡΡΠ°ΡΡ
- π **ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ API **: Π‘ΠΏΡΠ°Π²ΠΎΡΠ½ΠΈΠΊ ΠΏΠΎ API
- π€ Π‘ΠΏΠΈΡΠΎΠΊ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ: ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ
- π° Π’Π°ΡΠΈΡΡ ΠΈ ΠΎΠΏΠ»Π°ΡΠ°: Π’Π°ΡΠΈΡΠ½ΡΠ΅ ΠΏΠ»Π°Π½Ρ
π€ ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ°
- π§ Email: ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ issue
- π ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ: Sber GigaChat API
- π ΠΠ°Π³-ΡΠ΅ΠΏΠΎΡΡΡ: GitHub Issues
- π¬ ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ: GitHub Discussions
π§βπ» Π£ΡΠ°ΡΡΠΈΠ΅ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅
ΠΡ ΠΏΡΠΈΠ²Π΅ΡΡΡΠ²ΡΠ΅ΠΌ Π²ΠΊΠ»Π°Π΄ Π² ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°! ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°:
- Π€ΠΎΡΠΊΠ½ΠΈΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π²Π΅ΡΠΊΡ Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ (
git checkout -b feature/amazing-feature) - ΠΠ°ΡΠΈΠΊΡΠΈΡΡΠΉΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ (
git commit -m 'Add amazing feature') - ΠΡΠΏΡΠ°Π²ΡΡΠ΅ Π² Π²Π΅ΡΠΊΡ (
git push origin feature/amazing-feature) - ΠΡΠΊΡΠΎΠΉΡΠ΅ Pull Request
ΠΡΠ°Π²ΠΈΠ»Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ
- Π‘Π»Π΅Π΄ΡΠΉΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ°ΠΌ PSR-12
- ΠΠΎΠ±Π°Π²Π»ΡΠΉΡΠ΅ ΡΠ΅ΡΡΡ Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ
- ΠΠ±Π½ΠΎΠ²Π»ΡΠΉΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΏΠΎΠ½ΡΡΠ½ΡΠ΅ commit ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
π‘οΈ ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ
ΠΡΠ»ΠΈ Π²Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΎΡΠΏΡΠ°Π²ΡΡΠ΅ email Π½Π° sovletig@gmail.com Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎΠ³ΠΎ 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/oauthc Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ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