Skip to content

Commit e4fdc8e

Browse files
committed
feat(streaming): Implement pseudo-streaming
to give the illusion of a continuous stream of text Signed-off-by: Marcel Klehr <mklehr@gmx.net>
1 parent 6fae68c commit e4fdc8e

2 files changed

Lines changed: 26 additions & 1 deletion

File tree

src/components/ChattyLLM/ConversationBox.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,12 @@
3333
@delete="deleteMessage(message.id)" />
3434
<Message v-if="streamingMessage"
3535
:id="'message-streaming'"
36+
:key="'message-streaming'"
3637
:message="streamingMessage"
3738
:streaming="true" />
3839
<LoadingPlaceholder v-else-if="loading.llmGeneration"
3940
:id="'message-placeholder'"
41+
:key="'message-placeholder'"
4042
:slow-pickup="slowPickup" />
4143
</div>
4244
</div>

src/components/ChattyLLM/Message.vue

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
<NcDateTime class="message__header__timestamp" :timestamp="new Date((message?.timestamp ?? 0) * 1000)" :ignore-seconds="true" />
5858
</div>
5959
<NcRichText class="message__content"
60-
:text="message.content"
60+
:text="streaming ? streamedMessageContent : message.content"
6161
:use-markdown="true"
6262
:reference-limit="1"
6363
:references="references"
@@ -158,6 +158,7 @@ export default {
158158
// with [] we inhibit the extract+resolve mechanism on NcRichText
159159
// TODO This can be removed (and all the custom extract+resolve logic) when fixed in NcRichText
160160
references: [],
161+
streamedMessageContent: '',
161162
}
162163
},
163164
@@ -178,6 +179,28 @@ export default {
178179
},
179180
},
180181
182+
watch: {
183+
// Pseudo streaming
184+
async 'message.content'(messageContent, oldMessageContent) {
185+
if (!this.streaming) {
186+
return
187+
}
188+
if (oldMessageContent) {
189+
this.streamedMessageContent = oldMessageContent
190+
messageContent = messageContent.replace(oldMessageContent, '')
191+
}
192+
let cachedStreamedMessageContent
193+
for (const char of messageContent.split('')) {
194+
this.streamedMessageContent += char
195+
cachedStreamedMessageContent = this.streamedMessageContent
196+
await new Promise(resolve => setTimeout(resolve, 5))
197+
if (cachedStreamedMessageContent !== this.streamedMessageContent) {
198+
break
199+
}
200+
}
201+
},
202+
},
203+
181204
mounted() {
182205
this.fetch()
183206
},

0 commit comments

Comments
 (0)