from datetime import datetime from typing import Literal from pydantic import BaseModel, ConfigDict, Field, field_validator from domain import Message class CreateSessionRequest(BaseModel): model_config = ConfigDict(extra="forbid") system_prompt: str | None = None @field_validator("system_prompt") @classmethod def validate_system_prompt(cls, value: str | None) -> str | None: if value is not None and not value.strip(): raise ValueError("system_prompt must not be blank") return value class CreateSessionResponse(BaseModel): session_id: str system_prompt: str created_at: datetime class SendMessageRequest(BaseModel): model_config = ConfigDict(extra="forbid") content: str @field_validator("content") @classmethod def validate_content(cls, value: str) -> str: if not value.strip(): raise ValueError("content must not be blank") return value class TokenUsage(BaseModel): prompt_tokens: int completion_tokens: int total_tokens: int class FinalAssistantMessage(BaseModel): role: Literal["assistant"] = "assistant" content: str created_at: datetime class SendMessageResponse(BaseModel): session_id: str message: FinalAssistantMessage tools_use: list[str] = Field(default_factory=list) usage: TokenUsage | None class SessionHistoryResponse(BaseModel): session_id: str system_prompt: str created_at: datetime updated_at: datetime messages: list[Message]