UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

203 lines (202 loc) 8.18 kB
import { t as createProviderApiKeyAuthMethod } from "../../provider-api-key-auth-VMMQYUA9.js"; import "../../provider-auth-api-key-nSdfYNnB.js"; import { t as defineSingleProviderPluginEntry } from "../../provider-entry-Dh06UXOP.js"; import { P as isQwenCodingPlanBaseUrl, b as QWEN_OAUTH_PROVIDER_ID, h as QWEN_DEFAULT_MODEL_REF, u as QWEN_36_PLUS_MODEL_ID, w as applyQwenNativeStreamingUsageCompat, y as QWEN_OAUTH_DEFAULT_MODEL_REF } from "../../models-BMEcWkNl.js"; import { n as buildQwenOAuthProvider, r as buildQwenProvider } from "../../provider-catalog-CLEGhkDB.js"; import { n as wrapQwenProviderStream } from "../../stream-9N8R020V.js"; import "../../api-BYzvrIfn.js"; import { t as buildQwenMediaUnderstandingProvider } from "../../media-understanding-provider-Y4CFain-.js"; import { d as applyQwenOAuthConfig, f as applyQwenStandardConfig, l as applyQwenConfig, p as applyQwenStandardConfigCn, u as applyQwenConfigCn } from "../../onboard-BA4YnGHC.js"; import { t as buildQwenVideoGenerationProvider } from "../../video-generation-provider-BYTHh9w4.js"; //#region extensions/qwen/index.ts const PROVIDER_ID = "qwen"; const LEGACY_PROVIDER_ID = "modelstudio"; const QWEN_OAUTH_AUTH_PROVIDER_IDS = [ QWEN_OAUTH_PROVIDER_ID, "qwen-portal", "qwen-cli" ]; function normalizeProviderId(value) { return value.trim().toLowerCase(); } function resolveConfiguredQwenBaseUrl(config) { const providers = config?.models?.providers; if (!providers) return; for (const [providerId, provider] of Object.entries(providers)) { const normalized = normalizeProviderId(providerId); if (normalized !== PROVIDER_ID && normalized !== LEGACY_PROVIDER_ID) continue; const baseUrl = provider?.baseUrl?.trim(); if (baseUrl) return baseUrl; } } var qwen_default = defineSingleProviderPluginEntry({ id: PROVIDER_ID, name: "Qwen Provider", description: "Bundled Qwen Cloud provider plugin", provider: { label: "Qwen Cloud", docsPath: "/providers/qwen", aliases: ["modelstudio", "qwencloud"], auth: [ { methodId: "standard-api-key-cn", label: "Standard API Key for China (pay-as-you-go)", hint: "Endpoint: dashscope.aliyuncs.com", optionKey: "modelstudioStandardApiKeyCn", flagName: "--modelstudio-standard-api-key-cn", envVar: "QWEN_API_KEY", promptMessage: "Enter Qwen Cloud API key (China standard endpoint)", defaultModel: QWEN_DEFAULT_MODEL_REF, applyConfig: (cfg) => applyQwenStandardConfigCn(cfg), noteMessage: [ "Manage API keys: https://home.qwencloud.com/api-keys", "Docs: https://docs.qwencloud.com/", "Endpoint: dashscope.aliyuncs.com/compatible-mode/v1", "Models: qwen3.6-plus, qwen3.5-plus, qwen3-coder-plus, etc." ].join("\n"), noteTitle: "Qwen Cloud Standard (China)", wizard: { choiceHint: "Endpoint: dashscope.aliyuncs.com", groupLabel: "Qwen Cloud", groupHint: "Standard / Coding Plan (CN / Global) + multimodal roadmap" } }, { methodId: "standard-api-key", label: "Standard API Key for Global/Intl (pay-as-you-go)", hint: "Endpoint: dashscope-intl.aliyuncs.com", optionKey: "modelstudioStandardApiKey", flagName: "--modelstudio-standard-api-key", envVar: "QWEN_API_KEY", promptMessage: "Enter Qwen Cloud API key (Global/Intl standard endpoint)", defaultModel: QWEN_DEFAULT_MODEL_REF, applyConfig: (cfg) => applyQwenStandardConfig(cfg), noteMessage: [ "Manage API keys: https://home.qwencloud.com/api-keys", "Docs: https://docs.qwencloud.com/", "Endpoint: dashscope-intl.aliyuncs.com/compatible-mode/v1", "Models: qwen3.6-plus, qwen3.5-plus, qwen3-coder-plus, etc." ].join("\n"), noteTitle: "Qwen Cloud Standard (Global/Intl)", wizard: { choiceHint: "Endpoint: dashscope-intl.aliyuncs.com", groupLabel: "Qwen Cloud", groupHint: "Standard / Coding Plan (CN / Global) + multimodal roadmap" } }, { methodId: "api-key-cn", label: "Coding Plan API Key for China (subscription)", hint: "Endpoint: coding.dashscope.aliyuncs.com", optionKey: "modelstudioApiKeyCn", flagName: "--modelstudio-api-key-cn", envVar: "QWEN_API_KEY", promptMessage: "Enter Qwen Cloud Coding Plan API key (China)", defaultModel: QWEN_DEFAULT_MODEL_REF, applyConfig: (cfg) => applyQwenConfigCn(cfg), noteMessage: [ "Manage API keys: https://home.qwencloud.com/api-keys", "Docs: https://docs.qwencloud.com/", "Endpoint: coding.dashscope.aliyuncs.com", "Models: qwen3.5-plus, glm-5, kimi-k2.5, MiniMax-M2.5, etc." ].join("\n"), noteTitle: "Qwen Cloud Coding Plan (China)", wizard: { choiceHint: "Endpoint: coding.dashscope.aliyuncs.com", groupLabel: "Qwen Cloud", groupHint: "Standard / Coding Plan (CN / Global) + multimodal roadmap" } }, { methodId: "api-key", label: "Coding Plan API Key for Global/Intl (subscription)", hint: "Endpoint: coding-intl.dashscope.aliyuncs.com", optionKey: "modelstudioApiKey", flagName: "--modelstudio-api-key", envVar: "QWEN_API_KEY", promptMessage: "Enter Qwen Cloud Coding Plan API key (Global/Intl)", defaultModel: QWEN_DEFAULT_MODEL_REF, applyConfig: (cfg) => applyQwenConfig(cfg), noteMessage: [ "Manage API keys: https://home.qwencloud.com/api-keys", "Docs: https://docs.qwencloud.com/", "Endpoint: coding-intl.dashscope.aliyuncs.com", "Models: qwen3.5-plus, glm-5, kimi-k2.5, MiniMax-M2.5, etc." ].join("\n"), noteTitle: "Qwen Cloud Coding Plan (Global/Intl)", wizard: { choiceHint: "Endpoint: coding-intl.dashscope.aliyuncs.com", groupLabel: "Qwen Cloud", groupHint: "Standard / Coding Plan (CN / Global) + multimodal roadmap" } } ], catalog: { run: async (ctx) => { const apiKey = ctx.resolveProviderApiKey(PROVIDER_ID).apiKey; if (!apiKey) return null; return { provider: { ...buildQwenProvider({ baseUrl: resolveConfiguredQwenBaseUrl(ctx.config) ?? "https://coding-intl.dashscope.aliyuncs.com/v1" }), apiKey } }; } }, applyNativeStreamingUsageCompat: ({ providerConfig }) => applyQwenNativeStreamingUsageCompat(providerConfig), wrapStreamFn: wrapQwenProviderStream, normalizeConfig: ({ providerConfig }) => { if (!isQwenCodingPlanBaseUrl(providerConfig.baseUrl)) return; const models = providerConfig.models?.filter((model) => model.id !== QWEN_36_PLUS_MODEL_ID); return models && models.length !== providerConfig.models?.length ? { ...providerConfig, models } : void 0; } }, register(api) { api.registerProvider({ id: QWEN_OAUTH_PROVIDER_ID, label: "Qwen OAuth", docsPath: "/providers/qwen", aliases: ["qwen-portal", "qwen-cli"], envVars: ["QWEN_API_KEY"], auth: [createProviderApiKeyAuthMethod({ providerId: QWEN_OAUTH_PROVIDER_ID, methodId: "api-key", label: "Qwen OAuth token", hint: "Portal token for portal.qwen.ai", optionKey: "qwenOauthToken", flagName: "--qwen-oauth-token", envVar: "QWEN_API_KEY", promptMessage: "Enter Qwen OAuth token", defaultModel: QWEN_OAUTH_DEFAULT_MODEL_REF, applyConfig: (cfg) => applyQwenOAuthConfig(cfg), wizard: { choiceId: QWEN_OAUTH_PROVIDER_ID, choiceLabel: "Qwen OAuth", choiceHint: "Portal token for portal.qwen.ai", groupId: "qwen", groupLabel: "Qwen Cloud", groupHint: "Standard / Coding Plan / OAuth" } })], catalog: { order: "simple", run: async (ctx) => { const apiKey = QWEN_OAUTH_AUTH_PROVIDER_IDS.map((providerId) => ctx.resolveProviderApiKey(providerId).apiKey).find((candidate) => typeof candidate === "string" && candidate.length > 0); if (!apiKey) return null; return { provider: { ...buildQwenOAuthProvider(), apiKey } }; } }, staticCatalog: { order: "simple", run: async () => ({ provider: buildQwenOAuthProvider() }) }, wrapStreamFn: wrapQwenProviderStream }); api.registerMediaUnderstandingProvider(buildQwenMediaUnderstandingProvider()); api.registerVideoGenerationProvider(buildQwenVideoGenerationProvider()); } }); //#endregion export { qwen_default as default };