From bccec7dd385a85310d8d21503fdbb38b9c791d9d Mon Sep 17 00:00:00 2001 From: water-boom <176261405+water-boom@users.noreply.github.com> Date: Wed, 19 Nov 2025 17:50:06 +0800 Subject: [PATCH 1/3] forntend to qwen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 加入前端的选项 --- frontend/src/pages/chat/components/ApiDialog.vue | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frontend/src/pages/chat/components/ApiDialog.vue b/frontend/src/pages/chat/components/ApiDialog.vue index be7e418..86bfd0d 100644 --- a/frontend/src/pages/chat/components/ApiDialog.vue +++ b/frontend/src/pages/chat/components/ApiDialog.vue @@ -234,6 +234,12 @@ const providers = { "baseUrl": "https://api.deepseek.com", "modelId": "deepseek/deepseek-chat" }, + 千问百炼: { + url: "https://dashscope.console.aliyun.com/apiKey", + key: "千问百炼", + baseUrl: "https://dashscope.aliyuncs.com/compatible-mode/v1", + modelId: "openai/qwen3-max", + }, "硅基流动": { "url": "https://cloud.siliconflow.cn/i/UIb4Enf4", "key": "硅基流动", From 38b304f30ce2bef27c228525e3d1dfd6fc9f588d Mon Sep 17 00:00:00 2001 From: water-boom <176261405+water-boom@users.noreply.github.com> Date: Wed, 19 Nov 2025 17:51:26 +0800 Subject: [PATCH 2/3] Simplify base_url assignment in modeling_router --- backend/app/routers/modeling_router.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/backend/app/routers/modeling_router.py b/backend/app/routers/modeling_router.py index d170b57..234a520 100644 --- a/backend/app/routers/modeling_router.py +++ b/backend/app/routers/modeling_router.py @@ -100,9 +100,7 @@ async def validate_api_key(request: ValidateApiKeyRequest): messages=[{"role": "user", "content": "Hi"}], max_tokens=1, api_key=request.api_key, - base_url=request.base_url - if request.base_url != "https://api.openai.com/v1" - else None, + base_url=request.base_url if request.base_url else None ) return ValidateApiKeyResponse(valid=True, message="✓ 模型 API 验证成功") From 7f19a18180c928fb6f2482e3d22288f00240d745 Mon Sep 17 00:00:00 2001 From: water-boom <176261405+water-boom@users.noreply.github.com> Date: Wed, 19 Nov 2025 17:55:17 +0800 Subject: [PATCH 3/3] Add model API validation script MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 最小的验证脚本,可以使用这个来尝试 --- backend/test_api.py | 70 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 backend/test_api.py diff --git a/backend/test_api.py b/backend/test_api.py new file mode 100644 index 0000000..61ca3d6 --- /dev/null +++ b/backend/test_api.py @@ -0,0 +1,70 @@ +import asyncio +import litellm + +async def validate_model_api(api_key: str, base_url: str, model_id: str): + """ + 验证模型 API 是否可用的最小脚本 + + Args: + api_key: API 密钥 + base_url: API 基础 URL (例如: https://api.openai.com/v1) + model_id: 模型标识符 (例如: gpt-4, deepseek/deepseek-chat) + + Returns: + dict: {"valid": bool, "message": str} + """ + try: + # 构建请求参数 + kwargs = { + "model": model_id, + "messages": [{"role": "user", "content": "Hi"}], + "max_tokens": 1, + "api_key": api_key, + } + + # 只有当 base_url 存在时才添加 + if base_url: + kwargs["base_url"] = base_url + + # 发送测试请求 + await litellm.acompletion(**kwargs) + + return { + "valid": True, + "message": "✓ 模型 API 验证成功" + } + + except Exception as e: + error_msg = str(e) + + # 解析常见错误类型 + if "401" in error_msg or "Unauthorized" in error_msg: + message = "✗ API Key 无效或已过期" + elif "404" in error_msg or "Not Found" in error_msg: + message = "✗ 模型 ID 不存在或 Base URL 错误" + elif "429" in error_msg or "rate limit" in error_msg.lower(): + message = "✗ 请求过于频繁,请稍后再试" + elif "403" in error_msg or "Forbidden" in error_msg: + message = "✗ API 权限不足或账户余额不足" + else: + message = f"✗ 验证失败: {error_msg[:100]}" + + return { + "valid": False, + "message": message + } + + +# 使用示例 +async def main(): + + result = await validate_model_api( + api_key="", + base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", + model_id="openai/qwen3-max" + ) + print(f"Qwen: {result}") + + +if __name__ == "__main__": + asyncio.run(main())