docs: v1.5.7 动态API提供商管理,OpenCode Go集成,Bug修复
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user