diff --git a/docs/CONTRIBUTE.md b/docs/CONTRIBUTE.md index c372aebe8..a7bfa93df 100644 --- a/docs/CONTRIBUTE.md +++ b/docs/CONTRIBUTE.md @@ -6,7 +6,7 @@ 首先,非常感谢你抽出时间来做贡献!❤️ -这份文档是告诉你,当你想向MaiCore提交代码,或者想要以其他形式加入MaiCore的开发,或周边插件的开发,你可以怎么做。 +这份文档是告诉你,当你想向MaiMbot-Pro-Max提交代码,或者想要以其他形式加入MaiMbot-Pro-Max的开发,或周边插件的开发,你可以怎么做。 我们鼓励并重视任何形式的贡献,但无序的贡献只会使麦麦的维护与更新变成一团糟。因此,我们建议您在做出贡献之前,先查看本指南。 @@ -39,8 +39,8 @@ ## 我想做贡献 > ### 项目所有权与维护 -> MaiMBot项目(现更名为MaiBot,核心为MaiCore)由千石可乐SengokuCola创建,采用GPL3开源协议。 -> MaiBot项目现已移动至MaiM-with-u组织下,目前主要内容由核心开发组维护,整体由核心开发组、reviewer和所有贡献者共同维护(该部分在未来将会明确)。 +> MaiMbot-Pro-Max项目(基于MaiBot修改,核心为MaiCore)由雅诺狐创建,采用GPL3开源协议。 +> MaiMbot-Pro-Max项目现已移动至MaiMbot-Pro-Max组织下,目前主要内容由核心开发组维护,整体由核心开发组、reviewer和所有贡献者共同维护(该部分在未来将会明确)。 > 为了保证设计的统一和节省不必要的精力,以及为了对项目有整体的把控,我们对不同类型的贡献采取不同的审核策略: > > #### 功能新增 @@ -66,11 +66,11 @@ ## 提出建议 -这一部分指导您如何为MaiCore/MaiBot提交一个建议,包括全新的功能和对现有功能的小改进。遵循这些指南将有助于维护人员和社区了解您的建议并找到相关的建议。 +这一部分指导您如何为MaiMbot-Pro-Max提交一个建议,包括全新的功能和对现有功能的小改进。遵循这些指南将有助于维护人员和社区了解您的建议并找到相关的建议。 在提交建议之前 -● 请确保您正在使用最新版本(正式版请查看main分支,测试版查看dev分支)。 +● 请确保您正在使用最新版本(正式版请查看master分支,测试版查看dev分支)。 ● 请确保您已经阅读了文档,以确认您的建议是否已经被实现,也许是通过单独的配置。 @@ -81,8 +81,8 @@ ● 请确保您的建议符合项目的范围和目标。你需要提出一个强有力的理由来说服项目的开发者这个功能的优点。请记住,我们希望的功能是对大多数用户有用的,而不仅仅是少数用户。如果你只是针对少数用户,请考虑编写一个插件。 ### 附(暂定): -核心组成员:@SengokuCola @tcmofashi @Rikki-Zero +核心组成员:@foxcyber907(雅诺狐) @Furina-1013-create(Navinatte)@tt-P607(言柒)@ikun-11451(ikun两年半)@minecraft1024a(一闪) -reviewer:核心组+MaiBot主仓库合作者/权限者 +reviewer:核心组+MaiMbot-Pro-Max主仓库合作者/权限者 贡献者:所有提交过贡献的用户 diff --git a/docs/PERMISSION_SYSTEM.md b/docs/PERMISSION_SYSTEM.md index 38687463c..94cc20639 100644 --- a/docs/PERMISSION_SYSTEM.md +++ b/docs/PERMISSION_SYSTEM.md @@ -2,7 +2,7 @@ ## 概述 -MaiBot的权限系统提供了完整的权限管理功能,支持权限等级和权限节点配置。系统包含以下核心概念: +MaiMbot-Pro-Max的权限系统提供了完整的权限管理功能,支持权限等级和权限节点配置。系统包含以下核心概念: - **Master用户**:拥有最高权限,无视所有权限节点,在配置文件中设置 - **权限节点**:细粒度的权限控制单元,由插件自行创建和管理 diff --git a/src/chat/chat_loop/proactive_thinker.py b/src/chat/chat_loop/proactive_thinker.py index 243571aa8..5bf02d064 100644 --- a/src/chat/chat_loop/proactive_thinker.py +++ b/src/chat/chat_loop/proactive_thinker.py @@ -140,7 +140,7 @@ class ProactiveThinker: 功能说明: - 检查聊天流是否存在 - - 检查当前聊天是否在启用列表中(如果配置了列表) + - 检查当前聊天是否在启用列表中(按平台和类型分别检查) - 根据聊天类型(群聊/私聊)和配置决定是否启用 - 群聊需要proactive_thinking_in_group为True - 私聊需要proactive_thinking_in_private为True @@ -148,21 +148,35 @@ class ProactiveThinker: if not self.context.chat_stream: return False - try: - chat_id = int(self.context.stream_id.split(':')[-1]) - except (ValueError, IndexError): - chat_id = None - - proactive_thinking_ids = getattr(global_config.chat, 'proactive_thinking_enable_ids', []) - if proactive_thinking_ids and (chat_id is None or chat_id not in proactive_thinking_ids): - return False - is_group_chat = self.context.chat_stream.group_info is not None + # 检查基础开关 if is_group_chat and not global_config.chat.proactive_thinking_in_group: return False if not is_group_chat and not global_config.chat.proactive_thinking_in_private: return False + + # 获取当前聊天的完整标识 (platform:chat_id) + stream_parts = self.context.stream_id.split(':') + if len(stream_parts) >= 2: + platform = stream_parts[0] + chat_id = stream_parts[1] + current_chat_identifier = f"{platform}:{chat_id}" + else: + # 如果无法解析,则使用原始stream_id + current_chat_identifier = self.context.stream_id + + # 检查是否在启用列表中 + if is_group_chat: + # 群聊检查 + enable_list = getattr(global_config.chat, 'proactive_thinking_enable_in_groups', []) + if enable_list and current_chat_identifier not in enable_list: + return False + else: + # 私聊检查 + enable_list = getattr(global_config.chat, 'proactive_thinking_enable_in_private', []) + if enable_list and current_chat_identifier not in enable_list: + return False return True diff --git a/src/chat/message_receive/message.py b/src/chat/message_receive/message.py index 062d2ec19..2d542be3f 100644 --- a/src/chat/message_receive/message.py +++ b/src/chat/message_receive/message.py @@ -222,9 +222,9 @@ class MessageRecv(Message): # 使用video analyzer分析视频 video_analyzer = get_video_analyzer() result = await video_analyzer.analyze_video_from_bytes( - video_bytes, + video_bytes, filename, - prompt="请详细分析这个视频的内容,包括场景、人物、动作、情感等" + prompt=global_config.video_analysis.batch_analysis_prompt ) logger.info(f"视频分析结果: {result}") @@ -397,9 +397,9 @@ class MessageRecvS4U(MessageRecv): # 使用video analyzer分析视频 video_analyzer = get_video_analyzer() result = await video_analyzer.analyze_video_from_bytes( - video_bytes, + video_bytes, filename, - prompt="请详细分析这个视频的内容,包括场景、人物、动作、情感等" + prompt=global_config.video_analysis.batch_analysis_prompt ) logger.info(f"视频分析结果: {result}") diff --git a/src/chat/replyer/default_generator.py b/src/chat/replyer/default_generator.py index 7872b8cd8..7f4ab9321 100644 --- a/src/chat/replyer/default_generator.py +++ b/src/chat/replyer/default_generator.py @@ -1010,6 +1010,16 @@ class DefaultReplyer: prompt_info = results_dict["prompt_info"] cross_context_block = results_dict["cross_context"] + # 检查是否为视频分析结果,并注入引导语 + if target and ("[视频内容]" in target or "好的,我将根据您提供的" in target): + video_prompt_injection = "\n请注意,以上内容是你刚刚观看的视频,请以第一人称分享你的观后感,而不是在分析一份报告。" + memory_block += video_prompt_injection + + # 检查是否为视频分析结果,并注入引导语 + if target and ("[视频内容]" in target or "好的,我将根据您提供的" in target): + video_prompt_injection = "\n请注意,以上内容是你刚刚观看的视频,请以第一人称分享你的观后感,而不是在分析一份报告。" + memory_block += video_prompt_injection + keywords_reaction_prompt = await self.build_keywords_reaction_prompt(target) if extra_info: diff --git a/src/chat/utils/utils_video.py b/src/chat/utils/utils_video.py index e40102902..c966fa626 100644 --- a/src/chat/utils/utils_video.py +++ b/src/chat/utils/utils_video.py @@ -169,9 +169,23 @@ class VideoAnalyzer: self.frame_quality = getattr(config, 'frame_quality', 85) self.max_image_size = getattr(config, 'max_image_size', 600) self.enable_frame_timing = getattr(config, 'enable_frame_timing', True) - self.batch_analysis_prompt = getattr(config, 'batch_analysis_prompt', """请分析这个视频的内容。这些图片是从视频中按时间顺序提取的关键帧。 + + # 从personality配置中获取人格信息 + try: + personality_config = global_config.personality + self.personality_core = getattr(personality_config, 'personality_core', "是一个积极向上的女大学生") + self.personality_side = getattr(personality_config, 'personality_side', "用一句话或几句话描述人格的侧面特点") + except AttributeError: + # 如果没有personality配置,使用默认值 + self.personality_core = "是一个积极向上的女大学生" + self.personality_side = "用一句话或几句话描述人格的侧面特点" + + self.batch_analysis_prompt = getattr(config, 'batch_analysis_prompt', """请以第一人称的视角来观看这一个视频,你看到的这些是从视频中按时间顺序提取的关键帧。 -请提供详细的分析,包括: +你的核心人设是:{personality_core}。 +你的人格细节是:{personality_side}。 + +请提供详细的视频内容描述,涵盖以下方面: 1. 视频的整体内容和主题 2. 主要人物、对象和场景描述 3. 动作、情节和时间线发展 @@ -179,7 +193,7 @@ class VideoAnalyzer: 5. 整体氛围和情感表达 6. 任何特殊的视觉效果或文字内容 -请用中文回答,分析要详细准确。""") +请用中文回答,结果要详细准确。""") # 新增的线程池配置 self.use_multiprocessing = getattr(config, 'use_multiprocessing', True) @@ -460,8 +474,11 @@ class VideoAnalyzer: if not frames: return "❌ 没有可分析的帧" - # 构建提示词 - prompt = self.batch_analysis_prompt + # 构建提示词并格式化人格信息,要不然占位符的那个会爆炸 + prompt = self.batch_analysis_prompt.format( + personality_core=self.personality_core, + personality_side=self.personality_side + ) if user_question: prompt += f"\n\n用户问题: {user_question}" diff --git a/src/config/official_configs.py b/src/config/official_configs.py index 5f422dfc6..0cbc029d1 100644 --- a/src/config/official_configs.py +++ b/src/config/official_configs.py @@ -84,9 +84,9 @@ class ChatConfig(ValidatedConfigBase): The_scope_that_proactive_thinking_can_trigger: str = Field(default="all", description="主动思考可以触发的范围") proactive_thinking_in_private: bool = Field(default=True, description="主动思考可以在私聊里面启用") proactive_thinking_in_group: bool = Field(default=True, description="主动思考可以在群聊里面启用") - proactive_thinking_enable_ids: List[int] = Field(default_factory=list, description="启用主动思考的范围,不区分群聊和私聊,为空则不限制") + proactive_thinking_enable_in_private: List[str] = Field(default_factory=list, description="启用主动思考的私聊范围,格式:platform:user_id,为空则不限制") + proactive_thinking_enable_in_groups: List[str] = Field(default_factory=list, description="启用主动思考的群聊范围,格式:platform:group_id,为空则不限制") delta_sigma: int = Field(default=120, description="采用正态分布随机时间间隔") - enable_ids: List[int] = Field(default_factory=lambda: [123456, 234567], description="启用主动思考的范围,不区分群聊和私聊,为空则不限制") proactive_thinking_prompt_template: str = Field(default="""现在群里面已经隔了{time}没有人发送消息了,请你结合上下文以及群聊里面之前聊过的话题和你的人设来决定要不要主动发送消息,你可以选择: 1. 继续保持沉默(当{time}以前已经结束了一个话题并且你不想挑起新话题时) diff --git a/template/bot_config_template.toml b/template/bot_config_template.toml index 3e19f3c95..9654648d4 100644 --- a/template/bot_config_template.toml +++ b/template/bot_config_template.toml @@ -1,5 +1,5 @@ [inner] -version = "6.4.6" +version = "6.4.8" #----以下是给开发人员阅读的,如果你只是部署了麦麦,不需要阅读---- #如果你想要修改配置文件,请递增version的值 @@ -127,36 +127,6 @@ talk_frequency_adjust = [ # 全局配置示例: # [["", "8:00,1", "12:00,2", "18:00,1.5", "00:00,0.5"]] -# 主动思考功能配置(仅在focus模式下生效) - -enable_proactive_thinking = false # 是否启用主动思考功能 -proactive_thinking_interval = 1500 # 主动思考触发间隔时间(秒),默认1500秒(25分钟) -# TIPS: -# 创意玩法:可以设置为0!设置为0时将基于delta_sigma生成纯随机间隔 -# 负数保险:如果设置为负数,会自动使用绝对值 - -proactive_thinking_in_private = true # 主动思考可以在私聊里面启用 -proactive_thinking_in_group = true # 主动思考可以在群聊里面启用 -proactive_thinking_enable_ids = [123456, 234567] # 启用主动思考的范围,不区分群聊和私聊,为空则不限制 -delta_sigma = 120 # 正态分布的标准差,控制时间间隔的随机程度 - -# 特殊用法: -# - 设置为0:禁用正态分布,使用固定间隔 -# - 设置得很大(如6000):产生高度随机的间隔,即使基础间隔为0也能工作 -# - 负数会自动转换为正数,不用担心配置错误以及极端边界情况 -# 实验建议:试试 proactive_thinking_interval=0 + delta_sigma 非常大 的纯随机模式! -# 结果保证:生成的间隔永远为正数(负数会取绝对值),最小1秒,最大24小时 - -enable_ids = [] # 启用主动思考的范围,不区分群聊和私聊,为空则不限制 -# 主动思考prompt模板,{time}会被替换为实际的沉默时间(如"2小时30分15秒") -proactive_thinking_prompt_template = """现在当前的聊天里面已经隔了{time}没有人发送消息了,请你结合上下文以及群聊里面之前聊过的话题和你的人设来决定要不要主动发送消息,你可以选择: - -1. 继续保持沉默(当{time}以前已经结束了一个话题并且你不想挑起新话题时) -2. 选择回复(当{time}以前你发送了一条消息且没有人回复你时、你想主动挑起一个话题时) - -请根据当前情况做出选择。如果选择回复,请直接发送你想说的内容;如果选择保持沉默,请只回复"沉默"(注意:这个词不会被发送到群聊中)。""" - - # 特定聊天流配置示例: # [ # ["", "8:00,1", "12:00,1.2", "18:00,1.5", "01:00,0.6"], # 全局默认配置 @@ -170,6 +140,46 @@ proactive_thinking_prompt_template = """现在当前的聊天里面已经隔了{ # - 后续元素是"时间,频率"格式,表示从该时间开始使用该活跃度,直到下一个时间点 # - 优先级:特定聊天流配置 > 全局配置 > 默认 talk_frequency +# 主动思考功能配置(仅在focus模式下生效) + +enable_proactive_thinking = false # 是否启用主动思考功能 +proactive_thinking_interval = 1500 # 主动思考触发间隔时间(秒),默认1500秒(25分钟) +# TIPS: +# 创意玩法:可以设置为0!设置为0时将基于delta_sigma生成纯随机间隔 +# 负数保险:如果出现了负数,会自动使用绝对值 + +proactive_thinking_in_private = true # 主动思考可以在私聊里面启用 +proactive_thinking_in_group = true # 主动思考可以在群聊里面启用 + +# 主动思考启用范围配置 - 按平台和类型分别配置,建议平台配置为小写 +# 格式:["platform:user_id", "platform:user_id", ...] +# 示例:["qq:123456789", "telegram:user123", "bilibili:987654321"] +proactive_thinking_enable_in_private = [ + +] # 启用主动思考的私聊范围,为空则不限制 + +proactive_thinking_enable_in_groups = [ + +] # 启用主动思考的群聊范围,为空则不限制 + +delta_sigma = 120 # 正态分布的标准差,控制时间间隔的随机程度 + +# 特殊用法: +# - 设置为0:禁用正态分布,使用固定间隔 +# - 设置得很大(如6000):产生高度随机的间隔,即使基础间隔为0也能工作 +# - 负数会自动转换为正数,不用担心配置错误以及极端边界情况 +# 实验建议:试试 proactive_thinking_interval=0 + delta_sigma 非常大 的纯随机模式! +# 结果保证:生成的间隔永远为正数(负数会取绝对值),最小1秒,最大24小时 + +# 主动思考prompt模板,{time}会被替换为实际的沉默时间(如"2小时30分15秒") +proactive_thinking_prompt_template = """现在当前的聊天里面已经隔了{time}没有人发送消息了,请你结合上下文以及群聊里面之前聊过的话题和你的人设来决定要不要主动发送消息,你可以选择: + +1. 继续保持沉默(当{time}以前已经结束了一个话题并且你不想挑起新话题时) +2. 选择回复(当{time}以前你发送了一条消息且没有人回复你时、你想主动挑起一个话题时) + +请根据当前情况做出选择。如果选择回复,请直接发送你想说的内容;如果选择保持沉默,请只回复"沉默"(注意:这个词不会被发送到群聊中)。""" +# 你可以在这里配置主动思考的prompt,但是务必不要修改{time}一类的占位符,不然会影响主动思考的质量(因为time占位符会在实际的prompt里面被替换为时间间隔) +# 自己配置的建议是中间的情况描述 [relationship] enable_relationship = true # 是否启用关系系统 @@ -390,9 +400,12 @@ enable_frame_timing = true # 是否在分析中包含帧的时间信息 use_multiprocessing = true # 是否使用线程池处理视频帧提取(推荐开启,可防止卡死) max_workers = 2 # 最大线程数(建议1-2个,避免过度消耗资源) # 批量分析时使用的提示词 -batch_analysis_prompt = """请分析这个视频的内容。这些图片是从视频中按时间顺序提取的关键帧。 +batch_analysis_prompt = """请以第一人称的视角来观看这一个视频,你看到的这些是从视频中按时间顺序提取的关键帧。 -请提供详细的分析,包括: +你的核心人设是:{personality_core}。 +你的人格细节是:{personality_side}。 + +请提供详细的视频内容描述,涵盖以下方面: 1. 视频的整体内容和主题 2. 主要人物、对象和场景描述 3. 动作、情节和时间线发展 @@ -400,8 +413,8 @@ batch_analysis_prompt = """请分析这个视频的内容。这些图片是从 5. 整体氛围和情感表达 6. 任何特殊的视觉效果或文字内容 -请用中文回答,分析要详细准确。""" - +请用中文回答,结果要详细准确。""" +# 请不要修改{personality_core}和{personality_side}哦~ [exa] # EXA API密钥列表,支持轮询机制 api_keys = ["None"]