修复:AI 接口测试改用 GET /v1/models,毫秒级响应,避免 Cloudflare 524 超时

原方案发起真实推理请求(需 16~20s),经 Cloudflare 代理时触发超时。
改为查询模型列表端点(毫秒级),同时验证连通性和 API Key 有效性,
并显示该厂商的可用模型列表(兼容 Ollama / OpenAI 格式)。
This commit is contained in:
2026-03-06 03:35:11 +08:00
parent 318eb6f234
commit ca639ddd37
@@ -203,10 +203,11 @@ class AiProviderController extends Controller
/** /**
* 测试指定 AI 厂商的接口连通性 * 测试指定 AI 厂商的接口连通性
* *
* 发送一条简短的测试消息,返回响应结果和耗时,用于验证配置是否正确。 * 通过 GET /v1/models 检查端点可达性与 API Key 有效性,毫秒级响应,
* 不触发模型推理,避免经 Cloudflare 代理时因推理耗时导致 524 超时。
* *
* @param int $id 厂商配置 ID * @param int $id 厂商配置 ID
* @return JsonResponse 测试结果 * @return JsonResponse 测试结果(含可用模型列表)
*/ */
public function testConnection(int $id): JsonResponse public function testConnection(int $id): JsonResponse
{ {
@@ -214,25 +215,20 @@ class AiProviderController extends Controller
$apiKey = $provider->getDecryptedApiKey(); $apiKey = $provider->getDecryptedApiKey();
$base = rtrim($provider->api_endpoint, '/'); $base = rtrim($provider->api_endpoint, '/');
$endpoint = str_ends_with($base, '/v1')
? $base.'/chat/completions' // 拼接 /v1/models 端点(检查连通性,不触发推理)
: $base.'/v1/chat/completions'; $modelsUrl = str_ends_with($base, '/v1')
? $base.'/models'
: $base.'/v1/models';
$startTime = microtime(true); $startTime = microtime(true);
try { try {
$response = \Illuminate\Support\Facades\Http::withToken($apiKey) $response = \Illuminate\Support\Facades\Http::withToken($apiKey)
->timeout(60) // Ollama 本地模型冷启动较慢,给 60s ->timeout(10)
->post($endpoint, [ ->get($modelsUrl);
'model' => $provider->model,
'messages' => [
['role' => 'user', 'content' => '请用一句话介绍你自己。'],
],
'max_tokens' => 64,
]);
$ms = (int) ((microtime(true) - $startTime) * 1000); $ms = (int) ((microtime(true) - $startTime) * 1000);
$data = $response->json();
if (! $response->successful()) { if (! $response->successful()) {
return response()->json([ 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([ return response()->json([
'ok' => true, 'ok' => true,
'message' => trim($reply), 'message' => "接口连通正常,可用模型:{$modelList}",
'ms' => $ms, 'ms' => $ms,
'model' => $data['model'] ?? $provider->model, 'models' => $models,
]); ]);
} catch (\Illuminate\Http\Client\ConnectionException $e) { } catch (\Illuminate\Http\Client\ConnectionException $e) {
$ms = (int) ((microtime(true) - $startTime) * 1000); $ms = (int) ((microtime(true) - $startTime) * 1000);