配置 SSOT(TOML + .env) 统一错误契约 Auth 与事务边界 Redis / Celery 可靠性:业务 Redis(DB/0)与 Celery broker/backend(DB/1)显式拆分;连接池、sync client 可观测性(OpenTelemetry + LGTM)
104 lines
3.5 KiB
Python
104 lines
3.5 KiB
Python
"""
|
|
对话 feature — conversations 路由
|
|
"""
|
|
|
|
from fastapi import APIRouter, Depends
|
|
|
|
from app.core.deps_types import CurrentUserDep
|
|
from app.core.logging import get_logger
|
|
from app.core.openapi import error_responses
|
|
from app.features.conversation.deps import get_conversation_service
|
|
from app.features.conversation.schemas import (
|
|
ConversationDetailResponse,
|
|
ConversationListItemResponse,
|
|
CreateConversationResponse,
|
|
DeleteConversationResponse,
|
|
EndConversationResponse,
|
|
MessageResponse,
|
|
OrganizeResponse,
|
|
)
|
|
from app.features.conversation.service import ConversationService
|
|
|
|
router = APIRouter(
|
|
prefix="/api/conversations",
|
|
tags=["conversations"],
|
|
responses=error_responses(401, 403, 404, 429),
|
|
)
|
|
logger = get_logger(__name__)
|
|
|
|
|
|
@router.get("", response_model=list[ConversationListItemResponse])
|
|
async def get_conversations(
|
|
current_user: CurrentUserDep,
|
|
service: ConversationService = Depends(get_conversation_service),
|
|
):
|
|
"""获取当前用户的所有对话列表(需要认证)"""
|
|
return await service.list_for_user(current_user.id)
|
|
|
|
|
|
@router.post("", response_model=CreateConversationResponse)
|
|
async def create_conversation(
|
|
current_user: CurrentUserDep,
|
|
service: ConversationService = Depends(get_conversation_service),
|
|
):
|
|
"""创建新对话(需要认证)。对话轮数在每次发送消息时校验。"""
|
|
return await service.create(current_user.id)
|
|
|
|
|
|
@router.get("/{conversation_id}", response_model=ConversationDetailResponse)
|
|
async def get_conversation(
|
|
conversation_id: str,
|
|
current_user: CurrentUserDep,
|
|
service: ConversationService = Depends(get_conversation_service),
|
|
):
|
|
"""获取对话详情(需要认证,只能访问自己的对话)"""
|
|
return await service.get_one(conversation_id, current_user.id)
|
|
|
|
|
|
@router.post("/{conversation_id}/end", response_model=EndConversationResponse)
|
|
async def end_conversation(
|
|
conversation_id: str,
|
|
current_user: CurrentUserDep,
|
|
service: ConversationService = Depends(get_conversation_service),
|
|
):
|
|
"""结束对话(需要认证,只能结束自己的对话)"""
|
|
return await service.end(conversation_id, current_user.id)
|
|
|
|
|
|
@router.delete("/{conversation_id}", response_model=DeleteConversationResponse)
|
|
async def delete_conversation(
|
|
conversation_id: str,
|
|
current_user: CurrentUserDep,
|
|
service: ConversationService = Depends(get_conversation_service),
|
|
):
|
|
"""删除对话(需要认证,只能删除自己的对话)"""
|
|
await service.delete(conversation_id, current_user.id)
|
|
return {"message": "对话已删除"}
|
|
|
|
|
|
@router.get("/{conversation_id}/messages", response_model=list[MessageResponse])
|
|
async def get_messages(
|
|
conversation_id: str,
|
|
current_user: CurrentUserDep,
|
|
service: ConversationService = Depends(get_conversation_service),
|
|
):
|
|
"""获取对话的消息列表(需要认证,只能访问自己的对话)"""
|
|
return await service.get_messages(conversation_id, current_user.id)
|
|
|
|
|
|
@router.post("/{conversation_id}/organize", response_model=OrganizeResponse)
|
|
async def organize_conversation(
|
|
conversation_id: str,
|
|
current_user: CurrentUserDep,
|
|
service: ConversationService = Depends(get_conversation_service),
|
|
):
|
|
"""
|
|
整理对话内容成章节(需要认证,只能整理自己的对话)
|
|
手动触发对话整理,将对话中的内容整理成回忆录章节
|
|
"""
|
|
return await service.organize(
|
|
conversation_id,
|
|
current_user.id,
|
|
current_user.subscription_type,
|
|
)
|