""" 集中读取 .env / 环境变量。 使用方式: from config import settings print(settings.llm_model) print(settings.has_openai_key) """ import os from dataclasses import dataclass from pathlib import Path def _load_dotenv(env_path: Path) -> None: """极简 .env 解析,避免引入 python-dotenv 依赖。""" if not env_path.is_file(): return for raw_line in env_path.read_text(encoding="utf-8").splitlines(): line = raw_line.strip() if not line or line.startswith("#"): continue if "=" not in line: continue key, _, value = line.partition("=") key = key.strip() value = value.strip().strip('"').strip("'") # 已存在则不覆盖(让真实环境变量优先) os.environ.setdefault(key, value) _ROOT = Path(__file__).resolve().parent _load_dotenv(_ROOT / ".env") @dataclass(frozen=True) class Settings: openai_api_key: str anthropic_api_key: str llm_provider: str llm_model: str llm_max_tokens: int rag_chroma_path: str rag_collection_name: str rag_embed_model: str validation_service_url: str log_level: str @property def has_openai_key(self) -> bool: return bool(self.openai_api_key) and self.openai_api_key != "your_openai_api_key_here" @property def has_anthropic_key(self) -> bool: return bool(self.anthropic_api_key) and self.anthropic_api_key != "your_anthropic_api_key_here" def _int(name: str, default: int) -> int: raw = os.environ.get(name) try: return int(raw) if raw else default except ValueError: return default settings = Settings( openai_api_key=os.environ.get("OPENAI_API_KEY", ""), anthropic_api_key=os.environ.get("ANTHROPIC_API_KEY", ""), llm_provider=os.environ.get("LLM_PROVIDER", "openai"), llm_model=os.environ.get("LLM_MODEL", "gpt-4o-mini"), llm_max_tokens=_int("LLM_MAX_TOKENS", 4096), rag_chroma_path=os.environ.get("RAG_CHROMA_PATH", "./db/chroma"), rag_collection_name=os.environ.get("RAG_COLLECTION_NAME", "jrxml_chunks"), rag_embed_model=os.environ.get("RAG_EMBED_MODEL", "sentence-transformers/all-MiniLM-L6-v2"), validation_service_url=os.environ.get("VALIDATION_SERVICE_URL", "http://localhost:8001"), log_level=os.environ.get("LOG_LEVEL", "INFO"), ) if __name__ == "__main__": s = settings print(f"provider = {s.llm_provider}") print(f"model = {s.llm_model}") print(f"max_tok = {s.llm_max_tokens}") print(f"openai? = {s.has_openai_key}") print(f"anthro? = {s.has_anthropic_key}") print(f"rag_path = {s.rag_chroma_path}")