【记得闪卡】算是我第一个真正做成型的项目。目前已经上架华为应用市场进行了多轮迭代。但是迭代无穷无尽,现在又往里面塞了个Agent,不知道3.0.0版本会不会因此被卡上线

项目地址:

jidecards-anki-harmonyos:基于 HarmonyOS 与 Anki 内核的闪卡学习客户端项目 - AtomGit

记得闪卡(jidecards),一个 HarmonyOS Next端原生闪卡应用,界面和应用层使用 ArkTS / ArkUI,底层直接接入 Anki 26.05 的 Rust 后端。目前牌组管理、复习、FSRS、统计、浏览编辑、图片遮挡、导入导出、AnkiWeb 同步、初步的 Agent 制卡和改卡这些主要部分都已经基本完成。

整体原理其实不复杂。没有重新实现一套 Anki。我直接把 Anki 的 Rust Core 接到了鸿蒙应用里。

整体调用链大致是:

ArkUI
↓
ArkTS Service
↓
BackendSession
↓
Node-API
↓
C ABI
↓
Rust
↓
Anki rslib

ArkUI 主要负责界面。

比如首页展示牌组,学习页展示卡片和四个评分按钮,浏览页展示卡片和笔记。真正涉及卡片数据、复习队列、FSRS 调度、模板渲染、数据库、同步等逻辑时,会通过 ArkTS 的 Service 层调用 Anki 后端。

ArkTS 和 Rust 中间不能直接调用,所以中间做了一层很薄的桥。

上层实际上主要通过类似下面的接口访问后端:

openBackend()
runMethodRaw()
closeBackend()

其中 runMethodRaw() 接收 service、method 和 protobuf 编码后的参数,然后通过 Node-API 进入 C++,再通过 C ABI 进入 Rust。

C++ 层基本不处理业务,只负责桥接。

Rust 层再把对应请求路由给 Anki rslib。

所以很多功能实际上都是直接使用 Anki 原本的实现。例如复习。进入一个牌组后,客户端先让 Anki Scheduler 获取当前学习队列,然后取出一张卡片。

卡片正反面也不是我自己重新解析模板,而是交给 Anki 的 Card Rendering 后端生成 HTML,再放进 HarmonyOS 的 Web 组件中显示。

用户点击 Again、Hard、Good、Easy 后,评分继续交给 Anki Scheduler。Scheduler 更新卡片状态并计算下一次复习时间,然后客户端继续取下一张卡。

基本就是:

取卡
→ 渲染问题
→ 显示答案
→ 提交评分
→ Anki Scheduler 更新
→ 取下一张

FSRS 也是一样。

记得闪卡没有自己实现一套 FSRS,而是直接使用 Anki 当前的调度实现。客户端主要负责参数设置、用户操作和结果展示。

这样做最大的好处是不用重新维护一整套调度器,同时也能继续保持和 Anki 数据体系的兼容。

.apkg.colpkg、笔记类型、卡片模板、媒体、搜索语法、AnkiWeb 同步这些能力,本质上也都建立在 Anki Rust 后端上。

项目里我自己主要做的是鸿蒙这一侧。

包括 ArkUI 界面、应用状态、Service 封装、Native Bridge、卡片展示、统计界面、桌面服务卡片、学习提醒、TTS、牌组管理,以及后来加入的 AI Agent(雏形)

现在的结构是:

用户自然语言
↓
Agent
↓
受限工具
↓
生成修改草稿
↓
用户确认
↓
执行器
↓
ArkTS Service
↓
Anki Rust

也就是说模型只能调用预先定义好的工具。

比如读取牌组结构、读取卡片、生成新卡草稿、修改字段等。

真正写入之前会先生成草稿,用户确认之后才执行。删除、修改模板、迁移笔记类型这类操作还会有更严格的确认。

这样模型只是负责理解自然语言和决定调用什么工具,真正的数据操作仍然走已有的应用逻辑。

目前整个项目的主要结构已经比较稳定了。

从最开始只能简单读取和复习卡片,到现在已经包含 ArkUI、ArkTS、C++、Rust、protobuf、SQLite、Web 渲染、同步、系统 API 和 LLM Agent,基本把一个完整应用会碰到的东西都碰了一遍。

其中尤其是Agent能力,让我出奇觉得还不错。

其实很多Anki高级兼容这方面我很多都没做,什么极度自定义的编辑器等等,这玩意接入麻烦一堆,而且我的理解是不需要。

不说手机操作困难问题,我重点觉得重点是可以交给Agent。我现在使用Anki制卡都是描述清楚需求后Agent,让后打包成apkg直接安装使用。对于很多耐心有限的用户来说显然放个公告来告知可以去下载个Agent软件来获取独属于你的牌组也是个问题。

所以我直接让codex帮我写了个轻量Agent。这个Agent也方便不少了,毕竟可以直接应用内使用。而且Agent新增闪卡也可以在现有牌组里面新增,Agent改卡更是可以直接修改看不爽的卡片。可以在学习到对应闪卡是进入右上角更多进入AI改卡界面,任何需求可以直接说,Agent已经锁定了当前指定的闪卡了。这样就会很方便。

因此我觉得这个Agent或许在适当完善后完全可以不作为外界Agent的平替,而成为记得闪卡不可替代的能力。

目前思路是让Agent具有很高的后端数据读取权力,但是操作权力受限。AI使用用户自己的API。

虽然效果还差点意思,但是有提升空间,虽然不知道这个版本会不会有AI这个因素而不让上架。

从最初尝试把Anki接入,到现在Agent雏形接入,也过去近一个月了。

虽然目前日活只有几十人的样子,但大概不再算是个Demo 了。

作为准大学生的第一个完整的投入许久的作品,只希望带着AI的3.0.0能顺利过审。不行的话只能在应用市场上先去掉AI功能了,现在搞了个AI,还得去了解一下AI资质和个人企业的事。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐