diff --git a/src/renderer/src/assets/images/models/doubao.png b/src/renderer/src/assets/images/models/doubao.png new file mode 100644 index 0000000000..3e48e7071e Binary files /dev/null and b/src/renderer/src/assets/images/models/doubao.png differ diff --git a/src/renderer/src/assets/images/providers/doubao.png b/src/renderer/src/assets/images/providers/doubao.png new file mode 100644 index 0000000000..11fb4c6c29 Binary files /dev/null and b/src/renderer/src/assets/images/providers/doubao.png differ diff --git a/src/renderer/src/config/models.ts b/src/renderer/src/config/models.ts index 023632c72a..34ba19cf3e 100644 --- a/src/renderer/src/config/models.ts +++ b/src/renderer/src/config/models.ts @@ -352,6 +352,7 @@ export const SYSTEM_MODELS: Record = { enabled: true } ], + doubao: [], aihubmix: [ { id: 'gpt-4o-mini', diff --git a/src/renderer/src/config/provider.ts b/src/renderer/src/config/provider.ts index ac33db574b..7a5a298273 100644 --- a/src/renderer/src/config/provider.ts +++ b/src/renderer/src/config/provider.ts @@ -3,6 +3,7 @@ import ChatGLMModelLogo from '@renderer/assets/images/models/chatglm.jpeg' import ChatGPTModelLogo from '@renderer/assets/images/models/chatgpt.jpeg' import ClaudeModelLogo from '@renderer/assets/images/models/claude.png' import DeepSeekModelLogo from '@renderer/assets/images/models/deepseek.png' +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' @@ -18,6 +19,7 @@ import AnthropicProviderLogo from '@renderer/assets/images/providers/anthropic.j import BaichuanProviderLogo from '@renderer/assets/images/providers/baichuan.png' import DashScopeProviderLogo from '@renderer/assets/images/providers/dashscope.png' import DeepSeekProviderLogo from '@renderer/assets/images/providers/deepseek.png' +import DoubaoProviderLogo from '@renderer/assets/images/providers/doubao.png' import GeminiProviderLogo from '@renderer/assets/images/providers/gemini.png' import GroqProviderLogo from '@renderer/assets/images/providers/groq.png' import MoonshotProviderLogo from '@renderer/assets/images/providers/moonshot.jpeg' @@ -62,6 +64,8 @@ export function getProviderLogo(providerId: string) { return GeminiProviderLogo case 'stepfun': return StepFunProviderLogo + case 'doubao': + return DoubaoProviderLogo default: return undefined } @@ -90,7 +94,8 @@ export function getModelLogo(modelId: string) { embedding: EmbeddingModelLogo, bison: PalmModelLogo, palm: PalmModelLogo, - step: StepModelLogo + step: StepModelLogo, + 'ep-202': DoubaoModelLogo } for (const key in logoMap) { @@ -115,6 +120,18 @@ export const PROVIDER_CONFIG = { models: 'https://platform.openai.com/docs/models' } }, + gemini: { + api: { + url: 'https://generativelanguage.googleapis.com', + editable: false + }, + websites: { + official: 'https://gemini.google.com/', + apiKey: 'https://aistudio.google.com/app/apikey', + docs: 'https://ai.google.dev/gemini-api/docs', + models: 'https://ai.google.dev/gemini-api/docs/models/gemini' + } + }, silicon: { api: { url: 'https://cloud.siliconflow.cn', @@ -199,6 +216,30 @@ export const PROVIDER_CONFIG = { models: 'https://dashscope.console.aliyun.com/model' } }, + stepfun: { + api: { + url: 'https://api.stepfun.com', + editable: false + }, + websites: { + official: 'https://platform.stepfun.com/', + apiKey: 'https://platform.stepfun.com/interface-key', + docs: 'https://platform.stepfun.com/docs/overview/concept', + models: 'https://platform.stepfun.com/docs/llm/text' + } + }, + doubao: { + api: { + url: 'https://ark.cn-beijing.volces.com/api/v3/', + editable: true + }, + websites: { + official: 'https://console.volcengine.com/ark/', + apiKey: 'https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey', + docs: 'https://www.volcengine.com/docs/82379/1182403', + models: 'https://console.volcengine.com/ark/region:ark+cn-beijing/endpoint' + } + }, openrouter: { api: { url: 'https://openrouter.ai/api/v1/', @@ -257,29 +298,5 @@ export const PROVIDER_CONFIG = { docs: 'https://doc.aihubmix.com/', models: 'https://aihubmix.com/models' } - }, - gemini: { - api: { - url: 'https://generativelanguage.googleapis.com', - editable: false - }, - websites: { - official: 'https://gemini.google.com/', - apiKey: 'https://aistudio.google.com/app/apikey', - docs: 'https://ai.google.dev/gemini-api/docs', - models: 'https://ai.google.dev/gemini-api/docs/models/gemini' - } - }, - stepfun: { - api: { - url: 'https://api.stepfun.com', - editable: false - }, - websites: { - official: 'https://platform.stepfun.com/', - apiKey: 'https://platform.stepfun.com/interface-key', - docs: 'https://platform.stepfun.com/docs/overview/concept', - models: 'https://platform.stepfun.com/docs/llm/text' - } } } diff --git a/src/renderer/src/i18n/index.ts b/src/renderer/src/i18n/index.ts index 899ef14833..baaf0217ec 100644 --- a/src/renderer/src/i18n/index.ts +++ b/src/renderer/src/i18n/index.ts @@ -119,7 +119,8 @@ const resources = { dashscope: 'DashScope', anthropic: 'Anthropic', aihubmix: 'AiHubMix', - stepfun: 'StepFun' + stepfun: 'StepFun', + doubao: 'Doubao' }, settings: { title: 'Settings', @@ -338,7 +339,8 @@ const resources = { dashscope: '阿里云灵积', anthropic: 'Anthropic', aihubmix: 'AiHubMix', - stepfun: '阶跃星辰' + stepfun: '阶跃星辰', + doubao: '豆包' }, settings: { title: '设置', diff --git a/src/renderer/src/pages/home/Message.tsx b/src/renderer/src/pages/home/Message.tsx index bfa12e3faf..168d95c86d 100644 --- a/src/renderer/src/pages/home/Message.tsx +++ b/src/renderer/src/pages/home/Message.tsx @@ -67,9 +67,9 @@ const MessageItem: FC = ({ message, index, showMenu, onDeleteMessage }) = const getUserName = useCallback(() => { if (message.id === 'assistant') return assistant?.name - if (message.role === 'assistant') return upperFirst(message.modelId) + if (message.role === 'assistant') return upperFirst(model.name || model.id) return userName || t('common.you') - }, [assistant?.name, message.id, message.modelId, message.role, t, userName]) + }, [assistant?.name, message.id, message.role, model.id, model.name, t, userName]) const fontFamily = useMemo(() => { return messageFont === 'serif' ? FONT_FAMILY.replace('sans-serif', 'serif').replace('Ubuntu, ', '') : FONT_FAMILY diff --git a/src/renderer/src/store/llm.ts b/src/renderer/src/store/llm.ts index 86bc5b24f3..da21463b18 100644 --- a/src/renderer/src/store/llm.ts +++ b/src/renderer/src/store/llm.ts @@ -112,6 +112,15 @@ const initialState: LlmState = { isSystem: true, enabled: false }, + { + id: 'doubao', + name: 'doubao', + apiKey: '', + apiHost: 'https://ark.cn-beijing.volces.com/api/v3/', + models: SYSTEM_MODELS.doubao.filter((m) => m.enabled), + isSystem: true, + enabled: false + }, { id: 'aihubmix', name: 'AiHubMix', diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index a6bb4b6c03..46afa9d423 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -321,6 +321,15 @@ const migrateConfig = { models: SYSTEM_MODELS.stepfun.filter((m) => m.enabled), isSystem: true, enabled: false + }, + { + id: 'doubao', + name: 'doubao', + apiKey: '', + apiHost: 'https://ark.cn-beijing.volces.com/api/v3/', + models: SYSTEM_MODELS.doubao.filter((m) => m.enabled), + isSystem: true, + enabled: false } ] }