【前端】微信小程序与AI Coze对接

页面按钮逻辑

    //发送非流式消息
	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 "出错了,请重试"
		}
}

### 关于微信小程序Coze的使用 #### 创建基于Coze小程序应用 为了实现无需编写大量代码即可完成特定功能的小程序开发,如“文本转语音”,可以利用Coze平台提供的便捷工具和服务。通过该平台,开发者能够专注于业务逻辑的设计而减少底层技术细节的关注。 #### 配置集成过程 在开始之前,需先获取必要的认证信息并将其填入相应的配置文件内。对于希望采用微信授权方式进行用户验证的情况,则应按照官方指南申请测试账号,并记录下分配给应用程序唯一的标识符(AppID)及其对应的密钥(AppSecret)[^3]。随后,在准备就绪之后,便可通过调整后端服务来支持前端交互需求[^4]。 #### 实现具体特性——以文本转换成音频为例 当涉及到具体的特性的构建时,比如让小程序具备将输入的文字内容合成为声音的能力,这通常依赖于调用第三方API接口或是借助像Coze这样的综合解决方案所提供的内置能力来进行操作。下面给出了一段简化版Python脚本用于展示如何初始化一个`ChatCoze`对象以便后续处理: ```python from langchain_community.chat_models import ChatCoze from langchain_core.messages import HumanMessage chat = ChatCoze( coze_api_base=os.environ["COZE_API_BASE"], coze_api_key=os.environ["COZE_API_KEY"], bot_id="YOUR_BOT_ID", user="YOUR_USER_ID", conversation_id="YOUR_CONVERSATION_ID", streaming=False, ) ``` 此部分展示了怎样连接至远程服务器上的对话管理模块,并传递所需参数以建立有效的通信链路[^5]。 #### 完整流程概述 整个项目的实施大致分为几个阶段:首先是环境搭建;其次是核心组件的选择组装;最后则是针对目标场景定制化优化。在整个过程中,保持良好的文档习惯有助于提高工作效率和维护质量[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值