修复: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

View File

@@ -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);