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;
    }