当前位置: 首页 > news >正文

【 HarmonyOS 6 】HarmonyOS智能体开发实战:Function组件和智能体创建

【 HarmonyOS 6 】HarmonyOS智能体开发实战:Function组件和智能体创建

最近在做HarmonyOS AI应用开发,感觉鸿蒙以后和AI会越来越紧密。AI和鸿蒙两个热门方向,居然融合在一起了。感慨颇多。
在这里插入图片描述

智能体功能听着很高大上。目前用户能在App里直接调用小艺生态下的智能体,在小艺开放平台,任何人都可以创建智能体上架。所以我们需要给应用集成智能体功能入口。

而提供的Agent Framework Kit是核心工具,实现了应用内激活小艺智能体的效果。

从入门到跑通流程踩了些小坑,索性整理成一篇实战笔记,希望能帮到同样在做智能体集成的开发者。

一、先搞懂:Agent Framework Kit到底是干啥的?

刚开始接触这个Kit的时候,我还以为是个复杂的框架,实际用下来发现定位很清晰。

它就是帮你在HarmonyOS应用里拉起指定智能体的工具包。

核心价值其实就一点:你先在小艺开放平台把自己的智能体上线,然后通过Agent Framework Kit,就能让用户在你的App里,通过Kit提供的UI控件主动打开这个智能体。简单说,它解决了“应用怎么和智能体对接”的核心问题,不用自己从零搭一套交互入口。

这个Kit里最核心的东西就是Function组件

所有和智能体拉起相关的操作,基本都围绕这个组件展开。后续的开发实战,也都是基于这个组件来做的。

二、Function组件:智能体入口的两种形态

Function组件是Agent Framework Kit的“门面”,用户就是通过它触发智能体拉起的。

这里有个小细节我刚开始没注意:它会根据你是否设置“标题”,自动切换成两种形态,用途不太一样。

第一种是图标组件

当你不设置title的时候,组件会默认显示成图标样式。这种适合做“综合型入口”。比如App首页的智能体入口按钮,不带具体的用户意图,点进去就是智能体的主界面。我在项目里把它放在了个人中心的工具栏,作为智能体的总入口,用户一眼就能找到。

在这里插入图片描述

第二种是按钮组件
只要你设置了title,组件就会变成按钮样式,还能自定义功能描述。这种更适合场景化入口。

比如在创建任务页面,我把按钮标题设为“智能生成任务”,queryText设为“帮我生成本周的工作计划”,用户点这个按钮,拉起智能体就直接带了明确的意图,体验更顺畅。
在这里插入图片描述

三、开发前必看:那些容易踩坑的限制条件

在动手写代码前,一定要先确认环境是否符合要求。

我刚开始用模拟器测了半天没反应,后来才发现是踩了限制的坑,白浪费时间。

设备限制:目前只支持手机(Phone)和平板(Tablet),其他设备比如手表、车机暂时不兼容,开发和测试必须用真实设备,模拟器跑不起来。
地区限制:仅限中国境内使用,香港、澳门、台湾地区暂时用不了,如果你做的是面向这些地区的应用,可能得等后续更新。
账号准备:设备必须登录华为账号,而且要联网,智能体需要和小艺开放平台交互,没登录的话会直接报错,这点要在App里加个引导提示。

另外,别忘了先在小艺开放平台把你的智能体创建并上线,拿到唯一的agentId。这是后续开发的关键,没有它组件根本拉不起智能体。

四、实战:用Function组件拉起智能体的完整流程

接下来就是最核心的开发步骤了,我按自己项目里的实现过程来写,代码里会标上关键注释,直接复制改改就能用。

1. 第一步:引入必要的依赖包

首先找到项目根目录下的/src/main/ets/pages/Index.ets文件(如果你的入口页面不是Index.ets,就找对应的页面文件),把需要的类引进来。这里要注意包名别写错,尤其是AgentFrameworkKit的路径:

// 引入Agent Framework Kit核心组件和控制器
import { FunctionComponent, FunctionController } from '@kit.AgentFrameworkKit';
// 处理业务错误
import { BusinessError } from "@kit.BasicServicesKit";
// 日志打印(方便调试)
import { hilog } from "@kit.PerformanceAnalysisKit";
// 后面判断Agent可用性会用到UIAbilityContext
import { common } from '@kit.ArkUI';

2. 第二步:构建基础页面与Function组件

接下来在页面中创建FunctionComponent,这里有两个必填参数绝对不能漏:agentId(你在小艺开放平台拿到的智能体ID)和onError(错误回调,不然出问题没法定位)。

我先写了个最基础的示例,组件会默认显示成图标样式(因为没设title):

@Entry
@Component
export struct AgentDemoPage {// 初始化Function控制器,用来后续监听事件、判断可用性private agentController: FunctionController = new FunctionController();// 替换成你自己的agentId!替换成你自己的agentId!替换成你自己的agentId!private myAgentId: string = 'agentproxy65481da1fa2293a8482d45';build() {// 用Column布局把组件放在页面中间Column({ space: 20, alignItems: ItemAlign.Center }) {Text('我的智能体入口').fontSize(20).fontWeight(FontWeight.Bold)// 核心的Function组件FunctionComponent({agentId: this.myAgentId, // 必填:智能体唯一标识onError: (err: BusinessError) => { // 必填:错误回调// 打印错误信息,方便调试hilog.error(0x0001, 'AgentDemo', `智能体拉起失败:${err.code} - ${err.message}`);// 这里可以加用户提示,比如Toast.showToast},controller: this.agentController, // 绑定控制器options: {// 这里没设title,组件会显示成图标样式queryText: '' // 可选:默认的用户意图,空的话就是智能体主入口}})}.width('100%').height('100%').padding(20)}
}

3. 优化:先判断Agent是否可用,再加载组件

上面的基础版有个问题:如果agentId无效,或者设备不支持智能体功能,组件会加载失败但用户看不到提示。我后来加了个判断逻辑。

页面加载前先检查当前agentId是否可用,可用再渲染组件,体验更友好。

在刚才的代码里加这段逻辑:

@Entry
@Component
export struct AgentDemoPage {private agentController: FunctionController = new FunctionController();private myAgentId: string = 'agentproxy65481da1fa2293a8482d45';// 新增:标记当前agent是否可用@State isAgentAvailable: boolean = false;// 页面即将显示时,检查Agent可用性aboutToAppear() {this.checkAgentSupport();}// 异步检查Agent是否可用async checkAgentSupport() {try {// 获取UIAbility上下文,用于检查const context = this.getUIContext()?.getHostContext() as common.UIAbilityContext;// 调用控制器的isAgentSupport方法,传入上下文和agentIdthis.isAgentAvailable = await this.agentController.isAgentSupport(context, this.myAgentId);} catch (err) {const error = err as BusinessError;hilog.error(0x0001, 'AgentDemo', `检查Agent可用性失败:${error.code} - ${error.message}`);this.isAgentAvailable = false;}}build() {Column({ space: 20, alignItems: ItemAlign.Center }) {Text('我的智能体入口').fontSize(20).fontWeight(FontWeight.Bold)// 只有Agent可用时,才渲染组件if (this.isAgentAvailable) {FunctionComponent({agentId: this.myAgentId,onError: (err: BusinessError) => {hilog.error(0x0001, 'AgentDemo', `智能体拉起失败:${err.code} - ${err.message}`);},controller: this.agentController,options: {title: '智能生成任务', // 这里设了title,组件会显示成按钮样式queryText: '帮我生成本周的工作计划', // 带明确意图isShowShadow: true // 可选:给按钮加阴影,视觉效果更好}})} else {// Agent不可用时,显示提示Text('当前设备不支持智能体功能,请检查设备或账号状态').fontSize(14).fontColor('#ff4444')}}.width('100%').height('100%').padding(20)}
}

4. 进阶:监听智能体对话框的状态

有时候需要知道用户什么时候打开/关闭了智能体对话框,比如统计使用次数,或者在对话框关闭后刷新页面数据。这时候可以给控制器加监听事件,注意在页面销毁时移除监听,避免内存泄漏。

继续完善代码,加入监听逻辑:

@Entry
@Component
export struct AgentDemoPage {private agentController: FunctionController = new FunctionController();private myAgentId: string = 'agentproxy65481da1fa2293a8482d45';@State isAgentAvailable: boolean = false;aboutToAppear() {this.checkAgentSupport();// 页面显示时,初始化监听this.initAgentListeners();}aboutToDisappear() {// 页面销毁时,移除监听,避免内存泄漏this.removeAgentListeners();}async checkAgentSupport() {// (同上,省略重复代码)}// 初始化监听:对话框打开和关闭事件initAgentListeners() {// 监听对话框打开this.agentController?.on('agentDialogOpened', () => {hilog.info(0x0001, 'AgentDemo', '用户打开了智能体对话框');// 这里可以加业务逻辑,比如记录用户行为});// 监听对话框关闭this.agentController?.on('agentDialogClosed', () => {hilog.info(0x0001, 'AgentDemo', '用户关闭了智能体对话框');// 比如对话框关闭后,刷新页面数据// this.refreshPageData();});}// 移除监听removeAgentListeners() {this.agentController?.off('agentDialogOpened');this.agentController?.off('agentDialogClosed');}build() {// (同上,省略重复代码)}
}

5. DEMO源码

最后,我把上面的逻辑整合了一份完整代码,大家复制过去,替换掉myAgentId,用真实手机(登录华为账号、联网)就能跑通:

import { FunctionComponent, FunctionController } from '@kit.AgentFrameworkKit';
import { BusinessError } from "@kit.BasicServicesKit";
import { hilog } from "@kit.PerformanceAnalysisKit";
import { common } from '@kit.ArkUI';
import { Column, Text, ItemAlign } from '@kit.ArkUI';@Entry
@Component
export struct AgentFunctionDemo {// 1. 初始化控制器和agentId(替换成你的真实agentId)private agentController: FunctionController = new FunctionController();private myAgentId: string = 'agentproxy65481da1fa2293a8482d45'; // 替换这里!// 2. 标记Agent是否可用@State isAgentAvailable: boolean = false;// 3. 页面加载前:检查Agent可用性 + 初始化监听aboutToAppear() {this.checkAgentSupport();this.initAgentListeners();}// 4. 页面销毁:移除监听aboutToDisappear() {this.removeAgentListeners();}// 5. 检查Agent是否可用async checkAgentSupport() {try {const context = this.getUIContext()?.getHostContext() as common.UIAbilityContext;this.isAgentAvailable = await this.agentController.isAgentSupport(context, this.myAgentId);} catch (err) {const error = err as BusinessError;hilog.error(0x0001, 'AgentDemo', `检查失败:${error.code} - ${error.message}`);this.isAgentAvailable = false;}}// 6. 监听对话框状态initAgentListeners() {this.agentController?.on('agentDialogOpened', () => {hilog.info(0x0001, 'AgentDemo', '智能体对话框已打开');// 可添加:记录用户行为、切换页面状态等逻辑});this.agentController?.on('agentDialogClosed', () => {hilog.info(0x0001, 'AgentDemo', '智能体对话框已关闭');// 可添加:刷新数据、弹窗提示等逻辑});}// 7. 移除监听removeAgentListeners() {this.agentController?.off('agentDialogOpened');this.agentController?.off('agentDialogClosed');}// 8. 页面渲染build() {Column({ space: 24, alignItems: ItemAlign.Center }) {Text('HarmonyOS智能体入口示例').fontSize(22).fontWeight(FontWeight.Bold).textColor('#1a1a1a')// Agent可用时显示按钮,不可用时显示提示if (this.isAgentAvailable) {FunctionComponent({agentId: this.myAgentId,onError: (err: BusinessError) => {hilog.error(0x0001, 'AgentDemo', `拉起失败:${err.code} - ${err.message}`);// 这里可以加Toast提示用户,比如:// Toast.showToast({ message: '智能体拉起失败,请稍后再试' });},controller: this.agentController,options: {title: '智能生成工作计划', // 按钮标题(显示为按钮组件)queryText: '帮我生成一份本周的开发工作计划,包含需求评审、编码、测试', // 初始意图isShowShadow: true, // 显示按钮阴影// 更多配置可参考官方文档的FunctionComponent参数说明}})} else {Text('当前设备不支持智能体功能\n请检查:1. 登录华为账号 2. 联网 3. 使用手机/平板').fontSize(14).textColor('#ff4444').textAlign(TextAlign.Center).width('80%')}}.width('100%').height('100%').padding(30).backgroundColor('#f5f5f5')}
}

五、如何创建小艺生态智能体

傻瓜操作,在小艺开放平台上,点击创建后,使用自然语言描述你的智能体的功能和作用。目前上架还没完全开放。但是可以体验效果。
在这里插入图片描述

http://www.dtcms.com/a/363982.html

相关文章:

  • 博客系统的测试
  • Shell脚本一键监控平台到期时间并钉钉告警推送指定人
  • 黑马头条面试重点业务
  • 如何避免研发文档命名混乱导致难以检索
  • 我们正在成为机械半类人你信吗?
  • Photoshop - Ps 处理图层
  • 数字社会学必读书目推荐!唐兴通20年数字社会学探索思想之旅再回顾人工智能社会学AI社会学下新秩序
  • 计算机保研机试准备——C++算法题(二)
  • 嵌入式学习 day62 SPI子系统、adxl345驱动、驱动回顾
  • 依托深兰科技AI技术生态,深兰教育携手沪上高校企业启动就业科创营
  • CRM数据暴风升级!3步将DataEase可视化神技嵌入Cordys,销售分析直接开挂!
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘flake8’问题
  • 【Vue2 ✨】Vue2 入门之旅(十):Vuex 入门
  • 【机器学习学习笔记】Matplotlib 基本操作
  • 论文解读:基于 77 GHz FMCW 毫米波雷达的舱内占位检测
  • HDI是什么?与普通线路板有何区别?优势在哪?
  • java面试中经常会问到的多线程问题有哪些(基础版)
  • 宋红康 JVM 笔记 Day10|对象实例化
  • 2025全球绿色发展与健康生活方式高峰论坛 推动HLCC国际认证体系全球化实施
  • DuckDB新版rusty_sheet 插件测试
  • Android U Lmkd源码解析
  • 【Unity开发】丧尸围城项目实现总结
  • 自发自用分布式光伏电站进线柜防逆流测控保护装置
  • 什么是数据库管理系统(DBMS)?RDBMS和NoSQL又是什么?
  • vue2中如何使用Ant Design Vue 中的 Tooltip 文字提示
  • C#类对象映射AutoMapper
  • JUC 并发集合:高效处理多线程数据共享的利器
  • 开源的聚合支付系统源码/易支付系统 /三方支付系统
  • More Effective C++ 条款24:理解虚拟函数、多继承、虚继承和RTTI的成本
  • 第一次用pyQt6制作JSON小工具