首页 / 资讯中心 / 文章详情

如何开发Aether扩展:Extension API教程,给AI Agent注入自定义设置页与实时Widget

如何开发Aether扩展:Extension API教程,给AI Agent注入自定义设置页与实时Widget ★ FEATURED ARTICLE
【免费下载链接】AetherCodex for Android, iOS Mac. | Aether 扶摇项目地址https://gitcode.com/gh_mirrors/aether33/Aether点击查看免费下载Aether 是一款运行在 Android、iOS 与 Mac 上的 AI Agent 应用被称为口袋里的 Codex。它最大的亮点之一是开放的Extension API你只需一个包含 TypeScript 脚本的 npm 包就能给 Aether 的 AI Agent 注入自定义设置页、实时 Widget、命令、拦截器等能力。本教程带你从零搭建第一个 Aether 扩展包理解Surface 表面插槽 声明式 UI 树 原生设置页三件套并附上官方示例与常见坑位。一、先看懂Aether 扩展包的三种形态Aether 沿用 Pi Coding Agent 的可信代码扩展模型一个扩展包可以同时包含三种能力完整定义见 docs/AETHER_EXTENSIONS.md形态配置字段特点Pi 扩展pi.extensionsAgent 工具、命令、hooks与 Pi 生态兼容Script 扩展aether.extensionsTypeScript/JS 编写热重载可直接改 UI 与应用逻辑Native Modaether.nativeKotlin/DEX 编译产物可直接调用 Android 与 Compose需重启加载包结构非常直观本质上就是一个package.json加入口脚本{ name: my-aether-mod, version: 1.0.0, pi: { extensions: [./agent.ts] }, aether: { api: { min: 2, max: 2 }, extensions: [./android.ts] } }⚠️ 注意Aether 有意不做权限沙箱——安装扩展即意味着信任它可以访问 Node 运行时、Android 应用上下文与本地工作区。请只安装你信任的扩展。导入后的扩展会放在 Aether 托管的 Alpine 文件系统中~/.aether/extensions所有入口脚本都被监听文件改动后自动原子化热重载加载失败时保留上一个可用运行时错误会显示在 Extensions 页面上。二、一键搭建创建并导入你的第一个扩展1. 克隆仓库获取参考代码git clone https://gitcode.com/gh_mirrors/aether33/Aether2. 安装类型声明包只含类型声明运行时实现由 Aether 注入npm install --save-dev baimoqilin/aether-extension-api声明源码位于 packages/extension-api/src/index.tsAetherExtensionAPI接口就是你在扩展里能拿到的全部能力ui、host、services、state、storage、messages以及一系列register*方法。3. 编写入口脚本。官方示例 examples/aether-extension/index.ts 是最小完整参考import { defineAetherExtension, ui } from baimoqilin/aether-extension-api; export const activateAether defineAetherExtension((aether) { aether.registerSurface(chat.composer.top, { id: quick-tools, render: ({ storage }) ui.card([ ui.row([ ui.button(Count ${storage.count ?? 0}, increment, { tone: neutral }), ui.button(Prefill, prefill), ], { wrap: true }), ]), }); });4. 打包导入将目录压缩为 zip在 Aether 的设置 → Extensions扩展页中点击导入即可导入逻辑实现于 PiExtensionManager.kt会自动处理npm ci --omitdev依赖安装。三、实时 WidgetregisterSurface 与声明式 UI 树想给 AI Agent 界面加一块实时刷新的状态卡片用registerSurface把内容塞进指定插槽即可无需替换任何内置 UI。常用插槽一览插槽位置chat.top聊天顶栏下方chat.list.start/chat.list.end消息列表首/尾chat.composer.top输入框正上方Widget 最佳位置settings.hub设置中枢顶部drawer.header/drawer.footer会话抽屉固定头/尾aether.registerSurface(chat.composer.top, { id: status, order: 10, render: ({ is_running, draft_input, storage }) ui.row([ ui.text(is_running ? Agent running : Ready), ui.text(${String(draft_input).length} chars), ui.text(Count: ${storage.count ?? 0}), ]), });关键点声明式 UI 树ui.text / card / column / row / button / switch / input / progress / web等原语最终由 Aether 用原生 Compose 渲染视觉风格与内置界面完全一致实时性render接收的 context 含is_running、draft_input等公共状态Agent 开始/结束、输入变化都会触发重渲染持久化aether.storage.get/set自动落盘到~/.aether/app-extension-state.json重启不丢响应交互ui.button(Increment, increment)点击后触发你注册的aether.registerAction(increment, ...)再调用aether.invalidate()即可局部刷新。进阶替换、包裹、隐藏内置组件比 Surface 更强的是registerComponent它针对具名内置组件提供before / after / replace / wrap / hide五种模式按order排序、最后一个replace生效aether.registerComponent(chat.composer.skillPicker, { id: remove-native-picker, mode: hide, // 隐藏内置 Skill 选择器 order: 100, });典型目标包括chat.screen、settings.screen、chat.composer.actionTray等。需要完全自由的 HTML 微界面时还有ui.web({ height, html })逃生舱可通过Aether.postMessage()回调回已注册的 action。四、注入自定义设置页registerSettings这是扩展原生感最强的能力registerSettings会在设置的Extensions 分组位于 Reliability 与 Agent Skills 之间里为你生成一整页原生设置沿用 Aether 内置页的卡片、间距与字体——你只提供数据不能覆盖样式。aether.registerSettings({ id: preferences, icon: settings, title: Preferences, subtitle: Extension behavior, sections: [{ title: General, settings: [ { id: endpoint, type: text, label: Endpoint, default: https://example.com }, { id: enabled, type: toggle, label: Enabled, default: true }, { id: mode, type: select, label: Mode, options: [ { value: fast, label: Fast }, { value: quality, label: Quality }, ], default: fast }, ], }], });支持的控件text、password、textarea、number、toggle、select/dropdown、segmented、tab、slider、button、link、label、divider等完整枚举见 AetherSettingType值按扩展 × 页 × 设置项三元组自动持久化热重载后自动恢复支持categories二级分类先显示分类列表再进入子页AI 也能改你的设置Aether Agent 可通过aether_config_get({ categories: [extensions] })查看该页并用aether_config_set替你调整开关和取值。五、让扩展活起来状态、服务与拦截Script Mod 与 Aether 内核之间还有三条通道接口定义见 docs/AETHER_EXTENSIONS.mdaether.state读写公共状态如draft_input预填输入框、selected_model_key切模型、agent_mode_enabled支持transaction批量操作await aether.state.transaction([ { path: draft_input, value: Review the current changes. }, { path: agent_mode_enabled, value: true }, ]);aether.services可发现、可替换的服务注册表内置skills、state等高优先级注册可覆盖核心实现const skills await aether.services.invoke(skills, list);aether.intercept拦截内置操作如chat.new、skills.selection返回{ cancel: true, reason }即可阻止操作——比如锁定某个 Skill 不允许取消。此外还有低层aether.host.invoke()桥覆盖app.sendMessage、app.newChat、app.setModel、runtime.execute执行 Alpine/Termux 命令等方法详见宿主方法表。六、官方示例与生态扩展巡礼仓库自带可直接导入的参考实现examples/aether-extension/Pi Aether 双形态组合包含输入框上方卡片、原生设置页、before_send事件改写是最推荐的新手起点examples/global-skills-mod/展示如何用声明式 UI 替换原生 action tray、直写 Aether 原生 Skill 选择服务并新增全局 Skills 页——组合 UI 替换 真实应用状态的标准范式。仓库extensions/目录下还有三个生产级扩展可作进阶阅读扩展能力pi-mcp-adapter/接入任意 MCP ServerOAuth、工具审批、资源面板pi-subagents/多 Agent 编排、调度、独立视图pi-web-access/数十种搜索/抓取后端与网页提取七、常见坑位与最佳实践清单热重载是原子的所有脚本工厂必须全部加载成功才会替换运行时失败会保留旧运行时并在 Extensions 页报错。aether.api的min/max版本不兼容会直接拒绝加载Native Mod 需重启DEX 类路径只在进程启动时发现增删改 Native Mod 必须重启 Aether崩溃循环时 Aether 会自动进入Native Mod Safe Mode跳过全部 Native Mod 但保留脚本扩展可在扩展页一键重新启用依赖自动安装zip 导入时有 lockfile 走npm ci --omitdev否则npm install --omitdev捆绑的node_modules会原样使用只做数据不碰样式设置页与 Surface 的视觉由 Aether 原生渲染别想着自定义布局需要自由样式请用ui.web命名规范与 Pi 共用的包把 Pi 工厂作为default exportAether 工厂导出为activateAether即可一份代码两端运行。照着 examples/aether-extension/ 改三行代码你就已经拥有第一个能跑在 AI Agent 里的实时 Widget 和原生设置页了。更多细节请阅读 docs/AETHER_EXTENSIONS.md 的完整 API 说明。赞分享【免费下载链接】AetherCodex for Android, iOS Mac. | Aether 扶摇项目地址https://gitcode.com/gh_mirrors/aether33/Aether点击查看免费下载相关推荐APITable扩展开发Widget系统与自定义功能APITable扩展开发Widget系统与自定义功能 本文详细介绍了APITable Widget SDK的开发环境搭建、自定义数据列类型与公式开发、自动化机后端前端低代码协同办公企业应用数据库Voyager 1.4.7 更新解读收藏对话库、回复完成通知与 Gemini UI 兼容性修复Voyager 1.4.7 更新解读收藏对话库、回复完成通知与 Gemini UI 兼容性修复 本篇技术指南围绕 Voyager 增强套件Gemini、AIAI 应用前端插件系统提示工程终极Ownphotos API开发指南从零开始扩展自定义功能终极Ownphotos API开发指南从零开始扩展自定义功能 Ownphotos是一个强大的自托管Google Photos替代方案提供了照片管理、人脸识别上一篇OpenScholar 官方实现深度解析基于 peS2o 检索与自反馈循环的科研文献综述生成管线下一篇bk-cmdb 业务容器拓扑树缓存接口get_biz_kube_cache_topo解析一次请求取回 Cluster、Namespace、Workload 全量层级创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站