|
@@ -927,7 +927,15 @@ class DeepSeekService
|
|
|
if (getProp($data, 'presence_penalty', null) !== null) {
|
|
if (getProp($data, 'presence_penalty', null) !== null) {
|
|
|
$generationConfig['presencePenalty'] = (float)getProp($data, 'presence_penalty');
|
|
$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
|
|
// response_format 映射:text -> text/plain,json -> application/json
|
|
|
$responseFormat = getProp($data, 'response_format', 'text');
|
|
$responseFormat = getProp($data, 'response_format', 'text');
|
|
@@ -959,9 +967,16 @@ class DeepSeekService
|
|
|
$thinkingMode = $defaultThinking ? 'enabled' : 'disabled';
|
|
$thinkingMode = $defaultThinking ? 'enabled' : 'disabled';
|
|
|
}
|
|
}
|
|
|
if ($thinkingMode === 'enabled') {
|
|
if ($thinkingMode === 'enabled') {
|
|
|
|
|
+ $thinkingBudget = (int)getProp($data, 'thinking_budget', 20);
|
|
|
|
|
+ if ($thinkingBudget <= 0) {
|
|
|
|
|
+ $thinkingBudget = 20;
|
|
|
|
|
+ }
|
|
|
$requestData['generationConfig']['thinkingConfig'] = [
|
|
$requestData['generationConfig']['thinkingConfig'] = [
|
|
|
- 'thinkingBudget' => (int)getProp($data, 'thinking_budget', 20)
|
|
|
|
|
|
|
+ 'thinkingBudget' => $thinkingBudget
|
|
|
];
|
|
];
|
|
|
|
|
+ } elseif ($defaultThinking) {
|
|
|
|
|
+ // 该模型仅支持思考模式,传 0 会返回 400
|
|
|
|
|
+ $requestData['generationConfig']['thinkingConfig'] = ['thinkingBudget' => 20];
|
|
|
} else {
|
|
} else {
|
|
|
$requestData['generationConfig']['thinkingConfig'] = ['thinkingBudget' => 0];
|
|
$requestData['generationConfig']['thinkingConfig'] = ['thinkingBudget' => 0];
|
|
|
}
|
|
}
|
|
@@ -1007,6 +1022,11 @@ class DeepSeekService
|
|
|
Utils::throwError('20003:Gemini API Key未配置: ' . $model);
|
|
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'), '/')
|
|
$url = rtrim(env('GEMINI_API_BASE_URL', 'https://ai-api.kkidc.com/v1beta'), '/')
|
|
|
. '/models/' . $model . ':generateContent';
|
|
. '/models/' . $model . ':generateContent';
|
|
|
|
|
|