MaiBot/plugins/BetterFrequency/frequency_adjust_action.py

121 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from typing import Tuple
# 导入新插件系统
from src.plugin_system import BaseAction, ActionActivationType
# 导入依赖的系统组件
from src.common.logger import get_logger
# 导入API模块
from src.plugin_system.apis import frequency_api, send_api, config_api, generator_api
logger = get_logger("frequency_adjust")
class FrequencyAdjustAction(BaseAction):
"""频率调节动作 - 调整聊天发言频率"""
activation_type = ActionActivationType.LLM_JUDGE
parallel_action = False
# 动作基本信息
action_name = "frequency_adjust"
action_description = "调整当前聊天的发言频率"
# 动作参数定义
action_parameters = {
"direction": "调整方向:'increase'(增加)或'decrease'(降低)",
}
# 动作使用场景
bot_name = config_api.get_global_config("bot.nickname")
action_require = [
f"当用户提到 {bot_name} 太安静或太活跃时使用",
f"有人提到 {bot_name} 的发言太多或太少",
f"需要根据聊天氛围调整 {bot_name} 的活跃度",
]
# 关联类型
associated_types = ["text"]
async def execute(self) -> Tuple[bool, str]:
"""执行频率调节动作"""
try:
# 1. 获取动作参数
direction = self.action_data.get("direction")
# multiply = 1.2
# multiply = self.action_data.get("multiply")
if not direction:
error_msg = "缺少必要的参数direction或multiply"
logger.error(f"{self.log_prefix} {error_msg}")
return False, error_msg
# 2. 获取当前频率值
current_frequency = frequency_api.get_current_talk_frequency(self.chat_id)
# 3. 计算新的频率值(使用比率而不是绝对值)
# calculated_frequency = current_frequency * multiply
if direction == "increase":
calculated_frequency = current_frequency * 1.2
if calculated_frequency > 1.0:
new_frequency = 1.0
action_desc = f"增加到最大值"
# 记录超出限制的action
logger.warning(f"{self.log_prefix} 尝试调整频率超出最大值: current={current_frequency:.2f}, calculated={calculated_frequency:.2f}")
await self.store_action_info(
action_build_into_prompt=True,
action_prompt_display=f"你尝试调整发言频率到{calculated_frequency:.2f}但最大值只能为1.0,已设置为最大值",
action_done=True,
)
return True, f"调整发言频率超出限制: {current_frequency:.2f}{new_frequency:.2f}"
else:
new_frequency = calculated_frequency
action_desc = f"增加"
elif direction == "decrease":
calculated_frequency = current_frequency * 0.8
new_frequency = max(0.0, calculated_frequency)
action_desc = f"降低"
else:
error_msg = f"无效的调整方向: {direction}"
logger.error(f"{self.log_prefix} {error_msg}")
return False, error_msg
# 4. 设置新的频率值
frequency_api.set_talk_frequency_adjust(self.chat_id, new_frequency)
# 5. 发送反馈消息
feedback_msg = f"{action_desc}发言频率:{current_frequency:.2f}{new_frequency:.2f}"
result_status, data = await generator_api.rewrite_reply(
chat_stream=self.chat_stream,
reply_data={
"raw_reply": feedback_msg,
"reason": "表达自己已经调整了发言频率,不一定要说具体数值,可以有趣一些",
},
)
if result_status:
for reply_seg in data.reply_set.reply_data:
send_data = reply_seg.content
await self.send_text(send_data)
logger.info(f"{self.log_prefix} {send_data}")
# 6. 存储动作信息(仅在未超出限制时)
if calculated_frequency <= 1.0:
await self.store_action_info(
action_build_into_prompt=True,
action_prompt_display=f"{action_desc}了发言频率,从{current_frequency:.2f}调整到{new_frequency:.2f}",
action_done=True,
)
return True, f"成功调整发言频率: {current_frequency:.2f}{new_frequency:.2f}"
except Exception as e:
error_msg = f"频率调节失败: {str(e)}"
logger.error(f"{self.log_prefix} {error_msg}", exc_info=True)
await self.send_text("频率调节失败")
return False, error_msg