diff --git a/src/plugins/models/utils_model.py b/src/plugins/models/utils_model.py
index 26fa3f3e0..b092e5175 100644
--- a/src/plugins/models/utils_model.py
+++ b/src/plugins/models/utils_model.py
@@ -2,6 +2,7 @@ import aiohttp
import asyncio
import requests
import time
+import re
from typing import Tuple, Union
from nonebot import get_driver
from loguru import logger
@@ -10,6 +11,7 @@ from ..chat.config import global_config
driver = get_driver()
config = driver.config
+
class LLM_request:
def __init__(self, model, **kwargs):
# 将大写的配置键转换为小写并从config中获取实际值
@@ -28,21 +30,21 @@ class LLM_request:
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
-
+
# 构建请求体
data = {
"model": self.model_name,
"messages": [{"role": "user", "content": prompt}],
**self.params
}
-
+
# 发送请求到完整的chat/completions端点
api_url = f"{self.base_url.rstrip('/')}/chat/completions"
logger.info(f"发送请求到URL: {api_url}") # 记录请求的URL
-
+
max_retries = 3
base_wait_time = 15
-
+
for retry in range(max_retries):
try:
async with aiohttp.ClientSession() as session:
@@ -52,16 +54,16 @@ class LLM_request:
logger.warning(f"遇到请求限制(429),等待{wait_time}秒后重试...")
await asyncio.sleep(wait_time)
continue
-
+
response.raise_for_status() # 检查其他响应状态
-
+
result = await response.json()
if "choices" in result and len(result["choices"]) > 0:
content = result["choices"][0]["message"]["content"]
reasoning_content = result["choices"][0]["message"].get("reasoning_content", "")
return content, reasoning_content
return "没有返回结果", ""
-
+
except Exception as e:
if retry < max_retries - 1: # 如果还有重试机会
wait_time = base_wait_time * (2 ** retry)
@@ -70,7 +72,7 @@ class LLM_request:
else:
logger.critical(f"请求失败: {str(e)}", exc_info=True)
raise RuntimeError(f"API请求失败: {str(e)}")
-
+
logger.error("达到最大重试次数,请求仍然失败")
raise RuntimeError("达到最大重试次数,API请求仍然失败")
@@ -80,7 +82,7 @@ class LLM_request:
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
-
+
# 构建请求体
data = {
"model": self.model_name,
@@ -103,14 +105,14 @@ class LLM_request:
],
**self.params
}
-
+
# 发送请求到完整的chat/completions端点
api_url = f"{self.base_url.rstrip('/')}/chat/completions"
logger.info(f"发送请求到URL: {api_url}") # 记录请求的URL
-
+
max_retries = 3
base_wait_time = 15
-
+
for retry in range(max_retries):
try:
async with aiohttp.ClientSession() as session:
@@ -120,16 +122,23 @@ class LLM_request:
logger.warning(f"遇到请求限制(429),等待{wait_time}秒后重试...")
await asyncio.sleep(wait_time)
continue
-
+
response.raise_for_status() # 检查其他响应状态
-
+
result = await response.json()
if "choices" in result and len(result["choices"]) > 0:
- content = result["choices"][0]["message"]["content"]
- reasoning_content = result["choices"][0]["message"].get("reasoning_content", "")
+ message = result["choices"][0]["message"]
+ content = message.get("content", "")
+ think_match = None
+ reasoning_content = message.get("reasoning_content", "")
+ if not reasoning_content:
+ think_match = re.search(r'(.*?)', content, re.DOTALL)
+ if think_match:
+ reasoning_content = think_match.group(1).strip()
+ content = re.sub(r'.*?', '', content, flags=re.DOTALL).strip()
return content, reasoning_content
return "没有返回结果", ""
-
+
except Exception as e:
if retry < max_retries - 1: # 如果还有重试机会
wait_time = base_wait_time * (2 ** retry)
@@ -138,7 +147,7 @@ class LLM_request:
else:
logger.critical(f"请求失败: {str(e)}", exc_info=True)
raise RuntimeError(f"API请求失败: {str(e)}")
-
+
logger.error("达到最大重试次数,请求仍然失败")
raise RuntimeError("达到最大重试次数,API请求仍然失败")
@@ -148,7 +157,7 @@ class LLM_request:
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
-
+
# 构建请求体
data = {
"model": self.model_name,
@@ -171,33 +180,40 @@ class LLM_request:
],
**self.params
}
-
+
# 发送请求到完整的chat/completions端点
api_url = f"{self.base_url.rstrip('/')}/chat/completions"
logger.info(f"发送请求到URL: {api_url}") # 记录请求的URL
-
+
max_retries = 2
base_wait_time = 6
-
+
for retry in range(max_retries):
try:
response = requests.post(api_url, headers=headers, json=data, timeout=30)
-
+
if response.status_code == 429:
wait_time = base_wait_time * (2 ** retry)
logger.warning(f"遇到请求限制(429),等待{wait_time}秒后重试...")
time.sleep(wait_time)
continue
-
+
response.raise_for_status() # 检查其他响应状态
-
+
result = response.json()
if "choices" in result and len(result["choices"]) > 0:
- content = result["choices"][0]["message"]["content"]
- reasoning_content = result["choices"][0]["message"].get("reasoning_content", "")
+ message = result["choices"][0]["message"]
+ content = message.get("content", "")
+ think_match = None
+ reasoning_content = message.get("reasoning_content", "")
+ if not reasoning_content:
+ think_match = re.search(r'(.*?)', content, re.DOTALL)
+ if think_match:
+ reasoning_content = think_match.group(1).strip()
+ content = re.sub(r'.*?', '', content, flags=re.DOTALL).strip()
return content, reasoning_content
return "没有返回结果", ""
-
+
except Exception as e:
if retry < max_retries - 1: # 如果还有重试机会
wait_time = base_wait_time * (2 ** retry)
@@ -206,7 +222,7 @@ class LLM_request:
else:
logger.critical(f"请求失败: {str(e)}", exc_info=True)
raise RuntimeError(f"API请求失败: {str(e)}")
-
+
logger.error("达到最大重试次数,请求仍然失败")
raise RuntimeError("达到最大重试次数,API请求仍然失败")
@@ -224,36 +240,36 @@ class LLM_request:
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
-
+
data = {
"model": model,
"input": text,
"encoding_format": "float"
}
-
+
api_url = f"{self.base_url.rstrip('/')}/embeddings"
logger.info(f"发送请求到URL: {api_url}") # 记录请求的URL
-
+
max_retries = 2
base_wait_time = 6
-
+
for retry in range(max_retries):
try:
response = requests.post(api_url, headers=headers, json=data, timeout=30)
-
+
if response.status_code == 429:
wait_time = base_wait_time * (2 ** retry)
logger.warning(f"遇到请求限制(429),等待{wait_time}秒后重试...")
time.sleep(wait_time)
continue
-
+
response.raise_for_status()
-
+
result = response.json()
if 'data' in result and len(result['data']) > 0:
return result['data'][0]['embedding']
return None
-
+
except Exception as e:
if retry < max_retries - 1:
wait_time = base_wait_time * (2 ** retry)
@@ -262,7 +278,7 @@ class LLM_request:
else:
logger.critical(f"embedding请求失败: {str(e)}", exc_info=True)
return None
-
+
logger.error("达到最大重试次数,embedding请求仍然失败")
return None
@@ -280,19 +296,19 @@ class LLM_request:
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
-
+
data = {
"model": model,
"input": text,
"encoding_format": "float"
}
-
+
api_url = f"{self.base_url.rstrip('/')}/embeddings"
logger.info(f"发送请求到URL: {api_url}") # 记录请求的URL
-
+
max_retries = 3
base_wait_time = 15
-
+
for retry in range(max_retries):
try:
async with aiohttp.ClientSession() as session:
@@ -302,14 +318,14 @@ class LLM_request:
logger.warning(f"遇到请求限制(429),等待{wait_time}秒后重试...")
await asyncio.sleep(wait_time)
continue
-
+
response.raise_for_status()
-
+
result = await response.json()
if 'data' in result and len(result['data']) > 0:
return result['data'][0]['embedding']
return None
-
+
except Exception as e:
if retry < max_retries - 1:
wait_time = base_wait_time * (2 ** retry)
@@ -318,6 +334,6 @@ class LLM_request:
else:
logger.critical(f"embedding请求失败: {str(e)}", exc_info=True)
return None
-
+
logger.error("达到最大重试次数,embedding请求仍然失败")
- return None
\ No newline at end of file
+ return None