File size: 2,412 Bytes
da23dfe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
"""
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)