from typing import Literal from pydantic import BaseModel, Field class EndpointCapabilities(BaseModel): id: str kind: str direction: Literal["input", "output"] sample_rate: int = 16000 channels: int = 1 latency_class: Literal["low", "medium", "high"] = "medium" supports_aec: bool = False supports_barge_in: bool = False networked: bool = False bluetooth: bool = False mobile: bool = False default: bool = False class AudioChunk(BaseModel): data: bytes sample_rate: int = 16000 channels: int = 1 format: str = "wav" timestamp_ms: int = 0 class PipelineTrace(BaseModel): raw_transcript: str | None = None cleaned_transcript: str | None = None semantic_response: str | None = None spoken_response: str | None = None tts_ready_text: str | None = None class SpeakRequest(BaseModel): text: str = Field(min_length=1) voice: str | None = None language: str | None = None output_endpoint: str | None = None tts_provider: str | None = None class ChatRequest(BaseModel): text: str = Field(min_length=1) input_endpoint: str | None = None output_endpoint: str | None = None language: str | None = None voice: str | None = None stt_provider: str | None = None llm_provider: str | None = None tts_provider: str | None = None class SessionRouteRequest(BaseModel): input_endpoint: str | None = None output_endpoint: str | None = None stt_provider: str | None = None llm_provider: str | None = None tts_provider: str | None = None language: str | None = None class RouteInfo(BaseModel): input_endpoint: str output_endpoint: str stt_provider: str llm_provider: str tts_provider: str language: str