Merge branch 'master' of https://github.com/MoFox-Studio/MoFox_Bot
This commit is contained in:
167
EULA.md
167
EULA.md
@@ -1,143 +1,94 @@
|
|||||||
# **MoFox_Bot最终用户许可协议**
|
# **欢迎使用 MoFox_Bot (第三方修改版)!**
|
||||||
**版本:V1.1**
|
|
||||||
**更新日期:2025年8月26日**
|
|
||||||
**生效日期:2025年8月26日**
|
|
||||||
**适用的MoFox_Bot版本号:所有版本**
|
|
||||||
|
|
||||||
**2025© MoFox_Bot项目团队**
|
**版本:V2.1**
|
||||||
|
**更新日期:2025年8月30日**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 一、一般条款
|
你好!感谢你选择 MoFox_Bot。在开始之前,请花几分钟时间阅读这份协议。我们用问答的形式,帮助你快速了解使用这个**第三方修改版**软件时,你的权利和责任。
|
||||||
|
|
||||||
**1.1** MoFox_Bot项目(包括MoFox_Bot的源代码、可执行文件、文档,以及其它在本协议中所列出的文件)(以下简称“本项目”)是由开发者及贡献者(以下简称“项目团队”)共同维护,为用户提供自动回复功能的机器人代码项目。以下最终用户许可协议(EULA,以下简称“本协议”)是用户(以下简称“您”)与项目团队之间关于使用本项目所订立的合同条件。
|
**简单来说,你需要同意这份协议才能使用我们的软件。** 如果你是未成年人,请确保你的监护人也阅读并同意了哦。
|
||||||
|
|
||||||
**1.2** 在运行或使用本项目之前,您**必须阅读并同意本协议的所有条款**。未成年人或其它无/不完全民事行为能力责任人请**在监护人的陪同下**阅读并同意本协议。如果您不同意,则不得运行或使用本项目。在这种情况下,您应立即从您的设备上卸载或删除本项目及其所有副本。
|
---
|
||||||
|
|
||||||
|
### **1. 这个软件和原版有什么关系?**
|
||||||
|
|
||||||
## 二、许可授权
|
这是一个非常重要的问题!
|
||||||
|
|
||||||
### 源代码许可
|
* **第三方修改版**:首先,你需要清楚地知道,MoFox_Bot 是一个基于[MaiCore](https://mai-mai.org/)开源项目的**第三方修改版**。我们(MoFox_Bot 团队)与原始项目的开发者**没有任何关联**。
|
||||||
**2.1** 您**了解**本项目的源代码是基于GPLv3(GNU通用公共许可证第三版)开源协议发布的。您**可以自由使用、修改、分发**本项目的源代码,但**必须遵守**GPLv3许可证的要求。详细内容请参阅项目仓库中的LICENSE文件。
|
* **独立维护**:我们独立负责这个修改版的维护、开发和更新。因此,原始项目的开发者**不会**为 MoFox_Bot 提供任何技术支持,也**不会**对因使用本修改版产生的任何问题负责。
|
||||||
|
* **责任划分**:我们只对我们修改、添加的功能负责。对于原始代码中可能存在的任何问题,我们不承担责任。
|
||||||
|
|
||||||
**2.2** 您**了解**本项目的源代码中可能包含第三方开源代码,这些代码的许可证可能与GPLv3许可证不同。您**同意**在使用这些代码时**遵守**相应的许可证要求。
|
---
|
||||||
|
|
||||||
|
### **2. 这个软件是免费和开源的吗?**
|
||||||
|
|
||||||
### 输入输出内容授权
|
**是的,核心代码是开源的!**
|
||||||
|
|
||||||
**2.3** 您**了解**本项目是使用您的配置信息、提交的指令(以下简称“输入内容”)和生成的内容(以下简称“输出内容”)构建请求发送到第三方API生成回复的机器人项目。
|
* **遵循开源协议**:本项目继承了原始项目的 **GPLv3 开源协议**。这意味着你可以自由地使用、复制、研究、修改和重新分发它。
|
||||||
|
* **你的义务**:当你修改或分发这个软件时,你同样需要遵守 GPLv3 协议的要求,确保你的衍生作品也是开源的。你可以在项目根目录找到 `LICENSE` 文件来了解更多细节。
|
||||||
|
* **包含第三方代码**:请注意,项目中可能还包含了其他第三方库或组件,它们各自有独立的开源许可证。你在使用时需要同时遵守这些许可证。
|
||||||
|
|
||||||
**2.4** 您**授权**本项目使用您的输入和输出内容按照项目的隐私政策用于以下行为:
|
---
|
||||||
- 调用第三方API生成回复;
|
|
||||||
- 调用第三方API用于构建本项目专用的存储于您部署或使用的数据库中的知识库和记忆库;
|
|
||||||
- 收集并记录本项目专用的存储于您部署或使用的设备中的日志;
|
|
||||||
|
|
||||||
**2.5** 您**了解**本项目的源代码中包含第三方API的调用代码,这些API的使用可能受到第三方的服务条款和隐私政策的约束。在使用这些API时,您**必须遵守**相应的服务条款。
|
### **3. 我的个人数据是如何被处理的?**
|
||||||
|
|
||||||
**2.6** 项目团队**不对**第三方API的服务质量、稳定性、准确性、安全性负责,亦**不对**第三方API的服务变更、终止、限制等行为负责。
|
你的隐私对我们很重要。了解数据如何流动,能帮助你更好地保护自己。
|
||||||
|
|
||||||
|
* **工作流程**:当你与机器人互动时,你的**输入内容**(比如文字、指令)、**配置信息**以及机器人**生成的回复**,会被发送给第三方的 API 服务(例如 OpenAI、Google 等大语言模型提供商)以获得智能回复。
|
||||||
|
* **你的明确授权**:一旦你开始使用,即表示你授权我们利用你的数据进行以下操作:
|
||||||
|
1. **调用外部 API**:这是机器人能与你对话的核心。
|
||||||
|
2. **建立本地知识库与记忆**:为了让机器人更个性化、更懂你,软件会在**你自己的设备上**创建和存储知识库、记忆库和对话日志。**这些数据存储在本地,我们无法访问。**
|
||||||
|
3. **记录本地日志**:为了方便排查可能出现的技术问题,软件会在你的设备上记录运行日志。
|
||||||
|
* **第三方服务的风险**:我们无法控制第三方 API 提供商的服务质量、数据处理政策、稳定性或安全性。使用这些服务时,你同样受到该第三方服务条款和隐私政策的约束。我们建议你自行了解这些条款。
|
||||||
|
|
||||||
### 插件系统授权和责任免责
|
---
|
||||||
|
|
||||||
**2.7** 您**了解**本项目包含插件系统功能,允许加载和使用由第三方开发者(非MoFox_Bot核心开发组成员)开发的插件。这些第三方插件可能具有独立的许可证条款和使用协议。
|
### **4. 关于强大的插件系统,我需要了解什么?**
|
||||||
|
|
||||||
**2.8** 您**了解并同意**:
|
MoFox_Bot 通过插件系统实现功能扩展,但这需要你承担相应的责任。
|
||||||
- 第三方插件的开发、维护、分发由其各自的开发者负责,**与MaiBot项目团队无关**;
|
|
||||||
- 第三方插件的功能、质量、安全性、合规性**完全由插件开发者负责**;
|
|
||||||
- MoFox_Bot项目团队**仅提供**插件系统的技术框架,**不对**任何第三方插件的内容、行为或后果承担责任;
|
|
||||||
- 您使用任何第三方插件的风险**完全由您自行承担**;
|
|
||||||
|
|
||||||
**2.9** 在使用第三方插件前,您**应当**:
|
* **谁开发的插件?**:绝大多数插件是由**社区里的第三方开发者**创建和维护的,他们并**不是 MoFox_Bot 核心团队的成员**。
|
||||||
- 仔细阅读并遵守插件开发者提供的许可证条款和使用协议;
|
* **责任完全自负**:插件的功能、质量、安全性和合法性**完全由其各自的开发者负责**。我们只提供了一个能让插件运行的技术平台,但**不对任何第三方插件的内容、行为或造成的后果承担任何责任**。
|
||||||
- 自行评估插件的安全性、合规性和适用性;
|
* **你的使用风险**:使用任何第三方插件的风险**完全由你自行承担**。在安装和使用插件前,我们强烈建议你:
|
||||||
- 确保插件的使用符合您所在地区的法律法规要求;
|
* 仔细阅读并理解插件开发者提供的许可协议和说明文档。
|
||||||
|
* **只从你完全信任的来源获取和安装插件**。
|
||||||
|
* 自行评估插件的安全性、合法性及其对你数据隐私的影响。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 三、用户行为
|
### **5. 我在使用时,有哪些行为准则?**
|
||||||
|
|
||||||
**3.1** 您**了解**本项目会将您的配置信息、输入指令和生成内容发送到第三方API,您**不应**在输入指令和生成内容中包含以下内容:
|
请务必合法、合规地使用本软件。
|
||||||
- 涉及任何国家或地区秘密、商业秘密或其他可能会对国家或地区安全或者公共利益造成不利影响的数据;
|
|
||||||
- 涉及个人隐私、个人信息或其他敏感信息的数据;
|
|
||||||
- 任何侵犯他人合法权益的内容;
|
|
||||||
- 任何违反国家或地区法律法规、政策规定的内容;
|
|
||||||
|
|
||||||
**3.2** 您**不应**将本项目用于以下用途:
|
* **禁止内容**:严禁输入、处理或传播任何违反你所在地法律法规的内容,包括但不限于:涉及国家秘密、商业机密、侵犯他人知识产权、个人隐私的内容,以及任何形式的非法、骚扰、诽谤、淫秽信息。
|
||||||
- 违反任何国家或地区法律法规、政策规定的行为;
|
* **合法用途**:你承诺不会将本项目用于任何非法目的或活动,例如网络攻击、诈骗等。
|
||||||
|
* **数据安全**:你对自己存储在本地知识库、记忆库和日志中的所有内容的合法性负全部责任。
|
||||||
|
* **插件规范**:不要使用任何已知包含恶意代码、安全漏洞或违法内容的插件。
|
||||||
|
|
||||||
**3.3** 您**应当**自行确保您被存储在本项目的知识库、记忆库和日志中的输入和输出内容的合法性与合规性以及存储行为的合法性与合规性。您需**自行承担**由此产生的任何法律责任。
|
**你将对自己使用本项目(包括所有第三方插件)的全部行为及其产生的一切后果,承担完全的法律责任。**
|
||||||
|
|
||||||
**3.4** 对于第三方插件的使用,您**不应**:
|
---
|
||||||
- 使用可能存在安全漏洞、恶意代码或违法内容的插件;
|
|
||||||
- 通过插件进行任何违反法律法规的行为;
|
|
||||||
- 将插件用于侵犯他人权益或危害系统安全的用途;
|
|
||||||
|
|
||||||
**3.5** 您**承诺**对使用第三方插件的行为及其后果承担**完全责任**,包括但不限于因插件缺陷、恶意行为或不当使用造成的任何损失或法律纠纷。
|
### **6. 免责声明(非常重要!)**
|
||||||
|
|
||||||
|
* **“按原样”提供**:本项目是“按原样”提供的,我们**不提供任何形式的明示或暗示的担保**,包括但不限于对适销性、特定用途适用性和不侵权的保证。
|
||||||
|
* **AI 回复的立场**:机器人的所有回复均由第三方大语言模型生成,其观点和信息**不代表 MoFox_Bot 团队的立场**。我们不对其准确性、完整性或可靠性负责。
|
||||||
|
* **无责任声明**:在任何情况下,MoFox_Bot 团队均不对因使用或无法使用本项目(特别是第三方插件)而导致的任何直接、间接、偶然、特殊或后果性的损害(包括但不限于数据丢失、利润损失、业务中断)承担责任。
|
||||||
|
* **插件支持**:所有第三方插件的技术支持、功能更新和 bug 修复,都应**直接联系相应的插件开发者**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 四、免责条款
|
### **7. 其他条款**
|
||||||
|
|
||||||
**4.1** 本项目的输出内容依赖第三方API,**不受**项目团队控制,亦**不代表**项目团队的观点。
|
* **协议的修改**:我们保留随时修改本协议的权利。修改后的协议将在新版本发布时生效。我们建议你定期检查以获取最新版本。继续使用本项目即表示你接受修订后的协议。
|
||||||
|
* **最终解释权**:在法律允许的范围内,MoFox_Bot 团队保留对本协议的最终解释权。
|
||||||
|
* **适用法律**:本协议的订立、执行和解释及争议的解决均应适用中国法律。
|
||||||
|
|
||||||
**4.2** 除本协议条目2.4提到的隐私政策之外,项目团队**不会**对您提供任何形式的担保,亦**不对**使用本项目的造成的任何后果负责。
|
---
|
||||||
|
|
||||||
**4.3** 关于第三方插件,项目团队**明确声明**:
|
### **风险提示(请再次确认你已理解!)**
|
||||||
- 项目团队**不对**任何第三方插件的功能、安全性、稳定性、合规性或适用性提供任何形式的保证或担保;
|
|
||||||
- 项目团队**不对**因使用第三方插件而产生的任何直接或间接损失、数据丢失、系统故障、安全漏洞、法律纠纷或其他后果承担责任;
|
|
||||||
- 第三方插件的质量问题、技术支持、bug修复等事宜应**直接联系插件开发者**,与项目团队无关;
|
|
||||||
- 项目团队**保留**在不另行通知的情况下,对插件系统功能进行修改、限制或移除的权利;
|
|
||||||
|
|
||||||
## 五、其他条款
|
* **隐私风险**:你的对话数据会被发送到不受我们控制的第三方 API。请**绝对不要**在对话中包含任何个人身份信息、财务信息、密码或其他敏感数据。
|
||||||
|
* **精神健康风险**:AI 机器人只是一个程序,无法提供真正的情感支持或专业的心理建议。如果遇到任何心理困扰,请务必寻求专业人士的帮助(例如,全国心理援助热线:12355)。
|
||||||
**5.1** 项目团队有权**随时修改本协议的条款**,但**没有**义务通知您。修改后的协议将在本项目的新版本中生效,您应定期检查本协议的最新版本。
|
* **插件风险**:这是最大的风险之一。第三方插件可能带来严重的安全漏洞、系统不稳定、性能下降甚至隐私数据泄露的风险。请务必谨慎选择和使用,并为自己的选择承担全部后果。
|
||||||
|
|
||||||
**5.2** 项目团队**保留**本协议的最终解释权。
|
|
||||||
|
|
||||||
|
|
||||||
## 附录:其他重要须知
|
|
||||||
|
|
||||||
### 一、过往版本使用条件追溯
|
|
||||||
|
|
||||||
**1.1** 对于本项目此前未配备 EULA 协议的版本,自本协议发布之日起,若用户希望继续使用本项目,应在本协议生效后的合理时间内,通过升级到最新版本并同意本协议全部条款。若在本版协议生效日(2025年8月26日)之后,用户仍使用此前无 EULA 协议的项目版本且未同意本协议,则用户无权继续使用,项目方有权采取措施阻止其使用行为,并保留追究相关法律责任的权利。
|
|
||||||
|
|
||||||
|
|
||||||
### 二、风险提示
|
|
||||||
|
|
||||||
**2.1 隐私安全风险**
|
|
||||||
|
|
||||||
- 本项目会将您的配置信息、输入指令和生成内容发送到第三方API,而这些API的服务质量、稳定性、准确性、安全性不受项目团队控制。
|
|
||||||
- 本项目会收集您的输入和输出内容,用于构建本项目专用的知识库和记忆库,以提高回复的准确性和连贯性。
|
|
||||||
|
|
||||||
**因此,为了保障您的隐私信息安全,请注意以下事项:**
|
|
||||||
|
|
||||||
- 避免在涉及个人隐私、个人信息或其他敏感信息的环境中使用本项目;
|
|
||||||
- 避免在不可信的环境中使用本项目;
|
|
||||||
|
|
||||||
**2.2 精神健康风险**
|
|
||||||
|
|
||||||
本项目仅为工具型机器人,不具备情感交互能力。建议用户:
|
|
||||||
- 避免过度依赖AI回复处理现实问题或情绪困扰;
|
|
||||||
- 如感到心理不适,请及时寻求专业心理咨询服务。
|
|
||||||
- 如遇心理困扰,请寻求专业帮助(全国心理援助热线:12355)。
|
|
||||||
|
|
||||||
**2.3 第三方插件风险**
|
|
||||||
|
|
||||||
本项目的插件系统允许加载第三方开发的插件,这可能带来以下风险:
|
|
||||||
- **安全风险**:第三方插件可能包含恶意代码、安全漏洞或未知的安全威胁;
|
|
||||||
- **稳定性风险**:插件可能导致系统崩溃、性能下降或功能异常;
|
|
||||||
- **隐私风险**:插件可能收集、传输或泄露您的个人信息和数据;
|
|
||||||
- **合规风险**:插件的功能或行为可能违反相关法律法规或平台规则;
|
|
||||||
- **兼容性风险**:插件可能与主程序或其他插件产生冲突;
|
|
||||||
|
|
||||||
**因此,在使用第三方插件时,请务必:**
|
|
||||||
|
|
||||||
- 仅从可信来源获取和安装插件;
|
|
||||||
- 在安装前仔细了解插件的功能、权限和开发者信息;
|
|
||||||
- 定期检查和更新已安装的插件;
|
|
||||||
- 如发现插件异常行为,请立即停止使用并卸载;
|
|
||||||
- 对插件的使用后果承担完全责任;
|
|
||||||
|
|
||||||
### 三、其他
|
|
||||||
**3.1 争议解决**
|
|
||||||
- 本协议适用中国法律,争议提交相关地区法院管辖;
|
|
||||||
- 若因GPLv3许可产生纠纷,以许可证官方解释为准。
|
|
||||||
|
|||||||
54
PRIVACY.md
54
PRIVACY.md
@@ -1,28 +1,48 @@
|
|||||||
### MoFox_Bot用户隐私条款
|
### MoFox_Bot 隐私说明
|
||||||
**版本:V1.1**
|
|
||||||
**更新日期:2025年8月26日**
|
**版本:** 1.1
|
||||||
|
**更新于: 2025年8月30日**
|
||||||
**生效日期:2025年8月26日**
|
**生效日期:2025年8月26日**
|
||||||
**适用的MoFox_Bot版本号:所有版本**
|
**适用的MoFox_Bot版本号:所有版本**
|
||||||
|
|
||||||
**2025© MoFox_Bot项目团队**
|
**2025© MoFox_Bot项目团队*
|
||||||
|
|
||||||
MaiBot项目团队(以下简称项目团队)**尊重并保护**用户(以下简称您)的隐私。若您选择使用MoFox_Bot项目(以下简称本项目),则您需同意本项目按照以下隐私条款处理您的输入和输出内容:
|
我们(MoFox_Bot 项目团队)非常重视您的隐私。当您使用 MoFox_Bot 时,代表您同意我们按照本说明处理您的信息。
|
||||||
|
|
||||||
**1.1** 本项目**会**收集您的输入和输出内容并发送到第三方API,用于生成新的输出内容。因此您的输入和输出内容**会**同时受到本项目和第三方API的隐私政策约束。
|
---
|
||||||
|
|
||||||
**1.2** 本项目**会**收集您的输入和输出内容,用于构建本项目专用的仅存储在您使用的数据库中的知识库和记忆库,以提高回复的准确性和连贯性。
|
#### 我们如何处理您的信息?
|
||||||
|
|
||||||
**1.3** 本项目**会**收集您的输入和输出内容,用于生成仅存储于您部署或使用的设备中的不会上传至互联网的日志。但当您向项目团队反馈问题时,项目团队可能需要您提供日志文件以帮助解决问题。
|
1. **对话内容与第三方服务**
|
||||||
|
* 为了让机器人回复您,我们会将您的对话内容发送给第三方 AI 服务(比如 OpenAI、Google 等)。
|
||||||
|
* 因此,您的对话会同时受到我们的隐私说明和第三方服务隐私政策的约束。
|
||||||
|
|
||||||
**1.4** 本项目可能**会**收集部分统计信息(如使用频率、基础指令类型)以改进服务,您可在[bot_config.toml]中随时关闭此功能**。
|
2. **本地知识库与记忆**
|
||||||
|
* 我们会在您自己的设备上,利用您的对话内容来构建专属的知识库和记忆库。
|
||||||
|
* 这样做能让机器人的回复更贴切、更连贯。这些数据**只会存储在您的本地**。
|
||||||
|
|
||||||
**1.5** 关于第三方插件的隐私处理:
|
3. **本地日志文件**
|
||||||
- 本项目包含插件系统,允许加载第三方开发者开发的插件;
|
* 我们会在您的设备上记录程序运行日志,用于排查问题。这些日志**不会上传到网络**。
|
||||||
- **第三方插件可能会**收集、处理、存储或传输您的数据,这些行为**完全由插件开发者控制**,与项目团队无关;
|
* 只有当您需要技术支持并主动将日志文件发送给我们时,我们才会看到这些信息。
|
||||||
- 项目团队**无法监控或控制**第三方插件的数据处理行为,亦**无法保证**第三方插件的隐私安全性;
|
|
||||||
- 第三方插件的隐私政策**由插件开发者负责制定和执行**,您应直接向插件开发者了解其隐私处理方式;
|
|
||||||
- 您使用第三方插件时,**需自行评估**插件的隐私风险并**自行承担**相关后果;
|
|
||||||
|
|
||||||
**1.6** 由于您的自身行为或不可抗力等情形,导致上述可能涉及您隐私或您认为是私人信息的内容发生被泄露、批漏,或被第三方获取、使用、转让等情形的,均由您**自行承担**不利后果,我们对此**不承担**任何责任。**特别地,因使用第三方插件而导致的任何隐私泄露或数据安全问题,项目团队概不负责。**
|
---
|
||||||
|
|
||||||
**1.7** 项目团队保留在未来更新隐私条款的权利,但没有义务通知您。若您不同意更新后的隐私条款,您应立即停止使用本项目。
|
#### 关于第三方插件
|
||||||
|
|
||||||
|
* **请注意:** 您可以为 MoFox_Bot 安装由其他开发者制作的“插件”。
|
||||||
|
* 这些插件可能会收集、处理或发送您的数据。**它们的行为由插件开发者决定,我们无法控制。**
|
||||||
|
* 我们无法保证第三方插件的安全性。在使用前,请务必了解其独立的隐私政策。
|
||||||
|
* **因使用第三方插件导致的任何隐私风险,需要您自行承担。**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### 责任声明
|
||||||
|
|
||||||
|
* 如果因为您自己的操作、或者其他不可抗力因素导致您的信息泄露,您需要自行承担后果,我们不承担责任。
|
||||||
|
* **再次强调:** 对于因使用**第三方插件**而产生的任何隐私或数据安全问题,我们概不负责。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### 条款更新
|
||||||
|
|
||||||
|
* 我们将来可能会更新本隐私说明。如果我们更新了,您继续使用就代表您同意新的条款。如果您不同意,请停止使用。
|
||||||
172
README.md
172
README.md
@@ -1,38 +1,60 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
# 🌟 麦麦Fork!MoFox_Bot
|
# 🌟 MoFox_Bot
|
||||||
|
|
||||||
|
**🚀 基于 MaiCore 的增强版 AI 智能体,提供更完善的功能和更好的使用体验**
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<strong>🚀 基于 MaiCore 的增强版智能体,提供更完善的功能和更好的使用体验</strong>
|
<a href="https://www.python.org/">
|
||||||
|
<img src="https://img.shields.io/badge/Python-3.10+-3776ab?logo=python&logoColor=white&style=for-the-badge" alt="Python">
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/MoFox-Studio/MoFox_Bot/blob/master/LICENSE">
|
||||||
|
<img src="https://img.shields.io/badge/License-GPLv3-d73a49?logo=gnu&logoColor=white&style=for-the-badge" alt="License">
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/MoFox-Studio/MoFox_Bot/graphs/contributors">
|
||||||
|
<img src="https://img.shields.io/badge/Contributors-Welcome-brightgreen?logo=github&logoColor=white&style=for-the-badge" alt="Contributors">
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/MoFox-Studio/MoFox_Bot/stargazers">
|
||||||
|
<img src="https://img.shields.io/github/stars/MoFox-Studio/MoFox_Bot?style=for-the-badge&logo=star&logoColor=white&color=yellow&label=Stars" alt="Stars">
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/MoFox-Studio/MoFox_Bot/releases">
|
||||||
|
<img src="https://img.shields.io/github/v/release/MoFox-Studio/MoFox_Bot?style=for-the-badge&logo=github&logoColor=white&color=orange" alt="Release">
|
||||||
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
[](https://www.python.org/)
|
|
||||||
[](https://github.com/MoFox-Studio/MoFox_Bot/blob/master/LICENSE)
|
|
||||||
[](https://github.com/MoFox-Studio/MoFox_Bot/graphs/contributors)
|
|
||||||
[](https://github.com/MoFox-Studio/MoFox_Bot/stargazers)
|
|
||||||
[](https://github.com/MoFox-Studio/MoFox_Bot/releases)
|
|
||||||
[](https://github.com/NapNeko/NapCatQQ)
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
## 📖 项目介绍
|
## 📖 项目介绍
|
||||||
|
|
||||||
**MoFox_Bot** 是基于 MaiCore 的增强版智能体,在保留原版 `0.10.0 snapshot.5` 所有功能的基础上,提供了更完善的功能、更好的稳定性和更丰富的使用体验。
|
**MoFox_Bot** 是一个基于 [MaiCore](https://github.com/MaiM-with-u/MaiBot) `0.10.0 snapshot.5` 版本的增强型 `fork` 项目。
|
||||||
|
我们在保留原版所有功能的基础上,进行了一系列的改进和功能拓展,致力于提供更强的稳定性、更丰富的功能和更流畅的用户体验。
|
||||||
|
|
||||||
> [!IMPORTANT]
|
> [!IMPORTANT]
|
||||||
> **请注意!** 这个版本的所有后续更新均为我们的第三方更新,不代表 MaiBot 官方立场
|
> **第三方项目声明**
|
||||||
|
>
|
||||||
|
> 本项目是由 **MoFox Studio** 独立维护的第三方项目,并非 MaiBot 官方版本。
|
||||||
|
> 所有后续更新和维护均由我们团队负责,与 MaiBot 官方无直接关系。
|
||||||
|
|
||||||
> [!WARNING]
|
> [!WARNING]
|
||||||
> **迁移提醒!** 从官方版本到 MoFox_Bot 版本迁移暂时存在问题,因为数据库结构有改变
|
> **迁移风险提示**
|
||||||
|
>
|
||||||
|
> 由于我们对数据库结构进行了重构和优化,从 MaiBot 官方版本直接迁移到 MoFox_Bot **可能会遇到数据不兼容的问题**。
|
||||||
|
> 在迁移前,请务必做好数据备份。
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
## ✨ 功能特性
|
## ✨ 功能特性
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td width="50%">
|
<td width="50%">
|
||||||
@@ -68,120 +90,100 @@
|
|||||||
</table>
|
</table>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
## 🔧 系统要求
|
## 🔧 系统要求
|
||||||
|
|
||||||
在开始使用之前,请确保你的系统满足以下要求:
|
### 💻 基础环境
|
||||||
|
|
||||||
<table>
|
| 项目 | 要求 |
|
||||||
<tr>
|
| ------------ | ---------------------------------------------------- |
|
||||||
<td width="50%">
|
| 🖥️ 操作系统 | Windows 10/11, macOS 10.14+, Linux (Ubuntu 18.04+) |
|
||||||
|
| 🐍 Python 版本 | Python 3.10 或更高版本 |
|
||||||
### 💻 基础要求
|
| 💾 内存 | 建议 4GB 以上可用内存 |
|
||||||
|
| 💿 存储空间 | 至少 2GB 可用空间 |
|
||||||
| 项目 | 要求 |
|
|
||||||
|------|------|
|
|
||||||
| 🖥️ **操作系统** | Windows 10/11, macOS 10.14+, Linux (Ubuntu 18.04+) |
|
|
||||||
| 🐍 **Python 版本** | Python 3.10 或更高版本 |
|
|
||||||
| 💾 **内存** | 建议 4GB 以上可用内存 |
|
|
||||||
| 💿 **存储空间** | 至少 2GB 可用空间 |
|
|
||||||
|
|
||||||
</td>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<td width="50%">
|
|
||||||
|
|
||||||
### 🛠️ 依赖服务
|
### 🛠️ 依赖服务
|
||||||
|
|
||||||
| 服务 | 描述 |
|
| 服务 | 描述 |
|
||||||
|------|------|
|
| ------------ | ------------------------------------------ |
|
||||||
| 🤖 **QQ协议端** | [NapCat](https://github.com/NapNeko/NapCatQQ) 或其他兼容协议端 |
|
| 🤖 QQ 协议端 | [NapCatQQ](https://github.com/NapNeko/NapCatQQ) 或其他兼容协议端 |
|
||||||
| 🗃️ **数据库** | SQLite (内置) 或 MySQL (可选) |
|
| 🗃️ 数据库 | SQLite (内置) 或 MySQL (可选) |
|
||||||
| 🔧 **管理工具** | chat2db (可选) |
|
| 🔧 管理工具 | Chat2DB (可选,用于数据库管理) |
|
||||||
|
|
||||||
</td>
|
</div>
|
||||||
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
## 🏁 快速开始
|
## 🏁 快速开始
|
||||||
|
|
||||||
### 📦 安装部署
|
### 📦 安装与部署
|
||||||
|
|
||||||
```bash
|
</div>
|
||||||
# 克隆项目
|
|
||||||
git clone https://github.com/MoFox-Studio/MoFox_Bot.git
|
|
||||||
cd MoFox_Bot
|
|
||||||
|
|
||||||
# 安装依赖
|
> [!NOTE]
|
||||||
pip install -r requirements.txt
|
> 详细的安装和配置步骤,请务必参考我们的官方文档:
|
||||||
|
> * **Windows 用户部署指南**: [https://mofox-studio.github.io/MoFox-Bot-Docs/docs/deployment_guide.html](https://mofox-studio.github.io/MoFox-Bot-Docs/docs/deployment_guide.html)
|
||||||
|
> * **`bot_config.toml` 究极详细教程**: [https://mofox-studio.github.io/MoFox-Bot-Docs/docs/guides/bot_config_guide.html](https://mofox-studio.github.io/MoFox-Bot-Docs/docs/guides/bot_config_guide.html)
|
||||||
|
|
||||||
# 配置机器人
|
<div align="center">
|
||||||
cp config/bot_config.toml.example config/bot_config.toml
|
|
||||||
# 编辑配置文件...
|
|
||||||
|
|
||||||
# 启动机器人
|
### ⚙️ 配置要点
|
||||||
python bot.py
|
|
||||||
```
|
|
||||||
|
|
||||||
### ⚙️ 配置说明
|
1. 📝 **核心配置**: 修改 `config/bot_config.toml` 中的基础设置,如 LLM API Key 等。
|
||||||
|
2. 🤖 **协议端配置**: 设置 NapCatQQ 或其他兼容的 QQ 协议端,确保通信正常。
|
||||||
|
3. 🗃️ **数据库配置**: 根据需求选择 SQLite 或配置你的 MySQL 服务器。
|
||||||
|
4. 🔌 **插件配置**: 在 `config/plugins/` 目录下按需配置插件。
|
||||||
|
|
||||||
1. 📝 **编辑配置文件** - 修改 `config/bot_config.toml` 中的基本设置
|
</div>
|
||||||
2. 🤖 **配置协议端** - 设置 NapCat 或其他兼容的 QQ 协议端
|
|
||||||
3. 🗃️ **数据库配置** - 选择 SQLite 或 MySQL 作为数据存储
|
|
||||||
4. 🔌 **插件配置** - 在 `config/plugins/` 目录下配置所需插件
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
## 🙏 致谢
|
## 🙏 致谢
|
||||||
|
|
||||||
我们衷心感谢以下优秀的开源项目:
|
我们衷心感谢以下优秀的开源项目,没有它们,就没有 MoFox_Bot。
|
||||||
|
|
||||||
<div align="center">
|
| 项目 | 描述 | 贡献 |
|
||||||
|
| ------------------------------------------ | -------------------- | ---------------- |
|
||||||
| 项目 | 描述 | 贡献 |
|
| 🎯 [MaiM-with-u/MaiBot](https://github.com/MaiM-with-u/MaiBot) | 原版 MaiBot 项目 | 提供优秀的基础框架 |
|
||||||
|------|------|------|
|
| 🐱 [NapNeko/NapCatQQ](https://github.com/NapNeko/NapCatQQ) | 基于 NTQQ 的 Bot 协议端 | 现代化的 QQ 协议实现 |
|
||||||
| 🎯 [MaiM-with-u](https://github.com/MaiM-with-u/MaiBot) | 原版 MaiBot 项目 | 提供优秀的基础框架 |
|
| 🌌 [internetsb/Maizone](https://github.com/internetsb/Maizone) | 魔改空间插件 | 插件部分功能借鉴 |
|
||||||
| 🐱 [NapCat](https://github.com/NapNeko/NapCatQQ) | 基于 NTQQ 的 Bot 协议端 | 现代化的 QQ 协议实现 |
|
|
||||||
| 🌌 [Maizone](https://github.com/internetsb/Maizone) | 魔改空间插件 | 插件部分功能借鉴 |
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
## ⚠️ 注意事项
|
## ⚠️ 注意事项
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> **重要提醒**
|
> **重要提醒**
|
||||||
>
|
>
|
||||||
> 使用本项目前必须阅读和同意 [📋 用户协议](EULA.md) 和 [🔒 隐私协议](PRIVACY.md)
|
> - 使用本项目前,你必须阅读并同意 [**📋 用户协议 (EULA.md)**](EULA.md)。
|
||||||
>
|
> - 本应用生成的内容来自人工智能大模型,请仔细甄别其准确性,并请勿用于任何违反法律法规的用途。
|
||||||
> 本应用生成内容来自人工智能模型,由 AI 生成,请仔细甄别,请勿用于违反法律的用途
|
> - AI 生成的所有内容不代表本项目团队的任何观点和立场。
|
||||||
>
|
|
||||||
> AI 生成内容不代表本项目团队的观点和立场
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📄 开源协议
|
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
**本项目基于 [GPL-3.0](LICENSE) 协议开源**
|
## 📄 开源协议
|
||||||
|
|
||||||
|
本项目基于 **[GPL-3.0](LICENSE)** 协议开源。
|
||||||
|
|
||||||
[](LICENSE)
|
[](LICENSE)
|
||||||
|
|
||||||
```
|
```
|
||||||
Copyright © 2024 MoFox Studio
|
Copyright © 2025 MoFox Studio
|
||||||
Licensed under the GNU General Public License v3.0
|
Licensed under the GNU General Public License v3.0
|
||||||
```
|
```
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -192,8 +194,8 @@ Licensed under the GNU General Public License v3.0
|
|||||||
|
|
||||||
**🌟 如果这个项目对你有帮助,请给我们一个 Star!**
|
**🌟 如果这个项目对你有帮助,请给我们一个 Star!**
|
||||||
|
|
||||||
**💬 有问题或建议?欢迎提 Issue 或 PR!**
|
**💬 有任何问题或建议?欢迎提交 Issue 或 Pull Request!**
|
||||||
|
|
||||||
Made with ❤️ by [MoFox Studio](https://github.com/MoFox-Studio)
|
*Made with ❤️ by [MoFox Studio](https://github.com/MoFox-Studio)*
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -8,8 +8,6 @@ Bilibili 工具基础模块
|
|||||||
import re
|
import re
|
||||||
import aiohttp
|
import aiohttp
|
||||||
import asyncio
|
import asyncio
|
||||||
import tempfile
|
|
||||||
import os
|
|
||||||
from typing import Optional, Dict, Any
|
from typing import Optional, Dict, Any
|
||||||
from src.common.logger import get_logger
|
from src.common.logger import get_logger
|
||||||
from src.chat.utils.utils_video import get_video_analyzer
|
from src.chat.utils.utils_video import get_video_analyzer
|
||||||
|
|||||||
@@ -429,7 +429,7 @@ class ActionPlanner:
|
|||||||
schedule_block = ""
|
schedule_block = ""
|
||||||
if global_config.schedule.enable:
|
if global_config.schedule.enable:
|
||||||
if current_activity := schedule_manager.get_current_activity():
|
if current_activity := schedule_manager.get_current_activity():
|
||||||
schedule_block = f"你当前正在:{current_activity}。"
|
schedule_block = f"你当前正在:{current_activity},但注意它与群聊的聊天无关。"
|
||||||
|
|
||||||
mood_block = ""
|
mood_block = ""
|
||||||
if global_config.mood.enable_mood:
|
if global_config.mood.enable_mood:
|
||||||
|
|||||||
@@ -92,12 +92,14 @@ class ChromaDBImpl(VectorDBBase):
|
|||||||
collection = self.get_or_create_collection(collection_name)
|
collection = self.get_or_create_collection(collection_name)
|
||||||
if collection:
|
if collection:
|
||||||
try:
|
try:
|
||||||
return collection.query(
|
query_params = {
|
||||||
query_embeddings=query_embeddings,
|
"query_embeddings": query_embeddings,
|
||||||
n_results=n_results,
|
"n_results": n_results,
|
||||||
where=where or {},
|
|
||||||
**kwargs,
|
**kwargs,
|
||||||
)
|
}
|
||||||
|
if where:
|
||||||
|
query_params["where"] = where
|
||||||
|
return collection.query(**query_params)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"查询集合 '{collection_name}' 失败: {e}")
|
logger.error(f"查询集合 '{collection_name}' 失败: {e}")
|
||||||
return {}
|
return {}
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ from src.config.official_configs import (
|
|||||||
DependencyManagementConfig,
|
DependencyManagementConfig,
|
||||||
WebSearchConfig,
|
WebSearchConfig,
|
||||||
AntiPromptInjectionConfig,
|
AntiPromptInjectionConfig,
|
||||||
PluginsConfig,
|
|
||||||
SleepSystemConfig,
|
SleepSystemConfig,
|
||||||
MonthlyPlanSystemConfig,
|
MonthlyPlanSystemConfig,
|
||||||
CrossContextConfig,
|
CrossContextConfig,
|
||||||
@@ -389,7 +388,6 @@ class Config(ValidatedConfigBase):
|
|||||||
video_analysis: VideoAnalysisConfig = Field(default_factory=lambda: VideoAnalysisConfig(), description="视频分析配置")
|
video_analysis: VideoAnalysisConfig = Field(default_factory=lambda: VideoAnalysisConfig(), description="视频分析配置")
|
||||||
dependency_management: DependencyManagementConfig = Field(default_factory=lambda: DependencyManagementConfig(), description="依赖管理配置")
|
dependency_management: DependencyManagementConfig = Field(default_factory=lambda: DependencyManagementConfig(), description="依赖管理配置")
|
||||||
web_search: WebSearchConfig = Field(default_factory=lambda: WebSearchConfig(), description="网络搜索配置")
|
web_search: WebSearchConfig = Field(default_factory=lambda: WebSearchConfig(), description="网络搜索配置")
|
||||||
plugins: PluginsConfig = Field(default_factory=lambda: PluginsConfig(), description="插件配置")
|
|
||||||
sleep_system: SleepSystemConfig = Field(default_factory=lambda: SleepSystemConfig(), description="睡眠系统配置")
|
sleep_system: SleepSystemConfig = Field(default_factory=lambda: SleepSystemConfig(), description="睡眠系统配置")
|
||||||
monthly_plan_system: MonthlyPlanSystemConfig = Field(default_factory=lambda: MonthlyPlanSystemConfig(), description="月层计划系统配置")
|
monthly_plan_system: MonthlyPlanSystemConfig = Field(default_factory=lambda: MonthlyPlanSystemConfig(), description="月层计划系统配置")
|
||||||
cross_context: CrossContextConfig = Field(default_factory=lambda: CrossContextConfig(), description="跨群聊上下文共享配置")
|
cross_context: CrossContextConfig = Field(default_factory=lambda: CrossContextConfig(), description="跨群聊上下文共享配置")
|
||||||
|
|||||||
@@ -600,13 +600,6 @@ class AntiPromptInjectionConfig(ValidatedConfigBase):
|
|||||||
shield_suffix: str = Field(default=" 🛡️", description="保护后缀")
|
shield_suffix: str = Field(default=" 🛡️", description="保护后缀")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class PluginsConfig(ValidatedConfigBase):
|
|
||||||
"""插件配置"""
|
|
||||||
|
|
||||||
centralized_config: bool = Field(default=True, description="是否启用插件配置集中化管理")
|
|
||||||
|
|
||||||
|
|
||||||
class SleepSystemConfig(ValidatedConfigBase):
|
class SleepSystemConfig(ValidatedConfigBase):
|
||||||
"""睡眠系统配置类"""
|
"""睡眠系统配置类"""
|
||||||
|
|
||||||
|
|||||||
@@ -458,54 +458,35 @@ class PluginBase(ABC):
|
|||||||
加载插件配置文件,实现集中化管理和自动迁移。
|
加载插件配置文件,实现集中化管理和自动迁移。
|
||||||
|
|
||||||
处理逻辑:
|
处理逻辑:
|
||||||
1. 确定插件模板配置文件路径(位于插件目录内)。
|
1. 确定用户配置文件路径(位于 `config/plugins/` 目录下)。
|
||||||
2. 如果模板不存在,则在插件目录内生成一份默认配置。
|
2. 如果用户配置文件不存在,则根据 config_schema 直接在中央目录生成一份。
|
||||||
3. 确定用户配置文件路径(位于 `config/plugins/` 目录下)。
|
3. 加载用户配置文件,并进行版本检查和自动迁移(如果需要)。
|
||||||
4. 如果用户配置文件不存在,则从插件目录复制模板文件过去。
|
4. 最终加载的配置是用户配置文件。
|
||||||
5. 加载用户配置文件,并进行版本检查和自动迁移(如果需要)。
|
|
||||||
6. 最终加载的配置是用户配置文件。
|
|
||||||
"""
|
"""
|
||||||
if not self.config_file_name:
|
if not self.config_file_name:
|
||||||
logger.debug(f"{self.log_prefix} 未指定配置文件,跳过加载")
|
logger.debug(f"{self.log_prefix} 未指定配置文件,跳过加载")
|
||||||
return
|
return
|
||||||
|
|
||||||
# 1. 确定插件模板配置文件路径
|
# 1. 确定并确保用户配置文件路径存在
|
||||||
template_config_path = os.path.join(self.plugin_dir, self.config_file_name)
|
user_config_path = os.path.join(CONFIG_DIR, "plugins", self.plugin_name, self.config_file_name)
|
||||||
|
os.makedirs(os.path.dirname(user_config_path), exist_ok=True)
|
||||||
|
|
||||||
# 2. 如果模板不存在,则在插件目录内生成
|
# 2. 如果用户配置文件不存在,直接在中央目录生成
|
||||||
if not os.path.exists(template_config_path):
|
|
||||||
logger.info(f"{self.log_prefix} 插件目录缺少配置文件 {template_config_path},将生成默认配置。")
|
|
||||||
self._generate_and_save_default_config(template_config_path)
|
|
||||||
|
|
||||||
# 3. 确定用户配置文件路径
|
|
||||||
plugin_config_dir = os.path.join(CONFIG_DIR, "plugins", self.plugin_name)
|
|
||||||
user_config_path = os.path.join(plugin_config_dir, self.config_file_name)
|
|
||||||
|
|
||||||
# 确保用户插件配置目录存在
|
|
||||||
os.makedirs(plugin_config_dir, exist_ok=True)
|
|
||||||
|
|
||||||
# 4. 如果用户配置文件不存在,从模板复制
|
|
||||||
if not os.path.exists(user_config_path):
|
if not os.path.exists(user_config_path):
|
||||||
try:
|
logger.info(f"{self.log_prefix} 用户配置文件 {user_config_path} 不存在,将生成默认配置。")
|
||||||
shutil.copy2(template_config_path, user_config_path)
|
self._generate_and_save_default_config(user_config_path)
|
||||||
logger.info(f"{self.log_prefix} 已从模板创建用户配置文件: {user_config_path}")
|
|
||||||
except IOError as e:
|
|
||||||
logger.error(f"{self.log_prefix} 复制配置文件失败: {e}", exc_info=True)
|
|
||||||
# 如果复制失败,后续将无法加载,直接返回
|
|
||||||
return
|
|
||||||
|
|
||||||
# 检查最终的用户配置文件是否存在
|
# 检查最终的用户配置文件是否存在
|
||||||
if not os.path.exists(user_config_path):
|
if not os.path.exists(user_config_path):
|
||||||
logger.warning(f"{self.log_prefix} 用户配置文件 {user_config_path} 不存在且无法创建。")
|
logger.warning(f"{self.log_prefix} 用户配置文件 {user_config_path} 不存在且无法创建。")
|
||||||
return
|
return
|
||||||
|
|
||||||
# 5. 加载、检查和迁移用户配置文件
|
# 3. 加载、检查和迁移用户配置文件
|
||||||
_, file_ext = os.path.splitext(self.config_file_name)
|
_, file_ext = os.path.splitext(self.config_file_name)
|
||||||
if file_ext.lower() != ".toml":
|
if file_ext.lower() != ".toml":
|
||||||
logger.warning(f"{self.log_prefix} 不支持的配置文件格式: {file_ext},仅支持 .toml")
|
logger.warning(f"{self.log_prefix} 不支持的配置文件格式: {file_ext},仅支持 .toml")
|
||||||
self.config = {}
|
self.config = {}
|
||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with open(user_config_path, "r", encoding="utf-8") as f:
|
with open(user_config_path, "r", encoding="utf-8") as f:
|
||||||
existing_config = toml.load(f) or {}
|
existing_config = toml.load(f) or {}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import os
|
import os
|
||||||
|
import shutil
|
||||||
|
import hashlib
|
||||||
import traceback
|
import traceback
|
||||||
import importlib
|
import importlib
|
||||||
|
|
||||||
@@ -37,6 +39,48 @@ class PluginManager:
|
|||||||
self._ensure_plugin_directories()
|
self._ensure_plugin_directories()
|
||||||
logger.info("插件管理器初始化完成")
|
logger.info("插件管理器初始化完成")
|
||||||
|
|
||||||
|
def _synchronize_plugin_config(self, plugin_name: str, plugin_dir: str):
|
||||||
|
"""
|
||||||
|
同步单个插件的配置。
|
||||||
|
"""
|
||||||
|
central_config_dir = os.path.join("config", "plugins", plugin_name)
|
||||||
|
plugin_config_dir = os.path.join(plugin_dir, "config")
|
||||||
|
|
||||||
|
# 确保中央配置目录存在
|
||||||
|
os.makedirs(central_config_dir, exist_ok=True)
|
||||||
|
|
||||||
|
# 1. 从插件目录同步到中央目录(如果中央配置不存在)
|
||||||
|
if os.path.exists(plugin_config_dir) and os.path.isdir(plugin_config_dir):
|
||||||
|
for filename in os.listdir(plugin_config_dir):
|
||||||
|
central_config_file = os.path.join(central_config_dir, filename)
|
||||||
|
plugin_config_file = os.path.join(plugin_config_dir, filename)
|
||||||
|
|
||||||
|
if not os.path.exists(central_config_file) and os.path.isfile(plugin_config_file):
|
||||||
|
shutil.copy2(plugin_config_file, central_config_file)
|
||||||
|
logger.info(f"从 {plugin_name} 复制默认配置到中央目录: {filename}")
|
||||||
|
|
||||||
|
# 2. 从中央目录同步到插件目录(覆盖)
|
||||||
|
if os.path.isdir(central_config_dir):
|
||||||
|
for filename in os.listdir(central_config_dir):
|
||||||
|
central_config_file = os.path.join(central_config_dir, filename)
|
||||||
|
plugin_config_file = os.path.join(plugin_config_dir, filename)
|
||||||
|
|
||||||
|
if not os.path.isfile(central_config_file):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 确保插件的 config 目录存在
|
||||||
|
os.makedirs(plugin_config_dir, exist_ok=True)
|
||||||
|
|
||||||
|
should_copy = True
|
||||||
|
if os.path.exists(plugin_config_file):
|
||||||
|
with open(central_config_file, 'rb') as f1, open(plugin_config_file, 'rb') as f2:
|
||||||
|
if hashlib.md5(f1.read()).hexdigest() == hashlib.md5(f2.read()).hexdigest():
|
||||||
|
should_copy = False
|
||||||
|
|
||||||
|
if should_copy:
|
||||||
|
shutil.copy2(central_config_file, plugin_config_file)
|
||||||
|
logger.info(f"同步中央配置到 {plugin_name}: {filename}")
|
||||||
|
|
||||||
# === 插件目录管理 ===
|
# === 插件目录管理 ===
|
||||||
|
|
||||||
def add_plugin_directory(self, directory: str) -> bool:
|
def add_plugin_directory(self, directory: str) -> bool:
|
||||||
@@ -104,6 +148,9 @@ class PluginManager:
|
|||||||
if not plugin_dir:
|
if not plugin_dir:
|
||||||
return False, 1
|
return False, 1
|
||||||
|
|
||||||
|
# 同步插件配置
|
||||||
|
self._synchronize_plugin_config(plugin_name, plugin_dir)
|
||||||
|
|
||||||
plugin_instance = plugin_class(plugin_dir=plugin_dir) # 实例化插件(可能因为缺少manifest而失败)
|
plugin_instance = plugin_class(plugin_dir=plugin_dir) # 实例化插件(可能因为缺少manifest而失败)
|
||||||
if not plugin_instance:
|
if not plugin_instance:
|
||||||
logger.error(f"插件 {plugin_name} 实例化失败")
|
logger.error(f"插件 {plugin_name} 实例化失败")
|
||||||
|
|||||||
16
src/plugins/built_in/set_typing_status/_manifest.json
Normal file
16
src/plugins/built_in/set_typing_status/_manifest.json
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "Set Typing Status",
|
||||||
|
"description": "一个在LLM生成回复时设置私聊输入状态的插件。",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"author": {
|
||||||
|
"name": "MoFox-Studio"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"homepage_url": "",
|
||||||
|
"repository_url": "",
|
||||||
|
"keywords": ["typing", "status", "private chat"],
|
||||||
|
"categories": ["utility"],
|
||||||
|
"host_application": {
|
||||||
|
"min_version": "0.10.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
64
src/plugins/built_in/set_typing_status/plugin.py
Normal file
64
src/plugins/built_in/set_typing_status/plugin.py
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
from typing import List, Tuple, Type
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from src.plugin_system import (
|
||||||
|
BasePlugin,
|
||||||
|
register_plugin,
|
||||||
|
ComponentInfo,
|
||||||
|
BaseEventHandler,
|
||||||
|
EventType,
|
||||||
|
)
|
||||||
|
from src.plugin_system.base.base_event import HandlerResult
|
||||||
|
from src.plugin_system.apis import send_api
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class SetTypingStatusHandler(BaseEventHandler):
|
||||||
|
"""在LLM处理私聊消息后设置“正在输入”状态的事件处理器。"""
|
||||||
|
|
||||||
|
handler_name = "set_typing_status_handler"
|
||||||
|
handler_description = "在LLM生成回复后,将用户的聊天状态设置为“正在输入”。"
|
||||||
|
init_subscribe = [EventType.POST_LLM]
|
||||||
|
|
||||||
|
async def execute(self, params: dict) -> HandlerResult:
|
||||||
|
message = params.get("message")
|
||||||
|
if not message or not message.is_private_message:
|
||||||
|
return HandlerResult(success=True, continue_process=True)
|
||||||
|
|
||||||
|
user_id = message.message_info.user_info.user_id
|
||||||
|
if not user_id:
|
||||||
|
return HandlerResult(success=False, continue_process=True, message="无法获取用户ID")
|
||||||
|
|
||||||
|
try:
|
||||||
|
params = {"user_id": user_id,"event_type": 1}
|
||||||
|
await send_api.adapter_command_to_stream(
|
||||||
|
action="set_input_status",
|
||||||
|
params=params,
|
||||||
|
stream_id=message.stream_id,
|
||||||
|
)
|
||||||
|
logger.debug(f"成功为用户 {user_id} 设置“正在输入”状态。")
|
||||||
|
return HandlerResult(success=True, continue_process=True)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"为用户 {user_id} 设置“正在输入”状态时出错: {e}")
|
||||||
|
return HandlerResult(success=False, continue_process=True, message=str(e))
|
||||||
|
|
||||||
|
|
||||||
|
@register_plugin
|
||||||
|
class SetTypingStatusPlugin(BasePlugin):
|
||||||
|
"""一个在LLM生成回复时设置私聊输入状态的插件。"""
|
||||||
|
|
||||||
|
plugin_name = "set_typing_status"
|
||||||
|
enable_plugin = True
|
||||||
|
dependencies = []
|
||||||
|
python_dependencies = []
|
||||||
|
config_file_name = ""
|
||||||
|
|
||||||
|
config_schema = {}
|
||||||
|
|
||||||
|
def get_plugin_components(self) -> List[Tuple[ComponentInfo, Type]]:
|
||||||
|
"""注册插件的功能组件。"""
|
||||||
|
return [(SetTypingStatusHandler.get_handler_info(), SetTypingStatusHandler)]
|
||||||
|
|
||||||
|
def register_plugin(self) -> bool:
|
||||||
|
return True
|
||||||
@@ -77,7 +77,7 @@ class MonthlyPlanManager:
|
|||||||
if len(plans) > max_plans:
|
if len(plans) > max_plans:
|
||||||
logger.warning(f"当前月度计划数量 ({len(plans)}) 超出上限 ({max_plans}),将自动删除多余的计划。")
|
logger.warning(f"当前月度计划数量 ({len(plans)}) 超出上限 ({max_plans}),将自动删除多余的计划。")
|
||||||
# 按创建时间升序排序(旧的在前),然后删除超出上限的部分(新的)
|
# 按创建时间升序排序(旧的在前),然后删除超出上限的部分(新的)
|
||||||
plans_to_delete = sorted(plans, key=lambda p: p.created_at)[max_plans:]
|
plans_to_delete = sorted(plans, key=lambda p: p.created_at, reverse=True)[:len(plans)-max_plans]
|
||||||
delete_ids = [p.id for p in plans_to_delete]
|
delete_ids = [p.id for p in plans_to_delete]
|
||||||
delete_plans_by_ids(delete_ids)
|
delete_plans_by_ids(delete_ids)
|
||||||
# 重新获取计划列表
|
# 重新获取计划列表
|
||||||
@@ -138,6 +138,14 @@ class MonthlyPlanManager:
|
|||||||
finally:
|
finally:
|
||||||
self.generation_running = False
|
self.generation_running = False
|
||||||
|
|
||||||
|
def trigger_generate_monthly_plans(self, target_month: Optional[str] = None):
|
||||||
|
"""
|
||||||
|
以非阻塞的方式启动月度计划生成任务。
|
||||||
|
这允许其他模块(如ScheduleManager)触发计划生成,而无需等待其完成。
|
||||||
|
"""
|
||||||
|
logger.info(f"已触发 {target_month or '当前月份'} 的非阻塞月度计划生成任务。")
|
||||||
|
asyncio.create_task(self.generate_monthly_plans(target_month))
|
||||||
|
|
||||||
def _get_previous_month(self, current_month: str) -> str:
|
def _get_previous_month(self, current_month: str) -> str:
|
||||||
"""获取上个月的月份字符串"""
|
"""获取上个月的月份字符串"""
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -231,17 +231,15 @@ class ScheduleManager:
|
|||||||
|
|
||||||
# 如果计划耗尽,则触发补充生成
|
# 如果计划耗尽,则触发补充生成
|
||||||
if not sampled_plans:
|
if not sampled_plans:
|
||||||
logger.info("可用的月度计划已耗尽或不足,尝试进行补充生成...")
|
logger.info("可用的月度计划已耗尽或不足,触发后台补充生成...")
|
||||||
from mmc.src.schedule.monthly_plan_manager import monthly_plan_manager
|
from mmc.src.schedule.monthly_plan_manager import monthly_plan_manager
|
||||||
|
|
||||||
success = await monthly_plan_manager.generate_monthly_plans(current_month_str)
|
# 以非阻塞方式触发月度计划生成
|
||||||
if success:
|
monthly_plan_manager.trigger_generate_monthly_plans(current_month_str)
|
||||||
logger.info("补充生成完成,重新抽取月度计划...")
|
|
||||||
sampled_plans = get_smart_plans_for_daily_schedule(
|
# 注意:这里不再等待生成结果,因此后续代码不会立即获得新计划。
|
||||||
current_month_str, max_count=3, avoid_days=avoid_days
|
# 日程将基于当前可用的信息生成,新计划将在下一次日程生成时可用。
|
||||||
)
|
logger.info("月度计划的后台生成任务已启动,本次日程将不包含新计划。")
|
||||||
else:
|
|
||||||
logger.warning("月度计划补充生成失败。")
|
|
||||||
|
|
||||||
if sampled_plans:
|
if sampled_plans:
|
||||||
plan_texts = "\n".join([f"- {plan.plan_text}" for plan in sampled_plans])
|
plan_texts = "\n".join([f"- {plan.plan_text}" for plan in sampled_plans])
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[inner]
|
[inner]
|
||||||
version = "6.5.8"
|
version = "6.6.0"
|
||||||
|
|
||||||
#----以下是给开发人员阅读的,如果你只是部署了MoFox-Bot,不需要阅读----
|
#----以下是给开发人员阅读的,如果你只是部署了MoFox-Bot,不需要阅读----
|
||||||
#如果你想要修改配置文件,请递增version的值
|
#如果你想要修改配置文件,请递增version的值
|
||||||
@@ -411,9 +411,6 @@ exa_api_keys = ["None"]# EXA API密钥列表,支持轮询机制
|
|||||||
enabled_engines = ["ddg"] # 启用的搜索引擎列表,可选: "exa", "tavily", "ddg","bing"
|
enabled_engines = ["ddg"] # 启用的搜索引擎列表,可选: "exa", "tavily", "ddg","bing"
|
||||||
search_strategy = "single" # 搜索策略: "single"(使用第一个可用引擎), "parallel"(并行使用所有启用的引擎), "fallback"(按顺序尝试,失败则尝试下一个)
|
search_strategy = "single" # 搜索策略: "single"(使用第一个可用引擎), "parallel"(并行使用所有启用的引擎), "fallback"(按顺序尝试,失败则尝试下一个)
|
||||||
|
|
||||||
[plugins] # 插件配置
|
|
||||||
centralized_config = true # 是否启用插件配置集中化管理
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------
|
# ----------------------------------------------------------------
|
||||||
# 月度计划系统设置 (Monthly Plan System Settings)
|
# 月度计划系统设置 (Monthly Plan System Settings)
|
||||||
# ----------------------------------------------------------------
|
# ----------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user