fix: reduce markdown streaming lag (#9097)

* fix: reduce markdown streaming lag

* refactor: centralize markdown live node limit
This commit is contained in:
Simon He
2026-07-01 08:53:21 +08:00
committed by GitHub
parent 41f8960302
commit 372b9f5bfc
6 changed files with 90 additions and 61 deletions

View File

@@ -31,14 +31,14 @@
"katex": "^0.16.27",
"lodash": "4.17.23",
"markdown-it": "^14.1.1",
"markstream-vue": "1.0.1-beta.1",
"markstream-vue": "1.0.5-beta.0",
"mermaid": "^11.12.2",
"monaco-editor": "^0.52.2",
"pinia": "2.1.6",
"pinyin-pro": "^3.26.0",
"qrcode": "^1.5.4",
"shiki": "^3.20.0",
"stream-markdown": "^0.0.15",
"shiki": "^3.23.0",
"stream-markdown": "^0.0.16",
"vee-validate": "4.11.3",
"vite-plugin-vuetify": "2.1.3",
"vue": "3.3.4",

135
dashboard/pnpm-lock.yaml generated
View File

@@ -58,8 +58,8 @@ importers:
specifier: ^14.1.1
version: 14.1.1
markstream-vue:
specifier: 1.0.1-beta.1
version: 1.0.1-beta.1(katex@0.16.28)(mermaid@11.12.2)(stream-markdown@0.0.15(shiki@3.22.0)(vue@3.3.4))(vue-i18n@11.2.8(vue@3.3.4))(vue@3.3.4)
specifier: 1.0.5-beta.0
version: 1.0.5-beta.0(katex@0.16.28)(mermaid@11.12.2)(stream-markdown@0.0.16(shiki@3.23.0)(vue@3.3.4))(vue-i18n@11.2.8(vue@3.3.4))(vue@3.3.4)
mermaid:
specifier: ^11.12.2
version: 11.12.2
@@ -76,11 +76,11 @@ importers:
specifier: ^1.5.4
version: 1.5.4
shiki:
specifier: ^3.20.0
version: 3.22.0
specifier: ^3.23.0
version: 3.23.0
stream-markdown:
specifier: ^0.0.15
version: 0.0.15(shiki@3.22.0)(vue@3.3.4)
specifier: ^0.0.16
version: 0.0.16(shiki@3.23.0)(vue@3.3.4)
vee-validate:
specifier: 4.11.3
version: 4.11.3(vue@3.3.4)
@@ -676,21 +676,27 @@ packages:
'@shikijs/core@3.22.0':
resolution: {integrity: sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==}
'@shikijs/engine-javascript@3.22.0':
resolution: {integrity: sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==}
'@shikijs/core@3.23.0':
resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==}
'@shikijs/engine-oniguruma@3.22.0':
resolution: {integrity: sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==}
'@shikijs/engine-javascript@3.23.0':
resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==}
'@shikijs/langs@3.22.0':
resolution: {integrity: sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==}
'@shikijs/engine-oniguruma@3.23.0':
resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==}
'@shikijs/themes@3.22.0':
resolution: {integrity: sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==}
'@shikijs/langs@3.23.0':
resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==}
'@shikijs/themes@3.23.0':
resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==}
'@shikijs/types@3.22.0':
resolution: {integrity: sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==}
'@shikijs/types@3.23.0':
resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==}
'@shikijs/vscode-textmate@10.0.2':
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
@@ -2134,6 +2140,9 @@ packages:
linkify-it@5.0.0:
resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
linkify-it@5.0.1:
resolution: {integrity: sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==}
loader-runner@4.3.1:
resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==}
engines: {node: '>=6.11.5'}
@@ -2187,8 +2196,8 @@ packages:
markdown-it-task-checkbox@1.0.6:
resolution: {integrity: sha512-7pxkHuvqTOu3iwVGmDPeYjQg+AIS9VQxzyLP9JCg9lBjgPAJXGEkChK6A2iFuj3tS0GV3HG2u5AMNhcQqwxpJw==}
markdown-it-ts@1.0.0:
resolution: {integrity: sha512-hQT/yCYryC3jNs2wJ35R4m1zKcBxNuFaKCGzwpmq2OuMXMNbUK1oTwCxONIjy5lXWWG1UCNbGXe1nbTiWbH/iA==}
markdown-it-ts@1.0.2:
resolution: {integrity: sha512-zba9mN313K2HmKk+BOHqkO/nuZtj9M1TTnUlSbItGrCMpYzc8OHGCm+IaqxWCi2pGcgpiFC8ltxkasYWYpp/YQ==}
engines: {node: '>=18'}
markdown-it@14.1.1:
@@ -2200,18 +2209,18 @@ packages:
engines: {node: '>= 20'}
hasBin: true
markstream-core@1.0.0:
resolution: {integrity: sha512-V39W0rPgJ5Yj/XEl11LaKQxX9dYOI34RL729Zoi9oyy/Y6z6H+PJOsBFktu7gU9ZZxCsevWMb/Re2LgSKbWfRg==}
markstream-core@1.0.3:
resolution: {integrity: sha512-QXn+yERo1q+RD6YlGDW61zc/af65uhkQEH3K8YvEKkprHbgRJ/JIeBeEQjELCTyBnPoxqtKQ7I565rylY+PePg==}
markstream-vue@1.0.1-beta.1:
resolution: {integrity: sha512-45br3sbOQirIg0tmPMWRmdWk/vLE5aJtVx7cvLaa3e+klyYpILzQ7c4eOMq2EZkQTVewJhZHUVc2FTj+ujUJPg==}
markstream-vue@1.0.5-beta.0:
resolution: {integrity: sha512-/gmcNKa7v6qqmwQ/JAn3sWUoiM+EaMkvS0X5YRgqD74d+G22dzua4X8ZViYpbDGR/bl7BTw3juzsRfC0dm15pw==}
peerDependencies:
'@antv/infographic': ^0.2.3
'@terrastruct/d2': '>=0.1.33'
katex: '>=0.16.22'
mermaid: '>=11'
stream-markdown: '>=0.0.15'
stream-monaco: '>=0.0.41'
stream-markdown: '>=0.0.16'
stream-monaco: '>=0.0.45'
vue: '>=3.0.0'
vue-i18n: '>=9'
peerDependenciesMeta:
@@ -2740,8 +2749,8 @@ packages:
vue:
optional: true
shiki@3.22.0:
resolution: {integrity: sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==}
shiki@3.23.0:
resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==}
slash@3.0.0:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
@@ -2764,13 +2773,13 @@ packages:
state-local@1.0.7:
resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==}
stream-markdown-parser@1.0.0:
resolution: {integrity: sha512-uOYQ8G9YFFtGM726fK77O/mJPYrwYHPy0DKBtk7bCPmkf06XwDVSOAFRTo2FsXnZ3vAaPBtxOgNGJ0CGieBcSQ==}
stream-markdown-parser@1.0.8:
resolution: {integrity: sha512-+Oo9ik7BtMBxf+Krh19YA0jmk+TIUxfULU5qQpWHo3Z4SBX74/Qwt6lVHcUvEcUQcd1kV35VNmw1SYdhBY4aOA==}
stream-markdown@0.0.15:
resolution: {integrity: sha512-1WlzjZUb9W5BWZYMKCr2/exPVh5P7HIhHzkcYZczkXm0upiuN4zEddwjdckL+WSQWGGlv9bboXCqcTYCEgqexw==}
stream-markdown@0.0.16:
resolution: {integrity: sha512-2WoOxlpc3N5RLc3zGuW+g/w76z6ketWBY0N1YzDYbXds1qw7zrUBv5PTQ3DOtpqgCjLuF3P2iCfjJTEqWGv0NQ==}
peerDependencies:
shiki: '>=3.13.0'
shiki: '>=3.23.0'
string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
@@ -3599,30 +3608,42 @@ snapshots:
'@types/hast': 3.0.4
hast-util-to-html: 9.0.5
'@shikijs/engine-javascript@3.22.0':
'@shikijs/core@3.23.0':
dependencies:
'@shikijs/types': 3.22.0
'@shikijs/types': 3.23.0
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
hast-util-to-html: 9.0.5
'@shikijs/engine-javascript@3.23.0':
dependencies:
'@shikijs/types': 3.23.0
'@shikijs/vscode-textmate': 10.0.2
oniguruma-to-es: 4.3.4
'@shikijs/engine-oniguruma@3.22.0':
'@shikijs/engine-oniguruma@3.23.0':
dependencies:
'@shikijs/types': 3.22.0
'@shikijs/types': 3.23.0
'@shikijs/vscode-textmate': 10.0.2
'@shikijs/langs@3.22.0':
'@shikijs/langs@3.23.0':
dependencies:
'@shikijs/types': 3.22.0
'@shikijs/types': 3.23.0
'@shikijs/themes@3.22.0':
'@shikijs/themes@3.23.0':
dependencies:
'@shikijs/types': 3.22.0
'@shikijs/types': 3.23.0
'@shikijs/types@3.22.0':
dependencies:
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
'@shikijs/types@3.23.0':
dependencies:
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
'@shikijs/vscode-textmate@10.0.2': {}
'@tiptap/core@2.27.2(@tiptap/pm@2.27.2)':
@@ -5268,6 +5289,10 @@ snapshots:
dependencies:
uc.micro: 2.1.0
linkify-it@5.0.1:
dependencies:
uc.micro: 2.1.0
loader-runner@4.3.1: {}
loader-utils@2.0.4:
@@ -5312,12 +5337,12 @@ snapshots:
markdown-it-task-checkbox@1.0.6: {}
markdown-it-ts@1.0.0:
markdown-it-ts@1.0.2:
dependencies:
'@types/linkify-it': 5.0.0
'@types/mdurl': 2.0.0
entities: 4.5.0
linkify-it: 5.0.0
linkify-it: 5.0.1
mdurl: 2.0.0
punycode.js: 2.3.1
uc.micro: 2.1.0
@@ -5333,19 +5358,19 @@ snapshots:
marked@16.4.2: {}
markstream-core@1.0.0: {}
markstream-core@1.0.3: {}
markstream-vue@1.0.1-beta.1(katex@0.16.28)(mermaid@11.12.2)(stream-markdown@0.0.15(shiki@3.22.0)(vue@3.3.4))(vue-i18n@11.2.8(vue@3.3.4))(vue@3.3.4):
markstream-vue@1.0.5-beta.0(katex@0.16.28)(mermaid@11.12.2)(stream-markdown@0.0.16(shiki@3.23.0)(vue@3.3.4))(vue-i18n@11.2.8(vue@3.3.4))(vue@3.3.4):
dependencies:
'@chenglou/pretext': 0.0.5
'@floating-ui/dom': 1.7.6
markstream-core: 1.0.0
stream-markdown-parser: 1.0.0
markstream-core: 1.0.3
stream-markdown-parser: 1.0.8
vue: 3.3.4
optionalDependencies:
katex: 0.16.28
mermaid: 11.12.2
stream-markdown: 0.0.15(shiki@3.22.0)(vue@3.3.4)
stream-markdown: 0.0.16(shiki@3.23.0)(vue@3.3.4)
vue-i18n: 11.2.8(vue@3.3.4)
math-intrinsics@1.1.0: {}
@@ -5885,14 +5910,14 @@ snapshots:
optionalDependencies:
vue: 3.3.4
shiki@3.22.0:
shiki@3.23.0:
dependencies:
'@shikijs/core': 3.22.0
'@shikijs/engine-javascript': 3.22.0
'@shikijs/engine-oniguruma': 3.22.0
'@shikijs/langs': 3.22.0
'@shikijs/themes': 3.22.0
'@shikijs/types': 3.22.0
'@shikijs/core': 3.23.0
'@shikijs/engine-javascript': 3.23.0
'@shikijs/engine-oniguruma': 3.23.0
'@shikijs/langs': 3.23.0
'@shikijs/themes': 3.23.0
'@shikijs/types': 3.23.0
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
@@ -5911,7 +5936,7 @@ snapshots:
state-local@1.0.7: {}
stream-markdown-parser@1.0.0:
stream-markdown-parser@1.0.8:
dependencies:
markdown-it-container: 4.0.0
markdown-it-footnote: 4.0.0
@@ -5920,11 +5945,11 @@ snapshots:
markdown-it-sub: 2.0.0
markdown-it-sup: 2.0.0
markdown-it-task-checkbox: 1.0.6
markdown-it-ts: 1.0.0
markdown-it-ts: 1.0.2
stream-markdown@0.0.15(shiki@3.22.0)(vue@3.3.4):
stream-markdown@0.0.16(shiki@3.23.0)(vue@3.3.4):
dependencies:
shiki: 3.22.0
shiki: 3.23.0
shiki-stream: 0.1.4(vue@3.3.4)
transitivePeerDependencies:
- react

View File

@@ -8,13 +8,14 @@
:smooth-streaming="isStreaming ? 'auto' : false"
:fade="false"
:typewriter="false"
:max-live-nodes="0"
:max-live-nodes="MARKDOWN_RENDER_MAX_LIVE_NODES"
/>
</template>
<script setup lang="ts">
import { computed, provide } from "vue";
import { MarkdownRender } from "markstream-vue";
import { MARKDOWN_RENDER_MAX_LIVE_NODES } from "@/components/chat/markdownRenderConfig";
import type { ChatThread } from "@/composables/useMessages";
const props = defineProps<{

View File

@@ -0,0 +1 @@
export const MARKDOWN_RENDER_MAX_LIVE_NODES = 320;

View File

@@ -9,7 +9,7 @@
:smooth-streaming="isStreaming ? 'auto' : false"
:fade="false"
:typewriter="false"
:max-live-nodes="0"
:max-live-nodes="MARKDOWN_RENDER_MAX_LIVE_NODES"
/>
</div>
</template>
@@ -17,6 +17,7 @@
<script setup lang="ts">
import { computed, provide } from "vue";
import { MarkdownRender } from "markstream-vue";
import { MARKDOWN_RENDER_MAX_LIVE_NODES } from "@/components/chat/markdownRenderConfig";
const props = defineProps<{
content: string;

View File

@@ -27,7 +27,7 @@
:fade="false"
:typewriter="false"
:is-dark="isDark"
:max-live-nodes="0"
:max-live-nodes="MARKDOWN_RENDER_MAX_LIVE_NODES"
/>
<div v-else-if="entry.tool" class="reasoning-tool-call-block">
@@ -62,6 +62,7 @@
<script setup lang="ts">
import { computed } from "vue";
import { MarkdownRender } from "markstream-vue";
import { MARKDOWN_RENDER_MAX_LIVE_NODES } from "@/components/chat/markdownRenderConfig";
import IPythonToolBlock from "@/components/chat/message_list_comps/IPythonToolBlock.vue";
import ToolCallCard from "@/components/chat/message_list_comps/ToolCallCard.vue";
import ToolCallItem from "@/components/chat/message_list_comps/ToolCallItem.vue";