models + refactor

This commit is contained in:
xds
2026-02-27 20:37:24 +03:00
parent d9caececd7
commit e011805186
31 changed files with 234 additions and 223 deletions

View File

@@ -1,5 +1,4 @@
from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel
@@ -11,10 +10,10 @@ class AssetResponse(BaseModel):
name: str
type: str # uploaded / generated
content_type: str # image / prompt
linked_char_id: Optional[str] = None
linked_char_id: str | None = None
created_at: datetime
url: Optional[str] = None
url: str | None = None
class AssetsResponse(BaseModel):
assets: List[AssetResponse]
assets: list[AssetResponse]
total_count: int

View File

@@ -1,18 +1,17 @@
from typing import Optional
from pydantic import BaseModel
class CharacterCreateRequest(BaseModel):
name: str
character_bio: str
character_image_doc_tg_id: Optional[str] = None
avatar_image: Optional[str] = None
character_image_tg_id: Optional[str] = None
project_id: Optional[str] = None
character_image_doc_tg_id: str | None = None
avatar_image: str | None = None
character_image_tg_id: str | None = None
project_id: str | None = None
class CharacterUpdateRequest(BaseModel):
name: Optional[str] = None
character_bio: Optional[str] = None
character_image_doc_tg_id: Optional[str] = None
avatar_image: Optional[str] = None
character_image_tg_id: Optional[str] = None
project_id: Optional[str] = None
name: str | None = None
character_bio: str | None = None
character_image_doc_tg_id: str | None = None
avatar_image: str | None = None
character_image_tg_id: str | None = None
project_id: str | None = None

View File

@@ -1,18 +1,17 @@
from typing import Optional, List
from pydantic import BaseModel, Field
class EnvironmentCreate(BaseModel):
character_id: str
name: str = Field(..., min_length=1)
description: Optional[str] = None
asset_ids: Optional[List[str]] = []
description: str | None = None
asset_ids: list[str] | None = []
class EnvironmentUpdate(BaseModel):
name: Optional[str] = Field(None, min_length=1)
description: Optional[str] = None
asset_ids: Optional[List[str]] = None
name: str | None = Field(None, min_length=1)
description: str | None = None
asset_ids: list[str] | None = None
class AssetToEnvironment(BaseModel):
@@ -20,4 +19,4 @@ class AssetToEnvironment(BaseModel):
class AssetsToEnvironment(BaseModel):
asset_ids: List[str]
asset_ids: list[str]

View File

@@ -1,4 +1,3 @@
from typing import Optional
from pydantic import BaseModel, Field
from models.enums import AspectRatios, Quality
@@ -7,29 +6,31 @@ class ExternalGenerationRequest(BaseModel):
"""Request model for importing external generations."""
prompt: str
tech_prompt: Optional[str] = None
tech_prompt: str | None = None
# Image can be provided as base64 string OR URL (one must be provided)
image_data: Optional[str] = Field(None, description="Base64-encoded image data")
image_url: Optional[str] = Field(None, description="URL to download image from")
image_data: str | None = Field(None, description="Base64-encoded image data")
image_url: str | None = Field(None, description="URL to download image from")
nsfw: bool = False
# Generation metadata
aspect_ratio: AspectRatios = AspectRatios.NINESIXTEEN # "1:1","2:3","3:2","3:4","4:3","4:5","5:4","9:16","16:9","21:9"
quality: Quality = Quality.ONEK
model: str | None = None
seed: int | None = None
# Optional linking
linked_character_id: Optional[str] = None
linked_character_id: str | None = None
created_by: str = Field(..., description="User ID from external system")
project_id: Optional[str] = None
project_id: str | None = None
# Performance metrics
execution_time_seconds: Optional[float] = None
api_execution_time_seconds: Optional[float] = None
token_usage: Optional[int] = None
input_token_usage: Optional[int] = None
output_token_usage: Optional[int] = None
execution_time_seconds: float | None = None
api_execution_time_seconds: float | None = None
token_usage: int | None = None
input_token_usage: int | None = None
output_token_usage: int | None = None
def validate_image_source(self):
"""Ensure at least one image source is provided."""

View File

@@ -1,5 +1,4 @@
from pydantic import BaseModel
from typing import List, Optional
class UsageStats(BaseModel):
total_runs: int
@@ -9,10 +8,10 @@ class UsageStats(BaseModel):
total_cost: float
class UsageByEntity(BaseModel):
entity_id: Optional[str] = None
entity_id: str | None = None
stats: UsageStats
class FinancialReport(BaseModel):
summary: UsageStats
by_user: Optional[List[UsageByEntity]] = None
by_project: Optional[List[UsageByEntity]] = None
by_user: list[UsageByEntity] | None = None
by_project: list[UsageByEntity] | None = None

View File

@@ -1,24 +1,24 @@
from datetime import datetime, UTC
from typing import List, Optional
from pydantic import BaseModel, Field
from models.Asset import Asset
from models.Generation import GenerationStatus
from models.enums import AspectRatios, Quality, GenType
from models.enums import AspectRatios, Quality, GenType, ImageModel, TextModel
class GenerationRequest(BaseModel):
linked_character_id: Optional[str] = None
linked_character_id: str | None = None
aspect_ratio: AspectRatios = AspectRatios.NINESIXTEEN # "1:1","2:3","3:2","3:4","4:3","4:5","5:4","9:16","16:9","21:9"
quality: Quality = Quality.ONEK
prompt: str
telegram_id: Optional[int] = None
model: ImageModel = Field(default=ImageModel.GEMINI_3_PRO_IMAGE_PREVIEW)
telegram_id: int | None = None
use_profile_image: bool = True
assets_list: List[str]
environment_id: Optional[str] = None
project_id: Optional[str] = None
idea_id: Optional[str] = None
assets_list: list[str]
environment_id: str | None = None
project_id: str | None = None
idea_id: str | None = None
nsfw: bool = False
count: int = Field(default=1, ge=1, le=10)
@@ -28,33 +28,35 @@ class NsfwRequest(BaseModel):
class GenerationsResponse(BaseModel):
generations: List["GenerationResponse"]
generations: list["GenerationResponse"]
total_count: int
class GenerationResponse(BaseModel):
id: str
status: GenerationStatus
failed_reason: Optional[str] = None
failed_reason: str | None = None
project_id: str | None = None
linked_character_id: Optional[str] = None
linked_character_id: str | None = None
aspect_ratio: AspectRatios
quality: Quality
prompt: str
tech_prompt: Optional[str] = None
assets_list: List[str]
result_list: List[str] = []
result: Optional[str] = None
execution_time_seconds: Optional[float] = None
api_execution_time_seconds: Optional[float] = None
token_usage: Optional[int] = None
input_token_usage: Optional[int] = None
output_token_usage: Optional[int] = None
model: ImageModel | None = None
seed: int | None = None
tech_prompt: str | None = None
assets_list: list[str]
result_list: list[str] = []
result: str | None = None
execution_time_seconds: float | None = None
api_execution_time_seconds: float | None = None
token_usage: int | None = None
input_token_usage: int | None = None
output_token_usage: int | None = None
progress: int = 0
cost: Optional[float] = None
created_by: Optional[str] = None
generation_group_id: Optional[str] = None
idea_id: Optional[str] = None
cost: float | None = None
created_by: str | None = None
generation_group_id: str | None = None
idea_id: str | None = None
likes_count: int = 0
is_liked: bool = False
nsfw: bool = False
@@ -64,12 +66,13 @@ class GenerationResponse(BaseModel):
class GenerationGroupResponse(BaseModel):
generation_group_id: str
generations: List[GenerationResponse]
generations: list[GenerationResponse]
class PromptRequest(BaseModel):
prompt: str
linked_assets: List[str] = []
model: TextModel = Field(default=TextModel.GEMINI_3_1_PRO_PREVIEW)
linked_assets: list[str] = []
class PromptResponse(BaseModel):

View File

@@ -1,18 +1,17 @@
from typing import Optional
from pydantic import BaseModel
from models.Idea import Idea
from api.models.GenerationRequest import GenerationResponse
class IdeaCreateRequest(BaseModel):
name: str
description: Optional[str] = None
project_id: Optional[str] = None # Optional in body if passed via header/dependency
inspiration_id: Optional[str] = None
description: str | None = None
project_id: str | None = None # Optional in body if passed via header/dependency
inspiration_id: str | None = None
class IdeaUpdateRequest(BaseModel):
name: Optional[str] = None
description: Optional[str] = None
inspiration_id: Optional[str] = None
name: str | None = None
description: str | None = None
inspiration_id: str | None = None
class IdeaResponse(Idea):
last_generation: Optional[GenerationResponse] = None
last_generation: GenerationResponse | None = None

View File

@@ -1,5 +1,4 @@
from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel
@@ -8,8 +7,8 @@ from models.Inspiration import Inspiration
class InspirationCreateRequest(BaseModel):
source_url: str
caption: Optional[str] = None
project_id: Optional[str] = None
caption: str | None = None
project_id: str | None = None
class InspirationResponse(BaseModel):
@@ -25,5 +24,5 @@ class InspirationResponse(BaseModel):
class InspirationListResponse(BaseModel):
inspirations: List[InspirationResponse]
inspirations: list[InspirationResponse]
total_count: int

View File

@@ -1,19 +1,18 @@
from datetime import datetime
from typing import Optional, List
from pydantic import BaseModel
class PostCreateRequest(BaseModel):
date: datetime
topic: str
generation_ids: List[str] = []
project_id: Optional[str] = None
generation_ids: list[str] = []
project_id: str | None = None
class PostUpdateRequest(BaseModel):
date: Optional[datetime] = None
topic: Optional[str] = None
date: datetime | None = None
topic: str | None = None
class AddGenerationsRequest(BaseModel):
generation_ids: List[str]
generation_ids: list[str]