页面按钮逻辑
//发送非流式消息
async sendmessage() {
const {
inputvalue,
isloading,
userinfo
} = this.data
if (!isloading || !!!inputvalue) {
return
}
//输入框置空,禁止再次发送
this.setData({
isloading: false,
inputvalue: ""
})
//初始化数据
const newmessage = {
usercontent: inputvalue,
chattime: new Date().getTime(),
status: "loding",
aicontent: ""
}
this.setData({
chatlist: [...this.data.chatlist, newmessage],
scrollitemname: "scrollbottom"
})
this.setData({
scrollitemname: "scrollbottom",
})
let listlength = this.data.chatlist
const res = await wx.cloud.callFunction({
name: "fetchcozedata",
data: {
inputvalue,
userid: userinfo._id
}
});
console.log("cloudfunctionresult", res);
//获取最后结果
if (res.result?.status) {
listlength = listlength.slice(0, -1)
newmessage.aicontent = res.result?.callbackmessage,
newmessage.status = "success"
listlength.push(newmessage)
} else {
listlength = listlength.slice(0, -1)
newmessage.aicontent = "处理失败,请重试!!",
newmessage.status = "error"
listlength.push(newmessage)
}
this.useraddorcreatedata(newmessage)
this.setData({
chatlist: listlength,
})
this.setData({
scrollitemname: "scrollbottom",
isloading: true
})
},
//发送流式数据
async sendmessagess(userid, textcontent) {
const _this = this
const {
inputvalue,
isloading,
userinfo
} = this.data
if (!isloading || !!!inputvalue) {
return
}
//输入框置空,禁止再次发送
this.setData({
isloading: false,
inputvalue: ""
})
//初始化数据
const newmessage = {
usercontent: inputvalue,
chattime: new Date().getTime(),
status: "loding",
aicontent: ""
}
_this.setData({
chatlist: [...this.data.chatlist, newmessage],
scrollitemname: "scrollbottom"
})
_this.setData({
scrollitemname: "scrollbottom",
})
const requestTask = wx.request({
url: 'https://api.coze.cn/v3/chat',
enableChunked: true,
header: {
Authorization: "Bearer pat_n11wSqHFEKUu6iF3Q2d0MoKJ5CW1uVEBDlz9dsT50vsumRnuiGHTME1EANFANqL1"
},
data: {
"bot_id": "7374724005846433819",
"user_id": `${userid}`,
"stream": true,
"auto_save_history": true,
"additional_messages": [{
"role": "user",
"content": `${inputvalue}`,
"content_type": "text"
}]
},
method: "POST",
success(res) {
console.log(res, "ccc");
},
fail(err) {
reject(err)
}
})
let str = ""
let listlength = _this.data.chatlist
requestTask.onChunkReceived((r) => {
const uint8Array = new Uint8Array(r.data);
const decoder = new TextEncoding.TextDecoder("utf-8")
let stringbody = decoder.decode(uint8Array);
let regex = /"content":\s*"([^"]*)"/
if (stringbody.includes("answer")) {
if (stringbody.includes("\{\\")) {
stringbody = stringbody.replace("\{\\", "")
}
if (stringbody.includes("/n")) {
stringbody = stringbody.replace(/\n/g, "")
}
if (stringbody.includes("completed")) {
str = ""
}
if (!!stringbody.match(regex)[1]) {
if (stringbody.match(regex)[1].includes)
str += stringbody.match(regex)[1]
console.log(stringbody);
}
}
if (str) {
listlength = listlength.slice(0, -1)
newmessage.aicontent = str,
newmessage.status = "loading"
listlength.push(newmessage)
_this.setData({
chatlist: listlength,
})
_this.setData({
scrollitemname: "scrollbottom",
isloading: true
})
if (stringbody.includes("completed") && stringbody.includes("answer")) {
_this.useraddorcreatedata(newmessage)
}
}
})
},
//新增或增加聊天记录
async useraddorcreatedata(data) {
const {
userinfo
} = this.data
let chatlist = await sqlapi.getdata("chathistory", {
userid: userinfo._id
})
if (chatlist.length === 0) {
await sqlapi.adddata("chathistory", {
userid: userinfo._id,
chattime: new Date().getTime(),
chatcontent: [{
usercontent: "",
chattime: new Date().getTime(),
status: "success",
aicontent: "您好,我是小马老师,请问您有什么税务问题呀?"
}],
chatidentity: "用户-Ai"
})
} else {
//新增数据
const res = await sqlapi.updata("chathistory", {
userid: userinfo._id
}, {
chatcontent: _.push(data)
})
console.log(res, "ddddd");
}
},
两种方式大同小异
云函数部分
// 云函数入口文件
const cloud = require('wx-server-sdk')
const axios = require("axios")
const rp = require('request-promise');
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
}) // 使用当前云环境
// 云函数入口函数
exports.main = async (event, context) => {
const inputvalue = event.inputvalue
const userid = event.userid+""
// const {
// chat_id,
// conversation_id
// } = await sendmessage(userid, inputvalue)
console.log("开始:",{userid, inputvalue});
const res = await sendmessage(userid,inputvalue)
console.log("zzzzz",res.data.conversation_id,res.data.id);
console.log("---------------");
if(!!!res.data?.id || !!!res.data?.conversation_id){
return {status:0, callbackmessag:"出错啦,请重试 "}
}
const issuccess = await checkstatus(res.data.conversation_id, res.data.id)
console.log(issuccess,"状态是否为已完成");
// console.log(inputvalue,userid,issuccess);
let callbackmessage=""
if (issuccess) {
const ress= await getmessage(res.data.conversation_id, res.data.id)
if(!!!ress){
return {status:0, callbackmessag:"出错啦,请重试 "}
}
callbackmessage=ress
console.log("获取到的消息",callbackmessage);
} else {
//检查状态出现错误
return {status:0, callbackmessag:"出错啦,请重试 "}
}
return {
status:1,
callbackmessage
}
}
async function sendmessage(userid, textcontent) {
// const dd=await queryfun("https://www.baidu.com/")
// return dd;
const result=await queryfun('https://api.coze.cn/v3/chat',"POST", {
bot_id: "7374724005846433819",
user_id: userid,
stream: false,
auto_save_history: true,
additional_messages: [{
role: "user",
content: textcontent,
content_type: "text"
}]
},{
Authorization: "Bearer pat_n11wSqHFEKUu6iF3Q2d0MoKJ5CW1uVEBDlz9dsT50vsumRnuiGHTME1EANFANqL1",
})
return result;
}
async function queryfun(url, method = "GET", body = {}, headers = {}) {
method = method.toUpperCase();
try {
let post_res = await rp({
method, url, body,
json: true,
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Accept': 'application/json',
'Content-Type': 'application/json',
...headers
},
});
return post_res;
} catch (error) {
console.log("请求错误:", { state: 0, errdata: error });
return { state: 0, errmsg: error };
}
}
function checkstatus(conversation_id,chat_id){
return new Promise((resolve,reject)=>{
var index=0
let timers= setInterval( async ()=>{
const res= await queryfun( `https://api.coze.cn/v3/chat/retrieve?conversation_id=${conversation_id}&chat_id=${chat_id}`,"GET",{}, {Authorization:"Bearer pat_n11wSqHFEKUu6iF3Q2d0MoKJ5CW1uVEBDlz9dsT50vsumRnuiGHTME1EANFANqL1" },
)
if(res.data?.status === "completed"){
clearInterval(timers)
resolve(true)
}
index++
if(index == 100){
clearInterval(timers)
resolve(false)
}
},300)
})
}
async function getmessage(conversation_id, chat_id) {
const res = await queryfun(`https://api.coze.cn/v3/chat/message/list?conversation_id=${conversation_id}&chat_id=${chat_id}`,"GET",{}, {
Authorization: "Bearer pat_n11wSqHFEKUu6iF3Q2d0MoKJ5CW1uVEBDlz9dsT50vsumRnuiGHTME1EANFANqL1"
})
if (res?.code == 0) {
return res.data?.[2]?.content
}else{
return "出错了,请重试"
}
}