【记得闪卡】算是我第一个真正做成型的项目。目前已经上架华为应用市场进行了多轮迭代。但是迭代无穷无尽,现在又往里面塞了个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 rslibArkUI 主要负责界面。
比如首页展示牌组,学习页展示卡片和四个评分按钮,浏览页展示卡片和笔记。真正涉及卡片数据、复习队列、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资质和个人企业的事。