config.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. # Throttling — delay between POSTs to spare the embedder/GPU
  25. ingest_delay: float
  26. # Logging
  27. log_level: str
  28. def load_config() -> Config:
  29. def require(key: str) -> str:
  30. val = os.getenv(key)
  31. if not val:
  32. raise EnvironmentError(f"Missing required env var: {key}")
  33. return val
  34. return Config(
  35. mem0_base_url=require("MEM0_BASE_URL").rstrip("/"),
  36. mem0_agent_id=os.getenv("MEM0_AGENT_ID", "knowledge_base"),
  37. groq_api_key=require("GROQ_API_KEY"),
  38. groq_model=os.getenv("GROQ_MODEL", "meta-llama/llama-4-scout-17b-16e-instruct"),
  39. books_inbox=os.getenv("BOOKS_INBOX", "./books/inbox"),
  40. books_processing=os.getenv("BOOKS_PROCESSING", "./books/processing"),
  41. books_done=os.getenv("BOOKS_DONE", "./books/done"),
  42. books_manifests=os.getenv("BOOKS_MANIFESTS", "./books/manifests"),
  43. chunk_size_tokens=int(os.getenv("CHUNK_SIZE_TOKENS", "350")),
  44. ingest_delay=float(os.getenv("INGEST_DELAY", "0.5")),
  45. log_level=os.getenv("LOG_LEVEL", "INFO"),
  46. )
  47. # Singleton — import this everywhere
  48. cfg = load_config()