"""Pipeline config and stats schemas for VoIdea.""" from datetime import datetime from typing import Any, Optional from pydantic import BaseModel, Field class PipelineStageConfig(BaseModel): enabled: bool = True noise_threshold: float | None = None silence_timeout_ms: int | None = None min_audio_duration_ms: int | None = None word: str | None = None timeout_minutes: int | None = None sensitivity: float | None = None mode: str | None = None timeout_ms: int | None = None verified_threshold: int | None = None warning_threshold: int | None = None max_agents_per_dialog: int | None = None min_samples: int | None = None learning_rate: float | None = None class PipelineConfigResponse(BaseModel): vad: PipelineStageConfig = Field(default_factory=PipelineStageConfig) wake_word: PipelineStageConfig = Field(default_factory=PipelineStageConfig) semantic_validation: PipelineStageConfig = Field(default_factory=PipelineStageConfig) confidence: PipelineStageConfig = Field(default_factory=PipelineStageConfig) agent_chaining: PipelineStageConfig = Field(default_factory=PipelineStageConfig) auto_tuning: PipelineStageConfig = Field(default_factory=PipelineStageConfig) stages_order: list[str] = [ "vad", "wake_word", "semantic_validation", "routing", "verification" ] class PipelineConfigUpdate(BaseModel): vad: Optional[dict[str, Any]] = None wake_word: Optional[dict[str, Any]] = None semantic_validation: Optional[dict[str, Any]] = None confidence: Optional[dict[str, Any]] = None agent_chaining: Optional[dict[str, Any]] = None auto_tuning: Optional[dict[str, Any]] = None stages_order: Optional[list[str]] = None class PipelineStatsEntry(BaseModel): id: str user_id: str | None stage: str passed: bool reason: str | None duration_ms: int | None created_at: datetime class PipelineStatsSummary(BaseModel): total_entries: int stages: dict[str, int] passed_ratio: float avg_duration_ms: float | None fail_reasons: list[tuple[str, int]]