ruff
This commit is contained in:
@@ -122,7 +122,7 @@ class AffinityInterestCalculator(BaseInterestCalculator):
|
||||
+ relationship_score * self.score_weights["relationship"]
|
||||
+ mentioned_score * self.score_weights["mentioned"]
|
||||
)
|
||||
|
||||
|
||||
# 限制总分上限为1.0,确保分数在合理范围内
|
||||
total_score = min(raw_total_score, 1.0)
|
||||
|
||||
@@ -131,7 +131,7 @@ class AffinityInterestCalculator(BaseInterestCalculator):
|
||||
f"{relationship_score:.3f}*{self.score_weights['relationship']} + "
|
||||
f"{mentioned_score:.3f}*{self.score_weights['mentioned']} = {raw_total_score:.3f}"
|
||||
)
|
||||
|
||||
|
||||
if raw_total_score > 1.0:
|
||||
logger.debug(f"[Affinity兴趣计算] 原始分数 {raw_total_score:.3f} 超过1.0,已限制为 {total_score:.3f}")
|
||||
|
||||
@@ -217,7 +217,7 @@ class AffinityInterestCalculator(BaseInterestCalculator):
|
||||
return 0.0
|
||||
|
||||
except asyncio.TimeoutError:
|
||||
logger.warning(f"⏱️ 兴趣匹配计算超时(>1.5秒),返回默认分值0.5以保留其他分数")
|
||||
logger.warning("⏱️ 兴趣匹配计算超时(>1.5秒),返回默认分值0.5以保留其他分数")
|
||||
return 0.5 # 超时时返回默认分值,避免丢失提及分和关系分
|
||||
except Exception as e:
|
||||
logger.warning(f"智能兴趣匹配失败: {e}")
|
||||
@@ -251,19 +251,19 @@ class AffinityInterestCalculator(BaseInterestCalculator):
|
||||
|
||||
def _calculate_mentioned_score(self, message: "DatabaseMessages", bot_nickname: str) -> float:
|
||||
"""计算提及分 - 区分强提及和弱提及
|
||||
|
||||
|
||||
强提及(被@、被回复、私聊): 使用 strong_mention_interest_score
|
||||
弱提及(文本匹配名字/别名): 使用 weak_mention_interest_score
|
||||
"""
|
||||
from src.chat.utils.utils import is_mentioned_bot_in_message
|
||||
|
||||
|
||||
# 使用统一的提及检测函数
|
||||
is_mentioned, mention_type = is_mentioned_bot_in_message(message)
|
||||
|
||||
|
||||
if not is_mentioned:
|
||||
logger.debug("[提及分计算] 未提及机器人,返回0.0")
|
||||
return 0.0
|
||||
|
||||
|
||||
# mention_type: 0=未提及, 1=弱提及, 2=强提及
|
||||
if mention_type >= 2:
|
||||
# 强提及:被@、被回复、私聊
|
||||
@@ -281,22 +281,22 @@ class AffinityInterestCalculator(BaseInterestCalculator):
|
||||
|
||||
def _apply_no_reply_threshold_adjustment(self) -> tuple[float, float]:
|
||||
"""应用阈值调整(包括连续不回复和回复后降低机制)
|
||||
|
||||
|
||||
Returns:
|
||||
tuple[float, float]: (调整后的回复阈值, 调整后的动作阈值)
|
||||
"""
|
||||
# 基础阈值
|
||||
base_reply_threshold = self.reply_threshold
|
||||
base_action_threshold = global_config.affinity_flow.non_reply_action_interest_threshold
|
||||
|
||||
|
||||
total_reduction = 0.0
|
||||
|
||||
|
||||
# 1. 连续不回复的阈值降低
|
||||
if self.no_reply_count > 0 and self.no_reply_count < self.max_no_reply_count:
|
||||
no_reply_reduction = self.no_reply_count * self.probability_boost_per_no_reply
|
||||
total_reduction += no_reply_reduction
|
||||
logger.debug(f"[阈值调整] 连续不回复降低: {no_reply_reduction:.3f} (计数: {self.no_reply_count})")
|
||||
|
||||
|
||||
# 2. 回复后的阈值降低(使bot更容易连续对话)
|
||||
if self.enable_post_reply_boost and self.post_reply_boost_remaining > 0:
|
||||
# 计算衰减后的降低值
|
||||
@@ -309,16 +309,16 @@ class AffinityInterestCalculator(BaseInterestCalculator):
|
||||
f"[阈值调整] 回复后降低: {post_reply_reduction:.3f} "
|
||||
f"(剩余次数: {self.post_reply_boost_remaining}, 衰减: {decay_factor:.2f})"
|
||||
)
|
||||
|
||||
|
||||
# 应用总降低量
|
||||
adjusted_reply_threshold = max(0.0, base_reply_threshold - total_reduction)
|
||||
adjusted_action_threshold = max(0.0, base_action_threshold - total_reduction)
|
||||
|
||||
|
||||
return adjusted_reply_threshold, adjusted_action_threshold
|
||||
|
||||
|
||||
def _apply_no_reply_boost(self, base_score: float) -> float:
|
||||
"""【已弃用】应用连续不回复的概率提升
|
||||
|
||||
|
||||
注意:此方法已被 _apply_no_reply_threshold_adjustment 替代
|
||||
保留用于向后兼容
|
||||
"""
|
||||
@@ -388,7 +388,7 @@ class AffinityInterestCalculator(BaseInterestCalculator):
|
||||
self.no_reply_count = 0
|
||||
else:
|
||||
self.no_reply_count = min(self.no_reply_count + 1, self.max_no_reply_count)
|
||||
|
||||
|
||||
def on_reply_sent(self):
|
||||
"""当机器人发送回复后调用,激活回复后阈值降低机制"""
|
||||
if self.enable_post_reply_boost:
|
||||
@@ -399,16 +399,16 @@ class AffinityInterestCalculator(BaseInterestCalculator):
|
||||
)
|
||||
# 同时重置不回复计数
|
||||
self.no_reply_count = 0
|
||||
|
||||
|
||||
def on_message_processed(self, replied: bool):
|
||||
"""消息处理完成后调用,更新各种计数器
|
||||
|
||||
|
||||
Args:
|
||||
replied: 是否回复了此消息
|
||||
"""
|
||||
# 更新不回复计数
|
||||
self.update_no_reply_count(replied)
|
||||
|
||||
|
||||
# 如果已回复,激活回复后降低机制
|
||||
if replied:
|
||||
self.on_reply_sent()
|
||||
|
||||
@@ -4,10 +4,10 @@ AffinityFlow Chatter 规划器模块
|
||||
包含计划生成、过滤、执行等规划相关功能
|
||||
"""
|
||||
|
||||
from . import planner_prompts
|
||||
from .plan_executor import ChatterPlanExecutor
|
||||
from .plan_filter import ChatterPlanFilter
|
||||
from .plan_generator import ChatterPlanGenerator
|
||||
from .planner import ChatterActionPlanner
|
||||
from . import planner_prompts
|
||||
|
||||
__all__ = ["ChatterActionPlanner", "planner_prompts", "ChatterPlanGenerator", "ChatterPlanFilter", "ChatterPlanExecutor"]
|
||||
__all__ = ["ChatterActionPlanner", "ChatterPlanExecutor", "ChatterPlanFilter", "ChatterPlanGenerator", "planner_prompts"]
|
||||
|
||||
@@ -14,9 +14,7 @@ from json_repair import repair_json
|
||||
# 旧的Hippocampus系统已被移除,现在使用增强记忆系统
|
||||
# from src.chat.memory_system.enhanced_memory_manager import enhanced_memory_manager
|
||||
from src.chat.utils.chat_message_builder import (
|
||||
build_readable_actions,
|
||||
build_readable_messages_with_id,
|
||||
get_actions_by_timestamp_with_chat,
|
||||
)
|
||||
from src.chat.utils.prompt import global_prompt_manager
|
||||
from src.common.data_models.info_data_model import ActionPlannerInfo, Plan
|
||||
@@ -655,7 +653,7 @@ class ChatterPlanFilter:
|
||||
memory_manager = get_memory_manager()
|
||||
if not memory_manager:
|
||||
return "记忆系统未初始化。"
|
||||
|
||||
|
||||
# 将关键词转换为查询字符串
|
||||
query = " ".join(keywords)
|
||||
enhanced_memories = await memory_manager.search_memories(
|
||||
|
||||
@@ -21,7 +21,6 @@ if TYPE_CHECKING:
|
||||
from src.common.data_models.message_manager_data_model import StreamContext
|
||||
|
||||
# 导入提示词模块以确保其被初始化
|
||||
from src.plugins.built_in.affinity_flow_chatter.planner import planner_prompts
|
||||
|
||||
logger = get_logger("planner")
|
||||
|
||||
@@ -159,10 +158,10 @@ class ChatterActionPlanner:
|
||||
action_data={},
|
||||
action_message=None,
|
||||
)
|
||||
|
||||
|
||||
# 更新连续不回复计数
|
||||
await self._update_interest_calculator_state(replied=False)
|
||||
|
||||
|
||||
initial_plan = await self.generator.generate(chat_mode)
|
||||
filtered_plan = initial_plan
|
||||
filtered_plan.decided_actions = [no_action]
|
||||
@@ -270,7 +269,7 @@ class ChatterActionPlanner:
|
||||
try:
|
||||
# Normal模式开始时,刷新缓存消息到未读列表
|
||||
await self._flush_cached_messages_to_unread(context)
|
||||
|
||||
|
||||
unread_messages = context.get_unread_messages() if context else []
|
||||
|
||||
if not unread_messages:
|
||||
@@ -347,7 +346,7 @@ class ChatterActionPlanner:
|
||||
self._update_stats_from_execution_result(execution_result)
|
||||
|
||||
logger.info("Normal模式: 执行reply动作完成")
|
||||
|
||||
|
||||
# 更新兴趣计算器状态(回复成功,重置不回复计数)
|
||||
await self._update_interest_calculator_state(replied=True)
|
||||
|
||||
@@ -465,7 +464,7 @@ class ChatterActionPlanner:
|
||||
|
||||
async def _update_interest_calculator_state(self, replied: bool) -> None:
|
||||
"""更新兴趣计算器状态(连续不回复计数和回复后降低机制)
|
||||
|
||||
|
||||
Args:
|
||||
replied: 是否回复了消息
|
||||
"""
|
||||
@@ -504,36 +503,36 @@ class ChatterActionPlanner:
|
||||
|
||||
async def _flush_cached_messages_to_unread(self, context: "StreamContext | None") -> list:
|
||||
"""在planner开始时将缓存消息刷新到未读消息列表
|
||||
|
||||
|
||||
此方法在动作修改器执行后、生成初始计划前调用,确保计划阶段能看到所有积累的消息。
|
||||
|
||||
|
||||
Args:
|
||||
context: 流上下文
|
||||
|
||||
|
||||
Returns:
|
||||
list: 刷新的消息列表
|
||||
"""
|
||||
if not context:
|
||||
return []
|
||||
|
||||
|
||||
try:
|
||||
from src.chat.message_manager.message_manager import message_manager
|
||||
|
||||
|
||||
stream_id = context.stream_id
|
||||
|
||||
|
||||
if message_manager.is_running and message_manager.has_cached_messages(stream_id):
|
||||
# 获取缓存消息
|
||||
cached_messages = message_manager.flush_cached_messages(stream_id)
|
||||
|
||||
|
||||
if cached_messages:
|
||||
# 直接添加到上下文的未读消息列表
|
||||
for message in cached_messages:
|
||||
context.unread_messages.append(message)
|
||||
logger.info(f"Planner开始前刷新缓存消息到未读列表: stream={stream_id}, 数量={len(cached_messages)}")
|
||||
return cached_messages
|
||||
|
||||
|
||||
return []
|
||||
|
||||
|
||||
except ImportError:
|
||||
logger.debug("MessageManager不可用,跳过缓存刷新")
|
||||
return []
|
||||
|
||||
@@ -9,9 +9,9 @@ from .proactive_thinking_executor import execute_proactive_thinking
|
||||
from .proactive_thinking_scheduler import ProactiveThinkingScheduler, proactive_thinking_scheduler
|
||||
|
||||
__all__ = [
|
||||
"ProactiveThinkingReplyHandler",
|
||||
"ProactiveThinkingMessageHandler",
|
||||
"execute_proactive_thinking",
|
||||
"ProactiveThinkingReplyHandler",
|
||||
"ProactiveThinkingScheduler",
|
||||
"execute_proactive_thinking",
|
||||
"proactive_thinking_scheduler",
|
||||
]
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
当定时任务触发时,负责搜集信息、调用LLM决策、并根据决策生成回复
|
||||
"""
|
||||
|
||||
import orjson
|
||||
from datetime import datetime
|
||||
from typing import Any, Literal
|
||||
|
||||
|
||||
@@ -14,7 +14,6 @@ from maim_message import UserInfo
|
||||
|
||||
from src.chat.message_receive.chat_stream import get_chat_manager
|
||||
from src.common.logger import get_logger
|
||||
from src.config.api_ada_configs import TaskConfig
|
||||
from src.llm_models.utils_model import LLMRequest
|
||||
from src.plugin_system.apis import config_api, generator_api, llm_api
|
||||
|
||||
@@ -320,7 +319,7 @@ class ContentService:
|
||||
- 禁止在说说中直接、完整地提及当前的年月日,除非日期有特殊含义,但也尽量用节日名/节气名字代替。
|
||||
|
||||
2. **严禁重复**:下方会提供你最近发过的说说历史,你必须创作一条全新的、与历史记录内容和主题都不同的说说。
|
||||
|
||||
|
||||
**其他的禁止的内容以及说明**:
|
||||
- 绝对禁止提及当下具体几点几分的时间戳。
|
||||
- 绝对禁止攻击性内容和过度的负面情绪。
|
||||
|
||||
@@ -136,10 +136,10 @@ class QZoneService:
|
||||
logger.info(f"[DEBUG] 准备获取API客户端,qq_account={qq_account}")
|
||||
api_client = await self._get_api_client(qq_account, stream_id)
|
||||
if not api_client:
|
||||
logger.error(f"[DEBUG] API客户端获取失败,返回错误")
|
||||
logger.error("[DEBUG] API客户端获取失败,返回错误")
|
||||
return {"success": False, "message": "获取QZone API客户端失败"}
|
||||
|
||||
logger.info(f"[DEBUG] API客户端获取成功,准备读取说说")
|
||||
logger.info("[DEBUG] API客户端获取成功,准备读取说说")
|
||||
num_to_read = self.get_config("read.read_number", 5)
|
||||
|
||||
# 尝试执行,如果Cookie失效则自动重试一次
|
||||
@@ -186,7 +186,7 @@ class QZoneService:
|
||||
|
||||
# 检查是否是Cookie失效(-3000错误)
|
||||
if "错误码: -3000" in error_msg and retry_count == 0:
|
||||
logger.warning(f"检测到Cookie失效(-3000错误),准备删除缓存并重试...")
|
||||
logger.warning("检测到Cookie失效(-3000错误),准备删除缓存并重试...")
|
||||
|
||||
# 删除Cookie缓存文件
|
||||
cookie_file = self.cookie_service._get_cookie_file_path(qq_account)
|
||||
@@ -623,7 +623,7 @@ class QZoneService:
|
||||
logger.error(f"获取API客户端失败:Cookie中缺少关键的 'p_skey'。Cookie内容: {cookies}")
|
||||
return None
|
||||
|
||||
logger.info(f"[DEBUG] p_skey获取成功")
|
||||
logger.info("[DEBUG] p_skey获取成功")
|
||||
|
||||
gtk = self._generate_gtk(p_skey)
|
||||
uin = cookies.get("uin", "").lstrip("o")
|
||||
@@ -1230,7 +1230,7 @@ class QZoneService:
|
||||
logger.error(f"监控好友动态失败: {e}", exc_info=True)
|
||||
return []
|
||||
|
||||
logger.info(f"[DEBUG] API客户端构造完成,返回包含6个方法的字典")
|
||||
logger.info("[DEBUG] API客户端构造完成,返回包含6个方法的字典")
|
||||
return {
|
||||
"publish": _publish,
|
||||
"list_feeds": _list_feeds,
|
||||
|
||||
@@ -3,11 +3,12 @@
|
||||
负责记录和管理已回复过的评论ID,避免重复回复
|
||||
"""
|
||||
|
||||
import orjson
|
||||
import time
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
import orjson
|
||||
|
||||
from src.common.logger import get_logger
|
||||
|
||||
logger = get_logger("MaiZone.ReplyTrackerService")
|
||||
@@ -117,8 +118,8 @@ class ReplyTrackerService:
|
||||
temp_file = self.reply_record_file.with_suffix(".tmp")
|
||||
|
||||
# 先写入临时文件
|
||||
with open(temp_file, "w", encoding="utf-8") as f:
|
||||
orjson.dumps(self.replied_comments, option=orjson.OPT_INDENT_2 | orjson.OPT_NON_STR_KEYS).decode('utf-8')
|
||||
with open(temp_file, "w", encoding="utf-8"):
|
||||
orjson.dumps(self.replied_comments, option=orjson.OPT_INDENT_2 | orjson.OPT_NON_STR_KEYS).decode("utf-8")
|
||||
|
||||
# 如果写入成功,重命名为正式文件
|
||||
if temp_file.stat().st_size > 0: # 确保写入成功
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import json
|
||||
import time
|
||||
import random
|
||||
import websockets as Server
|
||||
import uuid
|
||||
from maim_message import (
|
||||
@@ -204,7 +203,7 @@ class SendHandler:
|
||||
# 发送响应回MoFox-Bot
|
||||
logger.debug(f"[DEBUG handle_adapter_command] 即将调用send_adapter_command_response, request_id={request_id}")
|
||||
await self.send_adapter_command_response(raw_message_base, response, request_id)
|
||||
logger.debug(f"[DEBUG handle_adapter_command] send_adapter_command_response调用完成")
|
||||
logger.debug("[DEBUG handle_adapter_command] send_adapter_command_response调用完成")
|
||||
|
||||
if response.get("status") == "ok":
|
||||
logger.info(f"适配器命令 {action} 执行成功")
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
"""
|
||||
Metaso Search Engine (Chat Completions Mode)
|
||||
"""
|
||||
import orjson
|
||||
from typing import Any
|
||||
|
||||
import httpx
|
||||
import orjson
|
||||
|
||||
from src.common.logger import get_logger
|
||||
from src.plugin_system.apis import config_api
|
||||
|
||||
@@ -3,9 +3,10 @@ Serper search engine implementation
|
||||
Google Search via Serper.dev API
|
||||
"""
|
||||
|
||||
import aiohttp
|
||||
from typing import Any
|
||||
|
||||
import aiohttp
|
||||
|
||||
from src.common.logger import get_logger
|
||||
from src.plugin_system.apis import config_api
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ Web Search Tool Plugin
|
||||
"""
|
||||
|
||||
from src.common.logger import get_logger
|
||||
from src.plugin_system import BasePlugin, ComponentInfo, ConfigField, PythonDependency, register_plugin
|
||||
from src.plugin_system import BasePlugin, ComponentInfo, ConfigField, register_plugin
|
||||
from src.plugin_system.apis import config_api
|
||||
|
||||
from .tools.url_parser import URLParserTool
|
||||
|
||||
@@ -113,7 +113,7 @@ class WebSurfingTool(BaseTool):
|
||||
custom_args["num_results"] = custom_args.get("num_results", 5)
|
||||
|
||||
# 如果启用了answer模式且是Exa引擎,使用answer_search方法
|
||||
if answer_mode and engine_name == "exa" and hasattr(engine, 'answer_search'):
|
||||
if answer_mode and engine_name == "exa" and hasattr(engine, "answer_search"):
|
||||
search_tasks.append(engine.answer_search(custom_args))
|
||||
else:
|
||||
search_tasks.append(engine.search(custom_args))
|
||||
@@ -162,7 +162,7 @@ class WebSurfingTool(BaseTool):
|
||||
custom_args["num_results"] = custom_args.get("num_results", 5)
|
||||
|
||||
# 如果启用了answer模式且是Exa引擎,使用answer_search方法
|
||||
if answer_mode and engine_name == "exa" and hasattr(engine, 'answer_search'):
|
||||
if answer_mode and engine_name == "exa" and hasattr(engine, "answer_search"):
|
||||
logger.info("使用Exa答案模式进行搜索(fallback策略)")
|
||||
results = await engine.answer_search(custom_args)
|
||||
else:
|
||||
@@ -195,7 +195,7 @@ class WebSurfingTool(BaseTool):
|
||||
custom_args["num_results"] = custom_args.get("num_results", 5)
|
||||
|
||||
# 如果启用了answer模式且是Exa引擎,使用answer_search方法
|
||||
if answer_mode and engine_name == "exa" and hasattr(engine, 'answer_search'):
|
||||
if answer_mode and engine_name == "exa" and hasattr(engine, "answer_search"):
|
||||
logger.info("使用Exa答案模式进行搜索")
|
||||
results = await engine.answer_search(custom_args)
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user