feat(chat): 添加调用重试机制提升接口稳定性

- 引入 tenacity 库实现自动重试功能
- 在调用 OpenAI 接口的 call 方法上增加重试装饰器
- 设定重试次数、指数退避等待策略及日志记录
- 调整流式和非流式响应处理逻辑,保证重试生效
- 在 pyproject.toml 中添加 tenacity 依赖声明
This commit is contained in:
Wenjie Zhang 2025-09-19 01:10:20 +08:00
parent 347e7c5807
commit 63cceb4562
2 changed files with 26 additions and 14 deletions

View File

@ -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 # 代码最大行宽

View File

@ -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,