config.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from __future__ import annotations
  2. import os
  3. from dataclasses import dataclass
  4. from pathlib import Path
  5. from dotenv import load_dotenv
  6. ROOT_DIR = Path(__file__).resolve().parents[2]
  7. load_dotenv(ROOT_DIR.parent / ".env")
  8. load_dotenv(ROOT_DIR / ".env")
  9. def _bool(name: str, default: bool = False) -> bool:
  10. """读取常见布尔环境变量写法。"""
  11. value = os.getenv(name)
  12. if value is None:
  13. return default
  14. return value.strip().lower() in {"1", "true", "yes", "on"}
  15. @dataclass(frozen=True)
  16. class Settings:
  17. """集中管理服务、模型、存储和可选适配器配置。"""
  18. app_env: str = os.getenv("APP_ENV", "development")
  19. workspace_id: str = os.getenv("WORKSPACE_ID", "local-workspace")
  20. data_dir: Path = Path(os.getenv("DATA_DIR", str(ROOT_DIR / "data")))
  21. demo_fallback: bool = _bool("DEMO_FALLBACK", True)
  22. llm_base_url: str = os.getenv("LLM_BASE_URL", "https://api.openai.com/v1").rstrip("/")
  23. llm_api_key: str = os.getenv("LLM_API_KEY", "")
  24. llm_model: str = os.getenv("LLM_MODEL", "gpt-4o-mini")
  25. embedding_base_url: str = os.getenv("EMBEDDING_BASE_URL", "https://api.openai.com/v1").rstrip("/")
  26. embedding_api_key: str = os.getenv("EMBEDDING_API_KEY", "")
  27. embedding_model: str = os.getenv("EMBEDDING_MODEL", "text-embedding-3-small")
  28. embedding_dimensions: int = int(os.getenv("EMBEDDING_DIMENSIONS", "1536"))
  29. embedding_min_score: float = float(os.getenv("EMBEDDING_MIN_SCORE", "0.35"))
  30. database_url: str = os.getenv(
  31. "DATABASE_URL",
  32. "postgresql://memory:memory@localhost:54329/memory_agents",
  33. )
  34. redis_url: str = os.getenv("REDIS_URL", "redis://localhost:6379/0")
  35. letta_base_url: str = os.getenv("LETTA_BASE_URL", "http://localhost:8283").rstrip("/")
  36. letta_api_key: str = os.getenv("LETTA_API_KEY", "")
  37. letta_enabled: bool = _bool("LETTA_ENABLED")
  38. mem0_enabled: bool = _bool("MEM0_ENABLED")
  39. reme_enabled: bool = _bool("REME_ENABLED")
  40. memu_enabled: bool = _bool("MEMU_ENABLED")
  41. settings = Settings()
  42. if not 0.0 <= settings.embedding_min_score <= 1.0:
  43. raise ValueError("EMBEDDING_MIN_SCORE 必须在 0 到 1 之间")
  44. settings.data_dir.mkdir(parents=True, exist_ok=True)
  45. # 可选 SDK 通常只识别 OpenAI 标准变量,这里把项目配置同步给它们。
  46. if settings.llm_api_key:
  47. os.environ.setdefault("OPENAI_API_KEY", settings.llm_api_key)
  48. os.environ.setdefault("DEEPSEEK_API_KEY", settings.llm_api_key)
  49. if settings.llm_base_url:
  50. os.environ.setdefault("OPENAI_BASE_URL", settings.llm_base_url)
  51. os.environ.setdefault("OPENAI_API_BASE", settings.llm_base_url)
  52. os.environ.setdefault("LLM_BACKEND", "openai")
  53. os.environ.setdefault("LLM_API_KEY", settings.llm_api_key)
  54. os.environ.setdefault("LLM_BASE_URL", settings.llm_base_url)
  55. os.environ.setdefault("LLM_MODEL_NAME", settings.llm_model)