@lobehub/chat
Version:
Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.
87 lines (81 loc) • 2.92 kB
text/typescript
import { ModelProvider } from '../types';
import { processMultiProviderModelList } from '../utils/modelParse';
import { createOpenAICompatibleRuntime } from '../utils/openaiCompatibleFactory';
import { QwenAIStream } from '../utils/streams';
export interface QwenModelCard {
id: string;
}
/*
QwenLegacyModels: A set of legacy Qwen models that do not support presence_penalty.
Currently, presence_penalty is only supported on Qwen commercial models and open-source models starting from Qwen 1.5 and later.
*/
export const QwenLegacyModels = new Set([
'qwen-72b-chat',
'qwen-14b-chat',
'qwen-7b-chat',
'qwen-1.8b-chat',
'qwen-1.8b-longcontext-chat',
]);
export const LobeQwenAI = createOpenAICompatibleRuntime({
baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
chatCompletion: {
handlePayload: (payload) => {
const { model, presence_penalty, temperature, thinking, top_p, enabledSearch, ...rest } =
payload;
return {
...rest,
...(['qwen3', 'qwen-turbo', 'qwen-plus'].some((keyword) =>
model.toLowerCase().includes(keyword),
)
? {
enable_thinking: thinking !== undefined ? thinking.type === 'enabled' : false,
thinking_budget:
thinking?.budget_tokens === 0 ? 0 : thinking?.budget_tokens || undefined,
}
: {}),
frequency_penalty: undefined,
model,
presence_penalty: QwenLegacyModels.has(model)
? undefined
: presence_penalty !== undefined && presence_penalty >= -2 && presence_penalty <= 2
? presence_penalty
: undefined,
stream: true,
temperature:
temperature !== undefined && temperature >= 0 && temperature < 2
? temperature
: undefined,
...(model.startsWith('qvq') || model.startsWith('qwen-vl')
? {
top_p: top_p !== undefined && top_p > 0 && top_p <= 1 ? top_p : undefined,
}
: {
top_p: top_p !== undefined && top_p > 0 && top_p < 1 ? top_p : undefined,
}),
...(enabledSearch && {
enable_search: enabledSearch,
search_options: {
/*
enable_citation: true,
enable_source: true,
*/
search_strategy: process.env.QWEN_SEARCH_STRATEGY || 'standard', // standard or pro
},
}),
...(payload.tools && {
parallel_tool_calls: true,
}),
} as any;
},
handleStream: QwenAIStream,
},
debug: {
chatCompletion: () => process.env.DEBUG_QWEN_CHAT_COMPLETION === '1',
},
models: async ({ client }) => {
const modelsPage = (await client.models.list()) as any;
const modelList: QwenModelCard[] = modelsPage.data;
return processMultiProviderModelList(modelList);
},
provider: ModelProvider.Qwen,
});