diff --git a/.env.template b/.env.template index 4efaa2ff8..db50220c6 100644 --- a/.env.template +++ b/.env.template @@ -64,6 +64,11 @@ CUSTOM_MODELS= # Change default model DEFAULT_MODEL= +# (optional) +# Default: Empty +# Change default compress model +DEFAULT_COMPRESS_MODEL= + # anthropic claude Api Key.(optional) ANTHROPIC_API_KEY= diff --git a/README.md b/README.md index d0a6b409d..08043f7b9 100644 --- a/README.md +++ b/README.md @@ -322,6 +322,10 @@ For ByteDance: use `modelName@bytedance=deploymentName` to customize model name Change default model +### `DEFAULT_COMPRESS_MODEL` (optional) + +Change default summary model + ### `VISION_MODELS` (optional) > Default: Empty @@ -348,7 +352,6 @@ Stability API key. Customize Stability API url. - ### `ENABLE_MCP` (optional) Enable MCP(Model Context Protocol)Feature diff --git a/README_CN.md b/README_CN.md index 5576231cc..d6f79cf0b 100644 --- a/README_CN.md +++ b/README_CN.md @@ -244,6 +244,10 @@ DeepSeek Api Url. 更改默认模型 +### `DEFAULT_COMPRESS_MODEL` (可选) + +更改默认对话摘要模型 + ### `VISION_MODELS` (可选) > 默认值:空 diff --git a/README_JA.md b/README_JA.md index f1c2da457..b48f77896 100644 --- a/README_JA.md +++ b/README_JA.md @@ -217,6 +217,10 @@ ByteDance モードでは、`modelName@bytedance=deploymentName` 形式でモデ デフォルトのモデルを変更します。 +### `DEFAULT_COMPRESS_MODEL` (オプション) + +デフォルトの圧縮モデルを変更します。 + ### `VISION_MODELS` (オプション) > デフォルト:空 diff --git a/app/api/config/route.ts b/app/api/config/route.ts index 855a5db01..f04790485 100644 --- a/app/api/config/route.ts +++ b/app/api/config/route.ts @@ -14,6 +14,7 @@ const DANGER_CONFIG = { disableFastLink: serverConfig.disableFastLink, customModels: serverConfig.customModels, defaultModel: serverConfig.defaultModel, + defaultCompressModel: serverConfig.defaultCompressModel, visionModels: serverConfig.visionModels, }; diff --git a/app/components/model-config.tsx b/app/components/model-config.tsx index e845bfeac..11fa28aff 100644 --- a/app/components/model-config.tsx +++ b/app/components/model-config.tsx @@ -259,13 +259,15 @@ export function ModelConfigList(props: { }); }} > - {allModels - .filter((v) => v.available) - .map((v, i) => ( - - ))} + {Object.keys(groupModels).map((providerName, index) => ( + + {groupModels[providerName].map((v, i) => ( + + ))} + + ))} diff --git a/app/config/server.ts b/app/config/server.ts index 43d4ff833..17fccde02 100644 --- a/app/config/server.ts +++ b/app/config/server.ts @@ -23,6 +23,7 @@ declare global { DISABLE_FAST_LINK?: string; // disallow parse settings from url or not CUSTOM_MODELS?: string; // to control custom models DEFAULT_MODEL?: string; // to control default model in every new chat window + DEFAULT_COMPRESS_MODEL?: string; // to control default compress model VISION_MODELS?: string; // to control vision models // stability only @@ -135,6 +136,7 @@ export const getServerSideConfig = () => { const disableGPT4 = !!process.env.DISABLE_GPT4; let customModels = process.env.CUSTOM_MODELS ?? ""; let defaultModel = process.env.DEFAULT_MODEL ?? ""; + let defaultCompressModel = process.env.DEFAULT_COMPRESS_MODEL ?? ""; let visionModels = process.env.VISION_MODELS ?? ""; if (disableGPT4) { @@ -145,6 +147,9 @@ export const getServerSideConfig = () => { if (defaultModel && isGPT4Model(defaultModel)) { defaultModel = ""; } + if (defaultCompressModel && isGPT4Model(defaultCompressModel)) { + defaultCompressModel = ""; + } } const isStability = !!process.env.STABILITY_API_KEY; @@ -262,6 +267,7 @@ export const getServerSideConfig = () => { disableFastLink: !!process.env.DISABLE_FAST_LINK, customModels, defaultModel, + defaultCompressModel, visionModels, allowedWebDavEndpoints, enableMcp: process.env.ENABLE_MCP === "true", diff --git a/app/store/access.ts b/app/store/access.ts index 7025a1814..d5387e747 100644 --- a/app/store/access.ts +++ b/app/store/access.ts @@ -140,6 +140,7 @@ const DEFAULT_ACCESS_STATE = { disableFastLink: false, customModels: "", defaultModel: "", + defaultCompressModel: "", visionModels: "", // tts config @@ -255,12 +256,21 @@ export const useAccessStore = createPersistStore( .then((res) => res.json()) .then((res) => { const defaultModel = res.defaultModel ?? ""; - if (defaultModel !== "") { + if (defaultModel) { const [model, providerName] = getModelProvider(defaultModel); DEFAULT_CONFIG.modelConfig.model = model; DEFAULT_CONFIG.modelConfig.providerName = providerName as any; } + const defaultCompressModel = res.defaultCompressModel ?? ""; + if (defaultCompressModel) { + const [model, providerName] = + getModelProvider(defaultCompressModel); + DEFAULT_CONFIG.modelConfig.compressModel = model; + DEFAULT_CONFIG.modelConfig.compressProviderName = + providerName as any; + } + return res; }) .then((res: DangerConfig) => { diff --git a/app/store/chat.ts b/app/store/chat.ts index 87c1a8beb..6ab7b14be 100644 --- a/app/store/chat.ts +++ b/app/store/chat.ts @@ -123,9 +123,16 @@ function getSummarizeModel( currentModel: string, providerName: string, ): string[] { + const configStore = useAppConfig.getState(); + if (configStore.modelConfig.compressModel) { + return [ + configStore.modelConfig.compressModel, + configStore.modelConfig.compressProviderName, + ]; + } + // if it is using gpt-* models, force to use 4o-mini to summarize if (currentModel.startsWith("gpt") || currentModel.startsWith("chatgpt")) { - const configStore = useAppConfig.getState(); const accessStore = useAccessStore.getState(); const allModel = collectModelsWithDefaultModel( configStore.models,