js流式数据的处理【这里以调用硅基流动的接口为例】

示例代码:

import fetch from 'node-fetch';

const messages = [];

fetch("https://api.siliconflow.cn/v1/chat/completions", {
    method: "POST",
    headers: {
        "Content-Type": "application/json",
        "Authorization": "Bearer "
    },
    body: JSON.stringify({
        "model": "Qwen/QwQ-32B",
        "stream": true,
        "max_tokens": 512,
        "temperature": 0.7,
        "top_p": 0.7,
        "top_k": 50,
        "frequency_penalty": 0.5,
        "n": 1,
        "messages": [
            { "content": "廖剑锋是谁", "role": "user" }
        ]
    })
}).then(async response => {
    if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`);
    }

    const textDecoder = new TextDecoder();
    let buffer = '';

    for await (const chunk of response.body) {
        const text = textDecoder.decode(chunk);
        buffer += text;

        const lines = buffer.split('\n');
        buffer = lines.pop() || '';

        for (const line of lines) {
            if (line.trim()) {
                try {
                    // Remove 'data: ' prefix and parse JSON
                    const jsonStr = line.replace(/^data: /, '').trim();
                    if (jsonStr === '[DONE]') continue;
                    
                    const res = JSON.parse(jsonStr);
                    
                    if (res.choices && res.choices[0].delta.content) {
                        if (messages.length === 0) {
                            messages.push({ content: '' });
                        }
                        messages[messages.length - 1].content += res.choices[0].delta.content;
                        console.log(res.choices[0].delta);
                    }
                } catch (parseError) {
                    console.error('Error parsing response:', parseError);
                }
            }
        }
    }
}).catch(error => {
    console.error('Fetch error:', error);
});

输出展示: