Browse Source

支持更多LLM

peterguo 3 weeks ago
parent
commit
1f82a8bf65

+ 30 - 3
app/Http/Controllers/API/DeepSeekChatController.php

@@ -15,6 +15,23 @@ use Symfony\Component\HttpFoundation\StreamedResponse;
 
 class DeepSeekChatController extends Controller
 {
+    public function getLlmList(): JsonResponse
+    {
+        $list = config('llm');
+        $llmList = [];
+        foreach ($list as $key => $item) {
+            if (!isset($item['enabled']) || !$item['enabled']) {
+                continue;
+            }
+            $llmList[] = [
+                'name' => $item['name'],
+                'model' => $item['model'],
+            ];
+        }
+
+        return $this->success(['data' => $llmList]);
+    }
+
     // 重命名
     public function renameSession(Request $request, $sessionId): JsonResponse
     {
@@ -71,11 +88,17 @@ class DeepSeekChatController extends Controller
         if (!$request->input('title')) {
             return $this->badRequest('会话标题不能为空');
         }
+        $list = config('llm');
+        $modelMap = array_column($list, null, 'model');
+        $llm = $modelMap[$request->input('model')] ?? null;
+        if (!$llm || !$llm['enabled']) {
+            return $this->badRequest('LLM服务未启用或未配置');
+        }
         $session = LlmSession::create([
             'session_id' => Str::uuid(),
             'user_id' => $userId,
             'title' => $request->input('title', ''),
-            'model' => $request->input('model',  config('llm.deepseek')['model']),
+            'model' => $llm['model'],
         ]);
 
         return $this->success(['data' => $session]);
@@ -129,6 +152,10 @@ class DeepSeekChatController extends Controller
     {
         // 一个session进行多轮对话
         $sessionId = $request->input("session_id");
+        $list = config('llm');
+        $modelMap = array_column($list, null, 'model');
+        $llm = $modelMap[$request->input('model')] ?? null;
+
         // 获取该session的历史对话记录
         $history = [];
         if ($sessionId) {
@@ -142,7 +169,7 @@ class DeepSeekChatController extends Controller
             });
         }
 
-        return new StreamedResponse(function () use ($request, $history) {
+        return new StreamedResponse(function () use ($llm, $request, $history) {
             // 1. 设置SSE头
             header('Content-Type: text/event-stream');
             header('Cache-Control: no-cache');
@@ -156,7 +183,7 @@ class DeepSeekChatController extends Controller
             $message = array_merge($history ? $history->toArray() : [], [
                 ['role' => 'user', 'content' => $prompt],
             ]);
-            DeepSeekService::streamedResponseChat($message, $request->input("session_id"));
+            DeepSeekService::streamedResponseChat($llm, $message, $request->input("session_id"));
         }, 200, [
             'Content-Type' => 'text/event-stream',
             'Access-Control-Allow-Origin' => '*'

+ 1 - 2
app/Services/LLM/DeepSeekService.php

@@ -11,11 +11,10 @@ use Illuminate\Support\Str;
 
 class DeepSeekService
 {
-    public static function streamedResponseChat($message, $sessionId = null): void
+    public static function streamedResponseChat($llmConfig, $message, $sessionId = null): void
     {
         ini_set('output_buffering', 'off');
 
-        $llmConfig  = config('llm.deepseek');
         $headers = [
             'Authorization' => 'Bearer ' . $llmConfig['key'],
             'Content-Type' => 'application/json',

+ 25 - 3
config/llm.php

@@ -1,8 +1,30 @@
 <?php
 return [
-    'deepseek' => [
+    [
+        'name' => env('LLM_MODEL_NAME'),
         'base_url' => env('LLM_MODEL_BASE_URL'),
-        'model' => env('LLM_MODEL_NAME'),
+        'model' => env('LLM_MODEL'),
         'key' => env('LLM_MODEL_KEY', ''),
-    ]
+        'enabled' => env('LLM_MODEL_ENABLED', true),
+        'desc' => env('LLM_MODEL_DESC', ''),
+        'max_tokens' => env('LLM_MODEL_MAX_TOKENS', 1000),
+    ],
+    [
+        'name' => env('LLM_MODEL_NAME_2'),
+        'base_url' => env('LLM_MODEL_BASE_URL_2'),
+        'model' => env('LLM_MODEL_2'),
+        'key' => env('LLM_MODEL_KEY_2', ''),
+        'enabled' => env('LLM_MODEL_ENABLED_2', true),
+        'desc' => env('LLM_MODEL_DESC_2', ''),
+        'max_tokens' => env('LLM_MODEL_MAX_TOKENS_2', 1000),
+    ],
+    [
+        'name' => env('LLM_MODEL_NAME_3'),
+        'base_url' => env('LLM_MODEL_BASE_URL_3'),
+        'model' => env('LLM_MODEL_3'),
+        'key' => env('LLM_MODEL_KEY_3', ''),
+        'enabled' => env('LLM_MODEL_ENABLED_3', true),
+        'desc' => env('LLM_MODEL_DESC_3', ''),
+        'max_tokens' => env('LLM_MODEL_MAX_TOKENS_3', 1000),
+    ],
 ];

+ 2 - 1
routes/api.php

@@ -41,12 +41,13 @@ Route::middleware((function() {
     Route::post("bim/preview-image", [API\BimController::class, "setPreviewImage"]);
 
     Route::middleware(['auth:sanctum','account.limit'])->group(function () {
+        Route::get('/get-llm-list', [API\DeepSeekChatController::class, 'getLlmList']);
         Route::put('/chat/rename-session/{sessionId}', [API\DeepSeekChatController::class, 'renameSession']);
         Route::delete('/chat/delete-session/{sessionId}', [API\DeepSeekChatController::class, 'deleteSession']);
         Route::post('/chat/add-session', [API\DeepSeekChatController::class, 'addSession']);
         Route::get('/chat/sessions', [API\DeepSeekChatController::class, 'getSessionList']);
         Route::get('/chat/sessions/{sessionId}', [API\DeepSeekChatController::class, 'getSessionDetail']);
-        Route::post('deepseek-chat', [API\DeepSeekChatController::class, 'handleStream']);
+        Route::post('llm-chat', [API\DeepSeekChatController::class, 'handleStream']);
 
         //公共权限
         Route::post("/logout", [API\AuthController::class, "logout"]);