1 line
29 KiB
JSON
1 line
29 KiB
JSON
{"repo": "abaiar/-lexai", "files": {"backend/config.py": {"e90b39c5be4750c57820cf8c40fd2d2f2a5038d6": {"t": 1785674095.544624, "n": 7475, "h": "f1e8f7b11b60e4c2", "c": "import os\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n# 全局修复 httpx HTTPS 连接问题:monkey-patch httpx.AsyncClient\n# 使其默认使用 urllib transport,解决本机 httpx 无法建立 HTTPS 连接的问题\nimport httpx\nfrom utils.urllib_transport import AsyncUrllibTransport, UrllibTransport\n\n_original_async_client_init = httpx.AsyncClient.__init__\n_original_client_init = httpx.Client.__init__\n\n\ndef _patched_async_client_init(self, **kwargs):\n if \"transport\" not in kwargs and kwargs.get(\"verify\", True) is not False:\n kwargs[\"transport\"] = AsyncUrllibTransport()\n kwargs[\"verify\"] = False\n _original_async_client_init(self, **kwargs)\n\n\ndef _patched_client_init(self, **kwargs):\n if \"transport\" not in kwargs and kwargs.get(\"verify\", True) is not False:\n kwargs[\"transport\"] = UrllibTransport()\n kwargs[\"verify\"] = False\n _original_client_init(self, **kwargs)\n\n\nhttpx.AsyncClient.__init__ = _patched_async_client_init\nhttpx.Client.__init__ = _patched_client_init\n\n\nLLM_PROVIDERS = {\n \"dashscope\": {\n \"name\": \"阿里云百炼 (DashScope)\",\n \"base_url\": \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n \"models\": [\"qwen-turbo\", \"qwen-plus\", \"qwen-max\", \"qwen-long\", \"qwen-max-longcontext\"],\n \"default_model\": \"qwen-turbo\",\n \"key_prefix\": \"sk-\",\n \"key_hint\": \"sk-开头的 API Key\",\n \"api_key_env\": \"DASHSCOPE_API_KEY\",\n },\n \"tencent_hunyuan\": {\n \"name\": \"腾讯混元 (Hunyuan)\",\n \"base_url\": \"https://api.hunyuan.cloud.tencent.com/v1\",\n \"models\": [\"hunyuan-lite\", \"hunyuan-standard\", \"hunyuan-pro\", \"hunyuan-turbo\", \"hunyuan-turbo-latest\"],\n \"default_model\": \"hunyuan-lite\",\n \"key_prefix\": \"\",\n \"key_hint\": \"腾讯云 API Key\",\n \"api_key_env\": \"TENCENT_HUNYUAN_API_KEY\",\n },\n \"openai\": {\n \"name\": \"OpenAI\",\n \"base_url\": \"https://api.openai.com/v1\",\n \"models\": [\"gpt-4o\", \"gpt-4o-mini\", \"gpt-4-turbo\", \"gpt-3.5-turbo\"],\n \"default_model\": \"gpt-4o-mini\",\n \"key_prefix\": \"sk-\",\n \"key_hint\": \"sk-开头的 API Key\",\n \"api_key_env\": \"OPENAI_API_KEY\",\n },\n \"deepseek\": {\n \"name\": \"DeepSeek\",\n \"base_url\": \"https://api.deepseek.com/v1\",\n \"models\": [\"deepseek-chat\", \"deepseek-reasoner\"],\n \"default_model\": \"deepseek-chat\",\n \"key_prefix\": \"sk-\",\n \"key_hint\": \"sk-开头的 API Key\",\n \"api_key_env\": \"DEEPSEEK_API_KEY\",\n },\n \"zhipu\": {\n \"name\": \"智谱 AI (GLM)\",\n \"base_url\": \"https://open.bigmodel.cn/api/paas/v4\",\n \"models\": [\"glm-4-plus\", \"glm-4-flash\", \"glm-4-long\", \"glm-4\"],\n \"default_model\": \"glm-4-flash\",\n \"key_prefix\": \"\",\n \"key_hint\": \"智谱 API Key (xxx.xxxxx格式)\",\n \"api_key_env\": \"ZHIPU_API_KEY\",\n },\n \"moonshot\": {\n \"name\": \"Moonshot (Kimi)\",\n \"base_url\": \"https://api.moonshot.cn/v1\",\n \"models\": [\"moonshot-v1-8k\", \"moonshot-v1-32k\", \"moonshot-v1-128k\"],\n \"default_model\": \"moonshot-v1-8k\",\n \"key_prefix\": \"sk-\",\n \"key_hint\": \"sk-开头的 API Key\",\n \"api_key_env\": \"MOONSHOT_API_KEY\",\n },\n \"minimax\": {\n \"name\": \"MiniMax\",\n \"base_url\": \"https://api.minimax.chat/v1\",\n \"models\": [\"MiniMax-Text-01\", \"abab6.5s-chat\"],\n \"default_model\": \"MiniMax-Text-01\",\n \"key_prefix\": \"\",\n \"key_hint\": \"MiniMax API Key\",\n \"api_key_env\": \"MINIMAX_API_KEY\",\n },\n \"anthropic\": {\n \"name\": \"Anthropic (Claude)\",\n \"base_url\": \"https://api.anthropic.com/v1\",\n \"models\": [\"claude-sonnet-4-20250514\", \"claude-3-5-haiku-20241022\"],\n \"default_model\": \"claude-sonnet-4-20250514\",\n \"key_prefix\": \"sk-ant-\",\n \"key_hint\": \"sk-ant-开头的 API Key\",\n \"api_key_env\": \"ANTHROPIC_API_KEY\",\n },\n \"google\": {\n \"name\": \"Google (Gemini)\",\n \"base_url\": \"https://generativelanguage.googleapis.com/v1beta/openai\",\n \"models\": [\"gemini-2.0-flash\", \"gemini-2.0-flash-lite\", \"gemini-1.5-pro\"],\n \"default_model\": \"gemini-2.0-flash\",\n \"key_prefix\": \"AI\",\n \"key_hint\": \"AI开头的 API Key\",\n \"api_key_env\": \"GOOGLE_API_KEY\",\n },\n}\n\n\nclass Settings:\n DASHSCOPE_API_KEY: str = os.getenv(\"DASHSCOPE_API_KEY\", \"\")\n TENCENT_HUNYUAN_API_KEY: str = os.getenv(\"TENCENT_HUNYUAN_API_KEY\", \"\")\n OPENAI_API_KEY: str = os.getenv(\"OPENAI_API_KEY\", \"\")\n DEEPSEEK_API_KEY: str = os.getenv(\"DEEPSEEK_API_KEY\", \"\")\n ZHIPU_API_KEY: str = os.getenv(\"ZHIPU_API_KEY\", \"\")\n MOONSHOT_API_KEY: str = os.getenv(\"MOONSHOT_API_KEY\", \"\")\n MINIMAX_API_KEY: str = os.getenv(\"MINIMAX_API_KEY\", \"\")\n ANTHROPIC_API_KEY: str = os.getenv(\"ANTHROPIC_API_KEY\", \"\")\n GOOGLE_API_KEY: str = os.getenv(\"GOOGLE_API_KEY\", \"\")\n\n LLM_PROVIDER: str = os.getenv(\"LLM_PROVIDER\", \"dashscope\")\n LLM_MODEL_NAME: str = os.getenv(\"LLM_MODEL_NAME\", \"qwen-turbo\")\n LLM_BASE_URL: str = os.getenv(\"LLM_BASE_URL\", LLM_PROVIDERS[\"dashscope\"][\"base_url\"])\n\n DELI_APPID: str = os.getenv(\"DELI_APPID\", \"\")\n DELI_SECRET: str = os.getenv(\"DELI_SECRET\", \"\")\n\n SECRET_KEY: str = os.getenv(\"SECRET_KEY\", \"your-jwt-secret-key-here\")\n ACCESS_TOKEN_EXPIRE_MINUTES: int = int(os.getenv(\"ACCESS_TOKEN_EXPIRE_MINUTES\", \"1440\"))\n\n BACKEND_PORT: int = int(os.getenv(\"BACKEND_PORT\", \"8000\"))\n\n ALGORITHM: str = \"HS256\"\n\n DB_HOST: str = os.getenv(\"DB_HOST\", \"localhost\")\n DB_PORT: int = int(os.getenv(\"DB_PORT\", \"3306\"))\n DB_USER: str = os.getenv(\"DB_USER\", \"root\")\n DB_PASSWORD: str = os.getenv(\"DB_PASSWORD\", \"\")\n DB_NAME: str = os.getenv(\"DB_NAME\", \"lax_user_db\")\n\n _user_provider: str = \"\"\n _user_api_key: str = \"\"\n _user_model: str = \"\"\n\n def get_active_api_key(self) -> str:\n if self._user_api_key:\n return self._user_api_key\n provider = self._user_provider or self.LLM_PROVIDER\n env_key = LLM_PROVIDERS.get(provider, {}).get(\"api_key_env\", \"DASHSCOPE_API_KEY\")\n return getattr(self, env_key, \"\") or self.DASHSCOPE_API_KEY\n\n def get_active_base_url(self) -> str:\n if self._user_provider:\n return LLM_PROVIDERS.get(self._user_provider, {}).get(\"base_url\", self.LLM_BASE_URL)\n return self.LLM_BASE_URL\n\n def get_active_model(self) -> str:\n if self._user_model:\n return self._user_model\n return self.LLM_MODEL_NAME\n\n def update_llm_config(self, provider: str = \"\", api_key: str = \"\", model_name: str = \"\"):\n if provider:\n self._user_provider = provider\n if api_key:\n self._user_api_key = api_key\n if model_name:\n self._user_model = model_name\n\n def is_api_key_configured(self) -> bool:\n return bool(self.get_active_api_key())\n\n def get_provider_info(self, provider: str) -> dict:\n return LLM_PROVIDERS.get(provider, {})\n\n\nsettings = Settings()\n\n\ndef get_llm(**kwargs):\n \"\"\"创建 LLM 客户端,自动使用 urllib transport 解决 httpx 连接问题\"\"\"\n from langchain_openai import ChatOpenAI\n from utils.urllib_transport import get_http_client\n\n api_key = kwargs.pop(\"api_key\", None) or settings.get_active_api_key()\n base_url = kwargs.pop(\"base_url\", None) or settings.get_active_base_url()\n model_name = kwargs.pop(\"model_name\", None) or settings.get_active_model()\n\n return ChatOpenAI(\n model=model_name,\n api_key=api_key,\n base_url=base_url,\n http_async_client=get_http_client(async_client=True),\n http_client=get_http_client(async_client=False),\n **kwargs,\n )\n"}, "3c9e1723f3bca3198258aac67d130b5e9ece2b44": {"t": 1785768216.7256262, "n": 7475, "h": "f1e8f7b11b60e4c2", "c": "import os\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n# 全局修复 httpx HTTPS 连接问题:monkey-patch httpx.AsyncClient\n# 使其默认使用 urllib transport,解决本机 httpx 无法建立 HTTPS 连接的问题\nimport httpx\nfrom utils.urllib_transport import AsyncUrllibTransport, UrllibTransport\n\n_original_async_client_init = httpx.AsyncClient.__init__\n_original_client_init = httpx.Client.__init__\n\n\ndef _patched_async_client_init(self, **kwargs):\n if \"transport\" not in kwargs and kwargs.get(\"verify\", True) is not False:\n kwargs[\"transport\"] = AsyncUrllibTransport()\n kwargs[\"verify\"] = False\n _original_async_client_init(self, **kwargs)\n\n\ndef _patched_client_init(self, **kwargs):\n if \"transport\" not in kwargs and kwargs.get(\"verify\", True) is not False:\n kwargs[\"transport\"] = UrllibTransport()\n kwargs[\"verify\"] = False\n _original_client_init(self, **kwargs)\n\n\nhttpx.AsyncClient.__init__ = _patched_async_client_init\nhttpx.Client.__init__ = _patched_client_init\n\n\nLLM_PROVIDERS = {\n \"dashscope\": {\n \"name\": \"阿里云百炼 (DashScope)\",\n \"base_url\": \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n \"models\": [\"qwen-turbo\", \"qwen-plus\", \"qwen-max\", \"qwen-long\", \"qwen-max-longcontext\"],\n \"default_model\": \"qwen-turbo\",\n \"key_prefix\": \"sk-\",\n \"key_hint\": \"sk-开头的 API Key\",\n \"api_key_env\": \"DASHSCOPE_API_KEY\",\n },\n \"tencent_hunyuan\": {\n \"name\": \"腾讯混元 (Hunyuan)\",\n \"base_url\": \"https://api.hunyuan.cloud.tencent.com/v1\",\n \"models\": [\"hunyuan-lite\", \"hunyuan-standard\", \"hunyuan-pro\", \"hunyuan-turbo\", \"hunyuan-turbo-latest\"],\n \"default_model\": \"hunyuan-lite\",\n \"key_prefix\": \"\",\n \"key_hint\": \"腾讯云 API Key\",\n \"api_key_env\": \"TENCENT_HUNYUAN_API_KEY\",\n },\n \"openai\": {\n \"name\": \"OpenAI\",\n \"base_url\": \"https://api.openai.com/v1\",\n \"models\": [\"gpt-4o\", \"gpt-4o-mini\", \"gpt-4-turbo\", \"gpt-3.5-turbo\"],\n \"default_model\": \"gpt-4o-mini\",\n \"key_prefix\": \"sk-\",\n \"key_hint\": \"sk-开头的 API Key\",\n \"api_key_env\": \"OPENAI_API_KEY\",\n },\n \"deepseek\": {\n \"name\": \"DeepSeek\",\n \"base_url\": \"https://api.deepseek.com/v1\",\n \"models\": [\"deepseek-chat\", \"deepseek-reasoner\"],\n \"default_model\": \"deepseek-chat\",\n \"key_prefix\": \"sk-\",\n \"key_hint\": \"sk-开头的 API Key\",\n \"api_key_env\": \"DEEPSEEK_API_KEY\",\n },\n \"zhipu\": {\n \"name\": \"智谱 AI (GLM)\",\n \"base_url\": \"https://open.bigmodel.cn/api/paas/v4\",\n \"models\": [\"glm-4-plus\", \"glm-4-flash\", \"glm-4-long\", \"glm-4\"],\n \"default_model\": \"glm-4-flash\",\n \"key_prefix\": \"\",\n \"key_hint\": \"智谱 API Key (xxx.xxxxx格式)\",\n \"api_key_env\": \"ZHIPU_API_KEY\",\n },\n \"moonshot\": {\n \"name\": \"Moonshot (Kimi)\",\n \"base_url\": \"https://api.moonshot.cn/v1\",\n \"models\": [\"moonshot-v1-8k\", \"moonshot-v1-32k\", \"moonshot-v1-128k\"],\n \"default_model\": \"moonshot-v1-8k\",\n \"key_prefix\": \"sk-\",\n \"key_hint\": \"sk-开头的 API Key\",\n \"api_key_env\": \"MOONSHOT_API_KEY\",\n },\n \"minimax\": {\n \"name\": \"MiniMax\",\n \"base_url\": \"https://api.minimax.chat/v1\",\n \"models\": [\"MiniMax-Text-01\", \"abab6.5s-chat\"],\n \"default_model\": \"MiniMax-Text-01\",\n \"key_prefix\": \"\",\n \"key_hint\": \"MiniMax API Key\",\n \"api_key_env\": \"MINIMAX_API_KEY\",\n },\n \"anthropic\": {\n \"name\": \"Anthropic (Claude)\",\n \"base_url\": \"https://api.anthropic.com/v1\",\n \"models\": [\"claude-sonnet-4-20250514\", \"claude-3-5-haiku-20241022\"],\n \"default_model\": \"claude-sonnet-4-20250514\",\n \"key_prefix\": \"sk-ant-\",\n \"key_hint\": \"sk-ant-开头的 API Key\",\n \"api_key_env\": \"ANTHROPIC_API_KEY\",\n },\n \"google\": {\n \"name\": \"Google (Gemini)\",\n \"base_url\": \"https://generativelanguage.googleapis.com/v1beta/openai\",\n \"models\": [\"gemini-2.0-flash\", \"gemini-2.0-flash-lite\", \"gemini-1.5-pro\"],\n \"default_model\": \"gemini-2.0-flash\",\n \"key_prefix\": \"AI\",\n \"key_hint\": \"AI开头的 API Key\",\n \"api_key_env\": \"GOOGLE_API_KEY\",\n },\n}\n\n\nclass Settings:\n DASHSCOPE_API_KEY: str = os.getenv(\"DASHSCOPE_API_KEY\", \"\")\n TENCENT_HUNYUAN_API_KEY: str = os.getenv(\"TENCENT_HUNYUAN_API_KEY\", \"\")\n OPENAI_API_KEY: str = os.getenv(\"OPENAI_API_KEY\", \"\")\n DEEPSEEK_API_KEY: str = os.getenv(\"DEEPSEEK_API_KEY\", \"\")\n ZHIPU_API_KEY: str = os.getenv(\"ZHIPU_API_KEY\", \"\")\n MOONSHOT_API_KEY: str = os.getenv(\"MOONSHOT_API_KEY\", \"\")\n MINIMAX_API_KEY: str = os.getenv(\"MINIMAX_API_KEY\", \"\")\n ANTHROPIC_API_KEY: str = os.getenv(\"ANTHROPIC_API_KEY\", \"\")\n GOOGLE_API_KEY: str = os.getenv(\"GOOGLE_API_KEY\", \"\")\n\n LLM_PROVIDER: str = os.getenv(\"LLM_PROVIDER\", \"dashscope\")\n LLM_MODEL_NAME: str = os.getenv(\"LLM_MODEL_NAME\", \"qwen-turbo\")\n LLM_BASE_URL: str = os.getenv(\"LLM_BASE_URL\", LLM_PROVIDERS[\"dashscope\"][\"base_url\"])\n\n DELI_APPID: str = os.getenv(\"DELI_APPID\", \"\")\n DELI_SECRET: str = os.getenv(\"DELI_SECRET\", \"\")\n\n SECRET_KEY: str = os.getenv(\"SECRET_KEY\", \"your-jwt-secret-key-here\")\n ACCESS_TOKEN_EXPIRE_MINUTES: int = int(os.getenv(\"ACCESS_TOKEN_EXPIRE_MINUTES\", \"1440\"))\n\n BACKEND_PORT: int = int(os.getenv(\"BACKEND_PORT\", \"8000\"))\n\n ALGORITHM: str = \"HS256\"\n\n DB_HOST: str = os.getenv(\"DB_HOST\", \"localhost\")\n DB_PORT: int = int(os.getenv(\"DB_PORT\", \"3306\"))\n DB_USER: str = os.getenv(\"DB_USER\", \"root\")\n DB_PASSWORD: str = os.getenv(\"DB_PASSWORD\", \"\")\n DB_NAME: str = os.getenv(\"DB_NAME\", \"lax_user_db\")\n\n _user_provider: str = \"\"\n _user_api_key: str = \"\"\n _user_model: str = \"\"\n\n def get_active_api_key(self) -> str:\n if self._user_api_key:\n return self._user_api_key\n provider = self._user_provider or self.LLM_PROVIDER\n env_key = LLM_PROVIDERS.get(provider, {}).get(\"api_key_env\", \"DASHSCOPE_API_KEY\")\n return getattr(self, env_key, \"\") or self.DASHSCOPE_API_KEY\n\n def get_active_base_url(self) -> str:\n if self._user_provider:\n return LLM_PROVIDERS.get(self._user_provider, {}).get(\"base_url\", self.LLM_BASE_URL)\n return self.LLM_BASE_URL\n\n def get_active_model(self) -> str:\n if self._user_model:\n return self._user_model\n return self.LLM_MODEL_NAME\n\n def update_llm_config(self, provider: str = \"\", api_key: str = \"\", model_name: str = \"\"):\n if provider:\n self._user_provider = provider\n if api_key:\n self._user_api_key = api_key\n if model_name:\n self._user_model = model_name\n\n def is_api_key_configured(self) -> bool:\n return bool(self.get_active_api_key())\n\n def get_provider_info(self, provider: str) -> dict:\n return LLM_PROVIDERS.get(provider, {})\n\n\nsettings = Settings()\n\n\ndef get_llm(**kwargs):\n \"\"\"创建 LLM 客户端,自动使用 urllib transport 解决 httpx 连接问题\"\"\"\n from langchain_openai import ChatOpenAI\n from utils.urllib_transport import get_http_client\n\n api_key = kwargs.pop(\"api_key\", None) or settings.get_active_api_key()\n base_url = kwargs.pop(\"base_url\", None) or settings.get_active_base_url()\n model_name = kwargs.pop(\"model_name\", None) or settings.get_active_model()\n\n return ChatOpenAI(\n model=model_name,\n api_key=api_key,\n base_url=base_url,\n http_async_client=get_http_client(async_client=True),\n http_client=get_http_client(async_client=False),\n **kwargs,\n )\n"}, "78d9c1df33f6084352d53d7646eae8446d78b596": {"t": 1785768219.7875946, "n": 5906, "h": "14bb71e4463b2ca6", "c": "import os\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n\nLLM_PROVIDERS = {\n \"dashscope\": {\n \"name\": \"阿里云百炼 (DashScope)\",\n \"base_url\": \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n \"models\": [\"qwen-turbo\", \"qwen-plus\", \"qwen-max\", \"qwen-long\", \"qwen-max-longcontext\"],\n \"default_model\": \"qwen-turbo\",\n \"key_prefix\": \"sk-\",\n \"key_hint\": \"sk-开头的 API Key\",\n \"api_key_env\": \"DASHSCOPE_API_KEY\",\n },\n \"tencent_hunyuan\": {\n \"name\": \"腾讯混元 (Hunyuan)\",\n \"base_url\": \"https://api.hunyuan.cloud.tencent.com/v1\",\n \"models\": [\"hunyuan-lite\", \"hunyuan-standard\", \"hunyuan-pro\", \"hunyuan-turbo\", \"hunyuan-turbo-latest\"],\n \"default_model\": \"hunyuan-lite\",\n \"key_prefix\": \"\",\n \"key_hint\": \"腾讯云 API Key\",\n \"api_key_env\": \"TENCENT_HUNYUAN_API_KEY\",\n },\n \"openai\": {\n \"name\": \"OpenAI\",\n \"base_url\": \"https://api.openai.com/v1\",\n \"models\": [\"gpt-4o\", \"gpt-4o-mini\", \"gpt-4-turbo\", \"gpt-3.5-turbo\"],\n \"default_model\": \"gpt-4o-mini\",\n \"key_prefix\": \"sk-\",\n \"key_hint\": \"sk-开头的 API Key\",\n \"api_key_env\": \"OPENAI_API_KEY\",\n },\n \"deepseek\": {\n \"name\": \"DeepSeek\",\n \"base_url\": \"https://api.deepseek.com/v1\",\n \"models\": [\"deepseek-chat\", \"deepseek-reasoner\"],\n \"default_model\": \"deepseek-chat\",\n \"key_prefix\": \"sk-\",\n \"key_hint\": \"sk-开头的 API Key\",\n \"api_key_env\": \"DEEPSEEK_API_KEY\",\n },\n \"zhipu\": {\n \"name\": \"智谱 AI (GLM)\",\n \"base_url\": \"https://open.bigmodel.cn/api/paas/v4\",\n \"models\": [\"glm-4-plus\", \"glm-4-flash\", \"glm-4-long\", \"glm-4\"],\n \"default_model\": \"glm-4-flash\",\n \"key_prefix\": \"\",\n \"key_hint\": \"智谱 API Key (xxx.xxxxx格式)\",\n \"api_key_env\": \"ZHIPU_API_KEY\",\n },\n \"moonshot\": {\n \"name\": \"Moonshot (Kimi)\",\n \"base_url\": \"https://api.moonshot.cn/v1\",\n \"models\": [\"moonshot-v1-8k\", \"moonshot-v1-32k\", \"moonshot-v1-128k\"],\n \"default_model\": \"moonshot-v1-8k\",\n \"key_prefix\": \"sk-\",\n \"key_hint\": \"sk-开头的 API Key\",\n \"api_key_env\": \"MOONSHOT_API_KEY\",\n },\n \"minimax\": {\n \"name\": \"MiniMax\",\n \"base_url\": \"https://api.minimax.chat/v1\",\n \"models\": [\"MiniMax-Text-01\", \"abab6.5s-chat\"],\n \"default_model\": \"MiniMax-Text-01\",\n \"key_prefix\": \"\",\n \"key_hint\": \"MiniMax API Key\",\n \"api_key_env\": \"MINIMAX_API_KEY\",\n },\n \"anthropic\": {\n \"name\": \"Anthropic (Claude)\",\n \"base_url\": \"https://api.anthropic.com/v1\",\n \"models\": [\"claude-sonnet-4-20250514\", \"claude-3-5-haiku-20241022\"],\n \"default_model\": \"claude-sonnet-4-20250514\",\n \"key_prefix\": \"sk-ant-\",\n \"key_hint\": \"sk-ant-开头的 API Key\",\n \"api_key_env\": \"ANTHROPIC_API_KEY\",\n },\n \"google\": {\n \"name\": \"Google (Gemini)\",\n \"base_url\": \"https://generativelanguage.googleapis.com/v1beta/openai\",\n \"models\": [\"gemini-2.0-flash\", \"gemini-2.0-flash-lite\", \"gemini-1.5-pro\"],\n \"default_model\": \"gemini-2.0-flash\",\n \"key_prefix\": \"AI\",\n \"key_hint\": \"AI开头的 API Key\",\n \"api_key_env\": \"GOOGLE_API_KEY\",\n },\n}\n\n\nclass Settings:\n DASHSCOPE_API_KEY: str = os.getenv(\"DASHSCOPE_API_KEY\", \"\")\n TENCENT_HUNYUAN_API_KEY: str = os.getenv(\"TENCENT_HUNYUAN_API_KEY\", \"\")\n OPENAI_API_KEY: str = os.getenv(\"OPENAI_API_KEY\", \"\")\n DEEPSEEK_API_KEY: str = os.getenv(\"DEEPSEEK_API_KEY\", \"\")\n ZHIPU_API_KEY: str = os.getenv(\"ZHIPU_API_KEY\", \"\")\n MOONSHOT_API_KEY: str = os.getenv(\"MOONSHOT_API_KEY\", \"\")\n MINIMAX_API_KEY: str = os.getenv(\"MINIMAX_API_KEY\", \"\")\n ANTHROPIC_API_KEY: str = os.getenv(\"ANTHROPIC_API_KEY\", \"\")\n GOOGLE_API_KEY: str = os.getenv(\"GOOGLE_API_KEY\", \"\")\n\n LLM_PROVIDER: str = os.getenv(\"LLM_PROVIDER\", \"dashscope\")\n LLM_MODEL_NAME: str = os.getenv(\"LLM_MODEL_NAME\", \"qwen-turbo\")\n LLM_BASE_URL: str = os.getenv(\"LLM_BASE_URL\", LLM_PROVIDERS[\"dashscope\"][\"base_url\"])\n\n DELI_APPID: str = os.getenv(\"DELI_APPID\", \"\")\n DELI_SECRET: str = os.getenv(\"DELI_SECRET\", \"\")\n\n SECRET_KEY: str = os.getenv(\"SECRET_KEY\", \"your-jwt-secret-key-here\")\n ACCESS_TOKEN_EXPIRE_MINUTES: int = int(os.getenv(\"ACCESS_TOKEN_EXPIRE_MINUTES\", \"1440\"))\n\n BACKEND_PORT: int = int(os.getenv(\"BACKEND_PORT\", \"8000\"))\n\n ALGORITHM: str = \"HS256\"\n\n DB_HOST: str = os.getenv(\"DB_HOST\", \"localhost\")\n DB_PORT: int = int(os.getenv(\"DB_PORT\", \"3306\"))\n DB_USER: str = os.getenv(\"DB_USER\", \"root\")\n DB_PASSWORD: str = os.getenv(\"DB_PASSWORD\", \"\")\n DB_NAME: str = os.getenv(\"DB_NAME\", \"lax_user_db\")\n\n _user_provider: str = \"\"\n _user_api_key: str = \"\"\n _user_model: str = \"\"\n\n def get_active_api_key(self) -> str:\n if self._user_api_key:\n return self._user_api_key\n provider = self._user_provider or self.LLM_PROVIDER\n env_key = LLM_PROVIDERS.get(provider, {}).get(\"api_key_env\", \"DASHSCOPE_API_KEY\")\n return getattr(self, env_key, \"\") or self.DASHSCOPE_API_KEY\n\n def get_active_base_url(self) -> str:\n if self._user_provider:\n return LLM_PROVIDERS.get(self._user_provider, {}).get(\"base_url\", self.LLM_BASE_URL)\n return self.LLM_BASE_URL\n\n def get_active_model(self) -> str:\n if self._user_model:\n return self._user_model\n return self.LLM_MODEL_NAME\n\n def update_llm_config(self, provider: str = \"\", api_key: str = \"\", model_name: str = \"\"):\n if provider:\n self._user_provider = provider\n if api_key:\n self._user_api_key = api_key\n if model_name:\n self._user_model = model_name\n\n def is_api_key_configured(self) -> bool:\n return bool(self.get_active_api_key())\n\n def get_provider_info(self, provider: str) -> dict:\n return LLM_PROVIDERS.get(provider, {})\n\n\nsettings = Settings()\n"}, "7962723adcf53fd3834b813a77f0314f3e497555": {"t": 1785768221.348645, "n": 5436, "h": "660810903efb3eb7", "c": "import os\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\n\nLLM_PROVIDERS = {\n \"dashscope\": {\n \"name\": \"阿里云百炼 (DashScope)\",\n \"base_url\": \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n \"models\": [\"qwen-turbo\", \"qwen-plus\", \"qwen-max\", \"qwen-long\", \"qwen-max-longcontext\"],\n \"default_model\": \"qwen-turbo\",\n \"key_prefix\": \"sk-\",\n \"key_hint\": \"sk-开头的 API Key\",\n \"api_key_env\": \"DASHSCOPE_API_KEY\",\n },\n \"openai\": {\n \"name\": \"OpenAI\",\n \"base_url\": \"https://api.openai.com/v1\",\n \"models\": [\"gpt-4o\", \"gpt-4o-mini\", \"gpt-4-turbo\", \"gpt-3.5-turbo\"],\n \"default_model\": \"gpt-4o-mini\",\n \"key_prefix\": \"sk-\",\n \"key_hint\": \"sk-开头的 API Key\",\n \"api_key_env\": \"OPENAI_API_KEY\",\n },\n \"deepseek\": {\n \"name\": \"DeepSeek\",\n \"base_url\": \"https://api.deepseek.com/v1\",\n \"models\": [\"deepseek-chat\", \"deepseek-reasoner\"],\n \"default_model\": \"deepseek-chat\",\n \"key_prefix\": \"sk-\",\n \"key_hint\": \"sk-开头的 API Key\",\n \"api_key_env\": \"DEEPSEEK_API_KEY\",\n },\n \"zhipu\": {\n \"name\": \"智谱 AI (GLM)\",\n \"base_url\": \"https://open.bigmodel.cn/api/paas/v4\",\n \"models\": [\"glm-4-plus\", \"glm-4-flash\", \"glm-4-long\", \"glm-4\"],\n \"default_model\": \"glm-4-flash\",\n \"key_prefix\": \"\",\n \"key_hint\": \"智谱 API Key (xxx.xxxxx格式)\",\n \"api_key_env\": \"ZHIPU_API_KEY\",\n },\n \"moonshot\": {\n \"name\": \"Moonshot (Kimi)\",\n \"base_url\": \"https://api.moonshot.cn/v1\",\n \"models\": [\"moonshot-v1-8k\", \"moonshot-v1-32k\", \"moonshot-v1-128k\"],\n \"default_model\": \"moonshot-v1-8k\",\n \"key_prefix\": \"sk-\",\n \"key_hint\": \"sk-开头的 API Key\",\n \"api_key_env\": \"MOONSHOT_API_KEY\",\n },\n \"minimax\": {\n \"name\": \"MiniMax\",\n \"base_url\": \"https://api.minimax.chat/v1\",\n \"models\": [\"MiniMax-Text-01\", \"abab6.5s-chat\"],\n \"default_model\": \"MiniMax-Text-01\",\n \"key_prefix\": \"\",\n \"key_hint\": \"MiniMax API Key\",\n \"api_key_env\": \"MINIMAX_API_KEY\",\n },\n \"anthropic\": {\n \"name\": \"Anthropic (Claude)\",\n \"base_url\": \"https://api.anthropic.com/v1\",\n \"models\": [\"claude-sonnet-4-20250514\", \"claude-3-5-haiku-20241022\"],\n \"default_model\": \"claude-sonnet-4-20250514\",\n \"key_prefix\": \"sk-ant-\",\n \"key_hint\": \"sk-ant-开头的 API Key\",\n \"api_key_env\": \"ANTHROPIC_API_KEY\",\n },\n \"google\": {\n \"name\": \"Google (Gemini)\",\n \"base_url\": \"https://generativelanguage.googleapis.com/v1beta/openai\",\n \"models\": [\"gemini-2.0-flash\", \"gemini-2.0-flash-lite\", \"gemini-1.5-pro\"],\n \"default_model\": \"gemini-2.0-flash\",\n \"key_prefix\": \"AI\",\n \"key_hint\": \"AI开头的 API Key\",\n \"api_key_env\": \"GOOGLE_API_KEY\",\n },\n}\n\n\nclass Settings:\n DASHSCOPE_API_KEY: str = os.getenv(\"DASHSCOPE_API_KEY\", \"\")\n OPENAI_API_KEY: str = os.getenv(\"OPENAI_API_KEY\", \"\")\n DEEPSEEK_API_KEY: str = os.getenv(\"DEEPSEEK_API_KEY\", \"\")\n ZHIPU_API_KEY: str = os.getenv(\"ZHIPU_API_KEY\", \"\")\n MOONSHOT_API_KEY: str = os.getenv(\"MOONSHOT_API_KEY\", \"\")\n MINIMAX_API_KEY: str = os.getenv(\"MINIMAX_API_KEY\", \"\")\n ANTHROPIC_API_KEY: str = os.getenv(\"ANTHROPIC_API_KEY\", \"\")\n GOOGLE_API_KEY: str = os.getenv(\"GOOGLE_API_KEY\", \"\")\n\n LLM_PROVIDER: str = os.getenv(\"LLM_PROVIDER\", \"dashscope\")\n LLM_MODEL_NAME: str = os.getenv(\"LLM_MODEL_NAME\", \"qwen-turbo\")\n LLM_BASE_URL: str = os.getenv(\"LLM_BASE_URL\", LLM_PROVIDERS[\"dashscope\"][\"base_url\"])\n\n DELI_APPID: str = os.getenv(\"DELI_APPID\", \"\")\n DELI_SECRET: str = os.getenv(\"DELI_SECRET\", \"\")\n\n SECRET_KEY: str = os.getenv(\"SECRET_KEY\", \"your-jwt-secret-key-here\")\n ACCESS_TOKEN_EXPIRE_MINUTES: int = int(os.getenv(\"ACCESS_TOKEN_EXPIRE_MINUTES\", \"1440\"))\n\n BACKEND_PORT: int = int(os.getenv(\"BACKEND_PORT\", \"8000\"))\n\n ALGORITHM: str = \"HS256\"\n\n DB_HOST: str = os.getenv(\"DB_HOST\", \"localhost\")\n DB_PORT: int = int(os.getenv(\"DB_PORT\", \"3306\"))\n DB_USER: str = os.getenv(\"DB_USER\", \"root\")\n DB_PASSWORD: str = os.getenv(\"DB_PASSWORD\", \"\")\n DB_NAME: str = os.getenv(\"DB_NAME\", \"lax_user_db\")\n\n _user_provider: str = \"\"\n _user_api_key: str = \"\"\n _user_model: str = \"\"\n\n def get_active_api_key(self) -> str:\n if self._user_api_key:\n return self._user_api_key\n provider = self._user_provider or self.LLM_PROVIDER\n env_key = LLM_PROVIDERS.get(provider, {}).get(\"api_key_env\", \"DASHSCOPE_API_KEY\")\n return getattr(self, env_key, \"\") or self.DASHSCOPE_API_KEY\n\n def get_active_base_url(self) -> str:\n if self._user_provider:\n return LLM_PROVIDERS.get(self._user_provider, {}).get(\"base_url\", self.LLM_BASE_URL)\n return self.LLM_BASE_URL\n\n def get_active_model(self) -> str:\n if self._user_model:\n return self._user_model\n return self.LLM_MODEL_NAME\n\n def update_llm_config(self, provider: str = \"\", api_key: str = \"\", model_name: str = \"\"):\n if provider:\n self._user_provider = provider\n if api_key:\n self._user_api_key = api_key\n if model_name:\n self._user_model = model_name\n\n def is_api_key_configured(self) -> bool:\n return bool(self.get_active_api_key())\n\n def get_provider_info(self, provider: str) -> dict:\n return LLM_PROVIDERS.get(provider, {})\n\n\nsettings = Settings()\n"}}}} |