"""大周天抽取候选审核 API(记忆候选 + 世界实体候选)。""" from fastapi import APIRouter, Query from app.schemas.candidates import MemoryCandidateResponse from app.schemas.common import Page from app.schemas.world import WorldEntityResponse from app.services.extraction import ( approve_memory_proposal, approve_world_entity, list_memory_proposals, list_world_entities_pending, reject_memory_proposal, reject_world_entity, ) router = APIRouter(tags=["extraction"]) @router.get( "/characters/{character_id}/memory-candidates", response_model=Page[MemoryCandidateResponse], ) async def list_memory_candidates_endpoint( character_id: str, source: str | None = Query( default=None, description="来源过滤:cycle(大周天)/ import(资料导入)" ), status: str | None = Query(default=None), page: int = Query(default=1, ge=1), page_size: int = Query(default=20, ge=1, le=100), ) -> Page[MemoryCandidateResponse]: """列出记忆候选(大周天 + 资料导入统一)。""" return await list_memory_proposals( character_id=character_id, source=source, status=status, page=page, page_size=page_size, ) @router.post( "/memory-candidates/{candidate_id}/approve", response_model=MemoryCandidateResponse, ) async def approve_memory_candidate_endpoint( candidate_id: str, ) -> MemoryCandidateResponse: """通过记忆候选:派生为 memories 记录(source=big_cycle)。""" return await approve_memory_proposal(candidate_id) @router.post( "/memory-candidates/{candidate_id}/reject", response_model=MemoryCandidateResponse, ) async def reject_memory_candidate_endpoint( candidate_id: str, ) -> MemoryCandidateResponse: """驳回记忆候选。""" return await reject_memory_proposal(candidate_id) @router.get( "/characters/{character_id}/world/entity-proposals", response_model=Page[WorldEntityResponse], ) async def list_world_entity_proposals_endpoint( character_id: str, status: str | None = Query(default="pending", description="默认 pending(候选)"), page: int = Query(default=1, ge=1), page_size: int = Query(default=20, ge=1, le=100), ) -> Page[WorldEntityResponse]: """列出世界实体候选(大周天抽取,status=pending 待审核)。""" return await list_world_entities_pending( character_id=character_id, status=status, page=page, page_size=page_size ) @router.post("/world/entities/{entity_id}/approve", response_model=WorldEntityResponse) async def approve_world_entity_endpoint(entity_id: str) -> WorldEntityResponse: """通过世界实体候选:status → confirmed 进入世界模型。""" return await approve_world_entity(entity_id) @router.post("/world/entities/{entity_id}/reject", response_model=WorldEntityResponse) async def reject_world_entity_endpoint(entity_id: str) -> WorldEntityResponse: """驳回世界实体候选。""" return await reject_world_entity(entity_id)