"""候选 API schema(api-spec §8)。""" from pydantic import BaseModel, Field class ProfileCandidateResponse(BaseModel): id: str = Field(description="候选 ID,前缀 profile_candidate_。") character_id: str = Field(description="所属人物 ID。") import_job_id: str | None = Field(default=None, description="来源导入任务 ID。") field: str = Field(description="档案字段名。") value: str = Field(description="候选值。") confidence: float = Field(description="置信度。") evidence_ids: list[str] = Field(default_factory=list, description="证据 import_item ID。") status: str = Field(description="审核状态,契约字典 §10.6。") reason: str | None = Field(default=None) reviewed_at: str | None = Field(default=None) created_at: str = Field(description="创建时间,UTC ISO 8601 字符串。") class MemoryCandidateResponse(BaseModel): id: str = Field(description="候选 ID,前缀 memory_candidate_。") character_id: str = Field(description="所属人物 ID。") import_job_id: str | None = Field(default=None, description="来源导入任务 ID。") cycle_id: str | None = Field(default=None, description="来源大周天循环 ID。") type: str = Field(description="记忆类型。") title: str = Field(description="记忆标题。") content: str = Field(description="记忆内容。") confidence: float = Field(description="置信度。") importance: float = Field(description="重要度。") sensitivity: str = Field(description="敏感等级。") evidence_ids: list[str] = Field(default_factory=list, description="证据 import_item ID。") status: str = Field(description="审核状态,契约字典 §10.6。") reason: str | None = Field(default=None) reviewed_at: str | None = Field(default=None) created_at: str = Field(description="创建时间,UTC ISO 8601 字符串。") class CandidateReviewDecision(BaseModel): candidate_id: str = Field(description="候选 ID。") decision: str = Field(description="审核决定:approve / reject。") class BatchReviewRequest(BaseModel): decisions: list[CandidateReviewDecision] = Field(min_length=1, description="批量审核决定。") class BatchReviewResult(BaseModel): applied: int = Field(description="已应用(approve)数量。") rejected: int = Field(description="已驳回数量。") skipped: int = Field(description="因状态非 pending 跳过的数量。")