SuperAPI AI 工具集

anki-connect

通用与其它

查看项目

更新于 10-15 20:21

技能介绍

用途

该技能用于通过 AnkiConnect 与 Anki 进行可靠交互。它把用户的请求翻译为 AnkiConnect 动作,构造 JSON 请求,通过 curl/jq(或等价工具)执行,并安全地解释返回结果。凡用户要求与 Anki 交互的场景(包括读取或修改牌组等),都应使用此技能。

前置条件与环境

若 Anki 未运行,先启动 Anki,然后等待 AnkiConnect 服务器在 http://127.0.0.1:8765(默认地址)响应。可用 curl 验证就绪状态,例如 curl -sS http://127.0.0.1:8765 应返回 Anki-Connect。

安全与确认策略(关键,无例外)

在对笔记或卡片执行任何破坏性或修改性操作前(新增、更新、删除、重新排期、暂停、取消暂停、更换牌组、更改字段/标签),必须向用户请求确认。若可用则使用 AskUserQuestion 工具,否则通过聊天询问。每个逻辑操作只请求一次确认,即使它需要多次 API 调用(如搜索 + 更新 + 验证)。按意图与范围分组确认(例如“更新匹配查询 X 的 125 条笔记”)。

默认需要确认的操作包括:

笔记类:addNote、addNotes、updateNoteFields、updateNoteTags、updateNote、updateNoteModel、deleteNotes、removeEmptyNotes、replaceTags、replaceTagsInAllNotes、clearUnusedTags。

卡片类:setEaseFactors、setSpecificValueOfCard、suspend、unsuspend、forgetCards、relearnCards、answerCards、setDueDate、changeDeck。

会实质性改变卡片/笔记的牌组或模板修改(牌组删除、模板编辑)也需询问,即使操作未在上方显式列出。

API 基础

请求格式:每个请求都是 JSON,包含 action(字符串动作名)、version(API 版本,除非用户另行指定则用 6)、params(参数对象,可选)。

响应格式:每个响应都是 JSON,包含 result(返回值)、error(成功时为 null,失败时为描述错误的字符串)。使用 result 前始终先检查 error。

权限:从非受信来源交互时,先使用 requestPermission;它是唯一接受任意来源的动作。使用 version 确保兼容性;版本 ≤ 4 时响应可能省略 error 字段。

curl + jq 模式:优先用 jq 构建 JSON 并解析响应,保持请求显式且结构化。以下为最小请求模板(保留原代码):

jq -n --arg action "deckNames" --argjson version 6 '{action:$action, version:$version}'
| curl -sS http://127.0.0.1:8765 -X POST -H 'Content-Type: application/json' -d @-

带参数的请求(保留原代码):

jq -n
--arg action "findNotes"
--argjson version 6
--arg query "deck:French tag:verbs"
'{action:$action, version:$version, params:{query:$query}}'
| curl -sS http://127.0.0.1:8765 -X POST -H 'Content-Type: application/json' -d @-

处理 result/error(保留原代码):

curl -sS http://127.0.0.1:8765 -X POST -H 'Content-Type: application/json' -d @-
| jq -e 'if .error then halt_error(1) else .result end'

批量执行多个动作以通过 multi 减少往返,并在修改数据时将动作归入一次确认(保留原代码):

jq -n --argjson version 6 --arg query "deck:French"
'{action:"multi", version:$version, params:{actions:[ {action:"findNotes", params:{query:$query}}, {action:"notesInfo", params:{notes:[]}} ]}}'
| curl -sS http://127.0.0.1:8765 -X POST -H 'Content-Type: application/json' -d @-

在链式调用时,把空数组替换为上一个动作的结果;在 CLI 使用中,除非使用脚本语言,否则拆成两次调用。

核心工作流指引

  1. 验证连通性与版本:调用 requestPermission(安全),调用 version 确认 API 级别并在请求中使用 version: 6。

  2. 发现支持的动作:使用 apiReflect 搭配 scopes: ["actions"] 列出支持的动作,据此将用户意图映射到动作名。

  3. 将用户请求解析为动作序列:区分只读与破坏性操作;对笔记/卡片的破坏性/修改性操作,带范围与数量请求一次确认;修改前优先用 findNotes/findCards + notesInfo/cardsInfo 预览。

  4. 执行并验证:按顺序执行调用,检查每个响应的 error,汇总报告结果及返回的 ID。

常见任务配方(面向 CLI)

列出牌组:动作 deckNames。创建牌组:动作 createDeck(若作为卡片/笔记修改工作流的一部分创建,则需确认)。搜索笔记/卡片:动作 findNotes、findCards(使用 Anki 搜索语法)。预览笔记数据:动作 notesInfo(笔记 ID)。添加笔记:动作 addNote、addNotes(需确认;用 canAddNotes 或 canAddNotesWithErrorDetail 做预检)。更新笔记字段或标签:动作 updateNoteFields、updateNoteTags 或组合的 updateNote(需确认;注意不要在浏览器中打开该笔记,否则更新可能不生效)。删除笔记:动作 deleteNotes(需确认)。暂停/取消暂停卡片:动作 suspend、unsuspend(需确认)。把卡片移到牌组:动作 changeDeck(需确认)。设置到期日或重新排期:动作 setDueDate(需确认)。媒体上传/下载:动作 storeMediaFile、retrieveMediaFile、getMediaFilesNames、getMediaDirPath、deleteMediaFile(上传可用 base64(data)、文件路径(path)或 URL(url))。同步:动作 sync。

搜索语法速记(用于 findNotes/findCards)

词之间用空格分隔,默认按 AND 组合;使用 or、括号和 - 表示 NOT 逻辑;使用 deck:Name、tag:tagname、note:ModelName、card:CardName;使用 front:... 或其他字段名按字段限定;使用 re: 表示正则,w: 表示词边界搜索,nc: 忽略重音;使用 is:due、is:new、is:learn、is:review、is:suspended、is:buried 过滤卡片状态;使用 prop: 搜索 interval 或 due date 等属性;必要时用引号或反斜杠转义特殊字符。

动作目录(用作映射参考)

卡片动作:getEaseFactors、setEaseFactors、setSpecificValueOfCard、suspend、unsuspend、suspended、areSuspended、areDue、getIntervals、findCards、cardsToNotes、cardsModTime、cardsInfo、forgetCards、relearnCards、answerCards、setDueDate。

牌组动作:deckNames、deckNamesAndIds、getDecks、createDeck、changeDeck、deleteDecks、getDeckConfig、saveDeckConfig、setDeckConfigId、cloneDeckConfigId、removeDeckConfigId、getDeckStats。

图形界面动作:guiBrowse、guiSelectCard、guiSelectedNotes、guiAddCards、guiEditNote、guiAddNoteSetData、guiCurrentCard、guiStartCardTimer、guiShowQuestion、guiShowAnswer、guiAnswerCard、guiUndo、guiDeckOverview、guiDeckBrowser、guiDeckReview、guiImportFile、guiExitAnki、guiCheckDatabase、guiPlayAudio。

媒体动作:storeMediaFile、retrieveMediaFile、getMediaFilesNames、getMediaDirPath、deleteMediaFile。

杂项动作:requestPermission、version、apiReflect、sync、getProfiles、getActiveProfile、loadProfile、multi、exportPackage、importPackage、reloadCollection。

模板动作:modelNames、modelNamesAndIds、findModelsById、findModelsByName、modelFieldNames、modelFieldDescriptions、modelFieldFonts、modelFieldsOnTemplates、createModel、modelTemplates、modelStyling、updateModelTemplates、updateModelStyling、findAndReplaceInModels、modelTemplateRename、modelTemplateReposition、modelTemplateAdd、modelTemplateRemove、modelFieldRename、modelFieldReposition、modelFieldAdd、modelFieldRemove、modelFieldSetFont、modelFieldSetFontSize、modelFieldSetDescription。

笔记动作:addNote、addNotes、canAddNotes、canAddNotesWithErrorDetail、updateNoteFields、updateNote、updateNoteModel、updateNoteTags、getNoteTags、addTags、removeTags、getTags、clearUnusedTags、replaceTags、replaceTagsInAllNotes、findNotes、notesInfo、notesModTime、deleteNotes、removeEmptyNotes。

统计动作:getNumCardsReviewedToday、getNumCardsReviewedByDay、getCollectionStatsHTML、cardReviews、getReviewsOfCards、getLatestReviewID、insertReviews。

注意事项与陷阱

在 macOS 上保持 Anki 处于前台,或禁用 App Nap,以防 AnkiConnect 暂停。更新笔记时,确保它未在浏览器编辑器中打开,否则更新可能不生效。importPackage 的路径相对于 Anki 的 collection.media 文件夹,而非客户端。deleteDecks 需要 cardsToo: true 才能连同牌组一起删除卡片。

资源

该技能不需要捆绑脚本或资产。