feat: 评论前置过滤(合规检测)与 AI Foundation 隔离加载 (v1.1.0)

This commit is contained in:
sunny-335
2026-06-23 19:54:55 +08:00
parent 1a2732fe19
commit e5f973c13d
23 changed files with 742 additions and 139 deletions
+82
View File
@@ -1,5 +1,87 @@
# 更新日志
## v1.1.0
> 2026-06-23
### 新增
- **评论前置过滤(合规检测)** — AI 回复前对评论进行合规性分类,识别广告/辱骂攻击/敏感内容/无意义内容,违规评论停止生成 AI 回复,节省 Token
- **违规评论自动设为待审核** — 检测到违规评论时自动将原评论 `approved` 置为 `false`,进入待审核队列,前端不再展示该评论
- **FILTERED 日志状态** — 被拦截的评论生成"已拦截"状态记录,日志页支持按"已拦截"状态筛选
- **拦截原因分类标签** — 日志页显示拦截分类标签(广告/辱骂攻击/敏感内容/无意义)和详细拦截原因(含评论内容摘要)
- **安全优先策略** — AI 分类服务不可用或异常时,默认拦截评论而非放行,防止违规内容漏网
### 改进
- **AI Foundation 隔离加载** — 将 AI Foundation API 引用隔离到 `AiFoundationDelegate` 类,`AiFoundationClient` 不再直接引用 AI Foundation 类,修复未安装 AI Foundation 时插件无法启动的问题(`NoClassDefFoundError`
- **评论内容 HTML 剥离** — 前置过滤检测前自动剥离评论 HTML 标签,提升 AI 分类准确性
- **对话场景精准处罚** — AI 对话场景下违规内容来自 Reply 时,仅取消通过该 Reply 而非父级 Comment,避免误伤
- **升级配置自动迁移** — 从 v1.0.x 升级时自动将 `preFilterEnabled``false` 迁移为 `true`(新默认值)
### Bug 修复
- **修复未安装 AI Foundation 时插件无法启动** — `BeanDefinitionStoreException: Failed to parse AiFoundationClient`,将 AI Foundation API 引用隔离到委托类
- **修复前置过滤默认关闭** — `preFilterEnabled` 默认值从 `false` 改为 `true`,新安装和升级用户均默认启用
- **修复 `penalize()` 遗漏 `approved=null`** — Halo 评论创建时 `approved` 可能为 `null`,原代码仅处理 `approved=true` 的情况
- **修复 `classify()` 失败时放行违规评论** — `defaultIfEmpty``onErrorResume` 改为拦截而非放行
- **修复 Windows 构建失败** — Gradle Worker Daemon 执行 pnpm 退出码 268435659,改用系统 pnpm Exec 任务并禁用 Daemon
---
## v1.0.4
> 2026-06-19
### 改进
- **对话弹窗头像显示** — 对话弹窗中每条消息显示 Gravatar 头像,基于评论者或 AI 角色的邮箱自动匹配
- **对话引用摘要** — 对话弹窗中回复消息显示引用摘要框,标明引用了谁的什么内容,支持截断显示
- **UI 全面重构** — LogsView 和 SettingsView 改用纯 Scoped CSS,移除所有 Tailwind 类和自定义 CSS 依赖,避免 Halo 主题冲突
- **标签去 Emoji 化** — 状态、情感标签改用纯色背景标签,去除所有 Emoji
- **移动端适配优化** — 全面优化移动端响应式布局,解决排版错位问题
- **AI角色设置完善** — 支持 CRUD、Gravatar 头像预览、性别/唤醒词/默认角色配置
- **配置导入导出** — 支持将插件配置(ConfigMap + AI角色)导出为 JSON 文件,方便备份和迁移
- **评论者黑名单弹窗选择** — 设置页面可从已有评论列表中选择评论者添加到黑名单
### Bug 修复
- **修复对话弹窗引用溯源** — 后端 `getConversation` 重写,构建 Reply 映射字典正确溯源引用关系
- **修复 ConversationMessage 数据结构** — 新增 `quoteOwner`/`quoteContent` 字段支持引用摘要展示
- **修复 AI 角色邮箱提取** — 后端新增 `extractOwnerEmail` 方法,正确从 CommentOwner 提取邮箱用于头像生成
---
## v1.0.3
### 改进
- **SettingsView 完整功能版** — 5个设置面板(基本设置、AI角色、模型设置、Prompt、数据清理)全部实现
- **AI角色管理** — 支持 CRUD、Gravatar 头像、性别/唤醒词/默认角色配置
- **数据清理** — 自动清理开关、保留天数滑块、手动清理
- **导入导出** — JSON 配置导入导出
- **评论者黑名单弹窗选择** — 从已有评论列表中选择评论者
---
## v1.0.2
### 改进
- **LogsView & SettingsView 样式重构** — 移除所有 Tailwind 类,改用 `<style scoped>` 原生 CSS
- **标签配色、气泡样式、引用框** — 全部使用纯 CSS 实现,避免 Halo 主题冲突
---
## v1.0.1
### 改进
- **版本号升级** — 强制刷新 Halo 前端缓存
- **历史数据兼容** — LogsView 增加历史 Markdown 引用文本清理正则,防止旧版测试数据套娃显示
---
## v1.0.0
> 2026-06-18
+12
View File
@@ -22,6 +22,18 @@
- 草稿记录显示 **审核通过****拒绝** 按钮
- 已发布的记录显示正常状态
- 被拒绝的记录显示 REJECTED 标签
- 失败的记录显示 FAIL 标签,并显示重试次数
- 每条记录可点击 **查看对话** 查看完整对话上下文
## 对话上下文查看
点击日志记录的 **查看对话** 按钮,弹出对话上下文窗口:
- 以气泡形式展示完整对话(评论 + 所有回复)
- AI 回复和用户回复以不同颜色气泡区分
- 每条消息显示发送者头像(通过 Gravatar 服务生成)
- 回复消息显示引用摘要框,标明该回复引用了哪条消息
- 支持移动端响应式布局
## 批量操作
+31
View File
@@ -23,6 +23,7 @@
3. **已有AI回复记录** — 同一评论不会重复触发
4. **历史评论** — 插件启动前的评论不会自动触发,可使用手动触发
5. **AI生成失败** — 检查AI模型配置和日志
6. **被前置过滤拦截** — 若启用"前置过滤",违规评论会被拦截,可在日志页通过"已拦截"状态筛选查看
## 如何对历史评论触发AI回复?
@@ -66,3 +67,33 @@
## 黑名单支持邮箱吗?
支持。黑名单同时匹配评论者的显示名称和邮箱地址,不区分大小写。你也可以在设置页面点击"添加评论者"按钮从评论列表中选择。
## 对话窗口中的头像是怎么来的?
对话窗口中每条消息的头像通过 [Gravatar](https://gravatar.com) 服务生成(使用 [Cravatar](https://cn.cravatar.com) 镜像)。头像基于评论者或 AI 角色的邮箱自动匹配。如果未设置邮箱,则显示默认图标。
## 对话窗口中的引用框是什么?
当一条回复是针对另一条回复的(即层级回复),对话窗口会在该消息气泡内显示一个引用摘要框,标明该回复引用了谁的什么内容。引用内容会截断显示(最多35个字符),方便快速了解对话脉络。
## 如何备份和迁移插件配置?
在插件设置页面顶部点击 **导出** 按钮,将当前配置导出为 JSON 文件。在目标实例中点击 **导入** 按钮选择该文件即可恢复配置。导入会覆盖当前配置,请谨慎操作。
## AI Foundation 显示"部分功能不可用"怎么办?
这通常表示 AI Foundation 插件未正确配置模型。请检查:
1. AI Foundation 插件已安装并启用
2. 在 AI Foundation 中配置了至少一个 AI 模型
3. 如果回评插件未指定模型名称,将使用 AI Foundation 的默认模型
## 前置过滤会误伤正常评论吗?
前置过滤默认启用。AI 会对评论进行分类判断,若 AI 服务不可用或分类失败,为安全起见会拦截评论而非放行。如果你发现正常评论被误拦截,可以在设置中关闭"启用前置过滤"开关。被拦截的评论会在日志页生成一条"已拦截"状态的记录,可查看具体分类标签和拦截原因。
## 被前置过滤拦截的评论会怎样?
1. **停止生成 AI 回复** — 不会消耗后续 Token
2. **创建拦截记录** — 在日志页显示为"已拦截"状态,标注分类标签(如"辱骂攻击")和详细原因(含评论内容摘要)
3. **自动设为待审核** — 原评论的 `approved` 会被置为 `false`,前端不再展示该评论,需人工判断后审核通过
+11 -7
View File
@@ -15,19 +15,22 @@ AI回评(Comment AI Autopilot)是一个 Halo 博客系统的插件,能够
- **批量操作** — 草稿模式下支持批量通过/拒绝/删除
- **文章/页面级开关** — 在文章编辑器中直接控制是否启用AI回复,文章默认开启,页面默认关闭
- **评论者黑名单** — 屏蔽指定评论者,不触发AI回复,支持名称、邮箱和正则表达式
- **前置过滤(合规检测)** — AI回复前对评论进行合规性分类,自动拦截广告/辱骂/敏感/无意义内容,节省Token;可选将违规评论设为待审核状态
- **手动触发** — 在评论管理页面对历史评论手动触发AI回复
- **安全审核** — AI生成的内容经过两阶段安全审核(安全检查 + 质量评分),不合规内容自动拒绝
- **Prompt 预设** — 内置友好型、专业型、幽默型、简洁型预设风格,可多选组合
- **对话轮次限制** — 同一评论线程中限制 AI 最多回复轮次,防止无限对话
- **速率限制** — 每分钟最大 AI 回复数量,防止批量评论消耗过多额度
- **日志筛选搜索** — 按状态、情感筛选,关键词搜索
- **对话上下文查看** — 在日志页面查看完整对话上下文,支持引用摘要展示和 Gravatar 头像显示
- **数据清理** — 自动清理超过指定天数的旧记录
- **配置导入导出** — 支持将插件配置导出为 JSON 文件,方便备份和迁移
- **AI Foundation 集成** — 通过 Halo 官方推荐的 `ExtensionGetter` 获取 AI 服务,需安装 AI Foundation 插件
## 工作流程
```
新评论 → 唤醒词检查 → 过滤检查 → 情感分析 → 构建Prompt → AI生成 → 安全审核 → 发布/草稿
新评论 → 唤醒词检查 → 过滤检查 → 前置过滤(合规检测) → 情感分析 → 构建Prompt → AI生成 → 安全审核 → 发布/草稿
↓ (失败)
重试 → ... → 最终失败
```
@@ -35,12 +38,13 @@ AI回评(Comment AI Autopilot)是一个 Halo 博客系统的插件,能够
1. **新评论到达** — Reconciler 监听到新评论创建事件
2. **唤醒词检查** — 检查评论是否以某个角色的唤醒词开头,匹配则唤醒对应角色
3. **过滤检查** — 检查文章/页面是否启用AI回复、评论者是否在黑名单中(唤醒词触发时绕过页面级启用检查)
4. **情感分析** — 调用AI分析评论情感倾向
5. **构建Prompt** — 结合AI角色人格、情感提示、文章内容、评论上下文构建Prompt
6. **AI生成** — 调用AI模型生成回复内容
7. **安全审核**对生成内容进行两阶段审核(安全检查 + 质量评分 1-5 分映射到 0-100)
8. **发布/草稿**根据设置自动发布或存为草稿等待审核
9. **重试**如果AI生成失败,系统会自动重试(最多 maxRetryCount 次),每次重试间隔递增
4. **前置过滤(合规检测)** — 若启用,AI 对评论内容进行合规性分类(正常/广告/辱骂攻击/敏感内容/无意义)。违规评论将停止后续流程,可选自动设为待审核状态
5. **情感分析** — 调用AI分析评论情感倾向
6. **构建Prompt** — 结合AI角色人格、情感提示、文章内容、评论上下文构建Prompt
7. **AI生成**调用AI模型生成回复内容
8. **安全审核**对生成内容进行两阶段审核(安全检查 + 质量评分 1-5 分映射到 0-100)
9. **发布/草稿**根据设置自动发布或存为草稿等待审核
10. **重试** — 如果AI生成失败,系统会自动重试(最多 maxRetryCount 次),每次重试间隔递增
## 前置要求
+12
View File
@@ -37,3 +37,15 @@ POST /apis/console.api.comment-ai-autopilot.nxxy335.top/v1alpha1/replies/{replyN
```
对指定回复触发对话式AI回复。
### 更新草稿回复内容
```
PUT /apis/console.api.comment-ai-autopilot.nxxy335.top/v1alpha1/replies/{name}/content
```
更新草稿状态的AI回复内容。请求体为 JSON 格式:`{"reply": "新的回复内容"}`。仅未发布的草稿回复可编辑。
::: warning
已发布的回复不可编辑。
:::
+2
View File
@@ -49,8 +49,10 @@ Prompt模板控制AI生成回复时的完整提示词结构。
情感提示由插件根据情感分析结果自动追加到 Prompt 末尾,不需要在模板中手动添加:
- **非常正面** → 追加"评论者情绪非常正面积极,请用热情洋溢的语气回复,表达真诚的感谢和共鸣。"
- **正面** → 追加"评论者情绪正面积极,请用热情友好的语气回复,可以表达感谢和共鸣。"
- **负面** → 追加"评论者情绪偏负面,请用理性温和的语气回复,避免激化矛盾,展现理解和包容。"
- **非常负面** → 追加"评论者情绪非常负面,请用非常温和、理性的语气回复,避免任何可能激化矛盾的表达,展现充分的理解和耐心。"
- **中性** → 不追加额外提示
## 安全提示
+6 -6
View File
@@ -22,13 +22,13 @@
## 日志展示
在AI回复日志页面,每条记录会显示情感标签:
在AI回复日志页面,每条记录会显示情感标签(纯色背景标签)
- 🟢 **非常正面** — 深绿色标签
- 🟩 **正面** — 浅绿色标签
- **中性** — 灰色标签
- 🟥 **负面** — 浅红色标签
- 🔴 **非常负面** — 深红色标签
- **非常正面** — 深绿色标签
- **正面** — 浅绿色标签
- **中性** — 灰色标签
- **负面** — 浅红色标签
- **非常负面** — 深红色标签
## 性能影响
+42
View File
@@ -8,6 +8,8 @@
- Prompt设置
- 数据清理
页面右侧为操作控制侧边栏,显示保存按钮和未保存状态指示器。在 Prompt 设置页面,侧边栏还会显示可用模板变量列表。
## 基本设置
| 配置项 | 说明 | 默认值 |
@@ -18,6 +20,8 @@
| 速率限制 | 每分钟最大AI回复数量,防止批量评论消耗过多额度 | 10 |
| 最大重试次数 | AI生成失败时的最大重试次数 | 3 |
| 评论者黑名单 | 不触发AI回复的评论者,支持名称、邮箱和正则表达式(`regex:` 开头),逗号分隔 | 空 |
| 启用前置过滤 | AI回复前检测评论合规性,拦截广告/辱骂/敏感内容,节省Token | 开启 |
| 违规评论设为待审核 | 检测到违规评论时自动取消通过,需人工审核 | 开启 |
::: tip 评论者黑名单
黑名单支持三种格式:
@@ -28,6 +32,26 @@
点击"添加评论者"按钮可从已有评论列表中选择评论者自动添加到黑名单。
:::
::: tip 前置过滤(合规检测)
启用前置过滤后,AI 在生成回复前会先对评论内容进行合规性分类,识别以下类别:
- **正常**:放行,继续走 AI 回复流程
- **广告**:包含推广链接、产品推销、引流信息等
- **辱骂攻击**:包含辱骂、人身攻击、恶意挑衅、歧视性言论等
- **敏感内容**:涉及政治敏感、违法违规、色情暴力等
- **无意义**:纯乱码、无意义字符堆砌、与文章完全无关的废话
对于非"正常"类别的评论,插件会:
1. **停止生成 AI 回复**,节省 Token 与 API 调用
2. 创建一条 `FILTERED` 状态的日志记录(可在日志页通过"已拦截"状态筛选查看)
3. 若启用"违规评论设为待审核",会自动将原评论的 `approved` 置为 `false`,使其进入待审核队列,需人工判断后审核通过
::: warning
前置过滤依赖 AI Foundation 插件进行分类判断,会额外消耗少量 Token。若 AI 服务不可用或分类失败,为安全起见将拦截评论而非放行,防止违规内容漏网。
:::
:::
## AI角色设置
AI角色定义了回复评论的虚拟身份。支持创建多个角色,每个角色有独立的昵称、人格提示词、性别、语气风格和 Gravatar 头像,可指定一个为默认角色。
@@ -113,3 +137,21 @@ AI角色定义了回复评论的虚拟身份。支持创建多个角色,每个
::: warning
清理操作仅删除 `AiCommentReply` 记录(插件内部的日志记录),不会删除已发布的 Halo Reply 评论。
:::
## 配置导入导出
插件设置页面顶部提供导入导出按钮,方便备份和迁移配置。
### 导出配置
点击 **导出** 按钮,将当前配置(包括 ConfigMap 数据和所有 AI 角色)导出为 JSON 文件。
### 导入配置
1. 点击 **导入** 按钮,选择 JSON 配置文件
2. 确认导入操作(导入会覆盖当前配置,不可撤销)
3. 导入完成后自动刷新设置和角色列表
::: warning
导入操作会覆盖当前配置,请谨慎操作。建议在导入前先导出当前配置作为备份。
:::
+7 -5
View File
@@ -16,14 +16,16 @@ hero:
features:
- title: 自动回复
details: 监听新评论,自动调用AI生成回复,支持对话式上下文和失败重试
- title: 语言适配
details: 根据评论语言自动用对应语言回复,中文评论中文回复,英文评论英文回复
- title: AI 角色
details: 创建多个虚拟角色,独立昵称、人格、性别、语气和 Gravatar 头像
- title: 情感分析
details: 分析评论情感倾向,根据正面/中性/负面调整回复语气
- title: 前置过滤
details: AI回复前检测评论合规性,拦截广告/辱骂/敏感内容,节省Token
- title: 草稿模式
details: AI回复先存为草稿,管理员审核后再发布,支持批量操作
- title: 灵活过滤
details: 文章/页面级开关控制,评论者黑名单支持名称和邮箱匹配
- title: 对话上下文
details: 查看完整对话上下文,支持引用摘要展示和头像显示
- title: 数据管理
details: 仪表盘统计、日志筛选搜索、自动清理旧记录
details: 仪表盘统计、日志筛选搜索、自动清理旧记录、配置导入导出
---