fix: disappeared MCP button (#10956)

* refactor(types): add InputBarToolType and update related types

- Define InputBarToolType union type in chat types
- Update ToolOrder and InputToolsState to use InputBarToolType
- Modify InputbarTools component to use new type for tool keys

* refactor(assistants): use DEFAULT_ASSISTANT_SETTINGS constant for default settings

* fix(assistants): ensure default settings for presets in migration

Add default settings for assistant presets during migration if they are missing, including toolUseMode
This commit is contained in:
Phantom 2025-10-26 11:58:38 +08:00 committed by GitHub
parent 487b5c4d8a
commit 8054ed7ad8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 32 additions and 14 deletions

View File

@ -19,6 +19,7 @@ import { getModelUniqId } from '@renderer/services/ModelService'
import { useAppDispatch, useAppSelector } from '@renderer/store' import { useAppDispatch, useAppSelector } from '@renderer/store'
import { setIsCollapsed, setToolOrder } from '@renderer/store/inputTools' import { setIsCollapsed, setToolOrder } from '@renderer/store/inputTools'
import { FileType, FileTypes, KnowledgeBase, Model } from '@renderer/types' import { FileType, FileTypes, KnowledgeBase, Model } from '@renderer/types'
import { InputBarToolType } from '@renderer/types/chat'
import { classNames } from '@renderer/utils' import { classNames } from '@renderer/utils'
import { isPromptToolUse, isSupportedToolUse } from '@renderer/utils/mcp-tools' import { isPromptToolUse, isSupportedToolUse } from '@renderer/utils/mcp-tools'
import { Divider, Dropdown, Tooltip } from 'antd' import { Divider, Dropdown, Tooltip } from 'antd'
@ -85,7 +86,7 @@ export interface InputbarToolsProps {
} }
interface ToolButtonConfig { interface ToolButtonConfig {
key: string key: InputBarToolType
component: ReactNode component: ReactNode
condition?: boolean condition?: boolean
visible?: boolean visible?: boolean
@ -184,7 +185,7 @@ const InputbarTools = ({
const clearTopicShortcut = useShortcutDisplay('clear_topic') const clearTopicShortcut = useShortcutDisplay('clear_topic')
const toggleToolVisibility = useCallback( const toggleToolVisibility = useCallback(
(toolKey: string, isVisible: boolean | undefined) => { (toolKey: InputBarToolType, isVisible: boolean | undefined) => {
const newToolOrder = { const newToolOrder = {
visible: [...toolOrder.visible], visible: [...toolOrder.visible],
hidden: [...toolOrder.hidden] hidden: [...toolOrder.hidden]

View File

@ -1,7 +1,7 @@
import { createSelector, createSlice, PayloadAction } from '@reduxjs/toolkit' import { createSelector, createSlice, PayloadAction } from '@reduxjs/toolkit'
import { DEFAULT_CONTEXTCOUNT, DEFAULT_TEMPERATURE } from '@renderer/config/constant' import { DEFAULT_CONTEXTCOUNT, DEFAULT_TEMPERATURE } from '@renderer/config/constant'
import { TopicManager } from '@renderer/hooks/useTopic' import { TopicManager } from '@renderer/hooks/useTopic'
import { getDefaultAssistant, getDefaultTopic } from '@renderer/services/AssistantService' import { DEFAULT_ASSISTANT_SETTINGS, getDefaultAssistant, getDefaultTopic } from '@renderer/services/AssistantService'
import { Assistant, AssistantPreset, AssistantSettings, Model, Topic } from '@renderer/types' import { Assistant, AssistantPreset, AssistantSettings, Model, Topic } from '@renderer/types'
import { isEmpty, uniqBy } from 'lodash' import { isEmpty, uniqBy } from 'lodash'
@ -215,13 +215,7 @@ const assistantsSlice = createSlice({
if (agent.id === action.payload.assistantId) { if (agent.id === action.payload.assistantId) {
for (const key in settings) { for (const key in settings) {
if (!agent.settings) { if (!agent.settings) {
agent.settings = { agent.settings = DEFAULT_ASSISTANT_SETTINGS
temperature: DEFAULT_TEMPERATURE,
contextCount: DEFAULT_CONTEXTCOUNT,
enableMaxTokens: false,
maxTokens: 0,
streamOutput: true
}
} }
agent.settings[key] = settings[key] agent.settings[key] = settings[key]
} }

View File

@ -1,8 +1,9 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit' import { createSlice, PayloadAction } from '@reduxjs/toolkit'
import { InputBarToolType } from '@renderer/types/chat'
export type ToolOrder = { type ToolOrder = {
visible: string[] visible: InputBarToolType[]
hidden: string[] hidden: InputBarToolType[]
} }
export const DEFAULT_TOOL_ORDER: ToolOrder = { export const DEFAULT_TOOL_ORDER: ToolOrder = {
@ -20,7 +21,7 @@ export const DEFAULT_TOOL_ORDER: ToolOrder = {
hidden: ['quick_phrases', 'clear_topic', 'toggle_expand', 'new_context'] hidden: ['quick_phrases', 'clear_topic', 'toggle_expand', 'new_context']
} }
export type InputToolsState = { type InputToolsState = {
toolOrder: ToolOrder toolOrder: ToolOrder
isCollapsed: boolean isCollapsed: boolean
} }

View File

@ -2708,6 +2708,13 @@ const migrateConfig = {
if (state.assistants.presets === undefined) { if (state.assistants.presets === undefined) {
state.assistants.presets = [] state.assistants.presets = []
} }
state.assistants.presets.forEach((preset) => {
if (!preset.settings) {
preset.settings = DEFAULT_ASSISTANT_SETTINGS
} else if (!preset.settings.toolUseMode) {
preset.settings.toolUseMode = DEFAULT_ASSISTANT_SETTINGS.toolUseMode
}
})
return state return state
} catch (error) { } catch (error) {
logger.error('migrate 166 error', error as Error) logger.error('migrate 166 error', error as Error)

View File

@ -1 +1,16 @@
export type Tab = 'assistants' | 'topic' | 'settings' export type Tab = 'assistants' | 'topic' | 'settings'
export type InputBarToolType =
| 'new_topic'
| 'attachment'
| 'thinking'
| 'web_search'
| 'url_context'
| 'knowledge_base'
| 'mcp_tools'
| 'generate_image'
| 'mention_models'
| 'quick_phrases'
| 'clear_topic'
| 'toggle_expand'
| 'new_context'