在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. 点击按钮成功拉起智能体对话框

  2. 但对话框内没有显示预设的"你好,有什么可以帮您?"问题

  3. 用户需要手动输入问题才能开始对话

  4. 控制台无错误日志,智能体功能正常但预设无效

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 核心解决思路

我们的解决方案围绕以下几个核心点展开:

  1. 完整的配置流程:确保智能体配置的每一步都正确执行

  2. 正确的关联时机:在适当的时机建立应用与智能体的关联

  3. 参数验证机制:确保所有参数在传递前都经过验证

  4. 错误处理优化:提供完善的错误处理和回退机制

  5. 性能优化:优化智能体加载和初始化的性能

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 扩展应用场景

掌握了智能体集成技术后,你可以进一步扩展到以下场景:

  1. 智能客服系统:集成AI客服,自动回答用户问题

  2. 学习辅导助手:在教育应用中提供智能辅导

  3. 智能家居控制:通过语音或文字控制智能家居设备

  4. 健康咨询助手:提供健康咨询和建议

  5. 购物助手:在电商应用中提供购物建议

9.3 未来发展方向

  1. 多模态交互:支持语音、图像、手势等多模态输入

  2. 个性化学习:基于用户行为习惯的个性化智能体

  3. 离线能力:支持离线环境下的智能体功能

  4. 联邦学习:保护用户隐私的分布式学习

  5. 跨设备协同:多设备间的智能体协同工作

最后的小提示:在实际开发中,建议将智能体相关功能封装成独立的HAR包,方便在不同项目中快速集成。同时,记得进行充分的测试,特别是在不同网络环境、不同设备上的表现。

希望这篇详细的实战教程能帮助你在HarmonyOS开发中成功集成智能体功能。如果你在实践中遇到任何问题,或有更好的实现方案,欢迎在评论区交流讨论!

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐