feat(chat): 添加调用重试机制提升接口稳定性
- 引入 tenacity 库实现自动重试功能 - 在调用 OpenAI 接口的 call 方法上增加重试装饰器 - 设定重试次数、指数退避等待策略及日志记录 - 调整流式和非流式响应处理逻辑,保证重试生效 - 在 pyproject.toml 中添加 tenacity 依赖声明
This commit is contained in:
parent
347e7c5807
commit
63cceb4562
@ -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 # 代码最大行宽
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user