diff --git a/README.md b/README.md
index aab9a4995b2329f4fe2db84ae2bf1a9b51b6d100..21e1d23e18df2ec7872f8a8e6b1bf23290f8d3bd 100644
--- a/README.md
+++ b/README.md
@@ -2,4 +2,10 @@
- HBuilderX正式版 3.7.10+
- HBuilderX alpha版 3.8.0+
-### 文档已移至uni-ai-chat文档[https://uniapp.dcloud.net.cn/uniCloud/uni-ai-chat.html](https://uniapp.dcloud.net.cn/uniCloud/uni-ai-chat.html)
\ No newline at end of file
+### 文档已移至uni-ai-chat文档[https://uniapp.dcloud.net.cn/uniCloud/uni-ai-chat.html](https://uniapp.dcloud.net.cn/uniCloud/uni-ai-chat.html)
+
+### 在线体验
+
+地址:[https://chat.dcloud.net.cn](https://chat.dcloud.net.cn/#/)
+
+注意:需要使用HBuilder账号登录,限制:5条消息/账号/天
\ No newline at end of file
diff --git a/_README.md b/_README.md
index 98c434650011729e8b9fed482b5320702cc0959d..5c19f58a7e52266667280ffd21d6862cd36fa7f8 100644
--- a/_README.md
+++ b/_README.md
@@ -1,6 +1,6 @@
## 简介
-> 支持HBuilder版本,正式版 3.7.10+,alpha版 3.8.0+
+> 支持HBuilder版本,正式版 3.7.10+,Alpha版 3.8.0+
`uni-ai-chat`是基于[uni-ai](uni-ai.md)的聊天项目模板。它包含一个前端页面(路径:`/pages/chat/chat.vue`)和一个云对象(路径:`uniCloud/cloudfunctions/uni-ai-chat/index.obj.js`)
@@ -9,7 +9,13 @@
**插件下载地址:[https://ext.dcloud.net.cn/plugin?name=uni-ai-chat](https://ext.dcloud.net.cn/plugin?name=uni-ai-chat)**
视频效果:
-
+
+
+### 示例项目
+
+地址:[https://chat.dcloud.net.cn](https://chat.dcloud.net.cn/#/)
+
+注意:需要使用HBuilder账号登录,限制:5条消息/账号/天
## 体验步骤
@@ -21,7 +27,7 @@
6. 对项目根目录uniCloud点右键选择“云服务空间初始化向导”界面按提示部署项目
7. 在uni-app项目点右键,关联之前创建的服务空间。
8. 运行启动。
-9. 如果需要stream流式响应,需要在[dev.dcloud.net.cn](https://dev.dcloud.net.cn)的uni-push2中开通你的应用,然后把云函数上传到uniCloud服务空间,并且运行时在HBuilderX控制台选择`连接云端云函数`
+9. 如果需要stream流式响应,需要在[dev.dcloud.net.cn](https://dev.dcloud.net.cn)的uni-push2中开通你的应用
## 配置 @config
文件路径 `uniCloud/cloudfunctions/common/uni-config-center/uni-ai-chat/config.json`
@@ -35,7 +41,7 @@
| earnedScore | object | - | 配置积分的获取策略 |
| |- ad | Number | 3 | 观看1次广告可获得的积分数量 |
| |- price | Number | 3 | 支付1元可获得的积分数量(暂未支持) |
-| chatCompletionOptions | Object | - | 支持配置:`model`,`tokensToGenerate`(默认值:512),`temperature`,`topP` 详情查看:[https://uniapp.dcloud.net.cn/uniCloud/uni-ai.html#chat-completion](https://uniapp.dcloud.net.cn/uniCloud/uni-ai.html#chat-completion)|
+| chatCompletionOptions | Object | - | 支持配置:`model`,`deploymentId`,`tokensToGenerate`(默认值:512),`temperature`,`topP` 详情查看:[https://uniapp.dcloud.net.cn/uniCloud/uni-ai.html#chat-completion](https://uniapp.dcloud.net.cn/uniCloud/uni-ai.html#chat-completion)|
| llm | Object | - | 大语言模型配置,详情查看:[https://uniapp.dcloud.net.cn/uniCloud/uni-ai.html#get-llm-manager](https://uniapp.dcloud.net.cn/uniCloud/uni-ai.html#get-llm-manager) |
这里内置的内容安全是基于`uni-sec-check`插件,它是免费的,但有一些限制条件,请务必阅读该插件的文档:[https://uniapp.dcloud.net.cn/uniCloud/uni-sec-check.html](uni-sec-check.md)。
@@ -58,14 +64,12 @@
流式响应的流程图
-
+
流式响应的使用需客户端先通过 `new uniCloud.SSEChannel()` 创建 SSE 通道,并获得 `channel` 值(详情请参考:[https://uniapp.dcloud.net.cn/uniCloud/sse-channel.html#create-sse-channel](https://uniapp.dcloud.net.cn/uniCloud/sse-channel.html#create-sse-channel))。在客户端向 uniCloud 云对象发起请求时,需要将该 `channel` 值作为参数一同携带;然后 uniCloud 云对象与 uni-ai 建立 流式响应[(stream)](https://uniapp.dcloud.net.cn/uniCloud/uni-ai.html#chat-completion-stream) 通讯,云对象监听 uni-ai 返回的分片数据,在接收到数据后再通过 sse-channel ([反序列化消息通道](https://uniapp.dcloud.net.cn/uniCloud/sse-channel.html#cloud-deserialize-channel))向客户端推送消息。
### 注意事项 @heed
- 使用`sse-channel`需要先[开通uni-push](https://uniapp.dcloud.net.cn/unipush-v2.html#%E7%AC%AC%E4%B8%80%E6%AD%A5-%E5%BC%80%E9%80%9A)
-- 目前uni-push2.0不支持本地调试(后续版本会支持),需要在HBuilderX控制台,更改`连接本地云函数`为`连接云端云函数`。
-
## 营运专题@ad
v1.0.3起提供了商业化能力,与uni-ai对话消耗积分。
@@ -75,14 +79,14 @@ v1.0.3起提供了商业化能力,与uni-ai对话消耗积分。
**平台差异说明**
-|App|H5|微信小程序|支付宝小程序|百度小程序|字节跳动小程序|QQ小程序|快应用|360小程序|快手小程序|京东小程序|
+|App|H5|微信小程序|支付宝小程序|百度小程序|抖音小程序|QQ小程序|快应用|360小程序|快手小程序|京东小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√(3.4.8+)|x|√(3.4.8+)|x|x|x|x|x|x|x|x|
### 流程概述
1. 开通广告;在[uni-ad](https://uniad.dcloud.net.cn/)官网点击菜单`广告设置`在应用列表,找到你的应用点击`开通广告`
2. 创建激励视频广告位;在[应用列表](https://uniad.dcloud.net.cn/list/app)点击`应用详情`再点击`新建广告位`;如下图:广告类型选`激励视频广告`,配置服务器回调,选uni-ai-chat部署的uniCloud服务空间,回调云函数名称选:`reward-video-callback`
-
+
**微信小程序端注意**:
- 参考:[uniAD微信小程序广告开通指南](https://ask.dcloud.net.cn/article/39928)开通广告后会自动创建广告位
@@ -226,9 +230,6 @@ module.exports = async (obj) => {
- **错误信息:"Wx0e203209e27b1e66 插件未授权使用 添加插住(env: Windows,mp,1.06.2303060;1ib: 2.31.1)"**
请参考文档:[uniAD微信小程序广告开通指南](https://ask.dcloud.net.cn/article/39928)
-- **错误信息:"errMsg: "getPushClientId:fail uniPush is not enabled"**
- 需要在[dev.dcloud.net.cn](https://dev.dcloud.net.cn)的uni-push2中开通你的应用,更多uni-push2的介绍 详情参考[https://uniapp.dcloud.net.cn/unipush-v2.html](https://uniapp.dcloud.net.cn/unipush-v2.html)
-
## 其他
DCloud基于`uni-ai`提供了很多开源模板,除了本项目`uni-ai-chat`,还有:
diff --git a/changelog.md b/changelog.md
index 51117230678f1012ccf2cbc95bb671172178f9c2..6078a10571d037b74ead7304d773ceb3a1743444 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,5 @@
+## 1.2.4(2023-06-21)
+- 更新 改用optimizedMessage模式,即:收到AI响应的事件,基于message事件降频得到,使用此事件可以避免非常频繁的往客户端发送请求,导致部分情况下客户端处理消息卡顿。注意:云端新增于2023年6月21日,HBuilderX本地调试将于下次发版支持。
## 1.2.3(2023-06-19)
- 更新 默认不启用(注释掉)广告组件`uni-ad-rewarded-video`
## 1.2.2(2023-06-16)
diff --git a/package.json b/package.json
index c07739ab073d5bedca35d1b768a04db8d9b30b0f..419b35e52e00643b67133df6ff57e64d8f866327 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"id": "uni-ai-chat",
"name": "uni-ai-chat",
- "version": "1.2.3",
+ "version": "1.2.4",
"description": "基于uni-ai的聊天示例项目,支持流式、支持前文总结,云端一体",
"main": "main.js",
"scripts": {
diff --git a/pages/chat/SliceMsgToLastMsg.js b/pages/chat/SliceMsgToLastMsg.js
new file mode 100644
index 0000000000000000000000000000000000000000..c2f4f7606bbd959834501921fbe647103e092e9b
--- /dev/null
+++ b/pages/chat/SliceMsgToLastMsg.js
@@ -0,0 +1,34 @@
+export default class SliceMsgToLastMsg {
+ constructor(arg) {
+ this.$ = arg
+ }
+ // 所有待插入的消息数据
+ msgs = ''
+ // 是否正在分割消息数据
+ sliceMsgIng = false
+ addMsg(msg) {
+ // console.log('msg', msg);
+ this.msgs += msg
+ if (this.sliceMsgIng === false) {
+ this.sliceMsg()
+ }
+ }
+ sliceMsg() {
+ this.sliceMsgIng = true
+ let msg = this.msgs.slice(0, 1)
+ // console.log('msg', msg);
+ // 更新最后一条消息的内容
+ // console.log('this.$', this.$);
+ this.$.updateLastMsg(lastMsg => {
+ lastMsg.content += msg
+ })
+ this.msgs = this.msgs.slice(1)
+ if (this.msgs.length) {
+ setTimeout(() => {
+ this.sliceMsg(this.msgs)
+ }, 30);
+ } else {
+ this.sliceMsgIng = false
+ }
+ }
+}
\ No newline at end of file
diff --git a/pages/chat/chat.vue b/pages/chat/chat.vue
index 4824f3cb439f7ddf9be0f10f36c2240c5afe5bbf..e7186d49f84b7d6ef5c0783b52041164d0b0899a 100644
--- a/pages/chat/chat.vue
+++ b/pages/chat/chat.vue
@@ -72,7 +72,9 @@
import config from '@/config.js';
// 导入uniCloud云对象task模块
- import uniCoTask from '@/common/unicloud-co-task.js';
+ import uniCoTask from '@/common/unicloud-co-task.js';
+ // 导入 将多个字消息文本,分割成单个字 分批插入到最末尾的消息中 的类
+ import SliceMsgToLastMsg from './SliceMsgToLastMsg.js';
// 收集所有执行云对象的任务列表
let uniCoTaskList = []
// 定义终止并清空 云对象的任务列表中所有 任务的方法
@@ -565,10 +567,13 @@
// 流式响应和云对象的请求结束回调函数
let sseEnd,requestEnd;
// 判断是否开启了流式响应模式
- if (this.enableStream) {
+ if (this.enableStream) {
// 创建消息通道
sseChannel = new uniCloud.SSEChannel()
- // console.log('sseChannel',sseChannel);
+ // console.log('sseChannel',sseChannel);
+
+ // 将多个字的文本,分割成单个字 分批插入到最末尾的消息中
+ let sliceMsgToLastMsg = new SliceMsgToLastMsg(this)
// 监听message事件
sseChannel.on('message', (message) => {
// console.log('on message', message);
@@ -581,16 +586,17 @@
content: message,
create_time: Date.now()
})
- } else {
- this.updateLastMsg(lastMsg => {
- lastMsg.content += message
- })
+ } else {
+ sliceMsgToLastMsg.addMsg(message)
+ // this.updateLastMsg(lastMsg => {
+ // lastMsg.content += message
+ // })
}
this.showLastMsg()
// 让流式响应计数值递增
this.sseIndex++
- })
-
+ })
+
// 监听end事件,如果云端执行end时传了message,会在客户端end事件内收到传递的消息
sseChannel.on('end', (e) => {
console.log('sse 结束',e)
diff --git a/uniCloud-aliyun/cloudfunctions/uni-ai-chat/index.obj.js b/uniCloud-aliyun/cloudfunctions/uni-ai-chat/index.obj.js
index 6357ed84fe07af5125c07956cba88a090c0a3a1c..553c04dbc7592b8587b87b8bcc15c23d26969e37 100644
--- a/uniCloud-aliyun/cloudfunctions/uni-ai-chat/index.obj.js
+++ b/uniCloud-aliyun/cloudfunctions/uni-ai-chat/index.obj.js
@@ -320,7 +320,8 @@ module.exports = {
...chatCompletionOptions,
messages,
stream:stream && sseChannel !== false,
- sseChannel
+ sseChannel,
+ streamEventForSSE:"optimizedMessage"
})
}