91 lines
3.0 KiB
Python
91 lines
3.0 KiB
Python
"""大周天抽取候选审核 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)
|