更新记录
v1.0.0(2026-11-13) 下载此版本
H5 已用本地 SSE 服务验证逐段输出、多轮上下文、停止和重试,5 项自动测试通过
平台兼容性
UniChat 流式对话插件使用说明
UniChat 是一个面向 uni-app Vue 3 的聊天组件。它通过 POST 读取 SSE 响应,边接收边显示回复,支持多轮对话、停止生成、重新生成、复制和清空会话。插件 ID 为 lxm-streamchat,当前版本为 1.0.0。
安装
- 在插件市场点击「使用 HBuilderX 导入插件」,或解压插件包,把
lxm-streamchat文件夹复制到项目根目录的uni_modules下。 - 确认组件路径为
uni_modules/lxm-streamchat/components/lxm-streamchat/lxm-streamchat.vue。使用项目默认的 easycom 配置即可直接写<lxm-streamchat />,无需安装 npm 依赖。 - 将下方任一示例放入已注册的 Vue 3 页面。给组件外层容器设置明确的高度,聊天记录区才能在容器内滚动。
快速体验(无需后端)
运行下面的页面,点击「你好」或输入一条消息。文字会逐段显示,生成过程中可以点击输入框旁的按钮停止。
<template>
<view style="height: 75vh; display: flex; flex-direction: column">
<lxm-streamchat :stream="demoStream" :suggestions="['你好']" />
</view>
</template>
<script setup>
function demoStream({ messages, onDelta, onFinish }) {
const lastMessage = messages[messages.length - 1]
const parts = ['你刚才说了:', lastMessage.content, '\n\n这是一条本地流式回复。']
const timer = setInterval(() => {
onDelta(parts.shift())
if (!parts.length) onFinish()
}, 400)
return () => clearInterval(timer)
}
</script>
如果你下载了完整示例工程,也可以运行 npm ci 和 npm run dev:h5。示例页默认使用本地演示。要验证真实 HTTP 分块,在另一个终端运行 npm run mock:sse,然后点击页面顶部的「本地演示」,把接口地址填为 http://127.0.0.1:8787/api/chat。
接入自己的 SSE 后端
把 endpoint 替换成业务后端的完整地址。如果接口要求前端传模型名,使用 request-data。如果接口需要鉴权,使用 headers 传业务会话令牌,模型供应商的 API 密钥应保存在业务后端。
<template>
<view style="height: 75vh; display: flex; flex-direction: column">
<lxm-streamchat
endpoint="https://example.com/api/chat"
:suggestions="['你好', '介绍一下流式对话']"
@finish="onFinish"
@error="onError"
/>
</view>
</template>
<script setup>
function onFinish({ content }) {
console.log('收到回复', content)
}
function onError({ message }) {
console.error('生成失败', message)
}
</script>
例如,已有 sessionToken 和 modelName 时,可以加上 :headers="{ Authorization: 'Bearer ' + sessionToken }" 和 :request-data="{ model: modelName }"。
请求格式
组件发送 JSON 格式的 POST 请求,默认请求头为 Content-Type: application/json 和 Accept: text/event-stream。messages 和 stream: true 由组件生成。配置 system-prompt 后,系统消息会出现在数组首位。多轮请求会携带此前的用户消息和已完成的助手回复。停止或出错时的部分回复保留在界面中。
{
"messages": [
{ "role": "user", "content": "你好" }
],
"stream": true
}
响应格式
服务端返回 HTTP 2xx 和 Content-Type: text/event-stream; charset=utf-8,生成一段就写出一条事件。下面分别展示 OpenAI Chat Completions 格式和简化 JSON 格式。两种格式都只传本次新增的文本,组件会把增量追加到当前回复。
data: {"choices":[{"delta":{"content":"你好"}}]}
data: {"delta":",有什么可以帮你?"}
data: [DONE]
每条事件以空行结束,例如 data: [DONE]\n\n。正常结束时发送 data: [DONE] 或 event: done,随后关闭响应。若后端约定以正常关闭响应表示完成,可设置 :require-done="false"。业务错误可以用 data: {"error":{"message":"请求次数已达上限"}} 返回,也可以发送带 data 的 event: error。
属性
| 属性 | 默认值 | 说明 |
|---|---|---|
endpoint |
'' |
SSE 接口地址。 |
headers |
{} |
附加 HTTP 请求头,默认发送 Content-Type: application/json 和 Accept: text/event-stream。 |
request-data |
{} |
附加请求体字段。messages 和 stream 由组件生成。 |
system-prompt |
'' |
系统提示词。 |
stream |
undefined |
自定义流式适配器。传入时由适配器负责请求。 |
timeout |
60000 |
单次生成总超时,单位毫秒。传入非正数时使用默认值。 |
require-done |
true |
内置 SSE 请求是否要求显式结束事件。 |
assistant-name |
助手 |
助手显示名称。 |
welcome-title |
开始一段对话 |
空会话标题。 |
welcome-text |
'' |
空会话说明。 |
suggestions |
[] |
可点击发送的推荐问题字符串。 |
placeholder |
输入消息… |
输入框占位文字。 |
max-length |
4000 |
单条消息长度上限,-1 取消组件的长度校验。 |
auto-scroll |
true |
收到回复时滚动到末尾。 |
adjust-position |
true |
是否让 textarea 随软键盘调整页面。使用 adjustResize 的 App 页面可设为 false。 |
事件、方法与插槽
| 事件 | 参数 |
|---|---|
send |
{ text, id, messages },发送或重新生成时触发。id 是本轮助手消息 ID。 |
delta |
{ id, delta, content },短时间内的增量会合并,content 是当前累计回复。 |
finish |
{ id, content },完成时触发。 |
stop |
{ id, content },主动停止时触发。 |
error |
{ id, content, message },请求或输入校验失败时触发。输入校验失败的 id 为 null。 |
clear |
清空时触发。 |
为组件添加 ref="chat"。在 <script setup> 中从 vue 导入 ref,用 const chat = ref(null) 声明引用。组件挂载后即可调用 chat.value?.send('你好') 等实例方法。
| 方法 | 行为与返回值 |
|---|---|
send(text) |
组件接受消息并开始处理时返回 true。忙碌、空白或超长输入返回 false。生成结果通过事件返回。 |
stop() |
停止当前生成并保留已收到的文字。有请求可停止时返回 true。 |
retry() |
对最后一条停止或出错的助手回复重新生成,沿用原用户消息。成功发起时返回 true。 |
clear() |
终止请求,清空消息和输入框,并触发 clear。 |
getMessages() |
返回消息快照。每条消息包含 id、role、content、status,助手消息还包含 error。 |
消息状态包括 streaming、done、stopped、error。消息保存在组件实例中,需要保留历史时,可在 finish 等事件中读取快照并交给业务层保存。
#welcome 可替换空会话的欢迎内容。#footer 显示在输入框下方,适合放输入提示或使用说明。
自定义流式适配器
传入 :stream="myStream" 时,组件优先使用适配器。上面的 demoStream 就是一个可运行的适配器。适配器收到 messages、onDelta、onFinish 和 onError,应同步返回取消函数。每次收到新文本时调用 onDelta(文本增量),成功后调用 onFinish(),出错时调用 onError(error)。组件会在结束、出错、停止、清空和卸载时调用取消函数,用它关闭请求、定时器或其他资源。
平台与常见问题
| 平台 | 接入要求 | 验证状态 |
|---|---|---|
| H5 | 浏览器支持 fetch 和 ReadableStream。跨域请求由后端配置 CORS。 |
已完成 Chromium 浏览器端到端验证。 |
| 微信小程序 | 使用 HTTPS 接口并配置 request 合法域名。微信运行环境需支持 enableChunked 和 onChunkReceived。 |
已通过编译及模拟分块回调测试,待真机验证。 |
| App-vue | 使用 .vue 页面,WebView 需支持 Fetch 响应流。跨域请求由后端配置 CORS。 |
已通过 App 构建,待 Android 和 iOS 真机验证。 |
| 现象 | 检查项 |
|---|---|
| 页面看不到组件或聊天区无法滚动 | 检查插件目录、easycom 配置和外层容器高度。 |
| 回复在最后一次性出现 | 检查服务端是否逐条写出事件,以及反向代理是否缓冲了响应。 |
| 提示响应类型错误 | 检查响应头是否为 text/event-stream,以及网关是否返回了 JSON 或 HTML 错误页。 |
| 提示提前结束 | 检查最后一条事件是否包含结束标记和空行,以及连接是否中途断开。 |
| 浏览器报跨域错误 | 检查后端是否允许页面来源、POST 方法和 Content-Type、Authorization 等请求头。 |
| 提示接口未返回文本内容 | 检查 SSE 的 data 是否包含字符串类型的 choices[0].delta.content 或 delta。 |
插件安装规范见 DCloud uni_modules 文档。

收藏人数:
下载插件并导入HBuilderX
下载插件ZIP
下载 0
赞赏 0
下载 12763894
赞赏 1959
赞赏
京公网安备:11010802035340号