config.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from __future__ import annotations
  2. from functools import lru_cache
  3. from pathlib import Path
  4. from pydantic import Field, SecretStr
  5. from pydantic import field_validator
  6. from pydantic_settings import BaseSettings, SettingsConfigDict
  7. # 运行时通过源码位置确定项目根目录,不能依赖执行命令时的当前目录。
  8. # 仓库移动、CI Checkout 或其他开发者 Clone 后,该值会自动变化。
  9. PROJECT_ROOT = Path(__file__).resolve().parents[1]
  10. class Settings(BaseSettings):
  11. model_config = SettingsConfigDict(
  12. env_file=PROJECT_ROOT / ".env",
  13. env_file_encoding="utf-8",
  14. extra="ignore",
  15. )
  16. app_env: str = "development"
  17. llm_provider: str = "demo"
  18. # SecretStr 会在 repr、日志和校验错误中自动隐藏真实凭证。
  19. deepseek_api_key: SecretStr = SecretStr("")
  20. deepseek_base_url: str = "https://api.deepseek.com"
  21. deepseek_model_name: str = "deepseek-v4-flash"
  22. deepseek_answer_thinking: bool = True
  23. tavily_api_key: SecretStr = SecretStr("")
  24. web_search_max_results: int = Field(default=5, ge=1, le=10)
  25. embedding_provider: str = "hash"
  26. embedding_model_name: str = (
  27. "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
  28. )7
  29. hash_embedding_dim: int = Field(default=256, ge=64, le=4096)
  30. milvus_uri: str = "http://localhost:19530"
  31. milvus_token: SecretStr = SecretStr("")
  32. milvus_collection: str = "agentic_rag_docs"
  33. sqlite_path: Path = Path("./data/shop.db")
  34. orders_source_path: Path = Path("./data/source/orders.csv")
  35. documents_path: Path = Path("./data/documents")
  36. max_retrieval_rounds: int = Field(default=2, ge=1, le=5)
  37. min_evidence_score: float = Field(default=0.35, ge=0.0, le=1.0)
  38. @field_validator(
  39. "sqlite_path",
  40. "orders_source_path",
  41. "documents_path",
  42. mode="after",
  43. )
  44. @classmethod
  45. def resolve_repository_path(cls, value: Path) -> Path:
  46. """将仓库相对路径解析为绝对路径,同时保留外部绝对路径。"""
  47. if value.is_absolute():
  48. return value.resolve()
  49. return (PROJECT_ROOT / value).resolve()
  50. @lru_cache(maxsize=1)
  51. def get_settings() -> Settings:
  52. return Settings()