get('client_id'); // 检查请求频率限制 $key = 'llm_request_' . $clientId; if (RateLimiter::tooManyAttempts($key, self::MAX_ATTEMPTS)) { $seconds = RateLimiter::availableIn($key); return response()->json([ 'error' => 'too_many_requests', 'message' => "请求过于频繁,请在 {$seconds} 秒后重试。", ], 429); } $validated = $request->validate([ 'prompt' => 'required|string|max:4096', ]); $client = Client::with('llmProvider')->findOrFail($clientId); $provider = $client->llmProvider; // Send request to LLM provider with timeout $response = Http::timeout(self::REQUEST_TIMEOUT) ->withToken($provider->api_token) ->withHeaders([ 'Content-Type' => 'application/json', 'Accept' => 'application/json', ]) ->post($provider->api_url, [ 'prompt' => $validated['prompt'], ]); if (!$response->successful()) { Log::error('LLM provider request failed', [ 'status' => $response->status(), 'body' => $response->body(), 'provider' => $provider->name, ]); throw new \Exception('LLM provider request failed: ' . $response->body()); } // 记录成功的请求 RateLimiter::hit($key, self::DECAY_MINUTES * 60); $this->logService->logOperation( 'client', $client->id, 'Sent prompt to LLM provider: ' . $provider->name ); return response()->json([ 'response' => $response->json(), ]); } catch (ValidationException $e) { return response()->json([ 'error' => 'validation_error', 'message' => '请求参数验证失败。', 'details' => $e->errors(), ], 422); } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) { return response()->json([ 'error' => 'not_found', 'message' => '客户用户不存在。', ], 404); } catch (\Illuminate\Http\Client\ConnectionException $e) { Log::error('LLM provider connection timeout', [ 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString(), ]); return response()->json([ 'error' => 'provider_timeout', 'message' => 'LLM 提供商响应超时,请稍后重试。', ], 504); } catch (\Exception $e) { Log::error('Error processing LLM request', [ 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString(), ]); if (str_contains($e->getMessage(), 'LLM provider request failed')) { return response()->json([ 'error' => 'provider_error', 'message' => 'LLM 提供商服务异常,请稍后重试。', ], 502); } return response()->json([ 'error' => 'server_error', 'message' => '服务器内部错误。', ], 500); } } }