File size: 1,622 Bytes
9e65b56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1635ec4
9e65b56
 
 
 
 
 
 
 
 
 
 
 
 
 
1635ec4
9e65b56
 
 
 
 
 
 
 
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
"""Feature Flag ๊ด€๋ฆฌ ๋ชจ๋“ˆ.

ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ธฐ๋ฐ˜ Feature Flag์™€ X-Feature-Flag ํ—ค๋”๋ฅผ ํ†ตํ•œ ์š”์ฒญ๋ณ„ ์˜ค๋ฒ„๋ผ์ด๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค.
"""

import os
from dataclasses import asdict, dataclass
from typing import Optional

from loguru import logger


@dataclass(frozen=True)
class FeatureFlags:
    """๋Ÿฐํƒ€์ž„ Feature Flag ์„ค์ •."""

    model_version: str = "v2_lora"  # v1_lora | v2_lora

    @classmethod
    def from_env(cls) -> "FeatureFlags":
        """ํ™˜๊ฒฝ๋ณ€์ˆ˜์—์„œ Feature Flag๋ฅผ ๋กœ๋“œํ•œ๋‹ค."""
        flags = cls(
            model_version=os.getenv("MODEL_VERSION", "v2_lora"),
        )
        logger.info(f"Feature Flags ๋กœ๋“œ: {flags}")
        return flags

    def override_from_header(self, header_value: Optional[str]) -> "FeatureFlags":
        """X-Feature-Flag ํ—ค๋”์—์„œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„๋ผ์ด๋“œ.

        ํ˜•์‹: 'MODEL_VERSION=v1_lora'
        ์›๋ณธ ์ธ์Šคํ„ด์Šค๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
        """
        if not header_value:
            return self

        overrides: dict = {}
        for pair in header_value.split(","):
            pair = pair.strip()
            if "=" not in pair:
                continue
            key, value = pair.split("=", 1)
            key = key.strip().upper()
            value = value.strip()

            if key == "MODEL_VERSION":
                if value in ("v1_lora", "v2_lora"):
                    overrides["model_version"] = value

        if overrides:
            current = asdict(self)
            current.update(overrides)
            return FeatureFlags(**current)
        return self