feat(api)!: memory single chain — async MemoryService, strict eval closure

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
This commit is contained in:
Kevin
2026-04-30 14:11:46 +08:00
parent ac436b87a2
commit 71fbd39e32
53 changed files with 953 additions and 2448 deletions

View File

@@ -1,13 +1,9 @@
"""可追溯评测Chapter/Story 证据闭包模型strict / partial / fallback"""
"""可追溯评测Chapter/Story 严格证据闭包模型。"""
from __future__ import annotations
from typing import Literal
from pydantic import BaseModel, Field
LineageTier = Literal["strict", "partial", "fallback"]
class EvidenceFormatMeta(BaseModel):
"""Prompt 裁剪与可审计元数据formatter 产出)。"""
@@ -20,7 +16,7 @@ class EvidenceFormatMeta(BaseModel):
class ChapterEvidenceBundle(BaseModel):
"""章节评测证据闭包Phase Asource_segments 为主链,标记 partial"""
"""章节评测严格证据闭包。"""
user_id: str
chapter_id: str
@@ -30,7 +26,6 @@ class ChapterEvidenceBundle(BaseModel):
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)
@@ -38,7 +33,7 @@ class ChapterEvidenceBundle(BaseModel):
class StoryEvidenceBundle(BaseModel):
"""故事评测证据闭包StoryEvidenceLink 优先,缺失则回退 chapter source_segments"""
"""故事评测严格证据闭包StoryEvidenceLink 与绑定 transcript 都必须存在"""
user_id: str
story_id: str
@@ -48,11 +43,9 @@ class StoryEvidenceBundle(BaseModel):
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