Files
life-echo/api/app/features/evaluation/eval_trace_schemas.py
Kevin 71fbd39e32 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
2026-04-30 14:11:50 +08:00

59 lines
2.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""可追溯评测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 = ""