from typing import Any, Dict, List, Optional from pydantic import BaseModel, Field class PlatformSettingsPayload(BaseModel): page_size: int = Field(default=10, ge=1, le=100) chat_pull_page_size: int = Field(default=60, ge=10, le=500) command_auto_unlock_seconds: int = Field(default=10, ge=1, le=600) auth_token_ttl_hours: int = Field(default=24, ge=1, le=720) auth_token_max_active: int = Field(default=2, ge=1, le=20) upload_max_mb: int = Field(default=100, ge=1, le=2048) allowed_attachment_extensions: List[str] = Field(default_factory=list) workspace_download_extensions: List[str] = Field(default_factory=list) speech_enabled: bool = True class PlatformUsageItem(BaseModel): id: int bot_id: str message_id: Optional[int] = None request_id: str channel: str status: str provider: Optional[str] = None model: Optional[str] = None token_source: str content: Optional[str] = None input_tokens: int output_tokens: int total_tokens: int input_text_preview: Optional[str] = None output_text_preview: Optional[str] = None started_at: str completed_at: Optional[str] = None class PlatformUsageSummary(BaseModel): request_count: int input_tokens: int output_tokens: int total_tokens: int class PlatformUsageAnalyticsSeries(BaseModel): model: str total_requests: int daily_counts: List[int] class PlatformUsageAnalytics(BaseModel): window_days: int days: List[str] total_requests: int series: List[PlatformUsageAnalyticsSeries] class PlatformUsageResponse(BaseModel): summary: PlatformUsageSummary items: List[PlatformUsageItem] total: int limit: int offset: int has_more: bool analytics: PlatformUsageAnalytics class PlatformLoginLogItem(BaseModel): id: int auth_type: str subject_id: str bot_id: Optional[str] = None auth_source: str client_ip: Optional[str] = None user_agent: Optional[str] = None device_info: Optional[str] = None created_at: str last_seen_at: Optional[str] = None expires_at: Optional[str] = None revoked_at: Optional[str] = None revoke_reason: Optional[str] = None status: str class PlatformLoginLogResponse(BaseModel): items: List[PlatformLoginLogItem] total: int limit: int offset: int has_more: bool class PlatformActivityItem(BaseModel): id: int bot_id: str request_id: Optional[str] = None event_type: str channel: str detail: Optional[str] = None metadata: Dict[str, Any] = Field(default_factory=dict) created_at: str class SystemSettingPayload(BaseModel): key: str name: str = "" category: str = "general" description: str = "" value_type: str = "json" value: Any = None is_public: bool = False sort_order: int = 100 class SystemSettingItem(BaseModel): key: str name: str category: str description: str value_type: str value: Any = None is_public: bool = False sort_order: int = 100 created_at: str updated_at: str