69 lines
3.2 KiB
Python

# File: backend/app/api/v1/endpoints/chat.py (更新)
# Description: 聊天功能的 API 路由 (使用更新后的 ChatService)
from fastapi import APIRouter, HTTPException, Depends, status
from app.models.pydantic_models import ChatRequest, ChatResponse, SessionCreateRequest
from app.services.chat_service import chat_service_instance, ChatService
from app.services.session_service import session_service_instance, SessionService # 导入 SessionService
router = APIRouter()
# --- 依赖注入 ---
def get_chat_service() -> ChatService:
return chat_service_instance
def get_session_service() -> SessionService:
return session_service_instance
@router.post("/", response_model=ChatResponse)
async def handle_chat_message(
request: ChatRequest,
chat_service: ChatService = Depends(get_chat_service),
session_service: SessionService = Depends(get_session_service) # 注入 SessionService
):
"""处理用户发送的聊天消息 (包含 assistantId 和 sessionId)"""
user_message = request.message
session_id = request.session_id
assistant_id = request.assistant_id
print(f"接收到消息: User='{user_message}', Session='{session_id}', Assistant='{assistant_id}'")
response_session_id = None
response_session_title = None
# --- 处理临时新会话 ---
if session_id == 'temp-new-chat':
print("检测到临时新会话,正在创建...")
try:
# 调用 SessionService 创建会话
create_req = SessionCreateRequest(assistant_id=assistant_id, first_message=user_message)
created_session = await session_service.create_session(create_req)
session_id = created_session.id # 使用新创建的会话 ID
response_session_id = created_session.id # 准备在响应中返回新 ID
response_session_title = created_session.title # 准备在响应中返回新标题
print(f"新会话已创建: ID={session_id}, Title='{created_session.title}'")
except ValueError as e: # 助手不存在等错误
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
except Exception as e: # LLM 调用或其他错误
print(f"创建会话时出错: {e}")
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="创建会话失败")
# --- 调用聊天服务获取回复 ---
try:
ai_reply = await chat_service.get_ai_reply(
user_message=user_message,
session_id=session_id, # 使用真实的或新创建的 session_id
assistant_id=assistant_id
)
print(f"发送 AI 回复: '{ai_reply}'")
return ChatResponse(
reply=ai_reply,
session_id=response_session_id, # 返回新 ID (如果创建了)
session_title=response_session_title # 返回新标题 (如果创建了)
)
except ValueError as e: # 助手不存在等错误
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
except Exception as e: # LLM 调用或其他错误
print(f"处理聊天消息时发生错误: {e}")
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e))