diff --git a/src/app/[variants]/(main)/settings/provider/(detail)/doubao/page.tsx b/src/app/[variants]/(main)/settings/provider/(detail)/doubao/page.tsx index 88a05c1ee1eef..c1fd55008f424 100644 --- a/src/app/[variants]/(main)/settings/provider/(detail)/doubao/page.tsx +++ b/src/app/[variants]/(main)/settings/provider/(detail)/doubao/page.tsx @@ -11,16 +11,15 @@ import ProviderDetail from '../[id]'; const providerKey = ModelProvider.Doubao; const useProviderCard = (): ProviderItem => { - // Get the first model card's deployment name as the check model const checkModel = useUserStore((s) => { const chatModelCards = modelProviderSelectors.getModelCardsById(providerKey)(s); - + console.log(chatModelCards); if (chatModelCards.length > 0) { - return chatModelCards[0].deploymentName; + return chatModelCards[0].id.split('->')[1]; } - return 'Doubao-lite-4k'; + return 'no-model'; }); return { ...DoubaoProviderCard, @@ -32,9 +31,9 @@ const useProviderCard = (): ProviderItem => { }; const Page = () => { - const card = useProviderCard(); - - return ; - }; - - export default Page; \ No newline at end of file + const card = useProviderCard(); + + return ; +}; + +export default Page; diff --git a/src/app/[variants]/(main)/settings/provider/features/ModelList/CreateNewModelModal/index.tsx b/src/app/[variants]/(main)/settings/provider/features/ModelList/CreateNewModelModal/index.tsx index 1f833d779edbc..0c6a43851aa4e 100644 --- a/src/app/[variants]/(main)/settings/provider/features/ModelList/CreateNewModelModal/index.tsx +++ b/src/app/[variants]/(main)/settings/provider/features/ModelList/CreateNewModelModal/index.tsx @@ -67,7 +67,9 @@ const ModelConfigModal = memo(({ open, setOpen }) => { > ); diff --git a/src/app/[variants]/(main)/settings/provider/features/ModelList/ModelConfigModal/index.tsx b/src/app/[variants]/(main)/settings/provider/features/ModelList/ModelConfigModal/index.tsx index 566227e4e9000..f817aa15880b5 100644 --- a/src/app/[variants]/(main)/settings/provider/features/ModelList/ModelConfigModal/index.tsx +++ b/src/app/[variants]/(main)/settings/provider/features/ModelList/ModelConfigModal/index.tsx @@ -66,7 +66,9 @@ const ModelConfigModal = memo(({ id, open, setOpen }) => idEditable={false} initialValues={model} onFormInstanceReady={setFormInstance} - showAzureDeployName={editingProvider === ModelProvider.Azure || editingProvider === ModelProvider.Doubao} + showAzureDeployName={ + editingProvider === ModelProvider.Azure || editingProvider === ModelProvider.Doubao + } type={model?.type} /> diff --git a/src/config/aiModels/doubao.ts b/src/config/aiModels/doubao.ts index 52cc0ee4fbd29..969a15d1465e7 100644 --- a/src/config/aiModels/doubao.ts +++ b/src/config/aiModels/doubao.ts @@ -1,63 +1,54 @@ import { AIChatModelCard } from '@/types/aiModel'; const doubaoChatModels: AIChatModelCard[] = [ - { - contextWindowTokens: 4096, - description: - '拥有极致的响应速度,更好的性价比,为客户不同场景提供更灵活的选择。支持 4k 上下文窗口的推理和精调。', - displayName: 'Doubao Lite 4k', - enabled: true, - id: 'Doubao-lite-4k', - type: 'chat', - }, - { - contextWindowTokens: 32_768, - description: - '拥有极致的响应速度,更好的性价比,为客户不同场景提供更灵活的选择。支持 32k 上下文窗口的推理和精调。', - displayName: 'Doubao Lite 32k', - enabled: true, - id: 'Doubao-lite-32k', - type: 'chat', - }, - { - contextWindowTokens: 128_000, - description: - '拥有极致的响应速度,更好的性价比,为客户不同场景提供更灵活的选择。支持 128k 上下文窗口的推理和精调。', - displayName: 'Doubao Lite 128k', - enabled: true, - id: 'Doubao-lite-128k', - type: 'chat', - }, - { - contextWindowTokens: 4096, - description: - '效果最好的主力模型,适合处理复杂任务,在参考问答、总结摘要、创作、文本分类、角色扮演等场景都有很好的效果。支持 4k 上下文窗口的推理和精调。', - displayName: 'Doubao Pro 4k', - enabled: true, - id: 'Doubao-pro-4k', - type: 'chat', - }, - { - config: { - deploymentName: 'Doubao-pro-test', - }, - contextWindowTokens: 32_768, - description: - '效果最好的主力模型,适合处理复杂任务,在参考问答、总结摘要、创作、文本分类、角色扮演等场景都有很好的效果。支持 32k 上下文窗口的推理和精调。', - displayName: 'Doubao Pro 32k', - enabled: true, - id: 'Doubao-pro-32k', - type: 'chat', - }, - { - contextWindowTokens: 128_000, - description: - '效果最好的主力模型,适合处理复杂任务,在参考问答、总结摘要、创作、文本分类、角色扮演等场景都有很好的效果。支持 128k 上下文窗口的推理和精调。', - displayName: 'Doubao Pro 128k', - enabled: true, - id: 'Doubao-pro-128k', - type: 'chat', - }, + { + contextWindowTokens: 4096, + description: + '拥有极致的响应速度,更好的性价比,为客户不同场景提供更灵活的选择。支持 4k 上下文窗口的推理和精调。', + displayName: 'Doubao Lite 4k', + id: 'Doubao-lite-4k', + type: 'chat', + }, + { + contextWindowTokens: 32_768, + description: + '拥有极致的响应速度,更好的性价比,为客户不同场景提供更灵活的选择。支持 32k 上下文窗口的推理和精调。', + displayName: 'Doubao Lite 32k', + id: 'Doubao-lite-32k', + type: 'chat', + }, + { + contextWindowTokens: 128_000, + description: + '拥有极致的响应速度,更好的性价比,为客户不同场景提供更灵活的选择。支持 128k 上下文窗口的推理和精调。', + displayName: 'Doubao Lite 128k', + id: 'Doubao-lite-128k', + type: 'chat', + }, + { + contextWindowTokens: 4096, + description: + '效果最好的主力模型,适合处理复杂任务,在参考问答、总结摘要、创作、文本分类、角色扮演等场景都有很好的效果。支持 4k 上下文窗口的推理和精调。', + displayName: 'Doubao Pro 4k', + id: 'Doubao-pro-4k', + type: 'chat', + }, + { + contextWindowTokens: 32_768, + description: + '效果最好的主力模型,适合处理复杂任务,在参考问答、总结摘要、创作、文本分类、角色扮演等场景都有很好的效果。支持 32k 上下文窗口的推理和精调。', + displayName: 'Doubao Pro 32k', + id: 'Doubao-pro-32k', + type: 'chat', + }, + { + contextWindowTokens: 128_000, + description: + '效果最好的主力模型,适合处理复杂任务,在参考问答、总结摘要、创作、文本分类、角色扮演等场景都有很好的效果。支持 128k 上下文窗口的推理和精调。', + displayName: 'Doubao Pro 128k', + id: 'Doubao-pro-128k', + type: 'chat', + }, ]; export const allModels = [...doubaoChatModels]; diff --git a/src/config/modelProviders/doubao.ts b/src/config/modelProviders/doubao.ts index 1af75312759da..e7e519dce8f34 100644 --- a/src/config/modelProviders/doubao.ts +++ b/src/config/modelProviders/doubao.ts @@ -3,8 +3,8 @@ import { ModelProviderCard } from '@/types/llm'; // ref https://www.volcengine.com/docs/82379/1330310 const Doubao: ModelProviderCard = { chatModels: [], - // checkModel: 'Doubao-lite-4k', - description: '字节跳动推出的自研大模型。通过字节跳动内部50+业务场景实践验证,每日万亿级tokens大使用量持续打磨,提供多种模态能力,以优质模型效果为企业打造丰富的业务体验。', + description: + '字节跳动推出的自研大模型。通过字节跳动内部50+业务场景实践验证,每日万亿级tokens大使用量持续打磨,提供多种模态能力,以优质模型效果为企业打造丰富的业务体验。', id: 'doubao', modelsUrl: 'https://www.volcengine.com/product/doubao', name: '豆包', diff --git a/src/libs/agent-runtime/doubao/index.ts b/src/libs/agent-runtime/doubao/index.ts index a06c5398403a5..16d8c6429cda1 100644 --- a/src/libs/agent-runtime/doubao/index.ts +++ b/src/libs/agent-runtime/doubao/index.ts @@ -1,10 +1,34 @@ +import { LOBE_DEFAULT_MODEL_LIST } from '@/config/aiModels'; + import { ModelProvider } from '../types'; import { LobeOpenAICompatibleFactory } from '../utils/openaiCompatibleFactory'; +export interface DoubaoModelCard { + context_window: number; + id: string; +} + export const LobeDoubaoAI = LobeOpenAICompatibleFactory({ baseURL: 'https://ark.cn-beijing.volces.com/api/v3', debug: { chatCompletion: () => process.env.DEBUG_DOUBAO_CHAT_COMPLETION === '1', }, + models: { + transformModel: (m) => { + const functionCallKeywords = ['tool']; + + const model = m as unknown as DoubaoModelCard; + + return { + contextWindowTokens: model.context_window, + enabled: LOBE_DEFAULT_MODEL_LIST.find((m) => model.id.endsWith(m.id))?.enabled || false, + functionCall: functionCallKeywords.some((keyword) => + model.id.toLowerCase().includes(keyword), + ), + id: model.id, + vision: model.id.toLowerCase().includes('vision'), + }; + }, + }, provider: ModelProvider.Doubao, -}); \ No newline at end of file +}); diff --git a/src/services/chat.ts b/src/services/chat.ts index d06f1ef9a1f2d..886e546b8d454 100644 --- a/src/services/chat.ts +++ b/src/services/chat.ts @@ -73,6 +73,29 @@ const findAzureDeploymentName = (model: string) => { return deploymentId; }; +const findDoubaoDeploymentName = (model: string) => { + let deploymentId = model; + + // TODO: remove isDeprecatedEdition condition in V2.0 + if (isDeprecatedEdition) { + const chatModelCards = modelProviderSelectors.getModelCardsById(ModelProvider.Doubao)( + useUserStore.getState(), + ); + + const deploymentName = chatModelCards.find((i) => i.id === model)?.deploymentName; + if (deploymentName) deploymentId = deploymentName; + } else { + // find the model by id + const modelItem = useAiInfraStore.getState().enabledAiModels?.find((i) => i.id === model); + + if (modelItem && modelItem.config?.deploymentName) { + deploymentId = modelItem.config?.deploymentName; + } + } + + return deploymentId; +}; + const isEnableFetchOnClient = (provider: string) => { // TODO: remove this condition in V2.0 if (isDeprecatedEdition) { @@ -222,10 +245,14 @@ class ChatService { let model = res.model || DEFAULT_AGENT_CONFIG.model; // if the provider is Azure, get the deployment name as the request model - if (provider === ModelProvider.Azure || provider === ModelProvider.Doubao) { + if (provider === ModelProvider.Azure) { model = findAzureDeploymentName(model); } + if (provider === ModelProvider.Doubao) { + model = findDoubaoDeploymentName(model); + } + const payload = merge( { model: DEFAULT_AGENT_CONFIG.model, stream: true, ...DEFAULT_AGENT_CONFIG.params }, { ...res, model },