From 8dcfe04642be5d733a3a349c1725162e83874ac9 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Tue, 29 Apr 2025 23:47:37 +0800 Subject: [PATCH] fixruad --- scripts/remove_chong.py | 13 ++++++---- src/config/config.py | 3 ++- src/do_tool/tool_can_use/get_memory.py | 4 +-- src/heart_flow/observation.py | 8 +++--- src/heart_flow/sub_mind.py | 25 ++++++++++--------- src/heart_flow/subheartflow_manager.py | 4 +-- .../heartFC_chat/heartflow_prompt_builder.py | 2 +- src/plugins/person_info/person_info.py | 8 +++--- .../person_info/relationship_manager.py | 4 +-- src/plugins/utils/chat_message_builder.py | 5 +++- 10 files changed, 41 insertions(+), 35 deletions(-) diff --git a/scripts/remove_chong.py b/scripts/remove_chong.py index ac8ceca79..024acb3fd 100644 --- a/scripts/remove_chong.py +++ b/scripts/remove_chong.py @@ -1,6 +1,7 @@ import difflib import random + def ji_suan_xiang_si_du(wen_ben_yi: str, wen_ben_er: str) -> float: """ 计算两个文本字符串的相似度。 @@ -17,6 +18,7 @@ def ji_suan_xiang_si_du(wen_ben_yi: str, wen_ben_er: str) -> float: xiang_si_bi_lv = xu_lie_pi_pei_qi.ratio() return xiang_si_bi_lv + def ji_suan_ti_huan_gai_lv(xiang_si_du: float) -> float: """ 根据相似度计算替换的概率。 @@ -34,11 +36,12 @@ def ji_suan_ti_huan_gai_lv(xiang_si_du: float) -> float: elif 0.4 < xiang_si_du <= 0.6: # p = 3.5 * s - 1.4 (线性方程 y - 0 = (0.7-0)/(0.6-0.4) * (x - 0.4)) gai_lv = 3.5 * xiang_si_du - 1.4 - return max(0.0, gai_lv) # 确保概率不小于0 + return max(0.0, gai_lv) # 确保概率不小于0 elif 0.6 < xiang_si_du < 0.9: # p = s + 0.1 (线性方程 y - 0.7 = (1-0.7)/(0.9-0.6) * (x - 0.6)) gai_lv = xiang_si_du + 0.1 - return min(1.0, max(0.0, gai_lv)) # 确保概率在 0 和 1 之间 + return min(1.0, max(0.0, gai_lv)) # 确保概率在 0 和 1 之间 + # 获取用户输入 shu_ru_yi = "豆豆刚刚回复了我的问候 现在可以等待对方的回应 不需要再主动发言 目前情绪满足 不需要使用工具" @@ -67,7 +70,7 @@ if random.random() < ti_huan_gai_lv: # 更新下一个非匹配部分的起始位置 last_match_end_in_b = j + n - jie_guo = "".join(qu_chong_hou_de_er).strip() # 去除首尾空白 + jie_guo = "".join(qu_chong_hou_de_er).strip() # 去除首尾空白 if jie_guo: # 定义词语列表 @@ -78,9 +81,9 @@ if random.random() < ti_huan_gai_lv: # 根据概率决定是否添加词语 qian_zhui_str = "" - if random.random() < 0.3: # 30% 概率添加语气词 + if random.random() < 0.3: # 30% 概率添加语气词 qian_zhui_str += random.choice(yu_qi_ci_liebiao) - if random.random() < 0.7: # 70% 概率添加转折/承接词 + if random.random() < 0.7: # 70% 概率添加转折/承接词 qian_zhui_str += random.choice(zhuan_jie_ci_liebiao) # 组合最终结果 diff --git a/src/config/config.py b/src/config/config.py index d9d5ce162..f09da9a7e 100644 --- a/src/config/config.py +++ b/src/config/config.py @@ -185,7 +185,7 @@ class BotConfig: reply_trigger_threshold: float = 3.0 # 心流聊天触发阈值,越低越容易触发 probability_decay_factor_per_second: float = 0.2 # 概率衰减因子,越大衰减越快 default_decay_rate_per_second: float = 0.98 # 默认衰减率,越大衰减越慢 - allow_focus_mode: bool = True # 是否允许子心流进入 FOCUSED 状态 + allow_focus_mode: bool = True # 是否允许子心流进入 FOCUSED 状态 # sub_heart_flow_update_interval: int = 60 # 子心流更新频率,间隔 单位秒 # sub_heart_flow_freeze_time: int = 120 # 子心流冻结时间,超过这个时间没有回复,子心流会冻结,间隔 单位秒 @@ -417,6 +417,7 @@ class BotConfig: config.model_normal_probability = response_config.get( "model_normal_probability", config.model_normal_probability ) + def heartflow(parent: dict): heartflow_config = parent["heartflow"] config.sub_heart_flow_stop_time = heartflow_config.get( diff --git a/src/do_tool/tool_can_use/get_memory.py b/src/do_tool/tool_can_use/get_memory.py index 2ac550f49..b38423ed0 100644 --- a/src/do_tool/tool_can_use/get_memory.py +++ b/src/do_tool/tool_can_use/get_memory.py @@ -46,11 +46,11 @@ class GetMemoryTool(BaseTool): if related_memory: for memory in related_memory: memory_info += memory[1] + "\n" - + if memory_info: content = f"你记得这些事情: {memory_info}\n" content += "以上是你的回忆,不一定是目前聊天里的人说的,也不一定是现在发生的事情,请记住。\n" - + else: content = f"{topic}的记忆,你记不太清" diff --git a/src/heart_flow/observation.py b/src/heart_flow/observation.py index 5eeb64d39..5793e772f 100644 --- a/src/heart_flow/observation.py +++ b/src/heart_flow/observation.py @@ -46,7 +46,7 @@ class ChattingObservation(Observation): self.mid_memorys = [] self.max_mid_memory_len = global_config.compress_length_limit self.mid_memory_info = "" - + self.person_list = [] self.llm_summary = LLMRequest( @@ -157,11 +157,9 @@ class ChattingObservation(Observation): ) self.person_list = await get_person_id_list(self.talking_message) - - # print(f"self.11111person_list: {self.person_list}") - - + # print(f"self.11111person_list: {self.person_list}") + logger.trace( f"Chat {self.chat_id} - 压缩早期记忆:{self.mid_memory_info}\n现在聊天内容:{self.talking_message_str}" ) diff --git a/src/heart_flow/sub_mind.py b/src/heart_flow/sub_mind.py index d167f42ea..e59ee855c 100644 --- a/src/heart_flow/sub_mind.py +++ b/src/heart_flow/sub_mind.py @@ -16,7 +16,6 @@ import difflib from src.plugins.person_info.relationship_manager import relationship_manager - logger = get_logger("sub_heartflow") @@ -60,6 +59,7 @@ def calculate_similarity(text_a: str, text_b: str) -> float: matcher = difflib.SequenceMatcher(None, text_a, text_b) return matcher.ratio() + def calculate_replacement_probability(similarity: float) -> float: """ 根据相似度计算替换的概率。 @@ -138,13 +138,12 @@ class SubMind: # 获取个性化信息 individuality = Individuality.get_instance() - relation_prompt = "" print(f"person_list: {person_list}") for person in person_list: relation_prompt += await relationship_manager.build_relationship_info(person, is_id=True) - + print(f"relat22222ion_prompt: {relation_prompt}") # 构建个性部分 @@ -302,7 +301,7 @@ class SubMind: logger.warning(f"{self.log_prefix} LLM返回空结果,思考失败。") # ---------- 6. 应用概率性去重和修饰 ---------- - new_content = content # 保存 LLM 直接输出的结果 + new_content = content # 保存 LLM 直接输出的结果 try: similarity = calculate_similarity(previous_mind, new_content) replacement_prob = calculate_replacement_probability(similarity) @@ -319,11 +318,13 @@ class SubMind: if similarity == 1.0: logger.debug(f"{self.log_prefix} 想法完全重复 (相似度 1.0),执行特殊处理...") # 随机截取大约一半内容 - if len(new_content) > 1: # 避免内容过短无法截取 - split_point = max(1, len(new_content) // 2 + random.randint(-len(new_content)//4, len(new_content)//4)) + if len(new_content) > 1: # 避免内容过短无法截取 + split_point = max( + 1, len(new_content) // 2 + random.randint(-len(new_content) // 4, len(new_content) // 4) + ) truncated_content = new_content[:split_point] else: - truncated_content = new_content # 如果只有一个字符或者为空,就不截取了 + truncated_content = new_content # 如果只有一个字符或者为空,就不截取了 # 添加语气词和转折/承接词 yu_qi_ci = random.choice(yu_qi_ci_liebiao) @@ -347,21 +348,21 @@ class SubMind: if deduplicated_content: # 根据概率决定是否添加词语 prefix_str = "" - if random.random() < 0.3: # 30% 概率添加语气词 + if random.random() < 0.3: # 30% 概率添加语气词 prefix_str += random.choice(yu_qi_ci_liebiao) - if random.random() < 0.7: # 70% 概率添加转折/承接词 + if random.random() < 0.7: # 70% 概率添加转折/承接词 prefix_str += random.choice(zhuan_jie_ci_liebiao) # 组合最终结果 if prefix_str: - content = f"{prefix_str},{deduplicated_content}" # 更新 content + content = f"{prefix_str},{deduplicated_content}" # 更新 content logger.debug(f"{self.log_prefix} 去重并添加引导词后: {content}") else: - content = deduplicated_content # 更新 content + content = deduplicated_content # 更新 content logger.debug(f"{self.log_prefix} 去重后 (未添加引导词): {content}") else: logger.warning(f"{self.log_prefix} 去重后内容为空,保留原始LLM输出: {new_content}") - content = new_content # 保留原始 content + content = new_content # 保留原始 content else: logger.debug(f"{self.log_prefix} 未执行概率性去重 (概率: {replacement_prob:.2f})") # content 保持 new_content 不变 diff --git a/src/heart_flow/subheartflow_manager.py b/src/heart_flow/subheartflow_manager.py index c355867c5..afa0328e6 100644 --- a/src/heart_flow/subheartflow_manager.py +++ b/src/heart_flow/subheartflow_manager.py @@ -266,9 +266,9 @@ class SubHeartflowManager: # --- 新增:检查是否允许进入 FOCUS 模式 --- # if not global_config.allow_focus_mode: - if int(time.time()) % 60 == 0: # 每60秒输出一次日志避免刷屏 + if int(time.time()) % 60 == 0: # 每60秒输出一次日志避免刷屏 logger.debug(f"{log_prefix} 配置不允许进入 FOCUSED 状态 (allow_focus_mode=False)") - return # 如果不允许,直接返回 + return # 如果不允许,直接返回 # --- 结束新增 --- logger.debug(f"{log_prefix} 当前状态 ({current_state.value}) 开始尝试提升到FOCUSED状态") diff --git a/src/plugins/heartFC_chat/heartflow_prompt_builder.py b/src/plugins/heartFC_chat/heartflow_prompt_builder.py index db4979e35..32c78a106 100644 --- a/src/plugins/heartFC_chat/heartflow_prompt_builder.py +++ b/src/plugins/heartFC_chat/heartflow_prompt_builder.py @@ -261,7 +261,7 @@ class PromptBuilder: for person in who_chat_in_group: relation_prompt += await relationship_manager.build_relationship_info(person) print(f"relation_prompt: {relation_prompt}") - + print(f"relat11111111ion_prompt: {relation_prompt}") # 心情 diff --git a/src/plugins/person_info/person_info.py b/src/plugins/person_info/person_info.py index cde4ca932..8bafe5ebf 100644 --- a/src/plugins/person_info/person_info.py +++ b/src/plugins/person_info/person_info.py @@ -143,9 +143,9 @@ class PersonInfoManager: parsed_json = json.loads(text) # 如果解析结果是列表,尝试取第一个元素 if isinstance(parsed_json, list): - if parsed_json: # 检查列表是否为空 + if parsed_json: # 检查列表是否为空 parsed_json = parsed_json[0] - else: # 如果列表为空,重置为 None,走后续逻辑 + else: # 如果列表为空,重置为 None,走后续逻辑 parsed_json = None # 确保解析结果是字典 if isinstance(parsed_json, dict): @@ -156,7 +156,7 @@ class PersonInfoManager: pass except Exception as e: logger.warning(f"尝试直接解析JSON时发生意外错误: {e}") - pass # 继续尝试其他方法 + pass # 继续尝试其他方法 # 如果直接解析失败或结果不是字典 try: @@ -165,7 +165,7 @@ class PersonInfoManager: matches = re.findall(json_pattern, text) if matches: parsed_obj = json.loads(matches[0]) - if isinstance(parsed_obj, dict): # 确保是字典 + if isinstance(parsed_obj, dict): # 确保是字典 return parsed_obj # 如果上面都失败了,尝试提取键值对 diff --git a/src/plugins/person_info/relationship_manager.py b/src/plugins/person_info/relationship_manager.py index 34c284330..3062a7369 100644 --- a/src/plugins/person_info/relationship_manager.py +++ b/src/plugins/person_info/relationship_manager.py @@ -288,9 +288,9 @@ class RelationshipManager: print(f"person_name: {person_name}") relationship_value = await person_info_manager.get_value(person_id, "relationship_value") level_num = self.calculate_level_num(relationship_value) - + print(f"person_name: {person_name}, relationship_value: {relationship_value}, level_num: {level_num}") - + if level_num == 0 or level_num == 5: relationship_level = ["厌恶", "冷漠以对", "认识", "友好对待", "喜欢", "暧昧"] relation_prompt2_list = [ diff --git a/src/plugins/utils/chat_message_builder.py b/src/plugins/utils/chat_message_builder.py index eb2994f47..a7eef4431 100644 --- a/src/plugins/utils/chat_message_builder.py +++ b/src/plugins/utils/chat_message_builder.py @@ -348,7 +348,10 @@ async def build_readable_messages( messages_before_mark, replace_bot_name, merge_messages, timestamp_mode, truncate ) formatted_after, _ = await _build_readable_messages_internal( - messages_after_mark, replace_bot_name, merge_messages, timestamp_mode, + messages_after_mark, + replace_bot_name, + merge_messages, + timestamp_mode, ) readable_read_mark = translate_timestamp_to_human_readable(read_mark, mode=timestamp_mode)