人工智能大模型本地部署AI 应用移动开发AI AgentAI 技能MCP Clients【免费下载链接】galleryA gallery that showcases on-device ML/GenAI use cases and allows people to try and use models locally.项目地址https://gitcode.com/GitHub_Trending/gallery44/gallery点击查看免费下载read-calendar-events 是 Edge GalleryGoogle 开源的端侧 ML/GenAI 演示应用内置的一项 Agent 技能它让本地运行的 LLM 能够通过run_intent工具读取操作系统日历中指定日期的日程。本文以该技能随仓库发布的SKILL.md为核心骨架结合 IntentHandler、RunIntentTool、SkillManager 等源码完整拆解技能从 SKILL.md 解析、指令注入、工具注册到日历查询与 JSON 返回的全链路实现并给出可直接复用的参数格式与调用流程。技能文件定位一个极简但完整的 Agent 指令单元在仓库中该技能位于 Android/src/app/src/main/assets/skills/read-calendar-events/SKILL.md。文件本身非常短小却包含了 Edge Gallery 技能体系的两个核心组成部分YAML 风格的 frontmatter 元数据与自由文本的 Instructions 指令区。--- name: read-calendar-events description: Read OS calendar events for a specific date. --- # Read calendar events ## Instructions To read calendar events for a specific date, you must follow these exact steps: ...其中name是技能的唯一标识也是模型在意图识别时用于匹配技能的名称如read-calendar-eventsdescription用于向模型描述该技能的能力边界帮助模型在多种技能中选择正确的那一个## Instructions之后的正文则是注入到模型上下文的完整操作指令指导模型以固定步骤完成读取某日日历事件这一任务。这个三段式结构并不是随意的约定。在 SkillManager.kt 的convertSkillMdToProto中解析器以---分隔符切分文件第一段被解析为 header提取name、description等键其余内容作为instructions文本最终转换为 skill.proto 中定义的Skill消息包含name、description、instructions、built_in、selected等字段。技能目录被放在assets/skills/下因此被标记为 built-in 技能而通过 URL 添加或本地导入的技能则分别携带skill_url或import_dir_name字段。当模型需要该技能时由 LoadSkillTool.kt 调用skillsProvider.loadSkill(skillName)取回技能内容并通过 SkillExtensions.kt 中的模板SKILL_INSTRUCTIONS_TEMPLATE重新拼装为---\nname: %s\ndescription: %s\n---\n\n%s的形式连同技能描述一起注入模型提示词prompt再交由 AgentRuntimeExecutor.kt 驱动的 ReAct 循环执行。run_intent技能指令与系统能力之间的桥梁SKILL.md中反复出现的run_intent并不是日历功能专属接口而是 Edge Gallery 提供给端侧 Agent 的通用 Android Intent 执行工具。其实现位于 RunIntentTool.kt核心方法签名如下run_intent(intent: String, parameters: String) - MapString, Stringintent要执行的 Intent 动作名字符串parameters包含该 Intent 所需参数值的 JSON 字符串。调用成功后工具返回一个包含三个键的 Mapaction回显的 intent 名、parameters回显的参数字符串与resultIntentHandler 的执行结果字符串。若传入的 intent 名不在已知 IntentAction 列表中RunIntentTool会走guardMissingEntityWithSkillFallback兜底逻辑若该名称恰好命中某个已启用技能则返回提示该实体不存在请尝试作为技能运行否则返回Tool not found。该工具在 AgentTools.kt 的AgentToolsImpl中通过lazy方式注册为RunIntentTool(context, skillsProvider)与load_skill、run_js、run_mcp等工具一起作为 Agent 的可用工具集暴露给模型。同时工具执行过程中会通过 ToolAction.kt 定义的SkillProgressToolAction向聊天界面推送Executing intent ...进度项使用户在 UI 上可见每一步工具调用。第一步先取当前本地日期时间SKILL.md规定读取日历事件前必须先调用run_intent获取用户本地时间而不能直接假设今天intent: get_current_date_and_time parameters: {}该动作在 IntentHandler.kt 中的实现非常直接使用SimpleDateFormat(yyyy-MM-ddTHH:mm:ss EEEE, Locale.getDefault())格式化当前时间并原样返回。也就是说返回字符串同时携带了yyyy-MM-dd本地日期HH:mm:ss本地时间EEEE本地时区的星期几如 Friday。由于格式化基于Locale.getDefault()星期名称会随系统语言变化这要求模型在后续日期推算时既能解析May 15这类绝对日期也能解析tomorrowthis Friday这类相对表达。第二步显式推算目标日期YYYY-MM-DDSKILL.md特别强调在读取事件之前模型必须在自己的回复中显式写出日期推算过程包括今天的确切日期与星期几用户请求的目标日或相对时间如 tomorrow、this Friday、May 15最终计算得到的目标日期格式为YYYY-MM-DD。这种把中间计算过程写进回复的做法是引导端侧小模型降低日期推算错误率的关键设计——它要求模型把隐性推理外化为可校验的显式步骤同时让用户能在界面上看到模型的推算依据。推算时应特别留意跨月、跨年场景例如 1 月 31 日加 1 天应为 2 月 1 日这与同目录下 schedule-notification/SKILL.md 中对added days 超过当月天数时要正确滚动到下月/下一年的约束是一致的。第三步调用 read_calendar_events 读取指定日期日期确定后按SKILL.md的固定参数调用intent: read_calendar_events parameters: {date: YYYY-MM-DD}date是唯一的必填字段类型为字符串取值就是第二步推算出的目标日期。参数由 Moshi 解析为 IntentHandler.kt 中定义的ReadCalendarEventsParams(date: String)。权限检查READ_CALENDARreadCalendarEvents在查询前会先检查Manifest.permission.READ_CALENDAR是否已授予该权限已在 AndroidManifest.xml 中声明。若未授予则通过RunIntentTool传入的requestPermission回调发起授权请求——这个回调最终会转换为 ToolAction.kt 中的RequestPermissionToolAction在 Agent 聊天界面弹出系统权限对话框用户同意后返回true继续执行拒绝则直接返回failed: READ_CALENDAR permission denied by user。底层查询CalendarContract.Instances 的当天时间窗拿到权限后源码使用 Android 标准的CalendarContract.Instances进行查询逻辑分为四步用SimpleDateFormat(yyyy-MM-dd)解析传入的date得到该日零点对应的Date构造当天的完整时间窗先把小时/分钟/秒/毫秒全部清零得到startOfDayMillis再add(DAY_OF_MONTH, 1)并减 1 毫秒得到endOfDayMillis即当日 23:59:59.999通过Instances.CONTENT_URI.buildUpon()配合ContentUris.appendId把起止时间拼进 URI构成按实例区间查询以projection {Instances.TITLE, Instances.DESCRIPTION, Instances.BEGIN, Instances.END}查询并按${Instances.BEGIN} ASC升序排序。这意味着读取某日事件实际覆盖的是该日零点到次日零点前最后一毫秒的所有日历实例既包含整天事件也包含跨日事件的当日片段。第四步解析 JSON 结果并组织回答查询得到的光标被逐行转换为CalendarEventDtotitle、description、begin_time、end_time其中时间字段统一格式化为yyyy-MM-ddTHH:mm:ss最终序列化为ReadCalendarEventsResponse的 JSON{ events: [ { title: Team standup, description: Weekly sync, begin_time: 2026-09-30T10:00:00, end_time: 2026-09-30T10:30:00 } ] }SKILL.md的最后一步要求模型解释这份 JSON 列表并给出清晰、友好的回答即把结构化的时间/标题数据转述为自然语言日程摘要。若当天没有任何事件返回的events为空数组[]模型应如实告知用户当天没有安排。若解析失败如日期格式非法工具返回failed或failed: 错误信息。与周边 Intent 的联动一个完整的日程操作家族read_calendar_events只是 IntentHandler.kt 中IntentAction枚举的一员。从枚举定义可以推断同一套run_intent机制还支撑着另外五个动作intent 动作用途get_current_date_and_time获取本地日期、时间与星期read_calendar_events读取指定日期日历事件create_calendar_event调起系统日历创建事件title、description、begin_time、end_timeschedule_notification调度一条通知支持指定年月日与repeat_daily每日重复send_email调起系统邮件应用send_sms调起系统短信应用这些动作的 Skill 指令文档同样位于 assets/skills/ 下例如 create-calendar-event/SKILL.md 与 schedule-notification/SKILL.md。其中schedule_notification的参数title、message、hour、minute、可选的year/month/day、deeplink与repeat_daily由ScheduleNotificationParams承载并经 NotificationScheduleManager.kt 通过AlarmManager.setRepeating/setAndAllowWhileIdle落地到系统闹钟由 NotificationReceiver.kt 在触发时弹出通知并可携带构造出的com.google.ai.edge.gallery://...deeplink 在点击后回跳 Agent 聊天页面。由此可见读日历与建日程定时提醒共同构成了一个完整的日程管理技能矩阵全部复用run_intent这一条工具通道。从源码结构看技能体系的扩展方式从 SkillManager.kt 的实现可以推断Edge Gallery 的技能体系是开放的除了assets/skills/下的 built-in 技能外还支持从远程 URLaddSkillFromUrl自动去掉末尾/SKILL.md或/后拼接下载、本地目录导入addSkillFromLocalImport把目录递归拷贝进应用私有 files 目录并设置import_dir_name以及用户在界面中直接编辑saveSkillEdit规范化空格为连字符并写入skills/name/SKILL.md。任何满足 frontmatter instructions 格式的SKILL.md都可以成为 Agent 的一项新能力前提是它所依赖的动作Intent、JS 脚本或 MCP 工具已存在。技能启用状态由selected字段与模型级defaultDisabledSkills共同管理用户手动修改后会标记user_modified_selection以保留用户偏好。小结read-calendar-events是一个把端侧 LLM 意图理解与Android 系统日历能力无缝衔接的最小范例模型通过run_intent工具先后调用get_current_date_and_time与read_calendar_events前者提供日期推算所需的本地基准时间后者在READ_CALENDAR权限授权后利用CalendarContract.Instances完成当天时间窗内的事件查询并以 JSON 形式返回结构化日程而驱动这一切的正是仓库中以SKILL.md为载体的可插拔技能指令体系。理解这条链路也就掌握了 Edge Gallery 中所有基于 Intent 的系统操作类技能建日程、发邮件、定时提醒的共同运行原理。赞分享人工智能大模型本地部署AI 应用移动开发AI AgentAI 技能MCP Clients【免费下载链接】galleryA gallery that showcases on-device ML/GenAI use cases and allows people to try and use models locally.项目地址https://gitcode.com/GitHub_Trending/gallery44/gallery点击查看免费下载相关推荐Gallery Agent 技能开发指南基于 run_intent 工具实现 create-calendar-event 日历事件创建Gallery Agent 技能开发指南基于 run_intent 工具实现 create calendar event 日历事件创建 导读 本文以 Gall人工智能大模型本地部署AI 应用移动开发AI AgentAI 技能MCP ClientsAI Edge Gallery QR Code 技能深度解析基于 run_js 的端侧二维码生成实现AI Edge Gallery QR Code 技能深度解析基于 run_js 的端侧二维码生成实现 导读 本文以 AI Edge GalleryAndro人工智能大模型本地部署AI 应用移动开发AI AgentAI 技能MCP ClientsAI Edge Gallery 端侧邮件发送技能实战从 send-email 的 SKILL.md 到 run_intent 原生意图的实现链路AI Edge Gallery 端侧邮件发送技能实战从 send email 的 SKILL.md 到 run_intent 原生意图的实现链路 导读 sen人工智能大模型本地部署AI 应用移动开发AI AgentAI 技能MCP Clients上一篇如何轻松管理ComfyUI扩展ComfyUI-Manager完整指南下一篇《The Concise TypeScript Book》条件类型Conditional Types实战详解extends 三元表达式、分布式分发、infer 与内置工具类型创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考