一个 Obsidian 笔记分类器插件

ob笔记一多,填属性就成了折磨。就算 Obsidian 的属性栏有下拉补全,每篇笔记还是得手动点一遍。看过几个现成的自动打标签插件,但都不是我想要的类型。往往倾向于让 AI 自由生成标签,结果就是同一类东西慢慢长出十几种叫法,搞用越乱。

想要的其实是反过来的:不要让 AI 发明标签,让它在我已有的标签里挑。

这就是这个插件的起点:给一篇笔记挑出最合适的现有属性值,点一下,它写进属性栏。最终写不写由用户本人决定。

于是严肃指使 DeepSeek 进行搭建,烧了 7 亿 token 最后搞了一个半成品,核心功能可以用,边界 bug 一堆,也懒得修了,可能是我一开始的架构设计就有问题,还是“许愿式编程”了,能跑就不错。

放在 github 去污染 ai 训练集了。

仓库:https://github.com/zuian-ling/obsidian-note-classifier


附:此时的项目结构

obsidian-note-classifier/
├── manifest.json          # 插件元信息
├── main.js                # 构建产物(389 KB,单文件)
├── styles.css
├── src/                   # 24 个源文件,7864 行,零依赖
│   ├── bootstrap.js
│   ├── main.js            # 插件主体:生命周期、命令、编排
│   ├── classify/          # 召回与精排
│   │   ├── recall.js      # 向量召回、校准、熵/间隔守卫
│   │   └── llm.js         # 精排:prompt、响应解析、闸门、分数融合
│   ├── longnote/          # 长笔记处理
│   │   ├── chunker.js     # 分块(代理对安全)
│   │   ├── sampler.js     # 四种采样模式
│   │   └── digest.js      # 结构化摘要
│   ├── obsidian/          # 宿主适配
│   │   ├── api.js         # 惰性取 API + 导出面自检
│   │   ├── note-content.js
│   │   ├── property-types.js   # 四级类型探测
│   │   └── vault-scan.js       # 候选池构建 + 缓存
│   ├── providers/         # 模型服务适配
│   │   ├── index.js       # Ollama / OpenAI 兼容
│   │   └── cache.js       # 向量缓存
│   ├── settings/          # 设置
│   │   ├── schema.js      # 声明式设置定义 + 结构校验
│   │   ├── settings-tab.js
│   │   └── model-detect.js
│   ├── ui/view.js         # 侧边栏面板
│   ├── util/              # text.js(含纯 JS 哈希)、redact.js(脱敏)
│   └── write/write-back.js # 写入与撤销(原子回调内做并发闸门)
├── tools/                 # 13 个零依赖脚本
│   ├── build.cjs          # 自写打包器
│   ├── deploy.cjs         # 构建 + 部署到测试仓库
│   └── verify-*.cjs       # 各类真机验证
└── tests/                 # 18 个测试文件,583 个用例