diff --git a/src/renderer/src/assets/images/providers/aihubmix.jpg b/src/renderer/src/assets/images/providers/aihubmix.jpg new file mode 100644 index 0000000000..65dbbd5a1a Binary files /dev/null and b/src/renderer/src/assets/images/providers/aihubmix.jpg differ diff --git a/src/renderer/src/assets/images/providers/baichuan.png b/src/renderer/src/assets/images/providers/baichuan.png index 3a23c99b16..f051284729 100644 Binary files a/src/renderer/src/assets/images/providers/baichuan.png and b/src/renderer/src/assets/images/providers/baichuan.png differ diff --git a/src/renderer/src/config/models.ts b/src/renderer/src/config/models.ts index e9ade2e435..e807bc2d1b 100644 --- a/src/renderer/src/config/models.ts +++ b/src/renderer/src/config/models.ts @@ -320,6 +320,22 @@ export const SYSTEM_MODELS: Record = { enabled: true } ], + aihubmix: [ + { + id: 'gpt-4o-mini', + provider: 'aihubmix', + name: 'GPT-4o Mini', + group: 'GPT-4o', + enabled: true + }, + { + id: 'aihubmix-Llama-3-70B-Instruct', + provider: 'aihubmix', + name: 'Llama 3 70B Instruct', + group: 'Llama3', + enabled: true + } + ], openrouter: [ { id: 'google/gemma-2-9b-it:free', diff --git a/src/renderer/src/config/provider.ts b/src/renderer/src/config/provider.ts index 8d2bdf28a7..2044475989 100644 --- a/src/renderer/src/config/provider.ts +++ b/src/renderer/src/config/provider.ts @@ -10,6 +10,7 @@ import OpenRouterProviderLogo from '@renderer/assets/images/providers/openrouter import BaichuanProviderLogo from '@renderer/assets/images/providers/baichuan.png' import DashScopeProviderLogo from '@renderer/assets/images/providers/dashscope.png' import AnthropicProviderLogo from '@renderer/assets/images/providers/anthropic.jpeg' +import AiHubMixProviderLogo from '@renderer/assets/images/providers/aihubmix.jpg' import ChatGPTModelLogo from '@renderer/assets/images/models/chatgpt.jpeg' import ChatGLMModelLogo from '@renderer/assets/images/models/chatglm.jpeg' import DeepSeekModelLogo from '@renderer/assets/images/models/deepseek.png' @@ -49,6 +50,8 @@ export function getProviderLogo(providerId: string) { return DashScopeProviderLogo case 'anthropic': return AnthropicProviderLogo + case 'aihubmix': + return AiHubMixProviderLogo default: return undefined } @@ -175,5 +178,13 @@ export const PROVIDER_CONFIG = { docs: 'https://docs.anthropic.com/en/docs', models: 'https://docs.anthropic.com/en/docs/about-claude/models' } + }, + aihubmix: { + websites: { + official: 'https://aihubmix.com/', + apiKey: 'https://aihubmix.com/token', + docs: 'https://doc.aihubmix.com/', + models: 'https://aihubmix.com/models' + } } } diff --git a/src/renderer/src/i18n/index.ts b/src/renderer/src/i18n/index.ts index 2853de2663..9e31694a6e 100644 --- a/src/renderer/src/i18n/index.ts +++ b/src/renderer/src/i18n/index.ts @@ -81,7 +81,8 @@ const resources = { ollama: 'Ollama', baichuan: 'Baichuan', dashscope: 'DashScope', - anthropic: 'Anthropic' + anthropic: 'Anthropic', + aihubmix: 'AiHubMix' }, settings: { title: 'Settings', @@ -202,7 +203,8 @@ const resources = { ollama: 'Ollama', baichuan: '百川', dashscope: '阿里云灵积', - anthropic: 'Anthropic' + anthropic: 'Anthropic', + aihubmix: 'AiHubMix' }, settings: { title: '设置', diff --git a/src/renderer/src/pages/settings/ProviderSettings.tsx b/src/renderer/src/pages/settings/ProviderSettings.tsx index 7f3138d085..be309aaccf 100644 --- a/src/renderer/src/pages/settings/ProviderSettings.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings.tsx @@ -100,11 +100,11 @@ const ProviderSettings: FC = () => { key={JSON.stringify(provider)} className={provider.id === selectedProvider?.id ? 'active' : ''} onClick={() => setSelectedProvider(provider)}> - {provider.isSystem && } + {provider.isSystem && } {!provider.isSystem && ( + size={28} + style={{ backgroundColor: generateColorFromChar(provider.name), minWidth: 28 }}> {getFirstCharacter(provider.name)} )} @@ -151,7 +151,7 @@ const ProviderListContainer = styled.div` width: var(--assistants-width); height: calc(100vh - var(--navbar-height)); border-right: 0.5px solid var(--color-border); - padding: 10px; + padding: 10px 8px; overflow-y: auto; ` @@ -165,7 +165,7 @@ const ProviderListItem = styled.div` display: flex; flex-direction: row; align-items: center; - padding: 6px 10px; + padding: 5px 8px; margin-bottom: 5px; width: 100%; cursor: pointer; diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts index 7e14d4298c..aee0464015 100644 --- a/src/renderer/src/store/index.ts +++ b/src/renderer/src/store/index.ts @@ -19,7 +19,7 @@ const persistedReducer = persistReducer( { key: 'cherry-studio', storage, - version: 11, + version: 12, blacklist: ['runtime'], migrate }, diff --git a/src/renderer/src/store/llm.ts b/src/renderer/src/store/llm.ts index 166695fea3..f745f47345 100644 --- a/src/renderer/src/store/llm.ts +++ b/src/renderer/src/store/llm.ts @@ -94,6 +94,15 @@ const initialState: LlmState = { isSystem: true, enabled: false }, + { + id: 'aihubmix', + name: 'AiHubMix', + apiKey: '', + apiHost: 'https://aihubmix.com', + models: SYSTEM_MODELS.aihubmix.filter((m) => m.enabled), + isSystem: true, + enabled: false + }, { id: 'openrouter', name: 'OpenRouter', diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index f2aed1e3e2..0d51eee2cd 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -207,6 +207,27 @@ const migrate = createMigrate({ ] } } + }, + // @ts-ignore store type is unknown + '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.filter((m) => m.enabled), + isSystem: true, + enabled: false + } + ] + } + } } })