gwoe-antragspruefer/app/config.py

61 lines
2.1 KiB
Python
Raw Normal View History

from pydantic_settings import BaseSettings
from pathlib import Path
class Settings(BaseSettings):
app_name: str = "GWÖ-Antragsprüfer"
app_version: str = "1.0.0"
prompt_version: str = "v4.1"
# Paths
base_dir: Path = Path(__file__).resolve().parent.parent
data_dir: Path = base_dir / "data"
reports_dir: Path = base_dir / "reports"
kontext_dir: Path = Path(__file__).resolve().parent / "kontext"
db_path: Path = data_dir / "gwoe-antraege.db"
# LLM
dashscope_api_key: str = ""
dashscope_base_url: str = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
llm_model_default: str = "qwen-plus-latest"
llm_model_premium: str = "qwen-max"
# Embedding-Modell: neue Rows werden immer mit embedding_model_write geschrieben,
# Lese-Queries filtern nach embedding_model_read. Zwei Settings erlauben einen
# Zero-Downtime-Switch von v3 auf v4 (siehe Issue #123):
# Phase 1: write=v4, read=v3 → Prod läuft weiter, Reindex füllt v4-Rows
# Phase 2: write=v4, read=v4 → Switch aktiv, alte v3-Rows können gelöscht werden
embedding_model_write: str = "text-embedding-v4"
embedding_model_read: str = "text-embedding-v3"
embedding_dimensions: int = 1024
# Keycloak
keycloak_url: str = ""
keycloak_realm: str = ""
keycloak_client_id: str = ""
keycloak_admin_user: str = ""
keycloak_admin_password: str = ""
# Server
host: str = "0.0.0.0"
port: int = 8000
# SMTP (Issue #124 E-Mail-Benachrichtigung)
# 1blu: smtp.1blu.de:465 SSL, username = Postfachname (NICHT E-Mail!),
# z.B. "q294440_0-gwoe-toppyr". Passwort via ENV SMTP_PASSWORD.
smtp_host: str = ""
smtp_port: int = 465
smtp_user: str = ""
smtp_password: str = ""
smtp_from_email: str = "noreply@toppyr.de"
smtp_from_name: str = "GWÖ-Antragsprüfer"
# URL-Basis für Links in Mails (Unsubscribe, Detail-Ansicht)
base_url: str = "https://gwoe.toppyr.de"
# Token für Unsubscribe-Links (HMAC-Secret)
unsubscribe_secret: str = "change-me-in-prod"
model_config = {"env_file": ".env", "env_file_encoding": "utf-8"}
settings = Settings()