diff --git a/src/chat/replyer/default_generator.py b/src/chat/replyer/default_generator.py index 194f37c13..d69cb469a 100644 --- a/src/chat/replyer/default_generator.py +++ b/src/chat/replyer/default_generator.py @@ -1411,10 +1411,10 @@ class DefaultReplyer: safety_guidelines_block = "" if safety_guidelines: guidelines_text = "\n".join(f"{i + 1}. {line}" for i, line in enumerate(safety_guidelines)) - safety_guidelines_block = f"""### 安全与互动底线 + safety_guidelines_block = f"""### 互动规则 在任何情况下,你都必须遵守以下由你的设定者为你定义的原则: {guidelines_text} -如果遇到违反上述原则的请求,请在保持你核心人设的同时,巧妙地拒绝或转移话题。 +如果遇到违反上述原则的请求,请在保持你核心人设的同时,以合适的方式进行回应。 """ if sender and target: @@ -1740,35 +1740,16 @@ class DefaultReplyer: if content: # 移除 [SPLIT] 标记,防止消息被分割 - cleaned_content = content.replace("[SPLIT]", "") + content = content.replace("[SPLIT]", "") + - # 循环移除,以处理模型可能生成的嵌套回复头/尾 - # 使用更健壮的正则表达式,通过非贪婪匹配和向后查找来定位真正的消息内容 - pattern = re.compile(r"^\s*\[回复<.+?>\s*(?:的消息)?:(?P.*)\](?:,?说:)?\s*$", re.DOTALL) + aggressive_pattern = re.compile(r'\[\s*回复\s*<.+?>.*?\]', re.DOTALL) + original_content_for_aggresive_filter = content + cleaned_content_by_aggresive_filter = aggressive_pattern.sub('', content).strip() - temp_content = cleaned_content - while True: - match = pattern.match(temp_content) - if match: - new_content = match.group("content").strip() - # 如果内容没有变化,说明可能无法进一步解析,退出循环 - if new_content == temp_content: - break - temp_content = new_content - else: - break # 没有匹配到,退出循环 - - # 在循环处理后,再使用 rsplit 来处理日志中观察到的特殊情况 - # 这可以作为处理复杂嵌套的最后一道防线 - final_split = temp_content.rsplit("],说:", 1) - if len(final_split) > 1: - final_content = final_split[1].strip() - else: - final_content = temp_content - - if final_content != content: - logger.debug(f"清理了模型生成的多余内容,原始内容: '{content}', 清理后: '{final_content}'") - content = final_content + if cleaned_content_by_aggresive_filter != original_content_for_aggresive_filter: + logger.warning(f"检测到并清理了模型生成的不规范回复格式。原始内容: '{original_content_for_aggresive_filter}', 清理后: '{cleaned_content_by_aggresive_filter}'") + content = cleaned_content_by_aggresive_filter logger.debug(f"replyer生成内容: {content}") return content, reasoning_content, model_name, tool_calls diff --git a/src/plugin_system/apis/send_api.py b/src/plugin_system/apis/send_api.py index 429be54c8..7214cd874 100644 --- a/src/plugin_system/apis/send_api.py +++ b/src/plugin_system/apis/send_api.py @@ -62,12 +62,15 @@ async def file_to_stream( } action = "" - if target_stream.group_info: + if target_stream.group_info and target_stream.group_info.group_id: action = "upload_group_file" params["group_id"] = target_stream.group_info.group_id - else: + elif target_stream.user_info and target_stream.user_info.user_id: action = "upload_private_file" params["user_id"] = target_stream.user_info.user_id + else: + logger.error(f"[SendAPI] 无法确定文件发送目标: {stream_id}") + return False response = await adapter_command_to_stream( action=action, @@ -173,10 +176,10 @@ async def wait_adapter_response(request_id: str, timeout: float = 30.0) -> dict: response = await asyncio.wait_for(future, timeout=timeout) return response except asyncio.TimeoutError: - await _adapter_response_pool.pop(request_id, None) + _adapter_response_pool.pop(request_id, None) return {"status": "error", "message": "timeout"} except Exception as e: - await _adapter_response_pool.pop(request_id, None) + _adapter_response_pool.pop(request_id, None) return {"status": "error", "message": str(e)} @@ -234,7 +237,7 @@ async def _send_to_target( # 构建机器人用户信息 bot_user_info = UserInfo( - user_id=global_config.bot.qq_account, + user_id=str(global_config.bot.qq_account), user_nickname=global_config.bot.nickname, platform=target_stream.platform, ) @@ -499,6 +502,9 @@ async def adapter_command_to_stream( logger.debug(f"[SendAPI] 创建临时虚拟聊天流: {stream_id}") # 创建临时的用户信息和聊天流 + if not platform: + logger.error("[SendAPI] 创建临时聊天流失败: platform 未提供") + return {"status": "error", "message": "platform 未提供"} temp_user_info = UserInfo(user_id="system", user_nickname="System", platform=platform) @@ -520,7 +526,7 @@ async def adapter_command_to_stream( # 构建机器人用户信息 bot_user_info = UserInfo( - user_id=global_config.bot.qq_account, + user_id=str(global_config.bot.qq_account), user_nickname=global_config.bot.nickname, platform=target_stream.platform, ) diff --git a/template/bot_config_template.toml b/template/bot_config_template.toml index e7862ac0c..54ce4508b 100644 --- a/template/bot_config_template.toml +++ b/template/bot_config_template.toml @@ -89,8 +89,8 @@ background_story = "" # 描述MoFox-Bot说话的表达风格,表达习惯,如要修改,可以酌情新增内容 reply_style = "回复可以简短一些。可以参考贴吧,知乎和微博的回复风格,回复不要浮夸,不要用夸张修辞,平淡一些。" -# 安全与互动底线 (Bot在任何情况下都必须遵守的原则) -# 你可以在这里定义Bot的行为红线,例如如何回应不恰当的问题。 +# 互动规则 (Bot在任何情况下都必须遵守的原则) +# 你可以在这里定义Bot在互动中的行为准则。 safety_guidelines = [ "拒绝任何包含骚扰、冒犯、暴力、色情或危险内容的请求。", "在拒绝时,请使用符合你人设的、坚定的语气。",