【鸿蒙】大模型对话应用(四):页面发起请求实现对话能力

Demo介绍

本demo对接阿里云和百度的大模型API,实现一个简单的对话应用。

DecEco Studio版本:DevEco Studio 3.1.1 Release

HarmonyOS SDK版本:API9

关键点:ArkTS、ArkUI、UIAbility、网络http请求、列表布局、层叠布局

定义接口响应数据

根据大模型对话应用(一)中接口返回JSON格式,定义大模型接口返回数据

export class ALiYunResponse {request_id: stringoutput: ALiYunResp_outputusage: ALiYunResp_usage
}class ALiYunResp_output {text: string
}class ALiYunResp_usage {output_tokens: stringinput_tokens: string
}

输入框发送消息

在 ChatPageALiYun.ets文件,struct ChatPage { ... } 结构中,定义两个变量 submitMsg 和 textInputMsg

  • submitMsg:提交消息绑定变量,用于保存输入框输入文本信息,
  • textInputMsg:输入框输入信息绑定变量,可控制在发送消息后,清除文本输入框内容
@State submitMsg: string = ''
@State textInputMsg: string = ''

完善输入文本框TextInput的 .onChange() 方法和.onSubmit() 方法

.onChange()方法中,当输入框内容变化时,同步更新this.submitMsg和this.textInputMsg的值

.onSubmit()方法中,当输入框内容提交时,表示消息发送。

  1. 将 this.textInputMsg 变量置空,会驱动输入框显示内容更新为空
  2. 将输入框输入的文本加入页面展示的聊天列表集合this.messageArr 之中,页面展示我方发送 的消息
  3. 页面展示聊天消息的列表滑动至底端,展示最新消息
  4. 使用输入框输入的文本作为参数,调用大模型http接口,发起对话请求
  5. 调用大模型http接口成功后,将接口返回的对话文本加入页面展示的聊天列表集合this.messageArr 之中,页面展示对方(大模型)应答的消息
  6. 页面展示聊天消息的列表滑动至底端,展示最新消息
@Builder function inputBox(scroller: Scroller, messageArr: MessageVO[]) {Row() {Stack() {TextInput({placeholder: '有问题尽管问我~', text: this.textInputMsg}).height(50).enterKeyType(EnterKeyType.Send).onChange((text) => {this.submitMsg = textthis.textInputMsg = text}).onSubmit(() => {this.textInputMsg = '' // 点击发送后 输入框置空this.messageArr.push(new MessageVO(MessageRoleEnum.Mine, this.submitMsg)) // 立刻展示我方对话scroller.scrollEdge(Edge.Bottom) // 消息发送后 将列表滚动到底端// 发送http请求ALiYunHttpUtils.request(this.submitMsg, (responseText: string) => {this.messageArr.push(new MessageVO(MessageRoleEnum.Other, responseText)) // 展示对方对话scroller.scrollEdge(Edge.Bottom) // 消息显示后 将列表滚动到底端})})Image($r('app.media.ic_public_send')).margin({right:10}).height(35).onClick(() => {// 参照文本输入框TextInput 的onSubmit事件实现})}.alignContent(Alignment.End).height('10%')}.width('90%')
}

ALiYunHttpUtils处理回调

完善先前写好的ALiYunHttpUtils,为request() 方法入参添加一个回调函数,用于更新页面数据

import http from '@ohos.net.http';
import hilog from '@ohos.hilog';
import { ALiYunResponse } from '../model/ALiYunResponse';
class ALiYunHttpUtils {request(question: string, callback: Function) {hilog.info(0x0000, 'testTag', 'ALiYunHttpUtils request invoke. question: %{public}s', question);// 1 createHttp接口创建请求let httpRequest = http.createHttp();// 2 发起请求httpRequest.request(// 请求地址"https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation",// 请求options: HttpRequestOptions{// 请求方式method: http.RequestMethod.POST,// 请求头header: {"Content-Type": "application/json",// 这里的Authorization 就是刚才工作台查看的 API-KEY"Authorization": "sk-0bxxxxxxxxx1c3"},// 请求体extraData: {"model": "qwen-plus", // 指定用于对话的通义千问模型名"input": {"messages": [{"role": "user","content": question // 请求发起方传入的问题}]}}}, (err, data: http.HttpResponse) => {if (err) {hilog.error(0x0000, 'testTag', 'Failed to request ALiYun. Cause: %{public}s', JSON.stringify(err) ?? '');httpRequest.destroy();} else {hilog.info(0x0000, 'testTag', 'Request ALiYun success. data: %{public}s', JSON.stringify(data.result));let resp: ALiYunResponse = JSON.parse(data.result.toString())hilog.info(0x0000, 'testTag', 'Request ALiYunHttpUtils-Result. data: %{public}s', JSON.stringify(resp.output.text));httpRequest.destroy();callback(resp.output.text)}})}
}
export default new ALiYunHttpUtils;

预览效果

打开预览器,在输入文本框中输入内容后,敲击Enter键,可与大模型进行简单的对话

真机(pad)调试效果:

petal_20240203_171933

 

至此,一个简单的对话Demo就实现完成了;

本项目仅实现了很基础的简单功能,仍有许多细节需要完善,如:等待接口返回过程的加载交互动效、接口异常处理、数据持久化、对话头像的设置等。

有更精巧、更兼容的实现方案,欢迎大家评论指正~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/452643.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA-File五个练习

下面习题思路大多都是: 1.获取路径下所有列表(listfiles),2.遍历文件或文件夹(增强for),3.判断是否是文件(isFile)并直接执行逻辑,4.判断当前是文件夹的情况&…

oc云渲染云渲染操作步骤

随着技术的飞速进步,云渲染已经日益成为一个主流的渲染选择。OC云渲染以其高效率、易用性和可靠性获得了广泛的认可和喜爱。尽管如此,对于刚入门的用户而言,掌握OC云渲染的正确方法可能仍旧是一项挑战。接下来,我们会详尽解释OC云…

vivado 手动设置自下而上的流量并导入网表、创建较低级别的网表

手动设置自下而上的流量并导入网表 要手动运行自下而上的流,请将较低级别的网表或第三方网表实例化为黑色盒子,Vivado工具在合成完成后将黑盒子融入完整的设计中。这个以下部分描述了该过程。 重要!Vivado合成不合成或优化加密或非加密合成…

使用_NT_SYMBOL_PATH在启动VS前设置PDB路径

一、背景 由于公司相关项目的开发管理方式,导致公司会存在多个分支的版本正在开发/测试中。 在这样的背景下,我的日常工作中有时会出现存在某个分支的项目软件的某个功能出现了问题需要我去排查解决,而我当前并不在该分支上开发。于是只能安装…

AI重构千行百业!超声波俱乐部大湾区内部分享会圆满落幕

1月27日、28日,超声波俱乐部内部分享会第十六期、第十七期分别在深圳、广州召开,创梦天地、元气森林、新浪智库、百准、A2空间对活动进行了特别支持,六十余名AI领域的创始人和行业嘉宾出席分享会。 出席活动的嘉宾有: 超声波创始…

Kubernetes operator(五)api 和 apimachinery 篇

云原生学习路线导航页(持续更新中) 本文是 Kubernetes operator学习 系列第五篇,主要对 k8s.io/api 和 k8s.io/apimachinery 两个项目 进行学习基于 kubernetes v1.24.0 代码分析Kubernetes operator学习系列 快捷链接 Kubernetes operator&a…

C++进阶(十)哈希的应用——位图布隆过滤器

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、位图1、位图概念2、位图的实现3、位图的应用 二、布隆过滤器1、布隆过滤器提出2、布隆过滤…

通过html2canvas和jsPDF将网页内容导出成pdf

jsPDF参考:https://github.com/parallax/jsPDF html2canvas参考:https://github.com/niklasvh/html2canvas 或者 https://html2canvas.hertzen.com 思路 使用html2canvas将选中DOM生成截图对象将截图对象借助jsPDF导出为PDF文件 代码 这是一个示例&a…

List的模拟实现 迭代器

———————————————————— list与vector相比,插入、删除等操作实现的成本非常低,如果在C语言阶段熟悉理解过链表,那么现在实现起来list就显得比较简单,可以说操作层面上比vector更简洁,因为list没有扩…

【JavaEE进阶】 图书管理系统开发日记——伍

文章目录 🎋前言🌲需求分析🎄约定前后端交互接口🌳实现服务器代码🚩控制层🚩业务层🚩数据层 🍃修改前端代码⭕总结 🎋前言 这次我们来实现图书管理系统的增加图书模块。…

一文学会yum源配置(联网/未联网)以及yum常用命令

1、yum源介绍 yum(Yellow dog Updater Modified的简称),yum的宗旨是自动化地升级,安装/移除rpm包,收集rpm包的相关信息,检查依赖性并自动提示用户解决。yum的关键之处是要有可靠的repository,顾…

超维机器人年终总结大事记回顾

2023年,对于超维机器人来说,是充满挑战和机遇的一年。在这一年里,我们攻坚克难,持续创新,深度聚焦智能巡检机器人的发展,加强合作伙伴关系,不断优化产品和服务,不断提升客户体验&…