ΠΠΎΠ»Π½ΠΎΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ 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 ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
- π ΠΠΎΠ΄ΡΠΎΠ±Π½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅Ρ ΡΠ΅ΡΠ΅Π· Composer:
composer require tigusigalpa/gigachat-php
ΠΠ°ΠΊΠ΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΡΡΡ Π² Laravel Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π°Π²ΡΠΎΠ΄ΠΈΡΠΊΠ°Π²Π΅ΡΠΈ. ΠΠΏΡΠ±Π»ΠΈΠΊΡΠΉΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ°ΠΉΠ»:
php artisan vendor:publish --tag=gigachat-config
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ Ρ GigaChat API Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅:
- ΠΠ°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠΉΡΠ΅ΡΡ Π² Π»ΠΈΡΠ½ΠΎΠΌ ΠΊΠ°Π±ΠΈΠ½Π΅ΡΠ΅ Sber AI
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Client ID ΠΈ Client Secret
- Π‘Π³Π΅Π½Π΅ΡΠΈΡΡΠΉΡΠ΅ Authorization Key (Base64 ΠΎΡ "Client ID:Client Secret")
π‘ **ΠΠΎΠ΄ΡΠΎΠ±Π½Π°Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ **: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ΅ΠΉ
ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π² Π²Π°Ρ .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
<?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'];
ΠΠΎΡΠ»Π΅ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ 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, 'Π ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ?');
<?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'];
}
}
<?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
, ΠΊΠΎΡΠΎΡΡΠΉ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΈ ΡΡΠ°Π·Ρ ΡΠΊΠ°ΡΠΈΠ²Π°Π΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅:
// ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΈ ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅
$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'];
<?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 ΠΌΠ΅ΡΠΎΠ΄Ρ:
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();
}
ΠΠΎΠ΄ | 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. ΠΠ΅ΡΠ΅Π²ΡΠΏΡΡΡΠΈΡΠ΅ ΠΊΠ»ΡΡ.";
}
}
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;
}
}
HTTP | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ | ΠΡΠΈΡΠΈΠ½Π° | Π Π΅ΡΠ΅Π½ΠΈΠ΅ |
---|---|---|---|
413 | Payload too large |
ΠΡΠ΅Π²ΡΡΠ΅Π½ ΡΠ°Π·ΠΌΠ΅Ρ Π²Ρ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ | Π£ΠΌΠ΅Π½ΡΡΠΈΡΠ΅ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠΎΠΌΠΏΡΠ° ΠΈΠ»ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² |
try {
$response = $client->generateImage($longPrompt);
} catch (GigaChatException $e) {
if ($e->getCode() === 413) {
echo "ΠΡΠΎΠΌΠΏΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π΄Π»ΠΈΠ½Π½ΡΠΉ. Π‘ΠΎΠΊΡΠ°ΡΠΈΡΠ΅ ΡΠ΅ΠΊΡΡ.";
// ΠΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ POST /tokens/count Π΄Π»Ρ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΡΠΎΠΊΠ΅Π½ΠΎΠ²
}
}
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' => 'ΠΡΠΈΠ²Π΅Ρ'],
];
}
}
HTTP | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ | ΠΡΠΈΡΠΈΠ½Π° | Π Π΅ΡΠ΅Π½ΠΈΠ΅ |
---|---|---|---|
429 | Too Many Requests |
ΠΡΠ΅Π²ΡΡΠ΅Π½ Π»ΠΈΠΌΠΈΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² | Π£ΠΌΠ΅Π½ΡΡΠΈΡΠ΅ ΡΠ°ΡΡΠΎΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ², Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ |
try {
$response = $client->chat($messages);
} catch (GigaChatException $e) {
if ($e->getCode() === 429) {
echo "Π‘Π»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠΎΠ². ΠΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡΠ΅ ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΠ΅.";
// ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π·Π°Π΄Π΅ΡΠΆΠΊΡ ΠΈ ΠΏΠΎΠ²ΡΠΎΡΡΠ΅ΠΌ
sleep(2);
$response = $client->chat($messages);
}
}
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
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
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ 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
<?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]
);
}
}
<?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"
<?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);
}
}
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.
- π **Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ 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 Π½Π° [email protected] Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎΠ³ΠΎ issue.
SDK ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ Laravel 12! ΠΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ:
- β Service Provider Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΡΡΡ
- β
Facade
GigaChat
Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ - β
Artisan ΠΊΠΎΠΌΠ°Π½Π΄Ρ
gigachat:test
ΠΈgigachat:chat
- β
Middleware
gigachat.rate_limit
- β
Trait
HasGigaChat
Π΄Π»Ρ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ
- ΠΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡΠ²Π΅ΡΠΎΠ²
- ΠΠ΅ΡΡΠΈΠΊΠΈ ΠΈ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠ°
- 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'] ?? '';
GigaChat::chatStream($messages, ['model' => 'GigaChat'], function ($event, $error) {
if ($event === '[DONE]') {
return; // Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ°
}
$delta = $event['choices'][0]['delta']['content'] ?? '';
echo $delta;
});
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