AiTaskPrepare.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <?php
  2. namespace App\Http\Api;
  3. use App\Models\Task;
  4. use App\Models\PaliText;
  5. use App\Models\PaliSentence;
  6. use App\Models\AiModel;
  7. use App\Http\Api\Mq;
  8. use Illuminate\Support\Facades\Log;
  9. class AiTaskPrepare
  10. {
  11. public static function translate(string $taskId)
  12. {
  13. $task = Task::findOrFail($taskId);
  14. $description = $task->description;
  15. $rows = explode("\n", $description);
  16. $params = [];
  17. foreach ($rows as $key => $row) {
  18. if (strpos($row, '=') !== false) {
  19. $param = explode('=', trim($row, '|'));
  20. $params[$param[0]] = $param[1];
  21. }
  22. }
  23. if (!isset($params['type']) || !isset($params['book']) || !isset($params['para'])) {
  24. return false;
  25. }
  26. //get sentences in article
  27. $sentences = array();
  28. $totalLen = 0;
  29. switch ($params['type']) {
  30. case 'sentence':
  31. $sentences[] = explode('-', $params['id']);
  32. break;
  33. case 'paragraph':
  34. $sent = PaliSentence::where('book', $params['book'])
  35. ->where('paragraph', $params['para'])->orderBy('word_begin')->get();
  36. foreach ($sent as $key => $value) {
  37. $sentences[] = [
  38. $value->book,
  39. $value->paragraph,
  40. $value->word_begin,
  41. $value->word_end,
  42. $value->length
  43. ];
  44. $totalLen += $value->length;
  45. }
  46. break;
  47. case 'chapter':
  48. $chapterLen = PaliText::where('book', $params['book'])
  49. ->where('paragraph', $params['para'])->value('chapter_len');
  50. $sent = PaliSentence::where('book', $params['book'])
  51. ->whereBetween('paragraph', [$params['para'], $params['para'] + $chapterLen - 1])
  52. ->orderBy('paragraph')
  53. ->orderBy('word_begin')->get();
  54. foreach ($sent as $key => $value) {
  55. $sentences[] = [
  56. $value->book,
  57. $value->paragraph,
  58. $value->word_begin,
  59. $value->word_end,
  60. $value->length
  61. ];
  62. $totalLen += $value->length;
  63. }
  64. break;
  65. default:
  66. return false;
  67. break;
  68. }
  69. //render prompt
  70. $mdRender = new MdRender([
  71. 'format' => 'prompt',
  72. 'footnote' => false,
  73. 'paragraph' => false,
  74. ]);
  75. $m = new \Mustache_Engine(array(
  76. 'entity_flags' => ENT_QUOTES,
  77. 'escape' => function ($value) {
  78. return $value;
  79. }
  80. ));
  81. # ai model
  82. if (!isset($params['{{ai|model'])) {
  83. return false;
  84. }
  85. $modelId = trim($params['{{ai|model'], '}');
  86. $aiModel = AiModel::findOne($modelId);
  87. $aiPrompts = [];
  88. $sumLen = 0;
  89. foreach ($sentences as $key => $sentence) {
  90. $sumLen += $sentence[4];
  91. $sid = implode('-', $sentence);
  92. Log::debug($sid);
  93. $data['pali'] = '{{' . $sid . '}}';
  94. if (isset($params['nissaya'])) {
  95. $data['nissaya'] = '{{' . $sid . '@' . $params['nissaya'] . '}}';
  96. }
  97. $content = $m->render($description, $data);
  98. $prompt = $mdRender->convert($content, []);
  99. $aiPrompts[] = $prompt;
  100. //gen mq
  101. $aiMqData = [
  102. 'model' => $aiModel,
  103. 'task' => [
  104. 'task_id' => $taskId,
  105. 'progress' => (int)($sumLen * 100 / $totalLen),
  106. ],
  107. 'sentence' => [
  108. 'book_id' => $sentence[0],
  109. 'paragraph' => $sentence[1],
  110. 'word_start' => $sentence[2],
  111. 'word_end' => $sentence[3],
  112. 'channel_uid' => $params['channel'],
  113. 'content' => $prompt,
  114. 'content_type' => 'markdown',
  115. 'access_token' => $params['token'],
  116. ],
  117. ];
  118. Mq::publish('ai_translate', $aiMqData);
  119. }
  120. return $aiPrompts;
  121. }
  122. }