diff --git a/src/app/(main)/settings/llm/ProviderList/providers.tsx b/src/app/(main)/settings/llm/ProviderList/providers.tsx index 11557fbb29e2a..5ca65b00471fd 100644 --- a/src/app/(main)/settings/llm/ProviderList/providers.tsx +++ b/src/app/(main)/settings/llm/ProviderList/providers.tsx @@ -10,6 +10,7 @@ import { Moonshot, OpenRouter, Perplexity, + Stepfun, Together, Tongyi, ZeroOne, @@ -31,6 +32,7 @@ import { OpenRouterProviderCard, PerplexityProviderCard, QwenProviderCard, + StepfunProviderCard, TogetherAIProviderCard, ZeroOneProviderCard, ZhiPuProviderCard, @@ -135,6 +137,10 @@ export const useProviderList = (): ProviderItem[] => { ...ZeroOneProviderCard, title: , }, + { + ...StepfunProviderCard, + title: , + }, ], [azureProvider, ollamaProvider, ollamaProvider, bedrockProvider], ); diff --git a/src/app/api/chat/agentRuntime.ts b/src/app/api/chat/agentRuntime.ts index a21210ae2ebb5..169559804bdcd 100644 --- a/src/app/api/chat/agentRuntime.ts +++ b/src/app/api/chat/agentRuntime.ts @@ -163,6 +163,13 @@ const getLlmOptionsFromPayload = (provider: string, payload: JWTPayload) => { const apiKey = apiKeyManager.pick(payload?.apiKey || QWEN_API_KEY); + return { apiKey }; + } + case ModelProvider.Stepfun: { + const { STEPFUN_API_KEY } = getLLMConfig(); + + const apiKey = apiKeyManager.pick(payload?.apiKey || STEPFUN_API_KEY); + return { apiKey }; } } diff --git a/src/components/ModelIcon/index.tsx b/src/components/ModelIcon/index.tsx index 932e93519065b..a975c0f1426f5 100644 --- a/src/components/ModelIcon/index.tsx +++ b/src/components/ModelIcon/index.tsx @@ -26,6 +26,7 @@ import { Rwkv, Spark, Stability, + Stepfun, Tongyi, Wenxin, Yi, @@ -64,6 +65,7 @@ const ModelIcon = memo(({ model: originModel, size = 12 if (model.startsWith('openchat')) return ; if (model.includes('command')) return ; if (model.includes('dbrx')) return ; + if (model.includes('step')) return ; // below: To be supported in providers, move up if supported if (model.includes('baichuan')) diff --git a/src/components/ModelProviderIcon/index.tsx b/src/components/ModelProviderIcon/index.tsx index 0dfd8c98c3fc0..3fccbd2900bfc 100644 --- a/src/components/ModelProviderIcon/index.tsx +++ b/src/components/ModelProviderIcon/index.tsx @@ -13,6 +13,7 @@ import { OpenAI, OpenRouter, Perplexity, + Stepfun, Together, Tongyi, ZeroOne, @@ -109,6 +110,10 @@ const ModelProviderIcon = memo(({ provider }) => { return ; } + case ModelProvider.Stepfun: { + return ; + } + default: { return null; } diff --git a/src/config/llm.ts b/src/config/llm.ts index f4bd3ed7cb430..6cb23521a50fd 100644 --- a/src/config/llm.ts +++ b/src/config/llm.ts @@ -117,6 +117,9 @@ export const getLLMConfig = () => { ENABLED_QWEN: z.boolean(), QWEN_API_KEY: z.string().optional(), + + ENABLED_STEPFUN: z.boolean(), + STEPFUN_API_KEY: z.string().optional(), }, runtimeEnv: { API_KEY_SELECT_MODE: process.env.API_KEY_SELECT_MODE, @@ -188,6 +191,9 @@ export const getLLMConfig = () => { ENABLED_QWEN: !!process.env.QWEN_API_KEY, QWEN_API_KEY: process.env.QWEN_API_KEY, + + ENABLED_STEPFUN: !!process.env.STEPFUN_API_KEY, + STEPFUN_API_KEY: process.env.STEPFUN_API_KEY, }, }); }; diff --git a/src/config/modelProviders/index.ts b/src/config/modelProviders/index.ts index 12150c36f7ea4..4f61d4b0e0e58 100644 --- a/src/config/modelProviders/index.ts +++ b/src/config/modelProviders/index.ts @@ -14,6 +14,7 @@ import OpenAIProvider from './openai'; import OpenRouterProvider from './openrouter'; import PerplexityProvider from './perplexity'; import QwenProvider from './qwen'; +import StepfunProvider from './stepfun'; import TogetherAIProvider from './togetherai'; import ZeroOneProvider from './zeroone'; import ZhiPuProvider from './zhipu'; @@ -35,6 +36,7 @@ export const LOBE_DEFAULT_MODEL_LIST: ChatModelCard[] = [ PerplexityProvider.chatModels, AnthropicProvider.chatModels, ZeroOneProvider.chatModels, + StepfunProvider.chatModels, ].flat(); export const DEFAULT_MODEL_PROVIDER_LIST = [ @@ -55,6 +57,7 @@ export const DEFAULT_MODEL_PROVIDER_LIST = [ MoonshotProvider, ZeroOneProvider, ZhiPuProvider, + StepfunProvider, ]; export const filterEnabledModels = (provider: ModelProviderCard) => { @@ -75,6 +78,7 @@ export { default as OpenAIProviderCard } from './openai'; export { default as OpenRouterProviderCard } from './openrouter'; export { default as PerplexityProviderCard } from './perplexity'; export { default as QwenProviderCard } from './qwen'; +export { default as StepfunProviderCard } from './stepfun'; export { default as TogetherAIProviderCard } from './togetherai'; export { default as ZeroOneProviderCard } from './zeroone'; export { default as ZhiPuProviderCard } from './zhipu'; diff --git a/src/config/modelProviders/stepfun.ts b/src/config/modelProviders/stepfun.ts new file mode 100644 index 0000000000000..183d3dc96d043 --- /dev/null +++ b/src/config/modelProviders/stepfun.ts @@ -0,0 +1,38 @@ +import { ModelProviderCard } from '@/types/llm'; + +// ref https://platform.stepfun.com/docs/llm/text +const Stepfun: ModelProviderCard = { + chatModels: [ + { + enabled: true, + id: 'step-1-256k', + tokens: 32_768, + }, + { + enabled: true, + id: 'step-1-128k', + tokens: 32_768, + }, + { + enabled: true, + id: 'step-1-32k', + tokens: 32_768, + }, + { + enabled: true, + id: 'step-1v-32k', + tokens: 32_768, + vision: true, + }, + { + id: 'step-1-8k', + tokens: 8192, + }, + ], + checkModel: 'step-1-8k', + id: 'stepfun', + modelList: { showModelFetcher: true }, + name: '阶跃星辰', +}; + +export default Stepfun; diff --git a/src/const/settings/llm.ts b/src/const/settings/llm.ts index 0e251af724b1e..f468b2cb70666 100644 --- a/src/const/settings/llm.ts +++ b/src/const/settings/llm.ts @@ -12,6 +12,7 @@ import { OpenRouterProviderCard, PerplexityProviderCard, QwenProviderCard, + StepfunProviderCard, TogetherAIProviderCard, ZeroOneProviderCard, ZhiPuProviderCard, @@ -77,6 +78,10 @@ export const DEFAULT_LLM_CONFIG: UserModelProviderConfig = { enabled: false, enabledModels: filterEnabledModels(QwenProviderCard), }, + stepfun: { + enabled: false, + enabledModels: filterEnabledModels(StepfunProviderCard), + }, togetherai: { enabled: false, enabledModels: filterEnabledModels(TogetherAIProviderCard), diff --git a/src/libs/agent-runtime/AgentRuntime.ts b/src/libs/agent-runtime/AgentRuntime.ts index ef07480ac6e09..4ee26dbb7db7e 100644 --- a/src/libs/agent-runtime/AgentRuntime.ts +++ b/src/libs/agent-runtime/AgentRuntime.ts @@ -17,6 +17,7 @@ import { LobeOpenAI } from './openai'; import { LobeOpenRouterAI } from './openrouter'; import { LobePerplexityAI } from './perplexity'; import { LobeQwenAI } from './qwen'; +import { LobeStepfunAI } from './stepfun'; import { LobeTogetherAI } from './togetherai'; import { ChatCompetitionOptions, @@ -114,6 +115,7 @@ class AgentRuntime { openrouter: Partial; perplexity: Partial; qwen: Partial; + stepfun: Partial; togetherai: Partial; zeroone: Partial; zhipu: Partial; @@ -212,6 +214,11 @@ class AgentRuntime { runtimeModel = new LobeQwenAI(params.qwen ?? {}); break; } + + case ModelProvider.Stepfun: { + runtimeModel = new LobeStepfunAI(params.stepfun ?? {}); + break; + } } return new AgentRuntime(runtimeModel); diff --git a/src/libs/agent-runtime/stepfun/index.ts b/src/libs/agent-runtime/stepfun/index.ts new file mode 100644 index 0000000000000..02727361279ea --- /dev/null +++ b/src/libs/agent-runtime/stepfun/index.ts @@ -0,0 +1,10 @@ +import { ModelProvider } from '../types'; +import { LobeOpenAICompatibleFactory } from '../utils/openaiCompatibleFactory'; + +export const LobeStepfunAI = LobeOpenAICompatibleFactory({ + baseURL: 'https://api.stepfun.com/v1', + debug: { + chatCompletion: () => process.env.DEBUG_STEPFUN_CHAT_COMPLETION === '1', + }, + provider: ModelProvider.Stepfun, +}); diff --git a/src/libs/agent-runtime/types/type.ts b/src/libs/agent-runtime/types/type.ts index 3bcadf517675d..bd5feef94b88f 100644 --- a/src/libs/agent-runtime/types/type.ts +++ b/src/libs/agent-runtime/types/type.ts @@ -36,6 +36,7 @@ export enum ModelProvider { OpenRouter = 'openrouter', Perplexity = 'perplexity', Qwen = 'qwen', + Stepfun = 'stepfun', TogetherAI = 'togetherai', ZeroOne = 'zeroone', ZhiPu = 'zhipu', diff --git a/src/server/globalConfig/index.ts b/src/server/globalConfig/index.ts index 7a0a79cf60ab3..41c774f094606 100644 --- a/src/server/globalConfig/index.ts +++ b/src/server/globalConfig/index.ts @@ -33,6 +33,7 @@ export const getServerGlobalConfig = () => { ENABLED_MINIMAX, ENABLED_MISTRAL, ENABLED_QWEN, + ENABLED_STEPFUN, ENABLED_AZURE_OPENAI, AZURE_MODEL_LIST, @@ -104,6 +105,8 @@ export const getServerGlobalConfig = () => { perplexity: { enabled: ENABLED_PERPLEXITY }, qwen: { enabled: ENABLED_QWEN }, + stepfun: { enabled: ENABLED_STEPFUN }, + togetherai: { enabled: ENABLED_TOGETHERAI, enabledModels: extractEnabledModels(TOGETHERAI_MODEL_LIST), diff --git a/src/types/user/settings/keyVaults.ts b/src/types/user/settings/keyVaults.ts index e99d1411c782f..117254f2b5114 100644 --- a/src/types/user/settings/keyVaults.ts +++ b/src/types/user/settings/keyVaults.ts @@ -31,6 +31,7 @@ export interface UserKeyVaults { password?: string; perplexity?: OpenAICompatibleKeyVault; qwen?: OpenAICompatibleKeyVault; + stepfun?: OpenAICompatibleKeyVault; togetherai?: OpenAICompatibleKeyVault; zeroone?: OpenAICompatibleKeyVault; zhipu?: OpenAICompatibleKeyVault;