File size: 1,759 Bytes
fed7eb0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from __future__ import annotations
import os
import yaml
from pydantic import BaseModel, AnyHttpUrl
from typing import Optional

class ModelCfg(BaseModel):
    name: str = "meta-llama/Meta-Llama-3-8B-Instruct"
    fallback: str = "mistralai/Mistral-7B-Instruct-v0.2"
    max_new_tokens: int = 256
    temperature: float = 0.2

class LimitsCfg(BaseModel):
    rate_per_min: int = 60
    cache_size: int = 256

class RagCfg(BaseModel):
    index_dataset: Optional[str] = None
    top_k: int = 4

class MatrixHubCfg(BaseModel):
    base_url: AnyHttpUrl = "https://api.matrixhub.io"

class SecurityCfg(BaseModel):
    admin_token: Optional[str] = None

class Settings(BaseModel):
    model: ModelCfg = ModelCfg()
    limits: LimitsCfg = LimitsCfg()
    rag: RagCfg = RagCfg()
    matrixhub: MatrixHubCfg = MatrixHubCfg()
    security: SecurityCfg = SecurityCfg()

    @staticmethod
    def load() -> Settings:
        """Loads settings from YAML and overrides with environment variables."""
        path = os.getenv("SETTINGS_FILE", "configs/settings.yaml")
        data = {}
        if os.path.exists(path):
            with open(path, "r", encoding="utf-8") as f:
                data = yaml.safe_load(f) or {}

        settings = Settings.model_validate(data)

        # Environment variable overrides
        if "MODEL_NAME" in os.environ:
            settings.model.name = os.environ["MODEL_NAME"]
        if "INDEX_DATASET" in os.environ:
            settings.rag.index_dataset = os.environ["INDEX_DATASET"]
        if "RATE_LIMITS" in os.environ:
            settings.limits.rate_per_min = int(os.environ["RATE_LIMITS"])
        if "ADMIN_TOKEN" in os.environ:
            settings.security.admin_token = os.environ["ADMIN_TOKEN"]

        return settings