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

在展开讲它能做什么之前,必须先厘清一个最容易被误读的词——“本地”。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)扫描、绑定、取能力清单、发起调用、把结果喂给 LLMQuroAciManager + 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读取页面 HTMLclean 模式返回精简 DOM(v1.0.8 修复 Binder 1MB 传输限制导致的崩溃)
browser_crawl抓取结构化正文 + 链接返回正文 + 出站链接
browser_search调用搜索引擎query(必填)/ engine(可选:bing/google/baidu/ddg,默认 bing)
browser_script注入 JavaScriptcode(必填)
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

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐