| """Application configuration. |
| |
| Everything has a safe offline default. With no environment at all, ParaPilot |
| runs fully offline on the deterministic stub provider. |
| """ |
| from __future__ import annotations |
|
|
| from functools import lru_cache |
| from pathlib import Path |
| from typing import Optional |
|
|
| from pydantic_settings import BaseSettings, SettingsConfigDict |
|
|
| |
| ROOT_DIR = Path(__file__).resolve().parents[1] |
|
|
|
|
| class Settings(BaseSettings): |
| """Runtime settings, overridable via environment / .env.""" |
|
|
| model_config = SettingsConfigDict( |
| env_prefix="PARAPILOT_", |
| env_file=".env", |
| extra="ignore", |
| ) |
|
|
| |
| provider: str = "stub" |
| anthropic_model: str = "claude-3-5-haiku-latest" |
| openai_model: str = "gpt-4o-mini" |
|
|
| |
| confidence_threshold: float = 0.12 |
| top_k: int = 4 |
|
|
| |
| db_url: str = "sqlite:///./parapilot.db" |
| corpus_dir: str = "data/corpus" |
|
|
| |
| enable_caselaw: bool = False |
|
|
| @property |
| def corpus_path(self) -> Path: |
| p = Path(self.corpus_dir) |
| return p if p.is_absolute() else ROOT_DIR / p |
|
|
| @property |
| def anthropic_api_key(self) -> Optional[str]: |
| import os |
|
|
| return os.getenv("ANTHROPIC_API_KEY") |
|
|
| @property |
| def openai_api_key(self) -> Optional[str]: |
| import os |
|
|
| return os.getenv("OPENAI_API_KEY") |
|
|
|
|
| @lru_cache |
| def get_settings() -> Settings: |
| return Settings() |
|
|