diff --git a/backend-fastapi/ai_platform/api/provider_api.py b/backend-fastapi/ai_platform/api/provider_api.py index 059fd92..d8d5e15 100644 --- a/backend-fastapi/ai_platform/api/provider_api.py +++ b/backend-fastapi/ai_platform/api/provider_api.py @@ -142,7 +142,7 @@ async def delete_provider(provider_id: str, db: AsyncSession = Depends(get_db)): @router.post("/{provider_id}/test", summary="测试提供商连接") async def test_provider(provider_id: str, db: AsyncSession = Depends(get_db)): - """测试提供商连接""" + """通过真实模型接口测试提供商连接""" result = await db.execute( select(LLMProvider).where( LLMProvider.id == provider_id, @@ -152,37 +152,43 @@ async def test_provider(provider_id: str, db: AsyncSession = Depends(get_db)): provider = result.scalar_one_or_none() if not provider: raise HTTPException(status_code=404, detail="提供商不存在") - - # 创建提供商实例 + + api_base = provider.api_base or '' + instance_kwargs = {} + if provider.provider_type == 'ollama' and provider.ollama_host: + api_base = provider.ollama_host + instance_kwargs['ollama_host'] = provider.ollama_host + provider_instance = ProviderRegistry.create_instance( provider_type=provider.provider_type, api_key=provider.api_key, - api_base=provider.api_base, - ollama_host=provider.ollama_host, + api_base=api_base, + **instance_kwargs, ) - if not provider_instance: raise HTTPException(status_code=400, detail=f"不支持的提供商类型: {provider.provider_type}") - - # 验证配置 + if not provider_instance.validate_config(): raise HTTPException(status_code=400, detail="配置无效,请检查 API Key") - - # 尝试获取模型列表(如果支持) - try: - models = provider_instance.get_available_models() - return { - "success": True, - "message": "连接成功", - "models": models, - } - except Exception as e: - logger.warning(f"获取模型列表失败: {e}") - return { - "success": True, - "message": "连接成功(无法获取模型列表)", - "models": [], - } + + models = await provider_instance.fetch_models_from_api() + if not models: + logger.warning( + "Provider online test failed: no models returned " + f"[provider={provider.name}, type={provider.provider_type}, api_base={api_base or '(empty)'}]" + ) + raise HTTPException( + status_code=400, + detail="连接失败:模型接口未返回可用模型,请检查 Base URL、API Key 或网络连通性", + ) + + return { + "success": True, + "message": f"连接成功,已从模型接口拉取到 {len(models)} 个模型", + "source": "api", + "model_count": len(models), + "models": models[:20], + } @router.get("/{provider_id}/default-models", summary="获取默认模型列表") diff --git a/web/apps/web-ele/src/api/ai-platform/ai-platform.ts b/web/apps/web-ele/src/api/ai-platform/ai-platform.ts index d4865ed..ad4dd16 100644 --- a/web/apps/web-ele/src/api/ai-platform/ai-platform.ts +++ b/web/apps/web-ele/src/api/ai-platform/ai-platform.ts @@ -391,7 +391,9 @@ export async function deleteProviderApi(id: string) { export async function testProviderApi(id: string) { return requestClient.post<{ message: string; - models: any[]; + model_count: number; + models: DefaultModel[]; + source: 'api'; success: boolean; }>(`${BASE_URL}/provider/${id}/test`); } diff --git a/web/apps/web-ele/src/views/ai-platform/model/model-config-form.vue b/web/apps/web-ele/src/views/ai-platform/model/model-config-form.vue index e526d26..282d5ed 100644 --- a/web/apps/web-ele/src/views/ai-platform/model/model-config-form.vue +++ b/web/apps/web-ele/src/views/ai-platform/model/model-config-form.vue @@ -332,7 +332,14 @@ async function handleTestProvider(row: ProviderListItem) { try { const res = await testProviderApi(row.id); if (res.success) { - ElMessage.success(res.message); + const sampleModels = res.models + .slice(0, 3) + .map((model) => model.model_name) + .join(', '); + const sampleText = sampleModels ? `: ${sampleModels}` : ''; + ElMessage.success( + `连接成功,已从模型接口拉取到 ${res.model_count} 个模型${sampleText}`, + ); } else { ElMessage.error($t('ui.actionMessage.operationFailed')); }