visuddhinanda 1 gadu atpakaļ
vecāks
revīzija
872f7acf88
1 mainītis faili ar 116 papildinājumiem un 0 dzēšanām
  1. 116 0
      api-v8/app/Console/Commands/AiSentenceTranslate.php

+ 116 - 0
api-v8/app/Console/Commands/AiSentenceTranslate.php

@@ -0,0 +1,116 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Illuminate\Console\Command;
+use App\Models\Sentence;
+use App\Models\PaliSentence;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\Http;
+
+class AiSentenceTranslate extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = <<<command
+    ai:sentence.translate 
+    {--api=  : ai engin url} 
+    {--model=  : ai model } 
+    {--sid=  : 句子编号 } 
+    {--nissaya=  : nissaya channel } 
+    {--result=  : result channel } 
+    command;
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '使用LLM 和nissaya数据翻译句子';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        //获取巴利句子
+        $sid = explode('-', $this->option('sid'));
+        $pali = PaliSentence::where('book', $sid[0])
+            ->where('paragraph', $sid[1])
+            ->where('word_begin', $sid[2])
+            ->where('word_end', $sid[3])
+            ->value('text');
+        //获取nissaya
+        $nissaya = Sentence::where('channel_uid', $this->option('nissaya'))
+            ->where('book_id', $sid[0])
+            ->where('paragraph', $sid[1])
+            ->where('word_start', $sid[2])
+            ->where('word_end', $sid[3])
+            ->value('content');
+        //获取ai结果
+        $api = $this->getEngin($this->option('api'));
+        if (!$api) {
+            $this->error('ai translate no api');
+            return 1;
+        }
+        $json = $this->fetch($api, $pali, $nissaya);
+        $this->info('ai translate', ['json' => $json]);
+        //写入
+        return 0;
+    }
+
+    private function getEngin($engin)
+    {
+        $api = config('mint.ai.accounts');
+        $selected = array_filter($api, function ($value) use ($engin) {
+            return $value['name'] === $engin;
+        });
+        if (!is_array($selected) || count($selected) === 0) {
+            return null;
+        }
+        return $selected[0];
+    }
+
+    private function fetch($api, $origin,  $nissaya = null)
+    {
+        $prompt = '翻译上面的巴利文为中文';
+        if ($nissaya) {
+            $prompt = '根据下面的解释,' . $prompt;
+        }
+        $message = "{$origin}\n\n{$prompt}\n\n{$nissaya}";
+
+        $url = $api['api_url'];
+        $param = [
+            "model" => $api['model'],
+            "messages" => [
+                ["role" => "system", "content" => "你是翻译人工智能助手,bhikkhu 为专有名词,不可翻译成其他语言。"],
+                ["role" => "user", "content" => $message],
+            ],
+            "temperature" => 0.3,
+        ];
+        $response = Http::withToken($api['token'])
+            ->post($url, $param);
+        if ($response->failed()) {
+            $this->error('http request error' . $response->json('message'));
+            Log::error('http request error', ['data' => $response->json()]);
+            return null;
+        } else {
+            return $response->json();
+        }
+    }
+}