chore(store): update migration logic and increment version to 87

* Updated migration functions to include error handling for provider additions.
* Incremented the version number in the persisted reducer configuration.
This commit is contained in:
kangfenmao 2025-03-30 14:08:14 +08:00
parent 9e977f4b35
commit b363cb06a4
2 changed files with 489 additions and 287 deletions

View File

@ -42,7 +42,7 @@ const persistedReducer = persistReducer(
{ {
key: 'cherry-studio', key: 'cherry-studio',
storage, storage,
version: 86, version: 87,
blacklist: ['runtime', 'messages'], blacklist: ['runtime', 'messages'],
migrate migrate
}, },

View File

@ -35,420 +35,609 @@ function addProvider(state: RootState, id: string) {
const migrateConfig = { const migrateConfig = {
'2': (state: RootState) => { '2': (state: RootState) => {
addProvider(state, 'yi') try {
return state addProvider(state, 'yi')
return state
} catch (error) {
return state
}
}, },
'3': (state: RootState) => { '3': (state: RootState) => {
addProvider(state, 'zhipu') try {
return state addProvider(state, 'zhipu')
return state
} catch (error) {
return state
}
}, },
'4': (state: RootState) => { '4': (state: RootState) => {
addProvider(state, 'ollama') try {
return state addProvider(state, 'ollama')
return state
} catch (error) {
return state
}
}, },
'5': (state: RootState) => { '5': (state: RootState) => {
addProvider(state, 'moonshot') try {
return state addProvider(state, 'moonshot')
return state
} catch (error) {
return state
}
}, },
'6': (state: RootState) => { '6': (state: RootState) => {
addProvider(state, 'openrouter') try {
return state addProvider(state, 'openrouter')
return state
} catch (error) {
return state
}
}, },
'7': (state: RootState) => { '7': (state: RootState) => {
return { try {
...state, return {
settings: { ...state,
...state.settings, settings: {
language: navigator.language ...state.settings,
language: navigator.language
}
} }
} catch (error) {
return state
} }
}, },
'8': (state: RootState) => { '8': (state: RootState) => {
const fixAssistantName = (assistant: Assistant) => { try {
if (isEmpty(assistant.name)) { const fixAssistantName = (assistant: Assistant) => {
assistant.name = i18n.t(`assistant.${assistant.id}.name`) if (isEmpty(assistant.name)) {
} assistant.name = i18n.t(`assistant.${assistant.id}.name`)
assistant.topics = assistant.topics.map((topic) => {
if (isEmpty(topic.name)) {
topic.name = i18n.t(`assistant.${assistant.id}.topic.name`)
} }
return topic
})
return assistant assistant.topics = assistant.topics.map((topic) => {
} if (isEmpty(topic.name)) {
topic.name = i18n.t(`assistant.${assistant.id}.topic.name`)
}
return topic
})
return { return assistant
...state,
assistants: {
...state.assistants,
defaultAssistant: fixAssistantName(state.assistants.defaultAssistant),
assistants: state.assistants.assistants.map((assistant) => fixAssistantName(assistant))
} }
return {
...state,
assistants: {
...state.assistants,
defaultAssistant: fixAssistantName(state.assistants.defaultAssistant),
assistants: state.assistants.assistants.map((assistant) => fixAssistantName(assistant))
}
}
} catch (error) {
return state
} }
}, },
'9': (state: RootState) => { '9': (state: RootState) => {
return { try {
...state, return {
llm: { ...state,
...state.llm, llm: {
providers: state.llm.providers.map((provider) => { ...state.llm,
if (provider.id === 'zhipu' && provider.models[0] && provider.models[0].id === 'llama3-70b-8192') { providers: state.llm.providers.map((provider) => {
provider.models = SYSTEM_MODELS.zhipu if (provider.id === 'zhipu' && provider.models[0] && provider.models[0].id === 'llama3-70b-8192') {
} provider.models = SYSTEM_MODELS.zhipu
return provider }
}) return provider
})
}
} }
} catch (error) {
return state
} }
}, },
'10': (state: RootState) => { '10': (state: RootState) => {
addProvider(state, 'baichuan') try {
return state addProvider(state, 'baichuan')
return state
} catch (error) {
return state
}
}, },
'11': (state: RootState) => { '11': (state: RootState) => {
addProvider(state, 'dashscope') try {
addProvider(state, 'anthropic') addProvider(state, 'dashscope')
return state addProvider(state, 'anthropic')
return state
} catch (error) {
return state
}
}, },
'12': (state: RootState) => { '12': (state: RootState) => {
addProvider(state, 'aihubmix') try {
return state addProvider(state, 'aihubmix')
return state
} catch (error) {
return state
}
}, },
'13': (state: RootState) => { '13': (state: RootState) => {
return { try {
...state, return {
assistants: { ...state,
...state.assistants, assistants: {
defaultAssistant: { ...state.assistants,
...state.assistants.defaultAssistant, defaultAssistant: {
name: ['Default Assistant', '默认助手'].includes(state.assistants.defaultAssistant.name) ...state.assistants.defaultAssistant,
? i18n.t(`assistant.default.name`) name: ['Default Assistant', '默认助手'].includes(state.assistants.defaultAssistant.name)
: state.assistants.defaultAssistant.name ? i18n.t(`assistant.default.name`)
: state.assistants.defaultAssistant.name
}
} }
} }
} catch (error) {
return state
} }
}, },
'14': (state: RootState) => { '14': (state: RootState) => {
return { try {
...state, return {
settings: { ...state,
...state.settings, settings: {
showAssistants: true, ...state.settings,
proxyUrl: undefined showAssistants: true,
proxyUrl: undefined
}
} }
} catch (error) {
return state
} }
}, },
'15': (state: RootState) => { '15': (state: RootState) => {
return { try {
...state, return {
settings: { ...state,
...state.settings, settings: {
userName: '', ...state.settings,
showMessageDivider: true userName: '',
showMessageDivider: true
}
} }
} catch (error) {
return state
} }
}, },
'16': (state: RootState) => { '16': (state: RootState) => {
return { try {
...state, return {
settings: { ...state,
...state.settings, settings: {
messageFont: 'system', ...state.settings,
showInputEstimatedTokens: false messageFont: 'system',
showInputEstimatedTokens: false
}
} }
} catch (error) {
return state
} }
}, },
'17': (state: RootState) => { '17': (state: RootState) => {
return { try {
...state, return {
settings: { ...state,
...state.settings, settings: {
theme: 'auto' ...state.settings,
theme: 'auto'
}
} }
} catch (error) {
return state
} }
}, },
'19': (state: RootState) => { '19': (state: RootState) => {
return { try {
...state, return {
agents: { ...state,
agents: [] agents: {
}, agents: []
llm: { },
...state.llm, llm: {
settings: { ...state.llm,
ollama: { settings: {
keepAliveTime: 5 ollama: {
keepAliveTime: 5
}
} }
} }
} }
} catch (error) {
return state
} }
}, },
'20': (state: RootState) => { '20': (state: RootState) => {
return { try {
...state, return {
settings: { ...state,
...state.settings, settings: {
fontSize: 14 ...state.settings,
fontSize: 14
}
} }
} catch (error) {
return state
} }
}, },
'21': (state: RootState) => { '21': (state: RootState) => {
addProvider(state, 'gemini') try {
addProvider(state, 'stepfun') addProvider(state, 'gemini')
addProvider(state, 'doubao') addProvider(state, 'stepfun')
return state addProvider(state, 'doubao')
return state
} catch (error) {
return state
}
}, },
'22': (state: RootState) => { '22': (state: RootState) => {
addProvider(state, 'minimax') try {
return state addProvider(state, 'minimax')
return state
} catch (error) {
return state
}
}, },
'23': (state: RootState) => { '23': (state: RootState) => {
return { try {
...state, return {
settings: { ...state,
...state.settings, settings: {
showTopics: true, ...state.settings,
windowStyle: 'transparent' showTopics: true,
windowStyle: 'transparent'
}
} }
} catch (error) {
return state
} }
}, },
'24': (state: RootState) => { '24': (state: RootState) => {
return { try {
...state, return {
assistants: { ...state,
...state.assistants, assistants: {
assistants: state.assistants.assistants.map((assistant) => ({ ...state.assistants,
...assistant, assistants: state.assistants.assistants.map((assistant) => ({
topics: assistant.topics.map((topic) => ({ ...assistant,
...topic, topics: assistant.topics.map((topic) => ({
createdAt: new Date().toISOString(), ...topic,
updatedAt: new Date().toISOString() createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString()
}))
})) }))
})) },
}, settings: {
settings: { ...state.settings,
...state.settings, topicPosition: 'right'
topicPosition: 'right' }
} }
} catch (error) {
return state
} }
}, },
'25': (state: RootState) => { '25': (state: RootState) => {
addProvider(state, 'github') try {
return state addProvider(state, 'github')
return state
} catch (error) {
return state
}
}, },
'26': (state: RootState) => { '26': (state: RootState) => {
addProvider(state, 'ocoolai') try {
return state addProvider(state, 'ocoolai')
return state
} catch (error) {
return state
}
}, },
'27': (state: RootState) => { '27': (state: RootState) => {
return { try {
...state, return {
settings: { ...state,
...state.settings, settings: {
renderInputMessageAsMarkdown: true ...state.settings,
renderInputMessageAsMarkdown: true
}
} }
} catch (error) {
return state
} }
}, },
'28': (state: RootState) => { '28': (state: RootState) => {
addProvider(state, 'together') try {
addProvider(state, 'fireworks') addProvider(state, 'together')
addProvider(state, 'zhinao') addProvider(state, 'fireworks')
addProvider(state, 'hunyuan') addProvider(state, 'zhinao')
addProvider(state, 'nvidia') addProvider(state, 'hunyuan')
addProvider(state, 'nvidia')
return state
} catch (error) {
return state
}
}, },
'29': (state: RootState) => { '29': (state: RootState) => {
return { try {
...state, return {
assistants: { ...state,
...state.assistants, assistants: {
assistants: state.assistants.assistants.map((assistant) => { ...state.assistants,
assistant.topics = assistant.topics.map((topic) => ({ assistants: state.assistants.assistants.map((assistant) => {
...topic, assistant.topics = assistant.topics.map((topic) => ({
assistantId: assistant.id ...topic,
})) assistantId: assistant.id
return assistant }))
}) return assistant
})
}
} }
} catch (error) {
return state
} }
}, },
'30': (state: RootState) => { '30': (state: RootState) => {
addProvider(state, 'azure-openai') try {
return state addProvider(state, 'azure-openai')
return state
} catch (error) {
return state
}
}, },
'31': (state: RootState) => { '31': (state: RootState) => {
return { try {
...state, return {
llm: { ...state,
...state.llm, llm: {
providers: state.llm.providers.map((provider) => { ...state.llm,
if (provider.id === 'azure-openai') { providers: state.llm.providers.map((provider) => {
provider.models = provider.models.map((model) => ({ ...model, provider: 'azure-openai' })) if (provider.id === 'azure-openai') {
} provider.models = provider.models.map((model) => ({ ...model, provider: 'azure-openai' }))
return provider }
}) return provider
})
}
} }
} catch (error) {
return state
} }
}, },
'32': (state: RootState) => { '32': (state: RootState) => {
addProvider(state, 'hunyuan') try {
return state addProvider(state, 'hunyuan')
return state
} catch (error) {
return state
}
}, },
'33': (state: RootState) => { '33': (state: RootState) => {
state.assistants.defaultAssistant.type = 'assistant' try {
state.assistants.defaultAssistant.type = 'assistant'
state.agents.agents.forEach((agent) => { state.agents.agents.forEach((agent) => {
agent.type = 'agent' agent.type = 'agent'
// @ts-ignore eslint-disable-next-line // @ts-ignore eslint-disable-next-line
delete agent.group delete agent.group
}) })
return { return {
...state, ...state,
assistants: { assistants: {
...state.assistants, ...state.assistants,
assistants: [...state.assistants.assistants].map((assistant) => { assistants: [...state.assistants.assistants].map((assistant) => {
// @ts-ignore eslint-disable-next-line // @ts-ignore eslint-disable-next-line
delete assistant.group delete assistant.group
return { return {
...assistant, ...assistant,
id: assistant.id.length === 36 ? assistant.id : uuid(), id: assistant.id.length === 36 ? assistant.id : uuid(),
type: assistant.type === 'system' ? assistant.type : 'assistant' type: assistant.type === 'system' ? assistant.type : 'assistant'
} }
}) })
}
} }
} catch (error) {
return state
} }
}, },
'34': (state: RootState) => { '34': (state: RootState) => {
state.assistants.assistants.forEach((assistant) => { try {
assistant.topics.forEach((topic) => { state.assistants.assistants.forEach((assistant) => {
topic.assistantId = assistant.id assistant.topics.forEach((topic) => {
runAsyncFunction(async () => { topic.assistantId = assistant.id
const _topic = await db.topics.get(topic.id) runAsyncFunction(async () => {
if (_topic) { const _topic = await db.topics.get(topic.id)
const messages = (_topic?.messages || []).map((message) => ({ ...message, assistantId: assistant.id })) if (_topic) {
db.topics.put({ ..._topic, messages }, topic.id) const messages = (_topic?.messages || []).map((message) => ({ ...message, assistantId: assistant.id }))
} db.topics.put({ ..._topic, messages }, topic.id)
}
})
}) })
}) })
}) return state
return state } catch (error) {
return state
}
}, },
'35': (state: RootState) => { '35': (state: RootState) => {
state.settings.mathEngine = 'KaTeX' try {
return state state.settings.mathEngine = 'KaTeX'
return state
} catch (error) {
return state
}
}, },
'36': (state: RootState) => { '36': (state: RootState) => {
state.settings.topicPosition = 'left' try {
return state state.settings.topicPosition = 'left'
return state
} catch (error) {
return state
}
}, },
'37': (state: RootState) => { '37': (state: RootState) => {
state.settings.messageStyle = 'plain' try {
return state state.settings.messageStyle = 'plain'
return state
} catch (error) {
return state
}
}, },
'38': (state: RootState) => { '38': (state: RootState) => {
addProvider(state, 'grok') try {
addProvider(state, 'hyperbolic') addProvider(state, 'grok')
addProvider(state, 'mistral') addProvider(state, 'hyperbolic')
return state addProvider(state, 'mistral')
return state
} catch (error) {
return state
}
}, },
'39': (state: RootState) => { '39': (state: RootState) => {
state.settings.codeStyle = 'auto' try {
return state state.settings.codeStyle = 'auto'
return state
} catch (error) {
return state
}
}, },
'40': (state: RootState) => { '40': (state: RootState) => {
state.settings.tray = true try {
return state state.settings.tray = true
return state
} catch (error) {
return state
}
}, },
'41': (state: RootState) => { '41': (state: RootState) => {
state.llm.providers.forEach((provider) => { try {
if (provider.id === 'gemini') { state.llm.providers.forEach((provider) => {
provider.type = 'gemini' if (provider.id === 'gemini') {
} else if (provider.id === 'anthropic') { provider.type = 'gemini'
provider.type = 'anthropic' } else if (provider.id === 'anthropic') {
} else { provider.type = 'anthropic'
provider.type = 'openai' } else {
} provider.type = 'openai'
}) }
return state })
return state
} catch (error) {
return state
}
}, },
'42': (state: RootState) => { '42': (state: RootState) => {
state.settings.proxyMode = state.settings.proxyUrl ? 'custom' : 'none' try {
return state state.settings.proxyMode = state.settings.proxyUrl ? 'custom' : 'none'
return state
} catch (error) {
return state
}
}, },
'43': (state: RootState) => { '43': (state: RootState) => {
if (state.settings.proxyMode === 'none') { try {
state.settings.proxyMode = 'system' if (state.settings.proxyMode === 'none') {
state.settings.proxyMode = 'system'
}
return state
} catch (error) {
return state
} }
return state
}, },
'44': (state: RootState) => { '44': (state: RootState) => {
state.settings.translateModelPrompt = TRANSLATE_PROMPT try {
return state state.settings.translateModelPrompt = TRANSLATE_PROMPT
return state
} catch (error) {
return state
}
}, },
'45': (state: RootState) => { '45': (state: RootState) => {
state.settings.enableTopicNaming = true state.settings.enableTopicNaming = true
return state return state
}, },
'46': (state: RootState) => { '46': (state: RootState) => {
if ( try {
state.settings?.translateModelPrompt?.includes( if (
'If the target language is the same as the source language, do not translate' state.settings?.translateModelPrompt?.includes(
) 'If the target language is the same as the source language, do not translate'
) { )
state.settings.translateModelPrompt = TRANSLATE_PROMPT ) {
state.settings.translateModelPrompt = TRANSLATE_PROMPT
}
return state
} catch (error) {
return state
} }
return state
}, },
'47': (state: RootState) => { '47': (state: RootState) => {
state.llm.providers.forEach((provider) => { try {
provider.models.forEach((model) => { state.llm.providers.forEach((provider) => {
model.group = getDefaultGroupName(model.id) provider.models.forEach((model) => {
model.group = getDefaultGroupName(model.id)
})
}) })
}) return state
return state } catch (error) {
return state
}
}, },
'48': (state: RootState) => { '48': (state: RootState) => {
if (state.shortcuts) { try {
state.shortcuts.shortcuts.forEach((shortcut) => { if (state.shortcuts) {
shortcut.system = shortcut.key !== 'new_topic' state.shortcuts.shortcuts.forEach((shortcut) => {
}) shortcut.system = shortcut.key !== 'new_topic'
state.shortcuts.shortcuts.push({ })
key: 'toggle_show_assistants', state.shortcuts.shortcuts.push({
shortcut: [isMac ? 'Command' : 'Ctrl', '['], key: 'toggle_show_assistants',
editable: true, shortcut: [isMac ? 'Command' : 'Ctrl', '['],
enabled: true, editable: true,
system: false enabled: true,
}) system: false
state.shortcuts.shortcuts.push({ })
key: 'toggle_show_topics', state.shortcuts.shortcuts.push({
shortcut: [isMac ? 'Command' : 'Ctrl', ']'], key: 'toggle_show_topics',
editable: true, shortcut: [isMac ? 'Command' : 'Ctrl', ']'],
enabled: true, editable: true,
system: false enabled: true,
}) system: false
})
}
return state
} catch (error) {
return state
} }
return state
}, },
'49': (state: RootState) => { '49': (state: RootState) => {
state.settings.pasteLongTextThreshold = 1500 try {
if (state.shortcuts) { state.settings.pasteLongTextThreshold = 1500
state.shortcuts.shortcuts = [ if (state.shortcuts) {
...state.shortcuts.shortcuts, state.shortcuts.shortcuts = [
{ ...state.shortcuts.shortcuts,
key: 'copy_last_message', {
shortcut: [isMac ? 'Command' : 'Ctrl', 'Shift', 'C'], key: 'copy_last_message',
editable: true, shortcut: [isMac ? 'Command' : 'Ctrl', 'Shift', 'C'],
enabled: false, editable: true,
system: false enabled: false,
} system: false
] }
]
}
return state
} catch (error) {
return state
} }
return state
}, },
'50': (state: RootState) => { '50': (state: RootState) => {
addProvider(state, 'jina') try {
return state addProvider(state, 'jina')
return state
} catch (error) {
return state
}
}, },
'51': (state: RootState) => { '51': (state: RootState) => {
state.settings.topicNamingPrompt = '' state.settings.topicNamingPrompt = ''
@ -634,24 +823,28 @@ const migrateConfig = {
} }
}, },
'67': (state: RootState) => { '67': (state: RootState) => {
if (state.minapps) { try {
const xiaoyi = DEFAULT_MIN_APPS.find((app) => app.id === 'xiaoyi') if (state.minapps) {
if (xiaoyi) { const xiaoyi = DEFAULT_MIN_APPS.find((app) => app.id === 'xiaoyi')
state.minapps.enabled.push(xiaoyi) if (xiaoyi) {
state.minapps.enabled.push(xiaoyi)
}
} }
addProvider(state, 'modelscope')
addProvider(state, 'lmstudio')
addProvider(state, 'perplexity')
addProvider(state, 'infini')
addProvider(state, 'dmxapi')
state.llm.settings.lmstudio = {
keepAliveTime: 5
}
return state
} catch (error) {
return state
} }
addProvider(state, 'modelscope')
addProvider(state, 'lmstudio')
addProvider(state, 'perplexity')
addProvider(state, 'infini')
addProvider(state, 'dmxapi')
state.llm.settings.lmstudio = {
keepAliveTime: 5
}
return state
}, },
'68': (state: RootState) => { '68': (state: RootState) => {
try { try {
@ -946,6 +1139,15 @@ const migrateConfig = {
} }
return state return state
},
'87': (state: RootState) => {
try {
state.settings.maxKeepAliveMinapps = 3
state.settings.showOpenedMinappsInSidebar = true
return state
} catch (error) {
return state
}
} }
} }