数据库与模型:新增多版迁移(章节证据快照、对话血缘、记忆事实/时间线 lineage 等),把「成稿 ↔ 对话/记忆」的溯源信息落到表结构里。 业务链路:会话与 WS、回忆录/故事流水线、记忆写入与 enrichment 等跟着接上线索与快照;新增章节证据快照与评测侧 EvalTraceService 等模块,方便组评审用的证据包。 内部评测:自动化 run 与手工 memoir 评审共用可追溯证据;rubric/ judge 相关脚本与文档有配套调整。 app-eval-web:Memoir/实验详情里能展开看证据摘要与 evidence_trace(含对话轮次 id);Vite 代理与 development.sh 注入的 API 端口与当前默认内部评测端口一致,避免改端口后页面连错服务。 工程杂项:GitHub Actions / 仓库说明有更新;各适配器与支付/配额/plan 等多处为小改动或跟随主改动的收尾;新增/扩充了?
108 lines
3.5 KiB
Python
108 lines
3.5 KiB
Python
"""
|
|
对话 feature — conversations 路由
|
|
"""
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
|
|
from app.core.dependencies import get_current_user
|
|
from app.core.logging import get_logger
|
|
from app.features.conversation.deps import get_conversation_service
|
|
from app.features.conversation.service import ConversationService
|
|
from app.features.user.models import User
|
|
|
|
router = APIRouter(
|
|
prefix="/api/conversations",
|
|
tags=["conversations"],
|
|
responses={
|
|
401: {"description": "认证失败"},
|
|
403: {"description": "权限不足"},
|
|
404: {"description": "资源不存在"},
|
|
429: {"description": "配额已用尽"},
|
|
},
|
|
)
|
|
logger = get_logger(__name__)
|
|
|
|
|
|
@router.get("")
|
|
async def get_conversations(
|
|
current_user: User = Depends(get_current_user),
|
|
service: ConversationService = Depends(get_conversation_service),
|
|
):
|
|
"""获取当前用户的所有对话列表(需要认证)"""
|
|
return await service.list_for_user(current_user.id)
|
|
|
|
|
|
@router.post("")
|
|
async def create_conversation(
|
|
current_user: User = Depends(get_current_user),
|
|
service: ConversationService = Depends(get_conversation_service),
|
|
):
|
|
"""创建新对话(需要认证)。对话轮数在每次发送消息时校验。"""
|
|
return await service.create(current_user.id)
|
|
|
|
|
|
@router.get("/{conversation_id}")
|
|
async def get_conversation(
|
|
conversation_id: str,
|
|
current_user: User = Depends(get_current_user),
|
|
service: ConversationService = Depends(get_conversation_service),
|
|
):
|
|
"""获取对话详情(需要认证,只能访问自己的对话)"""
|
|
return await service.get_one(conversation_id, current_user.id)
|
|
|
|
|
|
@router.post("/{conversation_id}/end")
|
|
async def end_conversation(
|
|
conversation_id: str,
|
|
current_user: User = Depends(get_current_user),
|
|
service: ConversationService = Depends(get_conversation_service),
|
|
):
|
|
"""结束对话(需要认证,只能结束自己的对话)"""
|
|
return await service.end(conversation_id, current_user.id)
|
|
|
|
|
|
@router.delete("/{conversation_id}")
|
|
async def delete_conversation(
|
|
conversation_id: str,
|
|
current_user: User = Depends(get_current_user),
|
|
service: ConversationService = Depends(get_conversation_service),
|
|
):
|
|
"""删除对话(需要认证,只能删除自己的对话)"""
|
|
await service.delete(conversation_id, current_user.id)
|
|
return {"message": "对话已删除"}
|
|
|
|
|
|
@router.get("/{conversation_id}/messages")
|
|
async def get_messages(
|
|
conversation_id: str,
|
|
current_user: User = Depends(get_current_user),
|
|
service: ConversationService = Depends(get_conversation_service),
|
|
):
|
|
"""获取对话的消息列表(需要认证,只能访问自己的对话)"""
|
|
return await service.get_messages(conversation_id, current_user.id)
|
|
|
|
|
|
@router.post("/{conversation_id}/organize")
|
|
async def organize_conversation(
|
|
conversation_id: str,
|
|
current_user: User = Depends(get_current_user),
|
|
service: ConversationService = Depends(get_conversation_service),
|
|
):
|
|
"""
|
|
整理对话内容成章节(需要认证,只能整理自己的对话)
|
|
手动触发对话整理,将对话中的内容整理成回忆录章节
|
|
"""
|
|
try:
|
|
return await service.organize(
|
|
conversation_id,
|
|
current_user.id,
|
|
current_user.subscription_type,
|
|
)
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
logger.exception("提交整理任务失败: {}", e)
|
|
raise HTTPException(
|
|
status_code=500, detail="提交整理任务失败,请稍后重试"
|
|
) from e
|