File size: 2,599 Bytes
6059138
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from __future__ import annotations

import os
from dataclasses import dataclass

from dotenv import load_dotenv

load_dotenv()


@dataclass(frozen=True)
class AppConfig:
    mistral_api_key: str
    memory_data_dir: str = "./data/faiss"
    mistral_model: str = "mistral-small-latest"
    embedding_model: str = "mistral-embed"
    mistral_max_retries: int = 6
    mistral_max_concurrent_requests: int = 1
    mistral_timeout_seconds: int = 120
    rate_limit_base_delay_seconds: float = 1.0
    rate_limit_max_delay_seconds: float = 16.0
    dense_weight: float = 0.55
    sparse_weight: float = 0.45
    top_k: int = 6

    @classmethod
    def from_env(cls) -> "AppConfig":
        mistral_api_key = os.getenv("MISTRAL_API_KEY") or os.getenv("API_KEY")

        missing = []
        if not mistral_api_key:
            missing.append("API_KEY or MISTRAL_API_KEY")

        if missing:
            formatted = ", ".join(missing)
            raise ValueError(f"Missing required environment variable(s): {formatted}")

        memory_data_dir = os.getenv("MEMORY_DATA_DIR", "./data/faiss")
        mistral_model = os.getenv("MISTRAL_MODEL", "mistral-small-latest")
        embedding_model = os.getenv("EMBEDDING_MODEL", "mistral-embed")
        if embedding_model == "mistrall-embed":
            embedding_model = "mistral-embed"
        mistral_max_retries = int(os.getenv("MISTRAL_MAX_RETRIES", "6"))
        mistral_max_concurrent_requests = int(os.getenv("MISTRAL_MAX_CONCURRENT_REQUESTS", "1"))
        mistral_timeout_seconds = int(os.getenv("MISTRAL_TIMEOUT_SECONDS", "120"))
        rate_limit_base_delay_seconds = float(os.getenv("RATE_LIMIT_BASE_DELAY_SECONDS", "1.0"))
        rate_limit_max_delay_seconds = float(os.getenv("RATE_LIMIT_MAX_DELAY_SECONDS", "16.0"))
        dense_weight = float(os.getenv("DENSE_WEIGHT", "0.55"))
        sparse_weight = float(os.getenv("SPARSE_WEIGHT", "0.45"))
        top_k = int(os.getenv("TOP_K", "6"))

        return cls(
            mistral_api_key=mistral_api_key,
            memory_data_dir=memory_data_dir,
            mistral_model=mistral_model,
            embedding_model=embedding_model,
            mistral_max_retries=mistral_max_retries,
            mistral_max_concurrent_requests=mistral_max_concurrent_requests,
            mistral_timeout_seconds=mistral_timeout_seconds,
            rate_limit_base_delay_seconds=rate_limit_base_delay_seconds,
            rate_limit_max_delay_seconds=rate_limit_max_delay_seconds,
            dense_weight=dense_weight,
            sparse_weight=sparse_weight,
            top_k=top_k,
        )