Bot & Automation

jorgasisten

/root/hermes-projects/jorgasisten

apps/jorgasisten/core/config.py text
from functools import lru_cache
from typing import Literal

from pydantic import AliasChoices, Field
from pydantic_settings import BaseSettings, SettingsConfigDict


class Settings(BaseSettings):
    model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")

    telegram_bot_token: str = ""
    google_sheets_spreadsheet_id: str = ""
    google_service_account_json_base64: str = ""
    google_oauth_authorized_user_json_base64: str = ""
    google_application_credentials: str = ""

    openai_api_key: str = ""
    openai_base_url: str = "https://api.openai.com/v1"
    openai_model: str = "gpt-4.1-mini"
    openai_timeout_seconds: int = 45
    openrouter_api_key: str = ""
    openrouter_base_url: str = "https://openrouter.ai/api/v1"
    openrouter_model: str = "openai/gpt-4o-mini"

    admin_telegram_ids: str = Field(
        default="",
        validation_alias=AliasChoices("ADMIN_TELEGRAM_IDS", "TELEGRAM_ADMIN_IDS"),
    )
    require_admin_for_writes: bool = True
    operator_access_password: str = ""
    viewer_access_password: str = ""
    user_access_registry_path: str = "data/user_access.json"
    whatsapp_access_registry_path: str = "data/whatsapp_access.json"
    min_write_confidence: int = Field(default=70, ge=0, le=100)
    min_delete_confidence: int = Field(default=80, ge=0, le=100)
    safe_delete_strategy: Literal["soft", "row"] = "soft"
    audit_log_enabled: bool = True
    audit_log_sheet_name: str = "Bot_Log"
    spreadsheet_registry_path: str = "data/spreadsheets.json"
    default_spreadsheet_key: str = "default"
    max_sample_rows: int = Field(default=5, ge=1, le=25)
    max_result_rows: int = Field(default=12, ge=1, le=50)
    log_level: str = "INFO"
    data_timezone: str = "Asia/Jakarta"

    wa_api_url: str | None = None
    wa_apikey: str | None = None

    @property
    def admin_ids(self) -> set[int]:
        ids: set[int] = set()
        for raw_value in self.admin_telegram_ids.split(","):
            raw_value = raw_value.strip()
            if raw_value.isdigit():
                ids.add(int(raw_value))
        return ids

    @property
    def ai_configured(self) -> bool:
        return bool(self.ai_api_key and self.ai_model)

    @property
    def ai_api_key(self) -> str:
        return self.openrouter_api_key or self.openai_api_key

    @property
    def ai_base_url(self) -> str:
        return self.openrouter_base_url if self.openrouter_api_key else self.openai_base_url

    @property
    def ai_model(self) -> str:
        return self.openrouter_model if self.openrouter_api_key else self.openai_model

    @property
    def sheets_configured(self) -> bool:
        has_credentials = bool(
            self.google_service_account_json_base64
            or self.google_oauth_authorized_user_json_base64
            or self.google_application_credentials
        )
        return bool(self.google_sheets_spreadsheet_id and has_credentials)

    @property
    def access_passwords_configured(self) -> bool:
        return bool(self.operator_access_password or self.viewer_access_password)


@lru_cache(maxsize=1)
def get_settings() -> Settings:
    return Settings()