config_loader.py•1.69 kB
#!/usr/bin/env python3
import os, json
def _as_bool(v):
if isinstance(v, bool): return v
if v is None: return None
return str(v).strip().lower() in ("1","true","yes","on")
def _as_int(v, default=None):
try: return int(v)
except Exception: return default
def _as_float(v, default=None):
try: return float(v)
except Exception: return default
def load_config(cfg_path):
with open(cfg_path, "r", encoding="utf-8") as f:
cfg = json.load(f)
# Qdrant
cfg["qdrant"]["url"] = os.getenv("QDRANT_URL", cfg["qdrant"]["url"])
cfg["qdrant"]["collection"] = os.getenv("QDRANT_COLLECTION", cfg["qdrant"]["collection"])
cfg["qdrant"]["dense_model"] = os.getenv("DENSE_MODEL", cfg["qdrant"]["dense_model"])
cfg["qdrant"]["top_k"] = _as_int(os.getenv("TOP_K"), cfg["qdrant"]["top_k"])
# KG
cfg["kg"]["uri"] = os.getenv("NEO4J_URI", cfg["kg"]["uri"])
cfg["kg"]["user"] = os.getenv("NEO4J_USER", cfg["kg"]["user"])
cfg["kg"]["pass"] = os.getenv("NEO4J_PASS", cfg["kg"]["pass"])
# Injection
inj = cfg.get("injection", {})
inj["max_tokens"] = _as_int(os.getenv("INJ_MAX_TOKENS"), inj.get("max_tokens", 2000))
inj["score_threshold"] = _as_float(os.getenv("INJ_SCORE_THRESHOLD"), inj.get("score_threshold", 0.30))
cfg["injection"] = inj
# Sparse
sp = cfg.get("sparse", {})
sp["enabled"] = _as_bool(os.getenv("SPARSE_ENABLED")) if os.getenv("SPARSE_ENABLED") is not None else sp.get("enabled", False)
sp["model"] = os.getenv("SPARSE_MODEL", sp.get("model", "bge-m3"))
sp["hash_dim"] = _as_int(os.getenv("SPARSE_HASH_DIM"), sp.get("hash_dim", 32768))
cfg["sparse"] = sp
return cfg