From ca639ddd379093f52c15d40cbd50d23ae4166c07 Mon Sep 17 00:00:00 2001 From: lkddi Date: Fri, 6 Mar 2026 03:35:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9AAI=20=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=B5=8B=E8=AF=95=E6=94=B9=E7=94=A8=20GET=20/v1/model?= =?UTF-8?q?s=EF=BC=8C=E6=AF=AB=E7=A7=92=E7=BA=A7=E5=93=8D=E5=BA=94?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8D=20Cloudflare=20524=20=E8=B6=85?= =?UTF-8?q?=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原方案发起真实推理请求(需 16~20s),经 Cloudflare 代理时触发超时。 改为查询模型列表端点(毫秒级),同时验证连通性和 API Key 有效性, 并显示该厂商的可用模型列表(兼容 Ollama / OpenAI 格式)。 --- .../Admin/AiProviderController.php | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/app/Http/Controllers/Admin/AiProviderController.php b/app/Http/Controllers/Admin/AiProviderController.php index c19e62d..985dcfa 100644 --- a/app/Http/Controllers/Admin/AiProviderController.php +++ b/app/Http/Controllers/Admin/AiProviderController.php @@ -203,10 +203,11 @@ class AiProviderController extends Controller /** * 测试指定 AI 厂商的接口连通性 * - * 发送一条简短的测试消息,返回响应结果和耗时,用于验证配置是否正确。 + * 通过 GET /v1/models 检查端点可达性与 API Key 有效性,毫秒级响应, + * 不触发模型推理,避免经 Cloudflare 代理时因推理耗时导致 524 超时。 * * @param int $id 厂商配置 ID - * @return JsonResponse 测试结果 + * @return JsonResponse 测试结果(含可用模型列表) */ public function testConnection(int $id): JsonResponse { @@ -214,25 +215,20 @@ class AiProviderController extends Controller $apiKey = $provider->getDecryptedApiKey(); $base = rtrim($provider->api_endpoint, '/'); - $endpoint = str_ends_with($base, '/v1') - ? $base.'/chat/completions' - : $base.'/v1/chat/completions'; + + // 拼接 /v1/models 端点(检查连通性,不触发推理) + $modelsUrl = str_ends_with($base, '/v1') + ? $base.'/models' + : $base.'/v1/models'; $startTime = microtime(true); try { $response = \Illuminate\Support\Facades\Http::withToken($apiKey) - ->timeout(60) // Ollama 本地模型冷启动较慢,给 60s - ->post($endpoint, [ - 'model' => $provider->model, - 'messages' => [ - ['role' => 'user', 'content' => '请用一句话介绍你自己。'], - ], - 'max_tokens' => 64, - ]); + ->timeout(10) + ->get($modelsUrl); $ms = (int) ((microtime(true) - $startTime) * 1000); - $data = $response->json(); if (! $response->successful()) { return response()->json([ @@ -242,13 +238,24 @@ class AiProviderController extends Controller ]); } - $reply = $data['choices'][0]['message']['content'] ?? '(无回复内容)'; + $data = $response->json(); + + // 提取可用模型列表(兼容 Ollama 和 OpenAI 格式) + $models = collect($data['models'] ?? $data['data'] ?? []) + ->pluck('id') + ->filter() + ->values() + ->toArray(); + + $modelList = count($models) > 0 + ? implode('、', array_slice($models, 0, 5)).(count($models) > 5 ? ' 等' : '') + : $provider->model; return response()->json([ 'ok' => true, - 'message' => trim($reply), + 'message' => "接口连通正常,可用模型:{$modelList}", 'ms' => $ms, - 'model' => $data['model'] ?? $provider->model, + 'models' => $models, ]); } catch (\Illuminate\Http\Client\ConnectionException $e) { $ms = (int) ((microtime(true) - $startTime) * 1000);