openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
86 lines (85 loc) • 3.86 kB
JavaScript
import { h as isOpenAICompatibleThinkingEnabled, o as createPayloadPatchStreamWrapper } from "./provider-stream-shared-BIV_zuwB.js";
import { l as normalizeProviderId } from "./provider-model-shared-D-lyTLvb.js";
//#region extensions/qwen/stream.ts
function isQwenProviderId(providerId) {
const normalized = normalizeProviderId(providerId);
return normalized === "qwen" || normalized === "qwen-oauth" || normalized === "qwen-portal" || normalized === "qwen-cli" || normalized === "modelstudio" || normalized === "qwencloud" || normalized === "dashscope";
}
function isQwenOAuthProviderId(providerId) {
const normalized = normalizeProviderId(providerId);
return normalized === "qwen-oauth" || normalized === "qwen-portal" || normalized === "qwen-cli";
}
function normalizeQwenOAuthContent(content) {
if (typeof content === "string") return [{
type: "text",
text: content
}];
if (!Array.isArray(content)) return content;
const normalized = content.map((part) => {
if (typeof part === "string") return {
type: "text",
text: part
};
return part && typeof part === "object" ? part : void 0;
}).filter((part) => Boolean(part));
return normalized.length > 0 ? normalized : content;
}
function patchQwenOAuthPayload(payload) {
const messages = payload.messages;
if (!Array.isArray(messages)) return;
for (const message of messages) {
if (!message || typeof message !== "object") continue;
const record = message;
record.content = normalizeQwenOAuthContent(record.content);
if (record.role !== "system" || !Array.isArray(record.content) || record.content.length === 0) continue;
const last = record.content[record.content.length - 1];
if (last && typeof last === "object") last.cache_control = { type: "ephemeral" };
}
payload.vl_high_resolution_images = true;
}
function setQwenChatTemplateThinking(payload, enabled) {
const existing = payload.chat_template_kwargs;
if (existing && typeof existing === "object" && !Array.isArray(existing)) {
const next = {
...existing,
enable_thinking: enabled
};
if (!Object.hasOwn(next, "preserve_thinking")) next.preserve_thinking = true;
payload.chat_template_kwargs = next;
return;
}
payload.chat_template_kwargs = {
enable_thinking: enabled,
preserve_thinking: true
};
}
function readQwenThinkingFormatFromModel(model) {
if (model.api !== "openai-completions") return;
const compat = model.compat && typeof model.compat === "object" ? model.compat : void 0;
return typeof compat?.thinkingFormat === "string" ? compat.thinkingFormat : void 0;
}
function createQwenThinkingWrapper(baseStreamFn, thinkingLevel, thinkingFormat) {
return createPayloadPatchStreamWrapper(baseStreamFn, ({ payload: payloadObj, model, options }) => {
const enableThinking = isOpenAICompatibleThinkingEnabled({
thinkingLevel,
options
});
if ((thinkingFormat ?? readQwenThinkingFormatFromModel(model)) === "qwen-chat-template") {
setQwenChatTemplateThinking(payloadObj, enableThinking);
delete payloadObj.enable_thinking;
} else payloadObj.enable_thinking = enableThinking;
delete payloadObj.reasoning_effort;
delete payloadObj.reasoningEffort;
delete payloadObj.reasoning;
}, { shouldPatch: ({ model }) => model.api === "openai-completions" && model.reasoning });
}
function wrapQwenProviderStream(ctx) {
if (!isQwenProviderId(ctx.provider) || ctx.model && ctx.model.api !== "openai-completions") return;
const streamFn = createQwenThinkingWrapper(ctx.streamFn, ctx.thinkingLevel, ctx.model ? readQwenThinkingFormatFromModel(ctx.model) : void 0);
if (!isQwenOAuthProviderId(ctx.provider)) return streamFn;
return createPayloadPatchStreamWrapper(streamFn, ({ payload, model }) => {
if (model.api === "openai-completions") patchQwenOAuthPayload(payload);
});
}
//#endregion
export { wrapQwenProviderStream as n, createQwenThinkingWrapper as t };