From 660f29d9a7f2fc20797f84346888e2602a8627ab Mon Sep 17 00:00:00 2001 From: ddling Date: Thu, 26 Jun 2025 17:47:28 +0800 Subject: [PATCH] Add Huawei Cloud MaaS provider --- .../huaweicloud-maas-setting-util.ts | 62 ++++++++++++ .../packages/model-setting-utils/index.ts | 2 + .../packages/models/huaweicloud-maas.ts | 95 ++++++++++++++++++ src/renderer/packages/models/index.ts | 10 ++ .../icons/providers/huaweicloud-maas.png | Bin 0 -> 9796 bytes src/shared/defaults.ts | 35 +++++++ src/shared/types.ts | 1 + 7 files changed, 205 insertions(+) create mode 100644 src/renderer/packages/model-setting-utils/huaweicloud-maas-setting-util.ts create mode 100644 src/renderer/packages/models/huaweicloud-maas.ts create mode 100644 src/renderer/static/icons/providers/huaweicloud-maas.png diff --git a/src/renderer/packages/model-setting-utils/huaweicloud-maas-setting-util.ts b/src/renderer/packages/model-setting-utils/huaweicloud-maas-setting-util.ts new file mode 100644 index 000000000..f202c5b93 --- /dev/null +++ b/src/renderer/packages/model-setting-utils/huaweicloud-maas-setting-util.ts @@ -0,0 +1,62 @@ +import { ModelProvider, ModelProviderEnum, ProviderSettings, SessionType } from 'src/shared/types' +import { ModelSettingUtil } from './interface' +import HuaweiCloudMaaS from '../models/huaweicloud-maas' +import BaseConfig from './base-config' + +export default class HuaweiCloudMAASSettingUtil extends BaseConfig implements ModelSettingUtil { + public provider: ModelProvider = ModelProviderEnum.HuaweiCloudMaaS + + async getCurrentModelDisplayName( + model: string, + sessionType: SessionType, + providerSettings?: ProviderSettings + ): Promise { + return `HuaweiCloudMaaS API (${providerSettings?.models?.find((m) => m.modelId === model)?.nickname || model})` + } + + public getLocalOptionGroups() { + // HuaweiCloudMaaS支持的所有模型 + + const deepseekModels = [ + 'deepseek-r1-250528', + 'DeepSeek-V3', + 'DeepSeek-R1' + ] + + const qwenModels = [ + 'qwen3-235b-a22b', + 'qwen3-32b' + ] + + return [ + { + group_name: 'DeepSeek 系列', + options: deepseekModels.map((value) => ({ + label: value, + value: value, + })), + collapsable: true, + }, + { + group_name: '千问 系列', + options: qwenModels.map((value) => ({ + label: value, + value: value, + })), + collapsable: true, + }, + ] + } + + protected async listProviderModels() { + return [] + } + + isCurrentModelSupportImageInput(model: string): boolean { + return HuaweiCloudMaaS.helpers.isModelSupportVision(model) + } + + isCurrentModelSupportToolUse(model: string): boolean { + return HuaweiCloudMaaS.helpers.isModelSupportToolUse(model) + } +} \ No newline at end of file diff --git a/src/renderer/packages/model-setting-utils/index.ts b/src/renderer/packages/model-setting-utils/index.ts index 0d943f573..00e807a15 100644 --- a/src/renderer/packages/model-setting-utils/index.ts +++ b/src/renderer/packages/model-setting-utils/index.ts @@ -16,6 +16,7 @@ import PerplexitySettingUtil from './perplexity-setting-util' import SiliconFlowSettingUtil from './siliconflow-setting-util' import VolcEngineSettingUtil from './volcengine-setting-util' import XAISettingUtil from './xai-setting-util' +import HuaweiCloudMAASSettingUtil from './huaweicloud-maas-setting-util' export function getModelSettingUtil(aiProvider: ModelProvider): ModelSettingUtil { const hash: Record ModelSettingUtil> = { @@ -33,6 +34,7 @@ export function getModelSettingUtil(aiProvider: ModelProvider): ModelSettingUtil [ModelProviderEnum.LMStudio]: LMStudioSettingUtil, [ModelProviderEnum.Perplexity]: PerplexitySettingUtil, [ModelProviderEnum.XAI]: XAISettingUtil, + [ModelProviderEnum.HuaweiCloudMaaS]: HuaweiCloudMAASSettingUtil, [ModelProviderEnum.Custom]: CustomModelSettingUtil, } const Class = hash[aiProvider] || CustomModelSettingUtil diff --git a/src/renderer/packages/models/huaweicloud-maas.ts b/src/renderer/packages/models/huaweicloud-maas.ts new file mode 100644 index 000000000..93df5f5be --- /dev/null +++ b/src/renderer/packages/models/huaweicloud-maas.ts @@ -0,0 +1,95 @@ +import { fetchWithProxy } from '@/utils/request' +import { createOpenAICompatible } from '@ai-sdk/openai-compatible' +import { extractReasoningMiddleware, wrapLanguageModel } from 'ai' +import AbstractAISDKModel from './abstract-ai-sdk' +import { ProviderModelInfo } from 'src/shared/types' +import { fetchRemoteModels } from './openai-compatible' + +const helpers = { + isModelSupportVision: (model: string) => { + // HuaweiCloudMaaS支持视觉的模型 + return false + }, + isModelSupportToolUse: (model: string) => { + // HuaweiCloudMaaS支持工具使用的模型(除了纯图像生成和推理专用模型) + const nonToolModels = [ + 'qwen3-235b-a22b', + 'qwen3-32b' + ] + return !nonToolModels.some(nonToolModel => model.includes(nonToolModel)) + }, +} + +interface Options { + apiKey: string + apiHost: string + model: ProviderModelInfo + temperature?: number + topP?: number + useProxy?: boolean +} + +export default class HuaweiCloudMaaS extends AbstractAISDKModel { + public name = 'HuaweiCloudMaaS' + public static helpers = helpers + public options: Options + + constructor(options: Options) { + super(options) + this.options = { + ...options, + apiHost: options.apiHost || 'https://ai.huaweicloud.com/v1', + } + } + + public isSupportToolUse() { + return helpers.isModelSupportToolUse(this.options.model.modelId) + } + + private getProvider() { + return createOpenAICompatible({ + name: 'HuaweiCloudMaaS', + apiKey: this.options.apiKey, + baseURL: this.options.apiHost, + fetch: this.options.useProxy ? fetchWithProxy : undefined, + }) + } + + protected getChatModel() { + const provider = this.getProvider() + return wrapLanguageModel({ + model: provider.languageModel(this.options.model.modelId), + middleware: extractReasoningMiddleware({ tagName: 'think' }), + }) + } + + protected getImageModel() { + const provider = this.getProvider() + return provider.imageModel('dall-e-3') + } + + protected getCallSettings() { + return { + temperature: this.options.temperature, + topP: this.options.topP, + } + } + + public async listModels(): Promise { + return fetchRemoteModels({ + apiHost: this.options.apiHost, + apiKey: this.options.apiKey, + useProxy: this.options.useProxy, + }).catch((err) => { + console.error('HuaweiCloudMaaS models fetch error:', err) + // 返回HuaweiCloudMaaS支持的常见模型作为备选 + return [ + 'deepseek-r1-250528', + 'DeepSeek-V3', + 'DeepSeek-R1', + 'qwen3-235b-a22b', + 'qwen3-32b' + ] + }) + } +} \ No newline at end of file diff --git a/src/renderer/packages/models/index.ts b/src/renderer/packages/models/index.ts index b05f38984..fd590b0a9 100644 --- a/src/renderer/packages/models/index.ts +++ b/src/renderer/packages/models/index.ts @@ -16,6 +16,7 @@ import SiliconFlow from './siliconflow' import type { ModelInterface } from './types' import VolcEngine from './volcengine' import XAI from './xai' +import HuaweiCloudMaaS from './huaweicloud-maas' export function getModel(setting: Settings, config: Config): ModelInterface { const provider = setting.provider @@ -126,6 +127,15 @@ export function getModel(setting: Settings, config: Config): ModelInterface { topP: setting.topP, }) + case ModelProviderEnum.HuaweiCloudMaaS: + return new HuaweiCloudMaaS({ + apiKey: providerSetting.apiKey || '', + apiHost: formattedApiHost, + model, + temperature: setting.temperature, + topP: setting.topP, + }) + case ModelProviderEnum.SiliconFlow: return new SiliconFlow({ siliconCloudKey: providerSetting.apiKey || '', diff --git a/src/renderer/static/icons/providers/huaweicloud-maas.png b/src/renderer/static/icons/providers/huaweicloud-maas.png new file mode 100644 index 0000000000000000000000000000000000000000..377156de0374765f40513b3ff3620250f1d689f7 GIT binary patch literal 9796 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 e;1&FTgZ}}EivThjxh)|80000? literal 0 HcmV?d00001 diff --git a/src/shared/defaults.ts b/src/shared/defaults.ts index cdef74d28..95b106a1d 100644 --- a/src/shared/defaults.ts +++ b/src/shared/defaults.ts @@ -592,4 +592,39 @@ export const SystemProviders: ProviderBaseInfo[] = [ ], }, }, + { + id: ModelProviderEnum.HuaweiCloudMaaS, + name: 'HuaweiCloudMaaS', + type: ModelProviderType.OpenAI, + defaultSettings: { + apiHost: 'https://api.modelarts-maas.com/v1/', + models: [ + { + modelId: 'deepseek-r1-250528', + capabilities: ['reasoning', 'tool_use'], + contextWindow: 64_000, + }, + { + modelId: 'DeepSeek-V3', + capabilities: ['tool_use'], + contextWindow: 64_000, + }, + { + modelId: 'DeepSeek-R1', + capabilities: ['reasoning', 'tool_use'], + contextWindow: 64_000, + }, + { + modelId: 'qwen3-235b-a22b', + capabilities: ['reasoning'], + contextWindow: 32_000, + }, + { + modelId: 'qwen3-32b', + capabilities: ['reasoning'], + contextWindow: 32_000, + } + ], + }, + }, ] diff --git a/src/shared/types.ts b/src/shared/types.ts index 83e7756ab..88c0130ba 100644 --- a/src/shared/types.ts +++ b/src/shared/types.ts @@ -230,6 +230,7 @@ export enum ModelProviderEnum { Perplexity = 'perplexity', XAI = 'xAI', Custom = 'custom', + HuaweiCloudMaaS = 'huaweicloud-maas', } export type ModelProvider = ModelProviderEnum | string