|
|
"""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] |
|
|
|