mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-11 16:39:15 +08:00
feat: add minimax provider
This commit is contained in:
parent
8b38ebcac4
commit
4a26f7ce78
@ -56,6 +56,4 @@ electronDownload:
|
|||||||
afterSign: scripts/notarize.js
|
afterSign: scripts/notarize.js
|
||||||
releaseInfo:
|
releaseInfo:
|
||||||
releaseNotes: |
|
releaseNotes: |
|
||||||
增加 Gemini、豆包、阶跃星辰等服务商支持
|
添加 MiniMax 服务商
|
||||||
修复 Anthropic 回复问题
|
|
||||||
新的 Windows, Linux 侧边栏样式
|
|
||||||
|
|||||||
BIN
src/renderer/src/assets/images/models/hailuo.png
Normal file
BIN
src/renderer/src/assets/images/models/hailuo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
BIN
src/renderer/src/assets/images/providers/minimax.png
Normal file
BIN
src/renderer/src/assets/images/providers/minimax.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.5 KiB |
@ -353,6 +353,36 @@ export const SYSTEM_MODELS: Record<string, SystemModel[]> = {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
doubao: [],
|
doubao: [],
|
||||||
|
minimax: [
|
||||||
|
{
|
||||||
|
id: 'abab6.5s-chat',
|
||||||
|
provider: 'minimax',
|
||||||
|
name: 'abab6.5s',
|
||||||
|
group: 'abab6',
|
||||||
|
enabled: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'abab6.5g-chat',
|
||||||
|
provider: 'minimax',
|
||||||
|
name: 'abab6.5g',
|
||||||
|
group: 'abab6',
|
||||||
|
enabled: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'abab6.5t-chat',
|
||||||
|
provider: 'minimax',
|
||||||
|
name: 'abab6.5t',
|
||||||
|
group: 'abab6',
|
||||||
|
enabled: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'abab5.5s-chat',
|
||||||
|
provider: 'minimax',
|
||||||
|
name: 'abab5.5s',
|
||||||
|
group: 'abab5',
|
||||||
|
enabled: true
|
||||||
|
}
|
||||||
|
],
|
||||||
aihubmix: [
|
aihubmix: [
|
||||||
{
|
{
|
||||||
id: 'gpt-4o-mini',
|
id: 'gpt-4o-mini',
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import DoubaoModelLogo from '@renderer/assets/images/models/doubao.png'
|
|||||||
import EmbeddingModelLogo from '@renderer/assets/images/models/embedding.png'
|
import EmbeddingModelLogo from '@renderer/assets/images/models/embedding.png'
|
||||||
import GeminiModelLogo from '@renderer/assets/images/models/gemini.png'
|
import GeminiModelLogo from '@renderer/assets/images/models/gemini.png'
|
||||||
import GemmaModelLogo from '@renderer/assets/images/models/gemma.jpeg'
|
import GemmaModelLogo from '@renderer/assets/images/models/gemma.jpeg'
|
||||||
|
import HailuoModelLogo from '@renderer/assets/images/models/hailuo.png'
|
||||||
import LlamaModelLogo from '@renderer/assets/images/models/llama.jpeg'
|
import LlamaModelLogo from '@renderer/assets/images/models/llama.jpeg'
|
||||||
import MicrosoftModelLogo from '@renderer/assets/images/models/microsoft.png'
|
import MicrosoftModelLogo from '@renderer/assets/images/models/microsoft.png'
|
||||||
import MixtralModelLogo from '@renderer/assets/images/models/mixtral.jpeg'
|
import MixtralModelLogo from '@renderer/assets/images/models/mixtral.jpeg'
|
||||||
@ -23,6 +24,7 @@ import DoubaoProviderLogo from '@renderer/assets/images/providers/doubao.png'
|
|||||||
import GeminiProviderLogo from '@renderer/assets/images/providers/gemini.png'
|
import GeminiProviderLogo from '@renderer/assets/images/providers/gemini.png'
|
||||||
import GraphRagProviderLogo from '@renderer/assets/images/providers/graph-rag.png'
|
import GraphRagProviderLogo from '@renderer/assets/images/providers/graph-rag.png'
|
||||||
import GroqProviderLogo from '@renderer/assets/images/providers/groq.png'
|
import GroqProviderLogo from '@renderer/assets/images/providers/groq.png'
|
||||||
|
import MinimaxProviderLogo from '@renderer/assets/images/providers/minimax.png'
|
||||||
import MoonshotProviderLogo from '@renderer/assets/images/providers/moonshot.jpeg'
|
import MoonshotProviderLogo from '@renderer/assets/images/providers/moonshot.jpeg'
|
||||||
import MoonshotModelLogo from '@renderer/assets/images/providers/moonshot.jpeg'
|
import MoonshotModelLogo from '@renderer/assets/images/providers/moonshot.jpeg'
|
||||||
import OllamaProviderLogo from '@renderer/assets/images/providers/ollama.png'
|
import OllamaProviderLogo from '@renderer/assets/images/providers/ollama.png'
|
||||||
@ -69,6 +71,8 @@ export function getProviderLogo(providerId: string) {
|
|||||||
return DoubaoProviderLogo
|
return DoubaoProviderLogo
|
||||||
case 'graphrag-kylin-mountain':
|
case 'graphrag-kylin-mountain':
|
||||||
return GraphRagProviderLogo
|
return GraphRagProviderLogo
|
||||||
|
case 'minimax':
|
||||||
|
return MinimaxProviderLogo
|
||||||
default:
|
default:
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
@ -98,6 +102,7 @@ export function getModelLogo(modelId: string) {
|
|||||||
bison: PalmModelLogo,
|
bison: PalmModelLogo,
|
||||||
palm: PalmModelLogo,
|
palm: PalmModelLogo,
|
||||||
step: StepModelLogo,
|
step: StepModelLogo,
|
||||||
|
abab: HailuoModelLogo,
|
||||||
'ep-202': DoubaoModelLogo
|
'ep-202': DoubaoModelLogo
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,6 +248,18 @@ export const PROVIDER_CONFIG = {
|
|||||||
models: 'https://console.volcengine.com/ark/region:ark+cn-beijing/endpoint'
|
models: 'https://console.volcengine.com/ark/region:ark+cn-beijing/endpoint'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
minimax: {
|
||||||
|
api: {
|
||||||
|
url: 'https://api.minimax.chat/v1/',
|
||||||
|
editable: true
|
||||||
|
},
|
||||||
|
websites: {
|
||||||
|
official: 'https://platform.minimaxi.com/',
|
||||||
|
apiKey: 'https://platform.minimaxi.com/user-center/basic-information/interface-key',
|
||||||
|
docs: 'https://platform.minimaxi.com/document/Announcement',
|
||||||
|
models: 'https://platform.minimaxi.com/document/Models'
|
||||||
|
}
|
||||||
|
},
|
||||||
'graphrag-kylin-mountain': {
|
'graphrag-kylin-mountain': {
|
||||||
api: {
|
api: {
|
||||||
url: '',
|
url: '',
|
||||||
|
|||||||
@ -121,6 +121,7 @@ const resources = {
|
|||||||
aihubmix: 'AiHubMix',
|
aihubmix: 'AiHubMix',
|
||||||
stepfun: 'StepFun',
|
stepfun: 'StepFun',
|
||||||
doubao: 'Doubao',
|
doubao: 'Doubao',
|
||||||
|
minimax: 'MiniMax',
|
||||||
'graphrag-kylin-mountain': 'GraphRAG'
|
'graphrag-kylin-mountain': 'GraphRAG'
|
||||||
},
|
},
|
||||||
settings: {
|
settings: {
|
||||||
@ -346,6 +347,7 @@ const resources = {
|
|||||||
aihubmix: 'AiHubMix',
|
aihubmix: 'AiHubMix',
|
||||||
stepfun: '阶跃星辰',
|
stepfun: '阶跃星辰',
|
||||||
doubao: '豆包',
|
doubao: '豆包',
|
||||||
|
minimax: 'MiniMax',
|
||||||
'graphrag-kylin-mountain': 'GraphRAG'
|
'graphrag-kylin-mountain': 'GraphRAG'
|
||||||
},
|
},
|
||||||
settings: {
|
settings: {
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import { getModelLogo } from '@renderer/config/provider'
|
|||||||
import { useProviders } from '@renderer/hooks/useProvider'
|
import { useProviders } from '@renderer/hooks/useProvider'
|
||||||
import { Model } from '@renderer/types'
|
import { Model } from '@renderer/types'
|
||||||
import { Avatar, Dropdown, DropdownProps, MenuProps } from 'antd'
|
import { Avatar, Dropdown, DropdownProps, MenuProps } from 'antd'
|
||||||
import { first, sortBy, upperFirst } from 'lodash'
|
import { first, reverse, sortBy, upperFirst } from 'lodash'
|
||||||
import { FC, PropsWithChildren } from 'react'
|
import { FC, PropsWithChildren } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import styled from 'styled-components'
|
import styled from 'styled-components'
|
||||||
@ -22,7 +22,7 @@ const SelectModelDropdown: FC<Props & PropsWithChildren> = ({ children, model, o
|
|||||||
key: p.id,
|
key: p.id,
|
||||||
label: p.isSystem ? t(`provider.${p.id}`) : p.name,
|
label: p.isSystem ? t(`provider.${p.id}`) : p.name,
|
||||||
type: 'group',
|
type: 'group',
|
||||||
children: sortBy(p.models, 'name').map((m) => ({
|
children: reverse(sortBy(p.models, 'name')).map((m) => ({
|
||||||
key: m?.id,
|
key: m?.id,
|
||||||
label: upperFirst(m?.name),
|
label: upperFirst(m?.name),
|
||||||
defaultSelectedKeys: [model?.id],
|
defaultSelectedKeys: [model?.id],
|
||||||
|
|||||||
@ -4,8 +4,7 @@ import { FC, useState } from 'react'
|
|||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import styled from 'styled-components'
|
import styled from 'styled-components'
|
||||||
|
|
||||||
import { SettingSubtitle } from '..'
|
import { SettingHelpText, SettingHelpTextRow, SettingSubtitle } from '..'
|
||||||
import { HelpText, HelpTextRow } from '../ProviderSettings/ProviderSetting'
|
|
||||||
|
|
||||||
const OllamSettings: FC = () => {
|
const OllamSettings: FC = () => {
|
||||||
const { keepAliveTime, setKeepAliveTime } = useOllamaSettings()
|
const { keepAliveTime, setKeepAliveTime } = useOllamaSettings()
|
||||||
@ -23,9 +22,9 @@ const OllamSettings: FC = () => {
|
|||||||
suffix={t('ollama.keep_alive_time.placeholder')}
|
suffix={t('ollama.keep_alive_time.placeholder')}
|
||||||
step={5}
|
step={5}
|
||||||
/>
|
/>
|
||||||
<HelpTextRow>
|
<SettingHelpTextRow>
|
||||||
<HelpText>{t('ollama.keep_alive_time.description')}</HelpText>
|
<SettingHelpText>{t('ollama.keep_alive_time.description')}</SettingHelpText>
|
||||||
</HelpTextRow>
|
</SettingHelpTextRow>
|
||||||
</Container>
|
</Container>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,7 +19,14 @@ import { FC, useEffect, useState } from 'react'
|
|||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import styled from 'styled-components'
|
import styled from 'styled-components'
|
||||||
|
|
||||||
import { SettingContainer, SettingSubtitle, SettingTitle } from '..'
|
import {
|
||||||
|
SettingContainer,
|
||||||
|
SettingHelpLink,
|
||||||
|
SettingHelpText,
|
||||||
|
SettingHelpTextRow,
|
||||||
|
SettingSubtitle,
|
||||||
|
SettingTitle
|
||||||
|
} from '..'
|
||||||
import AddModelPopup from './AddModelPopup'
|
import AddModelPopup from './AddModelPopup'
|
||||||
import EditModelsPopup from './EditModelsPopup'
|
import EditModelsPopup from './EditModelsPopup'
|
||||||
import GraphRAGSettings from './GraphRAGSettings'
|
import GraphRAGSettings from './GraphRAGSettings'
|
||||||
@ -111,11 +118,11 @@ const ProviderSetting: FC<Props> = ({ provider: _provider }) => {
|
|||||||
</Button>
|
</Button>
|
||||||
</Space.Compact>
|
</Space.Compact>
|
||||||
{apiKeyWebsite && (
|
{apiKeyWebsite && (
|
||||||
<HelpTextRow>
|
<SettingHelpTextRow>
|
||||||
<HelpLink target="_blank" href={apiKeyWebsite}>
|
<SettingHelpLink target="_blank" href={apiKeyWebsite}>
|
||||||
{t('settings.provider.get_api_key')}
|
{t('settings.provider.get_api_key')}
|
||||||
</HelpLink>
|
</SettingHelpLink>
|
||||||
</HelpTextRow>
|
</SettingHelpTextRow>
|
||||||
)}
|
)}
|
||||||
<SettingSubtitle>{t('settings.provider.api_host')}</SettingSubtitle>
|
<SettingSubtitle>{t('settings.provider.api_host')}</SettingSubtitle>
|
||||||
<Space.Compact style={{ width: '100%', marginTop: 5 }}>
|
<Space.Compact style={{ width: '100%', marginTop: 5 }}>
|
||||||
@ -149,18 +156,18 @@ const ProviderSetting: FC<Props> = ({ provider: _provider }) => {
|
|||||||
</Card>
|
</Card>
|
||||||
))}
|
))}
|
||||||
{docsWebsite && (
|
{docsWebsite && (
|
||||||
<HelpTextRow>
|
<SettingHelpTextRow>
|
||||||
<HelpText>{t('settings.provider.docs_check')} </HelpText>
|
<SettingHelpText>{t('settings.provider.docs_check')} </SettingHelpText>
|
||||||
<HelpLink target="_blank" href={docsWebsite}>
|
<SettingHelpLink target="_blank" href={docsWebsite}>
|
||||||
{t(`provider.${provider.id}`) + ' '}
|
{t(`provider.${provider.id}`) + ' '}
|
||||||
{t('common.docs')}
|
{t('common.docs')}
|
||||||
</HelpLink>
|
</SettingHelpLink>
|
||||||
<HelpText>{t('common.and')}</HelpText>
|
<SettingHelpText>{t('common.and')}</SettingHelpText>
|
||||||
<HelpLink target="_blank" href={modelsWebsite}>
|
<SettingHelpLink target="_blank" href={modelsWebsite}>
|
||||||
{t('common.models')}
|
{t('common.models')}
|
||||||
</HelpLink>
|
</SettingHelpLink>
|
||||||
<HelpText>{t('settings.provider.docs_more_details')}</HelpText>
|
<SettingHelpText>{t('settings.provider.docs_more_details')}</SettingHelpText>
|
||||||
</HelpTextRow>
|
</SettingHelpTextRow>
|
||||||
)}
|
)}
|
||||||
<Flex gap={10} style={{ marginTop: '10px' }}>
|
<Flex gap={10} style={{ marginTop: '10px' }}>
|
||||||
<Button type="primary" onClick={onManageModel} icon={<EditOutlined />}>
|
<Button type="primary" onClick={onManageModel} icon={<EditOutlined />}>
|
||||||
@ -188,24 +195,6 @@ const ModelListHeader = styled.div`
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
`
|
`
|
||||||
|
|
||||||
export const HelpTextRow = styled.div`
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
padding: 5px 0;
|
|
||||||
`
|
|
||||||
|
|
||||||
export const HelpText = styled.div`
|
|
||||||
font-size: 11px;
|
|
||||||
color: var(--color-text);
|
|
||||||
opacity: 0.4;
|
|
||||||
`
|
|
||||||
|
|
||||||
const HelpLink = styled(Link)`
|
|
||||||
font-size: 11px;
|
|
||||||
padding: 0 5px;
|
|
||||||
`
|
|
||||||
|
|
||||||
const RemoveIcon = styled(MinusCircleOutlined)`
|
const RemoveIcon = styled(MinusCircleOutlined)`
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { Divider } from 'antd'
|
import { Divider } from 'antd'
|
||||||
|
import Link from 'antd/es/typography/Link'
|
||||||
import styled from 'styled-components'
|
import styled from 'styled-components'
|
||||||
|
|
||||||
import SettingsPage from './SettingsPage'
|
import SettingsPage from './SettingsPage'
|
||||||
@ -51,4 +52,22 @@ export const SettingRowTitle = styled.div`
|
|||||||
color: var(--color-text-1);
|
color: var(--color-text-1);
|
||||||
`
|
`
|
||||||
|
|
||||||
|
export const SettingHelpTextRow = styled.div`
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
padding: 5px 0;
|
||||||
|
`
|
||||||
|
|
||||||
|
export const SettingHelpText = styled.div`
|
||||||
|
font-size: 11px;
|
||||||
|
color: var(--color-text);
|
||||||
|
opacity: 0.4;
|
||||||
|
`
|
||||||
|
|
||||||
|
export const SettingHelpLink = styled(Link)`
|
||||||
|
font-size: 11px;
|
||||||
|
padding: 0 5px;
|
||||||
|
`
|
||||||
|
|
||||||
export default SettingsPage
|
export default SettingsPage
|
||||||
|
|||||||
@ -22,7 +22,7 @@ const persistedReducer = persistReducer(
|
|||||||
{
|
{
|
||||||
key: 'cherry-studio',
|
key: 'cherry-studio',
|
||||||
storage,
|
storage,
|
||||||
version: 21,
|
version: 22,
|
||||||
blacklist: ['runtime'],
|
blacklist: ['runtime'],
|
||||||
migrate
|
migrate
|
||||||
},
|
},
|
||||||
|
|||||||
@ -121,6 +121,15 @@ const initialState: LlmState = {
|
|||||||
isSystem: true,
|
isSystem: true,
|
||||||
enabled: false
|
enabled: false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'minimax',
|
||||||
|
name: 'MiniMax',
|
||||||
|
apiKey: '',
|
||||||
|
apiHost: 'https://api.minimax.chat/v1/',
|
||||||
|
models: SYSTEM_MODELS.minimax.filter((m) => m.enabled),
|
||||||
|
isSystem: true,
|
||||||
|
enabled: false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'aihubmix',
|
id: 'aihubmix',
|
||||||
name: 'AiHubMix',
|
name: 'AiHubMix',
|
||||||
|
|||||||
@ -343,6 +343,26 @@ const migrateConfig = {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
'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.filter((m) => m.enabled),
|
||||||
|
isSystem: true,
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user