wujingjing
2025-02-20 68df4582c1edaf1952e6c21d769981e348fb3d04
流输出
已修改2个文件
30 ■■■■ 文件已修改
src/components/chat/Chat.vue 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/chat/assistant/index.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/chat/Chat.vue
@@ -114,6 +114,8 @@
        isTalking.value = !isTalking.value;
    });
};
let streamOutputIsStart = false;
let position: Position = null;
const questionAi = async (text) => {
    let judgeParams = null;
@@ -179,7 +181,6 @@
            params,
            (chunkRes) => {
                Logger.info('chunk response:\n\n' + JSON.stringify(chunkRes));
                if (chunkRes.mode === 'result') {
                    lastIsResult = true;
                    const res = chunkRes.value;
@@ -310,26 +311,44 @@
                const lastGroup = computedMessageList.value.at(-1).stepGroup[0];
                const stepList = lastGroup?.value ?? [];
                const currentTimeStamp = new Date().getTime();
                const ms = toMyFixed(currentTimeStamp - lastTimestamp, 2) + ' ms';
                if (chunkRes.mode === 'finish') {
                    const ms = toMyFixed(currentTimeStamp - lastTimestamp, 2) + ' ms';
                    stepList.at(-1).ms = ms;
                    isTalking.value = false;
                    streamOutputIsStart = false;
                    return;
                }
                if (stepList?.length >= 1) {
                    const ms = toMyFixed(currentTimeStamp - lastTimestamp, 2) + ' ms';
                    stepList.at(-1).ms = ms;
                } else {
                    const stepGroup = computedMessageList.value.at(-1).stepGroup;
                    if (stepGroup.length > 1) {
                        const lastStepList = stepGroup.at(-2).value;
                        const ms = toMyFixed(currentTimeStamp - lastTimestamp, 2) + ' ms';
                        lastStepList.at(-1).ms = ms;
                    }
                }
                lastTimestamp = currentTimeStamp;
                const stepItem = convertProcessItem(chunkRes);
                stepList.push(stepItem);
                if (!streamOutputIsStart) {
                    const stepItem = convertProcessItem(chunkRes);
                    stepList.push(stepItem);
                } else {
                    const lastItem = stepList.at(-1);
                    lastItem.title += chunkRes.value ?? '';
                }
                if (chunkRes.mode === 'begin_stream') {
                    streamOutputIsStart = true;
                }
                if (chunkRes.mode === 'end_stream') {
                    streamOutputIsStart = false;
                }
                // 强制触发更新
                scrollToBottom();
src/components/chat/assistant/index.vue
@@ -57,11 +57,12 @@
                                                </template>
                                                <template #title>
                                                    <span class="">
                                                        {{ subItem.title }}
                                                        <span v-html="subItem.title.replace(/\n/g, '<br>')"></span>
                                                        <span v-if="subItem.ms" class="text-green-600">{{ `(${subItem.ms})` }}</span></span
                                                    >
                                                </template>
                                                <template #description v-if="subItem?.subStep?.length > 0">
                                                    <div class="my-1 flex flex-col gap-1 text-[14px]">