settings.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import os
  2. import json
  3. from pathlib import Path
  4. from utils.device_id import get_device_id
  5. # 基础配置
  6. class Settings:
  7. def __init__(self):
  8. # 1. 检测环境
  9. self.is_development = Path(".env.development").exists()
  10. self.env = "development" if self.is_development else "production"
  11. print(f"当前环境: {self.env}")
  12. # 2. 加载配置文件
  13. self._load_env_file()
  14. # API配置
  15. self.DEEPSEEK_API_KEY = self._get_api_key()
  16. self.DEEPSEEK_BASE_URL = os.getenv(
  17. "DEEPSEEK_BASE_URL", "https://api.deepseek.com/v1"
  18. )
  19. # KMS配置
  20. self.KMS_LIST_URL = os.getenv(
  21. "KMS_LIST_URL", "http://kms.longjoe.com:82/KMS/api/common/DocListAi"
  22. )
  23. self.KMS_VIEW_URL = os.getenv(
  24. "KMS_VIEW_URL", "http://kms.longjoe.com:82/KMS/api/common/DocViewAi"
  25. )
  26. # 其他配置
  27. self.LLM_MODEL = "qwen-flash" # os.getenv("LLM_MODEL", "deepseek-chat")
  28. self.LLM_TEMPERATURE = 0.7
  29. self.LLM_MAX_TOKENS = 2048
  30. def _load_env_file(self):
  31. """加载对应的.env文件"""
  32. from dotenv import load_dotenv
  33. env_file = ".env.development" if self.is_development else ".env"
  34. if Path(env_file).exists():
  35. load_dotenv(env_file, override=True)
  36. print(f"加载配置文件: {env_file}")
  37. else:
  38. print(f"配置文件 {env_file} 不存在")
  39. def _get_api_key(self) -> str:
  40. """根据环境获取API Key"""
  41. if self.is_development:
  42. # 开发环境:使用明文
  43. key = os.getenv("DEEPSEEK_API_KEY")
  44. if not key:
  45. print("\n开发环境提示:")
  46. print(" 请在 .env.development 中添加:")
  47. print(" DEEPSEEK_API_KEY=sk-your-key-here")
  48. print("=" * 40)
  49. return key or ""
  50. else:
  51. # 生产环境:必须使用加密
  52. encrypted_key = os.getenv("ENCRYPTED_DEEPSEEK_KEY")
  53. if not encrypted_key:
  54. raise ValueError("生产环境需要 ENCRYPTED_DEEPSEEK_KEY")
  55. master_key = "ialwayslovelongjoe"
  56. return self._decrypt_key(encrypted_key, master_key)
  57. def _decrypt_key(self, encrypted_key: str, master_key: str) -> str:
  58. """解密API Key"""
  59. # 简单版AES解密
  60. from Crypto.Cipher import AES
  61. from Crypto.Util.Padding import unpad
  62. import base64
  63. import hashlib
  64. try:
  65. # 生成密钥
  66. aes_key = hashlib.sha256(master_key.encode()).digest()
  67. iv = hashlib.md5(master_key.encode()).digest()
  68. # 解密
  69. cipher = AES.new(aes_key, AES.MODE_CBC, iv)
  70. ct = base64.b64decode(encrypted_key)
  71. pt = unpad(cipher.decrypt(ct), AES.block_size)
  72. data = json.loads(pt.decode("utf-8"))
  73. # 验证设备ID
  74. if data.get("device_code", "") != get_device_id():
  75. raise ValueError("设备ID不匹配,APIKEY无效,请联系软件公司")
  76. return data.get("api_key", "")
  77. except Exception as e:
  78. raise ValueError(f"解密失败: {e}")
  79. # 创建全局实例
  80. settings = Settings()