diff --git a/src/renderer/src/config/models.ts b/src/renderer/src/config/models.ts index 14436c1a..ca86a6ff 100644 --- a/src/renderer/src/config/models.ts +++ b/src/renderer/src/config/models.ts @@ -123,8 +123,11 @@ import YiModelLogo from '@renderer/assets/images/models/yi.png' import YiModelLogoDark from '@renderer/assets/images/models/yi_dark.png' import { getProviderByModel } from '@renderer/services/AssistantService' import { Model } from '@renderer/types' +import { isEmpty } from 'lodash' import OpenAI from 'openai' +import { getWebSearchTools } from './tools' + const visionAllowedModels = [ 'llava', 'moondream', @@ -559,9 +562,21 @@ export const SYSTEM_MODELS: Record = { ], zhipu: [ { - id: 'glm-4', + id: 'glm-zero-preview', provider: 'zhipu', - name: 'GLM-4', + name: 'GLM-Zero-Preview', + group: 'GLM-Zero' + }, + { + id: 'glm-4-0520', + provider: 'zhipu', + name: 'GLM-4-0520', + group: 'GLM-4' + }, + { + id: 'glm-4-long', + provider: 'zhipu', + name: 'GLM-4-Long', group: 'GLM-4' }, { @@ -605,6 +620,12 @@ export const SYSTEM_MODELS: Record = { provider: 'zhipu', name: 'GLM-4-AllTools', group: 'GLM-4-AllTools' + }, + { + id: 'embedding-3', + provider: 'zhipu', + name: 'Embedding-3', + group: 'Embedding' } ], moonshot: [ @@ -1045,5 +1066,27 @@ export function isWebSearchModel(model: Model): boolean { return model?.id === 'gemini-2.0-flash-exp-search' } + if (provider.id === 'zhipu') { + return model?.id?.startsWith('glm-4-') + } + return false } + +export function getWebSearchParams(model: Model): Record { + if (isWebSearchModel(model)) { + if (model.provider === 'hunyuan') { + return { enable_enhancement: true } + } + + if (model.provider === 'zhipu') { + const webSearchTools = getWebSearchTools(model) + return isEmpty(webSearchTools) + ? {} + : { + tools: webSearchTools + } + } + } + return {} +} diff --git a/src/renderer/src/config/tools.ts b/src/renderer/src/config/tools.ts new file mode 100644 index 00000000..47928648 --- /dev/null +++ b/src/renderer/src/config/tools.ts @@ -0,0 +1,29 @@ +import { Model } from '@renderer/types' +import { ChatCompletionTool } from 'openai/resources' + +import { isWebSearchModel } from './models' + +export function getWebSearchTools(model: Model): ChatCompletionTool[] { + if (model && model.provider === 'zhipu') { + if (isWebSearchModel(model)) { + if (model.id === 'glm-4-alltools') { + return [ + { + type: 'web_browser' + } as unknown as ChatCompletionTool + ] + } + return [ + { + type: 'web_search', + web_search: { + enable: true, + search_result: true + } + } as unknown as ChatCompletionTool + ] + } + } + + return [] +} diff --git a/src/renderer/src/providers/OpenAIProvider.ts b/src/renderer/src/providers/OpenAIProvider.ts index bc32108b..2b57490e 100644 --- a/src/renderer/src/providers/OpenAIProvider.ts +++ b/src/renderer/src/providers/OpenAIProvider.ts @@ -1,4 +1,4 @@ -import { isEmbeddingModel, isSupportedModel, isVisionModel, isWebSearchModel } from '@renderer/config/models' +import { getWebSearchParams, isEmbeddingModel, isSupportedModel, isVisionModel } from '@renderer/config/models' import { getStoreSetting } from '@renderer/hooks/useSettings' import i18n from '@renderer/i18n' import { getAssistantSettings, getDefaultModel, getTopNamingModel } from '@renderer/services/AssistantService' @@ -149,7 +149,7 @@ export default class OpenAIProvider extends BaseProvider { max_tokens: maxTokens, keep_alive: this.keepAliveTime, stream: isSupportStreamOutput, - ...(isWebSearchModel(model) ? { enable_enhancement: true } : {}), + ...(assistant.enableWebSearch ? getWebSearchParams(model) : {}), ...this.getCustomParameters(assistant) }) diff --git a/src/renderer/src/providers/index.d.ts b/src/renderer/src/providers/index.d.ts index b4c62e8b..75b8fed6 100644 --- a/src/renderer/src/providers/index.d.ts +++ b/src/renderer/src/providers/index.d.ts @@ -1,4 +1,4 @@ -import { Metrics } from "@renderer/types" +import type { Assistant, Metrics } from '@renderer/types' interface ChunkCallbackData { text?: string