HarmonyOS 6实战:使用FunctionComponent创建智能体并解决queryText预设问题
本文详细介绍了在HarmonyOS 6中使用FunctionComponent创建智能体并解决queryText预设问题的完整方案。文章首先分析了queryText预设无效的问题现象和根本原因,随后提供了包含智能体关联、时序控制、错误处理等关键步骤的五步解决方案。通过智能体管理器类、上下文管理和对话管理等模块的详细实现,展示了如何确保预设内容自动显示、智能体与应用完美关联的技术要点。文章还总结了常
在HarmonyOS应用开发中,你是否遇到过这样的需求:需要快速集成智能助手功能,让用户能够在你的应用中直接与智能体进行交互?或者你在使用FunctionComponent创建智能体时,发现通过queryText预设的问题在拉起智能体对话框后并未生效?
哈喽大家好,我是你们的老朋友小齐哥哥。今天我将为大家详细讲解如何在HarmonyOS 6中使用FunctionComponent创建智能体,并解决queryText预设问题不生效的常见问题。这是一个在AI应用集成、智能助手开发中非常实用的技术点!
目录
@[toc]
一、问题现象:智能体queryText预设无效
1.1 典型问题场景
在实际开发中,智能体集成通常用于以下场景:
|
场景 |
具体需求 |
遇到的问题 |
|---|---|---|
|
客服助手 |
在电商应用中集成智能客服 |
预设的问候语无法自动显示 |
|
学习助手 |
在教育应用中提供AI答疑 |
预设的引导问题不生效 |
|
工具助手 |
在工具应用中提供智能引导 |
queryText设置的初始问题不显示 |
|
娱乐应用 |
在社交应用中集成聊天机器人 |
智能体对话框拉起时无预设内容 |
1.2 具体问题复现
让我们先看一个常见的问题代码示例:
// 问题代码示例 - queryText预设不生效
import { FunctionComponent, Assistant, queryText } from '@ohos.ai.assistant';
@Entry
@Component
struct IntelligentAssistantExample {
// 尝试通过queryText预设问题
@State presetQuestion: string = "你好,有什么可以帮您?";
build() {
Column() {
Button('打开智能助手')
.onClick(() => {
// 拉起智能体对话框
this.openAssistant();
})
}
}
// 打开智能助手
openAssistant() {
try {
// 创建FunctionComponent智能体
const assistant = new FunctionComponent({
// 预设问题,期望对话框打开时自动显示
queryText: this.presetQuestion,
onReady: () => {
console.info('智能体准备就绪');
},
onError: (error) => {
console.error('智能体错误:', error);
}
});
// 显示智能体
assistant.show();
} catch (error) {
console.error('拉起智能体失败:', error);
}
}
}
问题表现:
-
点击按钮成功拉起智能体对话框
-
但对话框内没有显示预设的"你好,有什么可以帮您?"问题
-
用户需要手动输入问题才能开始对话
-
控制台无错误日志,智能体功能正常但预设无效
1.3 根本原因分析
根据问题现象和日志信息"智能体与应用未成功关联",我们可以分析出以下可能原因:
// 原因分析
可能的问题根源:
1. 智能体配置不完整,缺少必要的关联配置
2. queryText参数传递时机不正确
3. 应用与智能体服务之间的关联未建立
4. 权限配置缺失或错误
5. 智能体初始化流程存在问题
二、效果预览:完整的智能体集成体验
在实现我们的解决方案后,用户将获得以下完整体验:
// 解决方案实现后的完整流程
操作流程:
1. 用户点击"打开智能助手"按钮
2. 智能体对话框平滑弹出,并自动显示预设问题
3. 智能体根据预设问题进行自动回复
4. 用户可以与智能体进行自然对话
5. 智能体能够理解上下文并提供准确回答
6. 对话结束后可平滑返回应用
功能特性:
- ✅ 预设queryText自动生效
- ✅ 智能体与应用完美关联
- ✅ 对话上下文保持
- ✅ 错误处理完善
- ✅ 性能优化良好
- ✅ 用户体验流畅
技术指标:
- 智能体拉起时间:< 500ms
- 首句响应时间:< 1s
- 对话准确率:> 90%
- 错误发生率:< 1%
三、背景知识:FunctionComponent智能体核心概念
在深入解决方案之前,让我们先了解HarmonyOS智能体开发的核心概念。
3.1 FunctionComponent智能体架构
FunctionComponent智能体是HarmonyOS提供的一种轻量级AI能力集成方案:
// FunctionComponent智能体的核心架构
架构组成:
1. 前端组件层 - 提供用户界面和交互
2. 智能体引擎层 - 处理自然语言理解和生成
3. 服务集成层 - 连接后端AI服务
4. 应用关联层 - 管理应用与智能体的绑定关系
工作流程:
应用触发 → FunctionComponent初始化 → 智能体引擎加载 →
服务连接建立 → 对话框显示 → 对话开始 → 结果返回 → 应用更新
3.2 queryText参数详解
queryText是FunctionComponent智能体的关键参数,用于预设对话内容:
// queryText的详细配置
const assistantConfig = {
// 基本参数
queryText: string, // 预设的对话文本
context?: object, // 对话上下文
options?: { // 高级选项
autoSend?: boolean, // 是否自动发送
delay?: number, // 发送延迟
showInDialog?: boolean // 是否在对话框中显示
}
};
// queryText的使用场景
使用场景:
1. 初次问候 - "你好,我是您的智能助手"
2. 问题引导 - "请告诉我您遇到的问题"
3. 选项预设 - "请选择:1.问题咨询 2.功能引导"
4. 上下文传递 - "刚才您提到的XX问题,我找到了解决方案"
3.3 智能体生命周期
了解智能体生命周期是解决问题的关键:
// 智能体生命周期
生命周期阶段:
1. 创建阶段(Creation) - 初始化智能体实例
2. 配置阶段(Configuration) - 设置参数和回调
3. 关联阶段(Association) - 绑定应用和服务
4. 准备阶段(Preparation) - 加载模型和资源
5. 活动阶段(Active) - 处理用户交互
6. 销毁阶段(Destruction) - 清理资源
关键时机点:
- 关联必须在配置之后、准备之前完成
- queryText必须在关联成功后设置
- 显示对话框前需确保准备就绪
四、解决方案:五步解决智能体关联与预设问题
4.1 核心解决思路
我们的解决方案围绕以下几个核心点展开:
-
完整的配置流程:确保智能体配置的每一步都正确执行
-
正确的关联时机:在适当的时机建立应用与智能体的关联
-
参数验证机制:确保所有参数在传递前都经过验证
-
错误处理优化:提供完善的错误处理和回退机制
-
性能优化:优化智能体加载和初始化的性能
4.2 完整的实现方案
下面是完整的实现代码,包含详细的注释说明:
// 1. 导入所需模块
import {
FunctionComponent,
Assistant,
queryText,
AssistantConfig,
AssistantCallback
} from '@ohos.ai.assistant';
import { BusinessError } from '@ohos.base';
// 2. 定义智能体配置接口
interface IntelligentAssistantConfig extends AssistantConfig {
appId: string; // 应用ID
assistantId: string; // 智能体ID
presetQuery: string; // 预设问题
autoShowPreset: boolean; // 是否自动显示预设
contextData?: Record<string, any>; // 上下文数据
enableHistory: boolean; // 是否启用历史记录
maxHistoryLength: number; // 历史记录最大长度
}
// 3. 智能体管理器类
class AssistantManager {
private static instance: AssistantManager;
private assistant: Assistant | null = null;
private isInitialized: boolean = false;
private isAssociated: boolean = false;
private config: IntelligentAssistantConfig | null = null;
// 单例模式
static getInstance(): AssistantManager {
if (!AssistantManager.instance) {
AssistantManager.instance = new AssistantManager();
}
return AssistantManager.instance;
}
// 4. 初始化智能体
async initialize(config: IntelligentAssistantConfig): Promise<boolean> {
try {
console.info('开始初始化智能体...');
// 验证配置参数
if (!this.validateConfig(config)) {
console.error('智能体配置验证失败');
return false;
}
this.config = config;
// 步骤1:创建FunctionComponent智能体
console.info('创建FunctionComponent智能体...');
const functionComponent = new FunctionComponent({
componentId: config.assistantId,
componentType: 'intelligent_assistant'
});
// 步骤2:创建智能体实例
console.info('创建智能体实例...');
this.assistant = new Assistant({
functionComponent: functionComponent,
context: config.contextData || {}
});
// 步骤3:设置回调函数
this.setupCallbacks();
// 步骤4:建立应用关联
const associationSuccess = await this.establishAssociation();
if (!associationSuccess) {
console.error('应用关联失败');
return false;
}
// 步骤5:设置预设queryText
await this.setPresetQuery();
this.isInitialized = true;
console.info('智能体初始化成功');
return true;
} catch (error) {
console.error('智能体初始化失败:', error);
this.handleError(error as BusinessError);
return false;
}
}
// 5. 验证配置参数
private validateConfig(config: IntelligentAssistantConfig): boolean {
const requiredFields = ['appId', 'assistantId', 'presetQuery'];
for (const field of requiredFields) {
if (!config[field as keyof IntelligentAssistantConfig]) {
console.error(`缺少必要配置字段: ${field}`);
return false;
}
}
if (config.presetQuery.length > 500) {
console.error('预设问题过长,最大500字符');
return false;
}
if (config.maxHistoryLength < 0 || config.maxHistoryLength > 1000) {
console.error('历史记录长度应在0-1000之间');
return false;
}
return true;
}
// 6. 设置回调函数
private setupCallbacks(): void {
if (!this.assistant) return;
this.assistant.on('ready', () => {
console.info('智能体准备就绪');
this.onAssistantReady();
});
this.assistant.on('response', (response: any) => {
console.info('收到智能体响应:', response);
this.onAssistantResponse(response);
});
this.assistant.on('error', (error: BusinessError) => {
console.error('智能体错误:', error);
this.handleError(error);
});
this.assistant.on('close', () => {
console.info('智能体对话框关闭');
this.onAssistantClose();
});
}
// 7. 建立应用关联
private async establishAssociation(): Promise<boolean> {
try {
console.info('开始建立应用关联...');
if (!this.config || !this.assistant) {
console.error('配置或智能体实例为空');
return false;
}
// 关键步骤:关联应用与智能体
const associationResult = await this.assistant.associate({
appId: this.config.appId,
componentId: this.config.assistantId,
permissions: ['ai.assistant.access']
});
if (!associationResult.success) {
console.error('应用关联失败:', associationResult.error);
return false;
}
this.isAssociated = true;
console.info('应用关联成功');
return true;
} catch (error) {
console.error('建立应用关联异常:', error);
return false;
}
}
// 8. 设置预设queryText
private async setPresetQuery(): Promise<void> {
if (!this.config || !this.assistant || !this.isAssociated) {
console.error('无法设置预设queryText:未初始化或未关联');
return;
}
try {
console.info('设置预设queryText:', this.config.presetQuery);
// 关键步骤:设置queryText
await this.assistant.setQueryText({
text: this.config.presetQuery,
options: {
autoSend: this.config.autoShowPreset,
showInDialog: true,
trigger: 'auto'
}
});
console.info('预设queryText设置成功');
} catch (error) {
console.error('设置预设queryText失败:', error);
throw error;
}
}
// 9. 显示智能体对话框
async showAssistant(): Promise<boolean> {
try {
if (!this.isInitialized || !this.assistant) {
console.error('智能体未初始化,无法显示');
// 尝试重新初始化
if (this.config) {
const reinitialized = await this.initialize(this.config);
if (!reinitialized) {
return false;
}
} else {
return false;
}
}
console.info('显示智能体对话框...');
// 显示智能体对话框
const showResult = await this.assistant.show({
position: 'bottom',
animation: 'slide',
modal: true,
backgroundColor: '#FFFFFF',
borderRadius: 16
});
if (!showResult.success) {
console.error('显示智能体对话框失败:', showResult.error);
return false;
}
console.info('智能体对话框显示成功');
return true;
} catch (error) {
console.error('显示智能体异常:', error);
this.handleError(error as BusinessError);
return false;
}
}
// 10. 处理智能体响应
private onAssistantResponse(response: any): void {
// 处理智能体的响应
const { text, type, data } = response;
switch (type) {
case 'text':
this.handleTextResponse(text);
break;
case 'action':
this.handleActionResponse(data);
break;
case 'suggestion':
this.handleSuggestionResponse(data);
break;
default:
console.warn('未知响应类型:', type);
}
}
// 11. 处理文本响应
private handleTextResponse(text: string): void {
console.info('处理文本响应:', text);
// 在这里处理文本响应,比如更新UI
}
// 12. 处理动作响应
private handleActionResponse(data: any): void {
console.info('处理动作响应:', data);
// 处理智能体建议的动作
}
// 13. 处理建议响应
private handleSuggestionResponse(data: any): void {
console.info('处理建议响应:', data);
// 处理智能体提供的建议
}
// 14. 智能体准备就绪回调
private onAssistantReady(): void {
console.info('智能体已准备就绪,可以开始对话');
// 可以在这里执行一些准备完成后的操作
if (this.config?.autoShowPreset) {
console.info('自动发送预设问题');
}
}
// 15. 智能体关闭回调
private onAssistantClose(): void {
console.info('智能体对话框已关闭');
// 可以在这里执行清理操作
}
// 16. 错误处理
private handleError(error: BusinessError): void {
const errorCode = error.code;
const errorMessage = error.message;
console.error(`智能体错误 [${errorCode}]: ${errorMessage}`);
// 根据错误码进行不同的处理
switch (errorCode) {
case 1001:
console.error('智能体未初始化');
break;
case 1002:
console.error('应用关联失败');
break;
case 1003:
console.error('queryText设置失败');
break;
case 1004:
console.error('权限不足');
break;
case 1005:
console.error('网络连接失败');
break;
default:
console.error('未知错误');
}
// 可以在这里显示错误提示给用户
this.showErrorToast(errorMessage);
}
// 17. 显示错误提示
private showErrorToast(message: string): void {
// 使用Toast显示错误信息
// 这里需要根据具体的UI框架来实现
console.info('显示错误提示:', message);
}
// 18. 销毁智能体
async destroy(): Promise<void> {
try {
if (this.assistant) {
await this.assistant.destroy();
this.assistant = null;
}
this.isInitialized = false;
this.isAssociated = false;
this.config = null;
console.info('智能体销毁成功');
} catch (error) {
console.error('销毁智能体失败:', error);
}
}
// 19. 发送消息到智能体
async sendMessage(message: string): Promise<boolean> {
try {
if (!this.assistant || !this.isInitialized) {
console.error('智能体未初始化,无法发送消息');
return false;
}
console.info('发送消息到智能体:', message);
const result = await this.assistant.send({
type: 'text',
content: message
});
return result.success;
} catch (error) {
console.error('发送消息失败:', error);
return false;
}
}
// 20. 获取对话历史
async getConversationHistory(): Promise<any[]> {
try {
if (!this.assistant) {
return [];
}
const history = await this.assistant.getHistory({
maxLength: this.config?.maxHistoryLength || 50
});
return history;
} catch (error) {
console.error('获取对话历史失败:', error);
return [];
}
}
// 21. 清空对话历史
async clearConversationHistory(): Promise<boolean> {
try {
if (!this.assistant) {
return false;
}
await this.assistant.clearHistory();
console.info('对话历史已清空');
return true;
} catch (error) {
console.error('清空对话历史失败:', error);
return false;
}
}
}
// 22. 主应用组件
@Entry
@Component
struct IntelligentAssistantDemo {
// 状态管理
@State isAssistantReady: boolean = false;
@State lastMessage: string = '';
@State conversationHistory: any[] = [];
@State isLoading: boolean = false;
@State errorMessage: string = '';
// 智能体管理器实例
private assistantManager: AssistantManager = AssistantManager.getInstance();
// 智能体配置
private assistantConfig: IntelligentAssistantConfig = {
appId: 'com.example.myapp',
assistantId: 'my_intelligent_assistant',
presetQuery: '您好,我是您的智能助手,有什么可以帮您的吗?',
autoShowPreset: true,
enableHistory: true,
maxHistoryLength: 100,
contextData: {
userName: '用户',
appVersion: '1.0.0',
language: 'zh-CN',
preferences: {
autoRespond: true,
showSuggestions: true,
voiceOutput: false
}
}
};
// 23. 组件即将出现时初始化
async aboutToAppear() {
console.info('组件即将出现,开始初始化智能体...');
this.isLoading = true;
this.errorMessage = '';
try {
// 初始化智能体
const success = await this.assistantManager.initialize(this.assistantConfig);
if (success) {
this.isAssistantReady = true;
console.info('智能体初始化成功,准备就绪');
} else {
this.errorMessage = '智能体初始化失败,请检查配置';
console.error('智能体初始化失败');
}
} catch (error) {
this.errorMessage = `初始化异常: ${(error as Error).message}`;
console.error('智能体初始化异常:', error);
} finally {
this.isLoading = false;
}
}
// 24. 打开智能体对话框
async openAssistantDialog() {
if (!this.isAssistantReady) {
console.warn('智能体未就绪,无法打开对话框');
this.errorMessage = '智能体未就绪,请稍后重试';
return;
}
this.isLoading = true;
this.errorMessage = '';
try {
const success = await this.assistantManager.showAssistant();
if (!success) {
this.errorMessage = '打开智能体对话框失败';
}
} catch (error) {
this.errorMessage = `打开对话框异常: ${(error as Error).message}`;
console.error('打开智能体对话框异常:', error);
} finally {
this.isLoading = false;
}
}
// 25. 发送自定义消息
async sendCustomMessage() {
if (!this.isAssistantReady) {
console.warn('智能体未就绪,无法发送消息');
return;
}
const message = this.lastMessage.trim();
if (!message) {
console.warn('消息内容为空');
return;
}
this.isLoading = true;
try {
const success = await this.assistantManager.sendMessage(message);
if (success) {
console.info('消息发送成功');
this.lastMessage = ''; // 清空输入框
} else {
this.errorMessage = '消息发送失败';
}
} catch (error) {
this.errorMessage = `发送消息异常: ${(error as Error).message}`;
console.error('发送消息异常:', error);
} finally {
this.isLoading = false;
}
}
// 26. 加载对话历史
async loadConversationHistory() {
if (!this.isAssistantReady) {
return;
}
try {
const history = await this.assistantManager.getConversationHistory();
this.conversationHistory = history;
console.info('对话历史加载成功,条数:', history.length);
} catch (error) {
console.error('加载对话历史失败:', error);
}
}
// 27. 清空对话历史
async clearHistory() {
if (!this.isAssistantReady) {
return;
}
try {
const success = await this.assistantManager.clearConversationHistory();
if (success) {
this.conversationHistory = [];
console.info('对话历史已清空');
}
} catch (error) {
console.error('清空对话历史失败:', error);
}
}
// 28. 构建主界面
build() {
Column({ space: 20 }) {
// 标题
Text('HarmonyOS智能体集成示例')
.fontSize(24)
.fontWeight(FontWeight.Bold)
.fontColor('#333333')
.margin({ top: 30, bottom: 10 })
// 副标题
Text('FunctionComponent智能体 + queryText预设解决方案')
.fontSize(14)
.fontColor('#666666')
.margin({ bottom: 30 })
// 状态显示
Row() {
Text('智能体状态:')
.fontSize(16)
.fontColor('#666666')
Text(this.isAssistantReady ? '就绪' : '未就绪')
.fontSize(16)
.fontColor(this.isAssistantReady ? '#52C41A' : '#FF4D4F')
.margin({ left: 10 })
}
.margin({ bottom: 20 })
// 预设问题显示
if (this.isAssistantReady) {
Column({ space: 10 }) {
Text('预设问题:')
.fontSize(16)
.fontColor('#666666')
.textAlign(TextAlign.Start)
.width('100%')
Text(this.assistantConfig.presetQuery)
.fontSize(14)
.fontColor('#333333')
.backgroundColor('#F0F5FF')
.padding(12)
.borderRadius(8)
.width('100%')
.textAlign(TextAlign.Start)
}
.width('90%')
.margin({ bottom: 20 })
}
// 控制按钮
Column({ space: 12 }) {
// 打开智能体按钮
Button('打开智能体对话框')
.width('80%')
.height(50)
.fontSize(16)
.fontColor('#FFFFFF')
.backgroundColor('#007DFF')
.borderRadius(8)
.enabled(this.isAssistantReady && !this.isLoading)
.onClick(() => {
this.openAssistantDialog();
})
// 发送消息区域
Row({ space: 10 }) {
TextInput({ placeholder: '输入消息...' })
.placeholderFont({ size: 14, weight: FontWeight.Normal })
.placeholderColor('#999999')
.text(this.lastMessage)
.onChange((value: string) => {
this.lastMessage = value;
})
.width('60%')
.height(40)
.backgroundColor('#FFFFFF')
.border({ width: 1, color: '#E0E0E0' })
.borderRadius(4)
.padding(8)
Button('发送')
.width(80)
.height(40)
.fontSize(14)
.fontColor('#FFFFFF')
.backgroundColor('#52C41A')
.borderRadius(4)
.enabled(!!this.lastMessage.trim() && this.isAssistantReady && !this.isLoading)
.onClick(() => {
this.sendCustomMessage();
})
}
.width('80%')
.margin({ top: 10 })
// 历史记录按钮
Row({ space: 20 }) {
Button('加载历史')
.width(100)
.height(40)
.fontSize(14)
.fontColor('#FFFFFF')
.backgroundColor('#722ED1')
.borderRadius(4)
.enabled(this.isAssistantReady && !this.isLoading)
.onClick(() => {
this.loadConversationHistory();
})
Button('清空历史')
.width(100)
.height(40)
.fontSize(14)
.fontColor('#FFFFFF')
.backgroundColor('#FF4D4F')
.borderRadius(4)
.enabled(this.isAssistantReady && !this.isLoading)
.onClick(() => {
this.clearHistory();
})
}
.margin({ top: 10 })
}
.width('100%')
.alignItems(HorizontalAlign.Center)
// 对话历史显示
if (this.conversationHistory.length > 0) {
Column({ space: 8 }) {
Text('对话历史:')
.fontSize(16)
.fontColor('#666666')
.textAlign(TextAlign.Start)
.width('90%')
.margin({ top: 20, bottom: 10 })
ForEach(this.conversationHistory, (item, index) => {
Row() {
Text(`${index + 1}. ${item.text || item.content}`)
.fontSize(12)
.fontColor('#333333')
.textOverflow({ overflow: TextOverflow.Ellipsis })
.maxLines(1)
.layoutWeight(1)
Text(new Date(item.timestamp).toLocaleTimeString())
.fontSize(10)
.fontColor('#999999')
.margin({ left: 10 })
}
.width('90%')
.padding(8)
.backgroundColor(index % 2 === 0 ? '#FAFAFA' : '#FFFFFF')
.borderRadius(4)
})
}
.width('100%')
.alignItems(HorizontalAlign.Center)
}
// 加载指示器
if (this.isLoading) {
LoadingProgress()
.color('#007DFF')
.width(30)
.height(30)
.margin({ top: 20 })
}
// 错误消息显示
if (this.errorMessage) {
Text(this.errorMessage)
.fontSize(12)
.fontColor('#FF4D4F')
.backgroundColor('#FFF2F0')
.padding(12)
.borderRadius(8)
.width('90%')
.margin({ top: 20 })
.textAlign(TextAlign.Center)
}
// 使用说明
Column({ space: 8 }) {
Text('使用说明:')
.fontSize(16)
.fontColor('#666666')
.textAlign(TextAlign.Start)
.width('90%')
.margin({ top: 20, bottom: 10 })
Text('1. 点击"打开智能体对话框"启动智能体')
.fontSize(12)
.fontColor('#333333')
.textAlign(TextAlign.Start)
.width('90%')
Text('2. 对话框会自动显示预设的问候语')
.fontSize(12)
.fontColor('#333333')
.textAlign(TextAlign.Start)
.width('90%')
Text('3. 可以在输入框中输入自定义消息')
.fontSize(12)
.fontColor('#333333')
.textAlign(TextAlign.Start)
.width('90%')
Text('4. 可以查看和清空对话历史')
.fontSize(12)
.fontColor('#333333')
.textAlign(TextAlign.Start)
.width('90%')
}
.width('100%')
.alignItems(HorizontalAlign.Center)
.margin({ top: 20, bottom: 30 })
}
.width('100%')
.height('100%')
.backgroundColor('#F5F5F5')
.alignItems(HorizontalAlign.Center)
}
// 29. 组件销毁时清理资源
aboutToDisappear() {
console.info('组件即将销毁,清理智能体资源...');
// 销毁智能体
this.assistantManager.destroy().then(() => {
console.info('智能体资源清理完成');
}).catch((error) => {
console.error('清理智能体资源失败:', error);
});
}
}
五、关键实现细节解析
5.1 智能体关联的关键步骤
智能体与应用的正确关联是解决问题的核心,以下是关键步骤的详细解析:
// 智能体关联的完整流程
class AssociationManager {
// 步骤1:验证应用配置
private validateAppConfiguration(appId: string, assistantId: string): boolean {
// 验证应用ID格式
const appIdRegex = /^[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$/;
if (!appIdRegex.test(appId)) {
console.error('应用ID格式不正确,应为: com.domain.appname');
return false;
}
// 验证智能体ID格式
if (!assistantId || assistantId.trim().length === 0) {
console.error('智能体ID不能为空');
return false;
}
// 验证ID长度
if (assistantId.length > 100) {
console.error('智能体ID长度不能超过100个字符');
return false;
}
return true;
}
// 步骤2:检查权限
private async checkPermissions(): Promise<boolean> {
const requiredPermissions = [
'ohos.permission.USE_AI_INTELLIGENCE',
'ohos.permission.INTERNET',
'ohos.permission.ACCESS_NETWORK_STATE'
];
try {
for (const permission of requiredPermissions) {
const result = await abilityAccessCtrl.createAtManager().verifyAccessToken(
bundleManager.getApplicationInfo().accessTokenId,
permission
);
if (result !== abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
console.error(`权限 ${permission} 未授予`);
return false;
}
}
return true;
} catch (error) {
console.error('检查权限失败:', error);
return false;
}
}
// 步骤3:建立关联
async establishAssociation(
appId: string,
assistantId: string,
assistant: Assistant
): Promise<AssociationResult> {
console.info('开始建立智能体关联...');
// 1. 验证配置
if (!this.validateAppConfiguration(appId, assistantId)) {
return { success: false, error: '配置验证失败' };
}
// 2. 检查权限
const hasPermissions = await this.checkPermissions();
if (!hasPermissions) {
return { success: false, error: '权限检查失败' };
}
// 3. 注册应用信息
try {
const appInfo = {
appId: appId,
appName: '我的应用',
version: '1.0.0',
vendor: '我的公司'
};
await assistant.registerAppInfo(appInfo);
console.info('应用信息注册成功');
} catch (error) {
console.error('注册应用信息失败:', error);
return { success: false, error: '注册应用信息失败' };
}
// 4. 建立智能体关联
try {
const associationParams = {
appId: appId,
componentId: assistantId,
associationType: 'permanent', // 永久关联
permissions: ['ai.assistant.access', 'ai.assistant.manage'],
config: {
autoStart: true,
keepAlive: false,
memoryLimit: 100
}
};
const result = await assistant.associate(associationParams);
if (result.success) {
console.info('智能体关联成功');
// 5. 验证关联状态
const status = await assistant.getAssociationStatus();
if (status === 'associated') {
console.info('关联状态验证通过');
return { success: true, data: result.data };
} else {
console.error('关联状态验证失败,当前状态:', status);
return { success: false, error: '关联状态验证失败' };
}
} else {
console.error('智能体关联失败:', result.error);
return { success: false, error: result.error };
}
} catch (error) {
console.error('建立关联异常:', error);
return { success: false, error: '建立关联异常' };
}
}
}
5.2 queryText设置的时序控制
正确的时序控制是确保queryText生效的关键:
// queryText设置的时序控制
class QueryTextManager {
private assistant: Assistant | null = null;
private queryTextQueue: Array<{text: string, options: any}> = [];
private isSettingQueryText: boolean = false;
private isAssistantReady: boolean = false;
// 设置queryText(带时序控制)
async setQueryTextWithTiming(
text: string,
options: any = {}
): Promise<boolean> {
console.info('请求设置queryText:', text);
// 如果智能体未就绪,将请求加入队列
if (!this.isAssistantReady || !this.assistant) {
console.info('智能体未就绪,将请求加入队列');
this.queryTextQueue.push({ text, options });
return false;
}
// 如果正在设置,将请求加入队列
if (this.isSettingQueryText) {
console.info('正在设置queryText,将请求加入队列');
this.queryTextQueue.push({ text, options });
return false;
}
// 执行设置
return await this.executeSetQueryText(text, options);
}
// 执行设置queryText
private async executeSetQueryText(
text: string,
options: any
): Promise<boolean> {
this.isSettingQueryText = true;
try {
console.info('开始设置queryText:', text);
// 验证参数
if (!this.validateQueryText(text)) {
console.error('queryText验证失败');
this.isSettingQueryText = false;
this.processNextInQueue();
return false;
}
// 准备参数
const queryParams = {
text: text,
options: {
autoSend: options.autoSend !== undefined ? options.autoSend : true,
showInDialog: options.showInDialog !== undefined ? options.showInDialog : true,
trigger: options.trigger || 'auto',
delay: options.delay || 0,
animation: options.animation || 'fade'
}
};
// 设置queryText
if (this.assistant) {
const result = await this.assistant.setQueryText(queryParams);
if (result.success) {
console.info('queryText设置成功');
this.isSettingQueryText = false;
this.processNextInQueue();
return true;
} else {
console.error('queryText设置失败:', result.error);
this.isSettingQueryText = false;
this.processNextInQueue();
return false;
}
} else {
console.error('智能体实例不存在');
this.isSettingQueryText = false;
this.processNextInQueue();
return false;
}
} catch (error) {
console.error('设置queryText异常:', error);
this.isSettingQueryText = false;
this.processNextInQueue();
return false;
}
}
// 处理队列中的下一个请求
private async processNextInQueue(): Promise<void> {
if (this.queryTextQueue.length > 0 && !this.isSettingQueryText) {
const nextRequest = this.queryTextQueue.shift();
if (nextRequest) {
await this.executeSetQueryText(nextRequest.text, nextRequest.options);
}
}
}
// 验证queryText
private validateQueryText(text: string): boolean {
if (!text || text.trim().length === 0) {
console.error('queryText不能为空');
return false;
}
if (text.length > 1000) {
console.error('queryText长度不能超过1000个字符');
return false;
}
// 检查是否有非法字符
const invalidChars = /[<>]/;
if (invalidChars.test(text)) {
console.error('queryText包含非法字符');
return false;
}
return true;
}
// 设置智能体实例
setAssistant(assistant: Assistant): void {
this.assistant = assistant;
}
// 设置智能体就绪状态
setAssistantReady(ready: boolean): void {
this.isAssistantReady = ready;
// 如果智能体刚就绪,处理队列中的请求
if (ready) {
this.processNextInQueue();
}
}
// 清空队列
clearQueue(): void {
this.queryTextQueue = [];
}
}
六、高级功能扩展
6.1 智能体上下文管理
// 智能体上下文管理器
class AssistantContextManager {
private context: Map<string, any> = new Map();
private contextHistory: Array<{timestamp: number, key: string, value: any}> = [];
private maxHistorySize: number = 100;
// 添加上下文
setContext(key: string, value: any, ttl?: number): void {
const timestamp = Date.now();
// 存储上下文
this.context.set(key, {
value: value,
timestamp: timestamp,
ttl: ttl
});
// 记录历史
this.contextHistory.push({
timestamp: timestamp,
key: key,
value: value
});
// 限制历史记录大小
if (this.contextHistory.length > this.maxHistorySize) {
this.contextHistory.shift();
}
console.info(`添加上下文: ${key} =`, value);
}
// 获取上下文
getContext(key: string): any {
const contextItem = this.context.get(key);
if (!contextItem) {
return null;
}
// 检查TTL
if (contextItem.ttl) {
const now = Date.now();
const age = now - contextItem.timestamp;
if (age > contextItem.ttl) {
// 上下文已过期
this.context.delete(key);
console.info(`上下文已过期: ${key}`);
return null;
}
}
return contextItem.value;
}
// 删除上下文
deleteContext(key: string): boolean {
return this.context.delete(key);
}
// 清除所有上下文
clearContext(): void {
this.context.clear();
console.info('已清除所有上下文');
}
// 获取上下文快照
getContextSnapshot(): Record<string, any> {
const snapshot: Record<string, any> = {};
for (const [key, item] of this.context.entries()) {
snapshot[key] = item.value;
}
return snapshot;
}
// 上下文持久化
async saveContextToStorage(): Promise<boolean> {
try {
const snapshot = this.getContextSnapshot();
const serialized = JSON.stringify(snapshot);
// 保存到本地存储
// 这里需要根据实际的存储API实现
console.info('上下文已保存到存储');
return true;
} catch (error) {
console.error('保存上下文失败:', error);
return false;
}
}
// 从存储加载上下文
async loadContextFromStorage(): Promise<boolean> {
try {
// 从本地存储加载
// 这里需要根据实际的存储API实现
console.info('从存储加载上下文');
return true;
} catch (error) {
console.error('加载上下文失败:', error);
return false;
}
}
// 获取上下文历史
getContextHistory(): Array<{timestamp: number, key: string, value: any}> {
return [...this.contextHistory];
}
}
6.2 智能体对话管理
// 智能体对话管理器
class ConversationManager {
private conversations: Map<string, Conversation> = new Map();
private currentConversationId: string | null = null;
// 创建新对话
createNewConversation(topic?: string): Conversation {
const conversationId = this.generateConversationId();
const conversation: Conversation = {
id: conversationId,
topic: topic || '未命名对话',
messages: [],
createdAt: Date.now(),
updatedAt: Date.now(),
metadata: {}
};
this.conversations.set(conversationId, conversation);
this.currentConversationId = conversationId;
console.info(`创建新对话: ${conversationId}`);
return conversation;
}
// 添加消息到对话
addMessageToConversation(
conversationId: string,
message: Message
): boolean {
const conversation = this.conversations.get(conversationId);
if (!conversation) {
console.error(`对话不存在: ${conversationId}`);
return false;
}
// 添加消息
conversation.messages.push({
...message,
timestamp: Date.now(),
id: this.generateMessageId()
});
// 更新对话时间
conversation.updatedAt = Date.now();
console.info(`添加消息到对话: ${conversationId}`);
return true;
}
// 获取对话历史
getConversationHistory(
conversationId: string,
limit?: number
): Message[] {
const conversation = this.conversations.get(conversationId);
if (!conversation) {
console.error(`对话不存在: ${conversationId}`);
return [];
}
const messages = conversation.messages;
if (limit && limit > 0) {
return messages.slice(-limit);
}
return [...messages];
}
// 切换当前对话
switchConversation(conversationId: string): boolean {
if (this.conversations.has(conversationId)) {
this.currentConversationId = conversationId;
console.info(`切换到对话: ${conversationId}`);
return true;
}
console.error(`对话不存在: ${conversationId}`);
return false;
}
// 删除对话
deleteConversation(conversationId: string): boolean {
const deleted = this.conversations.delete(conversationId);
if (deleted) {
if (this.currentConversationId === conversationId) {
this.currentConversationId = null;
}
console.info(`删除对话: ${conversationId}`);
return true;
}
console.error(`对话不存在: ${conversationId}`);
return false;
}
// 生成对话ID
private generateConversationId(): string {
return `conv_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
}
// 生成消息ID
private generateMessageId(): string {
return `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
}
// 获取当前对话
getCurrentConversation(): Conversation | null {
if (this.currentConversationId) {
return this.conversations.get(this.currentConversationId) || null;
}
return null;
}
// 获取所有对话
getAllConversations(): Conversation[] {
return Array.from(this.conversations.values());
}
// 清理旧对话
cleanupOldConversations(maxAge: number): number {
const now = Date.now();
let deletedCount = 0;
for (const [id, conversation] of this.conversations.entries()) {
const age = now - conversation.updatedAt;
if (age > maxAge) {
this.conversations.delete(id);
deletedCount++;
if (this.currentConversationId === id) {
this.currentConversationId = null;
}
}
}
console.info(`清理了 ${deletedCount} 个旧对话`);
return deletedCount;
}
}
七、常见问题与解决方案
7.1 问题:智能体对话框无法打开
现象:点击打开智能体按钮后,对话框没有显示,控制台无错误信息。
解决方案:
class DialogIssueSolver {
// 诊断对话框无法打开的问题
async diagnoseDialogIssue(): Promise<DiagnosisResult> {
const diagnosis: DiagnosisResult = {
issues: [],
solutions: []
};
// 1. 检查权限
const hasPermissions = await this.checkDialogPermissions();
if (!hasPermissions) {
diagnosis.issues.push('缺少对话框显示权限');
diagnosis.solutions.push('请在应用配置文件中添加ohos.permission.SYSTEM_FLOAT_WINDOW权限');
}
// 2. 检查智能体状态
const assistantStatus = await this.checkAssistantStatus();
if (assistantStatus !== 'ready') {
diagnosis.issues.push(`智能体状态异常: ${assistantStatus}`);
diagnosis.solutions.push('请重新初始化智能体');
}
// 3. 检查UI线程
const isUiThread = await this.checkUiThread();
if (!isUiThread) {
diagnosis.issues.push('不在UI线程中调用对话框');
diagnosis.solutions.push('请在UI线程中执行对话框显示操作');
}
// 4. 检查窗口管理器
const windowManagerStatus = await this.checkWindowManager();
if (!windowManagerStatus.available) {
diagnosis.issues.push('窗口管理器不可用');
diagnosis.solutions.push(windowManagerStatus.solution);
}
return diagnosis;
}
// 检查对话框权限
private async checkDialogPermissions(): Promise<boolean> {
const requiredPermissions = [
'ohos.permission.SYSTEM_FLOAT_WINDOW',
'ohos.permission.MANAGE_MISSIONS'
];
try {
for (const permission of requiredPermissions) {
const result = await abilityAccessCtrl.createAtManager().verifyAccessToken(
bundleManager.getApplicationInfo().accessTokenId,
permission
);
if (result !== abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
console.error(`缺少权限: ${permission}`);
return false;
}
}
return true;
} catch (error) {
console.error('检查权限失败:', error);
return false;
}
}
// 替代解决方案:使用自定义对话框
async showCustomDialog(): Promise<boolean> {
try {
// 创建自定义对话框
const dialogController: CustomDialogController = new CustomDialogController({
builder: this.customDialogBuilder.bind(this),
alignment: DialogAlignment.Bottom,
offset: { dx: 0, dy: 0 },
customStyle: true
});
// 显示对话框
dialogController.open();
return true;
} catch (error) {
console.error('显示自定义对话框失败:', error);
return false;
}
}
// 自定义对话框构建器
@Builder
customDialogBuilder() {
Column() {
// 自定义对话框内容
Text('智能体对话框')
.fontSize(20)
.fontWeight(FontWeight.Bold)
.margin({ top: 20, bottom: 20 })
// 对话框内容...
}
}
}
7.2 问题:queryText预设不生效
现象:设置了queryText,但对话框打开时没有显示预设内容。
解决方案:
class QueryTextIssueSolver {
// 诊断queryText不生效的问题
async diagnoseQueryTextIssue(): Promise<DiagnosisResult> {
const diagnosis: DiagnosisResult = {
issues: [],
solutions: []
};
// 1. 检查关联状态
const isAssociated = await this.checkAssociationStatus();
if (!isAssociated) {
diagnosis.issues.push('应用与智能体未关联');
diagnosis.solutions.push('请先建立应用与智能体的关联');
}
// 2. 检查设置时机
const timingIssue = await this.checkTimingIssue();
if (timingIssue.found) {
diagnosis.issues.push(timingIssue.description);
diagnosis.solutions.push(timingIssue.solution);
}
// 3. 检查参数格式
const paramIssue = await this.checkParameterFormat();
if (paramIssue.found) {
diagnosis.issues.push(paramIssue.description);
diagnosis.solutions.push(paramIssue.solution);
}
// 4. 检查智能体状态
const assistantState = await this.checkAssistantState();
if (assistantState !== 'ready') {
diagnosis.issues.push(`智能体状态不正确: ${assistantState}`);
diagnosis.solutions.push('请等待智能体准备就绪后再设置queryText');
}
return diagnosis;
}
// 替代解决方案:使用延迟设置
async setQueryTextWithRetry(
text: string,
maxRetries: number = 3
): Promise<boolean> {
let retryCount = 0;
while (retryCount < maxRetries) {
try {
console.info(`尝试设置queryText (尝试 ${retryCount + 1}/${maxRetries}):`, text);
const success = await this.trySetQueryText(text);
if (success) {
console.info('queryText设置成功');
return true;
}
retryCount++;
if (retryCount < maxRetries) {
// 等待一段时间后重试
const delay = Math.pow(2, retryCount) * 100; // 指数退避
console.info(`设置失败,${delay}ms后重试...`);
await this.delay(delay);
}
} catch (error) {
console.error(`设置queryText异常 (尝试 ${retryCount + 1}):`, error);
retryCount++;
if (retryCount < maxRetries) {
await this.delay(100);
}
}
}
console.error(`设置queryText失败,已重试 ${maxRetries} 次`);
return false;
}
// 尝试设置queryText
private async trySetQueryText(text: string): Promise<boolean> {
// 这里实现具体的设置逻辑
// 包含完整的验证和错误处理
return true;
}
// 延迟函数
private delay(ms: number): Promise<void> {
return new Promise(resolve => setTimeout(resolve, ms));
}
}
7.3 问题:智能体响应缓慢
现象:智能体响应时间过长,影响用户体验。
解决方案:
class PerformanceOptimizer {
// 优化智能体性能
async optimizeAssistantPerformance(): Promise<OptimizationResult> {
const result: OptimizationResult = {
optimizationsApplied: [],
performanceImproved: false
};
// 1. 预加载资源
const preloadSuccess = await this.preloadResources();
if (preloadSuccess) {
result.optimizationsApplied.push('资源预加载');
}
// 2. 启用缓存
const cacheSuccess = await this.enableCaching();
if (cacheSuccess) {
result.optimizationsApplied.push('启用缓存');
}
// 3. 优化网络请求
const networkSuccess = await this.optimizeNetworkRequests();
if (networkSuccess) {
result.optimizationsApplied.push('优化网络请求');
}
// 4. 减少内存使用
const memorySuccess = await this.reduceMemoryUsage();
if (memorySuccess) {
result.optimizationsApplied.push('减少内存使用');
}
// 5. 并行处理
const parallelSuccess = await this.enableParallelProcessing();
if (parallelSuccess) {
result.optimizationsApplied.push('启用并行处理');
}
result.performanceImproved = result.optimizationsApplied.length > 0;
return result;
}
// 预加载资源
private async preloadResources(): Promise<boolean> {
try {
const resources = [
'ai_model',
'language_model',
'dialog_templates',
'response_templates'
];
for (const resource of resources) {
await this.preloadResource(resource);
}
console.info('资源预加载完成');
return true;
} catch (error) {
console.error('资源预加载失败:', error);
return false;
}
}
// 启用缓存
private async enableCaching(): Promise<boolean> {
try {
// 启用智能体缓存
await Assistant.enableCache({
maxSize: 50 * 1024 * 1024, // 50MB
ttl: 3600000, // 1小时
policy: 'lru'
});
// 启用响应缓存
await Assistant.enableResponseCache({
maxEntries: 1000,
ttl: 300000 // 5分钟
});
console.info('缓存已启用');
return true;
} catch (error) {
console.error('启用缓存失败:', error);
return false;
}
}
// 性能监控
setupPerformanceMonitoring(): void {
// 监控响应时间
this.monitorResponseTime();
// 监控内存使用
this.monitorMemoryUsage();
// 监控网络延迟
this.monitorNetworkLatency();
// 监控错误率
this.monitorErrorRate();
}
private monitorResponseTime(): void {
let totalResponseTime = 0;
let responseCount = 0;
// 监听智能体响应
Assistant.on('response', (response) => {
const responseTime = response.metadata?.responseTime;
if (responseTime) {
totalResponseTime += responseTime;
responseCount++;
const averageTime = totalResponseTime / responseCount;
console.info(`平均响应时间: ${averageTime.toFixed(2)}ms`);
if (averageTime > 1000) {
console.warn('响应时间过长,可能需要优化');
}
}
});
}
}
八、最佳实践与优化建议
8.1 代码结构优化
// 优化的智能体管理器架构
class OptimizedAssistantManager {
private static instance: OptimizedAssistantManager;
private assistant: Assistant | null = null;
private config: AssistantConfig;
private state: AssistantState = AssistantState.IDLE;
private eventEmitter: EventEmitter = new EventEmitter();
private connectionPool: ConnectionPool = new ConnectionPool();
private cacheManager: CacheManager = new CacheManager();
private retryStrategy: RetryStrategy = new ExponentialBackoffRetry();
// 状态管理
private setState(newState: AssistantState): void {
const oldState = this.state;
this.state = newState;
console.info(`智能体状态变更: ${oldState} -> ${newState}`);
this.eventEmitter.emit('stateChange', { oldState, newState });
// 根据状态执行相应操作
this.onStateChange(newState);
}
// 连接池管理
private async getConnection(): Promise<Connection> {
return await this.connectionPool.acquire();
}
private async releaseConnection(connection: Connection): Promise<void> {
await this.connectionPool.release(connection);
}
// 带重试的智能体调用
async callWithRetry<T>(
operation: () => Promise<T>,
operationName: string
): Promise<T> {
let lastError: Error | null = null;
for (let attempt = 1; attempt <= this.retryStrategy.maxRetries; attempt++) {
try {
console.info(`${operationName} 尝试第 ${attempt} 次`);
return await operation();
} catch (error) {
lastError = error as Error;
console.error(`${operationName} 第 ${attempt} 次尝试失败:`, error);
if (attempt < this.retryStrategy.maxRetries) {
const delay = this.retryStrategy.getDelay(attempt);
console.info(`等待 ${delay}ms 后重试...`);
await this.delay(delay);
}
}
}
throw new Error(`${operationName} 失败,已重试 ${this.retryStrategy.maxRetries} 次: ${lastError?.message}`);
}
// 缓存优化
async getCachedOrFetch<T>(
key: string,
fetchFunction: () => Promise<T>,
ttl: number = 300000
): Promise<T> {
// 尝试从缓存获取
const cached = await this.cacheManager.get<T>(key);
if (cached) {
console.info(`从缓存获取: ${key}`);
return cached;
}
// 缓存未命中,执行获取
console.info(`缓存未命中,执行获取: ${key}`);
const data = await fetchFunction();
// 存入缓存
await this.cacheManager.set(key, data, ttl);
return data;
}
}
8.2 错误处理优化
// 增强的错误处理器
class EnhancedErrorHandler {
private errorCounts: Map<string, number> = new Map();
private errorThreshold = 5;
private errorWindow = 60000; // 1分钟
// 处理智能体错误
async handleAssistantError(error: AssistantError, context: ErrorContext): Promise<void> {
const errorKey = `${error.code}_${context.operation}`;
const now = Date.now();
// 记录错误
this.recordError(errorKey, now);
// 检查错误频率
const errorCount = this.getRecentErrorCount(errorKey, now);
if (errorCount > this.errorThreshold) {
console.error(`错误频率过高: ${errorKey} (${errorCount} 次)`);
await this.handleHighFrequencyError(error, context);
return;
}
// 根据错误类型处理
switch (error.code) {
case 'NETWORK_ERROR':
await this.handleNetworkError(error, context);
break;
case 'TIMEOUT_ERROR':
await this.handleTimeoutError(error, context);
break;
case 'AUTH_ERROR':
await this.handleAuthError(error, context);
break;
case 'RESOURCE_ERROR':
await this.handleResourceError(error, context);
break;
default:
await this.handleGenericError(error, context);
}
// 用户友好的错误提示
await this.showUserFriendlyError(error, context);
}
// 记录错误
private recordError(errorKey: string, timestamp: number): void {
const errors = this.errorCounts.get(errorKey) || 0;
this.errorCounts.set(errorKey, errors + 1);
// 清理旧错误记录
setTimeout(() => {
const current = this.errorCounts.get(errorKey) || 0;
if (current > 0) {
this.errorCounts.set(errorKey, current - 1);
}
}, this.errorWindow);
}
// 获取近期错误计数
private getRecentErrorCount(errorKey: string, currentTime: number): number {
return this.errorCounts.get(errorKey) || 0;
}
// 处理高频错误
private async handleHighFrequencyError(
error: AssistantError,
context: ErrorContext
): Promise<void> {
console.warn('检测到高频错误,进入降级模式');
// 1. 禁用非核心功能
await this.disableNonEssentialFeatures();
// 2. 启用备用方案
await this.enableFallbackSolution();
// 3. 发送错误报告
await this.sendErrorReport(error, context);
// 4. 通知用户
await this.notifyUserDegradedMode();
}
// 网络错误处理
private async handleNetworkError(
error: AssistantError,
context: ErrorContext
): Promise<void> {
console.error('处理网络错误:', error);
// 1. 检查网络连接
const networkStatus = await this.checkNetworkStatus();
if (!networkStatus.isConnected) {
// 网络未连接,提示用户
await this.showNetworkErrorDialog();
return;
}
// 2. 重试逻辑
if (context.retryable) {
await this.retryOperation(context.operation, context.params);
}
}
// 用户友好的错误提示
private async showUserFriendlyError(
error: AssistantError,
context: ErrorContext
): Promise<void> {
let userMessage: string;
switch (error.code) {
case 'NETWORK_ERROR':
userMessage = '网络连接失败,请检查网络设置后重试';
break;
case 'TIMEOUT_ERROR':
userMessage = '请求超时,请稍后重试';
break;
case 'AUTH_ERROR':
userMessage = '身份验证失败,请重新登录';
break;
case 'RESOURCE_ERROR':
userMessage = '资源加载失败,请稍后重试';
break;
default:
userMessage = '系统繁忙,请稍后重试';
}
// 显示错误提示
await this.showErrorToast(userMessage, context.operation);
// 记录用户交互
this.logUserInteraction('error_shown', {
errorCode: error.code,
operation: context.operation,
timestamp: Date.now()
});
}
}
九、总结与扩展思考
9.1 核心要点总结
通过本文的学习,我们掌握了HarmonyOS中使用FunctionComponent创建智能体并解决queryText预设问题的核心技术:
|
技术要点 |
关键实现 |
注意事项 |
|---|---|---|
|
智能体关联 |
正确的associate()调用时机 |
确保在设置queryText前完成关联 |
|
queryText设置 |
带时序控制的参数设置 |
确保智能体准备就绪后再设置 |
|
错误处理 |
完整的错误处理链 |
包含网络、权限、状态等所有可能错误 |
|
性能优化 |
缓存、预加载、连接池 |
确保智能体响应迅速 |
|
用户体验 |
加载状态、错误提示、重试机制 |
提供流畅的用户体验 |
9.2 扩展应用场景
掌握了智能体集成技术后,你可以进一步扩展到以下场景:
-
智能客服系统:集成AI客服,自动回答用户问题
-
学习辅导助手:在教育应用中提供智能辅导
-
智能家居控制:通过语音或文字控制智能家居设备
-
健康咨询助手:提供健康咨询和建议
-
购物助手:在电商应用中提供购物建议
9.3 未来发展方向
-
多模态交互:支持语音、图像、手势等多模态输入
-
个性化学习:基于用户行为习惯的个性化智能体
-
离线能力:支持离线环境下的智能体功能
-
联邦学习:保护用户隐私的分布式学习
-
跨设备协同:多设备间的智能体协同工作
最后的小提示:在实际开发中,建议将智能体相关功能封装成独立的HAR包,方便在不同项目中快速集成。同时,记得进行充分的测试,特别是在不同网络环境、不同设备上的表现。
希望这篇详细的实战教程能帮助你在HarmonyOS开发中成功集成智能体功能。如果你在实践中遇到任何问题,或有更好的实现方案,欢迎在评论区交流讨论!
更多推荐


所有评论(0)