From 27c9ceab9f5f21534504cc08fa0cdb47adcfba41 Mon Sep 17 00:00:00 2001 From: Pleasure1234 <3196812536@qq.com> Date: Sun, 10 Aug 2025 14:27:26 +0800 Subject: [PATCH] fix: support gpt-5 (#8945) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update models.ts * Update models.ts * Update models.ts * feat: add OpenAI verbosity setting for GPT-5 model Introduces a new 'verbosity' option for the OpenAI GPT-5 model, allowing users to control the level of detail in model output. Updates settings state, migration logic, UI components, and i18n translations to support this feature. * fix(models): 修正gpt-5模型判断逻辑以支持包含gpt-5的模型ID * fix(i18n): 修正繁体中文和希腊语的翻译错误 * fix(models): 优化OpenAI推理模型判断逻辑 * fix(OpenAIResponseAPIClient): 不再为response api添加stream_options * fix: update OpenAI model check and add verbosity setting Changed GPT-5 model detection to use includes instead of strict equality. Added default 'verbosity' property to OpenAI settings in migration logic. * feat(models): 添加 GPT-5 系列模型的图标和配置 添加 GPT-5、GPT-5-chat、GPT-5-mini 和 GPT-5-nano 的图标文件,并在 models.ts 中配置对应的模型 logo * Merge branch 'main' into fix-gpt5 * Add verbosity setting to OpenAI API client Introduces a getVerbosity method in BaseApiClient to retrieve verbosity from settings, and passes this value in the OpenAIResponseAPIClient request payload. This enables configurable response verbosity for OpenAI API interactions. * Upgrade OpenAI package to 5.12.2 and update patch Replaced the OpenAI dependency from version 5.12.0 to 5.12.2 and updated related patch files and references in package.json and yarn.lock. Also updated a log message in BaseApiClient.ts for clarity. * fix: add type and property checks for tool call handling Improves robustness by adding explicit checks for 'function' property and 'type' when parsing tool calls and estimating tokens. Also adds error handling for unknown tool call types in mcp-tools and updates related test logic. * feat(模型配置): 添加gpt5模型支持及相关配置 - 在模型类型中新增gpt5支持 - 添加gpt5系列模型检测函数 - 更新推理选项配置和国际化文本 - 调整effort ratio数值 * fix(ThinkingButton): 为gpt-5及后续模型添加minimal到low的选项回退映射 * feat(i18n): 更新思维链长度的中文翻译并调整对应图标 为思维链长度的"minimal"选项添加中文翻译"微念",同时调整各选项对应的灯泡图标亮度 * feat(i18n): 为推理努力设置添加"minimal"选项并调整英文文案 * fix: openai patch * wip: OpenAISettingsGroup display * fix: 修复OpenAISettingsGroup组件中GPT5条件下的渲染逻辑 * refactor(OpenAISettingsGroup): 优化设置项的分组和分隔符逻辑 * feat(模型配置): 添加gpt-5到visionAllowedModels列表 * feat(模型配置): 添加gpt-5到函数调用支持列表 将gpt-5及其变体添加到FUNCTION_CALLING_MODELS支持列表,同时将gpt-5-chat添加到排除列表 * fix: 在OpenAI推理模型检查中添加gpt-5-chat支持 * Update OpenAISettingsGroup.tsx * feat(模型支持): 添加对verbosity模型的支持判断 新增isSupportVerbosityModel函数用于判断是否支持verbosity模型 替换原有isGPT5SeriesModel判断逻辑,统一使用新函数 * fix: 修复支持详细程度模型的判断逻辑 使用 getLowerBaseModelName 处理模型 ID 以确保大小写不敏感的比较 * feat: 添加对gpt-5模型的网络搜索支持但不包括chat变体 * fix(models): 修复gpt5模型支持选项缺少'off'的问题 * fix: 添加gpt-5到支持Flex Service Tier的模型列表 * refactor(aiCore): 优化OpenAI verbosity类型定义和使用 移除OpenAIResponseAPIClient中冗余的OpenAIVerbosity导入 在BaseApiClient中明确getVerbosity返回类型为OpenAIVerbosity 简化OpenAIResponseAPIClient中verbosity的类型断言 * fix(openai): 仅在支持verbosity的模型中添加verbosity参数 * fix(i18n): 修正OpenAI设置中不一致的翻译 * fix: modify low effort ratio * fix(openai): 修复GPT5系列模型在启用网页搜索时不能使用minimal reasoning_effort的问题 * fix(openai): 修复GPT5系列模型在启用web搜索时不能使用minimal推理的问题 --------- Co-authored-by: icarus Co-authored-by: Phantom <59059173+EurFelux@users.noreply.github.com> --- .env.example | 7 ++ ...tch => openai-npm-5.12.2-30b075401c.patch} | Bin 15840 -> 22280 bytes package.json | 8 +- .../src/aiCore/clients/BaseApiClient.ts | 16 ++++ .../aiCore/clients/openai/OpenAIApiClient.ts | 27 +++++- .../clients/openai/OpenAIResponseAPIClient.ts | 22 ++++- .../src/assets/images/models/gpt-5-chat.png | Bin 0 -> 30445 bytes .../src/assets/images/models/gpt-5-mini.png | Bin 0 -> 28301 bytes .../src/assets/images/models/gpt-5-nano.png | Bin 0 -> 29021 bytes .../src/assets/images/models/gpt-5.png | Bin 0 -> 26610 bytes src/renderer/src/components/Icons/SVGIcon.tsx | 35 +++++++ src/renderer/src/config/models.ts | 62 ++++++++---- src/renderer/src/i18n/label.ts | 9 +- src/renderer/src/i18n/locales/en-us.json | 16 +++- src/renderer/src/i18n/locales/ja-jp.json | 10 +- src/renderer/src/i18n/locales/ru-ru.json | 10 +- src/renderer/src/i18n/locales/zh-cn.json | 10 +- src/renderer/src/i18n/locales/zh-tw.json | 10 +- src/renderer/src/i18n/translate/el-gr.json | 10 +- src/renderer/src/i18n/translate/es-es.json | 10 +- src/renderer/src/i18n/translate/fr-fr.json | 10 +- src/renderer/src/i18n/translate/pt-pt.json | 10 +- .../pages/home/Inputbar/ThinkingButton.tsx | 14 ++- .../Tabs/components/OpenAISettingsGroup.tsx | 89 ++++++++++++++---- .../src/services/__tests__/ApiService.test.ts | 4 +- src/renderer/src/store/index.ts | 2 +- src/renderer/src/store/migrate.ts | 18 +++- src/renderer/src/store/settings.ts | 9 +- src/renderer/src/types/index.ts | 6 +- src/renderer/src/utils/mcp-tools.ts | 4 +- yarn.lock | 18 ++-- 31 files changed, 355 insertions(+), 91 deletions(-) rename .yarn/patches/{openai-npm-5.12.0-a06a6369b2.patch => openai-npm-5.12.2-30b075401c.patch} (68%) create mode 100644 src/renderer/src/assets/images/models/gpt-5-chat.png create mode 100644 src/renderer/src/assets/images/models/gpt-5-mini.png create mode 100644 src/renderer/src/assets/images/models/gpt-5-nano.png create mode 100644 src/renderer/src/assets/images/models/gpt-5.png diff --git a/.env.example b/.env.example index 6d0410951..0d57ffc03 100644 --- a/.env.example +++ b/.env.example @@ -1 +1,8 @@ NODE_OPTIONS=--max-old-space-size=8000 +API_KEY="sk-xxx" +BASE_URL="https://api.siliconflow.cn/v1/" +MODEL="Qwen/Qwen3-235B-A22B-Instruct-2507" +CSLOGGER_MAIN_LEVEL=info +CSLOGGER_RENDERER_LEVEL=info +#CSLOGGER_MAIN_SHOW_MODULES= +#CSLOGGER_RENDERER_SHOW_MODULES= diff --git a/.yarn/patches/openai-npm-5.12.0-a06a6369b2.patch b/.yarn/patches/openai-npm-5.12.2-30b075401c.patch similarity index 68% rename from .yarn/patches/openai-npm-5.12.0-a06a6369b2.patch rename to .yarn/patches/openai-npm-5.12.2-30b075401c.patch index 39f0c9b7da2122ac88c1759d0ad7e0e72baa974c..29b92dcc7be2609f9044c4e170da87ab111c71f1 100644 GIT binary patch literal 22280 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 T)66n9hhzccFdVU;mY2(aWtmO; diff --git a/package.json b/package.json index c2c9f7145..189631242 100644 --- a/package.json +++ b/package.json @@ -216,7 +216,7 @@ "motion": "^12.10.5", "notion-helper": "^1.3.22", "npx-scope-finder": "^1.2.0", - "openai": "patch:openai@npm%3A5.12.0#~/.yarn/patches/openai-npm-5.12.0-a06a6369b2.patch", + "openai": "patch:openai@npm%3A5.12.2#~/.yarn/patches/openai-npm-5.12.2-30b075401c.patch", "p-queue": "^8.1.0", "pdf-lib": "^1.17.1", "playwright": "^1.52.0", @@ -274,10 +274,8 @@ "@langchain/openai@npm:^0.3.16": "patch:@langchain/openai@npm%3A0.3.16#~/.yarn/patches/@langchain-openai-npm-0.3.16-e525b59526.patch", "@langchain/openai@npm:>=0.1.0 <0.4.0": "patch:@langchain/openai@npm%3A0.3.16#~/.yarn/patches/@langchain-openai-npm-0.3.16-e525b59526.patch", "libsql@npm:^0.4.4": "patch:libsql@npm%3A0.4.7#~/.yarn/patches/libsql-npm-0.4.7-444e260fb1.patch", - "openai@npm:^4.77.0": "patch:openai@npm%3A5.12.0#~/.yarn/patches/openai-npm-5.12.0-a06a6369b2.patch", "pkce-challenge@npm:^4.1.0": "patch:pkce-challenge@npm%3A4.1.0#~/.yarn/patches/pkce-challenge-npm-4.1.0-fbc51695a3.patch", "app-builder-lib@npm:26.0.13": "patch:app-builder-lib@npm%3A26.0.13#~/.yarn/patches/app-builder-lib-npm-26.0.13-a064c9e1d0.patch", - "openai@npm:^4.87.3": "patch:openai@npm%3A5.12.0#~/.yarn/patches/openai-npm-5.12.0-a06a6369b2.patch", "app-builder-lib@npm:26.0.15": "patch:app-builder-lib@npm%3A26.0.15#~/.yarn/patches/app-builder-lib-npm-26.0.15-360e5b0476.patch", "@langchain/core@npm:^0.3.26": "patch:@langchain/core@npm%3A0.3.44#~/.yarn/patches/@langchain-core-npm-0.3.44-41d5c3cb0a.patch", "node-abi": "4.12.0", @@ -285,7 +283,9 @@ "vite": "npm:rolldown-vite@latest", "atomically@npm:^1.7.0": "patch:atomically@npm%3A1.7.0#~/.yarn/patches/atomically-npm-1.7.0-e742e5293b.patch", "file-stream-rotator@npm:^0.6.1": "patch:file-stream-rotator@npm%3A0.6.1#~/.yarn/patches/file-stream-rotator-npm-0.6.1-eab45fb13d.patch", - "windows-system-proxy@npm:^1.0.0": "patch:windows-system-proxy@npm%3A1.0.0#~/.yarn/patches/windows-system-proxy-npm-1.0.0-ff2a828eec.patch" + "windows-system-proxy@npm:^1.0.0": "patch:windows-system-proxy@npm%3A1.0.0#~/.yarn/patches/windows-system-proxy-npm-1.0.0-ff2a828eec.patch", + "openai@npm:^4.77.0": "patch:openai@npm%3A5.12.2#~/.yarn/patches/openai-npm-5.12.2-30b075401c.patch", + "openai@npm:^4.87.3": "patch:openai@npm%3A5.12.2#~/.yarn/patches/openai-npm-5.12.2-30b075401c.patch" }, "packageManager": "yarn@4.9.1", "lint-staged": { diff --git a/src/renderer/src/aiCore/clients/BaseApiClient.ts b/src/renderer/src/aiCore/clients/BaseApiClient.ts index f5883c74b..def655e45 100644 --- a/src/renderer/src/aiCore/clients/BaseApiClient.ts +++ b/src/renderer/src/aiCore/clients/BaseApiClient.ts @@ -23,6 +23,7 @@ import { MemoryItem, Model, OpenAIServiceTiers, + OpenAIVerbosity, Provider, SystemProviderIds, ToolCallResponse, @@ -233,6 +234,21 @@ export abstract class BaseApiClient< return serviceTierSetting } + protected getVerbosity(): OpenAIVerbosity { + try { + const state = window.store?.getState() + const verbosity = state?.settings?.openAI?.verbosity + + if (verbosity && ['low', 'medium', 'high'].includes(verbosity)) { + return verbosity + } + } catch (error) { + logger.warn('Failed to get verbosity from state:', error as Error) + } + + return 'medium' + } + protected getTimeout(model: Model) { if (isSupportFlexServiceTierModel(model)) { return 15 * 1000 * 60 diff --git a/src/renderer/src/aiCore/clients/openai/OpenAIApiClient.ts b/src/renderer/src/aiCore/clients/openai/OpenAIApiClient.ts index 28e6de422..988a4f357 100644 --- a/src/renderer/src/aiCore/clients/openai/OpenAIApiClient.ts +++ b/src/renderer/src/aiCore/clients/openai/OpenAIApiClient.ts @@ -6,6 +6,7 @@ import { getOpenAIWebSearchParams, getThinkModelType, isDoubaoThinkingAutoModel, + isGPT5SeriesModel, isGrokReasoningModel, isNotSupportSystemMessageModel, isQwenAlwaysThinkModel, @@ -391,9 +392,13 @@ export class OpenAIAPIClient extends OpenAIBaseClient< ): ToolCallResponse { let parsedArgs: any try { - parsedArgs = JSON.parse(toolCall.function.arguments) + if ('function' in toolCall) { + parsedArgs = JSON.parse(toolCall.function.arguments) + } } catch { - parsedArgs = toolCall.function.arguments + if ('function' in toolCall) { + parsedArgs = toolCall.function.arguments + } } return { id: toolCall.id, @@ -471,7 +476,10 @@ export class OpenAIAPIClient extends OpenAIBaseClient< } if ('tool_calls' in message && message.tool_calls) { sum += message.tool_calls.reduce((acc, toolCall) => { - return acc + estimateTextTokens(JSON.stringify(toolCall.function.arguments)) + if (toolCall.type === 'function' && 'function' in toolCall) { + return acc + estimateTextTokens(JSON.stringify(toolCall.function.arguments)) + } + return acc }, 0) } return sum @@ -572,6 +580,13 @@ export class OpenAIAPIClient extends OpenAIBaseClient< // Note: Some providers like Mistral don't support stream_options const shouldIncludeStreamOptions = streamOutput && isSupportStreamOptionsProvider(this.provider) + const reasoningEffort = this.getReasoningEffort(assistant, model) + + // minimal cannot be used with web_search tool + if (isGPT5SeriesModel(model) && reasoningEffort.reasoning_effort === 'minimal' && enableWebSearch) { + reasoningEffort.reasoning_effort = 'low' + } + const commonParams: OpenAISdkParams = { model: model.id, messages: @@ -587,7 +602,7 @@ export class OpenAIAPIClient extends OpenAIBaseClient< // groq 有不同的 service tier 配置,不符合 openai 接口类型 service_tier: this.getServiceTier(model) as OpenAIServiceTier, ...this.getProviderSpecificParameters(assistant, model), - ...this.getReasoningEffort(assistant, model), + ...reasoningEffort, ...getOpenAIWebSearchParams(model, enableWebSearch), // OpenRouter usage tracking ...(this.provider.id === 'openrouter' ? { usage: { include: true } } : {}), @@ -901,7 +916,9 @@ export class OpenAIAPIClient extends OpenAIBaseClient< type: 'function' } } else if (fun?.arguments) { - toolCalls[index].function.arguments += fun.arguments + if (toolCalls[index] && toolCalls[index].type === 'function' && 'function' in toolCalls[index]) { + toolCalls[index].function.arguments += fun.arguments + } } } else { toolCalls.push(toolCall) diff --git a/src/renderer/src/aiCore/clients/openai/OpenAIResponseAPIClient.ts b/src/renderer/src/aiCore/clients/openai/OpenAIResponseAPIClient.ts index f740c5bdc..10a2ee7bb 100644 --- a/src/renderer/src/aiCore/clients/openai/OpenAIResponseAPIClient.ts +++ b/src/renderer/src/aiCore/clients/openai/OpenAIResponseAPIClient.ts @@ -2,12 +2,14 @@ import { loggerService } from '@logger' import { GenericChunk } from '@renderer/aiCore/middleware/schemas' import { CompletionsContext } from '@renderer/aiCore/middleware/types' import { + isGPT5SeriesModel, isOpenAIChatCompletionOnlyModel, isOpenAILLMModel, isSupportedReasoningEffortOpenAIModel, + isSupportVerbosityModel, isVisionModel } from '@renderer/config/models' -import { isSupportDeveloperRoleProvider, isSupportStreamOptionsProvider } from '@renderer/config/providers' +import { isSupportDeveloperRoleProvider } from '@renderer/config/providers' import { estimateTextTokens } from '@renderer/services/TokenService' import { FileMetadata, @@ -304,8 +306,7 @@ export class OpenAIResponseAPIClient extends OpenAIBaseClient< const content = this.convertResponseToMessageContent(output) - const newReqMessages = [...currentReqMessages, ...content, ...(toolResults || [])] - return newReqMessages + return [...currentReqMessages, ...content, ...(toolResults || [])] } override estimateMessageTokens(message: OpenAIResponseSdkMessageParam): number { @@ -442,7 +443,12 @@ export class OpenAIResponseAPIClient extends OpenAIBaseClient< tools = tools.concat(extraTools) - const shouldIncludeStreamOptions = streamOutput && isSupportStreamOptionsProvider(this.provider) + const reasoningEffort = this.getReasoningEffort(assistant, model) + + // minimal cannot be used with web_search tool + if (isGPT5SeriesModel(model) && reasoningEffort.reasoning?.effort === 'minimal' && enableWebSearch) { + reasoningEffort.reasoning.effort = 'low' + } const commonParams: OpenAIResponseSdkParams = { model: model.id, @@ -454,10 +460,16 @@ export class OpenAIResponseAPIClient extends OpenAIBaseClient< top_p: this.getTopP(assistant, model), max_output_tokens: maxTokens, stream: streamOutput, - ...(shouldIncludeStreamOptions ? { stream_options: { include_usage: true } } : {}), tools: !isEmpty(tools) ? tools : undefined, // groq 有不同的 service tier 配置,不符合 openai 接口类型 service_tier: this.getServiceTier(model) as OpenAIServiceTier, + ...(isSupportVerbosityModel(model) + ? { + text: { + verbosity: this.getVerbosity() + } + } + : {}), ...(this.getReasoningEffort(assistant, model) as OpenAI.Reasoning), // 只在对话场景下应用自定义参数,避免影响翻译、总结等其他业务逻辑 // 注意:用户自定义参数总是应该覆盖其他参数 diff --git a/src/renderer/src/assets/images/models/gpt-5-chat.png b/src/renderer/src/assets/images/models/gpt-5-chat.png new file mode 100644 index 0000000000000000000000000000000000000000..3a6a5c393782dd1fb122e56452a7c0a051e336cd GIT binary patch literal 30445 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 literal 0 HcmV?d00001 diff --git a/src/renderer/src/assets/images/models/gpt-5-mini.png b/src/renderer/src/assets/images/models/gpt-5-mini.png new file mode 100644 index 0000000000000000000000000000000000000000..0ac07a3a262155445c5d2c6a078d4db10d63f53c GIT binary patch literal 28301 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 literal 0 HcmV?d00001 diff --git a/src/renderer/src/assets/images/models/gpt-5-nano.png b/src/renderer/src/assets/images/models/gpt-5-nano.png new file mode 100644 index 0000000000000000000000000000000000000000..e3cc1ae8710562bb9c51e73a5938e821f624947d GIT binary patch literal 29021 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

-uR|p5V9G7y%~}uv2KRn9 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 { ) } +export function MdiLightbulbOn30(props: SVGProps) { + return ( + + {/* Icon from Material Design Icons by Pictogrammers - https://github.com/Templarian/MaterialDesign/blob/master/LICENSE */} + + + ) +} + export function MdiLightbulbOn50(props: SVGProps) { return ( @@ -67,6 +79,17 @@ export function MdiLightbulbOn50(props: SVGProps) { ) } +export function MdiLightbulbOn80(props: SVGProps) { + return ( + + {/* Icon from Material Design Icons by Pictogrammers - https://github.com/Templarian/MaterialDesign/blob/master/LICENSE */} + + + ) +} export function MdiLightbulbOn90(props: SVGProps) { return ( @@ -77,3 +100,15 @@ export function MdiLightbulbOn90(props: SVGProps) { ) } + +export function MdiLightbulbOn(props: SVGProps) { + // {/* Icon from Material Design Icons by Pictogrammers - https://github.com/Templarian/MaterialDesign/blob/master/LICENSE */} + return ( + + + + ) +} diff --git a/src/renderer/src/config/models.ts b/src/renderer/src/config/models.ts index 0c4c6d519..a7ea85c1f 100644 --- a/src/renderer/src/config/models.ts +++ b/src/renderer/src/config/models.ts @@ -57,6 +57,10 @@ import { } from '@renderer/assets/images/models/gpt_dark.png' import ChatGPTImageModelLogo from '@renderer/assets/images/models/gpt_image_1.png' import ChatGPTo1ModelLogo from '@renderer/assets/images/models/gpt_o1.png' +import GPT5ModelLogo from '@renderer/assets/images/models/gpt-5.png' +import GPT5ChatModelLogo from '@renderer/assets/images/models/gpt-5-chat.png' +import GPT5MiniModelLogo from '@renderer/assets/images/models/gpt-5-mini.png' +import GPT5NanoModelLogo from '@renderer/assets/images/models/gpt-5-nano.png' import GrokModelLogo from '@renderer/assets/images/models/grok.png' import GrokModelLogoDark from '@renderer/assets/images/models/grok_dark.png' import GrypheModelLogo from '@renderer/assets/images/models/gryphe.png' @@ -185,6 +189,7 @@ const visionAllowedModels = [ 'gpt-4.1(?:-[\\w-]+)?', 'gpt-4o(?:-[\\w-]+)?', 'gpt-4.5(?:-[\\w-]+)', + 'gpt-5(?:-[\\w-]+)?', 'chatgpt-4o(?:-[\\w-]+)?', 'o1(?:-[\\w-]+)?', 'o3(?:-[\\w-]+)?', @@ -247,6 +252,7 @@ export const FUNCTION_CALLING_MODELS = [ 'gpt-4', 'gpt-4.5', 'gpt-oss(?:-[\\w-]+)', + 'gpt-5(?:-[\\w-]+)?', 'o(1|3|4)(?:-[\\w-]+)?', 'claude', 'qwen', @@ -269,7 +275,8 @@ const FUNCTION_CALLING_EXCLUDED_MODELS = [ 'o1-preview', 'AIDC-AI/Marco-o1', 'gemini-1(?:\\.[\\w-]+)?', - 'qwen-mt(?:-[\\w-]+)?' + 'qwen-mt(?:-[\\w-]+)?', + 'gpt-5-chat(?:-[\\w-]+)?' ] export const FUNCTION_CALLING_REGEX = new RegExp( @@ -285,6 +292,7 @@ export const CLAUDE_SUPPORTED_WEBSEARCH_REGEX = new RegExp( // 模型类型到支持的reasoning_effort的映射表 export const MODEL_SUPPORTED_REASONING_EFFORT: ReasoningEffortConfig = { default: ['low', 'medium', 'high'] as const, + gpt5: ['minimal', 'low', 'medium', 'high'] as const, grok: ['low', 'high'] as const, gemini: ['low', 'medium', 'high', 'auto'] as const, gemini_pro: ['low', 'medium', 'high', 'auto'] as const, @@ -299,18 +307,22 @@ export const MODEL_SUPPORTED_REASONING_EFFORT: ReasoningEffortConfig = { // 模型类型到支持选项的映射表 export const MODEL_SUPPORTED_OPTIONS: ThinkingOptionConfig = { default: ['off', ...MODEL_SUPPORTED_REASONING_EFFORT.default] as const, - grok: [...MODEL_SUPPORTED_REASONING_EFFORT.grok] as const, + gpt5: ['off', ...MODEL_SUPPORTED_REASONING_EFFORT.gpt5] as const, + grok: MODEL_SUPPORTED_REASONING_EFFORT.grok, gemini: ['off', ...MODEL_SUPPORTED_REASONING_EFFORT.gemini] as const, - gemini_pro: [...MODEL_SUPPORTED_REASONING_EFFORT.gemini_pro] as const, + gemini_pro: MODEL_SUPPORTED_REASONING_EFFORT.gemini_pro, qwen: ['off', ...MODEL_SUPPORTED_REASONING_EFFORT.qwen] as const, - qwen_thinking: [...MODEL_SUPPORTED_REASONING_EFFORT.qwen_thinking] as const, + qwen_thinking: MODEL_SUPPORTED_REASONING_EFFORT.qwen_thinking, doubao: ['off', ...MODEL_SUPPORTED_REASONING_EFFORT.doubao] as const, hunyuan: ['off', ...MODEL_SUPPORTED_REASONING_EFFORT.hunyuan] as const, zhipu: ['off', ...MODEL_SUPPORTED_REASONING_EFFORT.zhipu] as const, - perplexity: [...MODEL_SUPPORTED_REASONING_EFFORT.perplexity] as const + perplexity: MODEL_SUPPORTED_REASONING_EFFORT.perplexity } as const export const getThinkModelType = (model: Model): ThinkingModelType => { + if (isGPT5SeriesModel(model)) { + return 'gpt5' + } if (isSupportedThinkingTokenGeminiModel(model)) { if (GEMINI_FLASH_MODEL_REGEX.test(model.id)) { return 'gemini' @@ -380,6 +392,10 @@ export function getModelLogo(modelId: string) { 'gpt-image': ChatGPTImageModelLogo, 'gpt-3': isLight ? ChatGPT35ModelLogo : ChatGPT35ModelLogoDark, 'gpt-4': isLight ? ChatGPT4ModelLogo : ChatGPT4ModelLogoDark, + 'gpt-5$': GPT5ModelLogo, + 'gpt-5-mini': GPT5MiniModelLogo, + 'gpt-5-nano': GPT5NanoModelLogo, + 'gpt-5-chat': GPT5ChatModelLogo, gpts: isLight ? ChatGPT4ModelLogo : ChatGPT4ModelLogoDark, 'gpt-oss(?:-[\\w-]+)': isLight ? ChatGptModelLogo : ChatGptModelLogoDark, 'text-moderation': isLight ? ChatGptModelLogo : ChatGptModelLogoDark, @@ -2453,7 +2469,7 @@ export function isVisionModel(model: Model): boolean { export function isOpenAIReasoningModel(model: Model): boolean { const modelId = getLowerBaseModelName(model.id, '/') - return modelId.includes('o1') || modelId.includes('o3') || modelId.includes('o4') || modelId.includes('gpt-oss') + return isSupportedReasoningEffortOpenAIModel(model) || modelId.includes('o1') || modelId.includes('gpt-5-chat') } export function isOpenAILLMModel(model: Model): boolean { @@ -2479,6 +2495,7 @@ export function isOpenAIModel(model: Model): boolean { return false } const modelId = getLowerBaseModelName(model.id) + return modelId.includes('gpt') || isOpenAIReasoningModel(model) } @@ -2487,7 +2504,14 @@ export function isSupportFlexServiceTierModel(model: Model): boolean { return false } const modelId = getLowerBaseModelName(model.id) - return (modelId.includes('o3') && !modelId.includes('o3-mini')) || modelId.includes('o4-mini') + return ( + (modelId.includes('o3') && !modelId.includes('o3-mini')) || modelId.includes('o4-mini') || modelId.includes('gpt-5') + ) +} + +export function isSupportVerbosityModel(model: Model): boolean { + const modelId = getLowerBaseModelName(model.id) + return isGPT5SeriesModel(model) && !modelId.includes('chat') } export function isSupportedReasoningEffortOpenAIModel(model: Model): boolean { @@ -2495,7 +2519,9 @@ export function isSupportedReasoningEffortOpenAIModel(model: Model): boolean { return ( (modelId.includes('o1') && !(modelId.includes('o1-preview') || modelId.includes('o1-mini'))) || modelId.includes('o3') || - modelId.includes('o4') + modelId.includes('o4') || + modelId.includes('gpt-oss') || + (isGPT5SeriesModel(model) && !modelId.includes('chat')) ) } @@ -2527,7 +2553,8 @@ export function isOpenAIWebSearchModel(model: Model): boolean { (modelId.includes('gpt-4.1') && !modelId.includes('gpt-4.1-nano')) || (modelId.includes('gpt-4o') && !modelId.includes('gpt-4o-image')) || modelId.includes('o3') || - modelId.includes('o4') + modelId.includes('o4') || + (modelId.includes('gpt-5') && !modelId.includes('chat')) ) } @@ -3133,17 +3160,14 @@ export const isQwenMTModel = (model: Model): boolean => { } export const isNotSupportedTextDelta = (model: Model): boolean => { - if (isQwenMTModel(model)) { - return true - } - - return false + return isQwenMTModel(model) } export const isNotSupportSystemMessageModel = (model: Model): boolean => { - if (isQwenMTModel(model) || isGemmaModel(model)) { - return true - } - - return false + return isQwenMTModel(model) || isGemmaModel(model) +} + +export const isGPT5SeriesModel = (model: Model) => { + const modelId = getLowerBaseModelName(model.id) + return modelId.includes('gpt-5') } diff --git a/src/renderer/src/i18n/label.ts b/src/renderer/src/i18n/label.ts index 541e741bb..9bd7839c1 100644 --- a/src/renderer/src/i18n/label.ts +++ b/src/renderer/src/i18n/label.ts @@ -5,6 +5,7 @@ */ import { loggerService } from '@logger' +import { ThinkingOption } from '@renderer/types' import i18n from './index' @@ -266,13 +267,13 @@ export const getHttpMessageLabel = (key: string): string => { return getLabel(key, httpMessageKeyMap) } -const reasoningEffortOptionsKeyMap = { - auto: 'assistants.settings.reasoning_effort.default', +const reasoningEffortOptionsKeyMap: Record = { + off: 'assistants.settings.reasoning_effort.off', + minimal: 'assistants.settings.reasoning_effort.minimal', high: 'assistants.settings.reasoning_effort.high', - label: 'assistants.settings.reasoning_effort.label', low: 'assistants.settings.reasoning_effort.low', medium: 'assistants.settings.reasoning_effort.medium', - off: 'assistants.settings.reasoning_effort.off' + auto: 'assistants.settings.reasoning_effort.default' } as const export const getReasoningEffortOptionsLabel = (key: string): string => { diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 9c98ec4b8..901d9e9e0 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -183,10 +183,11 @@ "prompt": "Prompt Settings", "reasoning_effort": { "default": "Default", - "high": "Think harder", + "high": "High", "label": "Reasoning effort", - "low": "Think less", - "medium": "Think normally", + "low": "Low", + "medium": "Medium", + "minimal": "Minimal", "off": "Off" }, "regular_phrases": { @@ -3119,7 +3120,14 @@ "tip": "A summary of the reasoning performed by the model", "title": "Summary Mode" }, - "title": "OpenAI Settings" + "title": "OpenAI Settings", + "verbosity": { + "high": "High", + "low": "Low", + "medium": "Medium", + "tip": "Control the level of detail in the model's output", + "title": "Level of detail" + } }, "privacy": { "enable_privacy_mode": "Anonymous reporting of errors and statistics", diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index 3c76e68a4..903f395a3 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -187,6 +187,7 @@ "label": "思考連鎖の長さ", "low": "少しの思考", "medium": "普通の思考", + "minimal": "最小限の思考", "off": "オフ" }, "regular_phrases": { @@ -3119,7 +3120,14 @@ "tip": "モデルが行った推論の要約", "title": "要約モード" }, - "title": "OpenAIの設定" + "title": "OpenAIの設定", + "verbosity": { + "high": "高", + "low": "低", + "medium": "中", + "tip": "制御モデル出力の詳細さ", + "title": "詳細度" + } }, "privacy": { "enable_privacy_mode": "匿名エラーレポートとデータ統計の送信", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index 13787ee5b..1c44a19f4 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -187,6 +187,7 @@ "label": "Настройки размышлений", "low": "Меньше думать", "medium": "Среднее", + "minimal": "минимальный", "off": "Выключить" }, "regular_phrases": { @@ -3119,7 +3120,14 @@ "tip": "Резюме рассуждений, выполненных моделью", "title": "Режим резюме" }, - "title": "Настройки OpenAI" + "title": "Настройки OpenAI", + "verbosity": { + "high": "Высокий", + "low": "низкий", + "medium": "китайский", + "tip": "Управление степенью детализации вывода модели", + "title": "подробность" + } }, "privacy": { "enable_privacy_mode": "Анонимная отчетность об ошибках и статистике", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 165da9373..8da54d812 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -187,6 +187,7 @@ "label": "思维链长度", "low": "浮想", "medium": "斟酌", + "minimal": "微念", "off": "关闭" }, "regular_phrases": { @@ -3119,7 +3120,14 @@ "tip": "模型执行的推理摘要", "title": "摘要模式" }, - "title": "OpenAI 设置" + "title": "OpenAI 设置", + "verbosity": { + "high": "高", + "low": "低", + "medium": "中", + "tip": "控制模型输出的详细程度", + "title": "详细程度" + } }, "privacy": { "enable_privacy_mode": "匿名发送错误报告和数据统计", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index ceed2351f..3a7c38f95 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -187,6 +187,7 @@ "label": "思維鏈長度", "low": "稍微思考", "medium": "正常思考", + "minimal": "最少思考", "off": "關閉" }, "regular_phrases": { @@ -3119,7 +3120,14 @@ "tip": "模型所執行的推理摘要", "title": "摘要模式" }, - "title": "OpenAI 設定" + "title": "OpenAI 設定", + "verbosity": { + "high": "高", + "low": "低", + "medium": "中", + "tip": "控制模型輸出的詳細程度", + "title": "詳細程度" + } }, "privacy": { "enable_privacy_mode": "匿名發送錯誤報告和資料統計", diff --git a/src/renderer/src/i18n/translate/el-gr.json b/src/renderer/src/i18n/translate/el-gr.json index 9565519fb..1b6ef88a6 100644 --- a/src/renderer/src/i18n/translate/el-gr.json +++ b/src/renderer/src/i18n/translate/el-gr.json @@ -187,6 +187,7 @@ "label": "Μήκος λογισμικού αλυσίδας", "low": "Μικρό", "medium": "Μεσαίο", + "minimal": "ελάχιστος", "off": "Απενεργοποίηση" }, "regular_phrases": { @@ -3119,7 +3120,14 @@ "tip": "Περίληψη συλλογισμού που εκτελείται από το μοντέλο", "title": "Λειτουργία περίληψης" }, - "title": "Ρυθμίσεις OpenAI" + "title": "Ρυθμίσεις OpenAI", + "verbosity": { + "high": "Ψηλός", + "low": "χαμηλό", + "medium": "Μεσαίο", + "tip": "Ελέγχει το βαθμό λεπτομέρειας της έξοδου του μοντέλου.", + "title": "λεπτομέρεια" + } }, "privacy": { "enable_privacy_mode": "Αποστολή ανώνυμων αναφορών σφαλμάτων και στατιστικών δεδομένων", diff --git a/src/renderer/src/i18n/translate/es-es.json b/src/renderer/src/i18n/translate/es-es.json index d6637609c..c3d6f397b 100644 --- a/src/renderer/src/i18n/translate/es-es.json +++ b/src/renderer/src/i18n/translate/es-es.json @@ -187,6 +187,7 @@ "label": "Longitud de Cadena de Razonamiento", "low": "Corto", "medium": "Medio", + "minimal": "minimal", "off": "Apagado" }, "regular_phrases": { @@ -3119,7 +3120,14 @@ "tip": "Resumen de la inferencia realizada por el modelo", "title": "Modo de resumen" }, - "title": "Configuración de OpenAI" + "title": "Configuración de OpenAI", + "verbosity": { + "high": "alto", + "low": "bajo", + "medium": "medio", + "tip": "Controlar el nivel de detalle de la salida del modelo", + "title": "nivel de detalle" + } }, "privacy": { "enable_privacy_mode": "Enviar informes de errores y estadísticas de forma anónima", diff --git a/src/renderer/src/i18n/translate/fr-fr.json b/src/renderer/src/i18n/translate/fr-fr.json index d8f8c4d9f..ac1321a0b 100644 --- a/src/renderer/src/i18n/translate/fr-fr.json +++ b/src/renderer/src/i18n/translate/fr-fr.json @@ -187,6 +187,7 @@ "label": "Longueur de la chaîne de raisonnement", "low": "Court", "medium": "Moyen", + "minimal": "minimal", "off": "Off" }, "regular_phrases": { @@ -3119,7 +3120,14 @@ "tip": "Résumé des inférences effectuées par le modèle", "title": "Mode de résumé" }, - "title": "Paramètres OpenAI" + "title": "Paramètres OpenAI", + "verbosity": { + "high": "haut", + "low": "faible", + "medium": "moyen", + "tip": "Contrôler le niveau de détail de la sortie du modèle", + "title": "niveau de détail" + } }, "privacy": { "enable_privacy_mode": "Отправлять анонимные сообщения об ошибках и статистику", diff --git a/src/renderer/src/i18n/translate/pt-pt.json b/src/renderer/src/i18n/translate/pt-pt.json index 649df406f..b49a50143 100644 --- a/src/renderer/src/i18n/translate/pt-pt.json +++ b/src/renderer/src/i18n/translate/pt-pt.json @@ -187,6 +187,7 @@ "label": "Comprimento da Cadeia de Raciocínio", "low": "Curto", "medium": "Médio", + "minimal": "mínimo", "off": "Desligado" }, "regular_phrases": { @@ -3119,7 +3120,14 @@ "tip": "Resumo do raciocínio executado pelo modelo", "title": "Modo de Resumo" }, - "title": "Configurações do OpenAI" + "title": "Configurações do OpenAI", + "verbosity": { + "high": "alto", + "low": "baixo", + "medium": "médio", + "tip": "Controlar o nível de detalhe da saída do modelo", + "title": "nível de detalhe" + } }, "privacy": { "enable_privacy_mode": "Enviar relatórios de erro e estatísticas de forma anônima", diff --git a/src/renderer/src/pages/home/Inputbar/ThinkingButton.tsx b/src/renderer/src/pages/home/Inputbar/ThinkingButton.tsx index e9176e4b5..898a12bb4 100644 --- a/src/renderer/src/pages/home/Inputbar/ThinkingButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/ThinkingButton.tsx @@ -1,9 +1,10 @@ import { MdiLightbulbAutoOutline, MdiLightbulbOffOutline, - MdiLightbulbOn10, + MdiLightbulbOn, + MdiLightbulbOn30, MdiLightbulbOn50, - MdiLightbulbOn90 + MdiLightbulbOn80 } from '@renderer/components/Icons/SVGIcon' import { useQuickPanel } from '@renderer/components/QuickPanel' import { getThinkModelType, isDoubaoThinkingAutoModel, MODEL_SUPPORTED_OPTIONS } from '@renderer/config/models' @@ -28,6 +29,7 @@ interface Props { // 选项转换映射表:当选项不支持时使用的替代选项 const OPTION_FALLBACK: Record = { off: 'low', // off -> low (for Gemini Pro models) + minimal: 'low', // minimal -> low (for gpt-5 and after) low: 'high', medium: 'high', // medium -> high (for Grok models) high: 'high', @@ -74,12 +76,14 @@ const ThinkingButton: FC = ({ ref, model, assistant, ToolbarButton }): Re const iconColor = isActive ? 'var(--color-link)' : 'var(--color-icon)' switch (true) { + case option === 'minimal': + return case option === 'low': - return - case option === 'medium': return + case option === 'medium': + return case option === 'high': - return + return case option === 'auto': return case option === 'off': diff --git a/src/renderer/src/pages/home/Tabs/components/OpenAISettingsGroup.tsx b/src/renderer/src/pages/home/Tabs/components/OpenAISettingsGroup.tsx index 7b7c88eac..e3992d5b6 100644 --- a/src/renderer/src/pages/home/Tabs/components/OpenAISettingsGroup.tsx +++ b/src/renderer/src/pages/home/Tabs/components/OpenAISettingsGroup.tsx @@ -1,11 +1,15 @@ import Selector from '@renderer/components/Selector' -import { isSupportedReasoningEffortOpenAIModel, isSupportFlexServiceTierModel } from '@renderer/config/models' +import { + isSupportedReasoningEffortOpenAIModel, + isSupportFlexServiceTierModel, + isSupportVerbosityModel +} from '@renderer/config/models' import { isSupportServiceTierProvider } from '@renderer/config/providers' import { useProvider } from '@renderer/hooks/useProvider' import { SettingDivider, SettingRow } from '@renderer/pages/settings' import { CollapsibleSettingGroup } from '@renderer/pages/settings/SettingGroup' import { RootState, useAppDispatch } from '@renderer/store' -import { setOpenAISummaryText } from '@renderer/store/settings' +import { setOpenAISummaryText, setOpenAIVerbosity } from '@renderer/store/settings' import { GroqServiceTiers, Model, @@ -15,6 +19,7 @@ import { ServiceTier, SystemProviderIds } from '@renderer/types' +import { OpenAIVerbosity } from '@types' import { Tooltip } from 'antd' import { CircleHelp } from 'lucide-react' import { FC, useCallback, useEffect, useMemo } from 'react' @@ -31,6 +36,7 @@ interface Props { const OpenAISettingsGroup: FC = ({ model, providerId, SettingGroup, SettingRowTitleSmall }) => { const { t } = useTranslation() const { provider, updateProvider } = useProvider(providerId) + const verbosity = useSelector((state: RootState) => state.settings.openAI.verbosity) const summaryText = useSelector((state: RootState) => state.settings.openAI.summaryText) const serviceTierMode = provider.serviceTier const dispatch = useAppDispatch() @@ -39,6 +45,7 @@ const OpenAISettingsGroup: FC = ({ model, providerId, SettingGroup, Setti isSupportedReasoningEffortOpenAIModel(model) && !model.id.includes('o1-pro') && (provider.type === 'openai-response' || provider.id === 'aihubmix') + const isSupportVerbosity = isSupportVerbosityModel(model) const isSupportServiceTier = isSupportServiceTierProvider(provider) const isSupportedFlexServiceTier = isSupportFlexServiceTierModel(model) @@ -56,6 +63,13 @@ const OpenAISettingsGroup: FC = ({ model, providerId, SettingGroup, Setti [updateProvider] ) + const setVerbosity = useCallback( + (value: OpenAIVerbosity) => { + dispatch(setOpenAIVerbosity(value)) + }, + [dispatch] + ) + const summaryTextOptions = [ { value: 'auto', @@ -71,6 +85,21 @@ const OpenAISettingsGroup: FC = ({ model, providerId, SettingGroup, Setti } ] + const verbosityOptions = [ + { + value: 'low', + label: t('settings.openai.verbosity.low') + }, + { + value: 'medium', + label: t('settings.openai.verbosity.medium') + }, + { + value: 'high', + label: t('settings.openai.verbosity.high') + } + ] + const serviceTierOptions = useMemo(() => { let baseOptions: { value: ServiceTier; label: string }[] if (provider.id === SystemProviderIds.groq) { @@ -131,7 +160,7 @@ const OpenAISettingsGroup: FC = ({ model, providerId, SettingGroup, Setti } }, [provider.id, serviceTierMode, serviceTierOptions, setServiceTierMode]) - if (!isOpenAIReasoning && !isSupportServiceTier) { + if (!isOpenAIReasoning && !isSupportServiceTier && !isSupportVerbosity) { return null } @@ -139,26 +168,28 @@ const OpenAISettingsGroup: FC = ({ model, providerId, SettingGroup, Setti {isSupportServiceTier && ( - - - {t('settings.openai.service_tier.title')}{' '} - - - - - { - setServiceTierMode(value as OpenAIServiceTier) - }} - options={serviceTierOptions} - placeholder={t('settings.openai.service_tier.auto')} - /> - + <> + + + {t('settings.openai.service_tier.title')}{' '} + + + + + { + setServiceTierMode(value as OpenAIServiceTier) + }} + options={serviceTierOptions} + placeholder={t('settings.openai.service_tier.auto')} + /> + + {(isOpenAIReasoning || isSupportVerbosity) && } + )} {isOpenAIReasoning && ( <> - {t('settings.openai.summary_text_mode.title')}{' '} @@ -174,8 +205,26 @@ const OpenAISettingsGroup: FC = ({ model, providerId, SettingGroup, Setti options={summaryTextOptions} /> + {isSupportVerbosity && } )} + {isSupportVerbosity && ( + + + {t('settings.openai.verbosity.title')}{' '} + + + + + { + setVerbosity(value as OpenAIVerbosity) + }} + options={verbosityOptions} + /> + + )} diff --git a/src/renderer/src/services/__tests__/ApiService.test.ts b/src/renderer/src/services/__tests__/ApiService.test.ts index 1d2a2415f..ea5006678 100644 --- a/src/renderer/src/services/__tests__/ApiService.test.ts +++ b/src/renderer/src/services/__tests__/ApiService.test.ts @@ -1222,7 +1222,9 @@ const mockOpenaiApiClient = { type: 'function' } } else if (fun?.arguments) { - toolCalls[index].function.arguments += fun.arguments + if (toolCalls[index] && toolCalls[index].type === 'function' && 'function' in toolCalls[index]) { + toolCalls[index].function.arguments += fun.arguments + } } } else { toolCalls.push(toolCall) diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts index 1789d2fdb..9778b6e77 100644 --- a/src/renderer/src/store/index.ts +++ b/src/renderer/src/store/index.ts @@ -60,7 +60,7 @@ const persistedReducer = persistReducer( { key: 'cherry-studio', storage, - version: 129, + version: 130, blacklist: ['runtime', 'messages', 'messageBlocks', 'tabs'], migrate }, diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index cdabaddc7..f5613a52a 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -1438,7 +1438,8 @@ const migrateConfig = { try { state.settings.openAI = { summaryText: 'off', - serviceTier: 'auto' + serviceTier: 'auto', + verbosity: 'medium' } state.settings.codeExecution = { @@ -1530,7 +1531,8 @@ const migrateConfig = { if (!state.settings.openAI) { state.settings.openAI = { summaryText: 'off', - serviceTier: 'auto' + serviceTier: 'auto', + verbosity: 'medium' } } return state @@ -2072,12 +2074,22 @@ const migrateConfig = { updateProvider(state, p.id, { apiOptions: changes }) } }) - return state } catch (error) { logger.error('migrate 129 error', error as Error) return state } + }, + '130': (state: RootState) => { + try { + if (state.settings && state.settings.openAI && !state.settings.openAI.verbosity) { + state.settings.openAI.verbosity = 'medium' + } + return state + } catch (error) { + logger.error('migrate 130 error', error as Error) + return state + } } } diff --git a/src/renderer/src/store/settings.ts b/src/renderer/src/store/settings.ts index 992ae306f..d5f354e72 100644 --- a/src/renderer/src/store/settings.ts +++ b/src/renderer/src/store/settings.ts @@ -15,6 +15,7 @@ import { } from '@renderer/types' import { uuid } from '@renderer/utils' import { UpgradeChannel } from '@shared/config/constant' +import { OpenAIVerbosity } from '@types' import { RemoteSyncState } from './backup' @@ -194,6 +195,7 @@ export interface SettingsState { summaryText: OpenAISummaryText /** @deprecated 现在该设置迁移到Provider对象中 */ serviceTier: OpenAIServiceTier + verbosity: OpenAIVerbosity } // Notification notification: { @@ -365,7 +367,8 @@ export const initialState: SettingsState = { // OpenAI openAI: { summaryText: 'off', - serviceTier: 'auto' + serviceTier: 'auto', + verbosity: 'medium' }, notification: { assistant: false, @@ -775,6 +778,9 @@ const settingsSlice = createSlice({ setOpenAISummaryText: (state, action: PayloadAction) => { state.openAI.summaryText = action.payload }, + setOpenAIVerbosity: (state, action: PayloadAction) => { + state.openAI.verbosity = action.payload + }, setNotificationSettings: (state, action: PayloadAction) => { state.notification = action.payload }, @@ -939,6 +945,7 @@ export const { setEnableBackspaceDeleteModel, setDisableHardwareAcceleration, setOpenAISummaryText, + setOpenAIVerbosity, setNotificationSettings, // Local backup settings setLocalBackupDir, diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index 82e93b7aa..ebd96c6bb 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -52,10 +52,11 @@ export type AssistantSettingCustomParameters = { type: 'string' | 'number' | 'boolean' | 'json' } -export type ReasoningEffortOption = 'low' | 'medium' | 'high' | 'auto' +export type ReasoningEffortOption = NonNullable | 'auto' export type ThinkingOption = ReasoningEffortOption | 'off' export type ThinkingModelType = | 'default' + | 'gpt5' | 'grok' | 'gemini' | 'gemini_pro' @@ -87,6 +88,7 @@ export function isThinkModelType(type: string): type is ThinkingModelType { } export const EFFORT_RATIO: EffortRatio = { + minimal: 0.05, low: 0.05, medium: 0.5, high: 0.8, @@ -946,6 +948,8 @@ export interface StoreSyncAction { } } +export type OpenAIVerbosity = 'high' | 'medium' | 'low' + export type OpenAISummaryText = 'auto' | 'concise' | 'detailed' | 'off' export const OpenAIServiceTiers = { diff --git a/src/renderer/src/utils/mcp-tools.ts b/src/renderer/src/utils/mcp-tools.ts index 973f8fc08..a1f1a2b09 100644 --- a/src/renderer/src/utils/mcp-tools.ts +++ b/src/renderer/src/utils/mcp-tools.ts @@ -78,8 +78,10 @@ export function openAIToolsToMcpTool( try { if ('name' in toolCall) { toolName = toolCall.name - } else { + } else if (toolCall.type === 'function' && 'function' in toolCall) { toolName = toolCall.function.name + } else { + throw new Error('Unknown tool call type') } } catch (error) { logger.error(`Error parsing tool call: ${toolCall}`, error as Error) diff --git a/yarn.lock b/yarn.lock index 7dd043f51..e68e27ab5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7786,7 +7786,7 @@ __metadata: notion-helper: "npm:^1.3.22" npx-scope-finder: "npm:^1.2.0" officeparser: "npm:^4.2.0" - openai: "patch:openai@npm%3A5.12.0#~/.yarn/patches/openai-npm-5.12.0-a06a6369b2.patch" + openai: "patch:openai@npm%3A5.12.2#~/.yarn/patches/openai-npm-5.12.2-30b075401c.patch" os-proxy-config: "npm:^1.1.2" p-queue: "npm:^8.1.0" pdf-lib: "npm:^1.17.1" @@ -16688,9 +16688,9 @@ __metadata: languageName: node linkType: hard -"openai@npm:5.12.0": - version: 5.12.0 - resolution: "openai@npm:5.12.0" +"openai@npm:5.12.2": + version: 5.12.2 + resolution: "openai@npm:5.12.2" peerDependencies: ws: ^8.18.0 zod: ^3.23.8 @@ -16701,13 +16701,13 @@ __metadata: optional: true bin: openai: bin/cli - checksum: 10c0/adab04e90cae8f393f76c007f98c0636af97a280fb05766b0cee5ab202c802db01c113d0ce0dfea42e1a1fe3b08c9a3881b6eea9a0b0703375f487688aaca1fc + checksum: 10c0/7737b9b24edc81fcf9e6dcfb18a196cc0f8e29b6e839adf06a2538558c03908e3aa4cd94901b1a7f4a9dd62676fe9e34d6202281b2395090d998618ea1614c0c languageName: node linkType: hard -"openai@patch:openai@npm%3A5.12.0#~/.yarn/patches/openai-npm-5.12.0-a06a6369b2.patch": - version: 5.12.0 - resolution: "openai@patch:openai@npm%3A5.12.0#~/.yarn/patches/openai-npm-5.12.0-a06a6369b2.patch::version=5.12.0&hash=d96796" +"openai@patch:openai@npm%3A5.12.2#~/.yarn/patches/openai-npm-5.12.2-30b075401c.patch": + version: 5.12.2 + resolution: "openai@patch:openai@npm%3A5.12.2#~/.yarn/patches/openai-npm-5.12.2-30b075401c.patch::version=5.12.2&hash=ad5d10" peerDependencies: ws: ^8.18.0 zod: ^3.23.8 @@ -16718,7 +16718,7 @@ __metadata: optional: true bin: openai: bin/cli - checksum: 10c0/207f70a43839d34f6ad3322a4bdf6d755ac923ca9c6b5fb49bd13263d816c5acb1a501228b9124b1f72eae2f7efffc8890e2d901907b3c8efc2fee3f8a273cec + checksum: 10c0/2964a1c88a98cf169c9b73e8cd6776c03c8f3103fee30961c6953e5d995ad57a697e2179615999356809349186df6496abae105928ff7ce0229e5016dec87cb3 languageName: node linkType: hard