feat(xAI): Add support for Grok-3-mini and update reasoning effort logic (#4657)

* feat(models): add grok-3-mini support and update reasoning effort logic in SettingsTab and OpenAIProvider

* feat(settings): update reasoning effort logic for Grok models and enhance localization in multiple languages

* fix(models): correct spelling of reasoning in model support functions

* fix(settings): correct spelling of reasoning_effort in OpenAIProvider
This commit is contained in:
Asurada 2025-04-10 18:43:20 +08:00 committed by GitHub
parent 2e0251aed7
commit 57fa0aad38
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 62 additions and 17 deletions

View File

@ -186,7 +186,7 @@ export const TEXT_TO_IMAGE_REGEX = /flux|diffusion|stabilityai|sd-|dall|cogview|
// Reasoning models
export const REASONING_REGEX =
/^(o\d+(?:-[\w-]+)?|.*\b(?:reasoner|thinking)\b.*|.*-[rR]\d+.*|.*\bqwq(?:-[\w-]+)?\b.*|.*\bhunyuan-t1(?:-[\w-]+)?\b.*|.*\bglm-zero-preview\b.*)$/i
/^(o\d+(?:-[\w-]+)?|.*\b(?:reasoner|thinking)\b.*|.*-[rR]\d+.*|.*\bqwq(?:-[\w-]+)?\b.*|.*\bhunyuan-t1(?:-[\w-]+)?\b.*|.*\bglm-zero-preview\b.*|.*\bgrok-3-mini(?:-[\w-]+)?\b.*)$/i
// Embedding models
export const EMBEDDING_REGEX =
@ -2202,12 +2202,29 @@ export function isOpenAIWebSearch(model: Model): boolean {
return model.id.includes('gpt-4o-search-preview') || model.id.includes('gpt-4o-mini-search-preview')
}
export function isSupportedResoningEffortModel(model?: Model): boolean {
export function isSupportedReasoningEffortModel(model?: Model): boolean {
if (!model) {
return false
}
if (model.id.includes('claude-3-7-sonnet') || model.id.includes('claude-3.7-sonnet') || isOpenAIoSeries(model)) {
if (
model.id.includes('claude-3-7-sonnet') ||
model.id.includes('claude-3.7-sonnet') ||
isOpenAIoSeries(model) ||
isGrokReasoningModel(model)
) {
return true
}
return false
}
export function isGrokReasoningModel(model?: Model): boolean {
if (!model) {
return false
}
if (model.id.includes('grok-3-mini')) {
return true
}

View File

@ -59,7 +59,7 @@
"settings.reasoning_effort.low": "low",
"settings.reasoning_effort.medium": "medium",
"settings.reasoning_effort.off": "off",
"settings.reasoning_effort.tip": "Only supports OpenAI o-series and Anthropic reasoning models",
"settings.reasoning_effort.tip": "Only supported by OpenAI o-series, Anthropic, and Grok reasoning models",
"settings.more": "Assistant Settings"
},
"auth": {

View File

@ -59,7 +59,7 @@
"settings.reasoning_effort.low": "短い",
"settings.reasoning_effort.medium": "中程度",
"settings.reasoning_effort.off": "オフ",
"settings.reasoning_effort.tip": "OpenAIのoシリーズとAnthropicの推論モデルのみサポートしています",
"settings.reasoning_effort.tip": "OpenAI o-series、Anthropic、および Grok の推論モデルのみサポート",
"settings.more": "アシスタント設定"
},
"auth": {

View File

@ -59,7 +59,7 @@
"settings.reasoning_effort.low": "Короткая",
"settings.reasoning_effort.medium": "Средняя",
"settings.reasoning_effort.off": "Выключено",
"settings.reasoning_effort.tip": "Поддерживается только моделями с рассуждением OpenAI o-series и Anthropic",
"settings.reasoning_effort.tip": "Поддерживается только моделями рассуждений OpenAI o-series, Anthropic и Grok",
"settings.more": "Настройки ассистента"
},
"auth": {

View File

@ -59,7 +59,7 @@
"settings.reasoning_effort.low": "短",
"settings.reasoning_effort.medium": "中",
"settings.reasoning_effort.off": "关",
"settings.reasoning_effort.tip": "仅支持 OpenAI o-series 和 Anthropic 推理模型",
"settings.reasoning_effort.tip": "仅支持 OpenAI o-series、Anthropic、Grok 推理模型",
"settings.more": "助手设置"
},
"auth": {

View File

@ -59,7 +59,7 @@
"settings.reasoning_effort.low": "短",
"settings.reasoning_effort.medium": "中",
"settings.reasoning_effort.off": "關",
"settings.reasoning_effort.tip": "僅支援 OpenAI o-series 和 Anthropic 推理模型",
"settings.reasoning_effort.tip": "僅支援 OpenAI o-series、Anthropic 和 Grok 推理模型",
"settings.more": "助手設定"
},
"auth": {

View File

@ -8,7 +8,7 @@ import {
isMac,
isWindows
} from '@renderer/config/constant'
import { isSupportedResoningEffortModel } from '@renderer/config/models'
import { isGrokReasoningModel, isSupportedReasoningEffortModel } from '@renderer/config/models'
import { codeThemes } from '@renderer/context/SyntaxHighlighterProvider'
import { useAssistant } from '@renderer/hooks/useAssistant'
import { useSettings } from '@renderer/hooks/useSettings'
@ -146,7 +146,21 @@ const SettingsTab: FC<Props> = (props) => {
setMaxTokens(assistant?.settings?.maxTokens ?? DEFAULT_MAX_TOKENS)
setStreamOutput(assistant?.settings?.streamOutput ?? true)
setReasoningEffort(assistant?.settings?.reasoning_effort)
}, [assistant])
// 当是Grok模型时处理reasoning_effort的设置
// For Grok models, only 'low' and 'high' reasoning efforts are supported.
// This ensures compatibility with the model's capabilities and avoids unsupported configurations.
if (isGrokReasoningModel(assistant?.model || getDefaultModel())) {
const currentEffort = assistant?.settings?.reasoning_effort
if (!currentEffort || currentEffort === 'low') {
setReasoningEffort('low') // Default to 'low' if no effort is set or if it's already 'low'.
onReasoningEffortChange('low')
} else if (currentEffort === 'medium' || currentEffort === 'high') {
setReasoningEffort('high') // Force 'high' for 'medium' or 'high' to simplify the configuration.
onReasoningEffortChange('high')
}
}
}, [assistant, onReasoningEffortChange])
const formatSliderTooltip = (value?: number) => {
if (value === undefined) return ''
@ -263,7 +277,7 @@ const SettingsTab: FC<Props> = (props) => {
</Col>
</Row>
)}
{isSupportedResoningEffortModel(assistant?.model || getDefaultModel()) && (
{isSupportedReasoningEffortModel(assistant?.model || getDefaultModel()) && (
<>
<SettingDivider />
<Row align="middle">
@ -282,12 +296,19 @@ const SettingsTab: FC<Props> = (props) => {
setReasoningEffort(typedValue)
onReasoningEffortChange(typedValue)
}}
options={[
options={
isGrokReasoningModel(assistant?.model || getDefaultModel())
? [
{ value: 'low', label: t('assistants.settings.reasoning_effort.low') },
{ value: 'high', label: t('assistants.settings.reasoning_effort.high') }
]
: [
{ value: 'low', label: t('assistants.settings.reasoning_effort.low') },
{ value: 'medium', label: t('assistants.settings.reasoning_effort.medium') },
{ value: 'high', label: t('assistants.settings.reasoning_effort.high') },
{ value: 'off', label: t('assistants.settings.reasoning_effort.off') }
]}
]
}
name="group"
block
/>

View File

@ -1,6 +1,7 @@
import { DEFAULT_MAX_TOKENS } from '@renderer/config/constant'
import {
getOpenAIWebSearchParams,
isGrokReasoningModel,
isHunyuanSearchModel,
isOpenAIoSeries,
isOpenAIWebSearch,
@ -243,6 +244,12 @@ export default class OpenAIProvider extends BaseProvider {
}
}
if (isGrokReasoningModel(model)) {
return {
reasoning_effort: assistant?.settings?.reasoning_effort
}
}
if (isOpenAIoSeries(model)) {
return {
reasoning_effort: assistant?.settings?.reasoning_effort