"""Persistent assistant conversation contracts.""" from datetime import datetime from typing import Literal from pydantic import Field from app.domain.risk_engine import RiskLevel from app.schemas.common import ApiSchema from app.schemas.risk_prediction import RiskAssessmentResult class ConversationCreateRequest(ApiSchema): title: str | None = Field(default=None, max_length=120) class ConversationMessageCreateRequest(ApiSchema): content: str = Field(min_length=1, max_length=2000) message_type: Literal["text", "image", "file", "audio"] = "text" class ConversationListQuery(ApiSchema): limit: int = Field(default=50, ge=1, le=100) class ConversationMessageData(ApiSchema): id: int role: str message_type: Literal["text", "image", "file", "audio"] = "text" content: str risk_result: RiskAssessmentResult | None = None response_card: dict | None = None semantic: dict | None = None created_at: datetime class ConversationStreamEvent(ApiSchema): type: Literal["start", "semantic", "delta", "done", "error"] content: str | None = None data: dict | None = None class ConversationSummary(ApiSchema): id: int title: str message_count: int last_risk_level: RiskLevel | None = None updated_at: datetime class ConversationData(ConversationSummary): messages: list[ConversationMessageData] messages_total: int = 0 messages_offset: int = 0 has_more_messages: bool = False