diff --git a/agent_core/llm_provider.py b/agent_core/llm_provider.py index 089177c..0b3846c 100644 --- a/agent_core/llm_provider.py +++ b/agent_core/llm_provider.py @@ -1,7 +1,7 @@ from dataclasses import dataclass import json import os -from urllib.error import URLError +from urllib.error import HTTPError, URLError from urllib.request import Request, urlopen @@ -75,12 +75,28 @@ class OpenAICompatibleProvider: if response_format: payload["response_format"] = response_format try: - data = _post_json( - base_url=self.base_url, - endpoint="chat/completions", - api_key=self.api_key, - payload=payload, - ) + try: + data = _post_json( + base_url=self.base_url, + endpoint="chat/completions", + api_key=self.api_key, + payload=payload, + ) + except RuntimeError as exc: + # 部分 OpenAI 兼容供应商或模型不支持 response_format。 + # 保留结构化优先,遇到 400 时退回普通对话,避免演示链路被接口能力差异阻断。 + if not response_format or "HTTP Error 400" not in str(exc): + raise + fallback_payload = { + "model": self.model_name, + "messages": messages, + } + data = _post_json( + base_url=self.base_url, + endpoint="chat/completions", + api_key=self.api_key, + payload=fallback_payload, + ) choice = data.get("choices", [{}])[0] content = choice.get("message", {}).get("content", "") return LLMResponse( @@ -197,5 +213,11 @@ def _post_json(base_url: str, endpoint: str, api_key: str, payload: dict) -> dic try: with urlopen(request, timeout=60) as response: return json.loads(response.read().decode("utf-8")) + except HTTPError as exc: + error_body = exc.read().decode("utf-8", errors="ignore") + error_detail = f"{exc}" + if error_body: + error_detail = f"{error_detail} {error_body}" + raise RuntimeError(f"OpenAI 兼容接口调用失败:{error_detail}") from exc except URLError as exc: raise RuntimeError(f"OpenAI 兼容接口调用失败:{exc}") from exc diff --git a/templates/chat/index.html b/templates/chat/index.html index b4c3c21..edbade6 100644 --- a/templates/chat/index.html +++ b/templates/chat/index.html @@ -359,33 +359,6 @@ {% endif %} - {% if conversation %} -
-
-

顶部对话上下文

-

进入会话后,先用当前批次、产品和风险状态快速建立审核上下文。

- -
- -
-

推荐提问模板

-

用这些提问模板快速进入目录汇总、完整性检查、字段抽取和风险分析。

-
- {% for item in prompt_templates %} - {{ item }} - {% endfor %} -
-
-
- {% endif %} -