from typing import Any, Literal from pydantic import BaseModel, Field, model_validator from libs.helper import UUIDStrOrEmpty # --- Conversation schemas --- class ConversationRenamePayload(BaseModel): name: str | None = None auto_generate: bool = False @model_validator(mode="after") def validate_name_requirement(self): if not self.auto_generate: if self.name is None or not self.name.strip(): raise ValueError("name is required when auto_generate is false") return self # --- Message schemas --- class MessageListQuery(BaseModel): conversation_id: UUIDStrOrEmpty first_id: UUIDStrOrEmpty | None = None limit: int = Field(default=20, ge=1, le=100) class MessageFeedbackPayload(BaseModel): rating: Literal["like", "dislike"] | None = None content: str | None = None # --- Saved message schemas --- class SavedMessageListQuery(BaseModel): last_id: UUIDStrOrEmpty | None = None limit: int = Field(default=20, ge=1, le=100) class SavedMessageCreatePayload(BaseModel): message_id: UUIDStrOrEmpty # --- Workflow schemas --- class WorkflowRunPayload(BaseModel): inputs: dict[str, Any] files: list[dict[str, Any]] | None = None # --- Audio schemas --- class TextToAudioPayload(BaseModel): message_id: str | None = None voice: str | None = None text: str | None = None streaming: bool | None = None