from typing import Any, Dict, List, Optional from pydantic import BaseModel, Field class LoadingPageSettings(BaseModel): title: str = "Dashboard Nanobot" subtitle: str = "平台正在准备管理面板" description: str = "请稍候,正在加载 Bot 平台数据。" 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) 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 speech_max_audio_seconds: int = Field(default=20, ge=5, le=600) speech_default_language: str = Field(default="zh", min_length=1, max_length=16) speech_force_simplified: bool = True speech_audio_preprocess: bool = True speech_audio_filter: str = Field(default="highpass=f=120,lowpass=f=7600,afftdn=nf=-20") speech_initial_prompt: str = Field( default="以下内容可能包含简体中文和英文术语。请优先输出简体中文,英文单词、缩写、品牌名和数字保持原文,不要翻译。" ) loading_page: LoadingPageSettings = Field(default_factory=LoadingPageSettings) 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 PlatformUsageResponse(BaseModel): summary: PlatformUsageSummary items: List[PlatformUsageItem] 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