feat: streamline dashboard, fix docs, optimize UI width
- Remove AI角色 quick action, keep only 回复日志/插件设置/刷新数据
- Fix LogsView filter/batch bar width to match content area (mx-4 mt-2 -> m-4 mb-0)
- Fix docs: Halo version 2.23->2.25, GitHub link nxxy335->sunny-335, Cravatar link, variable name {{conversation}}->{{conversation_history}}
- Add missing settings docs (maxConversationRounds, rateLimitPerMinute, enabledPresets)
- Update README: remove version display, update changelog
- Update version to 1.0.0-beta.2-r8k4n2
This commit is contained in:
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
基于 AI 的 Halo 博客评论自动回复插件,支持多 AI 角色、自审核、自动发布和对话式连续回复。
|
基于 AI 的 Halo 博客评论自动回复插件,支持多 AI 角色、自审核、自动发布和对话式连续回复。
|
||||||
|
|
||||||
> **当前版本**: v1.0.0-beta.2
|
|
||||||
|
|
||||||
## 功能特性
|
## 功能特性
|
||||||
|
|
||||||
- **多 AI 角色** — 支持创建多个 AI 角色,每个角色有独立的昵称、人格提示词和 Gravatar 头像,可为不同文章指定不同角色
|
- **多 AI 角色** — 支持创建多个 AI 角色,每个角色有独立的昵称、人格提示词和 Gravatar 头像,可为不同文章指定不同角色
|
||||||
@@ -17,14 +15,13 @@
|
|||||||
- **文章/页面级开关** — 在文章编辑器中直接控制是否启用 AI 回复,文章默认开启,页面默认关闭
|
- **文章/页面级开关** — 在文章编辑器中直接控制是否启用 AI 回复,文章默认开启,页面默认关闭
|
||||||
- **评论者黑名单** — 支持按名称、邮箱和正则表达式屏蔽指定评论者,可从评论列表选择
|
- **评论者黑名单** — 支持按名称、邮箱和正则表达式屏蔽指定评论者,可从评论列表选择
|
||||||
- **手动触发** — 在评论管理页面对历史评论手动触发 AI 回复
|
- **手动触发** — 在评论管理页面对历史评论手动触发 AI 回复
|
||||||
- **安全审核** — AI 生成的内容经过安全审核,不合规内容自动拒绝
|
- **两阶段安全审核** — 安全检查 + 质量评分(1-5 分映射到 0-100 分),不合规内容自动拒绝
|
||||||
- **Prompt 模板** — 支持自定义 Prompt 模板,提供多种模板变量(文章标题、发布日期、评论数等)
|
- **Prompt 模板** — 支持自定义 Prompt 模板,提供多种模板变量(文章标题、发布日期、评论数、对话历史等)
|
||||||
- **Prompt 预设** — 内置友好型、专业型、幽默型、简洁型预设风格,可多选组合
|
- **Prompt 预设** — 内置友好型、专业型、幽默型、简洁型预设风格,可多选组合
|
||||||
- **仪表盘统计** — 显示回复数、情感分布、每日回复趋势等图表,支持时间范围切换
|
|
||||||
- **插件健康检查** — 实时检测 AI Foundation 连接状态和模型可用性
|
- **插件健康检查** — 实时检测 AI Foundation 连接状态和模型可用性
|
||||||
- **日志筛选** — 按状态、情感筛选,关键词搜索
|
- **日志筛选** — 按状态、情感筛选,关键词搜索
|
||||||
- **数据清理** — 自动清理超过指定天数的旧记录
|
- **数据清理** — 自动清理超过指定天数的旧记录
|
||||||
- **AI Foundation 集成** — 必须安装 Halo AI Foundation 插件,使用其提供的 AI 模型能力
|
- **AI Foundation 集成** — 通过 Halo 官方推荐的 `ExtensionGetter` 获取 AI 服务,需安装 AI Foundation 插件
|
||||||
|
|
||||||
## 前置要求
|
## 前置要求
|
||||||
|
|
||||||
@@ -39,6 +36,10 @@
|
|||||||
4. 选择下载的 `.jar` 文件上传
|
4. 选择下载的 `.jar` 文件上传
|
||||||
5. 安装完成后启用插件
|
5. 安装完成后启用插件
|
||||||
|
|
||||||
|
::: tip
|
||||||
|
安装本插件后,应用市场会推荐安装 AI Foundation 插件(本插件的必要依赖)。
|
||||||
|
:::
|
||||||
|
|
||||||
## 从源码构建
|
## 从源码构建
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -81,24 +82,28 @@ pnpm dev
|
|||||||
- AI 调用改用 `GenerateTextRequest` 并设置 `maxRetries=2`,由 SDK 自动重试瞬时错误
|
- AI 调用改用 `GenerateTextRequest` 并设置 `maxRetries=2`,由 SDK 自动重试瞬时错误
|
||||||
- AI 对话续接时自动获取之前的回复历史并注入到 Prompt 中,AI 能更好地理解对话上下文
|
- AI 对话续接时自动获取之前的回复历史并注入到 Prompt 中,AI 能更好地理解对话上下文
|
||||||
- 优化 AI 自审核评分机制:改为两阶段评估(安全检查 + 质量评分 1-5 分),评分映射到 0-100 分,替代原先的二值评分
|
- 优化 AI 自审核评分机制:改为两阶段评估(安全检查 + 质量评分 1-5 分),评分映射到 0-100 分,替代原先的二值评分
|
||||||
- 精简仪表盘:移除情感分布、近7日回复趋势、平均审核评分三个卡片,界面更简洁
|
- 精简仪表盘:移除情感分布、近7日回复趋势、平均审核评分三个卡片,快捷操作精简为回复日志、插件设置、刷新数据
|
||||||
|
- 重做设置页面:基本设置、AI角色设置、模型设置、Prompt设置、数据清理各为独立页面,通过标签栏切换
|
||||||
- 优化设置页面布局:按钮统一排版并添加图标,侧边栏新增"未保存"状态指示器
|
- 优化设置页面布局:按钮统一排版并添加图标,侧边栏新增"未保存"状态指示器
|
||||||
- 优化日志页面评分显示:评分增加等级标签(优秀/良好/一般/较差)
|
- 优化日志页面:评分增加等级标签(优秀/良好/一般/较差),筛选下拉框修复文本与箭头重叠
|
||||||
|
- 优化 AI Foundation 状态提示宽度,与内容区宽度一致
|
||||||
|
- 优化插件文档:修复版本要求、变量名、链接等错误
|
||||||
|
|
||||||
**Bug 修复**
|
**Bug 修复**
|
||||||
|
|
||||||
- 修复 RateLimitService 清理线程在插件停止时未关闭导致线程泄漏
|
- 修复 RateLimitService 清理线程在插件停止时未关闭导致线程泄漏
|
||||||
- 修复内容审核提示词要求"重新生成"但代码未使用重新生成内容的问题
|
- 修复内容审核提示词要求"重新生成"但代码未使用重新生成内容的问题
|
||||||
|
- 修复设置页面按钮图标和文字未在同一行显示的问题
|
||||||
|
- 修复设置页面标签栏无法点击切换的问题
|
||||||
|
- 修复设置页面配置区域布局错误的问题
|
||||||
|
|
||||||
### v1.0.0-beta.1
|
### v1.0.0-beta.1
|
||||||
|
|
||||||
**新功能**
|
**新功能**
|
||||||
|
|
||||||
- AI Foundation 反射集成:通过运行时反射调用 AI Foundation 插件的 `AiModelService`,无需 `pluginDependencies`,彻底解决跨 ClassLoader 类加载问题
|
|
||||||
- 草稿模式:关闭"自动发布"后,AI 回复将保存为草稿,需站长审核后才发布
|
- 草稿模式:关闭"自动发布"后,AI 回复将保存为草稿,需站长审核后才发布
|
||||||
- 多 AI 角色支持:支持配置多个 AI 虚拟角色,每个角色有独立的提示词、头像和模型
|
- 多 AI 角色支持:支持配置多个 AI 虚拟角色,每个角色有独立的提示词、头像和模型
|
||||||
- 提示词预设:内置多种回复风格预设(专业型、幽默型、简洁型等),可自由组合
|
- 提示词预设:内置多种回复风格预设(专业型、幽默型、简洁型等),可自由组合
|
||||||
- 每日回复趋势图:首页新增每日回复数量柱状图,支持 7 天/30 天/全部切换
|
|
||||||
- 对话历史查看:支持查看 AI 回复的完整对话上下文
|
- 对话历史查看:支持查看 AI 回复的完整对话上下文
|
||||||
|
|
||||||
**Bug 修复**
|
**Bug 修复**
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group 'top.nxxy335.commentaiautopilot'
|
group 'top.nxxy335.commentaiautopilot'
|
||||||
version '1.0.0-beta.2-q9x3m7'
|
version '1.0.0-beta.2-r8k4n2'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
|||||||
+10
-4
@@ -11,17 +11,23 @@
|
|||||||
- **应用市场推荐**:新增 `store.halo.run/recommended-apps` 注解,安装本插件后可在应用市场推荐安装 AI Foundation 插件
|
- **应用市场推荐**:新增 `store.halo.run/recommended-apps` 注解,安装本插件后可在应用市场推荐安装 AI Foundation 插件
|
||||||
- **使用结构化输出**:情感分析和内容审核改用 AI Foundation 的 `OutputSpec.choice` 结构化输出,替换原先的字符串匹配解析,分类更可靠
|
- **使用结构化输出**:情感分析和内容审核改用 AI Foundation 的 `OutputSpec.choice` 结构化输出,替换原先的字符串匹配解析,分类更可靠
|
||||||
- **使用 GenerateTextRequest**:AI 调用改用 `GenerateTextRequest` 并设置 `maxRetries=2`,由 SDK 自动重试瞬时错误
|
- **使用 GenerateTextRequest**:AI 调用改用 `GenerateTextRequest` 并设置 `maxRetries=2`,由 SDK 自动重试瞬时错误
|
||||||
- **简化 languageModel 调用**:直接传递 modelName 参数,由 SDK 处理空值(使用默认模型),无需手动判断
|
|
||||||
- **多轮对话上下文**:AI 对话续接时自动获取之前的回复历史并注入到 Prompt 中,AI 能更好地理解对话上下文
|
- **多轮对话上下文**:AI 对话续接时自动获取之前的回复历史并注入到 Prompt 中,AI 能更好地理解对话上下文
|
||||||
- **优化 AI 自审核评分机制**:审核改为两阶段评估(安全检查 + 质量评分 1-5 分),评分映射到 0-100 分(0/30/50/70/85/100),替代原先的二值评分(0/100),评分更有区分度
|
- **优化 AI 自审核评分机制**:审核改为两阶段评估(安全检查 + 质量评分 1-5 分),评分映射到 0-100 分(0/30/50/70/85/100),替代原先的二值评分(0/100),评分更有区分度
|
||||||
- **精简仪表盘**:移除情感分布、近7日回复趋势、平均审核评分三个卡片,保留核心的回复概览和快捷操作,界面更简洁
|
- **精简仪表盘**:移除情感分布、近7日回复趋势、平均审核评分三个卡片,快捷操作精简为回复日志、插件设置、刷新数据
|
||||||
- **优化设置页面布局**:页面头部按钮使用 VSpace 统一排版并添加图标;侧边栏保存卡片高亮显示,新增"未保存"状态指示器;保存/重置按钮添加图标
|
- **重做设置页面**:基本设置、AI角色设置、模型设置、Prompt设置、数据清理各为独立页面,通过标签栏切换
|
||||||
- **优化日志页面评分显示**:评分增加等级标签(优秀/良好/一般/较差),更直观
|
- **优化设置页面布局**:按钮统一排版并添加图标,侧边栏保存卡片高亮显示,新增"未保存"状态指示器
|
||||||
|
- **优化日志页面**:评分增加等级标签(优秀/良好/一般/较差),筛选下拉框修复文本与箭头重叠
|
||||||
|
- **优化 AI Foundation 状态提示宽度**:状态提示与内容区宽度一致
|
||||||
|
- **优化插件文档**:修复版本要求(2.23→2.25)、变量名(`{{conversation}}`→`{{conversation_history}}`)、GitHub 链接(`nxxy335`→`sunny-335`)、Cravatar 链接(`cravatar.cn`→`cn.cravatar.com`)等错误,补充缺失的配置项文档
|
||||||
|
|
||||||
### Bug 修复
|
### Bug 修复
|
||||||
|
|
||||||
- **修复 RateLimitService 线程泄漏**:清理线程未在插件停止时关闭,实现 `DisposableBean` 正确释放资源
|
- **修复 RateLimitService 线程泄漏**:清理线程未在插件停止时关闭,实现 `DisposableBean` 正确释放资源
|
||||||
- **修复 ReviewService 提示词不匹配**:审核提示词要求"重新生成"但代码未使用重新生成的内容,移除误导性指令
|
- **修复 ReviewService 提示词不匹配**:审核提示词要求"重新生成"但代码未使用重新生成的内容,移除误导性指令
|
||||||
|
- **修复设置页面按钮图标文字对齐**:通过 `:deep(.btn-content)` 设置 inline-flex 布局,图标和文字并排显示
|
||||||
|
- **修复设置页面标签栏无法点击切换**:替换不工作的 VTabbar 组件为自定义按钮实现
|
||||||
|
- **修复设置页面配置区域布局错误**:将标签栏移出 grid 容器,避免挤占配置区域宽度
|
||||||
|
- **修复日志页面筛选下拉框文本与箭头重叠**:将 `px-3` 改为 `pl-3 pr-8` 为下拉箭头预留空间
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,8 @@
|
|||||||
|--------|------|--------|
|
|--------|------|--------|
|
||||||
| 自动回复 | 是否启用自动回复功能 | 开启 |
|
| 自动回复 | 是否启用自动回复功能 | 开启 |
|
||||||
| 自动发布 | AI回复是否自动发布,关闭则存为草稿 | 开启 |
|
| 自动发布 | AI回复是否自动发布,关闭则存为草稿 | 开启 |
|
||||||
|
| 最大对话轮次 | 同一评论线程中AI最多自动回复的轮次 | 8 |
|
||||||
|
| 速率限制 | 每分钟最大AI回复数量 | 10 |
|
||||||
| 最大重试次数 | AI生成失败时的最大重试次数 | 3 |
|
| 最大重试次数 | AI生成失败时的最大重试次数 | 3 |
|
||||||
|
|
||||||
## 重试机制
|
## 重试机制
|
||||||
|
|||||||
+1
-1
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
1. 确认在插件设置中填写了AI角色邮箱
|
1. 确认在插件设置中填写了AI角色邮箱
|
||||||
2. 邮箱需要在 [Gravatar](https://gravatar.com) 上注册并设置头像
|
2. 邮箱需要在 [Gravatar](https://gravatar.com) 上注册并设置头像
|
||||||
3. 插件使用 [Cravatar](https://cravatar.cn) 作为Gravatar镜像服务
|
3. 插件使用 [Cravatar](https://cn.cravatar.com) 作为Gravatar镜像服务
|
||||||
|
|
||||||
## 评论没有触发AI回复?
|
## 评论没有触发AI回复?
|
||||||
|
|
||||||
|
|||||||
+11
-3
@@ -32,9 +32,17 @@
|
|||||||
|
|
||||||
1. 进入插件设置页面
|
1. 进入插件设置页面
|
||||||
2. 在 **基本设置** 中找到 **评论者黑名单**
|
2. 在 **基本设置** 中找到 **评论者黑名单**
|
||||||
3. 输入评论者的显示名称或邮箱,多个用逗号分隔
|
3. 输入评论者的显示名称、邮箱或正则表达式,多个用逗号分隔
|
||||||
4. 保存设置
|
4. 保存设置
|
||||||
|
|
||||||
|
### 支持的格式
|
||||||
|
|
||||||
|
| 格式 | 示例 | 说明 |
|
||||||
|
|------|------|------|
|
||||||
|
| 名称 | `张三` | 匹配评论者的显示名称 |
|
||||||
|
| 邮箱 | `spam@example.com` | 匹配评论者邮箱(不区分大小写) |
|
||||||
|
| 正则表达式 | `regex:^spam.*` | 以 `regex:` 开头,按正则匹配 |
|
||||||
|
|
||||||
### 从评论列表选择
|
### 从评论列表选择
|
||||||
|
|
||||||
1. 在黑名单输入框旁点击 **添加评论者** 按钮
|
1. 在黑名单输入框旁点击 **添加评论者** 按钮
|
||||||
@@ -45,7 +53,7 @@
|
|||||||
### 示例
|
### 示例
|
||||||
|
|
||||||
```
|
```
|
||||||
张三,spam@example.com,李四
|
张三, spam@example.com, 李四, regex:^spam.*
|
||||||
```
|
```
|
||||||
|
|
||||||
黑名单中的评论者发布评论时,插件会同时匹配显示名称和邮箱地址(不区分大小写),匹配成功则跳过AI回复。
|
黑名单中的评论者发布评论时,插件会同时匹配显示名称和邮箱地址(不区分大小写),正则表达式则按模式匹配,匹配成功则跳过AI回复。
|
||||||
|
|||||||
@@ -2,24 +2,28 @@
|
|||||||
|
|
||||||
## 前置要求
|
## 前置要求
|
||||||
|
|
||||||
- Halo 2.23+
|
- Halo 2.25+
|
||||||
- AI Foundation 插件(必须) — 本插件依赖 AI Foundation 提供的AI模型能力,请先安装并配置 AI Foundation
|
- AI Foundation 插件(必须) — 本插件通过 `ExtensionGetter` 调用 AI Foundation 提供的 `AiModelService` 扩展点,请先安装并配置 AI Foundation
|
||||||
|
|
||||||
## 安装
|
## 安装
|
||||||
|
|
||||||
### 方式一:从 Release 下载
|
### 方式一:从 Release 下载
|
||||||
|
|
||||||
1. 前往 [GitHub Releases](https://github.com/nxxy335/plugin-comment-ai-autopilot/releases) 下载最新的 `.jar` 文件
|
1. 前往 [GitHub Releases](https://github.com/sunny-335/plugin-comment-ai-autopilot/releases) 下载最新的 `.jar` 文件
|
||||||
2. 登录 Halo 管理后台
|
2. 登录 Halo 管理后台
|
||||||
3. 进入 **插件** → **已安装** → 点击右上角 **安装** 按钮
|
3. 进入 **插件** → **已安装** → 点击右上角 **安装** 按钮
|
||||||
4. 选择下载的 `.jar` 文件上传
|
4. 选择下载的 `.jar` 文件上传
|
||||||
5. 安装完成后启用插件
|
5. 安装完成后启用插件
|
||||||
|
|
||||||
|
::: tip 推荐安装
|
||||||
|
安装本插件后,应用市场会推荐安装 AI Foundation 插件(本插件的必要依赖)。
|
||||||
|
:::
|
||||||
|
|
||||||
### 方式二:从源码构建
|
### 方式二:从源码构建
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 克隆仓库
|
# 克隆仓库
|
||||||
git clone https://github.com/nxxy335/plugin-comment-ai-autopilot.git
|
git clone https://github.com/sunny-335/plugin-comment-ai-autopilot.git
|
||||||
cd plugin-comment-ai-autopilot
|
cd plugin-comment-ai-autopilot
|
||||||
|
|
||||||
# 构建
|
# 构建
|
||||||
|
|||||||
@@ -5,20 +5,22 @@ AI回评(Comment AI Autopilot)是一个 Halo 博客系统的插件,能够
|
|||||||
## 核心功能
|
## 核心功能
|
||||||
|
|
||||||
- **自动回复** — 监听新评论,自动调用AI生成回复,支持多轮对话上下文
|
- **自动回复** — 监听新评论,自动调用AI生成回复,支持多轮对话上下文
|
||||||
|
- **多 AI 角色** — 支持创建多个 AI 角色,每个角色有独立的昵称、人格提示词和 Gravatar 头像,可为不同文章指定不同角色
|
||||||
- **多语言适配** — 根据评论语言自动用对应语言回复
|
- **多语言适配** — 根据评论语言自动用对应语言回复
|
||||||
- **情感分析** — 分析评论情感倾向(正面/中性/负面),根据情感调整回复语气
|
- **情感分析** — 分析评论情感倾向(正面/中性/负面),根据情感调整回复语气
|
||||||
- **草稿模式** — AI回复先存为草稿,管理员审核后再发布
|
- **草稿模式** — AI回复先存为草稿,管理员审核后再发布
|
||||||
- **失败重试** — AI生成失败时自动重试,指数退避策略
|
- **失败重试** — AI生成失败时自动重试,指数退避策略
|
||||||
- **批量操作** — 草稿模式下支持批量通过/拒绝/删除
|
- **批量操作** — 草稿模式下支持批量通过/拒绝/删除
|
||||||
- **文章/页面级开关** — 在文章编辑器中直接控制是否启用AI回复,文章默认开启,页面默认关闭
|
- **文章/页面级开关** — 在文章编辑器中直接控制是否启用AI回复,文章默认开启,页面默认关闭
|
||||||
- **评论者黑名单** — 屏蔽指定评论者,不触发AI回复
|
- **评论者黑名单** — 屏蔽指定评论者,不触发AI回复,支持名称、邮箱和正则表达式
|
||||||
- **手动触发** — 在评论管理页面对历史评论手动触发AI回复
|
- **手动触发** — 在评论管理页面对历史评论手动触发AI回复
|
||||||
- **AI角色** — 自定义AI回复者的昵称、人格提示词和Gravatar头像
|
- **安全审核** — AI生成的内容经过两阶段安全审核(安全检查 + 质量评分),不合规内容自动拒绝
|
||||||
- **安全审核** — AI生成的内容经过安全审核,不合规内容自动拒绝
|
- **Prompt 预设** — 内置友好型、专业型、幽默型、简洁型预设风格,可多选组合
|
||||||
- **仪表盘统计** — 显示回复数、情感分布、每日回复趋势等图表
|
- **对话轮次限制** — 同一评论线程中限制 AI 最多回复轮次,防止无限对话
|
||||||
|
- **速率限制** — 每分钟最大 AI 回复数量,防止批量评论消耗过多额度
|
||||||
- **日志筛选搜索** — 按状态、情感筛选,关键词搜索
|
- **日志筛选搜索** — 按状态、情感筛选,关键词搜索
|
||||||
- **数据清理** — 自动清理超过指定天数的旧记录
|
- **数据清理** — 自动清理超过指定天数的旧记录
|
||||||
- **AI Foundation 集成** — 必须安装 Halo AI Foundation 插件,使用其提供的AI模型能力
|
- **AI Foundation 集成** — 通过 Halo 官方推荐的 `ExtensionGetter` 获取 AI 服务,需安装 AI Foundation 插件
|
||||||
|
|
||||||
## 工作流程
|
## 工作流程
|
||||||
|
|
||||||
@@ -33,17 +35,17 @@ AI回评(Comment AI Autopilot)是一个 Halo 博客系统的插件,能够
|
|||||||
3. **情感分析** — 调用AI分析评论情感倾向
|
3. **情感分析** — 调用AI分析评论情感倾向
|
||||||
4. **构建Prompt** — 结合AI角色人格、情感提示、文章内容、评论上下文构建Prompt
|
4. **构建Prompt** — 结合AI角色人格、情感提示、文章内容、评论上下文构建Prompt
|
||||||
5. **AI生成** — 调用AI模型生成回复内容
|
5. **AI生成** — 调用AI模型生成回复内容
|
||||||
6. **安全审核** — 对生成内容进行安全审核
|
6. **安全审核** — 对生成内容进行两阶段审核(安全检查 + 质量评分 1-5 分映射到 0-100)
|
||||||
7. **发布/草稿** — 根据设置自动发布或存为草稿等待审核
|
7. **发布/草稿** — 根据设置自动发布或存为草稿等待审核
|
||||||
8. **重试** — 如果AI生成失败,系统会自动重试(最多 maxRetryCount 次),每次重试间隔递增
|
8. **重试** — 如果AI生成失败,系统会自动重试(最多 maxRetryCount 次),每次重试间隔递增
|
||||||
|
|
||||||
## 前置要求
|
## 前置要求
|
||||||
|
|
||||||
- Halo 2.23+
|
- Halo 2.25+
|
||||||
- AI Foundation 插件(必须) — 本插件依赖 AI Foundation 提供的AI模型能力
|
- AI Foundation 插件(必须) — 本插件通过 `ExtensionGetter` 调用 AI Foundation 提供的 `AiModelService` 扩展点
|
||||||
|
|
||||||
## 技术栈
|
## 技术栈
|
||||||
|
|
||||||
- **后端**:Java + Spring WebFlux + Reactive
|
- **后端**:Java + Spring WebFlux + Reactive
|
||||||
- **前端**:Vue 3 + @halo-dev/components
|
- **前端**:Vue 3 + @halo-dev/components
|
||||||
- **AI**:支持 AI Foundation 插件集成
|
- **AI**:通过 AI Foundation 插件集成
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ AI回复者的显示名称,默认为「小回」。修改后新回复将使用
|
|||||||
填写邮箱后,AI回复者的头像将通过 Gravatar 服务自动生成:
|
填写邮箱后,AI回复者的头像将通过 Gravatar 服务自动生成:
|
||||||
|
|
||||||
1. 插件根据邮箱生成 SHA-256 哈希
|
1. 插件根据邮箱生成 SHA-256 哈希
|
||||||
2. 构造 Gravatar URL:`https://cn.cravatar.com/avatar/{hash}`
|
2. 构造 Gravatar URL:`https://cn.cravatar.com/avatar/{hash}`(使用 [Cravatar](https://cn.cravatar.com) 镜像服务)
|
||||||
3. 头像URL存储在评论的 `owner.annotations["avatar"]` 中
|
3. 头像URL存储在评论的 `owner.annotations["avatar"]` 中
|
||||||
|
|
||||||
::: warning
|
::: warning
|
||||||
|
|||||||
+28
-24
@@ -9,6 +9,8 @@ Prompt模板控制AI生成回复时的完整提示词结构。
|
|||||||
|
|
||||||
{{safety_prompt}}
|
{{safety_prompt}}
|
||||||
|
|
||||||
|
【语言要求】请用评论所使用的语言回复。如果评论是英文,请用英文回复;如果是中文,请用中文回复;如果是日文,请用日文回复;以此类推。
|
||||||
|
|
||||||
请回复以下评论。注意:
|
请回复以下评论。注意:
|
||||||
- 回复长度应与评论长度匹配,简短问候简短回复
|
- 回复长度应与评论长度匹配,简短问候简短回复
|
||||||
- 不要复述或总结文章内容
|
- 不要复述或总结文章内容
|
||||||
@@ -21,6 +23,7 @@ Prompt模板控制AI生成回复时的完整提示词结构。
|
|||||||
文章(仅供理解上下文,不要复述):
|
文章(仅供理解上下文,不要复述):
|
||||||
{{article}}
|
{{article}}
|
||||||
|
|
||||||
|
{{conversation_history}}
|
||||||
评论:
|
评论:
|
||||||
{{comment}}
|
{{comment}}
|
||||||
```
|
```
|
||||||
@@ -29,23 +32,26 @@ Prompt模板控制AI生成回复时的完整提示词结构。
|
|||||||
|
|
||||||
| 变量 | 说明 | 注入时机 |
|
| 变量 | 说明 | 注入时机 |
|
||||||
|------|------|---------|
|
|------|------|---------|
|
||||||
| `{{persona_prompt}}` | AI角色人格提示词 | 始终注入 |
|
| `{{persona_prompt}}` | AI角色人格提示词(含已启用的预设) | 始终注入 |
|
||||||
| `{{safety_prompt}}` | 安全规范提示词 | 始终注入 |
|
| `{{safety_prompt}}` | 安全规范提示词 | 始终注入 |
|
||||||
| `{{sentiment_prompt}}` | 情感语气提示词 | 情感分析后自动注入,不在模板中显式使用 |
|
|
||||||
| `{{post_title}}` | 文章标题 | 始终注入 |
|
| `{{post_title}}` | 文章标题 | 始终注入 |
|
||||||
| `{{post_date}}` | 文章发布日期(如 2024-01-15) | 始终注入 |
|
| `{{post_date}}` | 文章发布日期(如 2024-01-15) | 始终注入 |
|
||||||
| `{{comment_count}}` | 该文章的评论数 | 始终注入 |
|
| `{{comment_count}}` | 该文章的评论数 | 始终注入 |
|
||||||
| `{{article}}` | 文章/页面内容(含标题) | 始终注入 |
|
| `{{article}}` | 文章/页面内容(含标题) | 始终注入 |
|
||||||
|
| `{{conversation_history}}` | 对话历史上下文 | 多轮对话时注入 |
|
||||||
| `{{comment}}` | 评论内容(含评论者名称) | 始终注入 |
|
| `{{comment}}` | 评论内容(含评论者名称) | 始终注入 |
|
||||||
| `{{conversation}}` | 对话上下文 | 多轮对话时注入 |
|
|
||||||
|
::: warning 变量名注意
|
||||||
|
对话上下文变量是 `{{conversation_history}}`(不是 `{{conversation}}`)。如果模板中使用了错误的变量名,该变量不会被替换。
|
||||||
|
:::
|
||||||
|
|
||||||
## 情感提示
|
## 情感提示
|
||||||
|
|
||||||
情感提示由插件根据情感分析结果自动注入到Prompt中,不需要在模板中手动添加:
|
情感提示由插件根据情感分析结果自动追加到 Prompt 末尾,不需要在模板中手动添加:
|
||||||
|
|
||||||
- **正面** → "评论者情绪积极友好,请用热情友好的语气回复,表达感谢和共鸣。"
|
- **正面** → 追加"评论者情绪正面积极,请用热情友好的语气回复,可以表达感谢和共鸣。"
|
||||||
- **负面** → "评论者情绪偏消极或不满,请用理性温和的语气回复,避免激化矛盾,适当表示理解。"
|
- **负面** → 追加"评论者情绪偏负面,请用理性温和的语气回复,避免激化矛盾,展现理解和包容。"
|
||||||
- **中性** → 不注入额外提示
|
- **中性** → 不追加额外提示
|
||||||
|
|
||||||
## 安全提示
|
## 安全提示
|
||||||
|
|
||||||
@@ -56,6 +62,17 @@ Prompt模板控制AI生成回复时的完整提示词结构。
|
|||||||
- 不生成虚假信息
|
- 不生成虚假信息
|
||||||
- 回复内容与评论相关
|
- 回复内容与评论相关
|
||||||
|
|
||||||
|
## 预设风格
|
||||||
|
|
||||||
|
在 Prompt 设置页面可以多选启用预设风格,启用后预设提示词会自动合并到 `{{persona_prompt}}` 之后:
|
||||||
|
|
||||||
|
| 预设 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| 友好型 | 热情友好,多用感叹号和表情符号,口语化表达 |
|
||||||
|
| 专业型 | 专业严谨,正式语言风格,有逻辑性 |
|
||||||
|
| 幽默型 | 适当加入幽默元素,轻松诙谐但不过度 |
|
||||||
|
| 简洁型 | 非常简洁,一两句话即可,不展开讨论 |
|
||||||
|
|
||||||
## 自定义建议
|
## 自定义建议
|
||||||
|
|
||||||
自定义Prompt模板时,建议:
|
自定义Prompt模板时,建议:
|
||||||
@@ -63,20 +80,7 @@ Prompt模板控制AI生成回复时的完整提示词结构。
|
|||||||
1. 保留 `{{persona_prompt}}` 和 `{{safety_prompt}}` 变量
|
1. 保留 `{{persona_prompt}}` 和 `{{safety_prompt}}` 变量
|
||||||
2. 保留 `{{article}}` 和 `{{comment}}` 变量
|
2. 保留 `{{article}}` 和 `{{comment}}` 变量
|
||||||
3. 利用 `{{post_title}}`、`{{post_date}}`、`{{comment_count}}` 提供更丰富的上下文
|
3. 利用 `{{post_title}}`、`{{post_date}}`、`{{comment_count}}` 提供更丰富的上下文
|
||||||
4. 在变量之间添加清晰的分隔和指令
|
4. 保留 `{{conversation_history}}` 以支持多轮对话上下文
|
||||||
5. 避免让AI复述文章内容
|
5. 在变量之间添加清晰的分隔和指令
|
||||||
6. 控制回复长度和风格
|
6. 避免让AI复述文章内容
|
||||||
|
7. 控制回复长度和风格
|
||||||
## 变量使用示例
|
|
||||||
|
|
||||||
### 根据评论数调整回复风格
|
|
||||||
|
|
||||||
```
|
|
||||||
{{comment_count}}条评论说明这篇文章{{#if comment_count > 10}}很受欢迎{{/if}}。
|
|
||||||
```
|
|
||||||
|
|
||||||
### 利用发布日期
|
|
||||||
|
|
||||||
```
|
|
||||||
这篇文章发布于{{post_date}},回复时请考虑时效性。
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -13,9 +13,9 @@
|
|||||||
## 工作原理
|
## 工作原理
|
||||||
|
|
||||||
1. 评论通过过滤检查后,调用AI对评论内容进行情感分析
|
1. 评论通过过滤检查后,调用AI对评论内容进行情感分析
|
||||||
2. AI返回情感分类结果(POSITIVE / NEUTRAL / NEGATIVE)
|
2. AI 使用结构化输出(`OutputSpec.choice`)返回情感分类结果(POSITIVE / NEUTRAL / NEGATIVE)
|
||||||
3. 如果情感分析失败(如AI不可用),默认降级为 NEUTRAL
|
3. 如果情感分析失败(如AI不可用),默认降级为 NEUTRAL
|
||||||
4. 情感结果传入 PromptBuilder,在生成Prompt时注入对应的语气提示
|
4. 情感结果传入 PromptBuilder,在生成Prompt时追加对应的语气提示
|
||||||
5. 情感结果同时记录在 `AiCommentReply` 的 `sentiment` 字段中
|
5. 情感结果同时记录在 `AiCommentReply` 的 `sentiment` 字段中
|
||||||
|
|
||||||
## 日志展示
|
## 日志展示
|
||||||
|
|||||||
+60
-15
@@ -1,30 +1,50 @@
|
|||||||
# 插件设置
|
# 插件设置
|
||||||
|
|
||||||
插件设置页面位于 **AI回评** → **插件设置**,包含以下配置组:
|
插件设置页面位于 **AI回评** → **插件设置**,通过标签栏切换以下五个配置页面:
|
||||||
|
|
||||||
|
- 基本设置
|
||||||
|
- AI角色设置
|
||||||
|
- 模型设置
|
||||||
|
- Prompt设置
|
||||||
|
- 数据清理
|
||||||
|
|
||||||
## 基本设置
|
## 基本设置
|
||||||
|
|
||||||
| 配置项 | 说明 | 默认值 |
|
| 配置项 | 说明 | 默认值 |
|
||||||
|--------|------|--------|
|
|--------|------|--------|
|
||||||
| 自动回复 | 是否启用自动回复功能 | 开启 |
|
| 自动回复 | 是否启用自动回复功能 | 开启 |
|
||||||
| 自动发布 | AI回复是否自动发布 | 开启 |
|
| 自动发布 | AI回复是否自动发布,关闭则存为草稿 | 开启 |
|
||||||
|
| 最大对话轮次 | 同一评论线程中AI最多自动回复的轮次 | 8 |
|
||||||
|
| 速率限制 | 每分钟最大AI回复数量,防止批量评论消耗过多额度 | 10 |
|
||||||
| 最大重试次数 | AI生成失败时的最大重试次数 | 3 |
|
| 最大重试次数 | AI生成失败时的最大重试次数 | 3 |
|
||||||
| 评论者黑名单 | 不触发AI回复的评论者显示名称或邮箱,逗号分隔 | 空 |
|
| 评论者黑名单 | 不触发AI回复的评论者,支持名称、邮箱和正则表达式(`regex:` 开头),逗号分隔 | 空 |
|
||||||
|
|
||||||
|
::: tip 评论者黑名单
|
||||||
|
黑名单支持三种格式:
|
||||||
|
- **名称**:如 `张三`
|
||||||
|
- **邮箱**:如 `spam@example.com`(不区分大小写)
|
||||||
|
- **正则表达式**:以 `regex:` 开头,如 `regex:^spam.*`
|
||||||
|
|
||||||
|
点击"添加评论者"按钮可从已有评论列表中选择评论者自动添加到黑名单。
|
||||||
|
:::
|
||||||
|
|
||||||
## AI角色设置
|
## AI角色设置
|
||||||
|
|
||||||
|
AI角色定义了回复评论的虚拟身份。支持创建多个角色,每个角色有独立的昵称、人格提示词和 Gravatar 头像,可指定一个为默认角色。
|
||||||
|
|
||||||
| 配置项 | 说明 | 默认值 |
|
| 配置项 | 说明 | 默认值 |
|
||||||
|--------|------|--------|
|
|--------|------|--------|
|
||||||
| AI角色昵称 | AI回复者的显示名称 | 小回 |
|
| 角色昵称 | AI回复者的显示名称 | 小回 |
|
||||||
| AI角色人格提示词 | 定义AI角色的人格和回复风格 | 见下方 |
|
| 人格提示词 | 定义AI角色的人格和回复风格 | 见下方 |
|
||||||
| AI角色邮箱 | 用于Gravatar头像服务展示头像 | 空 |
|
| 邮箱 | 用于 Gravatar 头像服务展示头像 | 空 |
|
||||||
|
| 设为默认 | 将该角色设为默认角色 | 第一个角色默认 |
|
||||||
|
|
||||||
默认人格提示词:
|
默认人格提示词:
|
||||||
|
|
||||||
> 你是「小回」,一个友善的评论者。你的回复简洁自然,像朋友聊天一样。简短的评论就简短回复,有深度的讨论才展开回应。不要长篇大论,不要复述文章内容。
|
> 你是「小回」,一个友善的评论者。你的回复简洁自然,像朋友聊天一样。简短的评论就简短回复,有深度的讨论才展开回应。不要长篇大论,不要复述文章内容。
|
||||||
|
|
||||||
::: tip Gravatar头像
|
::: tip Gravatar头像
|
||||||
填写邮箱后,AI回复者的头像将通过 [Gravatar](https://gravatar.com) 服务自动生成。如果不填写邮箱,将使用默认头像。
|
填写邮箱后,AI回复者的头像将通过 [Gravatar](https://gravatar.com) 服务自动生成,使用 [Cravatar](https://cn.cravatar.com) 镜像。如果不填写邮箱,将使用默认头像。
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## 模型设置
|
## 模型设置
|
||||||
@@ -42,17 +62,38 @@
|
|||||||
| 配置项 | 说明 | 默认值 |
|
| 配置项 | 说明 | 默认值 |
|
||||||
|--------|------|--------|
|
|--------|------|--------|
|
||||||
| 自定义Prompt模板 | AI生成回复时使用的Prompt模板 | 见下方 |
|
| 自定义Prompt模板 | AI生成回复时使用的Prompt模板 | 见下方 |
|
||||||
|
| 启用预设 | 选择要启用的Prompt预设风格(可多选) | 空 |
|
||||||
|
|
||||||
|
### 预设风格
|
||||||
|
|
||||||
|
| 预设 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| 友好型 | 热情友好,多用感叹号和表情符号,口语化表达 |
|
||||||
|
| 专业型 | 专业严谨,正式语言风格,有逻辑性 |
|
||||||
|
| 幽默型 | 适当加入幽默元素,轻松诙谐但不过度 |
|
||||||
|
| 简洁型 | 非常简洁,一两句话即可,不展开讨论 |
|
||||||
|
|
||||||
|
预设提示词会自动合并到角色人格提示词之后。
|
||||||
|
|
||||||
### 模板变量
|
### 模板变量
|
||||||
|
|
||||||
| 变量 | 说明 |
|
| 变量 | 说明 | 注入时机 |
|
||||||
|------|------|
|
|------|------|---------|
|
||||||
| `{{persona_prompt}}` | AI角色人格提示词 |
|
| `{{persona_prompt}}` | AI角色人格提示词(含已启用的预设) | 始终注入 |
|
||||||
| `{{safety_prompt}}` | 安全规范提示词 |
|
| `{{safety_prompt}}` | 安全规范提示词 | 始终注入 |
|
||||||
| `{{sentiment_prompt}}` | 情感语气提示词(自动注入) |
|
| `{{post_title}}` | 文章标题 | 始终注入 |
|
||||||
| `{{article}}` | 文章内容 |
|
| `{{post_date}}` | 文章发布日期(如 2024-01-15) | 始终注入 |
|
||||||
| `{{comment}}` | 评论内容 |
|
| `{{comment_count}}` | 该文章的评论数 | 始终注入 |
|
||||||
| `{{conversation}}` | 对话上下文(多轮对话时) |
|
| `{{article}}` | 文章/页面内容(含标题) | 始终注入 |
|
||||||
|
| `{{conversation_history}}` | 对话历史上下文 | 多轮对话时注入 |
|
||||||
|
| `{{comment}}` | 评论内容(含评论者名称) | 始终注入 |
|
||||||
|
|
||||||
|
::: tip 情感提示
|
||||||
|
情感提示由插件根据情感分析结果自动追加到 Prompt 末尾,不需要在模板中手动添加:
|
||||||
|
- **正面** → 追加热情友好的语气提示
|
||||||
|
- **负面** → 追加理性温和的语气提示
|
||||||
|
- **中性** → 不追加额外提示
|
||||||
|
:::
|
||||||
|
|
||||||
## 数据清理
|
## 数据清理
|
||||||
|
|
||||||
@@ -64,3 +105,7 @@
|
|||||||
::: tip
|
::: tip
|
||||||
你也可以在数据清理页面点击"立即清理"按钮手动触发清理操作。
|
你也可以在数据清理页面点击"立即清理"按钮手动触发清理操作。
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
::: warning
|
||||||
|
清理操作仅删除 `AiCommentReply` 记录(插件内部的日志记录),不会删除已发布的 Halo Reply 评论。
|
||||||
|
:::
|
||||||
|
|||||||
@@ -30,4 +30,4 @@ spec:
|
|||||||
url: "https://github.com/sunny-335/plugin-comment-ai-autopilot/blob/main/LICENSE"
|
url: "https://github.com/sunny-335/plugin-comment-ai-autopilot/blob/main/LICENSE"
|
||||||
settingName: "comment-ai-autopilot-settings"
|
settingName: "comment-ai-autopilot-settings"
|
||||||
configMapName: "comment-ai-autopilot-configmap"
|
configMapName: "comment-ai-autopilot-configmap"
|
||||||
version: "1.0.0-beta.2-q9x3m7"
|
version: "1.0.0-beta.2-r8k4n2"
|
||||||
|
|||||||
@@ -112,7 +112,7 @@
|
|||||||
<div class="mt-4">
|
<div class="mt-4">
|
||||||
<VCard :body-class="['!p-5']">
|
<VCard :body-class="['!p-5']">
|
||||||
<h3 class="text-sm font-medium text-gray-500 mb-3">快捷操作</h3>
|
<h3 class="text-sm font-medium text-gray-500 mb-3">快捷操作</h3>
|
||||||
<div class="grid grid-cols-2 gap-2 sm:grid-cols-4">
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-3">
|
||||||
<button
|
<button
|
||||||
class="flex items-center gap-2 px-3 py-2.5 rounded-md bg-gray-50 hover:bg-gray-100 transition-colors text-sm text-gray-700"
|
class="flex items-center gap-2 px-3 py-2.5 rounded-md bg-gray-50 hover:bg-gray-100 transition-colors text-sm text-gray-700"
|
||||||
@click="$router.push({ name: 'CommentAiAutopilotLogs' })"
|
@click="$router.push({ name: 'CommentAiAutopilotLogs' })"
|
||||||
@@ -132,15 +132,6 @@
|
|||||||
</svg>
|
</svg>
|
||||||
插件设置
|
插件设置
|
||||||
</button>
|
</button>
|
||||||
<button
|
|
||||||
class="flex items-center gap-2 px-3 py-2.5 rounded-md bg-gray-50 hover:bg-gray-100 transition-colors text-sm text-gray-700"
|
|
||||||
@click="$router.push({ name: 'CommentAiAutopilotSettings' })"
|
|
||||||
>
|
|
||||||
<svg class="w-4 h-4 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" />
|
|
||||||
</svg>
|
|
||||||
AI角色
|
|
||||||
</button>
|
|
||||||
<button
|
<button
|
||||||
class="flex items-center gap-2 px-3 py-2.5 rounded-md bg-gray-50 hover:bg-gray-100 transition-colors text-sm text-gray-700"
|
class="flex items-center gap-2 px-3 py-2.5 rounded-md bg-gray-50 hover:bg-gray-100 transition-colors text-sm text-gray-700"
|
||||||
@click="refreshData"
|
@click="refreshData"
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
</VPageHeader>
|
</VPageHeader>
|
||||||
|
|
||||||
<!-- Batch Operation Toolbar -->
|
<!-- Batch Operation Toolbar -->
|
||||||
<div v-if="selectedNames.size > 0" class="mx-4 mt-2 flex items-center gap-3 bg-blue-50 border border-blue-200 rounded-lg px-4 py-2.5">
|
<div v-if="selectedNames.size > 0" class="m-4 mb-0 flex items-center gap-3 bg-blue-50 border border-blue-200 rounded-lg px-4 py-2.5">
|
||||||
<span class="text-sm text-blue-700">已选择 {{ selectedNames.size }} 项</span>
|
<span class="text-sm text-blue-700">已选择 {{ selectedNames.size }} 项</span>
|
||||||
<button
|
<button
|
||||||
class="text-xs px-3 py-1 rounded bg-green-600 text-white hover:bg-green-700 transition-colors"
|
class="text-xs px-3 py-1 rounded bg-green-600 text-white hover:bg-green-700 transition-colors"
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Filter Bar -->
|
<!-- Filter Bar -->
|
||||||
<div class="mx-4 mt-2 flex items-center gap-3">
|
<div class="m-4 mb-0 flex items-center gap-3">
|
||||||
<select
|
<select
|
||||||
v-model="filterStatus"
|
v-model="filterStatus"
|
||||||
class="rounded-md border border-gray-300 pl-3 pr-8 py-1.5 text-sm focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500"
|
class="rounded-md border border-gray-300 pl-3 pr-8 py-1.5 text-sm focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500"
|
||||||
|
|||||||
Reference in New Issue
Block a user