优化输出
All checks were successful
构建并部署 AI Agent 服务 / deploy (push) Successful in 6m6s

This commit is contained in:
2026-05-09 01:51:18 +08:00
parent b30f7b00a7
commit 4c119073bc
18 changed files with 973 additions and 2941 deletions

View File

@@ -3,6 +3,7 @@ FastAPI 后端 - 支持动态模型切换,使用 PostgreSQL 持久化记忆
采用依赖注入模式,优雅管理资源生命周期
"""
import asyncio
import warnings
# 抑制 WebSocket 弃用警告websockets 库升级导致uvicorn 尚未跟进)
warnings.filterwarnings("ignore", category=DeprecationWarning, module="websockets")
@@ -42,6 +43,7 @@ from backend.app.subgraphs.news_analysis.api_client import NewsAPIClient
from .db.init_db import init_subgraph_tables
from .db.models import ContactRepository, DictionaryRepository, NewsRepository
from backend.app.logger import info, error
from backend.app.core import get_formatter
@asynccontextmanager
async def lifespan(app: FastAPI):
@@ -189,30 +191,35 @@ async def chat_endpoint(
)
except Exception as e:
error(f"同步响应异常: {e}")
# === 兜底输出机制 ===
# === 统一错误格式化 ===
error_message = str(e)
is_timeout_error = any(keyword in error_message.lower() for keyword in
is_timeout_error = any(keyword in error_message.lower() for keyword in
["timeout", "timed out", "超时", "connection", "unavailable", "不可用"])
# 1. 自我介绍
intro_text = "你好!我是 AI 智能助手,我可以帮你处理各种问题,包括查询通讯录、词典翻译、新闻分析、知识库检索、联网搜索等。\n\n"
# 2. 错误信息(红色突出)
error_display = f"**⚠️ 当前遇到问题**\n\n```diff\n- {error_message}\n```\n\n"
# 3. 模型切换提示(如果是超时/不可用错误)
switch_hint = ""
formatter = get_formatter()
if is_timeout_error:
switch_hint = "💡 **提示**:当前模型可能响应超时或不可用,请尝试手动切换到其他模型(如 DeepSeek、智谱AI等\n\n"
# 4. 组合完整兜底回复
fallback_text = intro_text + error_display + switch_hint
error_reply = formatter.render_error(
error_type="模型响应超时",
error_message=error_message,
suggestions=[
"当前模型可能响应超时或不可用",
"请尝试手动切换到其他模型(如 DeepSeek、智谱AI等",
"或稍后重试"
],
)
else:
error_reply = formatter.render_error(
error_type="处理异常",
error_message=error_message,
suggestions=["请稍后重试", "如果问题持续存在,请联系管理员"],
)
actual_model = request.model if request.model in agent_service.graphs else next(iter(agent_service.graphs.keys()))
return ChatResponse(
reply=fallback_text,
reply=error_reply,
thread_id=thread_id,
model_used=actual_model,
input_tokens=0,
@@ -273,33 +280,36 @@ async def chat_stream_endpoint(
yield "data: [DONE]\n\n"
except Exception as e:
error(f"流式响应异常: {e}")
# === 兜底输出机制 ===
# === 统一错误格式化 ===
error_message = str(e)
is_timeout_error = any(keyword in error_message.lower() for keyword in
is_timeout_error = any(keyword in error_message.lower() for keyword in
["timeout", "timed out", "超时", "connection", "unavailable", "不可用"])
# 1. 自我介绍
intro_text = "你好!我是 AI 智能助手,我可以帮你处理各种问题,包括查询通讯录、词典翻译、新闻分析、知识库检索、联网搜索等。\n\n"
# 2. 错误信息(红色突出)
error_display = f"**⚠️ 当前遇到问题**\n\n```diff\n- {error_message}\n```\n\n"
# 3. 模型切换提示(如果是超时/不可用错误)
switch_hint = ""
formatter = get_formatter()
if is_timeout_error:
switch_hint = "💡 **提示**:当前模型可能响应超时或不可用,请尝试手动切换到其他模型(如 DeepSeek、智谱AI等\n\n"
# 4. 组合完整兜底回复
fallback_text = intro_text + error_display + switch_hint
# 5. 以 llm_token 方式发送兜底回复,模拟打字机效果
for char in fallback_text:
yield f"data: {json.dumps({'type': 'llm_token', 'node': 'fallback', 'token': char}, ensure_ascii=False)}\n\n"
error_reply = formatter.render_error(
error_type="模型响应超时",
error_message=error_message,
suggestions=[
"当前模型可能响应超时或不可用",
"请尝试手动切换到其他模型(如 DeepSeek、智谱AI等",
],
)
else:
error_reply = formatter.render_error(
error_type="处理异常",
error_message=error_message,
suggestions=["请稍后重试"],
)
# 以 llm_token 方式发送错误回复,模拟打字机效果
for char in error_reply:
yield f"data: {json.dumps({'type': 'llm_token', 'node': 'error', 'token': char}, ensure_ascii=False)}\n\n"
import asyncio
await asyncio.sleep(0.01)
# 6. 发送错误事件
yield f"data: {json.dumps({'type': 'error', 'message': error_message}, ensure_ascii=False)}\n\n"
yield "data: [DONE]\n\n"