Node
private apiKey = 'sk-x';
async qwenChat (options: QwenChatRequest) {
// Content-Type: application/json
const headers: Record<string, string> = {
Authorization: `Bearer ${this.apiKey}`,
'Content-Type': 'application/json',
};
if (!options?.input?.prompt) {
this.logger.error('prompt is required');
throw new Error('prompt is required');
}
options.model = options.model || 'qwen-max';
(options.parameters = options.parameters || {}).max_tokens = options.parameters.max_tokens || 500;
const qwenResult: any = await got.post('<https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation>', {
headers,
json: options,
})
.json();
return qwenResult?.output?.text;
}
/**
* @description 调用通义千问模型生成对话
* @param {QwenChatRequest} options
* @param {boolean} [useSSE=false]
* @returns {Promise<QianwenChatResponse>}
* @memberof QianwenChatService
*/
async qwenChatStream (observer: Subscriber<any>, options: QwenChatRequest) {
const headers: Record<string, string> = {
Authorization: `Bearer ${this.apiKey}`,
'Content-Type': 'application/json',
'X-DashScope-SSE': 'enable',
};
if (!options?.input?.prompt) {
this.logger.error('prompt is required');
observer.error(new Error('prompt is required'));
}
options.model = options.model || 'qwen-max';
(options.parameters = options.parameters || {}).max_tokens = options.parameters.max_tokens || 500;
// 增加增量输出参数
(options.parameters = options.parameters || {}).incremental_output = true;
const stream = await got.stream.post('<https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation>', {
headers,
json: options,
});
stream.on('data', (chunk) => {
const chunkString = chunk.toString();
console.log(`chunk: ${chunkString}`);
// chunk: id:9
// event:result
// :HTTP_STATUS/200
// data:{"output":{"finish_reason":"null","text":"随时随地唤醒活力!\\n\\n碎冰感席卷"},"usage":{"total_tokens":322,"input_tokens":274,"output_tokens":48},"request_id":"4fe4ccb9-8227-92ad-9256-2b8a30981824"}
// 提取JSON字符串部分
const jsonString = chunkString.split('\\n').find(line => line.startsWith('data:'));
// 解析JSON字符串为对象
const data = JSON.parse(jsonString.slice(5));
if (data?.output?.finish_reason !== 'null') {
stream.destroy();
observer.complete();
} else {
// 获取所需的文本值
const outputText = data?.output?.text;
observer.next({ data: outputText });
}
});
stream.on('error', (err) => {
observer.error(err);
});
stream.on('end', () => {
observer.complete();
});
}
async qwenVlChat (options: QwenVlChatRequest) {
// Content-Type: application/json
const headers: Record<string, string> = {
Authorization: `Bearer ${this.apiKey}`,
'Content-Type': 'application/json',
};
if (!options?.input?.messages) {
this.logger.error('messages is required');
throw new Error('messages is required');
}
options.model = options.model || 'qwen-vl-chat-v1';
const qwenResult: any = await got.post('<https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation>', {
headers,
json: options,
}).json();
console.log(JSON.stringify(qwenResult));
return qwenResult?.output?.choices[0]?.message?.content;
}