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. value = os.getenv(name)
  11. if value is None:
  12. return default
  13. return value.strip().lower() in {"1", "true", "yes", "on"}
  14. @dataclass(frozen=True)
  15. class Settings:
  16. app_env: str = os.getenv("APP_ENV", "development")
  17. workspace_id: str = os.getenv("WORKSPACE_ID", "local-workspace")
  18. data_dir: Path = Path(os.getenv("DATA_DIR", str(ROOT_DIR / "data")))
  19. demo_fallback: bool = _bool("DEMO_FALLBACK", True)
  20. llm_base_url: str = os.getenv("LLM_BASE_URL", "https://api.openai.com/v1").rstrip("/")
  21. llm_api_key: str = os.getenv("LLM_API_KEY", "")
  22. llm_model: str = os.getenv("LLM_MODEL", "gpt-4o-mini")
  23. embedding_base_url: str = os.getenv("EMBEDDING_BASE_URL", "https://api.openai.com/v1").rstrip("/")
  24. embedding_api_key: str = os.getenv("EMBEDDING_API_KEY", "")
  25. embedding_model: str = os.getenv("EMBEDDING_MODEL", "text-embedding-3-small")
  26. embedding_dimensions: int = int(os.getenv("EMBEDDING_DIMENSIONS", "1536"))
  27. embedding_min_score: float = float(os.getenv("EMBEDDING_MIN_SCORE", "0.35"))
  28. database_url: str = os.getenv(
  29. "DATABASE_URL",
  30. "postgresql://memory:memory@localhost:54329/memory_agents",
  31. )
  32. redis_url: str = os.getenv("REDIS_URL", "redis://localhost:6379/0")
  33. letta_base_url: str = os.getenv("LETTA_BASE_URL", "http://localhost:8283").rstrip("/")
  34. letta_api_key: str = os.getenv("LETTA_API_KEY", "")
  35. letta_enabled: bool = _bool("LETTA_ENABLED")
  36. mem0_enabled: bool = _bool("MEM0_ENABLED")
  37. reme_enabled: bool = _bool("REME_ENABLED")
  38. memu_enabled: bool = _bool("MEMU_ENABLED")
  39. settings = Settings()
  40. if not 0.0 <= settings.embedding_min_score <= 1.0:
  41. raise ValueError("EMBEDDING_MIN_SCORE 必须在 0 到 1 之间")
  42. settings.data_dir.mkdir(parents=True, exist_ok=True)
  43. # Some optional SDKs, especially Mem0's default local client, look for the
  44. # conventional OpenAI environment names. Keep the project-facing configuration
  45. # unified while making those SDKs inherit the same OpenAI-compatible endpoint.
  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)