feat(ai): add retry + fallback model for Groq 500 errors

This commit is contained in:
2569718930@qq.com
2026-02-27 13:26:53 +08:00
parent 78173765c5
commit 652774c127
+31 -7
View File
@@ -1,18 +1,24 @@
import os import os
import time
import requests import requests
from loguru import logger from loguru import logger
# 主力模型 + 备用模型(当主力 500 时自动降级)
MODELS = [
"llama-3.3-70b-versatile",
"llama-3.1-8b-instant",
]
def get_ai_analysis(weather_insights: str, city_name: str, temp_symbol: str) -> str: def get_ai_analysis(weather_insights: str, city_name: str, temp_symbol: str) -> str:
""" """
通过 Groq API (LLaMA 3.3 70B) 对天气态势进行极速交易分析 通过 Groq API (LLaMA 3.3 70B) 对天气态势进行极速交易分析
内置自动重试 + 模型降级机制
""" """
api_key = os.getenv("GROQ_API_KEY") api_key = os.getenv("GROQ_API_KEY")
if not api_key: if not api_key:
logger.warning("GROQ_API_KEY 未配置,跳过 AI 分析") logger.warning("GROQ_API_KEY 未配置,跳过 AI 分析")
return "" return ""
try:
# Groq 完全兼容 OpenAI 的 API 格式,直接用 requests 简单直观
url = "https://api.groq.com/openai/v1/chat/completions" url = "https://api.groq.com/openai/v1/chat/completions"
headers = { headers = {
"Authorization": f"Bearer {api_key}", "Authorization": f"Bearer {api_key}",
@@ -43,8 +49,11 @@ def get_ai_analysis(weather_insights: str, city_name: str, temp_symbol: str) ->
- 🎯 置信度: [1-10]/10 - 🎯 置信度: [1-10]/10
""" """
for model in MODELS:
for attempt in range(2): # 每个模型最多重试 2 次
try:
payload = { payload = {
"model": "llama-3.3-70b-versatile", # 使用标准稳定的 70B 模型 "model": model,
"messages": [ "messages": [
{"role": "system", "content": "你是不讲废话、只看数据的专业气象分析师。"}, {"role": "system", "content": "你是不讲废话、只看数据的专业气象分析师。"},
{"role": "user", "content": prompt} {"role": "user", "content": prompt}
@@ -53,14 +62,29 @@ def get_ai_analysis(weather_insights: str, city_name: str, temp_symbol: str) ->
"max_tokens": 150 "max_tokens": 150
} }
# 索非亚直连应该没问题 response = requests.post(url, json=payload, headers=headers, timeout=15)
response = requests.post(url, json=payload, headers=headers, timeout=10)
response.raise_for_status() response.raise_for_status()
result = response.json() result = response.json()
content = result['choices'][0]['message']['content'].strip() content = result['choices'][0]['message']['content'].strip()
if model != MODELS[0]:
logger.info(f"Groq 降级到备用模型 {model} 成功")
return content return content
except requests.exceptions.HTTPError as e:
status = e.response.status_code if e.response is not None else 0
if status in (500, 502, 503) and attempt == 0:
logger.warning(f"Groq {model} 返回 {status}{1.5}s 后重试...")
time.sleep(1.5)
continue
else:
logger.warning(f"Groq {model} 失败 (HTTP {status}),尝试下一个模型...")
break # 换下一个模型
except Exception as e: except Exception as e:
logger.error(f"Groq API 调用失败: {e}") logger.warning(f"Groq {model} 异常: {e},尝试下一个模型...")
return f"\n⚠️ Groq 分析暂不可用 ({str(e)[:30]})" break
logger.error("所有 Groq 模型均不可用")
return "\n⚠️ Groq AI 暂时不可用,请稍后再试"