docs: v1.5.7 动态API提供商管理,OpenCode Go集成,Bug修复

This commit is contained in:
hmo
2026-05-05 15:53:24 +08:00
parent ea29c77fe3
commit 30fbe92b9a
11 changed files with 594 additions and 231 deletions
+44 -13
View File
@@ -321,7 +321,7 @@ def generate_ai_report(
"model": model,
"messages": [{"role": "user", "content": prompt}],
"temperature": temperature,
"max_tokens": 2000,
"max_tokens": 4096,
}
# 确定 endpoint
@@ -330,40 +330,71 @@ def generate_ai_report(
else:
endpoint = f"{base_url}/chat/completions"
# 调试信息
req_info = {"endpoint": endpoint, "model": model, "provider": provider}
try:
response = requests.post(
endpoint,
headers=headers,
json=payload,
timeout=60,
timeout=180,
allow_redirects=False,
)
if response.status_code == 200:
result = response.json()
try:
result = response.json()
except Exception as je:
raw_text = response.text[:300] if response.text else "(empty body)"
return prompt, None, f"API返回非JSON [{endpoint}]: {raw_text}", None
# MiniMax (Anthropic格式) 返回结构不同
if provider == "minimax":
# MiniMax 返回的 content 可能是 [{"type": "thinking", ...}, {"type": "text", "text": "..."}]
content_list = result.get("content", [])
content = ""
for item in content_list:
if item.get("type") == "text":
content = item.get("text", "")
break
extra = {"finish_reason": "n/a"}
else:
content = (
result.get("choices", [{}])[0].get("message", {}).get("content", "")
)
return prompt, content, None, None
choice = result.get("choices", [{}])[0]
content = choice.get("message", {}).get("content", "")
finish = choice.get("finish_reason", "missing")
usage = result.get("usage", {})
# 调试信息
extra = {
"finish_reason": finish,
"prompt_tokens": usage.get("prompt_tokens", 0),
"completion_tokens": usage.get("completion_tokens", 0),
"raw_keys": list(result.keys()),
}
if not content or not content.strip():
err_detail = "API返回空内容"
if extra.get("finish_reason", "") not in ("", "n/a"):
err_detail += f" (finish_reason={extra['finish_reason']})"
if extra.get("completion_tokens", 0) > 0:
err_detail += f", 有{extra['completion_tokens']}个输出token但content为空"
if extra.get("raw_keys"):
err_detail += f", 响应keys={extra['raw_keys']}"
return prompt, None, err_detail, extra
return prompt, content, None, extra
else:
error_msg = f"API错误: {response.status_code}"
error_msg = f"API返回HTTP {response.status_code}"
if response.status_code in (301, 302, 303, 307, 308):
loc = response.headers.get("Location", "unknown")
error_msg += f" 重定向到: {loc}"
try:
error_detail = response.json()
error_msg = error_detail.get("error", {}).get("message", error_msg)
error_body = response.json()
error_msg += ": " + error_body.get("error", {}).get("message", str(error_body)[:200])
except:
pass
raw = response.text[:200] if response.text else "(empty)"
error_msg += ": " + raw
return prompt, None, error_msg, None
except requests.exceptions.Timeout:
return prompt, None, "API请求超时,请稍后重试", None
return prompt, None, "AI响应超时(等待180秒),网络较慢或模型负载高,请重试", None
except requests.exceptions.ConnectionError as e:
return prompt, None, f"无法连接到API服务器,请检查网络或Endpoint配置", None
except Exception as e:
return prompt, None, f"调用API失败: {str(e)}", None