from __future__ import annotations from enum import Enum from typing import Literal, Optional from pydantic import BaseModel, EmailStr, Field class BlockKey(str, Enum): health = "health" goals = "goals" readiness = "readiness" class ClientProfile(BaseModel): name: str email: EmailStr preferred_format: Literal["online", "offline", "hybrid"] = "online" class QuestionPayload(BaseModel): id: str block: BlockKey prompt: str topic: str | None = None class SessionCreate(BaseModel): name: str = Field(..., min_length=1) email: EmailStr preferredFormat: Literal["online", "offline", "hybrid"] class SessionResponse(BaseModel): sessionId: str nextQuestion: Optional[QuestionPayload] = None class AnswerPayload(BaseModel): sessionId: str questionId: str block: BlockKey audio: str # base64 class AnswerResponse(BaseModel): transcript: str completedBlock: bool = False nextQuestion: Optional[QuestionPayload] = None markdownReport: Optional[str] = None class ReportResponse(BaseModel): sessionId: str markdown: str class SessionState(BaseModel): id: str client: ClientProfile block_index: int = 0 questions: list[QuestionPayload] = Field(default_factory=list) transcripts: dict[str, str] = Field(default_factory=dict) markdown: Optional[str] = None