CharacterForgePro / src /models.py
ghmk's picture
Deploy full Character Sheet Pro with HF auth
da23dfe
"""
Data Models for Character Sheet Pro
====================================
Dataclasses for generation requests and results.
"""
from dataclasses import dataclass, field
from typing import Optional, List, Dict, Any
from PIL import Image
from datetime import datetime
@dataclass
class GenerationRequest:
"""Request for image generation."""
prompt: str
input_images: List[Image.Image] = field(default_factory=list)
aspect_ratio: str = "1:1"
temperature: float = 0.4
negative_prompt: Optional[str] = None
@property
def has_input_images(self) -> bool:
"""Check if request has input images."""
return len(self.input_images) > 0
@dataclass
class GenerationResult:
"""Result from image generation."""
success: bool
image: Optional[Image.Image] = None
message: str = ""
generation_time: Optional[float] = None
@classmethod
def success_result(
cls,
image: Image.Image,
message: str = "Generated successfully",
generation_time: Optional[float] = None
) -> "GenerationResult":
"""Create successful result."""
return cls(
success=True,
image=image,
message=message,
generation_time=generation_time
)
@classmethod
def error_result(cls, message: str) -> "GenerationResult":
"""Create error result."""
return cls(success=False, message=message)
@dataclass
class CharacterSheetConfig:
"""Configuration for character sheet generation."""
# Aspect ratios
face_aspect_ratio: str = "3:4" # 864x1184
body_aspect_ratio: str = "9:16" # 768x1344
# Generation temperatures
face_temperature: float = 0.35
body_temperature: float = 0.35
normalize_temperature: float = 0.5
# Layout
spacing: int = 20
background_color: str = "#2C2C2C"
# Retry settings
max_retries: int = 3
retry_delay: float = 30.0
rate_limit_delay_min: float = 2.0
rate_limit_delay_max: float = 3.0
@dataclass
class CharacterSheetMetadata:
"""Metadata for generated character sheet."""
character_name: str
input_type: str # "Face Only", "Full Body", "Face + Body"
costume_description: str
backend: str
timestamp: str = field(default_factory=lambda: datetime.now().isoformat())
views: int = 7
stages: Dict[str, Any] = field(default_factory=dict)