openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
203 lines (202 loc) • 8.18 kB
JavaScript
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 };