""" راوي (Rawi) - Arabic AI Storytelling Platform Data models for API requests and responses """ from enum import Enum from typing import List, Optional from pydantic import BaseModel, Field # ======== Enum Types ======== class StoryLength(str, Enum): """Story length options""" SHORT = "short" MEDIUM = "medium" LONG = "long" class StoryType(str, Enum): """Story genre options in Arabic""" ROMANCE = "رومانسي" HORROR = "رعب" COMEDY = "كوميدي" ACTION = "أكشن" ADVENTURE = "مغامرة" DRAMA = "دراما" FANTASY = "خيال" HISTORICAL = "تاريخي" MYSTERY = "غموض" NONE = "لا" class CharacterGender(str, Enum): """Character gender options in Arabic""" MALE = "ذكر" FEMALE = "أنثى" # ======== Request Models ======== class Character(BaseModel): """Character information for story generation""" name: str = Field(..., description="اسم الشخصية") gender: CharacterGender = Field(..., description="جنس الشخصية") description: str = Field(..., description="وصف الشخصية") class StoryConfig(BaseModel): """Configuration for initial story generation""" length: StoryLength = Field(..., description="طول القصة") primary_type: StoryType = Field(..., description="النوع الأساسي للقصة") secondary_type: StoryType = Field(default=StoryType.NONE, description="النوع الثانوي للقصة") characters: List[Character] = Field(default=[], description="الشخصيات في القصة") interactive: bool = Field(default=True, description="هل القصة تفاعلية أم كاملة؟") class ChoiceRequest(BaseModel): """Request to continue a story with a choice or custom text""" story_id: str = Field(..., description="معرف القصة") choice_id: Optional[int] = Field(None, description="معرف الاختيار الذي تم اختياره") custom_text: Optional[str] = Field(None, description="النص المخصص الذي أدخله المستخدم") class TTSRequest(BaseModel): """Request to generate text-to-speech for a story""" story_id: str = Field(..., description="معرف القصة") speed: float = Field(1.0, description="سرعة الصوت (0.5 للبطيء، 1.0 للعادي، 2.0 للسريع)", ge=0.5, le=2.0) class EditRequest(BaseModel): """Request to edit a story based on user instructions""" story_id: str = Field(..., description="معرف القصة") edit_instructions: str = Field(..., description="تعليمات لتعديل القصة") # ======== Response Models ======== class StoryChoice(BaseModel): """A choice option presented to the user""" id: int = Field(..., description="معرف الاختيار") text: str = Field(..., description="نص الاختيار") class StoryParagraph(BaseModel): """A paragraph of story content with optional choices""" content: str = Field(..., description="محتوى الفقرة") choices: Optional[List[StoryChoice]] = Field(default=None, description="الاختيارات المتاحة بعد هذه الفقرة") class StoryResponse(BaseModel): """Response containing story content and metadata""" story_id: str = Field(..., description="معرف القصة") paragraph: StoryParagraph = Field(..., description="فقرة من القصة") is_complete: bool = Field(default=False, description="هل القصة اكتملت؟") title: Optional[str] = Field(default=None, description="عنوان القصة (يتم إضافته عند اكتمال القصة)") class CompleteStoryResponse(BaseModel): """Response containing a complete story generated without interaction""" story_id: str = Field(..., description="معرف القصة") paragraphs: List[str] = Field(..., description="فقرات القصة كاملة") title: str = Field(..., description="عنوان القصة") class TTSResponse(BaseModel): """Response containing URL to audio file""" audio_url: str = Field(..., description="رابط ملف الصوت") class EditResponse(BaseModel): """Response containing edited story content""" success: bool = Field(default=True, description="نجاح عملية التعديل") paragraphs: List[str] = Field(..., description="فقرات القصة المعدلة") title: Optional[str] = Field(default=None, description="عنوان القصة المعدل (اختياري)")