Route all memory ingest/retrieve/enrichment/compaction through async MemoryService. Remove legacy sync memory implementations (ingest/retrieve/compaction); Celery and memoir Phase2 call asyncio.run into MemoryService-backed helpers. Memoir Phase1 batch ingest uses MemoryService.ingest_transcripts_batch; drop chapters. evidence_bundle_json mirror (Alembic 0015). Evaluation uses snapshot/link-only bundles; raise EvidenceClosureMissing instead of partial/fallback lineage tiers. Split memoir state into NarrativeCoverageState and InterviewControlState; delete the _interview_meta_store adapter layer. Remove rolling-query and recent-fact fallback settings from config and evidence assembly. Update judges, docs, tests, and PlaygroundPage alignment. Made-with: Cursor
59 lines
2.1 KiB
Python
59 lines
2.1 KiB
Python
"""可追溯评测:Chapter/Story 严格证据闭包模型。"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from pydantic import BaseModel, Field
|
||
|
||
|
||
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):
|
||
"""章节评测严格证据闭包。"""
|
||
|
||
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)
|
||
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 与绑定 transcript 都必须存在。"""
|
||
|
||
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)
|
||
notes: list[str] = Field(default_factory=list)
|
||
augmented_with_chapter_context: bool = False
|
||
story_link_evidence_count: int = 0
|
||
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 = ""
|