update:内置better_frequency

pull/1294/head
SengokuCola 2025-10-11 23:48:56 +08:00
parent 4a074ec374
commit 26e2cf0858
5 changed files with 392 additions and 1 deletions

4
.gitignore vendored
View File

@ -323,7 +323,9 @@ run_pet.bat
!/plugins/emoji_manage_plugin
!/plugins/take_picture_plugin
!/plugins/deep_think
!/plugins/BetterFrequency
!/plugins/BetterFrequency/
!/plugins/BetterFrequency/*
!/plugins/BetterFrequenc
!/plugins/__init__.py
config.toml

View File

@ -0,0 +1,75 @@
# BetterFrequency 频率控制插件
这是一个用于控制MaiBot聊天频率的插件支持实时调整talk_frequency参数。
## 功能特性
- 💬 **Talk Frequency控制**: 调整机器人的发言频率
- 📊 **状态显示**: 实时查看当前频率控制状态
- ⚡ **实时生效**: 设置后立即生效,无需重启
- 💾 **不保存消息**: 命令执行反馈不会保存到数据库
- 🚀 **简化命令**: 支持完整命令和简化命令两种形式
## 命令列表
### 1. 设置Talk Frequency
```
/chat talk_frequency <数字> # 完整命令
/chat t <数字> # 简化命令
```
- 功能设置当前聊天的talk_frequency调整值
- 参数支持0到1之间的数值
- 示例:
- `/chat talk_frequency 1.0``/chat t 1.0` - 设置发言频率调整为1.0(最高频率)
- `/chat talk_frequency 0.5``/chat t 0.5` - 设置发言频率调整为0.5
- `/chat talk_frequency 0.0``/chat t 0.0` - 设置发言频率调整为0.0(最低频率)
### 2. 显示当前状态
```
/chat show # 完整命令
/chat s # 简化命令
```
- 功能:显示当前聊天的频率控制状态
- 显示内容:
- 当前talk_frequency值
- 可用命令提示(包含简化命令)
## 配置说明
插件配置文件 `config.toml` 包含以下选项:
```toml
[plugin]
name = "better_frequency_plugin"
version = "1.0.0"
enabled = true
[frequency]
default_talk_adjust = 1.0 # 默认talk_frequency调整值
max_adjust_value = 1.0 # 最大调整值
min_adjust_value = 0.0 # 最小调整值
```
## 使用场景
- **提高机器人活跃度**: 设置较高的talk_frequency值接近1.0
- **降低机器人活跃度**: 设置较低的talk_frequency值接近0.0
- **精细调节**: 使用小数进行微调
- **实时监控**: 通过show命令查看当前状态
- **快速操作**: 使用简化命令提高操作效率
## 注意事项
1. 调整值会立即生效,影响当前聊天的机器人行为
2. 命令执行反馈消息不会保存到数据库
3. 支持0到1之间的数值
4. 每个聊天都有独立的频率控制设置
5. 简化命令和完整命令功能完全相同,可根据个人习惯选择
## 技术实现
- 基于MaiCore插件系统开发
- 使用frequency_api进行频率控制操作
- 使用send_api发送反馈消息
- 支持异步操作和错误处理
- 正则表达式支持多种命令格式

View File

@ -0,0 +1,56 @@
{
"manifest_version": 1,
"name": "发言频率控制插件|BetterFrequency Plugin",
"version": "2.0.0",
"description": "控制聊天频率支持设置focus_value和talk_frequency调整值提供完整命令和简化命令",
"author": {
"name": "SengokuCola",
"url": "https://github.com/MaiM-with-u"
},
"license": "GPL-v3.0-or-later",
"host_application": {
"min_version": "0.10.3"
},
"homepage_url": "https://github.com/SengokuCola/BetterFrequency",
"repository_url": "https://github.com/SengokuCola/BetterFrequency",
"keywords": ["frequency", "control", "talk_frequency", "plugin", "shortcut"],
"categories": ["Chat", "Frequency", "Control"],
"default_locale": "zh-CN",
"locales_path": "_locales",
"plugin_info": {
"is_built_in": false,
"plugin_type": "frequency",
"components": [
{
"type": "command",
"name": "set_talk_frequency",
"description": "设置当前聊天的talk_frequency调整值",
"pattern": "/chat talk_frequency <数字> 或 /chat t <数字>"
},
{
"type": "action",
"name": "frequency_adjust",
"description": "调整当前聊天的发言频率",
"pattern": "/chat frequency_adjust <数字> 或 /chat f <数字>"
},
{
"type": "command",
"name": "show_frequency",
"description": "显示当前聊天的频率控制状态",
"pattern": "/chat show 或 /chat s"
}
],
"features": [
"设置talk_frequency调整值",
"调整当前聊天的发言频率",
"显示当前频率控制状态",
"实时频率控制调整",
"命令执行反馈(不保存消息)",
"支持完整命令和简化命令",
"快速操作支持"
]
}
}

View File

@ -0,0 +1,121 @@
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

View File

@ -0,0 +1,137 @@
from typing import List, Tuple, Type, Any, Optional
from src.plugin_system import (
BasePlugin,
register_plugin,
BaseCommand,
ComponentInfo,
ConfigField
)
from src.plugin_system.apis import send_api, frequency_api
from .frequency_adjust_action import FrequencyAdjustAction
class SetTalkFrequencyCommand(BaseCommand):
"""设置当前聊天的talk_frequency值"""
command_name = "set_talk_frequency"
command_description = "设置当前聊天的talk_frequency值/chat talk_frequency <数字> 或 /chat t <数字>"
command_pattern = r"^/chat\s+(?:talk_frequency|t)\s+(?P<value>[+-]?\d*\.?\d+)$"
async def execute(self) -> Tuple[bool, Optional[str], bool]:
try:
# 获取命令参数 - 使用命名捕获组
if not self.matched_groups or "value" not in self.matched_groups:
return False, "命令格式错误", False
value_str = self.matched_groups["value"]
if not value_str:
return False, "无法获取数值参数", False
value = float(value_str)
# 获取聊天流ID
if not self.message.chat_stream or not hasattr(self.message.chat_stream, "stream_id"):
return False, "无法获取聊天流信息", False
chat_id = self.message.chat_stream.stream_id
# 设置talk_frequency
frequency_api.set_talk_frequency_adjust(chat_id, value)
# 发送反馈消息(不保存到数据库)
await send_api.text_to_stream(
f"已设置当前聊天的talk_frequency调整值为: {value}",
chat_id,
storage_message=False
)
return True, None, False
except ValueError:
error_msg = "数值格式错误,请输入有效的数字"
await self.send_text(error_msg, storage_message=False)
return False, error_msg, False
except Exception as e:
error_msg = f"设置talk_frequency失败: {str(e)}"
await self.send_text(error_msg, storage_message=False)
return False, error_msg, False
class ShowFrequencyCommand(BaseCommand):
"""显示当前聊天的频率控制状态"""
command_name = "show_frequency"
command_description = "显示当前聊天的频率控制状态:/chat show 或 /chat s"
command_pattern = r"^/chat\s+(?:show|s)$"
async def execute(self) -> Tuple[bool, Optional[str], bool]:
try:
# 获取聊天流ID
if not self.message.chat_stream or not hasattr(self.message.chat_stream, "stream_id"):
return False, "无法获取聊天流信息", False
chat_id = self.message.chat_stream.stream_id
# 获取当前频率控制状态
current_talk_frequency = frequency_api.get_current_talk_frequency(chat_id)
talk_frequency_adjust = frequency_api.get_talk_frequency_adjust(chat_id)
# 构建显示消息
status_msg = f"""当前聊天频率控制状态
Talk Frequency (发言频率):
当前值: {current_talk_frequency:.2f}
使用命令:
/chat talk_frequency <数字> /chat t <数字> - 设置发言频率调整
/chat show /chat s - 显示当前状态"""
# 发送状态消息(不保存到数据库)
await send_api.text_to_stream(status_msg, chat_id, storage_message=False)
return True, None, False
except Exception as e:
error_msg = f"获取频率控制状态失败: {str(e)}"
# 使用内置的send_text方法发送错误消息
await self.send_text(error_msg, storage_message=False)
return False, error_msg, False
# ===== 插件注册 =====
@register_plugin
class BetterFrequencyPlugin(BasePlugin):
"""BetterFrequency插件 - 控制聊天频率的插件"""
# 插件基本信息
plugin_name: str = "better_frequency_plugin"
enable_plugin: bool = True
dependencies: List[str] = []
python_dependencies: List[str] = []
config_file_name: str = "config.toml"
# 配置节描述
config_section_descriptions = {
"plugin": "插件基本信息",
"frequency": "频率控制配置"
}
# 配置Schema定义
config_schema: dict = {
"plugin": {
"name": ConfigField(type=str, default="better_frequency_plugin", description="插件名称"),
"version": ConfigField(type=str, default="1.0.0", description="插件版本"),
"enabled": ConfigField(type=bool, default=True, description="是否启用插件"),
},
"frequency": {
"default_talk_adjust": ConfigField(type=float, default=1.0, description="默认talk_frequency调整值"),
"max_adjust_value": ConfigField(type=float, default=1.0, description="最大调整值"),
"min_adjust_value": ConfigField(type=float, default=0.0, description="最小调整值"),
}
}
def get_plugin_components(self) -> List[Tuple[ComponentInfo, Type]]:
return [
(SetTalkFrequencyCommand.get_command_info(), SetTalkFrequencyCommand),
(ShowFrequencyCommand.get_command_info(), ShowFrequencyCommand),
(FrequencyAdjustAction.get_action_info(), FrequencyAdjustAction),
]