Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@
- 新任务若需要跨进程通信,请复用 `StackExchange.Redis` 连接(Garnet)实现分布式锁或队列。

## AI 与工具集成
- LLM 通道由 `Service/AI/LLM/*` 管理;`McpToolHelper.EnsureInitialized` 会扫描 `[McpTool]` 标记的方法生成工具 XML。
- 新增工具需放在同一程序集,配合 `[McpParameter]` 描述参数;`GeneralBootstrap` 启动时会自动注册并缓存 Prompt 片段。
- LLM 通道由 `Service/AI/LLM/*` 管理;`McpToolHelper.EnsureInitialized` 会扫描 `[BuiltInTool]` 标记的方法生成工具 XML。
- 新增工具需放在同一程序集,配合 `[BuiltInParameter]` 描述参数;`GeneralBootstrap` 启动时会自动注册并缓存 Prompt 片段。
- OCR/ASR/QR 相关控制器依赖独立进程服务(参见 `AppBootstrap/OCRBootstrap.cs` 等),调试时可单独以 `dotnet run --project TelegramSearchBot -- OCR` 启动。

## 构建与测试
Expand Down
96 changes: 92 additions & 4 deletions Docs/Bot_Commands_User_Guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,27 @@
* **说明与分页**:
* 机器人会以消息形式返回搜索结果列表,每条结果通常包含消息内容的预览和指向原始消息的链接。
* 如果结果数量较多,消息底部会附带内联键盘按钮,如“下一页”和“删除历史”。
* **“下一页”按钮**: 点击后,机器人会显示下一页的搜索结果。这个功能由 `SearchNextPageController` 处理,它会从一个临时的缓存(LiteDB中的`CacheData`表)中读取之前的搜索条件和当前分页状态(通过按钮回调数据中的唯一ID关联),然后获取并展示新的结果页,同时更新分页按钮。`Service/BotAPI/SendService.cs` 负责生成包含这些按钮的回复消息,并将下一次分页所需的状态(如更新后的跳过条目数)存入缓存。
* **“下一页”按钮**: 点击后,机器人会显示下一页的搜索结果。这个功能由 `SearchNextPageController` 处理,它会从一个临时的缓存(SQLite中的`SearchPageCaches`表)中读取之前的搜索条件和当前分页状态(通过按钮回调数据中的唯一ID关联),然后获取并展示新的结果页,同时更新分页按钮。`Service/BotAPI/SendService.cs` 负责生成包含这些按钮的回复消息,并将下一次分页所需的状态(如更新后的跳过条目数)存入缓存。
* **“删除历史”按钮**: 点击后,通常会删除之前的搜索结果消息,以保持聊天界面的整洁。

2. **解析链接 (手动)**
2. **向量搜索 (语义搜索)**
* **指令格式**: `向量搜索 <问题描述>`
* **功能**: 基于对话段的语义理解进行搜索,使用 FAISS 向量数据库。
* **示例**: `向量搜索 如何配置环境变量`
* **说明**: 与传统关键词搜索不同,向量搜索能理解问题的语义,找到相关内容。

3. **语法搜索 (高级搜索)**
* **指令格式**: `语法搜索 <查询>`
* **功能**: 支持 Lucene 查询语法的高级搜索。
* **示例**: `语法搜索 title:测试 AND content:重要`

4. **解析链接 (手动)**
* **指令**: `/resolveurls`
* **功能**: 当用户明确使用此命令时,解析提供的文本(或回复的消息中的文本)中包含的短链接或重定向链接,并显示其最终的目标长链接。
* **用法1 (直接提供文本)**: `/resolveurls <包含一个或多个链接的文本>`
* **示例**: `/resolveurls 这是b23.tv/xxxx的一个短链接,还有t.cn/AAAA的另一个。`
* **用法2 (回复消息)**: 回复一条包含链接的消息,并发送指令 `/resolveurls`。
* **说明**: 机器人会回复解析后的链接列表。此命令主要用于即时查看链接的解析结果。链接的自动后台处理和存储是另一项功能(见下文自动URL解析与存储)。
* **说明**: 机器人会回复解析后的链接列表。此命令主要用于即时查看链接的解析结果。链接的自动后台处理和存储是另一项功能(见下文"自动URL解析与存储")。

## 二、管理员指令

Expand Down Expand Up @@ -50,6 +61,50 @@
* **功能**: 取消当前群组的“管理群”状态。
* **用法**: 在目标群组中发送 `取消管理群`。

* **群组黑名单管理** (仅全局管理员,私聊中发送)
* **指令**: `查黑名单`
* **功能**: 查看当前被封禁的群组列表。
* **指令**: `封群 <群组ID>`
* **功能**: 封禁指定群组,机器人会自动退出该群组。
* **指令**: `解封群 <群组ID>`
* **功能**: 解除对指定群组的封禁。

* **定时任务管理** (仅管理员)
* **说明**: 以下命令用于管理后台定时任务。
* **指令**: `/scheduler status`
* **功能**: 查看所有定时任务的状态和最近执行情况。
* **指令**: `/scheduler run`
* **功能**: 手动触发执行所有定时任务。
* **指令**: `/scheduler run <任务名>`
* **功能**: 手动触发执行指定的定时任务。
* **示例**: `/scheduler run SearchPageCacheCleanup`
* **指令**: `/scheduler history`
* **功能**: 查看最近的定时任务执行历史。

* **LLM Agent 管理** (仅管理员)
* **说明**: 当 `EnableLLMAgentProcess=true` 时,LLM对话运行在独立进程。以下命令用于监控和管理Agent。
* **指令**: `/agent list`
* **功能**: 列出当前所有活跃的 LLM Agent 会话。
* **指令**: `/agent stats`
* **功能**: 显示 Agent 系统统计信息(活跃数量、队列长度等)。
* **指令**: `/agent kill <chatId>`
* **功能**: 强制终止指定 ChatId 的 Agent 会话。
* **示例**: `/agent kill -1001234567890`

* **系统更新** (仅全局管理员)
* **指令**: `/checkupdate` 或 `/检查更新`
* **功能**: 检查是否有可用的新版本。
* **指令**: `/update` 或 `/更新`
* **功能**: 执行系统更新(如果存在新版本)。

* **测试定时任务** (仅全局管理员)
* **指令**: `/testdailytask` 或 `测试定时任务`
* **功能**: 手动触发执行所有定时任务(结果可在日志中查看)。

* **交互式模型选择** (仅管理员)
* **指令**: `选择模型`
* **功能**: 交互式选择当前群组使用的 LLM 模型。会列出所有可用模型供选择。

* **Bilibili 相关配置** (可在任意聊天中发送,但仅全局管理员可执行)
* **设置B站Cookie**:
* **指令格式**: `/setbilicookie <Cookie字符串>` 或 `设置B站Cookie <Cookie字符串>`
Expand Down Expand Up @@ -216,6 +271,39 @@
* **功能**: 从预设路径 (`/tmp/export.json`) 的 JSON 文件中导入用户和消息数据到数据库。 (注意:此功能依赖特定文件路径和格式)
* **指令**: `迁移数据`
* **功能**: 将数据从 LiteDB 迁移到 SQLite 数据库。 (注意:此为特定场景下的数据迁移指令)
* **指令**: `扫描音频文件`
* **功能**: 扫描本地音频目录,为未处理的音频文件执行 ASR 识别。
* **指令**: `扫描图片文件`
* **功能**: 扫描本地图片目录,为未处理的图片执行 OCR 和二维码识别。
* **指令**: `扫描视频文件`
* **功能**: 扫描本地视频目录,为未处理的视频文件执行 ASR 识别。
* **指令**: `清理向量数据`
* **功能**: 清理所有 FAISS 向量数据和对话段数据。
* **指令**: `重新向量化`
* **功能**: 重新生成分割对话段并生成向量。
* **指令**: `重建向量索引`
* **功能**: 清空并重建完整的向量索引(先清理后重新向量化)。
* **指令**: `重建群组向量索引:<群组ID>`
* **功能**: 为指定群组重建向量索引。
* **示例**: `重建群组向量索引:-1001234567890`

* **账本功能** (需 `EnableAccounting=true`,在群组中使用)
* **说明**: 账本功能用于群组内的收支记录管理。
* **指令**: `/创建账本 名称 [描述]` 或 `创建账本 名称 [描述]`
* **功能**: 创建一个新账本。
* **指令**: `/账本列表` 或 `账本列表`
* **功能**: 列出当前群组的所有账本。
* **指令**: `/激活账本 名称` 或 `激活账本 名称`
* **功能**: 激活指定账本,后续记账操作将使用该账本。
* **指令**: `/记录` 或 `记录`
* **功能**: 查看当前激活账本的记账记录。
* **指令**: `/统计` 或 `统计`
* **功能**: 显示当前激活账本的统计信息。
* **指令**: `/统计图表` 或 `统计图表`
* **功能**: 生成并发送支出分类统计图表。
* **指令**: `/记账帮助` 或 `记账帮助`
* **功能**: 显示账本功能的使用帮助。
* **快捷记账**: 直接发送金额和标签即可快速记账,格式: `<金额> <标签> [备注]`

## 三、自动功能与内容触发器

Expand Down Expand Up @@ -267,6 +355,6 @@
* 管理员指令通常需要在与机器人私聊或在机器人具有管理权限的群组中,由授权的管理员ID发送。
* 具体可用模型名称 (`设置模型` 指令) 取决于机器人管理员的配置。
* **LLM工具调用迭代限制**: 通过 `MaxToolCycles` 配置(默认25),防止LLM无限调用工具导致死循环。当达到限制时,会保存对话快照供用户选择继续或停止。
* **文件工具**: 管理员可使用内置文件工具(`ReadFile`, `WriteFile`, `EditFile`, `SearchText`, `ListFiles`)进行文件操作,这些工具仅管理员可用。
* **文件工具**: 管理员可使用内置文件工具(`ReadFile`, `WriteFile`, `SearchText`, `ListFiles`)进行文件操作,这些工具仅管理员可用。

希望这份指南能帮助您更好地使用 TelegramSearchBot!
32 changes: 3 additions & 29 deletions Docs/README_FaissVectorSearch.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

## 概述

为了解决Qdrant向量数据库的连接问题和服务依赖复杂性,我们重新实现了基于 **SQLite + FAISS.NET** 的向量搜索系统。这个方案提供了
基于 **SQLite + FAISS.NET** 的向量搜索系统,提供

- ✅ **零额外服务依赖** - 不需要Qdrant或其他向量数据库
- ✅ **零额外服务依赖** - 不需要外部向量数据库
- ✅ **高性能搜索** - FAISS是Facebook开发的高效向量相似性搜索库
- ✅ **简化部署** - 所有数据存储在SQLite,索引文件存储在本地
- ✅ **可靠性提升** - 避免网络连接问题和服务管理复杂性
Expand Down Expand Up @@ -171,20 +171,6 @@ FAISS向量数据库状态报告
- **文件压缩**:FAISS内置压缩算法
- **定期清理**:自动清理孤立和无效数据

## 迁移说明

### 从Qdrant迁移

1. **保留现有数据**:ConversationSegment表中的数据不变
2. **重新向量化**:使用 `/faiss重建` 命令重新生成FAISS索引
3. **更新配置**:不再需要Qdrant相关配置

### 兼容性

- ✅ **向后兼容**:现有的对话段数据完全保留
- ✅ **API兼容**:SearchOption和搜索命令不变
- ✅ **结果一致**:搜索结果格式和质量保持一致

## 故障排除

### 常见问题
Expand Down Expand Up @@ -218,18 +204,6 @@ FAISS向量数据库状态报告
- `FAISS索引训练完成`
- `向量化失败` - 需要关注的错误

## 优势对比

| 特性 | Qdrant方案 | FAISS方案 |
|------|-----------|-----------|
| **部署复杂度** | ❌ 需要额外服务 | ✅ 零依赖 |
| **连接稳定性** | ⚠️ 网络连接问题 | ✅ 本地文件 |
| **性能** | ✅ 很好 | ✅ 优秀 |
| **扩展性** | ✅ 支持集群 | ⚠️ 单机限制 |
| **维护成本** | ❌ 高 | ✅ 低 |
| **存储效率** | ✅ 优化 | ✅ 本地优化 |
| **故障恢复** | ⚠️ 服务依赖 | ✅ 文件备份 |

## 技术细节

### FAISS索引算法选择
Expand All @@ -253,4 +227,4 @@ FAISS向量数据库状态报告

3. **索引存储**:FAISS索引文件 + SQLite元数据

这个方案解决了Qdrant的连接问题,提供了更可靠和简单的向量搜索体验
本方案提供可靠和简单的向量搜索体验
33 changes: 20 additions & 13 deletions Docs/README_MCP.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ MCP (Model Context Protocol) 是一种让LLM与外部工具和服务交互的协
▼ ▼
┌─────────┐ ┌─────────────────┐
│ 内置工具 │ │ 外部MCP服务器 │
│ (24+) │ │ (可动态添加) │
│ (30+) │ │ (可动态添加) │
└─────────┘ └─────────────────┘
```

Expand All @@ -37,9 +37,8 @@ TelegramSearchBot 内置了以下工具,通过 `BuiltInToolAttribute` 标记
|---------|------|------|
| `ReadFile` | 读取文件内容,支持指定行范围 | `path`, `start_line?`, `end_line?` |
| `WriteFile` | 写入内容到文件,文件不存在则创建 | `path`, `content` |
| `EditFile` | 编辑文件,替换指定文本 | `path`, `old_text`, `new_text` |
| `SearchText` | 使用正则表达式搜索文件 | `path`, `pattern`, `file_pattern?` |
| `ListFiles` | 列出目录下的文件和子目录 | `path`, `pattern?` |
| `SearchText` | 使用正则表达式搜索文件 | `pattern`, `path?`, `file_glob?`, `ignore_case?` |
| `ListFiles` | 列出目录下的文件和子目录 | `path?`, `pattern?` |

### 2.2 Telegram 发送工具

Expand All @@ -49,6 +48,7 @@ TelegramSearchBot 内置了以下工具,通过 `BuiltInToolAttribute` 标记
| `send_photo_file` | 发送图片(使用文件路径) | `file_path`, `caption?`, `reply_to_message_id?` |
| `send_video_file` | 发送视频(使用文件路径) | `file_path`, `caption?`, `reply_to_message_id?` |
| `send_document_file` | 发送文件(使用文件路径) | `file_path`, `caption?`, `reply_to_message_id?` |
| `send_message` | 发送文本消息 | `chat_id`, `text` |

**文件大小限制**:
- 本地 Bot API(内置或外部): 最大 2GB
Expand All @@ -58,36 +58,43 @@ TelegramSearchBot 内置了以下工具,通过 `BuiltInToolAttribute` 标记

| 工具名称 | 描述 | 参数 |
|---------|------|------|
| `search_messages` | 在当前聊天的索引消息中搜索关键词 | `query`, `chat_id?`, `limit?`, `offset?` |
| `query_messages` | 在消息历史数据库中查询,支持多种过滤条件 | `chat_id?`, `sender_id?`, `keyword?`, `start_date?`, `end_date?`, `limit?`, `offset?` |
| `search_messages` | 在当前聊天的索引消息中搜索关键词 | `query`, `page?`, `page_size?` |
| `query_messages` | 在消息历史数据库中查询,支持多种过滤条件 | `query_text?`, `sender_user_id?`, `sender_name_hint?`, `start_date?`, `end_date?`, `page?`, `page_size?` |

### 2.4 短链接工具

| 工具名称 | 描述 | 参数 |
|---------|------|------|
| `expand_short_url` | 获取短链接的完整URL | `short_url` |
| `list_short_urls` | 列出所有短链接映射 | `filter?`, `limit?`, `offset?` |
| `list_short_urls` | 列出所有短链接映射 | `original_url_query?`, `expanded_url_query?`, `page?`, `page_size?` |
| `expand_short_urls_batch` | 批量获取短链接的完整URL | `short_urls` |

### 2.5 MCP 服务器管理工具(仅管理员)

| 工具名称 | 描述 | 参数 |
|---------|------|------|
| `ListMcpServers` | 列出所有已配置的MCP服务器 | - |
| `AddMcpServer` | 添加新的MCP服务器 | `name`, `command`, `args?`, `env?` |
| `AddMcpServer` | 添加新的MCP服务器 | `name`, `command`, `args`, `env?` |
| `RemoveMcpServer` | 移除指定的MCP服务器 | `name` |
| `UpdateMcpServer` | 更新MCP服务器配置 | `name`, `command?`, `args?`, `env?` |
| `UpdateMcpServer` | 更新MCP服务器配置 | `name`, `timeout?`, `enabled?`, `env?`, `command?`, `args?` |
| `RestartMcpServers` | 重启所有MCP服务器 | - |

### 2.6 其他工具

| 工具名称 | 描述 | 参数 |
|---------|------|------|
| `memory_search` | 在记忆图谱中搜索 | `query` |
| `brave_web_search` | 使用 Brave Search API 进行网页搜索 | `query`, `count?` |
| `process_memory_command` | 在记忆图谱中执行操作 | `command`, `arguments` |
| `search_web` | 使用 Brave Search API 进行网页搜索 | `query`, `page?`, `count?`, `country?`, `search_lang?` |
| `extract_article` | 使用 Puppeteer 提取网页文章内容 | `url` |
| `sequential_thinking` | 动态问题解决思考工具 | `thought`, `next_thought_needed?` |
| `bash` | 执行 Shell 命令 | `command`, `timeout?` |
| `sequential_thinking` | 动态问题解决思考工具 | `input`, `next_thought_needed?`, `thought_number?`, `total_thoughts?`, ... |
| `bash` | 执行 Shell 命令 | `command`, `working_directory?`, `timeout_ms?` |
| `execute_js` | 使用 Deno 执行 JavaScript 代码 | `js_code`, `timeout_ms?` |
| `echo` | 回显文本(测试用) | `text` |
| `calculator` | 计算算术表达式 | `expression` |
| `create_todo_item` | 创建待办事项 | `title`, `list_name?`, `description?`, `priority?`, `due_at?`, `remind_at?` |
| `query_todo_items` | 查询待办事项 | `list_name?`, `status?`, `page?`, `page_size?` |
| `update_todo_item` | 更新待办事项 | `todo_id`, `title?`, `list_name?`, `description?`, `priority?`, ... |
| `complete_todo_item` | 标记待办事项完成 | `todo_id` |

## 三、外部 MCP 服务器

Expand Down
8 changes: 4 additions & 4 deletions Docs/README_VectorDatabaseInit.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ TelegramSearchBot现在使用**FAISS (Facebook AI Similarity Search)**作为向
使用管理员命令进行手动初始化:

```
/向量初始化
/faiss初始化
```

该命令会:
Expand All @@ -37,7 +37,7 @@ TelegramSearchBot现在使用**FAISS (Facebook AI Similarity Search)**作为向

### 向量服务状态检查
```
/向量状态
/faiss状态
```
显示:
- FAISS服务健康状态
Expand All @@ -46,7 +46,7 @@ TelegramSearchBot现在使用**FAISS (Facebook AI Similarity Search)**作为向

### 群组向量初始化
```
/向量初始化 [群组ID]
/faiss初始化 [群组ID]
```
为指定群组初始化向量:
- 创建对话段
Expand Down Expand Up @@ -157,7 +157,7 @@ ${WorkDir}/

### 数据一致性检查
```
/向量状态
/faiss状态
```
检查:
- 对话段数量与向量数量是否一致
Expand Down
Loading
Loading