跳转到内容

流式输入

React 与 Vue 适配器在每次更新时都接收当前完整的 Markdown 字符串。由应用负责接收并解码传输文本、累积源文本,并向渲染器告知生成端是否仍在输出。

对于常见的对话回答,从空字符串开始,并将解码后的文本持续追加到应用状态中。把这一累积的完整字符串传给 content。网络数据包可能在单词、代码块标记或数学公式中间截断;接收到的网络分块不是独立的 Markdown 组件。

术语含义
传输增量(Transport delta)传输层完成解码与分帧后最新接收到的文本片段
累积源文本(Accumulated source)当前消息接收到的全部文本;即传递给渲染器的 content
可见前缀(Visible prefix)启用平滑呈现(smooth reveal)时当前已显示的部分
Markdown 渲染单元(Markdown unit)单个独立解析渲染的组件实例;通常对应整条消息
逻辑文档(Logical document)有意共享引用定义的一个或多个 Markdown 渲染单元

渲染器本身不包含 Fetch 请求、SSE 分帧、UTF-8 字符解码、请求取消或网络重试。特别需要注意,Fetch 读取器产出的原始字节块不等于完整的 SSE 事件。传输分帧与取消处理的完整示例见 React 聊天示例

streaming 描述生成端是否还在输出。增量解析由独立的 incrementalParse 控制,两个适配器在客户端默认均设为 true

基础渲染器直接呈现当前的源文本。平滑渲染器在生成端结束后,可能仍有积压文本在排队显示,其内部流式状态会保持到积压排空为止。因此,由网络传输层驱动请求完成状态;由平滑 Hook 或组合式函数返回的状态驱动展示界面的打字动画。

平滑渲染在开始时直接显示已有内容,包括服务端渲染(SSR)和重新挂载的内容。后续追加的文本才播放动画;直接替换源文本时则立即显示新内容。如果希望新消息在后续追加时播放平滑动画,挂载时应将初始内容设为空字符串。不要期望挂载已生成的完整回答会重新播放动画。

生成正常结束时,将传入的 streaming 设为 false。若操作被取消,请中止网络请求并停止更新文本,随后清除 streaming 状态。此时已接收到的文本仍会通过平滑渲染器自然显示完毕。应用可以根据业务需求决定取消时是保留还是丢弃已接收文本。

支持直接替换 content。若新消息需要开启新的跨片段协调轮次,请分配新的组件注册;本次注册完成后,不会因替换内容重新进入队列。详见文档与引用

使用专用的光标组件或插槽,不要将光标字符拼入 Markdown 源文本中。这样可以避免光标干扰语法解析、被用户复制到剪贴板,或意外保存到数据库正文中。