/
v.bolshakov
/
AIEcosystem-Testing
Обзор
Документация
Войти
/
v.bolshakov
/
AIEcosystem-Testing
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
common/models/Request.php
394 строки
11 KB
Developer
Initial commit
03 авг 2026, 17:43
03 авг 2026, 17:43
7433917
Код
Авторство
О чём код?
<?php namespace common\models; use common\behaviors\UserRecordBehavior; use common\helpers\UuidHelper; use common\kdf\KLanguage; use common\kdf\KModelStatus; use common\kdf\KSystem; use common\kdf\KTaskType; use common\validators\UidValidator; use Yii; use yii\db\ActiveQuery; use yii\db\Expression; use yii\helpers\ArrayHelper; use yii\helpers\Json; use yii\helpers\VarDumper; /** * Таблица - запросы * * @property integer $user_id * @property integer $task_id * @property integer $subject_area_id * @property integer $source_language_id * @property integer $target_language_id * @property string $guid * @property float $time_spent * @property integer $system_id * @property integer $is_debug * @property integer $queue_id * * @author Dmitry E. Semenov <sde.tomsk@gmail.com> * @copyright Self (c) 2024 */ class Request extends \common\models\base\BaseModel { /** * {@inheritdoc} */ public static function tableName() { return 'request'; } /** * {@inheritdoc} */ public function rules() { return ArrayHelper::merge(parent::rules(), [ ['guid', 'default', 'value' => UuidHelper::uuid()], ['system_id', 'default', 'value' => KSystem::MEMOQ], ['is_debug', 'default', 'value' => 0], [ [ 'subject_area_id', 'source_language_id', 'target_language_id' ], 'default', 'value' => -1 ], ['time_spent', 'default', 'value' => 0], ['rec_status', 'default', 'value' => KModelStatus::DRAFT], [ [ 'user_id', 'task_id', 'subject_area_id', 'source_language_id', 'target_language_id', 'guid', 'system_id', 'time_spent', 'is_debug' ], 'required' ], [['guid'], 'string', 'max' => 50], [ [ 'user_id', 'task_id', 'subject_area_id', 'source_language_id', 'target_language_id', 'time_spent', 'system_id', 'is_debug', 'queue_id' ], 'number' ], [ ['system_id'], 'exist', 'skipOnError' => true, 'targetClass' => KSystem::class, 'targetAttribute' => ['system_id' => 'id'] ], [ ['source_language_id'], 'exist', 'skipOnError' => true, 'targetClass' => KLanguage::class, 'targetAttribute' => ['source_language_id' => 'id'] ], [ ['target_language_id'], 'exist', 'skipOnError' => true, 'targetClass' => KLanguage::class, 'targetAttribute' => ['target_language_id' => 'id'] ], [ ['task_id'], 'exist', 'skipOnError' => true, 'targetClass' => Task::class, 'targetAttribute' => ['task_id' => 'id'] ], [ ['subject_area_id'], 'exist', 'skipOnError' => true, 'targetClass' => SubjectArea::class, 'targetAttribute' => ['subject_area_id' => 'id'] ], ['guid', UidValidator::class], ['guid', 'unique'] ]); } /** * {@inheritdoc} */ public function attributeLabels() { return ArrayHelper::merge(parent::attributeLabels(), [ 'guid' => Yii::t('app', 'Guid'), 'is_debug' => Yii::t('app', 'Is Debug'), 'queue_id' => Yii::t('app', 'Queue'), ]); } /** * {@inheritdoc} */ public function behaviors() { return ArrayHelper::merge(parent::behaviors(), [ 'UserRecordBehavior' => [ 'class' => UserRecordBehavior::className(), 'userAttribute' => 'user_id', ], ]); } /** * @return ActiveQuery */ public function getUser() { return $this->hasOne(User::class, ['id' => 'user_id']); } /** * @return ActiveQuery */ public function getSystem() { return $this->hasOne(KSystem::class, ['id' => 'system_id']); } /** * @return ActiveQuery */ public function getTask() { return $this->hasOne(Task::class, ['id' => 'task_id']); } /** * @return ActiveQuery */ public function getSubjectArea() { return $this->hasOne(SubjectArea::class, ['id' => 'subject_area_id']); } /** * @return ActiveQuery */ public function getSourceLanguage() { return $this->hasOne(KLanguage::class, ['id' => 'source_language_id']); } /** * @return ActiveQuery */ public function getTargetLanguage() { return $this->hasOne(KLanguage::class, ['id' => 'target_language_id']); } /** * @return ActiveQuery */ public function getRequestSegment() { return $this->hasMany(RequestSegment::class, ['request_id' => 'id']); } /** * Получить объем модели * @return false|int|string|null * @throws \yii\base\InvalidConfigException */ public function getModelLimit() { if ($this->task->isSystem()) { return 0; } else { if (KTaskType::T_MODEL == $this->task->type_id) { $a = ModelAI::getAlias(); $token_limit = ModelAI::find() ->select('token_limit') ->alias($a) ->innerJoin(['tm' => TaskModel::tableName()], $a . '.id = tm.model_id and tm.is_default = 1') ->andWhere([ 'tm.task_id' => $this->task_id ]) ->scalar(); } else { $a = ModelAI::getAlias(); $token_limit = ModelAI::find() ->select('token_limit') ->alias($a) ->innerJoin(['a' => Assistant::tableName()], $a . '.id = a.model_id') ->innerJoin(['ta' => TaskAssistant::tableName()], 'a.id = ta.assistant_id and ta.is_default = 1') ->andWhere([ 'ta.task_id' => $this->task_id ]) ->scalar(); } return $token_limit; } } /** * Получить полный текст запроса в виде строки * * @return string */ public function getText($separator = ' ') { $rsl = $this ->getRequestSegment() ->select([ 'segment_id', ]) ->orderBy([ 'segment_index' => SORT_ASC ]) ->asArray() ->all(); $result = []; foreach ($rsl as $row) { $result[] = TextSegment::getText($row['segment_id']); } return implode($separator, $result); } /** * Получить текст с разделителями * @return array */ public function getTextArray($token_limit = 0) { $rsl = $this ->getRequestSegment() ->select([ 'segment_id', 'token_count', 'token_split' => new Expression('ceil(token_count * 0.7)') ]) ->orderBy([ 'segment_index' => SORT_ASC ]) ->asArray() ->all(); $index = 0; $items = []; $token_count = 0; $token_split = 0; $result = ''; foreach ($rsl as $row) { if (($token_split + $row['token_split']) >= $token_limit) { $items[] = [ 'tokens' => $token_count, 'limit' => $token_split, 'text' => $result ]; $token_count = 0; $token_split = 0; $result = ''; } $result .= " <s[$index]>" . TextSegment::getText($row['segment_id']); $token_count += $row['token_count']; $token_split += $row['token_split']; $index++; } $items[] = [ 'tokens' => $token_count, 'limit' => $token_split, 'text' => $result ]; Yii::debug(VarDumper::dumpAsString([ 'items' => $items ])); return $items; } /** * Получить текст разбитый на batch * @return array */ public function getBatchList($options = []) { $rsl = $this ->getRequestSegment() ->select([ 'id', 'segment_id', 'batch_id', 'segment_index' ]) ->orderBy([ 'segment_index' => SORT_ASC ]) ->asArray() ->all(); $items = []; if (ArrayHelper::getValue($options, 'is_batch')) { if (ArrayHelper::getValue($options, 'is_json')) { $json_list = []; foreach ($rsl as $row) { $json_list[$row['batch_id']][] = [ 'i' => $row['segment_index'], 't' => TextSegment::getText($row['segment_id']) ]; } foreach ($json_list as $batch_id => $rows) { $json = [ 'source_language' => ArrayHelper::getValue($options, 'source_language'), 'target_language' => ArrayHelper::getValue($options, 'target_language'), 'source' => $rows ]; $items[$batch_id] = Json::encode($json); } } else { foreach ($rsl as $row) { $index = $row['segment_index']; $items[$row['batch_id']][] = "<s[$index]>" . TextSegment::getText($row['segment_id']); } } } else { foreach ($rsl as $row) { $items[$row['batch_id']] = TextSegment::getText($row['segment_id']); } } Yii::debug(VarDumper::dumpAsString([ 'items' => $items ])); return $items; } }