| """Data models""" |
| from datetime import datetime |
| from typing import Optional, List, Union |
| from pydantic import BaseModel |
|
|
| class Token(BaseModel): |
| """Token model""" |
| id: Optional[int] = None |
| token: str |
| email: str |
| name: Optional[str] = "" |
| st: Optional[str] = None |
| rt: Optional[str] = None |
| remark: Optional[str] = None |
| expiry_time: Optional[datetime] = None |
| is_active: bool = True |
| cooled_until: Optional[datetime] = None |
| created_at: Optional[datetime] = None |
| last_used_at: Optional[datetime] = None |
| use_count: int = 0 |
| |
| plan_type: Optional[str] = None |
| plan_title: Optional[str] = None |
| subscription_end: Optional[datetime] = None |
| |
| sora2_supported: Optional[bool] = None |
| sora2_invite_code: Optional[str] = None |
| sora2_redeemed_count: int = 0 |
| sora2_total_count: int = 0 |
| |
| sora2_remaining_count: int = 0 |
| sora2_cooldown_until: Optional[datetime] = None |
| |
| image_enabled: bool = True |
| video_enabled: bool = True |
|
|
| class TokenStats(BaseModel): |
| """Token statistics""" |
| id: Optional[int] = None |
| token_id: int |
| image_count: int = 0 |
| video_count: int = 0 |
| error_count: int = 0 |
| last_error_at: Optional[datetime] = None |
|
|
| class Task(BaseModel): |
| """Task model""" |
| id: Optional[int] = None |
| task_id: str |
| token_id: int |
| model: str |
| prompt: str |
| status: str = "processing" |
| progress: float = 0.0 |
| result_urls: Optional[str] = None |
| error_message: Optional[str] = None |
| created_at: Optional[datetime] = None |
| completed_at: Optional[datetime] = None |
|
|
| class RequestLog(BaseModel): |
| """Request log model""" |
| id: Optional[int] = None |
| token_id: Optional[int] = None |
| operation: str |
| request_body: Optional[str] = None |
| response_body: Optional[str] = None |
| status_code: int |
| duration: float |
| created_at: Optional[datetime] = None |
|
|
| class AdminConfig(BaseModel): |
| """Admin configuration""" |
| id: int = 1 |
| admin_username: str |
| admin_password: str |
| error_ban_threshold: int = 3 |
| updated_at: Optional[datetime] = None |
|
|
| class ProxyConfig(BaseModel): |
| """Proxy configuration""" |
| id: int = 1 |
| proxy_enabled: bool |
| proxy_url: Optional[str] = None |
| created_at: Optional[datetime] = None |
| updated_at: Optional[datetime] = None |
|
|
| class WatermarkFreeConfig(BaseModel): |
| """Watermark-free mode configuration""" |
| id: int = 1 |
| watermark_free_enabled: bool |
| parse_method: str |
| custom_parse_url: Optional[str] = None |
| custom_parse_token: Optional[str] = None |
| created_at: Optional[datetime] = None |
| updated_at: Optional[datetime] = None |
|
|
| class CacheConfig(BaseModel): |
| """Cache configuration""" |
| id: int = 1 |
| cache_enabled: bool |
| cache_timeout: int |
| cache_base_url: Optional[str] = None |
| created_at: Optional[datetime] = None |
| updated_at: Optional[datetime] = None |
|
|
| class GenerationConfig(BaseModel): |
| """Generation timeout configuration""" |
| id: int = 1 |
| image_timeout: int |
| video_timeout: int |
| created_at: Optional[datetime] = None |
| updated_at: Optional[datetime] = None |
|
|
| class TokenRefreshConfig(BaseModel): |
| """Token refresh configuration""" |
| id: int = 1 |
| at_auto_refresh_enabled: bool |
| created_at: Optional[datetime] = None |
| updated_at: Optional[datetime] = None |
|
|
| |
| class ChatMessage(BaseModel): |
| role: str |
| content: Union[str, List[dict]] |
|
|
| class ChatCompletionRequest(BaseModel): |
| model: str |
| messages: List[ChatMessage] |
| image: Optional[str] = None |
| video: Optional[str] = None |
| remix_target_id: Optional[str] = None |
| stream: bool = False |
| max_tokens: Optional[int] = None |
|
|
| class ChatCompletionChoice(BaseModel): |
| index: int |
| message: Optional[dict] = None |
| delta: Optional[dict] = None |
| finish_reason: Optional[str] = None |
|
|
| class ChatCompletionResponse(BaseModel): |
| id: str |
| object: str = "chat.completion" |
| created: int |
| model: str |
| choices: List[ChatCompletionChoice] |
|
|