Jelajahi Sumber

修复gemini入参的格式问题

lh 1 bulan lalu
induk
melakukan
655901eb30
1 mengubah file dengan 22 tambahan dan 2 penghapusan
  1. 22 2
      app/Services/DeepSeek/DeepSeekService.php

+ 22 - 2
app/Services/DeepSeek/DeepSeekService.php

@@ -927,7 +927,15 @@ class DeepSeekService
         if (getProp($data, 'presence_penalty', null) !== null) {
             $generationConfig['presencePenalty'] = (float)getProp($data, 'presence_penalty');
         }
-        $generationConfig['maxOutputTokens'] = (int)getProp($data, 'max_tokens', 8192);
+        $maxOutputTokens = (int)getProp($data, 'max_tokens', 8192);
+        if ($maxOutputTokens <= 0) {
+            $maxOutputTokens = 8192;
+        }
+        // gemini-3 pro 中转站实测最大输出上限为 32768,超限会返回 400
+        if (in_array($model, ['gemini-3-pro-preview', 'gemini-3.1-pro-preview']) && $maxOutputTokens > 32768) {
+            $maxOutputTokens = 32768;
+        }
+        $generationConfig['maxOutputTokens'] = $maxOutputTokens;
 
         // response_format 映射:text -> text/plain,json -> application/json
         $responseFormat = getProp($data, 'response_format', 'text');
@@ -959,9 +967,16 @@ class DeepSeekService
             $thinkingMode = $defaultThinking ? 'enabled' : 'disabled';
         }
         if ($thinkingMode === 'enabled') {
+            $thinkingBudget = (int)getProp($data, 'thinking_budget', 20);
+            if ($thinkingBudget <= 0) {
+                $thinkingBudget = 20;
+            }
             $requestData['generationConfig']['thinkingConfig'] = [
-                'thinkingBudget' => (int)getProp($data, 'thinking_budget', 20)
+                'thinkingBudget' => $thinkingBudget
             ];
+        } elseif ($defaultThinking) {
+            // 该模型仅支持思考模式,传 0 会返回 400
+            $requestData['generationConfig']['thinkingConfig'] = ['thinkingBudget' => 20];
         } else {
             $requestData['generationConfig']['thinkingConfig'] = ['thinkingBudget' => 0];
         }
@@ -1007,6 +1022,11 @@ class DeepSeekService
             Utils::throwError('20003:Gemini API Key未配置: ' . $model);
         }
 
+        // 兼容 OpenAI 风格 post_data(包含 messages 字段)
+        if (isset($requestData['messages'])) {
+            $requestData = $this->buildGeminiRequestBody($requestData, $model);
+        }
+
         $url = rtrim(env('GEMINI_API_BASE_URL', 'https://ai-api.kkidc.com/v1beta'), '/')
             . '/models/' . $model . ':generateContent';