昇腾模型对接百度AI生成图片并部署安卓应用
要基于昇腾Model-Agent模型适配百度AI服务调取图片并输出安卓应用程序核心在于构建一个端到端的AI Agent系统。该系统需整合昇腾模型适配工具、百度千帆大模型API以及安卓应用开发。以下是实现方案的关键步骤和代码示例。1. 系统架构与核心流程整个流程可分为云端AI服务和移动端应用两部分通过API进行交互。组件/模块技术选型/工具核心职责云端AI服务 (Backend)Python, FastAPI, 昇腾Model Adapter, 百度千帆SDK1. 接收安卓端请求文本描述。2. 调用百度文心大模型如ERNIE-ViLG生成或理解图片需求。3. 使用昇腾工具链将生成的需求适配/转换为昇腾NPU可执行的模型或指令。4. 调用相关图片生成/搜索API或执行本地模型推理获取图片结果。5. 将图片URL或Base64编码返回给安卓端。移动端应用 (Android)Kotlin/Java, Android SDK, Retrofit/OkHttp1. 提供用户输入界面描述图片的文本。2. 将用户请求发送至云端AI服务。3. 接收并展示云端返回的图片。核心数据流用户输入文本-安卓App-云端API-百度千帆大模型-需求解析/适配-图片生成/获取服务-返回图片-安卓App展示。2. 云端AI服务端实现首先需要搭建一个Python后端服务作为AI Agent的核心枢纽。2.1 环境准备与依赖安装# 创建并激活Python环境建议使用Conda conda create -n ascend_agent python3.8 conda activate ascend_agent # 安装核心依赖 pip install fastapi uvicorn pip install qianfan # 百度千帆官方SDK pip install pillow # 图像处理 # 根据昇腾官方文档安装Model Adapter及相关工具链例如 # pip install ascend-model-adapter (此为示例请以昇腾社区实际包名为准)2.2 核心服务代码 (main.py)import os import uuid from typing import Optional import qianfan from fastapi import FastAPI, HTTPException from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel import requests from io import BytesIO from PIL import Image import base64 # 1. 初始化应用和模型客户端 app FastAPI(titleAscend Model-Agent Image Service) # 允许跨域请求方便安卓端调试 app.add_middleware( CORSMiddleware, allow_origins[*], # 生产环境应指定具体域名 allow_credentialsTrue, allow_methods[*], allow_headers[*], ) # 初始化百度千帆客户端 (需在百度智能云控制台获取AK/SK) # 参考https://cloud.baidu.com/doc/ Qianfan/s/8lkjfgiyp QIANFAN_AK os.getenv(QIANFAN_AK, your_ak_here) QIANFAN_SK os.getenv(QIANFAN_SK, your_sk_here) chat_comp qianfan.ChatCompletion(akQIANFAN_AK, skQIANFAN_SK) # 假设的昇腾模型适配器此处为示意实际需调用昇腾ATC工具或离线推理接口 # 真实场景中这里可能是对生成的需求进行模型转换或调用昇腾NPU推理服务的代码 class AscendModelAdapter: 模拟昇腾模型适配工具将通用需求转换为昇腾NPU可执行的格式或调用本地模型。 staticmethod def adapt_and_execute(prompt: str) - str: 此处应包含 1. 可能将prompt通过文心大模型进一步细化。 2. 调用昇腾ATC工具链将某个视觉生成模型如Stable Diffusion的昇腾版本进行图优化或量化。 3. 或直接调用已部署在昇腾环境中的图片生成/处理模型的推理服务。 本例中我们简化为直接返回一个增强后的提示词并模拟调用一个图片生成API。 # 示例使用文心大模型优化用户输入 refined_prompt_resp chat_comp.do( modelERNIE-Bot-turbo, messages[{ role: user, content: f请将以下图片描述优化为更详细、更适合AI绘图的英文提示词{prompt} }] ) refined_prompt refined_prompt_resp.body.get(result, prompt) print(f原始提示: {prompt}) print(f优化后提示: {refined_prompt}) # 在实际项目中此处应调用部署在昇腾服务器上的模型或适配后的服务。 # 本例为演示我们假设适配后调用一个公开的图片生成API例如DALL-E或Stable Diffusion的API。 return refined_prompt # 2. 定义请求/响应模型 class ImageRequest(BaseModel): prompt: str # 用户输入的图片描述文本 size: Optional[str] 1024x1024 # 期望图片尺寸 class ImageResponse(BaseModel): image_url: Optional[str] None # 生成图片的临时URL image_base64: Optional[str] None # 或Base64编码的图片数据 refined_prompt: str # 经过AI优化后的提示词 # 3. 核心API端点 app.post(/generate-image, response_modelImageResponse) async def generate_image(request: ImageRequest): 接收安卓端发来的图片生成请求。 流程用户描述 - 文心大模型优化 - 昇腾模型适配 - 获取图片 - 返回结果。 try: # Step 1: 使用昇腾Model-Agent此处整合了文心大模型处理用户输入 ascend_adapter AscendModelAdapter() final_prompt ascend_adapter.adapt_and_execute(request.prompt) # Step 2: 调用图片生成服务此处为示例使用模拟或真实API # 示例A模拟返回一个固定图片用于测试 # image_url https://example.com/test_image.jpg # 示例B调用一个真实的图片生成API此处需替换为你的服务端点 # 注意百度文心大模型中的文生图模型如ERNIE-ViLG可能需要单独申请和调用。 generated_image_url call_image_generation_api(final_prompt, request.size) # Step 3: 将图片转换为Base64或提供可访问的URL # 这里我们选择将图片下载并转换为Base64确保安卓端能直接访问 image_base64_data download_image_to_base64(generated_image_url) return ImageResponse( image_base64image_base64_data, refined_promptfinal_prompt ) except Exception as e: raise HTTPException(status_code500, detailf图片生成失败: {str(e)}) # --- 辅助函数 --- def call_image_generation_api(prompt: str, size: str) - str: 模拟或实际调用一个图片生成API。 在实际部署中这里应调用 1. 百度ERNIE-ViLG API。 2. 或其他已部署在昇腾NPU上的开源文生图模型服务如Stable Diffusion Ascend版。 # 此处为演示返回一个基于提示词生成的占位图片URL使用第三方服务如DALL-E或稳定扩散API # 你需要替换为实际的API调用代码并处理认证和响应。 # 例如使用requests库调用你的私有端点 # response requests.post(YOUR_ASCEND_SERVICE_URL, json{prompt: prompt, size: size}) # return response.json()[url] # 临时方案使用一个公开的占位图片服务来模拟 print(f[模拟] 正在为提示词生成图片: {prompt}) # 这里使用一个返回基于文本的占位图服务作为演示 encoded_prompt base64.urlsafe_b64encode(prompt.encode()).decode() return fhttps://placehold.co/600x400/000000/FFFFFF.png?text{encoded_prompt[:20]}... def download_image_to_base64(url: str) - str: 下载图片并转换为Base64字符串。 try: response requests.get(url, timeout30) response.raise_for_status() image Image.open(BytesIO(response.content)) # 可在此处调整图片大小或格式以适应安卓端 buffered BytesIO() image.save(buffered, formatPNG) img_str base64.b64encode(buffered.getvalue()).decode() return fdata:image/png;base64,{img_str} except Exception as e: raise Exception(f图片下载或转换失败: {str(e)}) if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8000)关键点说明模型适配层 (AscendModelAdapter)这是连接百度大模型与昇腾NPU的关键。在实际生产中这部分代码应调用昇腾的模型转换工具ATC或离线模型推理接口。例如可以将文心大模型解析出的结构化需求转换为对已部署在昇腾环境中的视觉模型如转换优化后的Stable Diffusion的调用参数 。百度千帆集成通过qianfanSDK调用文心大模型如ERNIE-Bot-turbo用于理解和优化用户的图片描述使其更符合图像生成模型的输入要求 。图片生成服务call_image_generation_api函数是核心。理想情况下应部署一个在昇腾NPU上高效运行的文生图模型。开发初期也可使用百度ERNIE-ViLG等云端API作为替代后续再迁移至昇腾平台。3. 安卓客户端实现创建一个简单的Android应用包含一个输入框、一个按钮和一个图片展示区域。3.1 添加网络权限和依赖 (app/build.gradle.kts)dependencies { implementation(com.squareup.retrofit2:retrofit:2.9.0) implementation(com.squareup.retrofit2:converter-gson:2.9.0) implementation(com.squareup.okhttp3:logging-interceptor:4.12.0) implementation(androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0) // 图片加载库例如Glide implementation(com.github.bumptech.glide:glide:4.16.0) }在AndroidManifest.xml中添加网络权限uses-permission android:nameandroid.permission.INTERNET /3.2 定义数据模型和API接口// ImageRequest.kt data class ImageRequest( val prompt: String, val size: String 1024x1024 ) // ImageResponse.kt data class ImageResponse( val image_url: String?, val image_base64: String?, val refined_prompt: String ) // ApiService.kt import retrofit2.Call import retrofit2.http.Body import retrofit2.http.POST interface ApiService { POST(generate-image) // 对应后端FastAPI的端点 fun generateImage(Body request: ImageRequest): CallImageResponse }3.3 创建Retrofit实例和ViewModel// RetrofitClient.kt import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory object RetrofitClient { private const val BASE_URL http://YOUR_SERVER_IP:8000/ // 替换为你的后端服务器地址 private val loggingInterceptor HttpLoggingInterceptor().apply { level HttpLoggingInterceptor.Level.BODY } private val okHttpClient OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build() val instance: ApiService by lazy { Retrofit.Builder() .baseUrl(BASE_URL) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build() .create(ApiService::class.java) } } // MainViewModel.kt import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.launch import retrofit2.Call import retrofit2.Callback import retrofit2.Response class MainViewModel : ViewModel() { private val _imageData MutableLiveDataString() val imageData: LiveDataString _imageData private val _refinedPrompt MutableLiveDataString() val refinedPrompt: LiveDataString _refinedPrompt private val _isLoading MutableLiveDataBoolean() val isLoading: LiveDataBoolean _isLoading private val _errorMessage MutableLiveDataString() val errorMessage: LiveDataString _errorMessage fun generateImage(prompt: String) { _isLoading.value true _errorMessage.value viewModelScope.launch { try { val call RetrofitClient.instance.generateImage(ImageRequest(prompt)) call.enqueue(object : CallbackImageResponse { override fun onResponse(call: CallImageResponse, response: ResponseImageResponse) { _isLoading.value false if (response.isSuccessful) { val body response.body() body?.let { // 优先使用Base64数据 it.image_base64?.let { base64 - _imageData.value base64 } ?: run { // 如果没有Base64则使用URL it.image_url?.let { url - _imageData.value url } } _refinedPrompt.value it.refined_prompt } ?: run { _errorMessage.value 响应体为空 } } else { _errorMessage.value 请求失败: ${response.code()} } } override fun onFailure(call: CallImageResponse, t: Throwable) { _isLoading.value false _errorMessage.value 网络请求失败: ${t.message} } }) } catch (e: Exception) { _isLoading.value false _errorMessage.value 发生异常: ${e.message} } } } }3.4 主界面布局和Activity (activity_main.xml和MainActivity.kt)!-- activity_main.xml -- ?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_widthmatch_parent android:layout_heightmatch_parent android:orientationvertical android:padding16dp EditText android:idid/et_prompt android:layout_widthmatch_parent android:layout_heightwrap_content android:hint请输入图片描述例如一只在星空下奔跑的猫 android:inputTypetextMultiLine / Button android:idid/btn_generate android:layout_widthmatch_parent android:layout_heightwrap_content android:layout_marginTop8dp android:text生成图片 / ProgressBar android:idid/progress_bar android:layout_widthwrap_content android:layout_heightwrap_content android:layout_gravitycenter android:layout_marginTop16dp android:visibilitygone / TextView android:idid/tv_refined_prompt android:layout_widthmatch_parent android:layout_heightwrap_content android:layout_marginTop16dp android:textStyleitalic / ImageView android:idid/iv_result android:layout_widthmatch_parent android:layout_height300dp android:layout_marginTop16dp android:scaleTypecenterCrop android:background#F0F0F0 / TextView android:idid/tv_error android:layout_widthmatch_parent android:layout_heightwrap_content android:layout_marginTop8dp android:textColor#FF0000 / /LinearLayout// MainActivity.kt import android.os.Bundle import android.widget.Toast import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.Glide import com.example.ascendagent.databinding.ActivityMainBindingclass MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private val viewModel: MainViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) setupObservers() binding.btnGenerate.setOnClickListener { val prompt binding.etPrompt.text.toString().trim() if (prompt.isNotEmpty()) { viewModel.generateImage(prompt) } else { Toast.makeText(this, 请输入描述, Toast.LENGTH_SHORT).show() } } } private fun setupObservers() { viewModel.isLoading.observe(this) { isLoading - binding.progressBar.visibility if (isLoading) android.view.View.VISIBLE else android.view.View.GONE binding.btnGenerate.isEnabled !isLoading } viewModel.imageData.observe(this) { imageData - if (imageData.startsWith(data:image)) { //加载Base64图片 Glide.with(this) .load(imageData) .into(binding.ivResult) } else { // 加载网络图片URL Glide.with(this) .load(imageData) .into(binding.ivResult) } } viewModel.refinedPrompt.observe(this) { prompt - binding.tvRefinedPrompt.text 优化后的描述$prompt } viewModel.errorMessage.observe(this) { error - binding.tvError.text error if (error.isNotEmpty()) { Toast.makeText(this, error, Toast.LENGTH_LONG).show() } } } }4. 部署与运行流程部署云端服务将main.py部署到拥有公网IP的服务器或本地测试时使用内网穿透工具。安装所有Python依赖。设置环境变量QIANFAN_AK和QIANFAN_SK为你的百度千帆密钥。运行python main.py启动服务生产环境建议使用gunicorn或uvicorn作为服务进程。配置安卓应用在RetrofitClient中将BASE_URL替换为你部署的后端服务地址如http://192.168.1.100:8000/。构建并运行安卓应用。端到端测试在安卓App输入框中描述图片如“夏日海滩上的日落”。点击“生成图片”按钮。应用将请求发送至你的云端服务。云端服务通过文心大模型优化描述并经过模拟的昇腾模型适配层处理最终获取图片。图片以Base64格式返回并在安卓App的ImageView中显示。5. 进阶优化与生产考量方向具体措施昇腾NPU集成将call_image_generation_api函数替换为对真实昇腾推理服务的调用。这需要1. 使用昇腾模型转换工具ATC将选定的文生图模型如Stable Diffusion转换为昇腾支持的OM模型 。2. 使用昇腾推理接口AscendCL开发一个独立的推理服务接收提示词并返回图片。AI Agent能力增强引入LangChain等框架构建更复杂的思维链。例如让Agent先分析用户意图再决定调用文生图模型还是图片搜索API甚至进行多轮对话 。后端性能与安全1. 使用异步框架如async/await提高并发。2. 为API添加认证如API Key。3. 对用户输入进行安全检查防止恶意提示词。安卓端体验1. 添加图片保存、分享功能。2. 实现生成历史记录。3. 使用更优雅的加载状态和错误提示。参考来源[嵌入式AI从0开始到入土]3_官方模型适配工具使用AI Agent Harness多语言模型适配管控使用Baidu Qianfan与Langchain进行高级AI模型开发百度千帆AI大模型人工智能 大模型(Large Model)是什么、有哪些、能干啥

相关新闻

Java AWT图形编程实战

Java AWT图形编程实战

要执行这些 Java AWT 图形程序,你需要将它们分别保存为独立的 .java 文件,并使用 javac 编译,然后用 java 命令运行。以下是每个程序的执行步骤和预期效果。 1. 程序清单与执行步骤 程序文件主要功能编译命令运行命令GraphicsDemo.java绘制…

2026/8/6 21:45:23 阅读更多 →
Oracle数据迁移工具EXP/IMP与Data Pump详解

Oracle数据迁移工具EXP/IMP与Data Pump详解

1. Oracle数据库导入导出命令概述作为一名Oracle DBA,数据迁移和备份是最常见的日常工作之一。Oracle提供了两种经典的命令行工具来实现数据的导入导出:EXP/IMP(传统工具)和Data Pump(EXPDP/IMPDP)。这些工…

2026/8/6 21:44:22 阅读更多 →
LFM2.5-2.6B-mxfp8与原版模型深度对比:量化后性能究竟损失多少?

LFM2.5-2.6B-mxfp8与原版模型深度对比:量化后性能究竟损失多少?

LFM2.5-2.6B-mxfp8与原版模型深度对比:量化后性能究竟损失多少? 【免费下载链接】LFM2.5-2.6B-mxfp8 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/LFM2.5-2.6B-mxfp8 LFM2.5-2.6B-mxfp8是基于LiquidAI/LFM2.5-2.6B原版模型转换而…

2026/8/6 21:44:22 阅读更多 →

最新新闻

php-cli-tools实战案例:构建你的第一个命令行应用

php-cli-tools实战案例:构建你的第一个命令行应用

php-cli-tools实战案例:构建你的第一个命令行应用 【免费下载链接】php-cli-tools A collection of tools to help with PHP command line utilities 项目地址: https://gitcode.com/gh_mirrors/ph/php-cli-tools php-cli-tools是一个强大的PHP命令行工具集合…

2026/8/6 22:37:43 阅读更多 →
Windows 11预览版退回正式版完整指南

Windows 11预览版退回正式版完整指南

1. 项目概述Windows Insider计划让用户能够提前体验新功能,但测试版系统的不稳定性也让不少用户想要回归正式版。最近我在帮同事处理一台卡在Windows 11预览版的笔记本时,发现"退出预览体验计划"这个看似简单的操作,实际上藏着不少…

2026/8/6 22:37:43 阅读更多 →
Ubuntu工控机内存泄漏与OOM Killer问题解决方案

Ubuntu工控机内存泄漏与OOM Killer问题解决方案

1. 问题现象与背景分析上周调试产线时遇到一台运行Ubuntu 22.04的工控机频繁假死,表现为:触摸屏无响应、SSH连接超时,但系统指示灯仍正常闪烁。这种"看起来活着但实际已瘫痪"的状态,在工业现场尤为致命——既无法远程维…

2026/8/6 22:36:43 阅读更多 →
MSTP技术解析:多生成树协议在企业网络中的应用

MSTP技术解析:多生成树协议在企业网络中的应用

1. 网络工程师必知:MSTP技术深度解析第一次接触MSTP是在2015年某金融项目的网络改造中,当时客户要求实现跨机房的链路冗余又不希望出现传统STP的带宽浪费问题。那是我第一次真正理解MSTP的价值——它不仅是生成树协议的升级版,更是解决现代数…

2026/8/6 22:36:43 阅读更多 →
MSTP技术解析:企业网络冗余与负载均衡实战

MSTP技术解析:企业网络冗余与负载均衡实战

1. 网络工程师必知的MSTP技术解析第一次接触MSTP是在2013年某金融项目的网络改造中,当时核心交换机频繁出现STP震荡导致业务中断。客户工程师指着拓扑图说:"咱们得上MSTP了,这个能解决广播风暴问题"。后来我才明白,MSTP…

2026/8/6 22:36:43 阅读更多 →
三维电子沙盘怎么选:四个维度拆解选型核心指标

三维电子沙盘怎么选:四个维度拆解选型核心指标

前言三维电子沙盘不是一次性采购设备,而是长期使用的技术平台。一旦选错,迁移成本极高,且涉及数据资产和培训投入。本文只拆解四个维度的判断标准,不推荐任何产品。一、先搞清楚自己的使用场景选型之前,先把场景定义清…

2026/8/6 22:36:43 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →