diff --git a/src/renderer/src/config/models.ts b/src/renderer/src/config/models.ts index b02c478a..015e8ad0 100644 --- a/src/renderer/src/config/models.ts +++ b/src/renderer/src/config/models.ts @@ -2265,6 +2265,12 @@ export function isWebSearchModel(model: Model): boolean { return false } + if (model.type) { + if (model.type.includes('web_search')) { + return true + } + } + const provider = getProviderByModel(model) if (!provider) { @@ -2301,7 +2307,7 @@ export function isWebSearchModel(model: Model): boolean { } if (provider.id === 'dashscope') { - const models = ['qwen-turbo', 'qwen-max', 'qwen-plus'] + const models = ['qwen-turbo', 'qwen-max', 'qwen-plus', 'qwq'] // matches id like qwen-max-0919, qwen-max-latest return models.some((i) => model.id.startsWith(i)) } @@ -2310,7 +2316,7 @@ export function isWebSearchModel(model: Model): boolean { return true } - return model.type?.includes('web_search') || false + return false } export function isGenerateImageModel(model: Model): boolean { @@ -2406,3 +2412,27 @@ export function isHunyuanSearchModel(model?: Model): boolean { return false } + +/** + * 按 Qwen 系列模型分组 + * @param models 模型列表 + * @returns 分组后的模型 + */ +export function groupQwenModels(models: Model[]): Record { + return models.reduce( + (groups, model) => { + // 匹配 Qwen 系列模型的前缀 + const prefixMatch = model.id.match(/^(qwen(?:\d+\.\d+|2(?:\.\d+)?|-\d+b|-(?:max|coder|vl)))/i) + // 匹配 qwen2.5、qwen2、qwen-7b、qwen-max、qwen-coder 等 + const groupKey = prefixMatch ? prefixMatch[1] : model.group || '其他' + + if (!groups[groupKey]) { + groups[groupKey] = [] + } + groups[groupKey].push(model) + + return groups + }, + {} as Record + ) +} diff --git a/src/renderer/src/config/providers.ts b/src/renderer/src/config/providers.ts index 07e10528..54d9f9c4 100644 --- a/src/renderer/src/config/providers.ts +++ b/src/renderer/src/config/providers.ts @@ -319,9 +319,9 @@ export const PROVIDER_CONFIG = { }, websites: { official: 'https://www.aliyun.com/product/bailian', - apiKey: 'https://bailian.console.aliyun.com/?apiKey=1#/api-key', + apiKey: 'https://bailian.console.aliyun.com/?tab=model#/api-key', docs: 'https://help.aliyun.com/zh/model-studio/getting-started/', - models: 'https://bailian.console.aliyun.com/model-market#/model-market' + models: 'https://bailian.console.aliyun.com/?tab=model#/model-market' } }, stepfun: { diff --git a/src/renderer/src/pages/settings/ProviderSettings/EditModelsPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/EditModelsPopup.tsx index e55182d1..8cea1aed 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/EditModelsPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/EditModelsPopup.tsx @@ -4,6 +4,7 @@ import CustomTag from '@renderer/components/CustomTag' import ModelTagsWithLabel from '@renderer/components/ModelTagsWithLabel' import { getModelLogo, + groupQwenModels, isEmbeddingModel, isFunctionCallingModel, isReasoningModel, @@ -81,7 +82,16 @@ const PopupContainer: React.FC = ({ provider: _provider, resolve }) => { } }) - const modelGroups = groupBy(list, 'group') + const modelGroups = + provider.id === 'dashscope' + ? { + ...groupBy( + list.filter((model) => !model.id.startsWith('qwen')), + 'group' + ), + ...groupQwenModels(list.filter((model) => model.id.startsWith('qwen'))) + } + : groupBy(list, 'group') const onOk = () => { setOpen(false)