Files
moss-ai/app/backend-python/api/chat.py
雷雨 8635b84b2d init
2025-12-15 22:05:56 +08:00

99 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
聊天 API 路由
"""
import logging
from uuid import uuid4
from fastapi import APIRouter, HTTPException, status
from fastapi.responses import JSONResponse
from models.chat import ChatRequest, ChatResponse, ErrorResponse
from services.conductor_service import conductor_service
logger = logging.getLogger(__name__)
router = APIRouter()
@router.post("/chat", response_model=ChatResponse)
async def chat(request: ChatRequest):
"""
聊天接口
接收前端消息,转发给 Conductor Agent返回 AI 回复
同时将对话记录和设备操作记录存储到数据库
"""
try:
# 如果没有提供 context_id生成一个新的
context_id = request.context_id or f"session-{uuid4().hex[:16]}"
logger.info(f"💬 收到聊天请求: {request.query[:50]}... (user: {request.system_user_id}, context: {context_id})")
# 调用 Conductor Agent传递用户ID
# conductor_service 已经处理了数据库存储逻辑
result = await conductor_service.send_message(
user_message=request.query,
system_user_id=request.system_user_id,
context_id=context_id
)
# 构建响应
response = ChatResponse(
content=result["content"],
context_id=result["context_id"],
task_id=result.get("task_id"),
status=result["status"]
)
# 根据状态记录不同的日志
if result["status"] == "success":
logger.info(f"✅ 聊天响应成功: {len(result['content'])} 字符")
else:
logger.warning(f"⚠️ 聊天响应包含错误: status={result['status']}")
return response
except Exception as e:
logger.error(f"❌ 聊天请求失败: {e}", exc_info=True)
# 注意conductor_service 已经保存了错误到数据库
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail={
"error": "ChatError",
"message": str(e)
}
)
@router.get("/chat/health")
async def chat_health():
"""检查聊天服务健康状态"""
try:
is_connected = await conductor_service.test_connection()
if is_connected:
return {
"status": "healthy",
"conductor_agent": "connected",
"url": conductor_service.base_url
}
else:
return JSONResponse(
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
content={
"status": "unhealthy",
"conductor_agent": "disconnected",
"url": conductor_service.base_url
}
)
except Exception as e:
logger.error(f"健康检查失败: {e}")
return JSONResponse(
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
content={
"status": "error",
"message": str(e)
}
)