第7.1篇:Skill 开发入门------Vibe Coding 与系统级智能入口
难度 :⭐⭐⭐ 高级
前置知识 :第 1.1 篇 ArkTS 语言入门
涉及源文件 :鸿蒙 HMAF 框架、小艺开放平台、
module.json5、skills/目录结构
概述
在之前的文章中,我们完整构建了"画伴梦工厂"的应用层能力------从画布涂鸦、图片识别到图生视频的 AI 编排链路。然而,这些强大的功能目前只在应用内部可用。用户必须打开应用、层层导航,才能使用这些能力。
有没有一种方式,让用户只需对小艺说一句话,就能直接调用应用中的某一项功能?比如:
- "帮我把这张涂鸦变成动画"
- "看看这幅画里有什么"
- "帮我生成一张恐龙在森林里的图片"
这就是 鸿蒙 Skill(应用技能) 的核心价值------将应用能力外化为系统级智能体的可调用服务单元。本文将深入讲解 Skill 的概念、架构、开发流程,以及如何将"画伴梦工厂"的现有 AI 能力封装为 Skill,接入鸿蒙全场景智能生态。
一、什么是 Skill------系统级智能入口
1.1 从"人找 App"到"能力找人"
传统的 App 使用路径是这样的:
解锁手机 → 找到图标 → 点击打开 → 在菜单中寻找功能 → 完成操作
用户在完成每一个操作前,都需要经历漫长的"导航"过程。而鸿蒙 Skill 的出现彻底改变了这一范式,将交互路径缩短为:
唤醒小艺 → 说出需求 → 系统自动调用 Skill → 获取结果
Skill 是一份声明式的能力外化机制。开发者将应用内可被外部调用的业务能力组织为若干能力单元,每个单元包含:
- 一份描述文件(SKILL.md):声明触发场景、入参约束与返回值契约
- 一份 ArkTS 入口脚本:将外部调用桥接到应用内既有的业务逻辑
- 模块配置绑定:将 Skill 绑定到指定 Ability
运行时,系统智能体(小艺)依据描述文件完成"意图---能力"的语义匹配,将用户语音/文本指令路由到匹配的 Skill,执行后返回结果。
1.2 Skill 与智能体、应用的关系
┌─────────────────────────────────────────────────────────────┐
│ 鸿蒙系统智能体生态 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ 小艺 AI │───→│ 意图理解 │───→│ 服务分发引擎 │ │
│ │ (系统入口) │ │ (NLU) │ │ (Skill 匹配) │ │
│ └──────────┘ └──────────┘ └────────┬─────────┘ │
│ │ │
│ ┌─────────────────────────────────┼─────────┐ │
│ │ 鸿蒙应用生态 │ │ │
│ │ ┌──────────┐ ┌──────────┐ ▼ │ │
│ │ │ Skill A │ │ Skill B │ Skill C │ │
│ │ │ 图生动画 │ │ 图片识别 │ 文生图 │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ │ │ │ │ │
│ │ └────────┬────┴────────────┘ │
│ │ ▼ │
│ │ ┌──────────────────┐ │
│ │ │ "画伴梦工厂" 应用 │ │
│ │ │ (业务逻辑实现) │ │
│ │ └──────────────────┘ │
│ └──────────────────────────────────────────────────┘
└─────────────────────────────────────────────────────────────┘
1.3 Skill 与传统开发模式对比
| 维度 | 传统 App 开发 | Skill 开发 |
|---|---|---|
| 入口方式 | 用户手动打开 App | 小艺语音/文本触发 |
| 交互模式 | 页面导航式交互 | 意图驱动的对话式交互 |
| 分发渠道 | 应用市场下载安装 | 小艺意图匹配自动分发 |
| 设备覆盖 | 需逐个设备适配 | 一次开发,全场景部署 |
| 开发模式 | 手写代码 | Vibe Coding 对话式开发 |
| 跨应用协作 | 需自行实现 IPC | A2A 协议自动协同 |
二、Vibe Coding------自然语言驱动的 Skill 开发
2.1 什么是 Vibe Coding
Vibe Coding(氛围编程)是 HDC2026 上华为推出的创新开发模式。开发者可以用自然语言对话的方式描述需求,小艺开放平台自动生成 Skill 的核心代码框架,开发者审核反馈、AI 持续优化,开发完成后一键发布到小艺入口。
2.2 Vibe Coding 开发流程
在小艺开放平台上,通过 Vibe Coding 创建 Skill 的流程如下:
步骤 1:登录小艺开放平台 → 进入 Skill → 新建 Skill → Vibe Coding
步骤 2:填写 Skill 名称、描述、触发意图等基础信息
步骤 3:选择拓展能力(@ 按钮添加)
步骤 4:点击生成,AI 解析需求
步骤 5:需求澄清与规划(AI 自动提出问题)
步骤 6:选择是否使用生成式 UI
步骤 7:AI 自动生成 Skill 代码(SKILL.md + 入口脚本)
步骤 8:测试与评测(平台自动校验合规性)
步骤 9:填写 Skill 描述(供 Agent 语义匹配)
步骤 10:自动打包 → 真机测试 → 上架
2.3 Vibe Coding 的核心价值
- 降低门槛:非技术背景的产品经理、设计师也能开发 Skill
- 持续协作:开发者可通过对话提出修改意见,AI 实时响应优化
- 生成式 UI:根据用户指令复杂度动态调整交互形式,简单查询展示轻量卡片,复杂需求自动扩展为详细视图
- 一键上架:开发完成后直接打包发布,省去繁琐的配置环节
2.4 传统 Skill 开发 vs Vibe Coding
| 开发方式 | 技能要求 | 开发周期 | 迭代方式 | 适用场景 |
|---|---|---|---|---|
| 传统手动开发 | 掌握 ArkTS、HMAF 框架 | 数天 | 手动修改代码 | 复杂业务逻辑 |
| Vibe Coding | 自然语言描述能力 | 数分钟 | 对话式迭代 | 标准能力外化、快速原型 |
三、Skill 开发全流程
3.1 环境准备
要将应用能力封装为 Skill,需要满足以下条件:
- 开发环境:DevEco Studio 5.0+,鸿蒙 SDK API 26.0.0 及以上
- 测试设备:ROM 版本 6.0.0 及以上,小艺 APP 版本 11.3.8.300 及以上
- 华为账号:完成开发者实名认证
- 应用已上架:Skill 需要关联已在 AppGallery Connect 中的应用
3.2 Skill 包结构
一个标准的 Skill 包目录结构如下:
entry/
├── skills/
│ └── {SkillName}/
│ ├── scripts/
│ │ └── {SkillScript}.ets ← 入口脚本
│ └── SKILL.md ← 契约描述文件
├── src/main/ets/
│ ├── entryability/
│ │ └── EntryAbility.ets
│ └── service/
│ └── {BusinessService}.ets ← 业务服务实现
└── src/main/
└── module.json5 ← 模块配置
关键约定:
skills/是当前模块所有 Skill 的根目录,路径固定不可更改- 每个 Skill 以独立子目录组织
- 方法名必须和
SKILL.md中的functionName完全一致 - 入口脚本的第一个参数固定为
scriptManager.ArkTSScriptInfo - 执行结果必须通过
completeArkTSScriptInApp回传
3.3 SKILL.md 契约描述文件
SKILL.md 是 Skill 的核心描述文件,包含元数据、触发场景、入参契约和返回值契约四部分。
元数据(YAML Front Matter):
yaml
---
skill_name: "画作识别"
skill_version: "1.0.0"
description: "识别儿童画作中的主角、场景、情绪等元素,返回结构化识别结果"
functionName: "recognizeDrawing"
---
触发场景(trigger_scenarios):
markdown
## trigger_scenarios
- "看看这幅画里有什么"
- "帮我识别这张涂鸦"
- "这幅画画的是什么"
- "分析一下这张图片的内容"
- "这张画的主角是谁"
执行参数契约:
markdown
## parameters
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| imageUri | String | 是 | 图片的本地 URI,支持 content:// 和 file:// 协议 |
| language | String | 否 | 返回结果的语言,默认 "zh-CN" |
返回值契约:
markdown
## returns
| 字段 | 类型 | 说明 |
|------|------|------|
| success | Boolean | 识别是否成功 |
| protagonist | String | 画作中的主角描述 |
| scene | String | 场景描述 |
| emotion | String | 情绪描述 |
| animationSuggestion | String | 动画建议 |
| confidence | Object | 各维度的置信度百分比 |
3.4 入口脚本实现
typescript
// skills/recognize-drawing/scripts/RecognizeDrawingSkill.ets
import { completeArkTSScriptInApp } from '@kit.AgentKit';
import { ImageRecognitionService } from '../../src/main/ets/service/ImageRecognitionService';
interface RecognizeParams {
imageUri: string;
language?: string;
}
interface RecognizeResult {
success: boolean;
protagonist?: string;
scene?: string;
emotion?: string;
animationSuggestion?: string;
confidence?: Record<string, number>;
error?: string;
}
export function recognizeDrawing(
scriptInfo: ArkTSScriptInfo,
params: RecognizeParams
): void {
recognizeDrawingAsync(scriptInfo, params).catch((error: Error) => {
completeArkTSScriptInApp(scriptInfo, {
result: {
success: false,
error: error.message
}
});
});
}
async function recognizeDrawingAsync(
scriptInfo: ArkTSScriptInfo,
params: RecognizeParams
): Promise<void> {
// 调用应用内已有的识别服务
const result = await ImageRecognitionService.recognizeDrawing(
params.imageUri
);
completeArkTSScriptInApp(scriptInfo, {
result: {
success: true,
protagonist: result.protagonist,
scene: result.scene,
emotion: result.emotion,
animationSuggestion: result.animationSuggestion,
confidence: result.confidence
}
});
}
3.5 module.json5 配置
json5
{
"module": {
"name": "entry",
"type": "entry",
"srcEntry": "./ets/entryability/EntryAbility.ets",
"skills": [
{
"name": "recognize-drawing",
"srcPath": "./skills/recognize-drawing"
}
],
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
}
]
}
}
3.6 开发、调测、审核、上架全流程
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 开发阶段 │───→│ 调测阶段 │───→│ 审核阶段 │───→│ 上架阶段 │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
│ │ │ │
├─ 编写 SKILL.md │ │ │
├─ 实现入口脚本 ├─ 真机调试 │ │
├─ module.json5 ├─ hilog 检查点 ├─ 合规校验 ├─ 上架到小艺
└─ 本地化测试 └─ 端到端验证 └─ 语义测试 └─ 全网发布
开发阶段:编写 SKILL.md 描述文件、实现入口脚本、配置 module.json5
调测阶段:使用真机进行端到端验证,通过 hilog 确认参数传递和执行结果正确
审核阶段:平台自动校验 SKILL.md 合规性,测试执行工具调用结果
上架阶段:Skill 自动打包,一键发布到小艺入口,等待全网分发
四、Skill 架构深度解析
4.1 意图匹配机制
当用户说"帮我看看这幅画里有什么"时,系统内部的匹配流程如下:
用户语音/文本输入
│
▼
┌──────────────────┐
│ 小艺 NLU 引擎 │ 自然语言理解,提取意图和实体
│ (Intent Resolve) │
└────────┬─────────┘
│ { intent: "recognize_drawing", entities: { image: "..." } }
▼
┌──────────────────┐
│ Skill 匹配引擎 │ 扫描所有已注册 Skill 的 trigger_scenarios
│ (Service Match) │ 计算语义相似度,选择最佳匹配
└────────┬─────────┘
│ matched_skill: "recognize-drawing"
▼
┌──────────────────┐
│ 执行 Skill 入口 │ 调用 recognizeDrawing(scriptInfo, params)
│ (Script Execute) │ 等待 completeArkTSScriptInApp 回传结果
└────────┬─────────┘
│ { success: true, protagonist: "恐龙", scene: "森林", ... }
▼
┌──────────────────┐
│ 结果呈现 │ 小艺用自然语言回复用户
│ (Response Gen) │ "这幅画的主角是一只小恐龙,场景是森林..."
└──────────────────┘
4.2 执行流程详解
typescript
// 入口脚本的执行生命周期
// 1. 小艺解析用户意图,匹配到 Skill
// 2. 系统创建 ArkTSScriptInfo 上下文对象
// 3. 调用入口函数,传入参数
// 4. 入口函数内部调用应用业务服务
// 5. 业务服务执行完毕,调用 completeArkTSScriptInApp 回传结果
// 6. 系统将结果格式化为自然语言回复给用户
export function recognizeDrawing(
scriptInfo: ArkTSScriptInfo, // ★ 系统注入的上下文
params: RecognizeParams // ★ 从用户意图中提取的参数
): void {
// ★ 异步执行,结果通过回调返回
doWork(scriptInfo, params);
}
async function doWork(
scriptInfo: ArkTSScriptInfo,
params: RecognizeParams
): Promise<void> {
try {
const result = await ImageRecognitionService.recognizeDrawing(params.imageUri);
completeArkTSScriptInApp(scriptInfo, { result }); // ★ 结果回传
} catch (error) {
completeArkTSScriptInApp(scriptInfo, {
error: { message: error.message }
});
}
}
4.3 Skill 生命周期
一个 Skill 从创建到下线,经历以下完整生命周期:
创建 → 开发 → 调试 → 发布(上线) → 运行(被调用) → 更新 → 下架
| 阶段 | 状态 | 说明 |
|---|---|---|
| 草稿 | Draft | 刚刚创建,尚未提交审核 |
| 审核中 | Reviewing | 提交审核,等待平台校验 |
| 已上线 | Published | 审核通过,已发布到小艺入口 |
| 已下架 | Unpublished | 主动下架或因违规被下架 |
| 已更新 | Updated | 新版本审核通过,替换旧版本 |
五、HMAF 2.0 与鸿蒙智能体框架
5.1 HMAF 2.0 三层架构
HarmonyOS 智能体框架(HMAF)2.0 是鸿蒙系统级智能体能力的核心支撑,其架构分为三层:
┌────────────────────────────────────────────────────────────┐
│ 应用层 (App Layer) │
│ Agent Framework Kit / FunctionComponent / AgentController │
│ 开发者通过 Kit 接入智能体,嵌入 Skill 调用能力 │
├────────────────────────────────────────────────────────────┤
│ 框架层 (HMAF Framework) │
│ ┌──────────┐ ┌──────────┐ ┌────────────────────┐ │
│ │ 意图识别 │ │ 工具调度 │ │ 多智能体协同引擎 │ │
│ │ Intent │ │ Tool │ │ Multi-Agent │ │
│ │ Resolve │ │ Dispatch │ │ Orchestration │ │
│ └──────────┘ └──────────┘ └────────────────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌────────────────────┐ │
│ │ 对话管理 │ │ 知识检索 │ │ 分布式软总线 │ │
│ │ Context │ │ RAG │ │ Distributed Bus │ │
│ │ Manager │ │ Engine │ │ │ │
│ └──────────┘ └──────────┘ └────────────────────┘ │
├────────────────────────────────────────────────────────────┤
│ 能力层 (Capability Layer) │
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────────┐ │
│ │端侧 LLM │ │ 语音识别 │ │ 视觉理解 │ │ Intents Kit│ │
│ │On-device│ │ASR/TTS │ │CV/OCR │ │ 意图框架 │ │
│ └────────┘ └────────┘ └────────┘ └────────────┘ │
└────────────────────────────────────────────────────────────┘
5.2 Skill 在 HMAF 中的定位
Skill 在 HMAF 体系中处于能力外化层,是应用向系统智能体暴露能力的标准化接口。HMAF 通过以下组件与 Skill 交互:
| HMAF 组件 | 与 Skill 的关系 |
|---|---|
| 意图识别引擎 | 将用户自然语言映射到 Skill 的 trigger_scenarios |
| 工具调度器 | 根据意图匹配结果,调度对应的 Skill 入口函数 |
| 多智能体协同引擎 | 当一个任务需要多个 Skill 协作时,负责编排调用顺序 |
| 对话管理器 | 维护多轮对话上下文,在连续对话中保持 Skill 状态 |
| 分布式软总线 | 跨设备传输 Skill 调用请求和结果 |
5.3 A2A 协议与多 Skill 协同
HMAF 2.0 通过 A2A(Agent-to-Agent)协议 实现多 Skill 之间的协同工作。例如,用户说"帮我把这张恐龙涂鸦变成动画,然后发到朋友圈",系统可能会串联多个 Skill:
用户意图: "帮我把这张恐龙涂鸦变成动画,然后发到朋友圈"
│
▼
┌──────────────────┐
│ 主 Agent: 任务拆解 │
└────────┬─────────┘
│
┌───────────┼───────────┐
│ │ │
▼ ▼ ▼
┌────────────┐ ┌──────────┐ ┌──────────┐
│ Skill: │ │ Skill: │ │ Skill: │
│ 画作识别 │→│ 图生动画 │→│ 社交分享 │
│ (识别内容) │ │ (生成视频) │ │ (发朋友圈) │
└────────────┘ └──────────┘ └──────────┘
六、多设备分发
6.1 一次开发,全场景部署
Skill 的跨设备能力源自鸿蒙系统的分布式架构。开发者只需开发一次,即可在以下设备上运行:
| 设备类型 | 分发方式 | 交互形态 |
|---|---|---|
| 手机 | 小艺语音唤醒 | 语音+文本对话 |
| 平板 | 小艺语音+手写 | 全屏半屏卡片 |
| 车机 | 方向盘语音键 | 纯语音交互 |
| 智慧屏 | 远场语音 | 语音+大屏展示 |
| 手表 | 语音唤醒 | 轻量卡片展示 |
| 2in1 笔记本 | 小艺+键鼠 | 桌面级交互 |
6.2 生成式 UI 自适应
HDC2026 引入的 A2UI 协议 让 Skill 在不同设备上自动适配 UI 形态:
- 简单结果(如查询天气):显示轻量卡片
- 中等复杂度(如图片识别结果):显示结构化信息卡片
- 复杂交互(如多步骤操作):自动扩展为详细视图
开发者无需手动适配每种设备,A2UI 协议通过标准化描述语言,系统自动根据当前设备生成合适的 UI。
6.3 华为账号跨设备同步
Skill 通过华为账号实现跨设备状态同步:
- 用户一次授权,所有设备可用
- 对话历史跨设备同步
- 个人偏好设置自动流转
七、"画伴梦工厂"现有 AI 能力的 Skill 封装
7.1 可封装的现有能力
"画伴梦工厂"项目目前拥有以下 AI 能力,均可封装为独立的 Skill:
| 现有功能 | 对应服务 | 可封装的 Skill |
|---|---|---|
| 画作识别 | ImageRecognitionService.recognizeDrawing() |
画作识别 Skill |
| 文生图 | AIGenerationService.generateImage() |
文生图 Skill |
| 图生视频 | AIGenerationService.generateVideo() |
图生视频 Skill |
| 语音识别 | VoiceRecognitionService |
语音转文字 Skill |
7.2 图生视频 Skill 示例
yaml
# skills/animate-drawing/SKILL.md
---
skill_name: "图生动画"
skill_version: "1.0.0"
description: "将儿童画作转换为动画视频,支持自定义动作风格"
functionName: "animateDrawing"
---
## trigger_scenarios
- "帮我把这幅画变成动画"
- "让我的涂鸦动起来"
- "把这个涂鸦变成视频"
- "给我生成的画做个动画"
- "让这张图动起来"
## parameters
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| imageUri | String | 是 | 画作的图片 URI |
| prompt | String | 否 | 动作风格描述,如"跳跃"、"奔跑" |
| style | String | 否 | 动画风格,可选值: "cute", "natural", "cartoon" |
## returns
| 字段 | 类型 | 说明 |
|------|------|------|
| success | Boolean | 是否生成成功 |
| videoUri | String | 生成的视频 URI |
| duration | Number | 视频时长(秒) |
| prompt | String | 实际使用的 Prompt |
入口脚本实现:
typescript
// skills/animate-drawing/scripts/AnimateDrawingSkill.ets
import { completeArkTSScriptInApp } from '@kit.AgentKit';
import { AIGenerationService } from '../../src/main/ets/service/AIGenerationService';
import { WorkRepository } from '../../src/main/ets/service/WorkRepository';
interface AnimateParams {
imageUri: string;
prompt?: string;
style?: 'cute' | 'natural' | 'cartoon';
}
export function animateDrawing(
scriptInfo: ArkTSScriptInfo,
params: AnimateParams
): void {
animateDrawingAsync(scriptInfo, params).catch((error: Error) => {
completeArkTSScriptInApp(scriptInfo, {
result: { success: false, error: error.message }
});
});
}
async function animateDrawingAsync(
scriptInfo: ArkTSScriptInfo,
params: AnimateParams
): Promise<void> {
const finalPrompt = params.prompt ?? '让画作中的角色动起来';
const generatedVideo = await AIGenerationService.generateVideo(
params.imageUri,
finalPrompt,
(message: string) => {
// 可选的进度回调,用于实时反馈
}
);
// 自动保存到作品集
const work = WorkRepository.createWork(
'ai-chat',
generatedVideo.prompt,
params.imageUri,
generatedVideo.videoUri
);
WorkRepository.save(work);
completeArkTSScriptInApp(scriptInfo, {
result: {
success: true,
videoUri: generatedVideo.videoUri,
duration: generatedVideo.duration ?? 3,
prompt: generatedVideo.prompt
}
});
}
7.3 Skill 封装的优势
将现有 AI 能力封装为 Skill 后,"画伴梦工厂"能够获得以下好处:
- 新流量入口:用户无需打开 App,直接通过小艺对话即可使用核心功能
- 降低使用门槛:儿童或老人不需要理解复杂的 UI 导航,一句话就能完成操作
- 跨应用协同:其他 App 的 Skill 也可以调用"画伴梦工厂"的能力(在用户授权下)
- 全场景覆盖:手机、平板、车机、智慧屏上都能使用
八、触发场景详解
8.1 语音触发
用户通过唤醒小艺后,使用自然语言描述需求。小艺的 NLU 引擎解析意图,匹配到对应的 Skill。这是最主要的触发方式,覆盖手机、车机、智慧屏等场景。
8.2 文本触发
在小艺对话框内,用户通过文字输入触发 Skill。适合不便使用语音的场景(如安静环境、公共场合)。
8.3 上下文感知触发
系统根据用户当前的行为和上下文,主动推荐或触发 Skill:
| 触发类型 | 触发条件 | 示例 |
|---|---|---|
| 习惯推荐 | 用户行为模式学习 | 每天下午自动推荐"文生图"Skill |
| 事件推荐 | 时间+事件特征 | 周末推荐"图生视频"Skill |
| 位置推荐 | 地理位置围栏 | 在画展场景推荐"画作识别"Skill |
| 小艺建议 | 系统智能预测 | 检测到相册有新的涂鸦照片时推荐 |
8.4 跨应用触发
通过 A2A 协议,一个 Skill 的执行结果可以作为另一个 Skill 的输入参数,实现跨应用的自动协作。
九、最佳实践
9.1 SKILL.md 编写规范
- trigger_scenarios 覆盖面要广:为同一个功能编写 5~10 种不同的自然语言表达方式,覆盖用户可能的各种说法
- description 要详细准确:给模型看的自然语言说明要具体,避免太笼统导致模型误匹配
- 参数 Schema 要完整:明确 required 字段和 optional 字段,减少模型传入空对象的概率
- 返回值结构要稳定:一旦上线勿随意修改字段名和类型,避免调用方解析失败
9.2 入口脚本开发规范
typescript
// ★ 规范一:统一使用 try-catch 包裹异步逻辑
async function handler(scriptInfo: ArkTSScriptInfo, params: Params) {
try {
// 业务逻辑
completeArkTSScriptInApp(scriptInfo, { result });
} catch (error) {
// ★ 必须回传错误,否则系统会一直等待
completeArkTSScriptInApp(scriptInfo, {
error: { message: error.message, code: error.code }
});
}
}
// ★ 规范二:参数校验前置
function validateParams(params: Params): boolean {
if (!params.imageUri) {
throw new Error('imageUri 是必填参数');
}
return true;
}
// ★ 规范三:超时控制
async function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {
const timeout = new Promise<T>((_, reject) => {
setTimeout(() => reject(new Error('Skill 执行超时')), ms);
});
return Promise.race([promise, timeout]);
}
9.3 调测建议
- 使用真机调试:模拟器无法完全模拟小艺的意图匹配过程
- 检查 hilog 日志:确认入口函数是否被正确调用,参数是否完整传递
- 测试多种触发语句:验证 trigger_scenarios 中所有的触发方式
- 异常场景覆盖:测试参数缺失、网络超时、服务不可用等异常情况
- 性能基线:确保 Skill 响应时间在合理范围内(建议 < 5s)
9.4 安全与隐私
- 最小权限原则:只申请 Skill 运行所必需的权限
- 用户授权:涉及敏感数据(相册、位置等)必须经过用户授权
- 数据最小化:只传输 Skill 执行所需的数据,不要过度采集
- 安全通信:使用 HTTPS 加密通信,避免敏感数据泄露
9.5 Skill 上架检查清单
| 检查项 | 说明 |
|---|---|
| SKILL.md 格式正确 | YAML Front Matter + Markdown 结构 |
| trigger_scenarios 不少于 5 条 | 覆盖用户常用表达 |
| 参数 Schema 完整 | 类型、描述、必填都正确 |
| 入口脚本有异常处理 | 所有分支都调用 completeArkTSScriptInApp |
| 应用已在 AppGallery Connect 上架 | Skill 必须关联已发布的应用 |
| 真机调试通过 | 至少 3 种触发语句测试通过 |
| 权限声明最小化 | 无多余权限申请 |
十、总结与对比
10.1 Skill 开发 vs 传统 App 开发
| 对比维度 | 传统 App 开发 | Skill 开发 |
|---|---|---|
| 核心思路 | 构建完整的独立应用 | 将功能片段外化为服务 |
| 开发方式 | 手动编写全部代码 | Vibe Coding 对话式开发 |
| 交互方式 | 页面+手势导航 | 语音/文本对话 |
| 用户获取方式 | 应用市场搜索下载 | 小艺意图匹配自动分发 |
| 设备适配 | 逐设备适配 UI | A2UI 协议自动适配 |
| 跨应用协同 | 需要自行实现 | A2A 协议自动编排 |
| 分发效率 | 用户需主动搜索 | 系统智能分发到精准用户 |
| 开发周期 | 数周到数月 | 数小时到数天 |
10.2 核心要点回顾
本文围绕鸿蒙 Skill 开发的核心主题,完整覆盖了以下内容:
| 知识点 | 核心要点 |
|---|---|
| Skill 概念 | 应用能力外化为系统智能体可调用的服务单元 |
| Vibe Coding | 自然语言对话驱动的 Skill 开发模式 |
| Skill 架构 | SKILL.md + 入口脚本 + module.json5 三层结构 |
| HMAF 2.0 | 鸿蒙智能体框架,意图识别 → 服务匹配 → 执行回传 |
| 多设备分发 | 一次开发,覆盖手机/平板/车机/智慧屏/手表 |
| 项目集成 | 画伴梦工厂的识别、生成能力可封装为 Skill |
10.3 下一步
Skill 开发是鸿蒙智能体生态的入口。掌握 Skill 开发后,你还可以继续探索:
- 元服务开发:无需安装即可使用的轻量服务
- Agent Framework Kit:在应用内嵌入智能体 UI
- Intents Kit:将应用意图共享到小艺建议、小艺搜索
- A2A 协议:实现多智能体协作的复杂工作流
下一节我们将进入第 7.2 篇,深入了解 Agent Framework Kit 的实战应用,学习如何在"画伴梦工厂"中嵌入系统级智能助手,实现真正的"应用+智能体"融合体验。
参考文档
本文内容参考自以下官方文档:
- 小艺开放平台 --- Skill 开发指南:
https://developer.huawei.com/consumer/cn/doc/service/develop-skill-0000002623371043 - 创建 Skill(Vibe Coding):
https://developer.huawei.com/consumer/cn/doc/service/vibe-skill-0000002623211165 - HMAF 鸿蒙智能体框架:HarmonyOS SDK API 26.0.0+ 文档
- 智能体场景开发案例:
https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-agent