File size: 2,479 Bytes
4ccde7a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94961c3
4ccde7a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
from typing import List, Tuple, Type
from functools import lru_cache

from pydantic import Field
from pydantic_settings import (
    BaseSettings,
    PydanticBaseSettingsSource,
    SettingsConfigDict,
    YamlConfigSettingsSource,
)


class Settings(BaseSettings):
    """Centralized settings.

    Priority (highest β†’ lowest):
      1. Environment variables
      2. .env file          ← secrets only (MISTRAL_API_KEY)
      3. development.yml    ← non-secret config (model, server, CORS)
    """

    model_config = SettingsConfigDict(
        env_file=".env",
        env_file_encoding="utf-8",
        case_sensitive=True,
        extra="ignore",
    )

    @classmethod
    def settings_customise_sources(
        cls,
        settings_cls: Type[PydanticBaseSettingsSource],
        init_settings: PydanticBaseSettingsSource,
        env_settings: PydanticBaseSettingsSource,
        dotenv_settings: PydanticBaseSettingsSource,
        file_secret_settings: PydanticBaseSettingsSource,
    ) -> Tuple[PydanticBaseSettingsSource, ...]:
        return (
            init_settings,
            env_settings,
            dotenv_settings,
            YamlConfigSettingsSource(settings_cls, yaml_file="development.yml"),
            file_secret_settings,
        )

    # ── Mistral (secret in .env, rest in development.yml) ─────────────────────
    MISTRAL_API_KEY: str
    MISTRAL_OCR_MODEL: str = "mistral-ocr-latest"
    MISTRAL_TABLE_FORMAT: str = "markdown"

    # ── Server (development.yml) ───────────────────────────────────────────────
    APP_NAME: str = "Markdown & Layout Extractor"
    HOST: str = "127.0.0.1"
    PORT: int = 7860  # HF Spaces requires 7860; development.yml / env var can override
    LOG_LEVEL: str = "INFO"

    # ── CORS (development.yml) ─────────────────────────────────────────────────
    CORS_ALLOW_ORIGINS: List[str] = Field(default_factory=lambda: ["*"])
    CORS_ALLOW_METHODS: List[str] = Field(default_factory=lambda: ["*"])
    CORS_ALLOW_HEADERS: List[str] = Field(default_factory=lambda: ["*"])


@lru_cache
def get_settings() -> Settings:
    """Cached settings instance β€” call this everywhere instead of instantiating."""
    return Settings()


settings = get_settings()