128 lines
3.5 KiB
Python
128 lines
3.5 KiB
Python
from dataclasses import dataclass, field
|
|
from typing import Optional, List, Dict, Any
|
|
|
|
@dataclass
|
|
class ChannelCategory:
|
|
id: Optional[int]
|
|
name: str
|
|
type: str = "both" # "source", "target", "both"
|
|
description: str = ""
|
|
created_at: Optional[str] = None
|
|
|
|
@dataclass
|
|
class SourceChannel:
|
|
id: Optional[int]
|
|
channel_id: int
|
|
username: Optional[str]
|
|
title: Optional[str]
|
|
category_id: Optional[int] = None
|
|
context_message_count: int = 0
|
|
is_active: bool = True
|
|
created_at: Optional[str] = None
|
|
|
|
@dataclass
|
|
class SourceWebsite:
|
|
id: Optional[int]
|
|
name: str
|
|
url: str
|
|
category_id: Optional[int] = None
|
|
check_interval_min: int = 30
|
|
auto_reanalyze_hours: int = 24
|
|
last_reanalyzed_at: Optional[str] = None
|
|
last_fetched_at: Optional[str] = None
|
|
api_config: Dict[str, Any] = field(default_factory=dict)
|
|
custom_instructions: str = ""
|
|
last_error: Optional[str] = None
|
|
last_error_at: Optional[str] = None
|
|
is_active: bool = True
|
|
created_at: Optional[str] = None
|
|
|
|
@dataclass
|
|
class TargetChannel:
|
|
id: Optional[int]
|
|
channel_id: int
|
|
title: Optional[str]
|
|
username: Optional[str]
|
|
category_id: Optional[int] = None
|
|
post_interval_min: int = 30
|
|
personality: str = ""
|
|
custom_footer: str = ""
|
|
custom_prompt: str = ""
|
|
sleep_start_hour: int = 0
|
|
sleep_end_hour: int = 0
|
|
is_sleep_enabled: bool = False
|
|
# Telegram channel_ids of sources whose posts are queued to this target automatically.
|
|
auto_source_ids: List[int] = field(default_factory=list)
|
|
language: str = "fa"
|
|
dispatch_order: str = "order" # "order" (FIFO) or "random"
|
|
context_message_count: int = 0
|
|
last_post_time: Optional[str] = None
|
|
is_active: bool = True
|
|
created_at: Optional[str] = None
|
|
|
|
|
|
@dataclass
|
|
class Post:
|
|
id: Optional[int]
|
|
source_channel_id: int
|
|
source_message_id: int
|
|
raw_text: Optional[str]
|
|
media_path: Optional[str] = None
|
|
media_type: Optional[str] = None
|
|
content_hash: Optional[str] = None
|
|
tags: List[str] = field(default_factory=list)
|
|
is_duplicate: bool = False
|
|
duplicate_of_id: Optional[int] = None
|
|
similarity_reason: Optional[str] = None
|
|
subject: Optional[str] = None
|
|
ai_text: Optional[str] = None
|
|
suggested_target_id: Optional[int] = None
|
|
target_channel_id: Optional[int] = None
|
|
status: str = "pending_review" # pending_review, published, rejected, deleted
|
|
rejection_reason: Optional[str] = None
|
|
published_to: List[Dict[str, Any]] = field(default_factory=list)
|
|
is_deleted: bool = False
|
|
review_message_id: Optional[int] = None
|
|
scheduled_at: Optional[str] = None
|
|
published_at: Optional[str] = None
|
|
source_created_at: Optional[str] = None
|
|
created_at: Optional[str] = None
|
|
|
|
@dataclass
|
|
class Setting:
|
|
key: str
|
|
value: str
|
|
description: Optional[str] = None
|
|
|
|
@dataclass
|
|
class AILog:
|
|
id: Optional[int]
|
|
action_name: str
|
|
provider: str
|
|
model: str
|
|
prompt: str
|
|
system_prompt: Optional[str] = None
|
|
response_text: Optional[str] = None
|
|
duration_sec: float = 0.0
|
|
status: str = "success"
|
|
error_message: Optional[str] = None
|
|
created_at: Optional[str] = None
|
|
|
|
@dataclass
|
|
class AIProviderProfile:
|
|
id: Optional[int]
|
|
name: str
|
|
provider_type: str
|
|
model: str
|
|
base_url: str = ""
|
|
api_key: str = ""
|
|
reasoning_effort: str = ""
|
|
is_active: bool = False
|
|
fallback_provider_id: Optional[int] = None
|
|
fallback_provider_name: Optional[str] = None
|
|
supports_vision: bool = False
|
|
created_at: Optional[str] = None
|
|
|
|
|
|
|