refactor: прогресс звонящего вынесен в модели SlotProgress и PersonaProgress

This commit is contained in:
gglamer 2026-09-26 22:13:35 +00:00
commit 64313a62fb
4 changed files with 163 additions and 8 deletions

View file

@ -7,6 +7,8 @@
from dataclasses import dataclass, field
from pydantic import BaseModel, Field
from app.domain.events import Mood
from app.scenarios.schema import Persona
@ -37,13 +39,47 @@ DIRECTIVE_MOOD: dict[str, Mood] = {
}
@dataclass
class PersonaState:
persona: Persona
class PersonaProgress(BaseModel):
"""Где звонящий по дуге и что накопил; профиль берётся из сценария."""
stage: str = "registration"
repeats: int = 0
directive: str | None = None
history: list[Mood] = field(default_factory=list)
history: list[Mood] = Field(default_factory=list)
@dataclass
class PersonaState:
persona: Persona
progress: PersonaProgress = field(default_factory=PersonaProgress)
@property
def stage(self) -> str:
return self.progress.stage
@stage.setter
def stage(self, value: str) -> None:
self.progress.stage = value
@property
def repeats(self) -> int:
return self.progress.repeats
@repeats.setter
def repeats(self, value: int) -> None:
self.progress.repeats = value
@property
def directive(self) -> str | None:
return self.progress.directive
@directive.setter
def directive(self, value: str | None) -> None:
self.progress.directive = value
@property
def history(self) -> list[Mood]:
return self.progress.history
@property
def base(self) -> str:

View file

@ -12,6 +12,7 @@ import re
from dataclasses import dataclass, field
import numpy as np
from pydantic import BaseModel, Field
from app.dialog.embeddings import Embedder
from app.scenarios.schema import ChecklistItem, Fact, Scenario
@ -57,6 +58,17 @@ class TurnResult:
return bool(self.matched)
class SlotProgress(BaseModel):
"""Что уже произошло в разговоре — единственное, что стоит сохранять.
Якоря, словари раскрытия и уточнения собираются из сценария заново.
"""
asked: list[str] = Field(default_factory=list)
revealed: list[str] = Field(default_factory=list)
refined: list[str] = Field(default_factory=list)
class SlotMachine:
def __init__(
self,
@ -64,6 +76,7 @@ class SlotMachine:
embedder: Embedder,
floor: float = MATCH_FLOOR,
margin: float = MATCH_MARGIN,
progress: SlotProgress | None = None,
) -> None:
self.scenario = scenario
self.floor = floor
@ -103,9 +116,19 @@ class SlotMachine:
if fact.refine_on:
self._refines.setdefault(fact.refine_on, []).append(fact.id)
self.asked: list[str] = []
self.revealed: list[str] = []
self.refined: list[str] = []
self.progress = progress if progress is not None else SlotProgress()
@property
def asked(self) -> list[str]:
return self.progress.asked
@property
def revealed(self) -> list[str]:
return self.progress.revealed
@property
def refined(self) -> list[str]:
return self.progress.refined
# ── реплика оператора ──