settings.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334
  1. from dataclasses import dataclass, field
  2. from urllib.parse import urlsplit
  3. import config
  4. @dataclass(frozen=True)
  5. class GatewaySettings:
  6. base_url: str
  7. bearer: str = field(repr=False)
  8. file_base_url: str = ""
  9. upload_path: str = "ai-agent/ventilation"
  10. timeout: float = 30
  11. max_file_bytes: int = 50 * 1024 * 1024
  12. def __post_init__(self):
  13. for value in (self.base_url, self.file_base_url):
  14. if value:
  15. parts = urlsplit(value)
  16. if parts.scheme not in {"http", "https"} or not parts.netloc or parts.username or parts.password or parts.query or parts.fragment:
  17. raise ValueError("网关及文件系统地址必须为不含凭证或查询串的 HTTP(S) 根地址")
  18. if not self.base_url or not self.bearer.strip():
  19. raise ValueError("启用网关需要 SHANXI_GATEWAY_URL 和 SHANXI_GATEWAY_TOKEN")
  20. if self.timeout <= 0 or self.max_file_bytes <= 0:
  21. raise ValueError("网关超时及文件大小上限必须大于零")
  22. @classmethod
  23. def from_config(cls):
  24. return cls(config.get_str("SHANXI_GATEWAY_URL").rstrip("/"),
  25. config.get_str("SHANXI_GATEWAY_TOKEN"),
  26. config.get_str("SHANXI_FILE_BASE_URL").rstrip("/"),
  27. config.get_str("SHANXI_UPLOAD_PATH", "ai-agent/ventilation"),
  28. config.get_float("SHANXI_HTTP_TIMEOUT", 30),
  29. config.get_int("SHANXI_MAX_FILE_MB", 50) * 1024 * 1024)