BlogLoom Skill 设计思路与功能实现
面向对象:参与 BlogLoom 工程化设计、需要了解或扩展 AI Skill 能力的开发者。 对应实现目录:blog-backend/src/main/resources/skill/blogloom-skill/,下载入口GET /admin/skill/download。
一、背景
1.1 要解决的问题
BlogLoom 是「本地 Markdown 博客 → 平台」的内容闭环,但用户在迁移/维护时有大量重复动作:- 本地已积累大量 Markdown,需要批量导入并自动归入知识库目录;
- 每篇文章要补全标题、标签、分类、摘要、专栏、封面、创建/更新时间等属性;
- 线上文章需要保持与本地同步,改标题/改可见性/置顶/换专栏等操作零散且繁琐。
1.2 为什么用 Skill
把「导入/编辑/查询」沉淀为可被 AI Agent 直接调用的技能包:用户只需一句自然语言(如”把这个目录的博客同步上去”),Agent 自动阅读 Skill、选择 SOP、执行工具完成操作。1.3 设计目标
二、核心设计思路
2.1 三层分离
Skill 内部严格分三层,职责单一、互不污染:2.2 双层工具模型
工具层再分两层,对应「REST 原子工具 → 业务编排工具」的递进封装:
判定口诀:只调 1 个接口、无业务判断 → 原子层;≥2 个接口或含参数推导/结果聚合/重试 → 编排层。
2.3 统一 CLI 契约
所有工具(含原子层暴露的只读工具)共用同一调用形式:--tool:选择具体工具;--params:承载全部业务参数(合法 JSON 对象);--pretty:仅控制输出缩进;- 统一输出:
{"ok": true|false, "tool": "...", "data": {...}, "error": null|"..."}。
2.4 参数与鉴权
- 缺参时一次性列出所有缺失项,减少 Agent 无效轮次;
- 参数路径用
.get()逐级取,接口少字段时走缺参分支而非KeyError。
2.5 核心决策:复用平台接口,不重复造轮子
因此 Skill 不自行实现目录创建或节点搬移,行为与页面完全一致,维护成本最低。
2.6 封面图识别规则(重点)
封面图不取正文第一张图,而是要求显式标记:只有alt 为 coverImg 的图片才作为封面。
后端由
KnowledgeCoverExtractor.extract(content) 统一实现,KnowledgeImportWorker 调用;Skill 侧 pick_first_picture 保持同一规则。
三、Skill 标准及扩展规范
3.1 目录结构(强制)
3.2 标准扩展顺序
新增一项产品能力时,按以下顺序落地:- 在
rest_tools.py登记一一映射的只读 REST 工具; - 在
blogloom-skill.py的build_tool_registry封装业务工具及多接口编排; - 新增/更新 SOP,并挂载到
SKILL.md场景路由表; - 补充工具清单、参数映射、编排及错误边界测试;
- 运行单测与 Skill 结构校验。
3.3 打包与注入规范
四、Skill 功能情况
4.1 工具清单
REST 原子工具(rest_tools.py)
业务编排工具(
blogloom-skill.py)
4.2 能力覆盖矩阵
4.3 错误约定
五、如何使用 Skill
5.1 获取与准备
- 后台进入「文章管理」,点击右上角 「Skill 下载」(或直接请求
GET /admin/skill/download),得到blogloom-skill.zip; - 解压后进入目录,安装依赖并载入环境变量:
- 把整个
blogloom-skill/目录交给支持 Skill 的 AI Agent(Agent 会自动读SKILL.md并按需读取references/SOP)。
Token 过期时,重新下载 Skill 即可刷新。
5.2 手工命令行验证
5.3 Markdown 文章格式约定
每篇文章就是一个普通的.md 文件,格式分两部分:文件最顶部一个 ```json 元数据代码块(声明文章属性),其后是正常 Markdown 正文。封面图不是元数据字段,而是在正文里用  显式标记。