govon-runtime / src /inference /feature_flags.py
GovOn Deploy
sync: PR#584 RAG removal + ReAct architecture
1635ec4
"""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