config.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. """
  2. config.py — loads .env and exposes typed settings for the entire project.
  3. No LLM calls. No side effects. Just config.
  4. """
  5. import os
  6. from dataclasses import dataclass
  7. from dotenv import load_dotenv
  8. load_dotenv()
  9. @dataclass(frozen=True)
  10. class Config:
  11. # mem0 server
  12. mem0_base_url: str
  13. mem0_agent_id: str
  14. # Groq
  15. groq_api_key: str
  16. groq_model: str
  17. # Folder paths
  18. books_inbox: str
  19. books_processing: str
  20. books_done: str
  21. books_manifests: str
  22. # Chunking
  23. chunk_size_tokens: int
  24. # Logging
  25. log_level: str
  26. def load_config() -> Config:
  27. def require(key: str) -> str:
  28. val = os.getenv(key)
  29. if not val:
  30. raise EnvironmentError(f"Missing required env var: {key}")
  31. return val
  32. return Config(
  33. mem0_base_url=require("MEM0_BASE_URL").rstrip("/"),
  34. mem0_agent_id=os.getenv("MEM0_AGENT_ID", "knowledge_base"),
  35. groq_api_key=require("GROQ_API_KEY"),
  36. groq_model=os.getenv("GROQ_MODEL", "meta-llama/llama-4-scout-17b-16e-instruct"),
  37. books_inbox=os.getenv("BOOKS_INBOX", "./books/inbox"),
  38. books_processing=os.getenv("BOOKS_PROCESSING", "./books/processing"),
  39. books_done=os.getenv("BOOKS_DONE", "./books/done"),
  40. books_manifests=os.getenv("BOOKS_MANIFESTS", "./books/manifests"),
  41. chunk_size_tokens=int(os.getenv("CHUNK_SIZE_TOKENS", "350")),
  42. log_level=os.getenv("LOG_LEVEL", "INFO"),
  43. )
  44. # Singleton — import this everywhere
  45. cfg = load_config()