PHP code example of talismanfr / gigachat-php-sdk

1. Go to this page and download the library: Download talismanfr/gigachat-php-sdk library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

talismanfr / gigachat-php-sdk example snippets


$auth = new GigaChatOAuth(
            'CLIENT_ID',
            'SECRET_ID',
            false, // отключаем валидацию https
            Scope::GIGACHAT_API_PERS
        );
// создаем экземпляр АПИ
$api = new GigaChatApi($auth);
$factory = new DialogFactory();
// формируем объект диалога с system и user промтом. Дефолтные значения настроек.
$dialog = $factory->dialogBase('Ты эксперт в футболе.', 'Сколько должно быть игроков на поле?', Model::createGigaChatPlus());
$response = $api->completions($dialog);
echo $response->getBody()->__toString();

$auth = new GigaChatOAuth(
            'CLIENT_ID',
            'SECRET_ID',
            false, // отключаем валидацию https
            Scope::GIGACHAT_API_PERS
        );
// создаем экземпляр АПИ
$api = new GigaChatApi($auth);
// создаем экзепляр сервиса для работы с апи GigaChat
$service = new GigaChatService($api, new GigaChatMapper());
// формируем стартовый диалог
$messages = [
            new Message(0, 'Ты эксперт в футболе.', Role::SYSTEM, null),
            new Message(1, 'Сколько должно быть игроков на поле?', Role::USER, null),
        ];

// при создания объета диалога можно указать температуру, top_p, а так же зарегистрировать функции
$dialog = Dialog(
    Model::createGigaChatPlus(),
    new Messages(...$messages)
);
// делаем запрос к апи, в ответе получаем объект
// `Talismanfr\GigaChat\Service\Response\CompletionResponse`
$result = $service->completions($dialog);
echo $result->->choices[0]->message->content;
// output:На поле должно быть 11 игроков от каждой команды.

// в объект $dialog добавил ответ от GPT и вы можете продолжить диалог
$dialog->addMessage(new Message(0, 'Может быть что на поле меньше игроков?', Role::USER));
$service->completions($dialog);
// как и в превом запросе, ответ сразу смапится в объект $dialog
// вы можете получить список всех сообщений в рамках текущего контекста
/** @var \Talismanfr\GigaChat\Domain\VO\Message[] $messages */
$messages = $dialog->getMessages()->getMessages();
echo json_encode($dialog);

$factory = new DialogFactory();
$auth = new GigaChatOAuth(
            'CLIENT_ID',
            'SECRET_ID',
            false, // отключаем валидацию https
            Scope::GIGACHAT_API_PERS
        );
// создаем экземпляр АПИ
$api = new GigaChatApi($auth);
// создаем экзепляр сервиса для работы с апи GigaChat
$service = new GigaChatService($api, new GigaChatMapper());
// формируем стартовый диалог
$messages = [
            new Message(0, 'Ты эксперт в футболе.', Role::SYSTEM, null),
        ];
// при создания объета диалога можно указать температуру, top_p, а так же зарегистрировать функции
$dialog = Dialog(
    Model::createGigaChatPlus(),
    new Messages(...$messages)
);
// Создаем объект функции и добавляем к диалогу
$function = $factory->functionModel('player_number_name',
            new FunctionParameters(
                new FunctionProperties(
                    new FunctionProperty('soccer_club_name', 'string', 'Название футбольного клуба', true),
                    new FunctionProperty('player_number', 'integer', 'Номер игрока в футбольном клубе', true),
                    new FunctionProperty('soccer_league_name', 'string', 'Название футбольной лиги', false, [
                        'Российская Премьер-лига',
                        'Первая лига',
                        'Вторая лига',
                    ]),
                )
            ),
            'Возвращает фамилию имя и отчество игрока играющего в футбольном клубе под определенным номером',
            [
                new FewShotExample('Кто играет в зените под первым номером?', ['soccer_club_name' => 'Зенит', 'player_number' => 1])
            ]
        );
$dialog->addFunction($function);
$dialog->addMessage(new Message(0, 'Кто играет под десятым номером в металлурге-кузбасс?'));
$result = $service->completions($dialog);

// получаем последнее сообщение в диалоге и если это вызов функции
// то buildFunctionResult вернет сообщение для ответа на функцию
// так же можете получить объект Talismanfr\GigaChat\Domain\VO\FunctionCall из $result->choices[0]->message->function_call
$message = $dialog->getMessages()->getLastMessage();
$messageFunctionResponse = $message->buildFunctionResult(
    json_encode(['player_number_name' => 'Всеволод Михайлович Бобров'], JSON_UNESCAPED_UNICODE)
);
// добавляем в диалог ответ на функцию и снова обращаемся к GPT
$dialog->addMessage($messageFunctionResponse);

$result = $service->completions($dialog);

// новое сообщение уже содержит ответ от GPT с использованием ответа на нашу функцию
$message = $dialog->getMessages()->getLastMessage();

echo $message->getContent();
// output: Под десятым номером в "Металлург-Кузбасс" играет Всеволод Михайлович Бобров.

// Полная структура диалога в итоге будет выглядеть так
echo json_encode($dialog);       

// ... previous build $dialog and functions property

// передаем в диалог экземпляр EventDispatcher (это можно сделать и при создании диалог через конструктор)
$ed = new EventDispatcher();
$dialog->setEventDispatcher($ed);
// добавляем к диспечеру событий обработчик
$ed->addSubscriber(new FunctionCallSubscriber());
// обращаемся к GPT
$service->completions($dialog);
// если gigachat вернул function_call то подписчик автоматически выполнится

class FunctionCallSubscriber implements EventSubscriberInterface
{

    public static function getSubscribedEvents()
    {
        return [FunctionCallEvent::class => 'functionCall'];
    }

    function functionCall(FunctionCallEvent $event)
    {
        $dialog = $event->getDialog();
        $function_name = $event->getMessageFunctionCall()->getFunctionCall()->getName();
        // если это нужный нам вызов функции, то формируем ответ и добавляем в диалог
        if ($function_name === 'player_number_name') {
            $response = $event->getMessageFunctionCall()->buildFunctionResult(json_encode(['player_number_name' => 'Иванов Иван Иванович']));
            $dialog->addMessage($response);
        }
    }
}
bash
$ composer 
xml
<php>
    <ini name="error_reporting" value="-1"/>
    <env name="CLIENT_ID" value="00000000-0000-0000-0000-000000000000"/>
    <env name="SECRET_ID" value="00000000-0000-0000-0000-000000000000"/>
</php>