mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-24 10:40:07 +08:00
799 lines
19 KiB
TypeScript
799 lines
19 KiB
TypeScript
import { isMac } from '@renderer/config/constant'
|
|
import { SYSTEM_MODELS } from '@renderer/config/models'
|
|
import { TRANSLATE_PROMPT } from '@renderer/config/prompts'
|
|
import db from '@renderer/databases'
|
|
import i18n from '@renderer/i18n'
|
|
import { Assistant } from '@renderer/types'
|
|
import { getDefaultGroupName, runAsyncFunction, uuid } from '@renderer/utils'
|
|
import { isEmpty } from 'lodash'
|
|
import { createMigrate } from 'redux-persist'
|
|
|
|
import { RootState } from '.'
|
|
|
|
const migrateConfig = {
|
|
'2': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: [
|
|
...state.llm.providers,
|
|
{
|
|
id: 'yi',
|
|
name: 'Yi',
|
|
apiKey: '',
|
|
apiHost: 'https://api.lingyiwanwu.com',
|
|
isSystem: true,
|
|
models: SYSTEM_MODELS.yi
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'3': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: [
|
|
...state.llm.providers,
|
|
{
|
|
id: 'zhipu',
|
|
name: 'ZhiPu',
|
|
apiKey: '',
|
|
apiHost: 'https://open.bigmodel.cn/api/paas/v4/',
|
|
isSystem: true,
|
|
models: SYSTEM_MODELS.zhipu
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'4': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: [
|
|
...state.llm.providers,
|
|
{
|
|
id: 'ollama',
|
|
name: 'Ollama',
|
|
apiKey: '',
|
|
apiHost: 'http://localhost:11434/v1/',
|
|
isSystem: true,
|
|
models: []
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'5': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: [
|
|
...state.llm.providers,
|
|
{
|
|
id: 'moonshot',
|
|
name: 'Moonshot',
|
|
apiKey: '',
|
|
apiHost: 'https://api.moonshot.cn',
|
|
isSystem: true,
|
|
models: SYSTEM_MODELS.moonshot
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'6': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: [
|
|
...state.llm.providers,
|
|
{
|
|
id: 'openrouter',
|
|
name: 'OpenRouter',
|
|
apiKey: '',
|
|
apiHost: 'https://openrouter.ai/api/v1/',
|
|
models: SYSTEM_MODELS.openrouter,
|
|
isSystem: true
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'7': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
settings: {
|
|
...state.settings,
|
|
language: navigator.language
|
|
}
|
|
}
|
|
},
|
|
'8': (state: RootState) => {
|
|
const fixAssistantName = (assistant: Assistant) => {
|
|
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
|
|
}
|
|
|
|
return {
|
|
...state,
|
|
assistants: {
|
|
...state.assistants,
|
|
defaultAssistant: fixAssistantName(state.assistants.defaultAssistant),
|
|
assistants: state.assistants.assistants.map((assistant) => fixAssistantName(assistant))
|
|
}
|
|
}
|
|
},
|
|
'9': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: state.llm.providers.map((provider) => {
|
|
if (provider.id === 'zhipu' && provider.models[0] && provider.models[0].id === 'llama3-70b-8192') {
|
|
provider.models = SYSTEM_MODELS.zhipu
|
|
}
|
|
return provider
|
|
})
|
|
}
|
|
}
|
|
},
|
|
'10': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: [
|
|
...state.llm.providers,
|
|
{
|
|
id: 'baichuan',
|
|
name: 'BAICHUAN AI',
|
|
apiKey: '',
|
|
apiHost: 'https://api.baichuan-ai.com',
|
|
models: SYSTEM_MODELS.baichuan,
|
|
isSystem: true,
|
|
enabled: false
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'11': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: [
|
|
...state.llm.providers,
|
|
{
|
|
id: 'dashscope',
|
|
name: 'DashScope',
|
|
apiKey: '',
|
|
apiHost: 'https://dashscope.aliyuncs.com/compatible-mode/v1/',
|
|
models: SYSTEM_MODELS.bailian,
|
|
isSystem: true,
|
|
enabled: false
|
|
},
|
|
{
|
|
id: 'anthropic',
|
|
name: 'Anthropic',
|
|
apiKey: '',
|
|
apiHost: 'https://api.anthropic.com/',
|
|
models: SYSTEM_MODELS.anthropic,
|
|
isSystem: true,
|
|
enabled: false
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'12': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: [
|
|
...state.llm.providers,
|
|
{
|
|
id: 'aihubmix',
|
|
name: 'AiHubMix',
|
|
apiKey: '',
|
|
apiHost: 'https://aihubmix.com',
|
|
models: SYSTEM_MODELS.aihubmix,
|
|
isSystem: true,
|
|
enabled: false
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'13': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
assistants: {
|
|
...state.assistants,
|
|
defaultAssistant: {
|
|
...state.assistants.defaultAssistant,
|
|
name: ['Default Assistant', '默认助手'].includes(state.assistants.defaultAssistant.name)
|
|
? i18n.t(`assistant.default.name`)
|
|
: state.assistants.defaultAssistant.name
|
|
}
|
|
}
|
|
}
|
|
},
|
|
'14': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
settings: {
|
|
...state.settings,
|
|
showAssistants: true,
|
|
proxyUrl: undefined
|
|
}
|
|
}
|
|
},
|
|
'15': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
settings: {
|
|
...state.settings,
|
|
userName: '',
|
|
showMessageDivider: true
|
|
}
|
|
}
|
|
},
|
|
'16': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
settings: {
|
|
...state.settings,
|
|
messageFont: 'system',
|
|
showInputEstimatedTokens: false
|
|
}
|
|
}
|
|
},
|
|
'17': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
settings: {
|
|
...state.settings,
|
|
theme: 'auto'
|
|
}
|
|
}
|
|
},
|
|
'19': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
agents: {
|
|
agents: []
|
|
},
|
|
llm: {
|
|
...state.llm,
|
|
settings: {
|
|
ollama: {
|
|
keepAliveTime: 5
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
'20': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
settings: {
|
|
...state.settings,
|
|
fontSize: 14
|
|
}
|
|
}
|
|
},
|
|
'21': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: [
|
|
...state.llm.providers,
|
|
{
|
|
id: 'gemini',
|
|
name: 'Gemini',
|
|
apiKey: '',
|
|
apiHost: 'https://generativelanguage.googleapis.com',
|
|
models: SYSTEM_MODELS.gemini,
|
|
isSystem: true,
|
|
enabled: false
|
|
},
|
|
{
|
|
id: 'stepfun',
|
|
name: 'StepFun',
|
|
apiKey: '',
|
|
apiHost: 'https://api.stepfun.com',
|
|
models: SYSTEM_MODELS.stepfun,
|
|
isSystem: true,
|
|
enabled: false
|
|
},
|
|
{
|
|
id: 'doubao',
|
|
name: 'doubao',
|
|
apiKey: '',
|
|
apiHost: 'https://ark.cn-beijing.volces.com/api/v3/',
|
|
models: SYSTEM_MODELS.doubao,
|
|
isSystem: true,
|
|
enabled: false
|
|
},
|
|
{
|
|
id: 'graphrag-kylin-mountain',
|
|
name: 'GraphRAG',
|
|
apiKey: '',
|
|
apiHost: '',
|
|
models: [],
|
|
isSystem: true,
|
|
enabled: false
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'22': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: [
|
|
...state.llm.providers,
|
|
{
|
|
id: 'minimax',
|
|
name: 'MiniMax',
|
|
apiKey: '',
|
|
apiHost: 'https://api.minimax.chat/v1/',
|
|
models: SYSTEM_MODELS.minimax,
|
|
isSystem: true,
|
|
enabled: false
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'23': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
settings: {
|
|
...state.settings,
|
|
showTopics: true,
|
|
windowStyle: 'transparent'
|
|
}
|
|
}
|
|
},
|
|
'24': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
assistants: {
|
|
...state.assistants,
|
|
assistants: state.assistants.assistants.map((assistant) => ({
|
|
...assistant,
|
|
topics: assistant.topics.map((topic) => ({
|
|
...topic,
|
|
createdAt: new Date().toISOString(),
|
|
updatedAt: new Date().toISOString()
|
|
}))
|
|
}))
|
|
},
|
|
settings: {
|
|
...state.settings,
|
|
topicPosition: 'right'
|
|
}
|
|
}
|
|
},
|
|
'25': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: [
|
|
...state.llm.providers,
|
|
{
|
|
id: 'github',
|
|
name: 'Github Models',
|
|
apiKey: '',
|
|
apiHost: 'https://models.inference.ai.azure.com/',
|
|
models: SYSTEM_MODELS.github,
|
|
isSystem: true,
|
|
enabled: false
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'26': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: [
|
|
...state.llm.providers,
|
|
{
|
|
id: 'ocoolai',
|
|
name: 'ocoolAI',
|
|
apiKey: '',
|
|
apiHost: 'https://one.ooo.cool',
|
|
models: [],
|
|
isSystem: true,
|
|
enabled: false
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'27': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
settings: {
|
|
...state.settings,
|
|
renderInputMessageAsMarkdown: true
|
|
}
|
|
}
|
|
},
|
|
'28': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: [
|
|
...state.llm.providers,
|
|
{
|
|
id: 'together',
|
|
name: 'Together',
|
|
apiKey: '',
|
|
apiHost: 'https://api.together.xyz',
|
|
models: SYSTEM_MODELS.together,
|
|
isSystem: true,
|
|
enabled: false
|
|
},
|
|
{
|
|
id: 'fireworks',
|
|
name: 'Fireworks',
|
|
apiKey: '',
|
|
apiHost: 'https://api.fireworks.ai/inference',
|
|
models: SYSTEM_MODELS.fireworks,
|
|
isSystem: true,
|
|
enabled: false
|
|
},
|
|
{
|
|
id: 'zhinao',
|
|
name: 'zhinao',
|
|
apiKey: '',
|
|
apiHost: 'https://api.360.cn',
|
|
models: SYSTEM_MODELS.zhinao,
|
|
isSystem: true,
|
|
enabled: false
|
|
},
|
|
{
|
|
id: 'hunyuan',
|
|
name: 'hunyuan',
|
|
apiKey: '',
|
|
apiHost: 'https://api.hunyuan.cloud.tencent.com',
|
|
models: SYSTEM_MODELS.hunyuan,
|
|
isSystem: true,
|
|
enabled: false
|
|
},
|
|
{
|
|
id: 'nvidia',
|
|
name: 'Nvidia',
|
|
apiKey: '',
|
|
apiHost: 'https://integrate.api.nvidia.com',
|
|
models: SYSTEM_MODELS.nvidia,
|
|
isSystem: true,
|
|
enabled: false
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'29': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
assistants: {
|
|
...state.assistants,
|
|
assistants: state.assistants.assistants.map((assistant) => {
|
|
assistant.topics = assistant.topics.map((topic) => ({
|
|
...topic,
|
|
assistantId: assistant.id
|
|
}))
|
|
return assistant
|
|
})
|
|
}
|
|
}
|
|
},
|
|
'30': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: [
|
|
...state.llm.providers,
|
|
{
|
|
id: 'azure-openai',
|
|
name: 'Azure OpenAI',
|
|
apiKey: '',
|
|
apiHost: '',
|
|
apiVersion: '',
|
|
models: SYSTEM_MODELS['azure-openai'],
|
|
isSystem: true,
|
|
enabled: false
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'31': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: state.llm.providers.map((provider) => {
|
|
if (provider.id === 'azure-openai') {
|
|
provider.models = provider.models.map((model) => ({ ...model, provider: 'azure-openai' }))
|
|
}
|
|
return provider
|
|
})
|
|
}
|
|
}
|
|
},
|
|
'32': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: [
|
|
...state.llm.providers,
|
|
{
|
|
id: 'hunyuan',
|
|
name: 'Hunyuan',
|
|
apiKey: '',
|
|
apiHost: 'https://api.hunyuan.cloud.tencent.com',
|
|
models: SYSTEM_MODELS.hunyuan,
|
|
isSystem: true,
|
|
enabled: false
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'33': (state: RootState) => {
|
|
state.assistants.defaultAssistant.type = 'assistant'
|
|
|
|
state.agents.agents.forEach((agent) => {
|
|
agent.type = 'agent'
|
|
// @ts-ignore eslint-disable-next-line
|
|
delete agent.group
|
|
})
|
|
|
|
return {
|
|
...state,
|
|
assistants: {
|
|
...state.assistants,
|
|
assistants: [...state.assistants.assistants].map((assistant) => {
|
|
// @ts-ignore eslint-disable-next-line
|
|
delete assistant.group
|
|
return {
|
|
...assistant,
|
|
id: assistant.id.length === 36 ? assistant.id : uuid(),
|
|
type: assistant.type === 'system' ? assistant.type : 'assistant'
|
|
}
|
|
})
|
|
}
|
|
}
|
|
},
|
|
'34': (state: RootState) => {
|
|
state.assistants.assistants.forEach((assistant) => {
|
|
assistant.topics.forEach((topic) => {
|
|
topic.assistantId = assistant.id
|
|
runAsyncFunction(async () => {
|
|
const _topic = await db.topics.get(topic.id)
|
|
if (_topic) {
|
|
const messages = (_topic?.messages || []).map((message) => ({ ...message, assistantId: assistant.id }))
|
|
db.topics.put({ ..._topic, messages }, topic.id)
|
|
}
|
|
})
|
|
})
|
|
})
|
|
return state
|
|
},
|
|
'35': (state: RootState) => {
|
|
state.settings.mathEngine = 'KaTeX'
|
|
return state
|
|
},
|
|
'36': (state: RootState) => {
|
|
state.settings.topicPosition = 'left'
|
|
return state
|
|
},
|
|
'37': (state: RootState) => {
|
|
state.settings.messageStyle = 'plain'
|
|
return state
|
|
},
|
|
'38': (state: RootState) => {
|
|
return {
|
|
...state,
|
|
llm: {
|
|
...state.llm,
|
|
providers: [
|
|
...state.llm.providers,
|
|
{
|
|
id: 'grok',
|
|
name: 'Grok',
|
|
apiKey: '',
|
|
apiHost: 'https://api.x.ai',
|
|
models: SYSTEM_MODELS.grok,
|
|
isSystem: true,
|
|
enabled: false
|
|
},
|
|
{
|
|
id: 'hyperbolic',
|
|
name: 'Hyperbolic',
|
|
apiKey: '',
|
|
apiHost: 'https://api.hyperbolic.xyz',
|
|
models: SYSTEM_MODELS.hyperbolic,
|
|
isSystem: true,
|
|
enabled: false
|
|
},
|
|
{
|
|
id: 'mistral',
|
|
name: 'Mistral',
|
|
apiKey: '',
|
|
apiHost: 'https://api.mistral.ai',
|
|
models: SYSTEM_MODELS.mistral,
|
|
isSystem: true,
|
|
enabled: false
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'39': (state: RootState) => {
|
|
state.settings.codeStyle = 'auto'
|
|
return state
|
|
},
|
|
'40': (state: RootState) => {
|
|
state.settings.tray = true
|
|
return state
|
|
},
|
|
'41': (state: RootState) => {
|
|
state.llm.providers.forEach((provider) => {
|
|
if (provider.id === 'gemini') {
|
|
provider.type = 'gemini'
|
|
} else if (provider.id === 'anthropic') {
|
|
provider.type = 'anthropic'
|
|
} else {
|
|
provider.type = 'openai'
|
|
}
|
|
})
|
|
return state
|
|
},
|
|
'42': (state: RootState) => {
|
|
state.settings.proxyMode = state.settings.proxyUrl ? 'custom' : 'none'
|
|
return state
|
|
},
|
|
'43': (state: RootState) => {
|
|
if (state.settings.proxyMode === 'none') {
|
|
state.settings.proxyMode = 'system'
|
|
}
|
|
return state
|
|
},
|
|
'44': (state: RootState) => {
|
|
state.settings.translateModelPrompt = TRANSLATE_PROMPT
|
|
return state
|
|
},
|
|
'45': (state: RootState) => {
|
|
state.settings.enableTopicNaming = true
|
|
return state
|
|
},
|
|
'46': (state: RootState) => {
|
|
if (
|
|
state.settings?.translateModelPrompt?.includes(
|
|
'If the target language is the same as the source language, do not translate'
|
|
)
|
|
) {
|
|
state.settings.translateModelPrompt = TRANSLATE_PROMPT
|
|
}
|
|
return state
|
|
},
|
|
'47': (state: RootState) => {
|
|
state.llm.providers.forEach((provider) => {
|
|
provider.models.forEach((model) => {
|
|
model.group = getDefaultGroupName(model.id)
|
|
})
|
|
})
|
|
return state
|
|
},
|
|
'48': (state: RootState) => {
|
|
if (state.shortcuts) {
|
|
state.shortcuts.shortcuts.forEach((shortcut) => {
|
|
shortcut.system = shortcut.key !== 'new_topic'
|
|
})
|
|
state.shortcuts.shortcuts.push({
|
|
key: 'toggle_show_assistants',
|
|
shortcut: [isMac ? 'Command' : 'Ctrl', '['],
|
|
editable: true,
|
|
enabled: true,
|
|
system: false
|
|
})
|
|
state.shortcuts.shortcuts.push({
|
|
key: 'toggle_show_topics',
|
|
shortcut: [isMac ? 'Command' : 'Ctrl', ']'],
|
|
editable: true,
|
|
enabled: true,
|
|
system: false
|
|
})
|
|
}
|
|
return state
|
|
},
|
|
'49': (state: RootState) => {
|
|
state.settings.showMinappIcon = true
|
|
state.settings.showFilesIcon = true
|
|
state.settings.pasteLongTextThreshold = 1500
|
|
if (state.shortcuts) {
|
|
state.shortcuts.shortcuts = [
|
|
...state.shortcuts.shortcuts,
|
|
{
|
|
key: 'copy_last_message',
|
|
shortcut: [isMac ? 'Command' : 'Ctrl', 'Shift', 'C'],
|
|
editable: true,
|
|
enabled: false,
|
|
system: false
|
|
}
|
|
]
|
|
}
|
|
return state
|
|
},
|
|
'50': (state: RootState) => {
|
|
state.llm.providers.push({
|
|
id: 'jina',
|
|
name: 'Jina',
|
|
type: 'openai',
|
|
apiKey: '',
|
|
apiHost: 'https://api.jina.ai',
|
|
models: SYSTEM_MODELS.jina,
|
|
isSystem: true,
|
|
enabled: false
|
|
})
|
|
return state
|
|
},
|
|
'51': (state: RootState) => {
|
|
state.settings.topicNamingPrompt = ''
|
|
return state
|
|
},
|
|
'52': (state: RootState) => {
|
|
if (state.shortcuts) {
|
|
state.shortcuts.shortcuts.push({
|
|
key: 'search_message',
|
|
shortcut: [isMac ? 'Command' : 'Ctrl', 'F'],
|
|
editable: true,
|
|
enabled: true,
|
|
system: false
|
|
})
|
|
}
|
|
state.settings.showTranslateIcon = true
|
|
state.settings.showPaintingIcon = true
|
|
state.settings.showKnowledgeIcon = true
|
|
return state
|
|
}
|
|
}
|
|
|
|
const migrate = createMigrate(migrateConfig as any)
|
|
|
|
export default migrate
|