修复:AI 接口测试改用 GET /v1/models,毫秒级响应,避免 Cloudflare 524 超时
原方案发起真实推理请求(需 16~20s),经 Cloudflare 代理时触发超时。 改为查询模型列表端点(毫秒级),同时验证连通性和 API Key 有效性, 并显示该厂商的可用模型列表(兼容 Ollama / OpenAI 格式)。
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user