import os from pydantic import BaseModel, Field from dotenv import load_dotenv load_dotenv() PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) class LLMConfig(BaseModel): api_key: str = Field(default=os.getenv("LLM_API_KEY", "")) base_url: str = Field(default=os.getenv("LLM_BASE_URL", "https://api.deepseek.com/v1")) model: str = Field(default=os.getenv("LLM_MODEL", "deepseek-chat")) max_tokens: int = Field(default=64000) temperature: float = Field(default=0.95) class EmbeddingConfig(BaseModel): api_key: str = Field(default=os.getenv("EMBEDDING_API_KEY", "")) api_base: str = Field(default=os.getenv("EMBEDDING_BASE_URL", "https://api.openai.com/v1")) model: str = Field(default=os.getenv("EMBEDDING_MODEL", "text-embedding-3-small")) class ObsidianConfig(BaseModel): vault_path: str = Field(default=os.path.join(PROJECT_ROOT, "obsidian_vault")) meetings_dir: str = Field(default="Meetings") entities_dir: str = Field(default="Entities") graphs_dir: str = Field(default="Graphs") raw_dir: str = Field(default="Raw") class VectorStoreConfig(BaseModel): persist_dir: str = Field(default=os.path.join(PROJECT_ROOT, "vector_store_data")) class ProjectConfig(BaseModel): llm: LLMConfig = Field(default_factory=LLMConfig) embedding: EmbeddingConfig = Field(default_factory=EmbeddingConfig) obsidian: ObsidianConfig = Field(default_factory=ObsidianConfig) vector_store: VectorStoreConfig = Field(default_factory=VectorStoreConfig) state_path: str = Field(default=os.path.join(PROJECT_ROOT, "obsidian_vault", "meeting_state.json")) config = ProjectConfig()