Merge pull request #158 from BBleae/debug
实现 MongoDB URI 方式连接,改进文档,修复硬编码路径
This commit is contained in:
48
CLAUDE.md
Normal file
48
CLAUDE.md
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# MaiMBot 开发指南
|
||||||
|
|
||||||
|
## 🛠️ 常用命令
|
||||||
|
|
||||||
|
- **运行机器人**: `python run.py` 或 `python bot.py`
|
||||||
|
- **安装依赖**: `pip install --upgrade -r requirements.txt`
|
||||||
|
- **Docker 部署**: `docker-compose up`
|
||||||
|
- **代码检查**: `ruff check .`
|
||||||
|
- **代码格式化**: `ruff format .`
|
||||||
|
- **内存可视化**: `run_memory_vis.bat` 或 `python -m src.plugins.memory_system.draw_memory`
|
||||||
|
- **推理过程可视化**: `script/run_thingking.bat`
|
||||||
|
|
||||||
|
## 🔧 脚本工具
|
||||||
|
|
||||||
|
- **运行MongoDB**: `script/run_db.bat` - 在端口27017启动MongoDB
|
||||||
|
- **Windows完整启动**: `script/run_windows.bat` - 检查Python版本、设置虚拟环境、安装依赖并运行机器人
|
||||||
|
- **快速启动**: `script/run_maimai.bat` - 设置UTF-8编码并执行"nb run"命令
|
||||||
|
|
||||||
|
## 📝 代码风格
|
||||||
|
|
||||||
|
- **Python版本**: 3.9+
|
||||||
|
- **行长度限制**: 88字符
|
||||||
|
- **命名规范**:
|
||||||
|
- `snake_case` 用于函数和变量
|
||||||
|
- `PascalCase` 用于类
|
||||||
|
- `_prefix` 用于私有成员
|
||||||
|
- **导入顺序**: 标准库 → 第三方库 → 本地模块
|
||||||
|
- **异步编程**: 对I/O操作使用async/await
|
||||||
|
- **日志记录**: 使用loguru进行一致的日志记录
|
||||||
|
- **错误处理**: 使用带有具体异常的try/except
|
||||||
|
- **文档**: 为类和公共函数编写docstrings
|
||||||
|
|
||||||
|
## 🧩 系统架构
|
||||||
|
|
||||||
|
- **框架**: NoneBot2框架与插件架构
|
||||||
|
- **数据库**: MongoDB持久化存储
|
||||||
|
- **设计模式**: 工厂模式和单例管理器
|
||||||
|
- **配置管理**: 使用环境变量和TOML文件
|
||||||
|
- **内存系统**: 基于图的记忆结构,支持记忆构建、压缩、检索和遗忘
|
||||||
|
- **情绪系统**: 情绪模拟与概率权重
|
||||||
|
- **LLM集成**: 支持多个LLM服务提供商(ChatAnywhere, SiliconFlow, DeepSeek)
|
||||||
|
|
||||||
|
## ⚙️ 环境配置
|
||||||
|
|
||||||
|
- 使用`template.env`作为环境变量模板
|
||||||
|
- 使用`template/bot_config_template.toml`作为机器人配置模板
|
||||||
|
- MongoDB配置: 主机、端口、数据库名
|
||||||
|
- API密钥配置: 各LLM提供商的API密钥
|
||||||
19
README.md
19
README.md
@@ -1,6 +1,5 @@
|
|||||||
# 麦麦!MaiMBot (编辑中)
|
# 麦麦!MaiMBot (编辑中)
|
||||||
|
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||

|

|
||||||
@@ -45,7 +44,6 @@
|
|||||||
|
|
||||||
- (由 [CabLate](https://github.com/cablate) 贡献) [Telegram 与其他平台(未来可能会有)的版本](https://github.com/cablate/MaiMBot/tree/telegram) - [集中讨论串](https://github.com/SengokuCola/MaiMBot/discussions/149)
|
- (由 [CabLate](https://github.com/cablate) 贡献) [Telegram 与其他平台(未来可能会有)的版本](https://github.com/cablate/MaiMBot/tree/telegram) - [集中讨论串](https://github.com/SengokuCola/MaiMBot/discussions/149)
|
||||||
|
|
||||||
##
|
|
||||||
<div align="left">
|
<div align="left">
|
||||||
<h2>📚 文档 ⬇️ 快速开始使用麦麦 ⬇️</h2>
|
<h2>📚 文档 ⬇️ 快速开始使用麦麦 ⬇️</h2>
|
||||||
</div>
|
</div>
|
||||||
@@ -54,6 +52,7 @@
|
|||||||
|
|
||||||
- 📦 **Windows 一键傻瓜式部署**:请运行项目根目录中的 `run.bat`,部署完成后请参照后续配置指南进行配置
|
- 📦 **Windows 一键傻瓜式部署**:请运行项目根目录中的 `run.bat`,部署完成后请参照后续配置指南进行配置
|
||||||
|
|
||||||
|
|
||||||
- [📦 Windows 手动部署指南 ](docs/manual_deploy_windows.md)
|
- [📦 Windows 手动部署指南 ](docs/manual_deploy_windows.md)
|
||||||
|
|
||||||
- [📦 Linux 手动部署指南 ](docs/manual_deploy_linux.md)
|
- [📦 Linux 手动部署指南 ](docs/manual_deploy_linux.md)
|
||||||
@@ -63,7 +62,9 @@
|
|||||||
- [🐳 Docker部署指南](docs/docker_deploy.md)
|
- [🐳 Docker部署指南](docs/docker_deploy.md)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 配置说明
|
### 配置说明
|
||||||
|
|
||||||
- [🎀 新手配置指南](docs/installation_cute.md) - 通俗易懂的配置教程,适合初次使用的猫娘
|
- [🎀 新手配置指南](docs/installation_cute.md) - 通俗易懂的配置教程,适合初次使用的猫娘
|
||||||
- [⚙️ 标准配置指南](docs/installation_standard.md) - 简明专业的配置说明,适合有经验的用户
|
- [⚙️ 标准配置指南](docs/installation_standard.md) - 简明专业的配置说明,适合有经验的用户
|
||||||
|
|
||||||
@@ -76,6 +77,7 @@
|
|||||||
## 🎯 功能介绍
|
## 🎯 功能介绍
|
||||||
|
|
||||||
### 💬 聊天功能
|
### 💬 聊天功能
|
||||||
|
|
||||||
- 支持关键词检索主动发言:对消息的话题topic进行识别,如果检测到麦麦存储过的话题就会主动进行发言
|
- 支持关键词检索主动发言:对消息的话题topic进行识别,如果检测到麦麦存储过的话题就会主动进行发言
|
||||||
- 支持bot名字呼唤发言:检测到"麦麦"会主动发言,可配置
|
- 支持bot名字呼唤发言:检测到"麦麦"会主动发言,可配置
|
||||||
- 支持多模型,多厂商自定义配置
|
- 支持多模型,多厂商自定义配置
|
||||||
@@ -84,31 +86,33 @@
|
|||||||
- 错别字和多条回复功能:麦麦可以随机生成错别字,会多条发送回复以及对消息进行reply
|
- 错别字和多条回复功能:麦麦可以随机生成错别字,会多条发送回复以及对消息进行reply
|
||||||
|
|
||||||
### 😊 表情包功能
|
### 😊 表情包功能
|
||||||
|
|
||||||
- 支持根据发言内容发送对应情绪的表情包
|
- 支持根据发言内容发送对应情绪的表情包
|
||||||
- 会自动偷群友的表情包
|
- 会自动偷群友的表情包
|
||||||
|
|
||||||
### 📅 日程功能
|
### 📅 日程功能
|
||||||
|
|
||||||
- 麦麦会自动生成一天的日程,实现更拟人的回复
|
- 麦麦会自动生成一天的日程,实现更拟人的回复
|
||||||
|
|
||||||
### 🧠 记忆功能
|
### 🧠 记忆功能
|
||||||
|
|
||||||
- 对聊天记录进行概括存储,在需要时调用,待完善
|
- 对聊天记录进行概括存储,在需要时调用,待完善
|
||||||
|
|
||||||
### 📚 知识库功能
|
### 📚 知识库功能
|
||||||
|
|
||||||
- 基于embedding模型的知识库,手动放入txt会自动识别,写完了,暂时禁用
|
- 基于embedding模型的知识库,手动放入txt会自动识别,写完了,暂时禁用
|
||||||
|
|
||||||
### 👥 关系功能
|
### 👥 关系功能
|
||||||
|
|
||||||
- 针对每个用户创建"关系",可以对不同用户进行个性化回复,目前只有极其简单的好感度(WIP)
|
- 针对每个用户创建"关系",可以对不同用户进行个性化回复,目前只有极其简单的好感度(WIP)
|
||||||
- 针对每个群创建"群印象",可以对不同群进行个性化回复(WIP)
|
- 针对每个群创建"群印象",可以对不同群进行个性化回复(WIP)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 开发计划TODO:LIST
|
## 开发计划TODO:LIST
|
||||||
|
|
||||||
规划主线
|
规划主线
|
||||||
0.6.0:记忆系统更新
|
0.6.0:记忆系统更新
|
||||||
0.7.0: 麦麦RunTime
|
0.7.0: 麦麦RunTime
|
||||||
|
|
||||||
|
|
||||||
- 人格功能:WIP
|
- 人格功能:WIP
|
||||||
- 群氛围功能:WIP
|
- 群氛围功能:WIP
|
||||||
- 图片发送,转发功能:WIP
|
- 图片发送,转发功能:WIP
|
||||||
@@ -128,7 +132,6 @@
|
|||||||
- 采用截断生成加快麦麦的反应速度
|
- 采用截断生成加快麦麦的反应速度
|
||||||
- 改进发送消息的触发
|
- 改进发送消息的触发
|
||||||
|
|
||||||
|
|
||||||
## 设计理念
|
## 设计理念
|
||||||
|
|
||||||
- **千石可乐说:**
|
- **千石可乐说:**
|
||||||
@@ -138,7 +141,6 @@
|
|||||||
- 如果人类真的需要一个AI来陪伴自己,并不是所有人都需要一个完美的,能解决所有问题的helpful assistant,而是一个会犯错的,拥有自己感知和想法的"生命形式"。
|
- 如果人类真的需要一个AI来陪伴自己,并不是所有人都需要一个完美的,能解决所有问题的helpful assistant,而是一个会犯错的,拥有自己感知和想法的"生命形式"。
|
||||||
- 代码会保持开源和开放,但个人希望MaiMbot的运行时数据保持封闭,尽量避免以显式命令来对其进行控制和调试.我认为一个你无法完全掌控的个体才更能让你感觉到它的自主性,而视其成为一个对话机器.
|
- 代码会保持开源和开放,但个人希望MaiMbot的运行时数据保持封闭,尽量避免以显式命令来对其进行控制和调试.我认为一个你无法完全掌控的个体才更能让你感觉到它的自主性,而视其成为一个对话机器.
|
||||||
|
|
||||||
|
|
||||||
## 📌 注意事项
|
## 📌 注意事项
|
||||||
|
|
||||||
SengokuCola~~纯编程外行,面向cursor编程,很多代码写得不好多多包涵~~已得到大脑升级
|
SengokuCola~~纯编程外行,面向cursor编程,很多代码写得不好多多包涵~~已得到大脑升级
|
||||||
@@ -146,6 +148,7 @@ SengokuCola~~纯编程外行,面向cursor编程,很多代码写得不好多
|
|||||||
> 本应用生成内容来自人工智能模型,由 AI 生成,请仔细甄别,请勿用于违反法律的用途,AI生成内容不代表本人观点和立场。
|
> 本应用生成内容来自人工智能模型,由 AI 生成,请仔细甄别,请勿用于违反法律的用途,AI生成内容不代表本人观点和立场。
|
||||||
|
|
||||||
## 致谢
|
## 致谢
|
||||||
|
|
||||||
[nonebot2](https://github.com/nonebot/nonebot2): 跨平台 Python 异步聊天机器人框架
|
[nonebot2](https://github.com/nonebot/nonebot2): 跨平台 Python 异步聊天机器人框架
|
||||||
[NapCat](https://github.com/NapNeko/NapCatQQ): 现代化的基于 NTQQ 的 Bot 协议端实现
|
[NapCat](https://github.com/NapNeko/NapCatQQ): 现代化的基于 NTQQ 的 Bot 协议端实现
|
||||||
|
|
||||||
@@ -157,6 +160,6 @@ SengokuCola~~纯编程外行,面向cursor编程,很多代码写得不好多
|
|||||||
<img src="https://contrib.rocks/image?repo=SengokuCola/MaiMBot" />
|
<img src="https://contrib.rocks/image?repo=SengokuCola/MaiMBot" />
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
||||||
## Stargazers over time
|
## Stargazers over time
|
||||||
|
|
||||||
[](https://starchart.cc/SengokuCola/MaiMBot)
|
[](https://starchart.cc/SengokuCola/MaiMBot)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# 📂 文件及功能介绍 (2025年更新)
|
# 📂 文件及功能介绍 (2025年更新)
|
||||||
|
|
||||||
## 根目录
|
## 根目录
|
||||||
|
|
||||||
- **README.md**: 项目的概述和使用说明。
|
- **README.md**: 项目的概述和使用说明。
|
||||||
- **requirements.txt**: 项目所需的Python依赖包列表。
|
- **requirements.txt**: 项目所需的Python依赖包列表。
|
||||||
- **bot.py**: 主启动文件,负责环境配置加载和NoneBot初始化。
|
- **bot.py**: 主启动文件,负责环境配置加载和NoneBot初始化。
|
||||||
@@ -10,6 +11,7 @@
|
|||||||
- **run_*.bat**: 各种启动脚本,包括数据库、maimai和thinking功能。
|
- **run_*.bat**: 各种启动脚本,包括数据库、maimai和thinking功能。
|
||||||
|
|
||||||
## `src/` 目录结构
|
## `src/` 目录结构
|
||||||
|
|
||||||
- **`plugins/` 目录**: 存放不同功能模块的插件。
|
- **`plugins/` 目录**: 存放不同功能模块的插件。
|
||||||
- **chat/**: 处理聊天相关的功能,如消息发送和接收。
|
- **chat/**: 处理聊天相关的功能,如消息发送和接收。
|
||||||
- **memory_system/**: 处理机器人的记忆功能。
|
- **memory_system/**: 处理机器人的记忆功能。
|
||||||
@@ -22,9 +24,10 @@
|
|||||||
|
|
||||||
- **`common/` 目录**: 存放通用的工具和库。
|
- **`common/` 目录**: 存放通用的工具和库。
|
||||||
- **database.py**: 处理与数据库的交互,负责数据的存储和检索。
|
- **database.py**: 处理与数据库的交互,负责数据的存储和检索。
|
||||||
- **__init__.py**: 初始化模块。
|
- ****init**.py**: 初始化模块。
|
||||||
|
|
||||||
## `config/` 目录
|
## `config/` 目录
|
||||||
|
|
||||||
- **bot_config_template.toml**: 机器人配置模板。
|
- **bot_config_template.toml**: 机器人配置模板。
|
||||||
- **auto_format.py**: 自动格式化工具。
|
- **auto_format.py**: 自动格式化工具。
|
||||||
|
|
||||||
@@ -110,6 +113,7 @@
|
|||||||
## 消息处理流程
|
## 消息处理流程
|
||||||
|
|
||||||
### 1. 消息接收与预处理
|
### 1. 消息接收与预处理
|
||||||
|
|
||||||
- 通过 `ChatBot.handle_message()` 接收群消息。
|
- 通过 `ChatBot.handle_message()` 接收群消息。
|
||||||
- 进行用户和群组的权限检查。
|
- 进行用户和群组的权限检查。
|
||||||
- 更新用户关系信息。
|
- 更新用户关系信息。
|
||||||
@@ -117,12 +121,14 @@
|
|||||||
- 对消息进行过滤和敏感词检测。
|
- 对消息进行过滤和敏感词检测。
|
||||||
|
|
||||||
### 2. 主题识别与决策
|
### 2. 主题识别与决策
|
||||||
|
|
||||||
- 使用 `topic_identifier` 识别消息主题。
|
- 使用 `topic_identifier` 识别消息主题。
|
||||||
- 通过记忆系统检查对主题的兴趣度。
|
- 通过记忆系统检查对主题的兴趣度。
|
||||||
- `willing_manager` 动态计算回复概率。
|
- `willing_manager` 动态计算回复概率。
|
||||||
- 根据概率决定是否回复消息。
|
- 根据概率决定是否回复消息。
|
||||||
|
|
||||||
### 3. 回复生成与发送
|
### 3. 回复生成与发送
|
||||||
|
|
||||||
- 如需回复,首先创建 `Message_Thinking` 对象表示思考状态。
|
- 如需回复,首先创建 `Message_Thinking` 对象表示思考状态。
|
||||||
- 调用 `ResponseGenerator.generate_response()` 生成回复内容和情感状态。
|
- 调用 `ResponseGenerator.generate_response()` 生成回复内容和情感状态。
|
||||||
- 删除思考消息,创建 `MessageSet` 准备发送回复。
|
- 删除思考消息,创建 `MessageSet` 准备发送回复。
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ wget https://raw.githubusercontent.com/SengokuCola/MaiMBot/main/docker-compose.y
|
|||||||
- 若需要启用MongoDB数据库的用户名和密码,可进入docker-compose.yml,取消MongoDB处的注释并修改变量旁 `=` 后方的值为你的用户名和密码\
|
- 若需要启用MongoDB数据库的用户名和密码,可进入docker-compose.yml,取消MongoDB处的注释并修改变量旁 `=` 后方的值为你的用户名和密码\
|
||||||
修改后请注意在之后配置 `.env.prod` 文件时指定MongoDB数据库的用户名密码
|
修改后请注意在之后配置 `.env.prod` 文件时指定MongoDB数据库的用户名密码
|
||||||
|
|
||||||
|
|
||||||
### 2. 启动服务
|
### 2. 启动服务
|
||||||
|
|
||||||
- **!!! 请在第一次启动前确保当前工作目录下 `.env.prod` 与 `bot_config.toml` 文件存在 !!!**\
|
- **!!! 请在第一次启动前确保当前工作目录下 `.env.prod` 与 `bot_config.toml` 文件存在 !!!**\
|
||||||
@@ -42,7 +41,7 @@ NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker-compose up -d
|
|||||||
|
|
||||||
### 3. 修改配置并重启Docker
|
### 3. 修改配置并重启Docker
|
||||||
|
|
||||||
- 请前往 [🎀新手配置指南](./installation_cute.md) 或 [⚙️标准配置指南](./installation_standard.md) 完成 `.env.prod` 与 `bot_config.toml` 配置文件的编写\
|
- 请前往 [🎀 新手配置指南](docs/installation_cute.md) 或 [⚙️ 标准配置指南](docs/installation_standard.md) 完成`.env.prod`与`bot_config.toml`配置文件的编写\
|
||||||
**需要注意`.env.prod`中HOST处IP的填写,Docker中部署和系统中直接安装的配置会有所不同**
|
**需要注意`.env.prod`中HOST处IP的填写,Docker中部署和系统中直接安装的配置会有所不同**
|
||||||
|
|
||||||
- 重启Docker容器:
|
- 重启Docker容器:
|
||||||
@@ -59,7 +58,6 @@ NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker compose restart
|
|||||||
NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker-compose restart
|
NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker-compose restart
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### 4. 登入NapCat管理页添加反向WebSocket
|
### 4. 登入NapCat管理页添加反向WebSocket
|
||||||
|
|
||||||
- 在浏览器地址栏输入 `http://<宿主机IP>:6099/` 进入NapCat的管理Web页,添加一个Websocket客户端
|
- 在浏览器地址栏输入 `http://<宿主机IP>:6099/` 进入NapCat的管理Web页,添加一个Websocket客户端
|
||||||
@@ -69,7 +67,6 @@ NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker-compose restart
|
|||||||
- Websocket客户端的名称自定,URL栏填入 `ws://maimbot:8080/onebot/v11/ws`,启用并保存即可\
|
- Websocket客户端的名称自定,URL栏填入 `ws://maimbot:8080/onebot/v11/ws`,启用并保存即可\
|
||||||
(若修改过容器名称则替换maimbot为你自定的名称)
|
(若修改过容器名称则替换maimbot为你自定的名称)
|
||||||
|
|
||||||
|
|
||||||
### 5. 部署完成,愉快地和麦麦对话吧!
|
### 5. 部署完成,愉快地和麦麦对话吧!
|
||||||
|
|
||||||
|
|
||||||
@@ -89,7 +86,6 @@ NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker compose up -d
|
|||||||
NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker-compose up -d
|
NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker-compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## ⚠️ 注意事项
|
## ⚠️ 注意事项
|
||||||
|
|
||||||
- 目前部署方案仍在测试中,可能存在未知问题
|
- 目前部署方案仍在测试中,可能存在未知问题
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
# 🔧 配置指南 喵~
|
# 🔧 配置指南 喵~
|
||||||
|
|
||||||
## 👋 你好呀!
|
## 👋 你好呀
|
||||||
|
|
||||||
让咱来告诉你我们要做什么喵:
|
让咱来告诉你我们要做什么喵:
|
||||||
|
|
||||||
1. 我们要一起设置一个可爱的AI机器人
|
1. 我们要一起设置一个可爱的AI机器人
|
||||||
2. 这个机器人可以在QQ上陪你聊天玩耍哦
|
2. 这个机器人可以在QQ上陪你聊天玩耍哦
|
||||||
3. 需要设置两个文件才能让机器人工作呢
|
3. 需要设置两个文件才能让机器人工作呢
|
||||||
@@ -10,16 +11,19 @@
|
|||||||
## 📝 需要设置的文件喵
|
## 📝 需要设置的文件喵
|
||||||
|
|
||||||
要设置这两个文件才能让机器人跑起来哦:
|
要设置这两个文件才能让机器人跑起来哦:
|
||||||
|
|
||||||
1. `.env.prod` - 这个文件告诉机器人要用哪些AI服务呢
|
1. `.env.prod` - 这个文件告诉机器人要用哪些AI服务呢
|
||||||
2. `bot_config.toml` - 这个文件教机器人怎么和你聊天喵
|
2. `bot_config.toml` - 这个文件教机器人怎么和你聊天喵
|
||||||
|
|
||||||
## 🔑 密钥和域名的对应关系
|
## 🔑 密钥和域名的对应关系
|
||||||
|
|
||||||
想象一下,你要进入一个游乐园,需要:
|
想象一下,你要进入一个游乐园,需要:
|
||||||
|
|
||||||
1. 知道游乐园的地址(这就是域名 base_url)
|
1. 知道游乐园的地址(这就是域名 base_url)
|
||||||
2. 有入场的门票(这就是密钥 key)
|
2. 有入场的门票(这就是密钥 key)
|
||||||
|
|
||||||
在 `.env.prod` 文件里,我们定义了三个游乐园的地址和门票喵:
|
在 `.env.prod` 文件里,我们定义了三个游乐园的地址和门票喵:
|
||||||
|
|
||||||
```ini
|
```ini
|
||||||
# 硅基流动游乐园
|
# 硅基流动游乐园
|
||||||
SILICONFLOW_KEY=your_key # 硅基流动的门票
|
SILICONFLOW_KEY=your_key # 硅基流动的门票
|
||||||
@@ -35,6 +39,7 @@ CHAT_ANY_WHERE_BASE_URL=https://api.chatanywhere.tech/v1 # ChatAnyWhere的地
|
|||||||
```
|
```
|
||||||
|
|
||||||
然后在 `bot_config.toml` 里,机器人会用这些门票和地址去游乐园玩耍:
|
然后在 `bot_config.toml` 里,机器人会用这些门票和地址去游乐园玩耍:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[model.llm_reasoning]
|
[model.llm_reasoning]
|
||||||
name = "Pro/deepseek-ai/DeepSeek-R1"
|
name = "Pro/deepseek-ai/DeepSeek-R1"
|
||||||
@@ -47,9 +52,10 @@ base_url = "SILICONFLOW_BASE_URL" # 还是去硅基流动游乐园
|
|||||||
key = "SILICONFLOW_KEY" # 用同一张门票就可以啦
|
key = "SILICONFLOW_KEY" # 用同一张门票就可以啦
|
||||||
```
|
```
|
||||||
|
|
||||||
### 🎪 举个例子喵:
|
### 🎪 举个例子喵
|
||||||
|
|
||||||
如果你想用DeepSeek官方的服务,就要这样改:
|
如果你想用DeepSeek官方的服务,就要这样改:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[model.llm_reasoning]
|
[model.llm_reasoning]
|
||||||
name = "deepseek-reasoner" # 改成对应的模型名称,这里为DeepseekR1
|
name = "deepseek-reasoner" # 改成对应的模型名称,这里为DeepseekR1
|
||||||
@@ -62,7 +68,8 @@ base_url = "DEEP_SEEK_BASE_URL" # 也去DeepSeek游乐园
|
|||||||
key = "DEEP_SEEK_KEY" # 用同一张DeepSeek门票
|
key = "DEEP_SEEK_KEY" # 用同一张DeepSeek门票
|
||||||
```
|
```
|
||||||
|
|
||||||
### 🎯 简单来说:
|
### 🎯 简单来说
|
||||||
|
|
||||||
- `.env.prod` 文件就像是你的票夹,存放着各个游乐园的门票和地址
|
- `.env.prod` 文件就像是你的票夹,存放着各个游乐园的门票和地址
|
||||||
- `bot_config.toml` 就是告诉机器人:用哪张票去哪个游乐园玩
|
- `bot_config.toml` 就是告诉机器人:用哪张票去哪个游乐园玩
|
||||||
- 所有模型都可以用同一个游乐园的票,也可以去不同的游乐园玩耍
|
- 所有模型都可以用同一个游乐园的票,也可以去不同的游乐园玩耍
|
||||||
@@ -88,19 +95,25 @@ CHAT_ANY_WHERE_KEY=your_key
|
|||||||
CHAT_ANY_WHERE_BASE_URL=https://api.chatanywhere.tech/v1
|
CHAT_ANY_WHERE_BASE_URL=https://api.chatanywhere.tech/v1
|
||||||
|
|
||||||
# 如果你不知道这是什么,那么下面这些不用改,保持原样就好啦
|
# 如果你不知道这是什么,那么下面这些不用改,保持原样就好啦
|
||||||
HOST=127.0.0.1 # 如果使用Docker部署,需要改成0.0.0.0喵,不然听不见群友讲话了喵
|
# 如果使用Docker部署,需要改成0.0.0.0喵,不然听不见群友讲话了喵
|
||||||
|
HOST=127.0.0.1
|
||||||
PORT=8080
|
PORT=8080
|
||||||
|
|
||||||
# 这些是数据库设置,一般也不用改呢
|
# 这些是数据库设置,一般也不用改呢
|
||||||
MONGODB_HOST=127.0.0.1 # 如果使用Docker部署,需要改成数据库容器的名字喵,默认是mongodb喵
|
# 如果使用Docker部署,需要把MONGODB_HOST改成数据库容器的名字喵,默认是mongodb喵
|
||||||
|
MONGODB_HOST=127.0.0.1
|
||||||
MONGODB_PORT=27017
|
MONGODB_PORT=27017
|
||||||
DATABASE_NAME=MegBot
|
DATABASE_NAME=MegBot
|
||||||
MONGODB_USERNAME = "" # 如果数据库需要用户名,就在这里填写喵
|
# 数据库认证信息,如果需要认证就取消注释并填写下面三行喵
|
||||||
MONGODB_PASSWORD = "" # 如果数据库需要密码,就在这里填写呢
|
# MONGODB_USERNAME = ""
|
||||||
MONGODB_AUTH_SOURCE = "" # 数据库认证源,一般不用改哦
|
# MONGODB_PASSWORD = ""
|
||||||
|
# MONGODB_AUTH_SOURCE = ""
|
||||||
|
|
||||||
# 插件设置喵
|
# 也可以使用URI连接数据库,取消注释填写在下面这行喵(URI的优先级比上面的高)
|
||||||
PLUGINS=["src2.plugins.chat"] # 这里是机器人的插件列表呢
|
# MONGODB_URI=mongodb://127.0.0.1:27017/MegBot
|
||||||
|
|
||||||
|
# 这里是机器人的插件列表呢
|
||||||
|
PLUGINS=["src2.plugins.chat"]
|
||||||
```
|
```
|
||||||
|
|
||||||
### 第二个文件:机器人配置 (bot_config.toml)
|
### 第二个文件:机器人配置 (bot_config.toml)
|
||||||
@@ -199,10 +212,12 @@ key = "SILICONFLOW_KEY"
|
|||||||
- `topic`: 负责理解对话主题的能力呢
|
- `topic`: 负责理解对话主题的能力呢
|
||||||
|
|
||||||
## 🌟 小提示
|
## 🌟 小提示
|
||||||
|
|
||||||
- 如果你刚开始使用,建议保持默认配置呢
|
- 如果你刚开始使用,建议保持默认配置呢
|
||||||
- 不同的模型有不同的特长,可以根据需要调整它们的使用比例哦
|
- 不同的模型有不同的特长,可以根据需要调整它们的使用比例哦
|
||||||
|
|
||||||
## 🌟 小贴士喵
|
## 🌟 小贴士喵
|
||||||
|
|
||||||
- 记得要好好保管密钥(key)哦,不要告诉别人呢
|
- 记得要好好保管密钥(key)哦,不要告诉别人呢
|
||||||
- 配置文件要小心修改,改错了机器人可能就不能和你玩了喵
|
- 配置文件要小心修改,改错了机器人可能就不能和你玩了喵
|
||||||
- 如果想让机器人更聪明,可以调整 personality 里的设置呢
|
- 如果想让机器人更聪明,可以调整 personality 里的设置呢
|
||||||
@@ -210,6 +225,7 @@ key = "SILICONFLOW_KEY"
|
|||||||
- QQ群号和QQ号都要用数字填写,不要加引号哦(除了机器人自己的QQ号)
|
- QQ群号和QQ号都要用数字填写,不要加引号哦(除了机器人自己的QQ号)
|
||||||
|
|
||||||
## ⚠️ 注意事项
|
## ⚠️ 注意事项
|
||||||
|
|
||||||
- 这个机器人还在测试中呢,可能会有一些小问题喵
|
- 这个机器人还在测试中呢,可能会有一些小问题喵
|
||||||
- 如果不知道怎么改某个设置,就保持原样不要动它哦~
|
- 如果不知道怎么改某个设置,就保持原样不要动它哦~
|
||||||
- 记得要先有AI服务的密钥,不然机器人就不能和你说话了呢
|
- 记得要先有AI服务的密钥,不然机器人就不能和你说话了呢
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
## 简介
|
## 简介
|
||||||
|
|
||||||
本项目需要配置两个主要文件:
|
本项目需要配置两个主要文件:
|
||||||
|
|
||||||
1. `.env.prod` - 配置API服务和系统环境
|
1. `.env.prod` - 配置API服务和系统环境
|
||||||
2. `bot_config.toml` - 配置机器人行为和模型
|
2. `bot_config.toml` - 配置机器人行为和模型
|
||||||
|
|
||||||
@@ -10,7 +11,8 @@
|
|||||||
|
|
||||||
`.env.prod` 和 `bot_config.toml` 中的API配置关系如下:
|
`.env.prod` 和 `bot_config.toml` 中的API配置关系如下:
|
||||||
|
|
||||||
### 在.env.prod中定义API凭证:
|
### 在.env.prod中定义API凭证
|
||||||
|
|
||||||
```ini
|
```ini
|
||||||
# API凭证配置
|
# API凭证配置
|
||||||
SILICONFLOW_KEY=your_key # 硅基流动API密钥
|
SILICONFLOW_KEY=your_key # 硅基流动API密钥
|
||||||
@@ -23,7 +25,8 @@ CHAT_ANY_WHERE_KEY=your_key # ChatAnyWhere API密钥
|
|||||||
CHAT_ANY_WHERE_BASE_URL=https://api.chatanywhere.tech/v1 # ChatAnyWhere API地址
|
CHAT_ANY_WHERE_BASE_URL=https://api.chatanywhere.tech/v1 # ChatAnyWhere API地址
|
||||||
```
|
```
|
||||||
|
|
||||||
### 在bot_config.toml中引用API凭证:
|
### 在bot_config.toml中引用API凭证
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[model.llm_reasoning]
|
[model.llm_reasoning]
|
||||||
name = "Pro/deepseek-ai/DeepSeek-R1"
|
name = "Pro/deepseek-ai/DeepSeek-R1"
|
||||||
@@ -32,6 +35,7 @@ key = "SILICONFLOW_KEY" # 引用.env.prod中定义的密钥
|
|||||||
```
|
```
|
||||||
|
|
||||||
如需切换到其他API服务,只需修改引用:
|
如需切换到其他API服务,只需修改引用:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[model.llm_reasoning]
|
[model.llm_reasoning]
|
||||||
name = "deepseek-reasoner" # 改成对应的模型名称,这里为DeepseekR1
|
name = "deepseek-reasoner" # 改成对应的模型名称,这里为DeepseekR1
|
||||||
@@ -42,6 +46,7 @@ key = "DEEP_SEEK_KEY" # 使用DeepSeek密钥
|
|||||||
## 配置文件详解
|
## 配置文件详解
|
||||||
|
|
||||||
### 环境配置文件 (.env.prod)
|
### 环境配置文件 (.env.prod)
|
||||||
|
|
||||||
```ini
|
```ini
|
||||||
# API配置
|
# API配置
|
||||||
SILICONFLOW_KEY=your_key
|
SILICONFLOW_KEY=your_key
|
||||||
@@ -52,22 +57,29 @@ CHAT_ANY_WHERE_KEY=your_key
|
|||||||
CHAT_ANY_WHERE_BASE_URL=https://api.chatanywhere.tech/v1
|
CHAT_ANY_WHERE_BASE_URL=https://api.chatanywhere.tech/v1
|
||||||
|
|
||||||
# 服务配置
|
# 服务配置
|
||||||
|
|
||||||
HOST=127.0.0.1 # 如果使用Docker部署,需要改成0.0.0.0,否则QQ消息无法传入
|
HOST=127.0.0.1 # 如果使用Docker部署,需要改成0.0.0.0,否则QQ消息无法传入
|
||||||
PORT=8080 # 与反向端口相同
|
PORT=8080 # 与反向端口相同
|
||||||
|
|
||||||
# 数据库配置
|
# 数据库配置
|
||||||
MONGODB_HOST=127.0.0.1 # 如果使用Docker部署,需要改成数据库容器的名字,默认是mongodb
|
MONGODB_HOST=127.0.0.1 # 如果使用Docker部署,需要改成数据库容器的名字,默认是mongodb
|
||||||
MONGODB_PORT=27017 # MongoDB端口
|
MONGODB_PORT=27017 # MongoDB端口
|
||||||
|
|
||||||
DATABASE_NAME=MegBot
|
DATABASE_NAME=MegBot
|
||||||
MONGODB_USERNAME = "" # 数据库用户名
|
# 数据库认证信息,如果需要认证就取消注释并填写下面三行
|
||||||
MONGODB_PASSWORD = "" # 数据库密码
|
# MONGODB_USERNAME = ""
|
||||||
MONGODB_AUTH_SOURCE = "" # 认证数据库
|
# MONGODB_PASSWORD = ""
|
||||||
|
# MONGODB_AUTH_SOURCE = ""
|
||||||
|
|
||||||
|
# 也可以使用URI连接数据库,取消注释填写在下面这行(URI的优先级比上面的高)
|
||||||
|
# MONGODB_URI=mongodb://127.0.0.1:27017/MegBot
|
||||||
|
|
||||||
# 插件配置
|
# 插件配置
|
||||||
PLUGINS=["src2.plugins.chat"]
|
PLUGINS=["src2.plugins.chat"]
|
||||||
```
|
```
|
||||||
|
|
||||||
### 机器人配置文件 (bot_config.toml)
|
### 机器人配置文件 (bot_config.toml)
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[bot]
|
[bot]
|
||||||
qq = "机器人QQ号" # 必填
|
qq = "机器人QQ号" # 必填
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# 📦 Linux系统如何手动部署MaiMbot麦麦?
|
# 📦 Linux系统如何手动部署MaiMbot麦麦?
|
||||||
|
|
||||||
## 准备工作
|
## 准备工作
|
||||||
|
|
||||||
- 一台联网的Linux设备(本教程以Ubuntu/Debian系为例)
|
- 一台联网的Linux设备(本教程以Ubuntu/Debian系为例)
|
||||||
- QQ小号(QQ框架的使用可能导致qq被风控,严重(小概率)可能会导致账号封禁,强烈不推荐使用大号)
|
- QQ小号(QQ框架的使用可能导致qq被风控,严重(小概率)可能会导致账号封禁,强烈不推荐使用大号)
|
||||||
- 可用的大模型API
|
- 可用的大模型API
|
||||||
@@ -20,6 +21,7 @@
|
|||||||
- 数据库是什么?如何安装并启动MongoDB
|
- 数据库是什么?如何安装并启动MongoDB
|
||||||
|
|
||||||
- 如何运行一个QQ机器人,以及NapCat框架是什么
|
- 如何运行一个QQ机器人,以及NapCat框架是什么
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 环境配置
|
## 环境配置
|
||||||
@@ -33,7 +35,9 @@ python --version
|
|||||||
# 或
|
# 或
|
||||||
python3 --version
|
python3 --version
|
||||||
```
|
```
|
||||||
|
|
||||||
如果版本低于3.9,请更新Python版本。
|
如果版本低于3.9,请更新Python版本。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Ubuntu/Debian
|
# Ubuntu/Debian
|
||||||
sudo apt update
|
sudo apt update
|
||||||
@@ -45,6 +49,7 @@ sudo update-alternatives --config python3
|
|||||||
```
|
```
|
||||||
|
|
||||||
### 2️⃣ **创建虚拟环境**
|
### 2️⃣ **创建虚拟环境**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 方法1:使用venv(推荐)
|
# 方法1:使用venv(推荐)
|
||||||
python3 -m venv maimbot
|
python3 -m venv maimbot
|
||||||
@@ -65,13 +70,16 @@ pip install -r requirements.txt
|
|||||||
---
|
---
|
||||||
|
|
||||||
## 数据库配置
|
## 数据库配置
|
||||||
### 3️⃣ **安装并启动MongoDB**
|
|
||||||
- 安装与启动: Debian参考[官方文档](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-debian/),Ubuntu参考[官方文档](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/)
|
|
||||||
|
|
||||||
|
### 3️⃣ **安装并启动MongoDB**
|
||||||
|
|
||||||
|
- 安装与启动:Debian参考[官方文档](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-debian/),Ubuntu参考[官方文档](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/)
|
||||||
- 默认连接本地27017端口
|
- 默认连接本地27017端口
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## NapCat配置
|
## NapCat配置
|
||||||
|
|
||||||
### 4️⃣ **安装NapCat框架**
|
### 4️⃣ **安装NapCat框架**
|
||||||
|
|
||||||
- 参考[NapCat官方文档](https://www.napcat.wiki/guide/boot/Shell#napcat-installer-linux%E4%B8%80%E9%94%AE%E4%BD%BF%E7%94%A8%E8%84%9A%E6%9C%AC-%E6%94%AF%E6%8C%81ubuntu-20-debian-10-centos9)安装
|
- 参考[NapCat官方文档](https://www.napcat.wiki/guide/boot/Shell#napcat-installer-linux%E4%B8%80%E9%94%AE%E4%BD%BF%E7%94%A8%E8%84%9A%E6%9C%AC-%E6%94%AF%E6%8C%81ubuntu-20-debian-10-centos9)安装
|
||||||
@@ -81,15 +89,18 @@ pip install -r requirements.txt
|
|||||||
---
|
---
|
||||||
|
|
||||||
## 配置文件设置
|
## 配置文件设置
|
||||||
### 5️⃣ **配置文件设置,让麦麦Bot正常工作**
|
|
||||||
- 修改环境配置文件: `.env.prod`
|
|
||||||
- 修改机器人配置文件: `bot_config.toml`
|
|
||||||
|
|
||||||
|
### 5️⃣ **配置文件设置,让麦麦Bot正常工作**
|
||||||
|
|
||||||
|
- 修改环境配置文件:`.env.prod`
|
||||||
|
- 修改机器人配置文件:`bot_config.toml`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 启动机器人
|
## 启动机器人
|
||||||
|
|
||||||
### 6️⃣ **启动麦麦机器人**
|
### 6️⃣ **启动麦麦机器人**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 在项目目录下操作
|
# 在项目目录下操作
|
||||||
nb run
|
nb run
|
||||||
@@ -100,15 +111,17 @@ python3 bot.py
|
|||||||
---
|
---
|
||||||
|
|
||||||
## **其他组件(可选)**
|
## **其他组件(可选)**
|
||||||
- 直接运行 knowledge.py生成知识库
|
|
||||||
|
|
||||||
|
- 直接运行 knowledge.py生成知识库
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 常见问题
|
## 常见问题
|
||||||
🔧 权限问题: 在命令前加 `sudo`
|
|
||||||
🔌 端口占用: 使用 `sudo lsof -i :8080` 查看端口占用
|
🔧 权限问题:在命令前加`sudo`
|
||||||
🛡️ 防火墙: 确保8080/27017端口开放
|
🔌 端口占用:使用`sudo lsof -i :8080`查看端口占用
|
||||||
|
🛡️ 防火墙:确保8080/27017端口开放
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo ufw allow 8080/tcp
|
sudo ufw allow 8080/tcp
|
||||||
sudo ufw allow 27017/tcp
|
sudo ufw allow 27017/tcp
|
||||||
|
|||||||
@@ -30,12 +30,13 @@
|
|||||||
|
|
||||||
在创建虚拟环境之前,请确保你的电脑上安装了Python 3.9及以上版本。如果没有,可以按以下步骤安装:
|
在创建虚拟环境之前,请确保你的电脑上安装了Python 3.9及以上版本。如果没有,可以按以下步骤安装:
|
||||||
|
|
||||||
1. 访问Python官网下载页面: https://www.python.org/downloads/release/python-3913/
|
1. 访问Python官网下载页面:<https://www.python.org/downloads/release/python-3913/>
|
||||||
2. 下载Windows安装程序 (64-bit): `python-3.9.13-amd64.exe`
|
2. 下载Windows安装程序 (64-bit): `python-3.9.13-amd64.exe`
|
||||||
3. 运行安装程序,并确保勾选"Add Python 3.9 to PATH"选项
|
3. 运行安装程序,并确保勾选"Add Python 3.9 to PATH"选项
|
||||||
4. 点击"Install Now"开始安装
|
4. 点击"Install Now"开始安装
|
||||||
|
|
||||||
或者使用PowerShell自动下载安装(需要管理员权限):
|
或者使用PowerShell自动下载安装(需要管理员权限):
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
# 下载并安装Python 3.9.13
|
# 下载并安装Python 3.9.13
|
||||||
$pythonUrl = "https://www.python.org/ftp/python/3.9.13/python-3.9.13-amd64.exe"
|
$pythonUrl = "https://www.python.org/ftp/python/3.9.13/python-3.9.13-amd64.exe"
|
||||||
@@ -46,7 +47,7 @@ Start-Process -Wait -FilePath $pythonInstaller -ArgumentList "/quiet", "InstallA
|
|||||||
|
|
||||||
### 2️⃣ **创建Python虚拟环境来运行程序**
|
### 2️⃣ **创建Python虚拟环境来运行程序**
|
||||||
|
|
||||||
你可以选择使用以下两种方法之一来创建Python环境:
|
> 你可以选择使用以下两种方法之一来创建Python环境:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# ---方法1:使用venv(Python自带)
|
# ---方法1:使用venv(Python自带)
|
||||||
@@ -60,6 +61,7 @@ maimbot\\Scripts\\activate
|
|||||||
# 安装依赖
|
# 安装依赖
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# ---方法2:使用conda
|
# ---方法2:使用conda
|
||||||
# 创建一个新的conda环境(环境名为maimbot)
|
# 创建一个新的conda环境(环境名为maimbot)
|
||||||
@@ -74,27 +76,35 @@ pip install -r requirements.txt
|
|||||||
```
|
```
|
||||||
|
|
||||||
### 2️⃣ **然后你需要启动MongoDB数据库,来存储信息**
|
### 2️⃣ **然后你需要启动MongoDB数据库,来存储信息**
|
||||||
|
|
||||||
- 安装并启动MongoDB服务
|
- 安装并启动MongoDB服务
|
||||||
- 默认连接本地27017端口
|
- 默认连接本地27017端口
|
||||||
|
|
||||||
### 3️⃣ **配置NapCat,让麦麦bot与qq取得联系**
|
### 3️⃣ **配置NapCat,让麦麦bot与qq取得联系**
|
||||||
|
|
||||||
- 安装并登录NapCat(用你的qq小号)
|
- 安装并登录NapCat(用你的qq小号)
|
||||||
- 添加反向WS: `ws://127.0.0.1:8080/onebot/v11/ws`
|
- 添加反向WS: `ws://127.0.0.1:8080/onebot/v11/ws`
|
||||||
|
|
||||||
### 4️⃣ **配置文件设置,让麦麦Bot正常工作**
|
### 4️⃣ **配置文件设置,让麦麦Bot正常工作**
|
||||||
- 修改环境配置文件: `.env.prod`
|
|
||||||
- 修改机器人配置文件: `bot_config.toml`
|
- 修改环境配置文件:`.env.prod`
|
||||||
|
- 修改机器人配置文件:`bot_config.toml`
|
||||||
|
|
||||||
### 5️⃣ **启动麦麦机器人**
|
### 5️⃣ **启动麦麦机器人**
|
||||||
|
|
||||||
- 打开命令行,cd到对应路径
|
- 打开命令行,cd到对应路径
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
nb run
|
nb run
|
||||||
```
|
```
|
||||||
|
|
||||||
- 或者cd到对应路径后
|
- 或者cd到对应路径后
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python bot.py
|
python bot.py
|
||||||
```
|
```
|
||||||
|
|
||||||
### 6️⃣ **其他组件(可选)**
|
### 6️⃣ **其他组件(可选)**
|
||||||
|
|
||||||
- `run_thingking.bat`: 启动可视化推理界面(未完善)
|
- `run_thingking.bat`: 启动可视化推理界面(未完善)
|
||||||
- 直接运行 knowledge.py生成知识库
|
- 直接运行 knowledge.py生成知识库
|
||||||
|
|||||||
@@ -6,20 +6,44 @@ from pymongo import MongoClient
|
|||||||
class Database:
|
class Database:
|
||||||
_instance: Optional["Database"] = None
|
_instance: Optional["Database"] = None
|
||||||
|
|
||||||
def __init__(self, host: str, port: int, db_name: str, username: Optional[str] = None, password: Optional[str] = None, auth_source: Optional[str] = None):
|
def __init__(
|
||||||
if username and password:
|
self,
|
||||||
|
host: str,
|
||||||
|
port: int,
|
||||||
|
db_name: str,
|
||||||
|
username: Optional[str] = None,
|
||||||
|
password: Optional[str] = None,
|
||||||
|
auth_source: Optional[str] = None,
|
||||||
|
uri: Optional[str] = None,
|
||||||
|
):
|
||||||
|
if uri and uri.startswith("mongodb://"):
|
||||||
|
# 优先使用URI连接
|
||||||
|
self.client = MongoClient(uri)
|
||||||
|
elif username and password:
|
||||||
# 如果有用户名和密码,使用认证连接
|
# 如果有用户名和密码,使用认证连接
|
||||||
# TODO: 复杂情况直接支持URI吧
|
self.client = MongoClient(
|
||||||
self.client = MongoClient(host, port, username=username, password=password, authSource=auth_source)
|
host, port, username=username, password=password, authSource=auth_source
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
# 否则使用无认证连接
|
# 否则使用无认证连接
|
||||||
self.client = MongoClient(host, port)
|
self.client = MongoClient(host, port)
|
||||||
self.db = self.client[db_name]
|
self.db = self.client[db_name]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def initialize(cls, host: str, port: int, db_name: str, username: Optional[str] = None, password: Optional[str] = None, auth_source: Optional[str] = None) -> "Database":
|
def initialize(
|
||||||
|
cls,
|
||||||
|
host: str,
|
||||||
|
port: int,
|
||||||
|
db_name: str,
|
||||||
|
username: Optional[str] = None,
|
||||||
|
password: Optional[str] = None,
|
||||||
|
auth_source: Optional[str] = None,
|
||||||
|
uri: Optional[str] = None,
|
||||||
|
) -> "Database":
|
||||||
if cls._instance is None:
|
if cls._instance is None:
|
||||||
cls._instance = cls(host, port, db_name, username, password, auth_source)
|
cls._instance = cls(
|
||||||
|
host, port, db_name, username, password, auth_source, uri
|
||||||
|
)
|
||||||
return cls._instance
|
return cls._instance
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from datetime import datetime
|
|||||||
from typing import Dict, List
|
from typing import Dict, List
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from pymongo import MongoClient
|
from ..common.database import Database
|
||||||
|
|
||||||
import customtkinter as ctk
|
import customtkinter as ctk
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
@@ -28,38 +28,6 @@ else:
|
|||||||
logger.error("未找到环境配置文件")
|
logger.error("未找到环境配置文件")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
class Database:
|
|
||||||
_instance: Optional["Database"] = None
|
|
||||||
|
|
||||||
def __init__(self, host: str, port: int, db_name: str, username: str = None, password: str = None,
|
|
||||||
auth_source: str = None):
|
|
||||||
if username and password:
|
|
||||||
self.client = MongoClient(
|
|
||||||
host=host,
|
|
||||||
port=port,
|
|
||||||
username=username,
|
|
||||||
password=password,
|
|
||||||
authSource=auth_source or 'admin'
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
self.client = MongoClient(host, port)
|
|
||||||
self.db = self.client[db_name]
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def initialize(cls, host: str, port: int, db_name: str, username: str = None, password: str = None,
|
|
||||||
auth_source: str = None) -> "Database":
|
|
||||||
if cls._instance is None:
|
|
||||||
cls._instance = cls(host, port, db_name, username, password, auth_source)
|
|
||||||
return cls._instance
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def get_instance(cls) -> "Database":
|
|
||||||
if cls._instance is None:
|
|
||||||
raise RuntimeError("Database not initialized")
|
|
||||||
return cls._instance
|
|
||||||
|
|
||||||
|
|
||||||
class ReasoningGUI:
|
class ReasoningGUI:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
# 记录启动时间戳,转换为Unix时间戳
|
# 记录启动时间戳,转换为Unix时间戳
|
||||||
@@ -83,7 +51,15 @@ class ReasoningGUI:
|
|||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
logger.warning("数据库未初始化,正在尝试初始化...")
|
logger.warning("数据库未初始化,正在尝试初始化...")
|
||||||
try:
|
try:
|
||||||
Database.initialize("127.0.0.1", 27017, "maimai_bot")
|
Database.initialize(
|
||||||
|
uri=os.getenv("MONGODB_URI"),
|
||||||
|
host=os.getenv("MONGODB_HOST", "127.0.0.1"),
|
||||||
|
port=int(os.getenv("MONGODB_PORT", "27017")),
|
||||||
|
db_name=os.getenv("DATABASE_NAME", "MegBot"),
|
||||||
|
username=os.getenv("MONGODB_USERNAME"),
|
||||||
|
password=os.getenv("MONGODB_PASSWORD"),
|
||||||
|
auth_source=os.getenv("MONGODB_AUTH_SOURCE"),
|
||||||
|
)
|
||||||
self.db = Database.get_instance().db
|
self.db = Database.get_instance().db
|
||||||
logger.success("数据库初始化成功")
|
logger.success("数据库初始化成功")
|
||||||
except Exception:
|
except Exception:
|
||||||
@@ -359,12 +335,13 @@ class ReasoningGUI:
|
|||||||
def main():
|
def main():
|
||||||
"""主函数"""
|
"""主函数"""
|
||||||
Database.initialize(
|
Database.initialize(
|
||||||
host=os.getenv("MONGODB_HOST"),
|
uri=os.getenv("MONGODB_URI"),
|
||||||
port=int(os.getenv("MONGODB_PORT")),
|
host=os.getenv("MONGODB_HOST", "127.0.0.1"),
|
||||||
db_name=os.getenv("DATABASE_NAME"),
|
port=int(os.getenv("MONGODB_PORT", "27017")),
|
||||||
|
db_name=os.getenv("DATABASE_NAME", "MegBot"),
|
||||||
username=os.getenv("MONGODB_USERNAME"),
|
username=os.getenv("MONGODB_USERNAME"),
|
||||||
password=os.getenv("MONGODB_PASSWORD"),
|
password=os.getenv("MONGODB_PASSWORD"),
|
||||||
auth_source=os.getenv("MONGODB_AUTH_SOURCE")
|
auth_source=os.getenv("MONGODB_AUTH_SOURCE"),
|
||||||
)
|
)
|
||||||
|
|
||||||
app = ReasoningGUI()
|
app = ReasoningGUI()
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ driver = get_driver()
|
|||||||
config = driver.config
|
config = driver.config
|
||||||
|
|
||||||
Database.initialize(
|
Database.initialize(
|
||||||
|
uri=config.MONGODB_URI,
|
||||||
host=config.MONGODB_HOST,
|
host=config.MONGODB_HOST,
|
||||||
port=int(config.MONGODB_PORT),
|
port=int(config.MONGODB_PORT),
|
||||||
db_name=config.DATABASE_NAME,
|
db_name=config.DATABASE_NAME,
|
||||||
|
|||||||
@@ -37,14 +37,7 @@ def storage_compress_image(base64_data: str, max_size: int = 200) -> str:
|
|||||||
os.makedirs(images_dir, exist_ok=True)
|
os.makedirs(images_dir, exist_ok=True)
|
||||||
|
|
||||||
# 连接数据库
|
# 连接数据库
|
||||||
db = Database(
|
db = Database.get_instance()
|
||||||
host=config.mongodb_host,
|
|
||||||
port=int(config.mongodb_port),
|
|
||||||
db_name=config.database_name,
|
|
||||||
username=config.mongodb_username,
|
|
||||||
password=config.mongodb_password,
|
|
||||||
auth_source=config.mongodb_auth_source
|
|
||||||
)
|
|
||||||
|
|
||||||
# 检查是否已存在相同哈希值的图片
|
# 检查是否已存在相同哈希值的图片
|
||||||
collection = db.db['images']
|
collection = db.db['images']
|
||||||
|
|||||||
@@ -19,12 +19,13 @@ from src.common.database import Database
|
|||||||
|
|
||||||
# 从环境变量获取配置
|
# 从环境变量获取配置
|
||||||
Database.initialize(
|
Database.initialize(
|
||||||
|
uri=os.getenv("MONGODB_URI"),
|
||||||
host=os.getenv("MONGODB_HOST", "127.0.0.1"),
|
host=os.getenv("MONGODB_HOST", "127.0.0.1"),
|
||||||
port=int(os.getenv("MONGODB_PORT", "27017")),
|
port=int(os.getenv("MONGODB_PORT", "27017")),
|
||||||
db_name=os.getenv("DATABASE_NAME", "maimai"),
|
db_name=os.getenv("DATABASE_NAME", "MegBot"),
|
||||||
username=os.getenv("MONGODB_USERNAME"),
|
username=os.getenv("MONGODB_USERNAME"),
|
||||||
password=os.getenv("MONGODB_PASSWORD"),
|
password=os.getenv("MONGODB_PASSWORD"),
|
||||||
auth_source=os.getenv("MONGODB_AUTH_SOURCE", "admin")
|
auth_source=os.getenv("MONGODB_AUTH_SOURCE"),
|
||||||
)
|
)
|
||||||
|
|
||||||
class KnowledgeLibrary:
|
class KnowledgeLibrary:
|
||||||
|
|||||||
@@ -9,7 +9,10 @@ import networkx as nx
|
|||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
|
|
||||||
sys.path.append("C:/GitHub/MaiMBot") # 添加项目根目录到 Python 路径
|
# 添加项目根目录到 Python 路径
|
||||||
|
root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../.."))
|
||||||
|
sys.path.append(root_path)
|
||||||
|
|
||||||
from src.common.database import Database # 使用正确的导入语法
|
from src.common.database import Database # 使用正确的导入语法
|
||||||
|
|
||||||
# 加载.env.dev文件
|
# 加载.env.dev文件
|
||||||
@@ -162,12 +165,13 @@ class Memory_graph:
|
|||||||
def main():
|
def main():
|
||||||
# 初始化数据库
|
# 初始化数据库
|
||||||
Database.initialize(
|
Database.initialize(
|
||||||
|
uri=os.getenv("MONGODB_URI"),
|
||||||
host=os.getenv("MONGODB_HOST", "127.0.0.1"),
|
host=os.getenv("MONGODB_HOST", "127.0.0.1"),
|
||||||
port=int(os.getenv("MONGODB_PORT", "27017")),
|
port=int(os.getenv("MONGODB_PORT", "27017")),
|
||||||
db_name=os.getenv("DATABASE_NAME", "MegBot"),
|
db_name=os.getenv("DATABASE_NAME", "MegBot"),
|
||||||
username=os.getenv("MONGODB_USERNAME", ""),
|
username=os.getenv("MONGODB_USERNAME"),
|
||||||
password=os.getenv("MONGODB_PASSWORD", ""),
|
password=os.getenv("MONGODB_PASSWORD"),
|
||||||
auth_source=os.getenv("MONGODB_AUTH_SOURCE", "")
|
auth_source=os.getenv("MONGODB_AUTH_SOURCE"),
|
||||||
)
|
)
|
||||||
|
|
||||||
memory_graph = Memory_graph()
|
memory_graph = Memory_graph()
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import jieba
|
|||||||
import networkx as nx
|
import networkx as nx
|
||||||
|
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
|
from nonebot import get_driver
|
||||||
from ...common.database import Database # 使用正确的导入语法
|
from ...common.database import Database # 使用正确的导入语法
|
||||||
from ..chat.config import global_config
|
from ..chat.config import global_config
|
||||||
from ..chat.utils import (
|
from ..chat.utils import (
|
||||||
@@ -18,7 +19,6 @@ from ..chat.utils import (
|
|||||||
)
|
)
|
||||||
from ..models.utils_model import LLM_request
|
from ..models.utils_model import LLM_request
|
||||||
|
|
||||||
|
|
||||||
class Memory_graph:
|
class Memory_graph:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.G = nx.Graph() # 使用 networkx 的图结构
|
self.G = nx.Graph() # 使用 networkx 的图结构
|
||||||
@@ -881,15 +881,13 @@ def segment_text(text):
|
|||||||
seg_text = list(jieba.cut(text))
|
seg_text = list(jieba.cut(text))
|
||||||
return seg_text
|
return seg_text
|
||||||
|
|
||||||
|
|
||||||
from nonebot import get_driver
|
|
||||||
|
|
||||||
driver = get_driver()
|
driver = get_driver()
|
||||||
config = driver.config
|
config = driver.config
|
||||||
|
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
|
|
||||||
Database.initialize(
|
Database.initialize(
|
||||||
|
uri=config.MONGODB_URI,
|
||||||
host=config.MONGODB_HOST,
|
host=config.MONGODB_HOST,
|
||||||
port=config.MONGODB_PORT,
|
port=config.MONGODB_PORT,
|
||||||
db_name=config.DATABASE_NAME,
|
db_name=config.DATABASE_NAME,
|
||||||
|
|||||||
@@ -16,7 +16,10 @@ from loguru import logger
|
|||||||
import jieba
|
import jieba
|
||||||
|
|
||||||
# from chat.config import global_config
|
# from chat.config import global_config
|
||||||
sys.path.append("C:/GitHub/MaiMBot") # 添加项目根目录到 Python 路径
|
# 添加项目根目录到 Python 路径
|
||||||
|
root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../.."))
|
||||||
|
sys.path.append(root_path)
|
||||||
|
|
||||||
from src.common.database import Database
|
from src.common.database import Database
|
||||||
from src.plugins.memory_system.offline_llm import LLMModel
|
from src.plugins.memory_system.offline_llm import LLMModel
|
||||||
|
|
||||||
@@ -35,45 +38,6 @@ else:
|
|||||||
logger.warning(f"未找到环境变量文件: {env_path}")
|
logger.warning(f"未找到环境变量文件: {env_path}")
|
||||||
logger.info("将使用默认配置")
|
logger.info("将使用默认配置")
|
||||||
|
|
||||||
class Database:
|
|
||||||
_instance = None
|
|
||||||
db = None
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def get_instance(cls):
|
|
||||||
if cls._instance is None:
|
|
||||||
cls._instance = cls()
|
|
||||||
return cls._instance
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
if not Database.db:
|
|
||||||
Database.initialize(
|
|
||||||
host=os.getenv("MONGODB_HOST"),
|
|
||||||
port=int(os.getenv("MONGODB_PORT")),
|
|
||||||
db_name=os.getenv("DATABASE_NAME"),
|
|
||||||
username=os.getenv("MONGODB_USERNAME"),
|
|
||||||
password=os.getenv("MONGODB_PASSWORD"),
|
|
||||||
auth_source=os.getenv("MONGODB_AUTH_SOURCE")
|
|
||||||
)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def initialize(cls, host, port, db_name, username=None, password=None, auth_source="admin"):
|
|
||||||
try:
|
|
||||||
if username and password:
|
|
||||||
uri = f"mongodb://{username}:{password}@{host}:{port}/{db_name}?authSource={auth_source}"
|
|
||||||
else:
|
|
||||||
uri = f"mongodb://{host}:{port}"
|
|
||||||
|
|
||||||
client = pymongo.MongoClient(uri)
|
|
||||||
cls.db = client[db_name]
|
|
||||||
# 测试连接
|
|
||||||
client.server_info()
|
|
||||||
logger.success("MongoDB连接成功!")
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"初始化MongoDB失败: {str(e)}")
|
|
||||||
raise
|
|
||||||
|
|
||||||
def calculate_information_content(text):
|
def calculate_information_content(text):
|
||||||
"""计算文本的信息量(熵)"""
|
"""计算文本的信息量(熵)"""
|
||||||
char_count = Counter(text)
|
char_count = Counter(text)
|
||||||
@@ -941,7 +905,15 @@ def visualize_graph_lite(memory_graph: Memory_graph, color_by_memory: bool = Fal
|
|||||||
async def main():
|
async def main():
|
||||||
# 初始化数据库
|
# 初始化数据库
|
||||||
logger.info("正在初始化数据库连接...")
|
logger.info("正在初始化数据库连接...")
|
||||||
db = Database.get_instance()
|
Database.initialize(
|
||||||
|
uri=os.getenv("MONGODB_URI"),
|
||||||
|
host=os.getenv("MONGODB_HOST", "127.0.0.1"),
|
||||||
|
port=int(os.getenv("MONGODB_PORT", "27017")),
|
||||||
|
db_name=os.getenv("DATABASE_NAME", "MegBot"),
|
||||||
|
username=os.getenv("MONGODB_USERNAME"),
|
||||||
|
password=os.getenv("MONGODB_PASSWORD"),
|
||||||
|
auth_source=os.getenv("MONGODB_AUTH_SOURCE"),
|
||||||
|
)
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
|
|
||||||
test_pare = {'do_build_memory':False,'do_forget_topic':False,'do_visualize_graph':True,'do_query':False,'do_merge_memory':False}
|
test_pare = {'do_build_memory':False,'do_forget_topic':False,'do_visualize_graph':True,'do_query':False,'do_merge_memory':False}
|
||||||
@@ -1008,9 +980,6 @@ async def main():
|
|||||||
else:
|
else:
|
||||||
print("未找到相关记忆。")
|
print("未找到相关记忆。")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
import asyncio
|
import asyncio
|
||||||
asyncio.run(main())
|
asyncio.run(main())
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ driver = get_driver()
|
|||||||
config = driver.config
|
config = driver.config
|
||||||
|
|
||||||
Database.initialize(
|
Database.initialize(
|
||||||
|
uri=config.MONGODB_URI,
|
||||||
host=config.MONGODB_HOST,
|
host=config.MONGODB_HOST,
|
||||||
port=int(config.MONGODB_PORT),
|
port=int(config.MONGODB_PORT),
|
||||||
db_name=config.DATABASE_NAME,
|
db_name=config.DATABASE_NAME,
|
||||||
@@ -22,7 +23,6 @@ Database.initialize(
|
|||||||
auth_source=config.MONGODB_AUTH_SOURCE
|
auth_source=config.MONGODB_AUTH_SOURCE
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class ScheduleGenerator:
|
class ScheduleGenerator:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
# 根据global_config.llm_normal这一字典配置指定模型
|
# 根据global_config.llm_normal这一字典配置指定模型
|
||||||
|
|||||||
13
template.env
13
template.env
@@ -5,13 +5,18 @@ PORT=8080
|
|||||||
PLUGINS=["src2.plugins.chat"]
|
PLUGINS=["src2.plugins.chat"]
|
||||||
|
|
||||||
# 默认配置
|
# 默认配置
|
||||||
MONGODB_HOST=127.0.0.1 # 如果工作在Docker下,请改成 MONGODB_HOST=mongodb
|
# 如果工作在Docker下,请改成 MONGODB_HOST=mongodb
|
||||||
|
MONGODB_HOST=127.0.0.1
|
||||||
MONGODB_PORT=27017
|
MONGODB_PORT=27017
|
||||||
DATABASE_NAME=MegBot
|
DATABASE_NAME=MegBot
|
||||||
|
|
||||||
MONGODB_USERNAME = "" # 默认空值
|
# 也可以使用 URI 连接数据库(优先级比上面的高)
|
||||||
MONGODB_PASSWORD = "" # 默认空值
|
# MONGODB_URI=mongodb://127.0.0.1:27017/MegBot
|
||||||
MONGODB_AUTH_SOURCE = "" # 默认空值
|
|
||||||
|
# MongoDB 认证信息,若需要认证,请取消注释以下三行并填写正确的信息
|
||||||
|
# MONGODB_USERNAME=user
|
||||||
|
# MONGODB_PASSWORD=password
|
||||||
|
# MONGODB_AUTH_SOURCE=admin
|
||||||
|
|
||||||
#key and url
|
#key and url
|
||||||
CHAT_ANY_WHERE_BASE_URL=https://api.chatanywhere.tech/v1
|
CHAT_ANY_WHERE_BASE_URL=https://api.chatanywhere.tech/v1
|
||||||
|
|||||||
Reference in New Issue
Block a user