Browse Source

Merge pull request #2339 from visuddhinanda/development

Development
visuddhinanda 8 months ago
parent
commit
c05cf7c129

+ 1 - 2
ai-translate/README.md

@@ -9,8 +9,7 @@ $ source $HOME/tmp/python3/bin/activate
 > python3 -m pip install -e .
 
 > python3 -m ai_translate -h
-> python3 -m ai_translate -d -c config.toml -n worker-us-1 -q ai_translate_us
-> python3 -m ai_translate -d -c config.toml -n worker-cn-1 -q ai_translate_cn
+> python3 -m ai_translate -d -c config.toml -n worker-us-1 -q ai_translate_v2
 
 # exit the virtual env
 > deactivate

+ 70 - 31
ai-translate/ai_translate/service.py

@@ -188,13 +188,15 @@ class AiTranslateService:
             s_uid = self._get_sentence_id(message.sentence)
 
             # 写入句子 discussion
-            topic_children = []
-            # 任务结果
-            topic_children.append(response_llm['content'])
-            # 推理过程写入discussion
-            if response_llm.get('reasoningContent'):
-                topic_children.append(response_llm['reasoningContent'])
-            self._sentence_discussion(s_uid, message.prompt, topic_children)
+            if s_uid:
+                topic_children = []
+                # 任务结果
+                topic_children.append(response_llm['content'])
+                # 推理过程写入discussion
+                if response_llm.get('reasoningContent'):
+                    topic_children.append(response_llm['reasoningContent'])
+                self._sentence_discussion(
+                    s_uid, message.prompt, topic_children)
 
             # 修改task 完成度
             progress = self._set_task_progress(
@@ -491,29 +493,34 @@ class AiTranslateService:
 
     def _get_sentence_id(self, sentence: Sentence) -> str:
         """获取句子ID"""
-        url = f"{self.api_url}/v2/sentence-info/aa"
-        logger.info(f'ai translate: {url}')
-
-        params = {
-            'book': sentence.book_id,
-            'par': sentence.paragraph,
-            'start': sentence.word_start,
-            'end': sentence.word_end,
-            'channel': sentence.channel_uid
-        }
-
-        headers = {'Authorization': f'Bearer {self.model_token}'}
-        response = requests.get(
-            url, params=params, headers=headers, timeout=self.api_timeout)
-
-        if not response.json().get('ok'):
-            logger.error(f'{self.queue} sentence id error: {response.json()}')
+        try:
+            url = f"{self.api_url}/v2/sentence-info/aa"
+            logger.info(f'ai translate: {url}')
+
+            params = {
+                'book': sentence.book_id,
+                'par': sentence.paragraph,
+                'start': sentence.word_start,
+                'end': sentence.word_end,
+                'channel': sentence.channel_uid
+            }
+
+            headers = {'Authorization': f'Bearer {self.model_token}'}
+            response = requests.get(
+                url, params=params, headers=headers, timeout=self.api_timeout)
+
+            if not response.json().get('ok'):
+                logger.error(
+                    f'{self.queue} sentence id error: {response.text}')
+                return False
+
+            s_uid = response.json()['data']['id']
+            logger.debug(f"sentence id={s_uid}")
+            return s_uid
+        except Exception as e:
+            logger.error(f"error: {e}")
             return False
 
-        s_uid = response.json()['data']['id']
-        logger.debug(f"sentence id={s_uid}")
-        return s_uid
-
     def _set_task_progress(self, current: TaskProgress) -> int:
         """设置任务进度"""
         if current.total > 0:
@@ -542,7 +549,7 @@ class AiTranslateService:
 
         return progress
 
-    def handle_failed_translate(self, message_id: str, translate_data: List[Any], exception: Exception):
+    def handle_failed(self, message_id: str, message: str, exception: Exception):
         """处理失败的翻译任务"""
         try:
             # 彻底失败时的业务逻辑
@@ -551,13 +558,45 @@ class AiTranslateService:
 
             # 将故障信息写入task discussion
             if self.task_topic_id:
-                error_message = f"**处理失败ai任务时出错** 请重启任务 message id={message_id} 错误信息:{str(exception)}"
+                error_message = f"**任务处理失败** 请重启任务 \n- message id={message_id} \n- 错误信息:{message} \n- 异常:{str(exception)}"
                 d_id = self._task_discussion(
                     self.task.id,
                     'task',
-                    self.task.title,
+                    '任务处理失败',
                     error_message,
                     self.task_topic_id
                 )
         except Exception as e:
             logger.error(f'处理失败ai任务时出错: {str(e)}')
+
+    def handle_retry(self, message_id: str, message: str, exception: Exception):
+        """处理失败的翻译任务"""
+        try:
+            # 失败时的业务逻辑
+
+            # 将故障信息写入task discussion
+            if self.task_topic_id:
+                error_message = f"任务处理出错 正在重试 \n- message id={message_id} \n- 错误信息:{message} \n- 异常:{str(exception)}"
+                d_id = self._task_discussion(
+                    self.task.id,
+                    'task',
+                    '任务处理出错',
+                    error_message,
+                    self.task_topic_id
+                )
+        except Exception as e:
+            logger.error(f'处理失败ai任务时出错: {str(e)}')
+
+    def handle_complete(self):
+        try:
+            # 将故障信息写入task discussion
+            if self.task_topic_id:
+                d_id = self._task_discussion(
+                    self.task.id,
+                    'task',
+                    '任务处理完成',
+                    '任务处理完成',
+                    self.task_topic_id
+                )
+        except Exception as e:
+            logger.error(f'处理任务完成时出错: {str(e)}')

+ 11 - 4
ai-translate/ai_translate/worker.py

@@ -17,13 +17,16 @@ def handle_message(redis, ch, method, id, content_type, body, api_url: str, open
         consumer.process_translate(id, messages[0])
         logger.info(f'message {id} ack')
         ch.basic_ack(delivery_tag=method.delivery_tag)  # 确认消息
+        consumer.handle_complete()
     except SectionTimeout as e:
         # 时间到了,活还没干完 NACK 并重新入队
         logger.warning(
             f'time is not enough for complete current message id={id}. requeued')
         ch.basic_nack(delivery_tag=method.delivery_tag, requeue=True)
     except LLMFailException as e:
-        logger.warning(f'message {id} LLMFailException')
+        errMsg = f'message {id} LLM Fail'
+        logger.warning(errMsg)
+        consumer.handle_failed(id, errMsg, e)
         ch.basic_nack(delivery_tag=method.delivery_tag,
                       requeue=False)
     except Exception as e:
@@ -33,8 +36,10 @@ def handle_message(redis, ch, method, id, content_type, body, api_url: str, open
         retryKey = f'{redis[1]}/message/retry/{id}'
         retry = int(redis[0].get(retryKey)
                     or 0) if redis[0].exists(retryKey) else 0
-        if retry > MaxRetry:
-            logger.warning(f'超过最大重试次数[{MaxRetry}],任务失败 id={id}')
+        if retry >= MaxRetry:
+            errMsg = f'超过最大重试次数[{MaxRetry}],任务失败 id={id}'
+            logger.warning(errMsg)
+            consumer.handle_failed(id, errMsg, e)
             # NACK 丢弃或者进入死信队列
             ch.basic_nack(delivery_tag=method.delivery_tag,
                           requeue=False)
@@ -42,7 +47,9 @@ def handle_message(redis, ch, method, id, content_type, body, api_url: str, open
             retry = retry+1
             redis[0].set(retryKey, retry)
             # NACK 并重新入队
-            logger.warning(f'消息处理错误,重新压入队列 [{retry}/{MaxRetry}]')
+            errMsg = f'消息处理错误,重新压入队列 [{retry}/{MaxRetry}]'
+            logger.warning(errMsg)
+            consumer.handle_retry(id, errMsg, e)
             ch.basic_nack(delivery_tag=method.delivery_tag, requeue=True)
     finally:
         is_stopped()

+ 3 - 0
api-v8/app/Http/Api/AiAssistantApi.php

@@ -48,6 +48,9 @@ class AiAssistantApi
                 if (strpos($user->model, $key) !== false) {
                     $logo = $value;
                     break;
+                } else if (strpos($user->url, $key) !== false) {
+                    $logo = $value;
+                    break;
                 }
             }
             $base = config('app.url') . '/assets/images/avatar/';

BIN
api-v8/public/assets/images/avatar/openai.png