一、核心概念澄清:什么是"本地"?

在展开讲它能做什么之前,必须先厘清一个最容易被误读的词——“本地”。ZorvAI 在多处强调自己是"安卓端本地优先的 AI Agent",但这个"本地"指的不是在手机上跑一个 7B、14B 参数大模型做端侧推理,而是指三件事:

  1. Agent 的控制逻辑在本地
  2. 工具的调度和执行在本地
  3. 数据流转在本地闭环

至于大模型本身在哪里推理,取决于你接入的是云端 API 还是本地模型服务——这两者是正交的,互不绑定。

1.1 "本地 Agent"的三种含义对比

维度 传统云端 Agent(GPTs / Dify / Coze 等) ZorvAI 的"本地"含义
模型推理在哪 云端服务器 可以是云端 API,也可以是本地模型,架构上不限制
工具调用方式 通过公网 HTTP 请求调用远程 API 通过 Android Binder IPC 调用同设备 App
控制逻辑在哪 云端 Agent 服务 运行在手机本地的 ZorvAI 应用进程内
数据是否出设备 用户输入和工具响应都经过公网 模型若用云端 API 则提示词会上行;工具执行结果和 App 间调用完全在设备内
能否操作本机 App 不能,除非 App 主动暴露公网接口 能,通过 ACI 框架调用任意实现了该协议的本机 App

所以正确的理解是:ZorvAI 是一个住在你手机里的 Agent 控制端——它借用大模型的"脑子",但"手脚和眼睛"全在你这台设备上。模型本身是不是端侧跑的,不影响这套架构的定位。

  • 接云端 API:提示词会上公网,但工具执行仍在本地
  • 接本地模型:跑在 Termux 里的本地模型,实现完全离线的 Agent

ACI 开发者手册里把这件事定义得非常明确:“让手机上的任意 App 能力成为 AI Agent 可编排的工具,无需公网、无需云端中转”。这里的"无需公网"修饰的是工具调用这一段,不是模型推理这一段。

二、项目概览

  • 项目地址github.com/Quor-a/ZorvAI
  • 技术栈:Kotlin + Jetpack Compose
  • 开源协议:Apache-2.0
  • 核心创新:ACI(Agent Capability Interface)框架——让手机上任意 App 的能力,都能被 AI 智能体发现、理解并编排调用

三、用户侧功能全景

ZorvAI 在用户侧提供的是一套现代 AI Agent 应具备的完整基础能力:

3.1 核心功能模块

  1. 多模型对话

    • 可接入多种 LLM,灵活切换模型提供商
    • 模型接入口是开放的,不绑死某一家服务商
  2. 人格系统

    • 支持人格卡和角色设定
    • 可设定特定的说话风格、知识倾向和行为边界
  3. 记忆能力

    • 具备记忆能力,让 Agent 能沉淀历史、形成长期上下文
  4. 语音全双工 TTS/STT

    • 支持语音合成与识别
    • 本地集成 sherpa-onnx-whisper-tiny 模型(约 85MB onnx 文件),离线也能做语音识别
    • TTS 由单例 QuroTtsHolder 管理,支持多服务商接入
  5. 定时任务

    • 支持调度周期性或定点触发的任务
  6. 多渠道接入

    • 支持飞书、QQ、微信等平台接入
    • Agent 的核心能力可以通过这些渠道对外提供服务
  7. 可扩展工具链

    • 通过 ACI 框架,理论上可以把手机上任意 App 的能力变成 AI 可编排的工具

四、技术架构:四层分层设计

ZorvAI 的整体架构分为四层,从底向上依次是:

+-------------------------------------------+
| 用户层:多模型对话 / 人格 / 记忆 / 语音 |
+-------------------------------------------+
| 能力层:ACI 框架(Agent <-> App 编排)   |
+-------------------------------------------+
| 运行时层:CMS v2 模块(QuroCmsRepository)|
+-------------------------------------------+
| 引擎层:NODE / PYTHON / SSH /            |
|         JAVA / RUST / GO 环境供给        |
+-------------------------------------------+

4.1 各层详解

引擎层:底层"运行时骨架"

  • 负责把 NODE / PYTHON / SSH / JAVA / RUST / GO 这些环境供给到设备上
  • 这是能力运行的基础设施——没有这一层,Agent 只能跑 Kotlin/Java 代码,扩展能力严重受限
  • 有了它,开发者可以用熟悉的语言写脚本模块,Agent 能直接调用

CMS v2 模块层(Capability Module System)

  • 用户自建的、可复用的上层能力单元,运行在引擎提供的运行时之上
  • 每个模块通过 serializeModule / parseModule 进行导入导出,相当于插件包
  • 示例:写一个"监控某个 API 并返回结果"的 Python 脚本,打包成 CMS 模块,Agent 就能在任务中调用

能力层:ACI 框架

  • 负责把大模型的自然语言意图翻译成对具体 App 能力的调用指令
  • 这是整个项目最核心的创新点

用户层:统一入口

  • 包含对话界面、人格管理、记忆存储、语音交互等前端功能
  • Web 渲染方面,内置了 GeckoView 浏览器引擎(MPL-2.0)作为系统 WebView 的替代,用于渲染网页与 HTML 预览

五、ACI 框架:整个项目的灵魂

ACI(Agent Capability Interface,智能体能力接口)是一套同设备、无 Root、基于 AIDL Binder 的本地跨应用调用框架。任何 Android App 只要引入 aci-core 库,就能把自己暴露成"可被 AI 调用的能力",由 ZorvAI 的 LLM 自动编排调用顺序和参数。

5.1 两端角色与关键类

角色 职责 关键类
控制端(ZorvAI) 扫描、绑定、取能力清单、发起调用、把结果喂给 LLM QuroAciManager + aci-coreIACIService
受控端(你的 App) 继承 BaseACIService,声明能力,实现处理逻辑 BaseACIService / Capability / ACIRequest / ACIResponse

Binder 契约定义跨进程方法

5.2 一次完整调用的时序

User 大模型 受控端App ZorvAI控制端 User 大模型 受控端App ZorvAI控制端 发现与绑定阶段 意图理解与决策 调用执行阶段 alt [进程已运行] [进程停止(Android 11+)] par [并行处理] alt [异步调用场景] 结果反馈与继续 错误处理路径 discover() 发现服务 bind() 建立Binder连接 getCapabilities() 获取能力清单 返回Capability列表 提交用户意图 + 能力清单 返回调用决策(能力ID + 参数) call() 同步调用 ACTION_WAKE 广播 WakeReceiver唤醒进程 bind() 重新绑定 call() 同步调用 onCall() 执行业务逻辑 返回ACIResponse(成功) callAsync() 异步调用 立即返回"已接收" 后台执行耗时操作 继续其他对话 回调返回最终结果 提交执行结果 生成下一步指令或最终回答 展示最终结果 返回ACIResponse(错误) 提交错误信息 生成错误处理建议 提示调用失败

说明

  • 针对 ColorOS / Android 11+ 的 stopped-state,控制端会先发 ACTION_WAKE 广播唤醒受控端进程再绑定
  • LLM 拿到能力清单后,由模型自主决策"调哪个能力、传什么参数",从而实现多 App 协同的自动化任务编排

5.3 五层鉴权模型

AI 能调用 App 这件事本身存在安全风险,ACI 在五个层面上做了纵深防御:

  1. Android Manifest 权限
  2. Binder UID 校验
  3. onCheckPermission() 业务级白名单
  4. 网页链接 中配置的策略规则
  5. 能力级别的细粒度权限声明

任何一层拒绝都会中断调用,避免"AI 乱调、越权调"的风险。

5.4 BaseACIService 的方法契约

受控端继承 BaseACIService 后,有以下方法可重写:

方法 是否必重写 说明
onCreateCapabilities(): List<Capability> 必须 注册你的能力清单
onCall(request: ACIRequest): ACIResponse 必须 同步处理单次调用
onCallAsync(request, callback) 可选 异步处理;默认实现会切线程后调 onCall
onCheckPermission(request, callerPkg): Boolean 可选 自定义调用方校验,默认返回 true
onBeforeCall / onAfterCall 可选 钩子,默认仅打日志

重要提醒

  • Capability.create(String id, String description) 的第二个参数是给 LLM 的自然语言描述,不是版本号
  • 方法内部固定 version = "1.0"
  • 如果误把 "1.0"description 传入,LLM 就看不到能力的实际说明,会导致 Agent 无法正确理解该能力

六、工具链实战:以 ZorvAI 浏览器为例

ZorvAI 浏览器是官方的 ACI 受控端参考实现,也是目前能力最完整的示例。它基于 GeckoView 内核,不只是个网页容器,更是 Agent 的一个"眼睛和手"。

6.1 能力概览

浏览器受控端向控制端暴露了 30 项能力,覆盖基础操作、Agentic 行为、资源共享、完整方案执行、虚拟鼠标等类别。2026-08-01 的全量测试报告显示 28/30 通过。

6.2 核心能力详解

能力 ID 说明 关键入参
browser_open 打开网址 url(必填)
browser_read 读取页面 HTML clean 模式返回精简 DOM(v1.0.8 修复 Binder 1MB 传输限制导致的崩溃)
browser_crawl 抓取结构化正文 + 链接 返回正文 + 出站链接
browser_search 调用搜索引擎 query(必填)/ engine(可选:bing/google/baidu/ddg,默认 bing)
browser_script 注入 JavaScript code(必填)
http_request 发送原生 HTTP 请求(v1.0.14 新增) url / method / headers / body

6.3 http_request 能力详解

http_request 能力特别值得说一下:它让 AI 可以经 ACI 让受控浏览器代为发起任意 HTTP 请求,重点是"本地组网(相同网络下)"——可以直接访问同网段设备的明文 HTTP 服务,无需因公网明文限制而却步。

这意味着 Agent 可以调用:

  • Web API / 私有接口
  • 抓取网页
  • 对接第三方服务
  • 直接访问路由器后台、NAS、智能家居(HomeAssistant 等)、IoT 设备、树莓派等局域网 HTTP 服务(http://192.168.x.xhttp://10.x*.local mDNS)

支持 GET/POST/PUT/DELETE/PATCH/HEAD 及任意自定义方法,支持自定义请求头与请求体。

6.4 典型使用场景

场景:“使用 ACI 浏览器获取一个小说然后使用多音色路由和情绪标签读出来”

Agent 执行流程

  1. 调用 browser_search 找到小说
  2. browser_open 打开链接
  3. 调用 browser_crawl 抓取正文内容
  4. 将正文文本交给 TTS 引擎,结合多音色路由进行沉浸式朗读

多音色路由

  • 通过 Markdown 表格定义角色映射
  • 正文中用 (角色, 情绪) 标注
  • TTS 引擎会根据这些标记自动切换对应的音色和语调

七、开发者接入:5 步让你的 App 被 AI 调度

aci-core 是纯本地库,仅依赖 androidx.annotation:annotation:1.7.1,以 AAR 形式分发。

7.1 获取 aci-core

方式 A:从 ZorvAI Releases 的 v1.0.6+ 直接下载 aci-core-release.aar,放入你模块的 libs/ 目录

方式 B:开源独立分支 aci-coregit checkout aci-core 即可拿到一个可独立 ./gradlew assembleRelease 的 Android 库工程,可自行构建或改源码

7.2 受控端 5 步接入

详见 docs/ACI_DEVELOPER_GUIDE.md

  1. 引入 aci-core:把 AAR 放进 libs/ 并在 网页链接 声明依赖
  2. 声明权限:在 网页链接 中定义能力的 5 层鉴权模型
  3. 继承 BaseACIService:实现 onCreateCapabilities() 声明能力清单
  4. 处理调用:在 onCall() 中实现具体业务逻辑,返回 ACIResponse;在 onCheckPermission() 中做权限校验
  5. 注册与暴露:在 Manifest 中注册 Service,等待控制端 discover() 发现并绑定

7.3 最小化接入代码示例

class MyAciService : BaseACIService() {
    override fun onCreateCapabilities(): List<Capability> {
        return listOf(
            Capability.create("browser_open", "打开浏览器到指定网址")
        )
    }

    override fun onCall(request: ACIRequest): ACIResponse {
        return when (request.capability) {
            "browser_open" -> handleOpen(request)
            else -> ACIResponse.error(
                ACIError.CAPABILITY_NOT_FOUND,
                "unknown capability"
            )
        }
    }

    override fun onCheckPermission(
        request: ACIRequest,
        callerPkg: String
    ): Boolean {
        return callerPkg == "com.ai.assistance.quro" || 
               callerPkg == packageName
    }
}

八、项目现状与边界

8.1 基本信息

  • 项目地址https://github.com/Quor-a/ZorvAI(双平台托管:GitHub + Gitee)
  • 开源协议:Apache-2.0
  • 技术栈:Kotlin + Jetpack Compose
  • 当前状态:活跃迭代中,很多能力还在持续扩展

8.2 核心价值

这个项目真正有价值的地方不在于它今天已经能做多少炫酷的演示,而在于它提出了一套清晰的协议:App 开发者只需要花几十分钟改造,就能让自己的应用变成一个可以被 AI 理解和调用的工具

ACI 的设计思路——让每个能力自描述、让控制端动态发现并编排——在任何 Agent 系统中都有参考价值。

8.3 需要认清的边界

边界一:“本地"不等于"端侧模型”

  • 如果你的场景要求完全离线(包括模型推理),你需要自己接入一个端侧模型服务
  • ZorvAI 的架构支持这一点,但这不是它默认提供的

边界二:它是安卓端 Agent,不是服务端 Agent

  • ZorvAI 解决的是"手机端 Agent 如何操作本机 App"的问题
  • 如果你要做的是服务端 Agent 调度远程 API,这套架构不能直接套用——但它的设计范式值得借鉴

九、展望

如果未来有足够多的 App 遵循这套 ACI 标准,安卓手机的使用方式会从"人手动操作每个 App"逐步过渡到"人下达意图,Agent 协调多个 App 完成"。这或许是 ZorvAI 这类项目最大的长远意义。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐