Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
uni-ai-chat
提交
514360da
U
uni-ai-chat
项目概览
DCloud
/
uni-ai-chat
通知
893
Star
11
Fork
8
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
2
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
uni-ai-chat
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
2
Issue
2
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
514360da
编写于
6月 14, 2023
作者:
DCloud_JSON
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1.2.0
上级
d1ebe1f7
变更
10
展开全部
隐藏空白更改
内联
并排
Showing
10 changed file
with
516 addition
and
671 deletion
+516
-671
changelog.md
changelog.md
+3
-0
common/unicloud-co-task.js
common/unicloud-co-task.js
+0
-1
components/llm-config/llm-config.vue
components/llm-config/llm-config.vue
+1
-3
components/uni-ai-msg/uni-ai-msg.vue
components/uni-ai-msg/uni-ai-msg.vue
+21
-54
package.json
package.json
+1
-1
pages/chat/chat.vue
pages/chat/chat.vue
+131
-153
pages/chat/msgList.js
pages/chat/msgList.js
+0
-1
uniCloud-aliyun/cloudfunctions/reward-video-callback/index.js
...loud-aliyun/cloudfunctions/reward-video-callback/index.js
+1
-1
uniCloud-aliyun/cloudfunctions/uni-ai-chat/index.obj.js
uniCloud-aliyun/cloudfunctions/uni-ai-chat/index.obj.js
+355
-456
uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/uni-ai-chat/config.json
...unctions/common/uni-config-center/uni-ai-chat/config.json
+3
-1
未找到文件。
changelog.md
浏览文件 @
514360da
## 1.2.0(2023-06-14)
-
【重要】支持通过 uni-ai 计费网关发起调用
[
详情参考
](
https://uniapp.dcloud.net.cn/uniCloud/uni-ai.html#api
)
-
更新 大语言模型provider的值默认为:azure
## 1.1.5(2023-06-13)
-
修复 提供给AI做出总结的内容,多包含了最后一次提问的内容
## 1.1.4(2023-06-13)
...
...
common/unicloud-co-task.js
浏览文件 @
514360da
...
...
@@ -11,7 +11,6 @@ class Task {
complete
}
}
invoke
(
callbackName
,
...
args
)
{
if
(
this
.
status
!==
0
)
{
// console.log('此任务已被终止');
...
...
components/llm-config/llm-config.vue
浏览文件 @
514360da
...
...
@@ -55,11 +55,9 @@
currentModel
:
''
};
},
mounted
()
{
this
.
currentModel
=
uni
.
getStorageSync
(
'
uni-ai-chat-llmModel
'
)
},
methods
:
{
open
(
callback
){
this
.
currentModel
=
uni
.
getStorageSync
(
'
uni-ai-chat-llmModel
'
)
confirmCallback
=
callback
this
.
$refs
.
popup
.
open
(
'
center
'
)
},
...
...
components/uni-ai-msg/uni-ai-msg.vue
浏览文件 @
514360da
...
...
@@ -39,10 +39,6 @@
</
template
>
</view>
</view>
<!-- <uni-icons v-if="isLastMsg && !msg.isAi && msg.state != 100 && msgStateIcon(msg)"
@click="msg.state == -100 ? retriesSendMsg() : ''" :color="msg.state===0?'#999':'#d22'"
:type="msgStateIcon(msg)" class="msgStateIcon">
</uni-icons> -->
</view>
</view>
</template>
...
...
@@ -56,10 +52,6 @@
adpid
}
=
config
import
{
msgList
}
from
'
@/pages/chat/msgList.js
'
;
// 引入markdown-it库
import
MarkdownIt
from
'
@/lib/markdown-it.min.js
'
;
...
...
@@ -126,18 +118,13 @@
})
export
default
{
name
:
"
msg
"
,
name
:
"
uni-ai-
msg
"
,
data
()
{
return
{
// 悬浮的复制按钮的左边距
left
:
"
-100px
"
,
// 悬浮的复制按钮的上边距
top
:
"
-100px
"
,
msg
:
{
content
:
""
,
isDelete
:
false
},
msgIndexList
:
0
,
adpid
,
showMoreMenu
:
false
};
...
...
@@ -145,7 +132,6 @@
mounted
()
{
},
created
()
{
this
.
msg
=
msgList
[
this
.
msgIndex
]
},
props
:
{
// 是否显示鼠标闪烁的效果
...
...
@@ -155,24 +141,30 @@
return
false
}
},
msgIndex
:
{
type
:
Number
,
default
()
{
return
false
}
},
isLastMsg
:
{
type
:
Boolean
,
default
()
{
return
false
}
}
},
msg
:
{
type
:
Object
,
default
()
{
return
{
content
:
""
,
isDelete
:
false
}
}
},
},
computed
:
{
msgContent
()
{
return
this
.
msg
.
content
},
nodes
()
{
nodes
()
{
if
(
!
this
.
msgContent
){
return
//处理特殊情况,比如网络异常导致的响应的 content 的值为空
}
let
htmlString
=
''
// 修改转换结果的htmlString值 用于正确给界面增加鼠标闪烁的效果
// 判断markdown中代码块标识符的数量是否为偶数
...
...
@@ -200,27 +192,6 @@
}
},
methods
:
{
// 根据消息状态返回对应的图标
msgStateIcon
(
msg
)
{
switch
(
msg
.
state
)
{
case
0
:
// 发送中
return
''
break
;
case
-
100
:
// 发送失败
return
'
refresh-filled
'
break
;
case
-
200
:
// 禁止发送(内容不合法)
return
'
info-filled
'
break
;
default
:
// 默认不返回任何图标
return
false
break
;
}
},
trOnclick
(
e
){
console
.
log
(
e
);
let
{
attrs
}
=
e
.
detail
.
node
...
...
@@ -262,8 +233,11 @@
},
// 删除消息
removeMsg
(){
this
.
$emit
(
'
removeMsg
'
,
this
.
msgIndex
)
this
.
$emit
(
'
removeMsg
'
)
this
.
showMoreMenu
=
false
},
onAdClose
(
e
){
this
.
$emit
(
'
onAdClose
'
,
e
)
}
}
}
...
...
@@ -292,14 +266,6 @@
padding
:
0
15px
;
padding-bottom
:
15px
;
}
.msgStateIcon
{
position
:
relative
;
top
:
-5px
;
right
:
1px
;
align-self
:
center
;
}
.avatar
{
width
:
40px
;
height
:
40px
;
...
...
@@ -332,7 +298,8 @@
word-break
:
break-all
;
user-select
:
text
;
cursor
:
text
;
/* #endif */
/* #endif */
flex-direction
:
column
;
}
.menu-box
{
...
...
package.json
浏览文件 @
514360da
{
"id"
:
"uni-ai-chat"
,
"name"
:
"uni-ai-chat"
,
"version"
:
"1.
1.5
"
,
"version"
:
"1.
2.0
"
,
"description"
:
"基于uni-ai的聊天示例项目,支持流式、支持前文总结,云端一体"
,
"main"
:
"main.js"
,
"scripts"
:
{
...
...
pages/chat/chat.vue
浏览文件 @
514360da
...
...
@@ -3,18 +3,18 @@
<!-- #ifdef H5 -->
<view
v-if=
"isWidescreen"
class=
"header"
>
uni-ai-chat
</view>
<!-- #endif -->
<text
class=
"noData"
v-if=
"msgLength === 0"
>
没有对话记录
</text>
<text
class=
"noData"
v-if=
"msgL
ist.l
ength === 0"
>
没有对话记录
</text>
<scroll-view
:scroll-into-view=
"scrollIntoView"
scroll-y=
"true"
class=
"msg-list"
:enable-flex=
"true"
>
<uni-ai-msg
ref=
"msg"
v-for=
"(msg
Index,index) in msgLength"
:key=
"index"
:msgIndex=
"index
"
@
retriesSendMsg=
"retriesSendMsg"
@
changeAnswer=
"changeAnswer"
:show-cursor=
"index == msgL
ength - 1 && msgL
ength%2 === 0 && sseIndex"
:isLastMsg=
"index ==
visibleMsgLength - 1"
@
removeMsg=
"removeMsg
"
></uni-ai-msg>
<template
v-if=
"msgLength%2 !== 0"
>
<uni-ai-msg
ref=
"msg"
v-for=
"(msg
,index) in msgList"
:key=
"index"
:msg=
"msg
"
@
retriesSendMsg=
"retriesSendMsg"
@
changeAnswer=
"changeAnswer"
@
onAdClose=
"onAdClose"
:show-cursor=
"index == msgL
ist.length - 1 && msgList.l
ength%2 === 0 && sseIndex"
:isLastMsg=
"index ==
msgList.length - 1"
@
removeMsg=
"removeMsg(index)
"
></uni-ai-msg>
<template
v-if=
"msgL
ist.l
ength%2 !== 0"
>
<view
v-if=
"lastMsgState == -100"
class=
"retries-box"
>
<text>
消息发送失败
</text>
<uni-icons
@
click=
"retriesSendMsg"
color=
"#d22"
type=
"refresh-filled"
class=
"retries-icon"
></uni-icons>
</view>
<view
class=
"tip-ai-ing"
v-else-if=
"msgLength"
>
<view
class=
"tip-ai-ing"
v-else-if=
"msgL
ist.l
ength"
>
<text>
uni-ai正在思考中...
</text>
<view
v-if=
"NODE_ENV == 'development' && !enableStream"
>
如需提速,请开通
<uni-link
class=
"uni-link"
href=
"https://uniapp.dcloud.net.cn/uniCloud/uni-ai-chat.html"
...
...
@@ -48,7 +48,7 @@
:placeholder=
"placeholderText"
:maxlength=
"-1"
:adjust-position=
"false"
:disable-default-padding=
"false"
placeholder-class=
"input-placeholder"
></textarea>
</view>
<view
class=
"send-btn-box"
:title=
"(msgL
ength && msgL
ength%2 !== 0) ? 'ai正在回复中不能发送':''"
>
<view
class=
"send-btn-box"
:title=
"(msgL
ist.length && msgList.l
ength%2 !== 0) ? 'ai正在回复中不能发送':''"
>
<!-- #ifdef H5 -->
<text
v-if=
"isWidescreen"
class=
"send-btn-tip"
>
↵ 发送 / shift + ↵ 换行
</text>
<!-- #endif -->
...
...
@@ -65,10 +65,6 @@
// 引入配置文件
import
config
from
'
@/config.js
'
;
import
{
msgList
}
from
'
@/pages/chat/msgList.js
'
;
// 导入uniCloud云对象task模块
import
uniCoTask
from
'
@/common/unicloud-co-task.js
'
;
// 收集所有执行云对象的任务列表
...
...
@@ -89,14 +85,13 @@
let
sseChannel
=
false
;
// 键盘的shift键是否被按下
let
shiftKeyPressed
=
false
let
shiftKeyPressed
=
false
export
default
{
data
()
{
return
{
// 使聊天窗口滚动到指定元素id的值
scrollIntoView
:
""
,
// 消息长度(个数)
msgLength
:
0
,
// 消息列表数据
msgList
:
[],
// 输入框的消息内容
...
...
@@ -110,8 +105,7 @@
// 广告位id
adpid
,
llmModel
:
false
,
keyboardHeight
:
0
,
visibleMsgLength
:
0
keyboardHeight
:
0
}
},
computed
:
{
...
...
@@ -122,8 +116,8 @@
return
true
}
// 如果消息列表长度为奇数,则禁用输入框
return
!!
(
this
.
msgL
ength
&&
this
.
msgL
ength
%
2
!==
0
)
},
return
!!
(
this
.
msgL
ist
.
length
&&
this
.
msgList
.
l
ength
%
2
!==
0
)
},
// 输入框占位符文本
placeholderText
()
{
// #ifdef H5
...
...
@@ -152,16 +146,7 @@
// 监听msgList变化,将其存储到本地缓存中
watch
:
{
msgList
:
{
handler
(
msgList
)
{
let
msgLength
=
msgList
.
length
if
(
msgLength
!=
this
.
msgLength
)
{
this
.
msgLength
=
msgLength
this
.
$nextTick
(()
=>
{
this
.
updateLastMsg
(
msgList
[
msgLength
-
1
])
})
}
msgList
=
msgList
.
filter
(
i
=>
i
.
isDelete
!==
true
)
this
.
visibleMsgLength
=
msgList
.
length
handler
(
msgList
)
{
// 将msgList存储到本地缓存中
uni
.
setStorage
({
"
key
"
:
"
uni-ai-msg
"
,
...
...
@@ -227,11 +212,7 @@
// }
// 获得历史对话记录
let
_msgList
=
uni
.
getStorageSync
(
'
uni-ai-msg
'
)
||
[];
if
(
_msgList
.
length
)
{
msgList
.
push
(...
_msgList
)
}
this
.
msgList
=
msgList
this
.
msgList
=
uni
.
getStorageSync
(
'
uni-ai-msg
'
)
||
[];
// 获得之前设置的llmModel
this
.
llmModel
=
uni
.
getStorageSync
(
'
uni-ai-chat-llmModel
'
)
...
...
@@ -302,7 +283,6 @@
this
.
showLastMsg
()
})
}
}
// #endif
...
...
@@ -396,7 +376,8 @@
// 解构出score字段的值,如果没有则默认为undefined
let
{
score
}
=
res
.
result
.
data
[
0
]
||
{}
}
=
res
.
result
.
data
[
0
]
||
{}
console
.
log
(
'
score
'
,
score
);
if
(
score
>
0
||
i
>
5
)
{
// 清除轮询定时器
clearInterval
(
myIntive
)
...
...
@@ -438,30 +419,24 @@
//删除旧的回答
this
.
msgList
.
pop
()
// 防止 偶发答案涉及敏感,重复回答时。提问内容 被卡掉无法重新问
this
.
updateLastMsg
({
illegal
:
false
this
.
updateLastMsg
({
// 防止 偶发答案涉及敏感,重复回答时。提问内容 被卡掉无法重新问
illegal
:
false
,
// 多设备登录时其他设备看广告后点击重新回答,insufficientScore应当设置为 false
insufficientScore
:
false
})
this
.
send
()
},
removeMsg
(
index
)
{
// #ifdef VUE3
this
.
msgList
[
index
].
isDelete
=
true
if
(
this
.
msgList
[
index
].
isAi
&&
this
.
msgList
[
index
-
1
])
{
this
.
msgList
[
index
-
1
].
isDelete
=
true
}
else
if
(
this
.
msgList
[
index
+
1
])
{
this
.
msgList
[
index
+
1
].
isDelete
=
true
}
// #endif
// #ifdef VUE2
this
.
$set
(
msgList
[
index
],
"
isDelete
"
,
true
)
if
(
msgList
[
index
].
isAi
&&
msgList
[
index
-
1
])
{
this
.
$set
(
msgList
[
index
-
1
],
"
isDelete
"
,
true
)
}
else
if
(
msgList
[
index
+
1
])
{
this
.
$set
(
msgList
[
index
+
1
],
"
isDelete
"
,
true
)
}
// #endif
removeMsg
(
index
)
{
// 如果问题还在回答中需要先关闭
if
(
this
.
sseIndex
)
{
this
.
closeSseChannel
()
}
if
(
this
.
msgList
[
index
].
isAi
)
{
index
-=
1
}
this
.
msgList
.
splice
(
index
,
2
)
},
async
beforeSendMsg
()
{
if
(
this
.
inputBoxDisabled
)
{
...
...
@@ -550,11 +525,16 @@
})
this
.
send
()
// 发送消息
},
async
send
()
{
async
send
()
{
// 流式响应和云对象的请求状态
let
state
=
{
sse
:
0
,
co
:
0
}
let
messages
=
[]
// 复制一份,消息列表数据
let
msgs
=
JSON
.
parse
(
JSON
.
stringify
(
msgList
)).
filter
(
i
=>
i
.
isDelete
!==
true
)
let
msgs
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
msgList
)).
filter
(
i
=>
i
.
isDelete
!==
true
)
// 带总结的消息 index
let
findIndex
=
[...
msgs
].
reverse
().
findIndex
(
item
=>
item
.
summarize
)
// console.log('findIndex', findIndex)
...
...
@@ -563,13 +543,13 @@
// console.log('aiSummaryIndex', aiSummaryIndex)
// 将带总结的消息的 内容 更换成 总结
msgs
[
aiSummaryIndex
].
content
=
msgs
[
aiSummaryIndex
].
summarize
// 拿最后一条带直接的消息作为与ai对话的msg body
msgs
=
msgs
.
splice
(
aiSummaryIndex
,
msgs
.
length
-
1
)
// 拿最后一条带直接的消息作为与ai对话的msg body
msgs
=
msgs
.
splice
(
aiSummaryIndex
)
}
else
{
// 如果未总结过就直接从末尾拿10条
msgs
=
msgs
.
splice
(
-
10
)
}
// 过滤涉敏问题
msgs
=
msgs
.
filter
(
msg
=>
!
msg
.
illegal
)
...
...
@@ -592,7 +572,7 @@
// 检查是否开通uni-push;决定是否启用enableStream
await
this
.
checkIsOpenPush
()
// console.log('this.enableStream',this.enableStream);
// console.log('this.enableStream',this.enableStream);
// 判断是否开启了流式响应模式
if
(
this
.
enableStream
)
{
...
...
@@ -625,37 +605,18 @@
// 监听end事件,如果云端执行end时传了message,会在客户端end事件内收到传递的消息
sseChannel
.
on
(
'
end
'
,
(
e
)
=>
{
// console.log('on end', e);
// 如果e存在且包含summarize或insufficientScore属性
if
(
e
)
{
// 如果e包含summarize属性
if
(
e
.
summarize
)
{
// 设置总结
this
.
setSummarize
(
e
.
summarize
)
}
else
{
// 更新最后一条消息
this
.
updateLastMsg
(
lastMsg
=>
{
// 如果e包含illegal属性
if
(
e
.
illegal
)
{
// 将最后一条消息的illegal属性更新为e的illegal属性
lastMsg
.
illegal
=
e
.
illegal
lastMsg
.
content
=
"
内容涉及敏感
"
// 倒数第二条(用户发问内容)也需要设置illegal的值
this
.
msgList
[
this
.
msgList
.
length
-
2
].
illegal
=
e
.
illegal
}
// 如果e包含insufficientScore属性
else
if
(
e
.
insufficientScore
)
{
// 将最后一条消息的insufficientScore属性更新为e的insufficientScore属性
lastMsg
.
insufficientScore
=
e
.
insufficientScore
}
})
}
}
// 结束流式响应 将流式响应计数值 设置为 0
this
.
sseIndex
=
0
// 滚动窗口以显示最新的一条消息
this
.
showLastMsg
()
console
.
log
(
'
sse 结束
'
,
e
)
state
.
sse
=
1
if
(
state
.
sse
===
1
&&
state
.
co
===
1
){
// console.error('通过 sse end 结束',state);
//当两个都结束时
sseChannel
.
close
()
// 结束流式响应 将流式响应计数值 设置为 0
this
.
sseIndex
=
0
state
=
{
sse
:
0
,
co
:
0
}
}
else
{
// console.log(1,state);
}
})
await
sseChannel
.
open
()
// 等待通道开启
}
...
...
@@ -673,67 +634,84 @@
customUI
:
true
},
success
:
res
=>
{
// console.log(111,res);
if
(
!
sseChannel
)
{
if
(
!
res
.
data
)
{
return
}
// 更新最后一条消息的状态为100(发送成功)
this
.
updateLastMsg
({
state
:
100
})
// console.log(res, res.reply);
let
{
"
reply
"
:
content
,
summarize
,
insufficientScore
,
illegal
}
=
res
.
data
if
(
illegal
)
{
// 如果返回的数据包含illegal属性,就更新最后一条消息的illegal属性为true
this
.
updateLastMsg
({
illegal
:
true
})
}
// 将从云端接收到的消息添加到消息列表中
this
.
msgList
.
push
({
// 添加消息创建时间
create_time
:
Date
.
now
(),
// 标记消息为来自AI机器人
isAi
:
true
,
// 添加消息内容
content
,
// 添加消息分数不足标记
insufficientScore
,
// 添加消息涉敏标记
illegal
console
.
log
(
"
success
"
,
res
);
if
(
!
res
.
data
)
{
return
}
// 更新最后一条消息的状态为100(发送成功)
this
.
updateLastMsg
({
state
:
100
})
let
{
"
reply
"
:
content
,
summarize
,
insufficientScore
,
illegal
}
=
res
.
data
// 特殊处理 - start
if
(
this
.
enableStream
==
false
&&
!
content
){
illegal
=
true
content
=
"
内容涉及敏感
"
}
// 特殊处理 - end
if
(
illegal
)
{
// 如果返回的数据包含illegal属性,就更新最后一条消息(用户输入的问题)的illegal属性为true
this
.
updateLastMsg
({
// 添加消息涉敏标记
illegal
:
true
})
// 如果回调包含总结的内容,就设置总结
if
(
summarize
){
this
.
setSummarize
(
summarize
)
}
// 滚动窗口以显示最新的一条消息
this
.
$nextTick
(()
=>
{
this
.
showLastMsg
()
})
}
else
{
// 处理 sseChannel没结束 云函数提前结束的情况
sseChannel
.
close
()
this
.
sseIndex
=
0
}
// 非流式模式 或者流式模式,但列表还没有数据且已经进入异常的情况下
if
(
this
.
enableStream
==
false
||
this
.
sseIndex
==
0
&&
(
illegal
||
insufficientScore
))
{
// 将从云端接收到的消息添加到消息列表中
this
.
msgList
.
push
({
// 消息创建时间
create_time
:
Date
.
now
(),
// 标记消息为来自AI机器人
isAi
:
true
,
// 消息内容
content
,
// 消息是否涉敏标记
illegal
,
// 本地对话是否因积分不足而终止
insufficientScore
})
}
// console.log(res, res.reply);
// 如果回调包含总结的内容,就设置总结
if
(
summarize
){
console
.
log
(
'
拿到总结
'
,
summarize
);
this
.
setSummarize
(
summarize
)
}
},
complete
:
e
=>
{
// console.log('complete:',e);
if
(
sseChannel
)
{
state
.
co
=
1
if
(
state
.
sse
===
1
&&
state
.
co
===
1
){
// console.error('通过 co complete 结束');
//当两个都结束时
sseChannel
.
close
()
// 结束流式响应 将流式响应计数值 设置为 0
this
.
sseIndex
=
0
state
=
{
sse
:
0
,
co
:
0
}
}
else
{
// console.log(2,state);
}
}
// 滚动窗口以显示最新的一条消息
this
.
$nextTick
(()
=>
{
this
.
showLastMsg
()
})
},
fail
:
e
=>
{
console
.
log
(
e
);
// 获取消息列表长度
let
l
=
this
.
msgList
.
length
// console.log(l,this.msgList[l-1]);
// 如果最后一条消息的来源是人工智能机器人 就将流式响应计数值设置为0
if
(
l
&&
sseChannel
&&
this
.
msgList
[
l
-
1
].
isAi
)
{
sseChannel
.
close
()
this
.
sseIndex
=
0
}
console
.
error
(
e
);
// 更新最后一条消息的状态为-100(发送失败)
this
.
updateLastMsg
({
state
:
-
100
...
...
@@ -783,7 +761,7 @@
// 关闭ssh请求
this
.
closeSseChannel
()
// 将消息列表清空
this
.
msgList
.
splice
(
0
,
this
.
msgLength
);
this
.
msgList
.
splice
(
0
,
this
.
msgL
ist
.
l
ength
);
}
}
});
...
...
pages/chat/msgList.js
已删除
100644 → 0
浏览文件 @
d1ebe1f7
export
const
msgList
=
[]
uniCloud-aliyun/cloudfunctions/reward-video-callback/index.js
浏览文件 @
514360da
...
...
@@ -26,7 +26,7 @@ async function nextFn(data) {
pluginId
:
'
uni-ai-chat
'
}).
config
()
console
.
log
(
'
uniAiChatConfig
'
,
uniAiChatConfig
);
if
(
!
uniAiChatConfig
||
!
uniAiChatConfig
.
ad
||
!
uniAiChatConfig
.
earnedScore
.
ad
){
if
(
!
uniAiChatConfig
||
!
uniAiChatConfig
.
earnedScore
||
!
uniAiChatConfig
.
earnedScore
.
ad
){
throw
new
Error
(
'
请先完成uni-ai-chat的广告奖励配置
'
)
}
...
...
uniCloud-aliyun/cloudfunctions/uni-ai-chat/index.obj.js
浏览文件 @
514360da
此差异已折叠。
点击以展开。
uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/uni-ai-chat/config.json
浏览文件 @
514360da
...
...
@@ -5,7 +5,9 @@
"ad"
:
3
,
"price"
:
3
},
"llm"
:{},
"llm"
:{
"provider"
:
"azure"
},
"chatCompletionOptions"
:{
"tokensToGenerate"
:
512
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录