From 63cceb4562eec647992686a4770f383927aeaf02 Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Fri, 19 Sep 2025 01:10:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(chat):=20=E6=B7=BB=E5=8A=A0=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E9=87=8D=E8=AF=95=E6=9C=BA=E5=88=B6=E6=8F=90=E5=8D=87?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=A8=B3=E5=AE=9A=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 引入 tenacity 库实现自动重试功能 - 在调用 OpenAI 接口的 call 方法上增加重试装饰器 - 设定重试次数、指数退避等待策略及日志记录 - 调整流式和非流式响应处理逻辑,保证重试生效 - 在 pyproject.toml 中添加 tenacity 依赖声明 --- pyproject.toml | 1 + src/models/chat_model.py | 39 +++++++++++++++++++++++++-------------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 66ef321d..a8e3003e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,6 +55,7 @@ dependencies = [ "minio>=7.2.7", "Pillow>=10.5.0", "pymysql>=1.1.0", + "tenacity>=8.0.0", ] [tool.ruff] line-length = 120 # 代码最大行宽 diff --git a/src/models/chat_model.py b/src/models/chat_model.py index 831b0a72..b2392788 100644 --- a/src/models/chat_model.py +++ b/src/models/chat_model.py @@ -2,6 +2,7 @@ import os import traceback from openai import OpenAI +from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type, before_sleep_log, after_log from src import config from src.utils import get_docker_safe_url, logger @@ -15,27 +16,24 @@ class OpenAIBase: self.model_name = model_name self.info = kwargs + @retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=1, max=10), + retry=retry_if_exception_type((Exception,)), + before_sleep=before_sleep_log(logger, log_level="WARNING"), + reraise=True + ) def call(self, message, stream=False): if isinstance(message, str): messages = [{"role": "user", "content": message}] else: messages = message - if stream: - return self._stream_response(messages) - else: - return self._get_response(messages) - - def _stream_response(self, messages): try: - response = self.client.chat.completions.create( - model=self.model_name, - messages=messages, - stream=True, - ) - for chunk in response: - if len(chunk.choices) > 0: - yield chunk.choices[0].delta + if stream: + response = self._stream_response(messages) + else: + response = self._get_response(messages) except Exception as e: err = ( @@ -45,6 +43,19 @@ class OpenAIBase: logger.error(err) raise Exception(err) + return response + + def _stream_response(self, messages): + response = self.client.chat.completions.create( + model=self.model_name, + messages=messages, + stream=True, + ) + for chunk in response: + if len(chunk.choices) > 0: + yield chunk.choices[0].delta + + def _get_response(self, messages): response = self.client.chat.completions.create( model=self.model_name,