bestblogs-content-reviewer
BestBlogs 内容评分 Review 工作流。适用场景:(1) 每日内容 review, (2) 审核待评审文章,(3) 审核待评审推特,(4) 评估 AI 评分准确性,(5) 纠正内容评分,(6) 推荐重点阅读内容,(7) 内容质量审核,(8) 早晚 review, (9) 推荐今日阅读清单,(10) 从待审内容中筛选值得阅读的。触发短语:'review 内容', '内容审核', '评分 review', 'content review', '审核文章', '审核推特', '每日 review', 'daily review', '评分纠正', 'score review', '内容评审', '评分审核', 'review articles', 'review tweets', '开始 review', 'start review', '看看待审内容', '检查评分', '今天有什么要 review 的', '推荐阅读', '有什么值得读的', 'recommend reading', 'review 并推荐阅读', '今日推荐'
Author
Category
Content CreationInstall
Download and extract to your skills directory
Copy command and send to OpenClaw for auto-install:
BestBlogs 内容评分 Review (Content Score Reviewer)
每日早晚 review BestBlogs 系统中已评分但未 review 的文章和推特,评估 AI 评分是否准确,纠正偏差,并推荐值得深度阅读的内容,为 deep-reading 和 bestblogs-article-recommender 工作流提供输入。
评分标准基于统一评分规则(docs/scoring-rubric.md),Review 时参照其中的分段定义、来源优先级、原创性评估和交叉校准机制。完整 API 参数详情见 references/api_reference.md。
认证
所有请求使用 Admin API 认证:
| 变量 | 用途 |
|---|---|
BESTBLOGS_ADMIN_USER_ID | 管理员用户 ID |
BESTBLOGS_ADMIN_JWT_TOKEN | 管理员 JWT Token |
-H "Authorization: Bearer $BESTBLOGS_ADMIN_JWT_TOKEN"
-H "User-Id: $BESTBLOGS_ADMIN_USER_ID"
-H "Content-Type: application/json"若环境变量未设置,提示用户配置。
接口地址:https://api.bestblogs.dev
可用端点
| 端点 | 方法 | 类型 | 用途 |
|---|---|---|---|
/api/admin/article/list | POST | 读取 | 查询文章/推特列表(支持 qualifiedFilter 过滤) |
/api/admin/article/markNotQualified | POST | 写入 | 标记为非精选并调整评分 — 写操作,必须在用户明确确认后才能调用 |
工作流概览
- [ ] 阶段零(可选): 学习评分偏好 — 用户要求"学习偏好"或"分析评分规律"时执行
- [ ] 阶段一: 拉取待 review 内容(文章 + 推特并行)
- [ ] 阶段二: AI 评审与分类
- [ ] 阶段三: 输出 review 表格 ⚠️ 等待用户确认调整
- [ ] 阶段四: 批量执行标记 ⛔ BLOCKING — 写操作默认从阶段一开始执行。阶段零仅在用户明确要求时执行。
阶段零(可选): 学习评分偏好
用户要求"学习偏好"、"分析评分规律"、"看看精选标准"时执行。通过分析历史精选/非精选内容,建立评分偏好模型。
并行发起两个请求:
# 过去一个月的精选文章(学习"好内容"的特征)
curl -s -X POST https://api.bestblogs.dev/api/admin/article/list \
-H "Authorization: Bearer $BESTBLOGS_ADMIN_JWT_TOKEN" \
-H "User-Id: $BESTBLOGS_ADMIN_USER_ID" \
-H "Content-Type: application/json" \
-d '{"currentPage":1,"pageSize":100,"keyword":"","category":"","language":"","priority":"","sourceId":"","type":"ARTICLE","qualifiedFilter":"true","stickTopFilter":"ALL","timeFilter":"1m","startDate":"","endDate":"","mainDomainFilter":"ALL","aiSubCategoryFilter":"","flowStatusFilter":"","sort":null,"sortOrder":null,"userLanguage":"zh"}'
# 过去三天的非精选文章(学习"被淘汰"的特征)
curl -s -X POST https://api.bestblogs.dev/api/admin/article/list \
-H "Authorization: Bearer $BESTBLOGS_ADMIN_JWT_TOKEN" \
-H "User-Id: $BESTBLOGS_ADMIN_USER_ID" \
-H "Content-Type: application/json" \
-d '{"currentPage":1,"pageSize":100,"keyword":"","category":"","language":"","priority":"","sourceId":"","type":"ARTICLE","qualifiedFilter":"false","stickTopFilter":"ALL","timeFilter":"3d","startDate":"","endDate":"","mainDomainFilter":"ALL","aiSubCategoryFilter":"","flowStatusFilter":"","sort":null,"sortOrder":null,"userLanguage":"zh"}'分析维度:
输出偏好摘要给用户确认,例如:
📊 评分偏好分析:
- 精选文章分数范围: 85-98,中位数 90
- 非精选文章分数范围: 65-88,中位数 78
- AI 领域精选率较高,商业资讯精选率较低
- 偏好深度技术文章(>2000 字),短资讯类倾向非精选阶段一:拉取待 review 内容
并行发起两个请求(qualifiedFilter: "unknown" = 待 review):
# 待 review 文章
curl -s -X POST https://api.bestblogs.dev/api/admin/article/list \
-H "Authorization: Bearer $BESTBLOGS_ADMIN_JWT_TOKEN" \
-H "User-Id: $BESTBLOGS_ADMIN_USER_ID" \
-H "Content-Type: application/json" \
-d '{"currentPage":1,"pageSize":200,"keyword":"","category":"","language":"","priority":"","sourceId":"","type":"ARTICLE","qualifiedFilter":"unknown","stickTopFilter":"ALL","timeFilter":"1w","startDate":"","endDate":"","mainDomainFilter":"","aiSubCategoryFilter":"","flowStatusFilter":"","sort":null,"sortOrder":null,"userLanguage":"zh"}'
# 待 review 推特
curl -s -X POST https://api.bestblogs.dev/api/admin/article/list \
-H "Authorization: Bearer $BESTBLOGS_ADMIN_JWT_TOKEN" \
-H "User-Id: $BESTBLOGS_ADMIN_USER_ID" \
-H "Content-Type: application/json" \
-d '{"currentPage":1,"pageSize":200,"keyword":"","category":"","language":"","priority":"","sourceId":"","type":"TWITTER","qualifiedFilter":"unknown","stickTopFilter":"ALL","timeFilter":"1w","startDate":"","endDate":"","mainDomainFilter":"","aiSubCategoryFilter":"","flowStatusFilter":"","sort":null,"sortOrder":null,"userLanguage":"zh"}'数据预处理:
processFlowStatus == "CANCELLED" 的内容(已取消,跳过并计数)totalScore 从高到低排序totalScore 最高的前 200 条),超出部分下次 review阶段二:AI 评审与分类
读取用户画像(按需): 从 /Users/gino/Documents/Github/gino-bot/USER.md 获取用户关注领域和偏好,辅助判断"推荐阅读"的相关性。
基于内容元数据对每条内容进行评审分类。
评审维度
基于统一评分规则(docs/scoring-rubric.md)进行系统性检查:
- 天花板:LOW 来源上限 89,MEDIUM 上限 93,HIGH 可触及 95+
- 地板:HIGH 来源常规内容通常不低于 80 分(除非内容确实差)
- LOW 来源评分 90+ → 几乎必定偏高
- HIGH 来源评分 <80 → 可能偏低,需检查是否为重要行业事件被低估
- 95+(里程碑 <1%):是否为行业里程碑事件?
- 90-94(顶级 ~5%):是否同时具备深度 + 实用 + 创新?
- 85-89(优质推荐 ~15%):是否有明确的深度或实用性亮点?
- 80-84(合格展示 ~25%):信息完整但深度有限?
- 75-79(边缘 ~20%):基础信息传递?
- <75(低质量 ~35%):营销/错误/浅薄?
- 编译转述类(翻译、书评、课程笔记):上限 89,评分超过时下调
- 教程入门类(Hello World、"X 分钟学会"):应在 75-79 区间
- 营销导向类(产品推广、PR 软文):应在 <75 区间
- 低质聚合类(无筛选标准的链接堆砌):应在 70-76 区间
- 例外:优质策展(阮一峰周刊、HackerNews 精选等)不适用聚合减分
- 标题是否清晰、
description 是否有实质内容-
wordCount/readTime 是否与评分匹配(短文高分需警惕)-
sourceName 的历史质量和可信度-
publishDate 与当前时间的关系- 在其所属
mainDomain 中的价值- 极短推文(<50 字)不应超过 82 分,除非是官方首发里程碑
- 新闻转述类(非一手来源对已知事件的简单转述)上限 78,LOW 来源上限 75
- 同一事件的多条推文,仅官方首发可获高分,后续转述应递减
- 领域偏离(纯政治、纯金融预测)应大幅下调
- 推文评分应整体低于同主题文章 5-10 分
分类标准
| 分类 | 含义 | 后续动作 |
|---|---|---|
| 🌟 推荐阅读 | 高质量,值得深度阅读 | 不标记,进入 deep-reading 工作流 |
| ✅ 评分合理 | 分数准确,标记为非精选 | markNotQualified + adjustScore=0 |
| ⬆️ 评分偏低 | 内容好于分数,建议上调 | markNotQualified + adjustScore=正数 |
| ⬇️ 评分偏高 | 内容差于分数,建议下调 | markNotQualified + adjustScore=负数 |
分类指导原则:
评分调整幅度参考:
阶段三:输出 review 表格
分别输出文章和推特的 review 结果,按分类分组展示。
输出格式
## 📋 文章 Review(共 X 篇,跳过 Y 篇已取消)
### 🌟 推荐阅读(N 篇)
| # | 标题 | 来源 | 评分 | 建议调整 | 理由 |
|---|------|------|------|----------|------|
| 1 | [标题](https://admin.bestblogs.dev/article/review/RAW_xxx) | 来源名 | 89 | +3 | 深度好文,值得精读 |
### ⬇️ 评分偏高(N 篇)
| # | 标题 | 来源 | 评分 | 建议调整 | 理由 |
|---|------|------|------|----------|------|
| 1 | [标题](https://admin.bestblogs.dev/article/review/RAW_xxx) | 来源名 | 85 | -5 | 标题党,实际内容空洞 |
### ⬆️ 评分偏低(N 篇)
| # | 标题 | 来源 | 评分 | 建议调整 | 理由 |
|---|------|------|------|----------|------|
### ✅ 评分合理(N 篇)
| # | 标题 | 来源 | 评分 | 建议调整 | 理由 |
|---|------|------|------|----------|------|推特部分使用相同结构,标题列额外显示 @作者名。
## 📋 推特 Review(共 X 条,跳过 Y 条已取消)
(同上表格结构,标题格式:[@作者](https://admin.bestblogs.dev/article/review/RAW_xxx): 标题)## 📚 推荐阅读清单(共 N 篇文章 + M 条推特)
以下内容建议进入 deep-reading 工作流,按推荐优先级排序:
### 🔥 必读(N 篇)— 强烈推荐深度阅读
| # | 标题 | 来源 | 评分 | 领域 | 字数/时长 | 推荐理由 |
|---|------|------|------|------|-----------|----------|
| 1 | [标题](https://admin.bestblogs.dev/article/review/RAW_xxx) | 来源名 | 92 | AI | 5.2K 字 ~15min | 深度技术分析,提出独特框架... |
| 2 | [标题](https://admin.bestblogs.dev/article/review/RAW_xxx) | 来源名 | 89 | 编程 | 3.8K 字 ~10min | 实战经验总结,可直接应用... |
### ⭐ 推荐(N 篇)— 值得阅读
| # | 标题 | 来源 | 评分 | 领域 | 字数/时长 | 推荐理由 |
|---|------|------|------|------|-----------|----------|
| 1 | [标题](https://admin.bestblogs.dev/article/review/RAW_xxx) | 来源名 | 86 | 产品 | 2.1K 字 ~6min | 产品思维方法论,有借鉴价值... |
### 📌 可选(N 篇)— 时间充裕时阅读
| # | 标题 | 来源 | 评分 | 领域 | 字数/时长 | 推荐理由 |
|---|------|------|------|------|-----------|----------|
### 🐦 推荐推特(M 条)
| # | 作者 | 内容摘要 | 评分 | 互动 | 推荐理由 |
|---|------|----------|------|------|----------|
| 1 | [@作者](https://admin.bestblogs.dev/article/review/RAW_xxx) | 推文内容前 80 字... | 94 | 💬120 🔁85 | 行业洞察,引发深度讨论 |推荐阅读分层标准:
推荐理由要求: 每条理由 15-30 字,说明为什么值得读(独特视角/实用技巧/行业趋势/认知升级),不要泛泛而谈。
输出完整性规则
https://admin.bestblogs.dev/article/review/{id},包括 review 表格和推荐阅读清单。禁止使用原文 URL(如 mp.weixin.qq.com、x.com 等)作为链接地址authors 为 null/空时省略来源中的作者信息description 为 null/空时,理由中仅基于标题和元数据判断tags 为 null/空时不展示标签12.9K 字)📊 评分统计概览
Review 表格和推荐阅读清单之间,输出评分统计:
## 📊 评分统计
| 指标 | 文章 | 推特 |
|------|------|------|
| 待 review 总数 | X | Y |
| 已过滤(取消) | X | Y |
| 分数范围 | 65-98 | 70-96 |
| 平均分 | 82.3 | 79.5 |
| ≥90 分 | X 篇 | Y 条 |
| 80-89 分 | X 篇 | Y 条 |
| <80 分 | X 篇 | Y 条 |
**领域分布**: AI X 篇 | 编程 X 篇 | 商业 X 篇 | 产品 X 篇 | 其他 X 篇
**评分偏差发现**: ⬇️偏高 X 篇(占比 X%) | ⬆️偏低 X 篇(占比 X%)⚠️ 输出后等待用户确认。用户可能会:
阶段四:批量执行标记
⛔ 写操作 — 必须在用户明确确认后才能调用
用户确认后,对所有非"推荐阅读"的内容调用 markNotQualified 接口:
# 标记为非精选并调整分数(adjustScore 为相对值)
curl -s -X POST "https://api.bestblogs.dev/api/admin/article/markNotQualified?id=RAW_xxx&adjustScore=-3" \
-H "Authorization: Bearer $BESTBLOGS_ADMIN_JWT_TOKEN" \
-H "User-Id: $BESTBLOGS_ADMIN_USER_ID" \
-H "Content-Type: application/json"接口返回 data 字段为调整后的新分数(int)。
执行规则:
✅ [1/30] RAW_xxx — 标题 — adjustScore: -3 → 新分数: 82adjustScore 为 0 时也要调用(仅标记为已 review,不调整分数)推荐阅读项目处理:
markNotQualified,保持 qualified: null 状态执行完成后输出汇总:
📊 Review 完成:
- 文章: 已标记 X 篇(⬇️ N 篇, ⬆️ N 篇, ✅ N 篇),🌟 推荐阅读 N 篇待处理
- 推特: 已标记 X 条(⬇️ N 条, ⬆️ N 条, ✅ N 条),🌟 推荐阅读 N 条待处理
- 失败: N 个(列出失败项)错误处理
重要: 始终先检查 response.success 再处理 response.data。部分错误返回 HTTP 200 但 success: false — 不要仅依赖 HTTP 状态码。
| HTTP 状态 | 说明 | 处理 |
|---|---|---|
| 401/403 | Token 无效或过期 | 提示检查 BESTBLOGS_ADMIN_JWT_TOKEN 和 BESTBLOGS_ADMIN_USER_ID |
| 400 | 参数错误 | 检查请求参数格式 |
| 500 | 服务端错误 | 重试一次,仍失败告知用户 |
200 + success: false | 业务逻辑错误 | 展示 message 字段内容 |