AiTaskPrepare.php 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <?php
  2. namespace App\Http\Api;
  3. use App\Models\Task;
  4. use App\Models\PaliText;
  5. use App\Models\PaliSentence;
  6. class AiTaskPrepare
  7. {
  8. public static function translate(string $taskId)
  9. {
  10. $task = Task::findOrFail($taskId);
  11. $description = $task->description;
  12. $rows = explode("\n", $description);
  13. $params = [];
  14. foreach ($rows as $key => $row) {
  15. if (strpos($row, '=') !== false) {
  16. $param = explode('=', $row);
  17. $params[$param[0]] = $param[1];
  18. }
  19. }
  20. if (!isset($param['type']) || !isset($param['book']) || !isset($param['para'])) {
  21. return false;
  22. }
  23. //get sentences in article
  24. $sentences = array();
  25. $totalLen = 0;
  26. switch ($param['type']) {
  27. case 'sentence':
  28. $sentences[] = explode('-', $param['id']);
  29. break;
  30. case 'paragraph':
  31. $sent = PaliSentence::where('book', $param['book'])
  32. ->where('paragraph', $param['para'])->orderBy('word_begin')->get();
  33. foreach ($sent as $key => $value) {
  34. $sentences[] = [$param['book'], $param['para'], $value->word_begin, $value->word_end];
  35. }
  36. break;
  37. case 'chapter':
  38. $chapterLen = PaliText::where('book', $param['book'])
  39. ->where('paragraph', $param['para'])->value('chapter_len');
  40. $sent = PaliSentence::where('book', $param['book'])
  41. ->whereBetween('paragraph', [$param['para'], $param['para'] + $chapterLen - 1])
  42. ->orderBy('paragraph')
  43. ->orderBy('word_begin')->get();
  44. foreach ($sent as $key => $value) {
  45. $sentences[] = [$param['book'], $param['para'], $value->word_begin, $value->word_end];
  46. }
  47. break;
  48. default:
  49. return false;
  50. break;
  51. }
  52. //render prompt
  53. $mdRender = new MdRender([
  54. 'format' => 'prompt',
  55. 'footnote' => false,
  56. 'paragraph' => false,
  57. ]);
  58. $m = new \Mustache_Engine(array(
  59. 'entity_flags' => ENT_QUOTES,
  60. 'escape' => function ($value) {
  61. return $value;
  62. }
  63. ));
  64. $params = [];
  65. foreach ($sentences as $key => $sentence) {
  66. $sid = implode('-', $sentence);
  67. $data['pali'] = '{{' . $sid . '}}';
  68. if (isset($param['nissaya'])) {
  69. $data['nissaya'] = '{{' . $sid . '@' . $param['nissaya'] . '}}';
  70. }
  71. $content = $m->render($description, $data);
  72. $prompt = $mdRender->convert($content, []);
  73. $params[] = $prompt;
  74. //gen mq
  75. }
  76. return $params;
  77. }
  78. }