description; $rows = explode("\n", $description); $params = []; foreach ($rows as $key => $row) { if (strpos($row, '=') !== false) { $param = explode('=', trim($row, '|')); $params[$param[0]] = $param[1]; } } if (!isset($params['type'])) { return false; } //get sentences in article $sentences = array(); $totalLen = 0; switch ($params['type']) { case 'sentence': if (!isset($params['id'])) { return false; } $sentences[] = explode('-', $params['id']); break; case 'para': if (!isset($params['book']) || !isset($params['paragraphs'])) { return false; } $sent = PaliSentence::where('book', $params['book']) ->where('paragraph', $params['paragraphs'])->orderBy('word_begin')->get(); foreach ($sent as $key => $value) { $sentences[] = [ 'id' => [ $value->book, $value->paragraph, $value->word_begin, $value->word_end, ], 'strlen' => $value->length ]; $totalLen += $value->length; } break; case 'chapter': if (!isset($params['book']) || !isset($params['para'])) { return false; } $chapterLen = PaliText::where('book', $params['book']) ->where('paragraph', $params['para'])->value('chapter_len'); $sent = PaliSentence::where('book', $params['book']) ->whereBetween('paragraph', [$params['para'], $params['para'] + $chapterLen - 1]) ->orderBy('paragraph') ->orderBy('word_begin')->get(); foreach ($sent as $key => $value) { $sentences[] = [ 'id' => [ $value->book, $value->paragraph, $value->word_begin, $value->word_end, ], 'strlen' => $value->length ]; $totalLen += $value->length; } break; default: return false; break; } //render prompt $mdRender = new MdRender([ 'format' => 'prompt', 'footnote' => false, 'paragraph' => false, ]); $m = new \Mustache_Engine(array( 'entity_flags' => ENT_QUOTES, 'escape' => function ($value) { return $value; } )); # ai model $aiModel = AiModel::findOrFail($task->executor_id); $sumLen = 0; $mqData = []; foreach ($sentences as $key => $sentence) { $sumLen += $sentence['strlen']; $sid = implode('-', $sentence['id']); Log::debug($sid); $data['origin'] = '{{' . $sid . '}}'; $data['translation'] = '{{sent|id=' . $sid; $data['translation'] .= '|channel=' . $params['channel']; $data['translation'] .= '|text=translation}}'; if (isset($params['nissaya'])) { $data['nissaya'] = []; $nissayaChannels = explode(',', $params['nissaya']); foreach ($nissayaChannels as $key => $channel) { $channelInfo = ChannelApi::getById($channel); if (!$channelInfo) { continue; } //查看句子是否存在 $nissayaSent = Sentence::where('book_id', $sentence['id'][0]) ->where('paragraph', $sentence['id'][1]) ->where('word_start', $sentence['id'][2]) ->where('word_end', $sentence['id'][3]) ->where('channel_uid', $channel)->first(); if (!$nissayaSent) { continue; } if (empty($nissayaSent->content)) { continue; } $nissayaData = []; $nissayaData['channel'] = $channelInfo; $nissayaData['data'] = '{{sent|id=' . $sid; $nissayaData['data'] .= '|channel=' . $channel; $nissayaData['data'] .= '|text=translation}}'; $data['nissaya'][] = $nissayaData; } } $content = $m->render($description, $data); $prompt = $mdRender->convert($content, []); //gen mq $aiMqData = [ 'model' => $aiModel, 'task' => [ 'info' => $task, 'progress' => [ 'current' => $sumLen, 'total' => $totalLen ], ], 'prompt' => $prompt, 'sentence' => [ 'book_id' => $sentence['id'][0], 'paragraph' => $sentence['id'][1], 'word_start' => $sentence['id'][2], 'word_end' => $sentence['id'][3], 'channel_uid' => $params['channel'], 'content' => $prompt, 'content_type' => 'markdown', 'access_token' => $params['token'], ], ]; array_push($mqData, $aiMqData); if ($send) { Mq::publish('ai_translate', $aiMqData); } } return $mqData; } }