鸿蒙 Next 对接 AI API 实现文字对话功能指南

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
视觉智能开放平台,视频通用资源包5000点
视觉智能开放平台,分割抠图1万点
简介: 本指南介绍如何在鸿蒙 Next 系统中对接 AI API,实现文字对话功能。首先通过 DevEco Studio 创建项目并配置网络权限,选择合适的 AI 服务(如华为云或百度文心一言)。接着,使用 Node.js 转发请求,完成客户端与服务器端代码编写。最后进行功能测试与优化,确保多轮对话顺畅、性能稳定。此过程需严格遵循开发规范,充分利用系统资源,为用户提供智能化交互体验。

鸿蒙 Next 对接 AI API 实现文字对话功能指南

在智能化浪潮下,为用户提供便捷的 AI 文字对话功能,成为众多鸿蒙 Next 应用提升用户体验的关键。接下来,我们将深入剖析如何在鸿蒙 Next 系统中对接 AI API,打造流畅的文字对话交互。

前期搭建

环境部署

首先,安装 DevEco Studio 这一鸿蒙原生应用开发的核心工具。它能提供智能代码补全等功能,极大提高开发效率。安装过程需严格遵循官方文档,确保每个环节正确无误。

项目初始化

在 DevEco Studio 内创建新的鸿蒙 Next 应用项目。创建时,依据应用定位,精准选择合适的模板与配置选项。例如,若应用定位为知识问答类,可选择简洁的表单式页面模板,方便用户输入问题与查看答案。

网络权限申请

在应用的\entry\src\main\module.json5配置文件中,明确声明网络访问权限,这是应用与 AI API 进行数据交互的基础。添加如下代码:

{
   
  "module": {
   
    "requestPermissions": [
      {
   
        "name": "ohos.permission.INTERNET"
      }
    ]
  }
}

对接流程

选定 AI API 服务

目前,市场上有多种 AI API 服务可供选择。像华为云自然语言处理服务,凭借其与鸿蒙系统的良好兼容性,能提供稳定高效的自然语言处理能力;还有百度文心一言 API,具备强大的语义理解与文本生成功能。开发者需综合考量服务的功能特性、价格、性能以及与鸿蒙 Next 系统的适配度等因素,做出合适的选择。

集成 AI API 可使用 nodejs 转发

  • \entry\src\main\resources\base\profile\main_pages.json文件中配置页面:
{
   
  "src": ["pages/Index"]
}
  • \entry\src\main\ets\pages目录中添加Index.ets
import {
    router } from '@kit.ArkUI';
import {
    sendChat } from '../apis/chat';

const enterKeyCode = 2054;
const primaryColor = '#0ea5e9';

enum AiModel {
   
  // 文生图
  Text2Img = "ti",
  // 文字对话
  Text2Text = "tt",
}

interface IListItem<T> {
   
  id: T;
  name: string;
}


interface IMessage {
   
  itemAlign: ItemAlign;
  charts: string;
}

interface RoomParams {
   
  model: AiModel;
}

interface IAiModelItem extends IListItem<AiModel> {
   
  hello: string;
}

const aiModels: IAiModelItem[] = [
  {
   
    id: AiModel.Text2Text,
    name: "聊天",
    hello: '你好,我是文本生成图片的AI工具',
  },
  {
   
    id: AiModel.Text2Img,
    name: "文生图",
    hello: '请输入绘画的内容',
  }
];

@Entry
@Component
struct Room {
   
  @State buttonScale: number = 1;
  @State avatarUrl: string = '';
  @State model: IAiModelItem | undefined = undefined;
  @State title: string = '';
  @State bone: number = 0;
  @State messages: IMessage[] = [];
  @State charts: string = '';
  @State loading: boolean = false;
  handleMessage: () => void = () => {
   
    if (!this.charts) {
   
      return;
    }
    this.messages.unshift({
   
      itemAlign: ItemAlign.End,
      charts: this.charts,
    })
    this.loading = true;

    if (!this.model) {
   
      return;
    }
    const chat = this.charts;
    if (!chat) {
   
      AlertDialog.show({
    message: '内容输入异常,请联系管理员' });
      return;
    }
    sendChat({
   
      model: this.model.id,
      chat: chat
    }).then((res) => {
   
      this.charts = '';
      this.loading = false
      this.messages.unshift({
    itemAlign: ItemAlign.Start, charts: res })
    }).catch((e: string) => {
   
      console.log('发送失败' + e);
    })
  }

  onPageShow(): void {
   
    this.avatarUrl = '/images/logo.png';
    const params = router.getParams() as RoomParams;
    this.model = aiModels.find(item => item.id === params.model);
    const storage = preferences.getPreferencesSync(getContext(), {
    name: 'storage' });
    const user = storage.getSync('user', null) as IUser;
    if (user) {
   
      this.bone = user.bone;
    }
  }

  @Builder
  renderTextChat(text: string) {
   
    Text(text)
      .alignSelf(ItemAlign.Start)
      .backgroundColor('white')
      .padding(8)
      .borderRadius(8)
      .fontColor('black')
  }

  scroller: Scroller = new Scroller();

  build() {
   
    Column() {
   
      Row({
    space: 12 }) {
   
        Image('images/back.png').onClick(() => {
   
          router.back()
        }).width(24).height(24)
        if (this.avatarUrl) {
   
          Image(this.avatarUrl).width(32).height(32).borderRadius(50)
        }
        if (this.model) {
   
          Column({
    space: 4 }) {
   
            Text(this.model.name).fontWeight(FontWeight.Medium).fontSize(16);
          }.alignItems(HorizontalAlign.Start).flexGrow(1)
        }
        Text('举报').onClick(() => {
   
          router.replaceUrl({
   
            url: 'pages/Report'
          })
        })
      }
      .width('100%')
      .backgroundColor('#ffffff')
      .padding(8)
      .alignItems(VerticalAlign.Center)
      .position({
    left: 0, top: 0 })
      .zIndex(1)

      Scroll() {
   
        Column({
    space: 12 }) {
   
          if (this.loading) {
   
            this.renderTextChat('...')
          }
          ForEach(this.messages, (item: IMessage) => {
   
            if (item.itemAlign === ItemAlign.End) {
   
              Text(item.charts)
                .alignSelf(item.itemAlign)
                .backgroundColor(primaryColor)
                .padding(8)
                .borderRadius(8)
                .fontColor('white')
            }
            if (item.itemAlign === ItemAlign.Start) {
   
              if (this.model?.id === AiModel.Text2Text) {
   
                this.renderTextChat(item.charts);
              }
              if (this.model?.id === AiModel.Text2Img) {
   
                Column() {
   
                  Image(item.charts).width(200).height(200).borderRadius(4)
                }.alignSelf(ItemAlign.Start).borderRadius(8).backgroundColor('white').padding(8)
              }
            }
          })
          if (this.model) {
   
            this.renderTextChat(this.model.hello)
          }
        }.width('100%')
      }
      .width('100%')
      .padding({
   
        top: 128,
        bottom: 0,
        left: 12,
        right: 12
      })

      Column() {
   
        Row() {
   
          TextInput({
    text: this.charts, placeholder: this.bone + ' (签到领取)' })
            .onChange(v => {
   
              this.charts = v;
            })
            .backgroundColor('transparent')
            .defaultFocus(true)
            .onKeyEvent(e => {
   
              if (e.keyCode === enterKeyCode) {
   
                this.handleMessage();
              }
            })
            .flexGrow(1)
            .height(60)
          Image('/images/bone.svg')
            .onClick(this.handleMessage)
            .width(36)
            .animation({
    duration: 200, curve: Curve.Ease })
            .clickEffect({
    level: ClickEffectLevel.LIGHT, scale: 0.5 })
            .position({
    right: 0, top: 12 })
        }
        .width('100%')
        .borderRadius(20)
        .padding({
    right: 20 })
        .alignItems(VerticalAlign.Center)
        .backgroundColor('#ffffff')
        .justifyContent(FlexAlign.SpaceBetween)
        .shadow(ShadowStyle.OUTER_DEFAULT_XS)
      }
      .padding({
   
        left: 12,
        right: 12,
        top: 12,
        bottom: 12
      })
      .position({
    top: 48, left: 0 })
    }.width('100%').height('100%')
  }
}
  • \entry\src\main\ets\apis\chat目录下添加如下代码
// 引入包名
import {
    http } from "@kit.NetworkKit";
import {
    BusinessError } from "@kit.BasicServicesKit";
import {
    router } from "@kit.ArkUI";

const URL_BASE = "https://******/api";

// const URL_BASE = 'http://localhost:8081/api';

function sendHttp<R, T>(path: string, method: http.RequestMethod, data?: T): Promise<R> {
   
  // 每一个httpRequest对应一个HTTP请求任务,不可复用
  const httpRequest = http.createHttp();

  return new Promise((res, rej) => {
   
    httpRequest.request(
      // 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
      URL_BASE + path,
      {
   
        method: method, // 可选,默认为http.RequestMethod.GET
        // 当使用POST请求时此字段用于传递请求体内容,具体格式与服务端协商确定
        extraData: data || null,
        expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型
        usingCache: true, // 可选,默认为true
        priority: 1, // 可选,默认为1
        // 开发者根据自身业务需要添加header字段
        header: {
    "content-type": "application/json", auth: "huawei" },
        readTimeout: 60000, // 可选,默认为60000ms
        connectTimeout: 60000, // 可选,默认为60000ms
        usingProtocol: http.HttpProtocol.HTTP1_1, // 可选,协议类型默认值由系统自动指定
        usingProxy: false, //可选,默认不使用网络代理,自API 10开始支持该属性
      },
      (err: BusinessError, resp: http.HttpResponse) => {
   
        httpRequest.destroy();
        if (err) {
   
          console.log(err.message);
          rej(500);
          return;
        }
        if (resp.responseCode === 401) {
   
          router.replaceUrl({
    url: "pages/Index" });
          rej(401);
          return;
        }
        if (resp.responseCode !== 200) {
   
          console.log(resp.result + "");
          rej(resp.responseCode);
          httpRequest.destroy();
          return;
        }
        try {
   
          res(JSON.parse(resp.result as string));
        } catch (e) {
   
          res(resp.result as R);
        }
      }
    );
  });
}

interface IChatOption {
   
  model: AiModel;
  chat: string;
}

export function sendChat(data: IChatOption) {
   
  return sendHttp<string, IChatOption>("/ai", http.RequestMethod.POST, data);
}

服务器代码 以 nextjs + api 为例

import {
    NextApiRequest, NextApiResponse } from "next";

// *********************************************鸿蒙next********************************************

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
   
  if (req.method !== "POST") return res.status(405);

  const {
    chat = "" } = req.body;
  if (!chat.trim()) {
   
    return res.status(400).send("no chat");
  }

  const resp = await axios.post(
    "https://ai.gitee.com/api/serverless/Qwen2.5-72B-Instruct/chat/completions",
    {
   
      stream: false,
      max_tokens: 512,
      temperature: 0.7,
      frequency_penalty: 1,
      messages: [
        {
   
          role: "user",
          content: chat,
        },
      ],
    },
    {
   
      headers: {
   
        Authorization: `Bearer 【此处是密钥】`,
        "Content-Type": "application/json",
      },
    }
  );
  const content = resp.data.choices[0]?.message.content;
  res.status(200).send(content);

  res.status(405).send(405);
}

至此就从服务端、客户端实现了调用AI api的功能

功能测试与优化

完成功能开发后,要在不同设备与网络环境下对应用进行全面测试。检查用户输入的文字能否准确传递给 AI API,AI 回复是否符合预期,多轮对话时上下文信息的传递是否正确,以及应用在长时间对话中的性能表现等。针对测试中发现的问题,如响应延迟、回复不准确等,及时优化代码与调整配置,确保为用户提供流畅、高效的文字对话服务。

通过以上步骤,开发者能够在鸿蒙 Next 系统中成功对接 AI API,实现强大的文字对话功能,为用户带来智能化的交互体验。在开发过程中,需充分利用鸿蒙系统资源,严格遵循开发规范,持续打磨细节,才能打造出优质的应用。

相关文章
|
4天前
|
人工智能 JavaScript API
【HarmonyOS NEXT+AI】问答03:找不到DevEco Studio Cangjie Plugin下载链接?
本文针对学员在“HarmonyOS NEXT+AI大模型打造智能助手APP(仓颉版)”课程中提出的问题进行解答:为何无法在华为开发者社区官网找到DevEco Studio Cangjie Plugin下载链接。文中详细介绍了Cangjie Plugin的功能及获取方式,包括STS和Canary版本的申请流程,并提供了学习仓颉编程语言的资源与建议。对于普通开发者,STS版本是当前首选;同时,通过课程与官方教程,可快速掌握仓颉语言核心语法及API,助力开发HarmonyOS NEXT AI智能助手应用。
28 3
【HarmonyOS NEXT+AI】问答03:找不到DevEco Studio Cangjie Plugin下载链接?
|
22天前
|
人工智能 计算机视觉
HarmonyOS NEXT AI基础视觉服务-背景替换
这是一个基于AI基础视觉服务的背景替换案例,通过调用设备相册选择图片并智能分割主体,支持动态更换背景颜色。主要步骤包括:1) 导入模块与定义组件;2) 实现图片选择与格式转换;3) 使用`subjectSegmentation.doSegmentation`接口完成主体分割;4) 通过随机RGB值实现背景色动态更换。代码结构清晰,功能完整,适合学习AI图像处理技术。
HarmonyOS NEXT AI基础视觉服务-背景替换
|
22天前
|
存储 人工智能 数据安全/隐私保护
HarmonyOS NEXT AI基础视觉服务-人脸对比
这是一套基于AI基础视觉服务实现的人脸对比系统,用户可通过调用设备相册选择两张图片,系统将提取人脸特征并计算相似度,最终以结构化数据形式展示对比结果(如相似度值和是否为同一人)。代码涵盖模块导入、双图选择、图像处理、人脸对比核心逻辑及UI界面构建,支持异常处理与权限管理,确保功能稳定性和兼容性。适配场景包括身份验证、人脸匹配等,具有较高的实用价值。
HarmonyOS NEXT AI基础视觉服务-人脸对比
|
14天前
|
架构师 安全 物联网
Apipost vs Apifox:高效API协作的差异化功能解析
作为企业级API架构师,深度体验APIPost与Apifox后发现几大亮点功能。目录级参数配置避免全局污染;WebSocket消息分组提升长连接管理效率;Socket.IO支持解决特定协议需求;接口锁定保障团队协作安全。大型团队适合APIPost的细粒度管控,复杂物联网项目需WebSocket分组,维护遗留系统离不开Socket.IO支持,初创团队可按需灵活选择。这些特性显著优化开发协作质量。
|
12天前
|
API 开发者 Python
如何在API中实现搜索和过滤功能
本文介绍了如何为API添加搜索和过滤功能,使其更强大灵活。通过Flask示例,展示了按书名搜索、按作者或年份过滤书籍的方法,并结合两者实现复合查询。同时,提供了搜索不区分大小写、支持多过滤器组合、分页和输入验证等最佳实践。最后推荐了Apipost工具,它能简化API调试、负载测试及文档生成,提升开发效率。这些功能帮助用户更好地控制数据,优化API使用体验。
|
20天前
|
人工智能 物联网 Android开发
【04】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-自定义一个设置输入小部件组件-完成所有设置setting相关的页面-优雅草卓伊凡
【04】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-自定义一个设置输入小部件组件-完成所有设置setting相关的页面-优雅草卓伊凡
157 92
|
20天前
|
人工智能 物联网 Android开发
【03】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-在lib目录新建自定义库UtilsLibrary,ComponentLibrary,CommonConstLibrary完成设置SettingsView.ets初始公共类书写-优雅草卓伊凡
【03】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-在lib目录新建自定义库UtilsLibrary,ComponentLibrary,CommonConstLibrary完成设置SettingsView.ets初始公共类书写-优雅草卓伊凡
63 23
【03】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-在lib目录新建自定义库UtilsLibrary,ComponentLibrary,CommonConstLibrary完成设置SettingsView.ets初始公共类书写-优雅草卓伊凡
|
20天前
|
存储 人工智能 物联网
【02】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-登录页面LoginView.ets完成-并且详细解释关于arkui关于 CommonConst, commonColor, InputDataModel-优雅草卓伊凡
【02】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-登录页面LoginView.ets完成-并且详细解释关于arkui关于 CommonConst, commonColor, InputDataModel-优雅草卓伊凡
50 14
【02】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-登录页面LoginView.ets完成-并且详细解释关于arkui关于 CommonConst, commonColor, InputDataModel-优雅草卓伊凡
|
20天前
|
人工智能 物联网 编译器
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
44 11
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
|
13天前
|
人工智能 算法 安全
OpenRouter 推出百万 token 上下文 AI 模型!Quasar Alpha:提供完全免费的 API 服务,同时支持联网搜索和多模态交互
Quasar Alpha 是 OpenRouter 推出的预发布 AI 模型,具备百万级 token 上下文处理能力,在代码生成、指令遵循和低延迟响应方面表现卓越,同时支持联网搜索和多模态交互。
125 1
OpenRouter 推出百万 token 上下文 AI 模型!Quasar Alpha:提供完全免费的 API 服务,同时支持联网搜索和多模态交互

热门文章

最新文章