diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..19a58796 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,17 @@ + +- 🔴**当前项目处于重构阶段(2025.3.14-)** +- ✅ 接受:与main直接相关的Bug修复:提交到main-fix分支 +- ⚠️ 冻结:所有新功能开发和非紧急重构 + +# 请填写以下内容 +(删除掉中括号内的空格,并替换为**小写的x**) +1. - [ ] `main` 分支 **禁止修改**,请确认本次提交的分支 **不是 `main` 分支** +2. - [ ] 本次更新 **包含破坏性变更**(如数据库结构变更、配置文件修改等) +3. - [ ] 本次更新是否经过测试 +4. - [ ] 请**不要**在数据库中添加group_id字段,这会影响本项目对其他平台的兼容 +5. 请填写破坏性更新的具体内容(如有): +6. 请简要说明本次更新的内容和目的: +# 其他信息 +- **关联 Issue**:Close # +- **截图/GIF**: +- **附加信息**: diff --git a/.github/workflows/precheck.yml b/.github/workflows/precheck.yml new file mode 100644 index 00000000..a7524ccb --- /dev/null +++ b/.github/workflows/precheck.yml @@ -0,0 +1,29 @@ +# .github/workflows/precheck.yml +name: PR Precheck +on: [pull_request] + +jobs: + conflict-check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Check Conflicts + run: | + git fetch origin main + if git diff --name-only --diff-filter=U origin/main...HEAD | grep .; then + echo "CONFLICT=true" >> $GITHUB_ENV + fi + labeler: + runs-on: ubuntu-latest + needs: conflict-check + steps: + - uses: actions/github-script@v6 + if: env.CONFLICT == 'true' + with: + script: | + github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + labels: ['🚫冲突需处理'] + }) diff --git a/.github/workflows/ruff.yml b/.github/workflows/ruff.yml index 0d1e50c5..fc986c0c 100644 --- a/.github/workflows/ruff.yml +++ b/.github/workflows/ruff.yml @@ -5,4 +5,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: astral-sh/ruff-action@v3 \ No newline at end of file + + - uses: astral-sh/ruff-action@v3 + diff --git a/README.md b/README.md index 5de6f5df..f1c25ea6 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,81 @@ +# 关于项目分支调整与贡献指南的重要通知 +
+ + - 📂 致所有为麦麦提交过贡献,以及想要为麦麦提交贡献的朋友们! + +--- + +**📢 关于项目分支调整与贡献指南的重要通知** +**致所有关注MaiMBot的开发者与贡献者:** + +首先,我们由衷感谢大家近期的热情参与!感谢大家对MaiMBot的喜欢,项目突然受到广泛关注让我们倍感惊喜,也深深感受到开源社区的温暖力量。为了保障项目长期健康发展,我们不得不对开发流程做出重要调整,恳请理解与支持。 + +--- + +### **📌 本次调整的核心原因** + +1. **维护团队精力有限** + 核心成员(包括我本人)均为在校学生/在职开发者,近期涌入的大量PR和意见已远超我们的处理能力。为确保本职工作与项目质量,我们必须优化协作流程。 + +2. **重构核心架构的紧迫性** + 当前我们正与核心团队全力重构项目底层逻辑,这是为未来扩展性、性能提升打下的必要基础,需要高度专注。 + +3. **保障现有用户的稳定性** + 我们深知许多用户已依赖当前版本,因此必须划分清晰的维护边界,确保生产环境可用性。 + +--- + +### **🌿 全新分支策略与贡献指南** + +为平衡上述目标,即日起启用以下分支结构: + +| 分支 | 定位 | 接受PR类型 | 提交对象 | +| ---------- | ---------------------------- | --------------------------------------------- | ---------------- | +| `main` | **稳定版**(供下载使用) | 仅接受来自`main-fix`的合并 | 维护团队直接管理 | +| `main-fix` | 生产环境紧急修复 | 明确的功能缺陷修复(需附带复现步骤/测试用例) | 所有开发者 | +| `refactor` | 重构版(**不兼容当前main**) | 仅重构与相关Bug修复 | 重构小组维护 | + +--- + +### **⚠️ 对现有PR的处理说明** + +由于分支结构调整,**GitHub已自动关闭所有未合并的PR**,这并非否定您的贡献价值!如果您认为自己的PR符合以下条件: + +- 属于`main-fix`明确的**功能性缺陷修复**(非功能增强) ,包括非预期行为和严重报错,需要发布issue讨论确定。 +- 属于`refactor`分支的**重构适配性修复** + +**欢迎您重新提交到对应分支**,并在PR描述中标注`[Re-submit from closed PR]`,我们将优先审查。其他类型PR暂缓受理,但您的创意我们已记录在案,未来重构完成后将重新评估。 + +--- + +### **🙏 致谢与协作倡议** + +- 感谢每一位提交Issue、PR、参与讨论的开发者!您的每一行代码都是maim吃的 +- 特别致敬在交流群中积极答疑的社区成员,你们自发维护的氛围令人感动❤️ ,maim哭了 +- **重构期间的非代码贡献同样珍贵**:文档改进、测试用例补充、用户反馈整理等,欢迎通过Issue认领任务! + +--- + +### **📬 高效协作小贴士** + +1. **提交前请先讨论**:创建Issue描述问题,确认是否符合`main-fix`修复范围 +2. **对重构提出您的想法**:如果您对重构版有自己的想法,欢迎提交讨论issue亟需测试伙伴,欢迎邮件联系`team@xxx.org`报名 +3. **部分main-fix的功能在issue讨论后,经过严格讨论,一致决定可以添加功能改动或修复的,可以提交pr** + +--- + +**谢谢大家谢谢大家谢谢大家谢谢大家谢谢大家谢谢大家!** +虽然此刻不得不放缓脚步,但这一切都是为了跳得更高。期待在重构完成后与各位共建更强大的版本! + +千石可乐 敬上 +2025年3月14日 + +
+ + + + + # 麦麦!MaiMBot (编辑中)
diff --git a/config/bot_config - 副本.toml b/config/bot_config - 副本.toml new file mode 100644 index 00000000..2361ddcc --- /dev/null +++ b/config/bot_config - 副本.toml @@ -0,0 +1,207 @@ +[inner] +version = "0.0.8" + +#如果你想要修改配置文件,请在修改后将version的值进行变更 +#如果新增项目,请在BotConfig类下新增相应的变量 +#1.如果你修改的是[]层级项目,例如你新增了 [memory],那么请在config.py的 load_config函数中的include_configs字典中新增"内容":{ +#"func":memory, +#"support":">=0.0.0", #新的版本号 +#"necessary":False #是否必须 +#} +#2.如果你修改的是[]下的项目,例如你新增了[memory]下的 memory_ban_words ,那么请在config.py的 load_config函数中的 memory函数下新增版本判断: + # if config.INNER_VERSION in SpecifierSet(">=0.0.2"): + # config.memory_ban_words = set(memory_config.get("memory_ban_words", [])) + +[bot] +qq = 2020986255 +nickname = "蓝" +alias_names = [] + +[personality] +prompt_personality = [ + "全名夏目蓝,和群友很熟络,美术造诣不错,的高中语文女教师。今年46岁却依然没有和任何人谈过恋爱,但对恋爱话题很在行。说话直来直去,脾气很好,温柔待人。经常怀念自己的叫圭的弟弟,不过不会轻易提起他的名字。有群友艾特自己或者提到了自己就会回复,看见感兴趣的话题也会插嘴。会记住群友的id,能分辨出不同群友。群友让自己记住的话,也会悄悄记在心里。不需要提到所有特点。", + "是一个女大学生,你有黑色头发,你会刷小红书", # 小红书人格 + "是一个女大学生,你会刷b站,对ACG文化感兴趣" # b站人格 + ] +personality_1_probability = 1.0 # 第一种人格出现概率 +personality_2_probability = 0.0 # 第二种人格出现概率 +personality_3_probability = 0.0 # 第三种人格出现概率,请确保三个概率相加等于1 +prompt_schedule = "全名夏目蓝,和群友很熟络,会自言自语,熟悉美术史的高中语文女教师。今年46岁却依然未婚,但提到恋爱相关的话题的时候却总想参与。不擅长厨艺,但是因为独居生活,所以经常下厨。" + +[message] +min_text_length = 3 # 与麦麦聊天时麦麦只会回答文本大于等于此数的消息 +max_context_size = 10 # 麦麦获得的上文数量 +emoji_chance = 0.1 # 麦麦使用表情包的概率 +thinking_timeout = 120 # 麦麦思考时间 + +response_willing_amplifier = 1 # 麦麦回复意愿放大系数,一般为1 +response_interested_rate_amplifier = 1 # 麦麦回复兴趣度放大系数,听到记忆里的内容时放大系数 +down_frequency_rate = 3.5 # 降低回复频率的群组回复意愿降低系数 +ban_words = [ + # "403","张三" + ] + +ban_msgs_regex = [ + # 需要过滤的消息(原始消息)匹配的正则表达式,匹配到的消息将被过滤(支持CQ码),若不了解正则表达式请勿修改 + #"https?://[^\\s]+", # 匹配https链接 + #"\\d{4}-\\d{2}-\\d{2}", # 匹配日期 + # "\\[CQ:at,qq=\\d+\\]" # 匹配@ +] + +[emoji] +check_interval = 120 # 检查表情包的时间间隔 +register_interval = 10 # 注册表情包的时间间隔 +auto_save = true # 自动偷表情包 +enable_check = false # 是否启用表情包过滤 +check_prompt = "符合公序良俗" # 表情包过滤要求 + +[cq_code] +enable_pic_translate = false + +[response] +model_r1_probability = 0.8 # 麦麦回答时选择主要回复模型1 模型的概率 +model_v3_probability = 0.1 # 麦麦回答时选择次要回复模型2 模型的概率 +model_r1_distill_probability = 0.1 # 麦麦回答时选择次要回复模型3 模型的概率 +max_response_length = 1024 # 麦麦回答的最大token数 + +[memory] +build_memory_interval = 600 # 记忆构建间隔 单位秒 间隔越低,麦麦学习越多,但是冗余信息也会增多 +memory_compress_rate = 0.1 # 记忆压缩率 控制记忆精简程度 建议保持默认,调高可以获得更多信息,但是冗余信息也会增多 + +forget_memory_interval = 600 # 记忆遗忘间隔 单位秒 间隔越低,麦麦遗忘越频繁,记忆更精简,但更难学习 +memory_forget_time = 24 #多长时间后的记忆会被遗忘 单位小时 +memory_forget_percentage = 0.01 # 记忆遗忘比例 控制记忆遗忘程度 越大遗忘越多 建议保持默认 + + +memory_ban_words = [ #不希望记忆的词 + # "403","张三" +] + +[mood] +mood_update_interval = 1.0 # 情绪更新间隔 单位秒 +mood_decay_rate = 0.95 # 情绪衰减率 +mood_intensity_factor = 1.0 # 情绪强度因子 + +[keywords_reaction] # 针对某个关键词作出反应 +enable = true # 关键词反应功能的总开关 + +[[keywords_reaction.rules]] # 如果想要新增多个关键词,直接复制本条,修改keywords和reaction即可 +enable = true # 是否启用此条(为了人类在未来AI战争能更好地识别AI(bushi),默认开启) +keywords = []#"人机", "bot", "机器", "入机", "robot", "机器人"] # 会触发反应的关键词 +reaction = "有人说你是人机或者机器人,否定这一事实,攻击或反问他。注意,只有认为你是机器人才回复,否则不要否认" # 触发之后添加的提示词 + +[[keywords_reaction.rules]] # 就像这样复制 +enable = false # 仅作示例,不会触发 +keywords = ["测试关键词回复","test",""] +reaction = "回答“测试成功”" + +[chinese_typo] +enable = true # 是否启用中文错别字生成器 +error_rate=0.006 # 单字替换概率 +min_freq=7 # 最小字频阈值 +tone_error_rate=0.2 # 声调错误概率 +word_replace_rate=0.006 # 整词替换概率 + +[others] +enable_advance_output = true # 是否启用高级输出 +enable_kuuki_read = true # 是否启用读空气功能 +enable_debug_output = false # 是否启用调试输出 +enable_friend_chat = false # 是否启用好友聊天 + +[shares] +daily_share_willing = 0.1 # 基础分享意愿 +daily_share_interval = 3600 # 日常分享检查间隔(秒) +daily_share_time_start = 8 # 日常分享开始时间(小时) +daily_share_time_end = 22 # 日常分享结束时间(小时) +daily_share_prompt = "现在,根据你今天的日程,生成一条日常分享发送到群聊中,讲述你的上一个日程是什么,在日程中发生了什么有意思或者值得思考的事情。尽量不要涉及日本文化,注意,只需要输出日常分享,不要输出其他任何内容,不要使用破折号和括号,不要对这件事进行评价,也不要提到之后的日程是什么,字数不要超过50字,说话尽量自然。" + +[groups] +talk_allowed = [ + 767432546,#临时存放群 + 824710135,#don群 + 966509573,#夏目蓝 + 106857205,#gal群 + 872919536,#测试二群 + 867897493,#421群聊已跑路 +] #可以回复消息的群 +talk_frequency_down = [] #降低回复频率的群 +ban_user_id = [] #禁止回复消息的QQ号 + +[shares_allow_groups] +shares_allow_groups = [ + #767432546,#临时存放群 + 824710135,#don群 + #966509573,#夏目蓝 + 106857205,#gal群 + #872919536,#测试二群 + #867897493,#421群聊已跑路 +] #可以分享日常的群 + +#V3 +#name = "deepseek-chat" +#base_url = "DEEP_SEEK_BASE_URL" +#key = "DEEP_SEEK_KEY" + +#R1 +#name = "deepseek-reasoner" +#base_url = "DEEP_SEEK_BASE_URL" +#key = "DEEP_SEEK_KEY" + +#下面的模型若使用硅基流动则不需要更改,使用ds官方则改成.env.prod自定义的宏,使用自定义模型则选择定位相似的模型自己填写 + +#推理模型: + +[model.llm_reasoning] #回复模型1 主要回复模型 +name = "deepseek-reasoner" +provider = "DEEP_SEEK" +pri_in = 0 #模型的输入价格(非必填,可以记录消耗) +pri_out = 0 #模型的输出价格(非必填,可以记录消耗) + + +[model.llm_reasoning_minor] #回复模型3 次要回复模型 +name = "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B" +provider = "SILICONFLOW" + +#非推理模型 + +[model.llm_normal] #V3 回复模型2 次要回复模型 +name = "deepseek-chat" +provider = "DEEP_SEEK" + +[model.llm_normal_minor] #V2.5 +name = "deepseek-ai/DeepSeek-V2.5" +provider = "SILICONFLOW" + +[model.llm_emotion_judge] #主题判断 0.7/m +name = "Qwen/Qwen2.5-14B-Instruct" +provider = "SILICONFLOW" + +[model.llm_topic_judge] #主题判断:建议使用qwen2.5 7b +name = "Pro/Qwen/Qwen2.5-7B-Instruct" +provider = "SILICONFLOW" + +[model.llm_summary_by_topic] #建议使用qwen2.5 32b 及以上 +name = "Qwen/Qwen2.5-32B-Instruct" +provider = "SILICONFLOW" +pri_in = 0 +pri_out = 0 + +[model.moderation] #内容审核 未启用 +name = "" +provider = "SILICONFLOW" +pri_in = 0 +pri_out = 0 + +# 识图模型 + +[model.vlm] #图像识别 0.35/m +name = "Pro/Qwen/Qwen2-VL-7B-Instruct" +provider = "SILICONFLOW" + + + +#嵌入模型 + +[model.embedding] #嵌入 +name = "BAAI/bge-m3" +provider = "SILICONFLOW"