from datetime import datetime from typing import Any from pydantic import BaseModel, Field, model_validator class MessageCreateRequest(BaseModel): peer_user_id: int = Field(gt=0) client_msg_id: str = Field(min_length=1, max_length=64) content_type: int = Field(description="1-text 2-audio 3-image 4-json") content_text: str | None = Field(default=None) content_json: dict[str, Any] | None = None media_file_key: str | None = Field(default=None, max_length=255) media_duration_ms: int | None = Field(default=None, ge=0) @model_validator(mode="after") def validate_message_fields(self) -> "MessageCreateRequest": if self.content_type not in {1, 2, 3, 4}: raise ValueError("content_type must be one of 1, 2, 3, 4") if self.content_type == 1 and not (self.content_text and self.content_text.strip()): raise ValueError("content_text is required when content_type is 1") if self.content_type in {2, 3} and not self.media_file_key: raise ValueError("media_file_key is required when content_type is 2 or 3") if self.content_type == 4 and self.content_json is None: raise ValueError("content_json is required when content_type is 4") return self class MessageItem(BaseModel): id: int conversation_id: int seq: int sender_user_id: int | None role: int content_type: int content_text: str | None content_json: dict[str, Any] | None media_file_key: str | None media_duration_ms: int | None client_msg_id: str | None created_at: datetime class MessageCreateResponse(BaseModel): idempotent: bool message: MessageItem class MessageListResponse(BaseModel): conversation_id: int has_more: bool next_cursor_seq: int | None items: list[MessageItem]