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()