"""可追溯评测:Chapter/Story 证据闭包模型(strict / partial / fallback)。""" from __future__ import annotations from typing import Literal from pydantic import BaseModel, Field LineageTier = Literal["strict", "partial", "fallback"] class EvidenceFormatMeta(BaseModel): """Prompt 裁剪与可审计元数据(formatter 产出)。""" truncated: bool = False dropped_sections: list[str] = Field(default_factory=list) included_token_estimate: int = 0 transcript_chars_included: int = 0 structured_evidence_chars_included: int = 0 class ChapterEvidenceBundle(BaseModel): """章节评测证据闭包(Phase A:source_segments 为主链,标记 partial)。""" user_id: str chapter_id: str segment_ids: list[str] = Field(default_factory=list) conversation_ids: list[str] = Field(default_factory=list) memory_chunk_ids: list[str] = Field(default_factory=list) memory_fact_ids: list[str] = Field(default_factory=list) timeline_event_ids: list[str] = Field(default_factory=list) summary_ids: list[str] = Field(default_factory=list) lineage_tier: LineageTier notes: list[str] = Field(default_factory=list) augmented_with_chapter_context: bool = False # DialogueLineage.model_dump() — user/assistant message ids (multi-turn) dialogue_lineage: dict | None = None class StoryEvidenceBundle(BaseModel): """故事评测证据闭包:StoryEvidenceLink 优先,缺失则回退 chapter source_segments。""" user_id: str story_id: str segment_ids: list[str] = Field(default_factory=list) conversation_ids: list[str] = Field(default_factory=list) memory_chunk_ids: list[str] = Field(default_factory=list) memory_fact_ids: list[str] = Field(default_factory=list) timeline_event_ids: list[str] = Field(default_factory=list) summary_ids: list[str] = Field(default_factory=list) lineage_tier: LineageTier notes: list[str] = Field(default_factory=list) augmented_with_chapter_context: bool = False story_link_evidence_count: int = 0 fallback_chapter_ids: list[str] = Field(default_factory=list) dialogue_lineage: dict | None = None class FormattedMemoirEvidence(BaseModel): """供 `EvalJudgeService` 组 prompt 的格式化结果 + 汇总说明。""" source_transcript: str = "" structured_evidence: str = "" format_meta: EvidenceFormatMeta = Field(default_factory=EvidenceFormatMeta) evidence_summary: str = ""