"""Memory 策展与内部扩展 API。""" from fastapi import APIRouter, Depends, status from pydantic import BaseModel, Field from app.core.deps_types import CurrentUserDep from app.core.errors import NotFoundError from app.features.memory.deps import get_memory_service from app.features.memory.service import MemoryService from app.features.user.models import User router = APIRouter(prefix="/api/memory", tags=["memory"]) class ExcludeBody(BaseModel): reason: str = Field(default="", max_length=2000) class RejectFactBody(BaseModel): reason: str = Field(default="", max_length=2000) @router.post("/chunks/{chunk_id}/exclude", status_code=status.HTTP_204_NO_CONTENT) async def exclude_chunk( chunk_id: str, current_user: CurrentUserDep, memory: MemoryService = Depends(get_memory_service), body: ExcludeBody | None = None, ): reason = (body.reason if body else "") or "" ok = await memory.exclude_chunk(current_user.id, chunk_id, reason=reason) if not ok: raise NotFoundError("chunk 不存在") @router.post("/chunks/{chunk_id}/restore", status_code=status.HTTP_204_NO_CONTENT) async def restore_chunk( chunk_id: str, current_user: CurrentUserDep, memory: MemoryService = Depends(get_memory_service), ): ok = await memory.restore_chunk(current_user.id, chunk_id) if not ok: raise NotFoundError("chunk 不存在") @router.post("/facts/{fact_id}/confirm", status_code=status.HTTP_204_NO_CONTENT) async def confirm_fact( fact_id: str, current_user: CurrentUserDep, memory: MemoryService = Depends(get_memory_service), ): ok = await memory.confirm_fact(current_user.id, fact_id) if not ok: raise NotFoundError("fact 不存在") @router.post("/facts/{fact_id}/reject", status_code=status.HTTP_204_NO_CONTENT) async def reject_fact( fact_id: str, current_user: CurrentUserDep, memory: MemoryService = Depends(get_memory_service), body: RejectFactBody | None = None, ): reason = (body.reason if body else "") or "" ok = await memory.reject_fact(current_user.id, fact_id, reason=reason) if not ok: raise NotFoundError("fact 不存在")