/
v.bolshakov
/
AIEcosystem-Testing
Обзор
Документация
Войти
/
v.bolshakov
/
AIEcosystem-Testing
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
common/helpers/AiHelper.php
181 строка
7 KB
Developer
Initial commit
03 авг 2026, 17:43
03 авг 2026, 17:43
7433917
Код
Авторство
О чём код?
<?php namespace common\helpers; use common\kdf\KMetric; use common\kdf\KPeriod; use common\models\Request; use common\models\RequestBatch; use common\models\RequestToken; use common\models\stat\Metric; use common\models\stat\ProviderCheck; use common\models\Token; use common\models\User; use Yii; use yii\helpers\VarDumper; /** * Расширение функций для с текстом от чата GPT * * @author Dmitry E. Semenov <sde.tomsk@gmail.com> * @copyright Self (c) 2025-2026 */ class AiHelper { /** * Разбор текста */ public static function split($input) { /** * Обработать ответ от модели так, чтобы корректно распознавались сегменты формата <s[i]>, включая возможные отклонения, такие как: * <s[i]> (исходный формат) * и<s[i]> (без пробела перед тегом) * <s[i] > (с пробелом внутри тега) * * Требования: * * Распознать и нормализовать теги <s[i]>, удаляя лишние пробелы внутри тега. Например, <s[1] > → <s[1]>. * Если тег <s[i]> идёт сразу после слова без пробела (например, и<s[1]>), автоматически добавлять пробел перед тегом (и <s[1]>). * Исключить некорректные закрывающие теги </s[i]>, если они появляются в ответе. * Обеспечить, чтобы после нормализации количество сегментов в ответе точно соответствовало количеству сегментов во входных данных. */ // $pattern = "/<\s*s\[[0-9]+\]>/i"; $pattern = "/<\s*\/*\s*s\s*\[\s*(\d+)\s*]\s*>/i"; return preg_split($pattern, $input, -1, PREG_SPLIT_NO_EMPTY); } /** * Логгирование данных * @param $options * @return void * @throws \yii\db\Exception */ public static function log($options = []) { $token = new Token([ 'input' => ArrayHelper::getValue($options, 'input', 0), 'output' => ArrayHelper::getValue($options, 'output', 0), 'total' => ArrayHelper::getValue($options, 'total', 0), ]); if ($token->save()) { $request_batch_id = ArrayHelper::getValue($options, 'request_batch_id'); if ($request_batch_id) { $rt = new RequestToken([ 'token_id' => $token->id, 'request_batch_id' => $request_batch_id ]); $rt->save(); } } } /** * Сохранение информации об ошибке * @param $options * @return void * @throws \yii\db\Exception */ public static function logCheck($options = []) { $check = new ProviderCheck([ 'provider_id' => ArrayHelper::getValue($options, 'provider_id'), 'status' => ArrayHelper::getValue($options, 'status', 200), 'timeout' => ArrayHelper::getValue($options, 'timeout'), 'error' => ArrayHelper::getValue($options, 'error'), ]); $check->save(); } /** * Обновление данных по метрикам * @param $options * @return void */ public static function updateMetric($options = []) { // Total Tokens Число Число Число Число Сумма Input + Output токенов по всем пользователям. // Total Output Tokens Число Число Число Число Сумма Output токенов по всем пользователям // Total Input Tokens Число Число Число Число Сумма Input токенов по всем пользователям // Active Users Число Число Число Число Count(distinct UserID) за период. $period_list = [ KPeriod::WEEK => DateHelper::now(strtotime('monday this week')), KPeriod::YEAR => DateHelper::now(strtotime('first day of January')), KPeriod::TODAY => DateHelper::now(strtotime('midnight')), KPeriod::MONTH => DateHelper::now(strtotime('first day of this month 00:00')) ]; $metric_list = [ KMetric::TOTAL_TOKENS => 'sum_total', KMetric::TOTAL_OUTPUT_TOKENS => 'sum_output', KMetric::TOTAL_INPUT_TOKENS => 'sum_input', ]; foreach ($period_list as $period_id => $date) { $a = Token::getAlias(); $sum = Token::find() ->select([ 'sum_total' => 'sum(total)', 'sum_output' => 'sum(output)', 'sum_input' => 'sum(input)', ]) ->alias($a) ->andWhere(['>=', 'created_at', $date]) ->asArray() ->one(); Yii::debug(VarDumper::dumpAsString([ 'sum' => $sum ])); foreach ($metric_list as $metric_id => $alias) { $metric = Metric::findOrNew([ 'metric_id' => $metric_id, 'period_id' => $period_id, ]); $metric->value = (int)ArrayHelper::getValue($sum, $alias); Yii::debug(VarDumper::dumpAsString([ 'alias' => $alias ])); if (!$metric->save()) { Yii::debug(VarDumper::dumpAsString([ 'errors' => $metric->errors ])); } } $count = Request::find() ->select([ 'count(distinct user_id)' ]) ->andWhere(['>=', 'created_at', $date]) ->scalar(); $metric = Metric::findOrNew([ 'metric_id' => KMetric::ACTIVE_USERS, 'period_id' => $period_id, ]); $metric->value = (int)$count; if (!$metric->save()) { Yii::debug(VarDumper::dumpAsString([ 'errors' => $metric->errors ])); } } // Для каждой колонки в таблице: // Today: Количество уникальных user_id, у которых было хотя бы одно событие с 00:00 сегодняшнего дня до текущего момента. // Week: Количество уникальных user_id за последние 7 дней. // Month: Количество уникальных user_id за последние 30 дней (или текущий календарный месяц). // Year: Количество уникальных user_id за текущий год. } }