feat: add minimax provider

This commit is contained in:
kangfenmao 2024-08-18 18:06:21 +08:00
parent 8b38ebcac4
commit 4a26f7ce78
13 changed files with 126 additions and 43 deletions

View File

@ -56,6 +56,4 @@ electronDownload:
afterSign: scripts/notarize.js
releaseInfo:
releaseNotes: |
增加 Gemini、豆包、阶跃星辰等服务商支持
修复 Anthropic 回复问题
新的 Windows, Linux 侧边栏样式
添加 MiniMax 服务商

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@ -353,6 +353,36 @@ export const SYSTEM_MODELS: Record<string, SystemModel[]> = {
}
],
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: [
{
id: 'gpt-4o-mini',

View File

@ -7,6 +7,7 @@ import DoubaoModelLogo from '@renderer/assets/images/models/doubao.png'
import EmbeddingModelLogo from '@renderer/assets/images/models/embedding.png'
import GeminiModelLogo from '@renderer/assets/images/models/gemini.png'
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 MicrosoftModelLogo from '@renderer/assets/images/models/microsoft.png'
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 GraphRagProviderLogo from '@renderer/assets/images/providers/graph-rag.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 MoonshotModelLogo from '@renderer/assets/images/providers/moonshot.jpeg'
import OllamaProviderLogo from '@renderer/assets/images/providers/ollama.png'
@ -69,6 +71,8 @@ export function getProviderLogo(providerId: string) {
return DoubaoProviderLogo
case 'graphrag-kylin-mountain':
return GraphRagProviderLogo
case 'minimax':
return MinimaxProviderLogo
default:
return undefined
}
@ -98,6 +102,7 @@ export function getModelLogo(modelId: string) {
bison: PalmModelLogo,
palm: PalmModelLogo,
step: StepModelLogo,
abab: HailuoModelLogo,
'ep-202': DoubaoModelLogo
}
@ -243,6 +248,18 @@ export const PROVIDER_CONFIG = {
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': {
api: {
url: '',

View File

@ -121,6 +121,7 @@ const resources = {
aihubmix: 'AiHubMix',
stepfun: 'StepFun',
doubao: 'Doubao',
minimax: 'MiniMax',
'graphrag-kylin-mountain': 'GraphRAG'
},
settings: {
@ -346,6 +347,7 @@ const resources = {
aihubmix: 'AiHubMix',
stepfun: '阶跃星辰',
doubao: '豆包',
minimax: 'MiniMax',
'graphrag-kylin-mountain': 'GraphRAG'
},
settings: {

View File

@ -2,7 +2,7 @@ import { getModelLogo } from '@renderer/config/provider'
import { useProviders } from '@renderer/hooks/useProvider'
import { Model } from '@renderer/types'
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 { useTranslation } from 'react-i18next'
import styled from 'styled-components'
@ -22,7 +22,7 @@ const SelectModelDropdown: FC<Props & PropsWithChildren> = ({ children, model, o
key: p.id,
label: p.isSystem ? t(`provider.${p.id}`) : p.name,
type: 'group',
children: sortBy(p.models, 'name').map((m) => ({
children: reverse(sortBy(p.models, 'name')).map((m) => ({
key: m?.id,
label: upperFirst(m?.name),
defaultSelectedKeys: [model?.id],

View File

@ -4,8 +4,7 @@ import { FC, useState } from 'react'
import { useTranslation } from 'react-i18next'
import styled from 'styled-components'
import { SettingSubtitle } from '..'
import { HelpText, HelpTextRow } from '../ProviderSettings/ProviderSetting'
import { SettingHelpText, SettingHelpTextRow, SettingSubtitle } from '..'
const OllamSettings: FC = () => {
const { keepAliveTime, setKeepAliveTime } = useOllamaSettings()
@ -23,9 +22,9 @@ const OllamSettings: FC = () => {
suffix={t('ollama.keep_alive_time.placeholder')}
step={5}
/>
<HelpTextRow>
<HelpText>{t('ollama.keep_alive_time.description')}</HelpText>
</HelpTextRow>
<SettingHelpTextRow>
<SettingHelpText>{t('ollama.keep_alive_time.description')}</SettingHelpText>
</SettingHelpTextRow>
</Container>
)
}

View File

@ -19,7 +19,14 @@ import { FC, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import styled from 'styled-components'
import { SettingContainer, SettingSubtitle, SettingTitle } from '..'
import {
SettingContainer,
SettingHelpLink,
SettingHelpText,
SettingHelpTextRow,
SettingSubtitle,
SettingTitle
} from '..'
import AddModelPopup from './AddModelPopup'
import EditModelsPopup from './EditModelsPopup'
import GraphRAGSettings from './GraphRAGSettings'
@ -111,11 +118,11 @@ const ProviderSetting: FC<Props> = ({ provider: _provider }) => {
</Button>
</Space.Compact>
{apiKeyWebsite && (
<HelpTextRow>
<HelpLink target="_blank" href={apiKeyWebsite}>
<SettingHelpTextRow>
<SettingHelpLink target="_blank" href={apiKeyWebsite}>
{t('settings.provider.get_api_key')}
</HelpLink>
</HelpTextRow>
</SettingHelpLink>
</SettingHelpTextRow>
)}
<SettingSubtitle>{t('settings.provider.api_host')}</SettingSubtitle>
<Space.Compact style={{ width: '100%', marginTop: 5 }}>
@ -149,18 +156,18 @@ const ProviderSetting: FC<Props> = ({ provider: _provider }) => {
</Card>
))}
{docsWebsite && (
<HelpTextRow>
<HelpText>{t('settings.provider.docs_check')} </HelpText>
<HelpLink target="_blank" href={docsWebsite}>
<SettingHelpTextRow>
<SettingHelpText>{t('settings.provider.docs_check')} </SettingHelpText>
<SettingHelpLink target="_blank" href={docsWebsite}>
{t(`provider.${provider.id}`) + ' '}
{t('common.docs')}
</HelpLink>
<HelpText>{t('common.and')}</HelpText>
<HelpLink target="_blank" href={modelsWebsite}>
</SettingHelpLink>
<SettingHelpText>{t('common.and')}</SettingHelpText>
<SettingHelpLink target="_blank" href={modelsWebsite}>
{t('common.models')}
</HelpLink>
<HelpText>{t('settings.provider.docs_more_details')}</HelpText>
</HelpTextRow>
</SettingHelpLink>
<SettingHelpText>{t('settings.provider.docs_more_details')}</SettingHelpText>
</SettingHelpTextRow>
)}
<Flex gap={10} style={{ marginTop: '10px' }}>
<Button type="primary" onClick={onManageModel} icon={<EditOutlined />}>
@ -188,24 +195,6 @@ const ModelListHeader = styled.div`
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)`
font-size: 18px;
margin-left: 10px;

View File

@ -1,4 +1,5 @@
import { Divider } from 'antd'
import Link from 'antd/es/typography/Link'
import styled from 'styled-components'
import SettingsPage from './SettingsPage'
@ -51,4 +52,22 @@ export const SettingRowTitle = styled.div`
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

View File

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

View File

@ -121,6 +121,15 @@ const initialState: LlmState = {
isSystem: true,
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',
name: 'AiHubMix',

View File

@ -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
}
]
}
}
}
}