fix: 恢复vtb_plugin
This commit is contained in:
132
src/plugins/built_in/vtb_plugin/plugin.py
Normal file
132
src/plugins/built_in/vtb_plugin/plugin.py
Normal file
@@ -0,0 +1,132 @@
|
||||
from src.plugin_system.base.base_plugin import BasePlugin, register_plugin
|
||||
from src.plugin_system.base.component_types import ComponentInfo
|
||||
from src.common.logger import get_logger
|
||||
from src.plugin_system.base.base_action import BaseAction, ActionActivationType, ChatMode
|
||||
from typing import Tuple, List, Type
|
||||
|
||||
logger = get_logger("vtb")
|
||||
|
||||
|
||||
class VTBAction(BaseAction):
|
||||
"""VTB虚拟主播动作处理类"""
|
||||
|
||||
action_name = "vtb_action"
|
||||
action_description = "使用虚拟主播预设动作表达心情或感觉,适用于需要生动表达情感的场景"
|
||||
action_parameters = {
|
||||
"text": "描述想要表达的心情或感觉的文本内容,必填,应当是对情感状态的自然描述",
|
||||
}
|
||||
action_require = [
|
||||
"当需要表达特定情感或心情时使用",
|
||||
"当用户明确要求使用虚拟主播动作时使用",
|
||||
"当回应内容需要更生动的情感表达时使用",
|
||||
"当想要通过预设动作增强互动体验时使用",
|
||||
]
|
||||
enable_plugin = True # 启用插件
|
||||
associated_types = ["vtb_text"]
|
||||
|
||||
# 模式和并行控制
|
||||
mode_enable = ChatMode.ALL
|
||||
parallel_action = True # VTB动作可以与回复并行执行,增强表达效果
|
||||
|
||||
# 激活类型设置
|
||||
focus_activation_type = ActionActivationType.LLM_JUDGE # Focus模式使用LLM判定,精确识别情感表达需求
|
||||
normal_activation_type = ActionActivationType.ALWAYS # Normal模式使用随机激活,增加趣味性
|
||||
|
||||
# LLM判定提示词(用于Focus模式)
|
||||
llm_judge_prompt = """
|
||||
判定是否需要使用VTB虚拟主播动作的条件:
|
||||
1. 当前聊天内容涉及明显的情感表达需求
|
||||
2. 用户询问或讨论情感相关话题
|
||||
3. 场景需要生动的情感回应
|
||||
4. 当前回复内容可以通过VTB动作增强表达效果
|
||||
4. 已经有足够的情感表达
|
||||
"""
|
||||
|
||||
# Random激活概率(用于Normal模式)
|
||||
random_activation_probability = 0.08 # 较低概率,避免过度使用
|
||||
|
||||
async def execute(self) -> Tuple[bool, str]:
|
||||
"""处理VTB虚拟主播动作"""
|
||||
logger.info(f"{self.log_prefix} 执行VTB动作: {self.reasoning}")
|
||||
|
||||
# 获取要表达的心情或感觉文本
|
||||
text = self.action_data.get("text")
|
||||
|
||||
if not text:
|
||||
logger.error(f"{self.log_prefix} 执行VTB动作时未提供文本内容")
|
||||
return False, "执行VTB动作失败:未提供文本内容"
|
||||
|
||||
# 处理文本使其更适合VTB动作表达
|
||||
processed_text = self._process_text_for_vtb(text)
|
||||
|
||||
try:
|
||||
# 发送VTB动作消息 - 使用新版本的send_type方法
|
||||
await self.send_type(type="vtb_text", text=processed_text)
|
||||
|
||||
logger.info(f"{self.log_prefix} VTB动作执行成功,文本内容: {processed_text}")
|
||||
return True, "VTB动作执行成功"
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"{self.log_prefix} 执行VTB动作时出错: {e}")
|
||||
return False, f"执行VTB动作时出错: {e}"
|
||||
|
||||
def _process_text_for_vtb(self, text: str) -> str:
|
||||
"""
|
||||
处理文本使其更适合VTB动作表达
|
||||
- 优化情感表达的准确性
|
||||
- 规范化心情描述格式
|
||||
- 确保文本适合虚拟主播动作系统理解
|
||||
"""
|
||||
# 简单示例实现
|
||||
processed_text = text.strip()
|
||||
|
||||
# 移除多余的空格和换行
|
||||
import re
|
||||
|
||||
processed_text = re.sub(r"\s+", " ", processed_text)
|
||||
|
||||
# 确保文本长度适中,避免过长的描述
|
||||
if len(processed_text) > 100:
|
||||
processed_text = processed_text[:100] + "..."
|
||||
|
||||
# 如果文本为空,提供默认的情感描述
|
||||
if not processed_text:
|
||||
processed_text = "平静"
|
||||
|
||||
return processed_text
|
||||
|
||||
|
||||
@register_plugin
|
||||
class VTBPlugin(BasePlugin):
|
||||
"""VTB虚拟主播插件
|
||||
- 这是虚拟主播情感表达插件
|
||||
- Normal模式下依靠随机触发增加趣味性
|
||||
- Focus模式下由LLM判断触发,精确识别情感表达需求
|
||||
- 具有情感文本处理和优化能力
|
||||
"""
|
||||
|
||||
# 插件基本信息
|
||||
plugin_name = "vtb_plugin"
|
||||
plugin_description = "虚拟主播情感表达插件"
|
||||
plugin_version = "0.1.0"
|
||||
plugin_author = "MaiBot开发团队"
|
||||
enable_plugin = True
|
||||
config_file_name = "config.toml"
|
||||
|
||||
def get_plugin_components(self) -> List[Tuple[ComponentInfo, Type]]:
|
||||
"""返回插件包含的组件列表"""
|
||||
|
||||
# 从配置获取组件启用状态
|
||||
enable_vtb = self.get_config("components.enable_vtb", True)
|
||||
components = []
|
||||
|
||||
# 添加Action组件
|
||||
if enable_vtb:
|
||||
components.append(
|
||||
(
|
||||
VTBAction.get_action_info(name="vtb_action", description="虚拟主播情感表达插件"),
|
||||
VTBAction,
|
||||
)
|
||||
)
|
||||
|
||||
return components
|
||||
Reference in New Issue
Block a user