/
v.bolshakov
/
AIEcosystem-Testing
Обзор
Документация
Войти
/
v.bolshakov
/
AIEcosystem-Testing
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
common/forms/ai/BaseRequestAssistantForm.php
161 строка
5 KB
Developer
Initial commit
03 авг 2026, 17:43
03 авг 2026, 17:43
7433917
Код
Авторство
О чём код?
<?php namespace common\forms\ai; use common\components\OpenAIComponent; use common\helpers\ArrayHelper; use common\kdf\KPromtFormat; use common\models\Assistant; use common\models\Project; use OpenAI\Client; use Yii; use yii\helpers\VarDumper; /** * Запрос к ассистенту * * @author Dmitry E. Semenov <sde.tomsk@gmail.com> * @copyright Self (c) 2024 */ abstract class BaseRequestAssistantForm extends BaseRequestForm { /** * Ключ ассистента * @var null */ public $asst_key = null; /** * Формат запроса * @var null */ public $promt_format_id = null; /** * @inheritdoc */ public function rules() { return ArrayHelper::merge(parent::rules(), [ ['promt_format_id', 'default', 'value' => KPromtFormat::T_TEXT], [['asst_key', 'promt_format_id'], 'required'], [['asst_key'], 'string'], [['promt_format_id'], 'number'], ]); } /** * @inheritdoc */ protected function doAiRequest() { /** @var Assistant $assistant */ $assistant = Assistant::findOne([ 'key' => $this->asst_key ]); /** @var Project $project */ $project = $assistant->project; $openAI = Yii::createObject([ 'class' => OpenAIComponent::class, 'project_id' => $project->key ]); /** @var Client $client */ $client = $openAI->getClient(); $thread = $client->threads()->create([]); $result_all = []; foreach ($this->request as $index => $request) { $start_at = microtime(true); if (is_array($request)) { $request = implode('', $request); } Yii::debug(VarDumper::dumpAsString([ 'index' => $index, 'request' => $request ])); $result = null; $error = null; try { $message = $client->threads()->messages()->create($thread->id, [ 'role' => 'user', 'content' => $request ]); $run = $client->threads()->runs()->create($thread->id, [ 'assistant_id' => $assistant->key, ]); $check = 0; $message_id = $message->id; do { // запрашивает 2 последних сообщения // 0 - ответ // 1 - запрос $response = $client->threads()->messages()->list($thread->id, [ 'limit' => 2, ]); // если сообщение было ответов на запрос if ($response->lastId == $message_id) { $message = ArrayHelper::getValue($response->data, 0); Yii::debug(VarDumper::dumpAsString([ 'message' => $message ])); if ($message) { // если ответ от чата if ($message->role == 'assistant') { $content = ArrayHelper::getValue($message->content, 0); if ($content) { // получаем сам ответ $result = $content->text->value; } } } } if (!$result) { // пауза перед следующей проверкой sleep(1); } $check++; if ($check > 100) { $result = 'I am temporarily not working'; break; } } while ($result == null); } catch (\Exception $e) { $error = $e->getMessage(); } $result = preg_replace('/【(.+)】/', '', $result); $done = microtime(true) - $start_at; $this->proccessBatch($index, $done, $this->attempt, $error); $result_all[] = $result; } $client->threads()->delete($thread->id); $this->model = [ 'text' => implode('', $result_all), 'items' => $result_all ]; return true; } }