From ac73f64d4736b0adcdf26b1fb8bdfbdca19e3fff Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Mon, 9 Jun 2025 16:35:45 +0800 Subject: [PATCH] =?UTF-8?q?move=EF=BC=9A=E7=A7=BB=E5=8A=A8action=E7=9A=84?= =?UTF-8?q?=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../planners => }/actions/base_action.py | 0 .../default_actions}/__init__.py | 2 +- .../default_actions}/emoji_action.py | 2 +- .../exit_focus_chat_action.py | 2 +- .../default_actions}/no_reply_action.py | 2 +- .../default_actions}/reply_action.py | 2 +- .../planners => }/actions/plugin_action.py | 2 +- .../focus_chat/planners/action_manager.py | 49 +++--------- .../focus_chat/planners/modify_actions.py | 6 +- .../focus_chat/planners/planner_simple.py | 3 +- .../focus_chat/replyer/default_replyer.py | 2 + src/chat/normal_chat/normal_chat.py | 2 +- .../normal_chat_action_modifier.py | 12 +-- src/chat/normal_chat/normal_chat_planner.py | 12 +-- src/main.py | 78 +++++++++++++++++++ src/plugins/doubao_pic/actions/pic_action.py | 4 +- .../mute_plugin/actions/mute_action.py | 4 +- src/plugins/tts_plgin/actions/tts_action.py | 4 +- src/plugins/vtb_action/actions/vtb_action.py | 2 +- 19 files changed, 120 insertions(+), 70 deletions(-) rename src/chat/{focus_chat/planners => }/actions/base_action.py (100%) rename src/chat/{focus_chat/planners/actions => actions/default_actions}/__init__.py (83%) rename src/chat/{focus_chat/planners/actions => actions/default_actions}/emoji_action.py (97%) rename src/chat/{focus_chat/planners/actions => actions/default_actions}/exit_focus_chat_action.py (96%) rename src/chat/{focus_chat/planners/actions => actions/default_actions}/no_reply_action.py (97%) rename src/chat/{focus_chat/planners/actions => actions/default_actions}/reply_action.py (98%) rename src/chat/{focus_chat/planners => }/actions/plugin_action.py (99%) diff --git a/src/chat/focus_chat/planners/actions/base_action.py b/src/chat/actions/base_action.py similarity index 100% rename from src/chat/focus_chat/planners/actions/base_action.py rename to src/chat/actions/base_action.py diff --git a/src/chat/focus_chat/planners/actions/__init__.py b/src/chat/actions/default_actions/__init__.py similarity index 83% rename from src/chat/focus_chat/planners/actions/__init__.py rename to src/chat/actions/default_actions/__init__.py index 537090dc1..47a679520 100644 --- a/src/chat/focus_chat/planners/actions/__init__.py +++ b/src/chat/actions/default_actions/__init__.py @@ -4,4 +4,4 @@ from . import no_reply_action # noqa from . import exit_focus_chat_action # noqa from . import emoji_action # noqa -# 在此处添加更多动作模块导入 +# 在此处添加更多动作模块导入 \ No newline at end of file diff --git a/src/chat/focus_chat/planners/actions/emoji_action.py b/src/chat/actions/default_actions/emoji_action.py similarity index 97% rename from src/chat/focus_chat/planners/actions/emoji_action.py rename to src/chat/actions/default_actions/emoji_action.py index 298f33ed4..1e9571808 100644 --- a/src/chat/focus_chat/planners/actions/emoji_action.py +++ b/src/chat/actions/default_actions/emoji_action.py @@ -1,5 +1,5 @@ from src.common.logger_manager import get_logger -from src.chat.focus_chat.planners.actions.base_action import BaseAction, register_action, ActionActivationType, ChatMode +from src.chat.actions.base_action import BaseAction, register_action, ActionActivationType, ChatMode from typing import Tuple, List from src.chat.heart_flow.observation.observation import Observation from src.chat.focus_chat.replyer.default_replyer import DefaultReplyer diff --git a/src/chat/focus_chat/planners/actions/exit_focus_chat_action.py b/src/chat/actions/default_actions/exit_focus_chat_action.py similarity index 96% rename from src/chat/focus_chat/planners/actions/exit_focus_chat_action.py rename to src/chat/actions/default_actions/exit_focus_chat_action.py index 1d80f1ebf..8aa9976ae 100644 --- a/src/chat/focus_chat/planners/actions/exit_focus_chat_action.py +++ b/src/chat/actions/default_actions/exit_focus_chat_action.py @@ -1,7 +1,7 @@ import asyncio import traceback from src.common.logger_manager import get_logger -from src.chat.focus_chat.planners.actions.base_action import BaseAction, register_action, ChatMode +from src.chat.actions.base_action import BaseAction, register_action, ChatMode from typing import Tuple, List from src.chat.heart_flow.observation.observation import Observation from src.chat.message_receive.chat_stream import ChatStream diff --git a/src/chat/focus_chat/planners/actions/no_reply_action.py b/src/chat/actions/default_actions/no_reply_action.py similarity index 97% rename from src/chat/focus_chat/planners/actions/no_reply_action.py rename to src/chat/actions/default_actions/no_reply_action.py index 8cb45e8f3..b7ac95497 100644 --- a/src/chat/focus_chat/planners/actions/no_reply_action.py +++ b/src/chat/actions/default_actions/no_reply_action.py @@ -2,7 +2,7 @@ import asyncio import traceback from src.common.logger_manager import get_logger from src.chat.utils.timer_calculator import Timer -from src.chat.focus_chat.planners.actions.base_action import BaseAction, register_action, ActionActivationType, ChatMode +from src.chat.actions.base_action import BaseAction, register_action, ActionActivationType, ChatMode from typing import Tuple, List from src.chat.heart_flow.observation.observation import Observation from src.chat.heart_flow.observation.chatting_observation import ChattingObservation diff --git a/src/chat/focus_chat/planners/actions/reply_action.py b/src/chat/actions/default_actions/reply_action.py similarity index 98% rename from src/chat/focus_chat/planners/actions/reply_action.py rename to src/chat/actions/default_actions/reply_action.py index 4d9bcadc5..571c1887f 100644 --- a/src/chat/focus_chat/planners/actions/reply_action.py +++ b/src/chat/actions/default_actions/reply_action.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- from src.common.logger_manager import get_logger -from src.chat.focus_chat.planners.actions.base_action import BaseAction, register_action, ActionActivationType, ChatMode +from src.chat.actions.base_action import BaseAction, register_action, ActionActivationType, ChatMode from typing import Tuple, List from src.chat.heart_flow.observation.observation import Observation from src.chat.focus_chat.replyer.default_replyer import DefaultReplyer diff --git a/src/chat/focus_chat/planners/actions/plugin_action.py b/src/chat/actions/plugin_action.py similarity index 99% rename from src/chat/focus_chat/planners/actions/plugin_action.py rename to src/chat/actions/plugin_action.py index 3a5313830..373ac7f28 100644 --- a/src/chat/focus_chat/planners/actions/plugin_action.py +++ b/src/chat/actions/plugin_action.py @@ -1,6 +1,6 @@ import traceback from typing import Tuple, Dict, List, Any, Optional, Union, Type -from src.chat.focus_chat.planners.actions.base_action import BaseAction, register_action, ActionActivationType, ChatMode # noqa F401 +from src.chat.actions.base_action import BaseAction, register_action, ActionActivationType, ChatMode # noqa F401 from src.chat.heart_flow.observation.chatting_observation import ChattingObservation from src.chat.focus_chat.hfc_utils import create_empty_anchor_message from src.common.logger_manager import get_logger diff --git a/src/chat/focus_chat/planners/action_manager.py b/src/chat/focus_chat/planners/action_manager.py index b4910d1a1..b45300710 100644 --- a/src/chat/focus_chat/planners/action_manager.py +++ b/src/chat/focus_chat/planners/action_manager.py @@ -1,5 +1,5 @@ from typing import Dict, List, Optional, Type, Any -from src.chat.focus_chat.planners.actions.base_action import BaseAction, _ACTION_REGISTRY +from src.chat.actions.base_action import BaseAction, _ACTION_REGISTRY from src.chat.heart_flow.observation.observation import Observation from src.chat.focus_chat.replyer.default_replyer import DefaultReplyer from src.chat.focus_chat.expressors.default_expressor import DefaultExpressor @@ -9,8 +9,8 @@ import importlib import pkgutil import os -# 导入动作类,确保装饰器被执行 -import src.chat.focus_chat.planners.actions # noqa +# 不再需要导入动作类,因为已经在main.py中导入 +# import src.chat.actions.default_actions # noqa logger = get_logger("action_manager") @@ -114,42 +114,13 @@ class ActionManager: def _load_plugin_actions(self) -> None: """ 加载所有插件目录中的动作 + + 注意:插件动作的实际导入已经在main.py中完成,这里只需要从_ACTION_REGISTRY获取 """ try: - # 检查插件目录是否存在 - plugin_path = "src.plugins" - plugin_dir = plugin_path.replace(".", os.path.sep) - if not os.path.exists(plugin_dir): - logger.info(f"插件目录 {plugin_dir} 不存在,跳过插件动作加载") - return - - # 导入插件包 - try: - plugins_package = importlib.import_module(plugin_path) - except ImportError as e: - logger.error(f"导入插件包失败: {e}") - return - - # 遍历插件包中的所有子包 - for _, plugin_name, is_pkg in pkgutil.iter_modules( - plugins_package.__path__, plugins_package.__name__ + "." - ): - if not is_pkg: - continue - - # 检查插件是否有actions子包 - plugin_actions_path = f"{plugin_name}.actions" - try: - # 尝试导入插件的actions包 - importlib.import_module(plugin_actions_path) - logger.info(f"成功加载插件动作模块: {plugin_actions_path}") - except ImportError as e: - logger.debug(f"插件 {plugin_name} 没有actions子包或导入失败: {e}") - continue - - # 再次从_ACTION_REGISTRY获取所有动作(包括刚刚从插件加载的) + # 插件动作已在main.py中加载,这里只需要从_ACTION_REGISTRY获取 self._load_registered_actions() - + logger.info(f"从注册表加载插件动作成功") except Exception as e: logger.error(f"加载插件动作失败: {e}") @@ -251,7 +222,7 @@ class ActionManager: else: logger.debug(f"动作 {action_name} 在模式 {mode} 下不可用 (mode_enable: {action_mode})") - logger.info(f"模式 {mode} 下可用动作: {list(filtered_actions.keys())}") + logger.debug(f"模式 {mode} 下可用动作: {list(filtered_actions.keys())}") return filtered_actions def add_action_to_using(self, action_name: str) -> bool: @@ -291,7 +262,7 @@ class ActionManager: return False del self._using_actions[action_name] - logger.info(f"已从使用集中移除动作 {action_name}") + logger.debug(f"已从使用集中移除动作 {action_name}") return True def add_action(self, action_name: str, description: str, parameters: Dict = None, require: List = None) -> bool: @@ -358,7 +329,7 @@ class ActionManager: for action_name in system_core_actions: if action_name in self._registered_actions and action_name not in self._using_actions: self._using_actions[action_name] = self._registered_actions[action_name] - logger.info(f"添加系统核心动作到使用集: {action_name}") + logger.debug(f"添加系统核心动作到使用集: {action_name}") def add_system_action_if_needed(self, action_name: str) -> bool: """ diff --git a/src/chat/focus_chat/planners/modify_actions.py b/src/chat/focus_chat/planners/modify_actions.py index 998f83213..5ab398a56 100644 --- a/src/chat/focus_chat/planners/modify_actions.py +++ b/src/chat/focus_chat/planners/modify_actions.py @@ -6,7 +6,7 @@ from src.chat.heart_flow.observation.chatting_observation import ChattingObserva from src.chat.message_receive.chat_stream import chat_manager from src.config.config import global_config from src.llm_models.utils_model import LLMRequest -from src.chat.focus_chat.planners.actions.base_action import ActionActivationType, ChatMode +from src.chat.actions.base_action import ActionActivationType, ChatMode import random import asyncio import hashlib @@ -560,9 +560,9 @@ class ActionModifier: reply_sequence.append(action_type == "reply") # 检查no_reply比例 - if len(recent_cycles) >= (5 * global_config.chat.exit_focus_threshold) and ( + if len(recent_cycles) >= (4 * global_config.chat.exit_focus_threshold) and ( no_reply_count / len(recent_cycles) - ) >= (0.8 * global_config.chat.exit_focus_threshold): + ) >= (0.7 * global_config.chat.exit_focus_threshold): if global_config.chat.chat_mode == "auto": result["add"].append("exit_focus_chat") result["remove"].append("no_reply") diff --git a/src/chat/focus_chat/planners/planner_simple.py b/src/chat/focus_chat/planners/planner_simple.py index 1889c3952..590c80c2b 100644 --- a/src/chat/focus_chat/planners/planner_simple.py +++ b/src/chat/focus_chat/planners/planner_simple.py @@ -15,8 +15,7 @@ from src.common.logger_manager import get_logger from src.chat.utils.prompt_builder import Prompt, global_prompt_manager from src.individuality.individuality import individuality from src.chat.focus_chat.planners.action_manager import ActionManager -from src.chat.focus_chat.planners.modify_actions import ActionModifier -from src.chat.focus_chat.planners.actions.base_action import ChatMode +from src.chat.actions.base_action import ChatMode from json_repair import repair_json from src.chat.focus_chat.planners.base_planner import BasePlanner from datetime import datetime diff --git a/src/chat/focus_chat/replyer/default_replyer.py b/src/chat/focus_chat/replyer/default_replyer.py index 0c5a4957f..78727968a 100644 --- a/src/chat/focus_chat/replyer/default_replyer.py +++ b/src/chat/focus_chat/replyer/default_replyer.py @@ -139,6 +139,8 @@ class DefaultReplyer: # 处理文本部分 # text_part = action_data.get("text", []) # if text_part: + sent_msg_list = [] + with Timer("生成回复", cycle_timers): # 可以保留原有的文本处理逻辑或进行适当调整 reply = await self.reply( diff --git a/src/chat/normal_chat/normal_chat.py b/src/chat/normal_chat/normal_chat.py index 4fcbed587..6effb520b 100644 --- a/src/chat/normal_chat/normal_chat.py +++ b/src/chat/normal_chat/normal_chat.py @@ -437,7 +437,7 @@ class NormalChat: logger.warning(f"[{self.stream_name}] 没有设置切换到focus聊天模式的回调函数,无法执行切换") return else: - # await self._check_switch_to_focus() + await self._check_switch_to_focus() pass with Timer("处理表情包", timing_results): diff --git a/src/chat/normal_chat/normal_chat_action_modifier.py b/src/chat/normal_chat/normal_chat_action_modifier.py index afc2f1c5b..78593c1f5 100644 --- a/src/chat/normal_chat/normal_chat_action_modifier.py +++ b/src/chat/normal_chat/normal_chat_action_modifier.py @@ -1,7 +1,7 @@ from typing import List, Any, Dict from src.common.logger_manager import get_logger from src.chat.focus_chat.planners.action_manager import ActionManager -from src.chat.focus_chat.planners.actions.base_action import ActionActivationType, ChatMode +from src.chat.actions.base_action import ActionActivationType, ChatMode from src.chat.utils.chat_message_builder import build_readable_messages, get_raw_msg_before_timestamp_with_chat from src.config.config import global_config import random @@ -204,7 +204,7 @@ class NormalChatActionModifier: should_activate = random.random() < probability if should_activate: activated_actions[action_name] = action_info - logger.info(f"{self.log_prefix}激活动作: {action_name},原因: RANDOM类型触发(概率{probability})") + logger.debug(f"{self.log_prefix}激活动作: {action_name},原因: RANDOM类型触发(概率{probability})") else: logger.debug(f"{self.log_prefix}未激活动作: {action_name},原因: RANDOM类型未触发(概率{probability})") @@ -219,10 +219,10 @@ class NormalChatActionModifier: if should_activate: activated_actions[action_name] = action_info keywords = action_info.get("activation_keywords", []) - logger.info(f"{self.log_prefix}激活动作: {action_name},原因: KEYWORD类型匹配关键词({keywords})") + logger.debug(f"{self.log_prefix}激活动作: {action_name},原因: KEYWORD类型匹配关键词({keywords})") else: keywords = action_info.get("activation_keywords", []) - logger.info(f"{self.log_prefix}未激活动作: {action_name},原因: KEYWORD类型未匹配关键词({keywords})") + logger.debug(f"{self.log_prefix}未激活动作: {action_name},原因: KEYWORD类型未匹配关键词({keywords})") # print(f"keywords: {keywords}") # print(f"chat_content: {chat_content}") @@ -274,10 +274,10 @@ class NormalChatActionModifier: # print(f"activation_keywords: {activation_keywords}") if matched_keywords: - logger.info(f"{self.log_prefix}动作 {action_name} 匹配到关键词: {matched_keywords}") + logger.debug(f"{self.log_prefix}动作 {action_name} 匹配到关键词: {matched_keywords}") return True else: - logger.info(f"{self.log_prefix}动作 {action_name} 未匹配到任何关键词: {activation_keywords}") + logger.debug(f"{self.log_prefix}动作 {action_name} 未匹配到任何关键词: {activation_keywords}") return False def get_available_actions_count(self) -> int: diff --git a/src/chat/normal_chat/normal_chat_planner.py b/src/chat/normal_chat/normal_chat_planner.py index c618c1587..0712d1c8d 100644 --- a/src/chat/normal_chat/normal_chat_planner.py +++ b/src/chat/normal_chat/normal_chat_planner.py @@ -7,7 +7,7 @@ from src.common.logger_manager import get_logger from src.chat.utils.prompt_builder import Prompt, global_prompt_manager from src.individuality.individuality import individuality from src.chat.focus_chat.planners.action_manager import ActionManager -from src.chat.focus_chat.planners.actions.base_action import ChatMode +from src.chat.actions.base_action import ChatMode from src.chat.message_receive.message import MessageThinking from json_repair import repair_json from src.chat.utils.chat_message_builder import build_readable_messages, get_raw_msg_before_timestamp_with_chat @@ -26,6 +26,11 @@ def init_prompt(): {self_info_block} 请记住你的性格,身份和特点。 +你是群内的一员,你现在正在参与群内的闲聊,以下是群内的聊天内容: +{chat_context} + +基于以上聊天上下文和用户的最新消息,选择最合适的action。 + 注意,除了下面动作选项之外,你在聊天中不能做其他任何事情,这是你能力的边界,现在请你选择合适的action: {action_options_text} @@ -38,11 +43,6 @@ def init_prompt(): 你必须从上面列出的可用action中选择一个,并说明原因。 {moderation_prompt} -你是群内的一员,你现在正在参与群内的闲聊,以下是群内的聊天内容: -{chat_context} - -基于以上聊天上下文和用户的最新消息,选择最合适的action。 - 请以动作的输出要求,以严格的 JSON 格式输出,且仅包含 JSON 内容。不要有任何其他文字或解释: """, "normal_chat_planner_prompt", diff --git a/src/main.py b/src/main.py index 78edd4132..5108f9e5b 100644 --- a/src/main.py +++ b/src/main.py @@ -20,6 +20,13 @@ from .common.server import global_server, Server from rich.traceback import install from .chat.focus_chat.expressors.exprssion_learner import expression_learner from .api.main import start_api_server +# 导入actions模块,确保装饰器被执行 +import src.chat.actions.default_actions # noqa + +# 加载插件actions +import importlib +import pkgutil +import os install(extra_lines=3) @@ -62,6 +69,11 @@ class MainSystem: # 启动API服务器 start_api_server() logger.success("API服务器启动成功") + + # 加载所有actions,包括默认的和插件的 + self._load_all_actions() + logger.success("动作系统加载成功") + # 初始化表情管理器 emoji_manager.initialize() logger.success("表情包管理器初始化成功") @@ -109,6 +121,72 @@ class MainSystem: logger.error(f"启动大脑和外部世界失败: {e}") raise + def _load_all_actions(self): + """加载所有actions,包括默认的和插件的""" + try: + # 导入默认actions以确保装饰器被执行 + + # 检查插件目录是否存在 + plugin_path = "src.plugins" + plugin_dir = os.path.join("src", "plugins") + if not os.path.exists(plugin_dir): + logger.info(f"插件目录 {plugin_dir} 不存在,跳过插件动作加载") + return + + # 导入插件包 + try: + plugins_package = importlib.import_module(plugin_path) + logger.info(f"成功导入插件包: {plugin_path}") + except ImportError as e: + logger.error(f"导入插件包失败: {e}") + return + + # 遍历插件包中的所有子包 + loaded_plugins = 0 + for _, plugin_name, is_pkg in pkgutil.iter_modules( + plugins_package.__path__, plugins_package.__name__ + "." + ): + if not is_pkg: + continue + + logger.debug(f"检测到插件: {plugin_name}") + + # 检查插件是否有actions子包 + plugin_actions_path = f"{plugin_name}.actions" + plugin_actions_dir = plugin_name.replace(".", os.path.sep) + os.path.sep + "actions" + + if not os.path.exists(plugin_actions_dir): + logger.debug(f"插件 {plugin_name} 没有actions目录: {plugin_actions_dir}") + continue + + try: + # 尝试导入插件的actions包 + actions_module = importlib.import_module(plugin_actions_path) + logger.info(f"成功加载插件动作模块: {plugin_actions_path}") + + # 遍历actions目录中的所有Python文件 + actions_dir = os.path.dirname(actions_module.__file__) + for file in os.listdir(actions_dir): + if file.endswith('.py') and file != '__init__.py': + action_module_name = f"{plugin_actions_path}.{file[:-3]}" + try: + importlib.import_module(action_module_name) + logger.info(f"成功加载动作: {action_module_name}") + loaded_plugins += 1 + except Exception as e: + logger.error(f"加载动作失败: {action_module_name}, 错误: {e}") + + except ImportError as e: + logger.debug(f"插件 {plugin_name} 的actions子包导入失败: {e}") + continue + + logger.success(f"成功加载 {loaded_plugins} 个插件动作") + + except Exception as e: + logger.error(f"加载actions失败: {e}") + import traceback + logger.error(traceback.format_exc()) + async def schedule_tasks(self): """调度定时任务""" while True: diff --git a/src/plugins/doubao_pic/actions/pic_action.py b/src/plugins/doubao_pic/actions/pic_action.py index 360838db9..ffe9a15e4 100644 --- a/src/plugins/doubao_pic/actions/pic_action.py +++ b/src/plugins/doubao_pic/actions/pic_action.py @@ -5,8 +5,8 @@ import urllib.error import base64 # 新增:用于Base64编码 import traceback # 新增:用于打印堆栈跟踪 from typing import Tuple -from src.chat.focus_chat.planners.actions.plugin_action import PluginAction, register_action -from src.chat.focus_chat.planners.actions.base_action import ActionActivationType, ChatMode +from src.chat.actions.plugin_action import PluginAction, register_action +from src.chat.actions.base_action import ActionActivationType, ChatMode from src.common.logger_manager import get_logger from .generate_pic_config import generate_config diff --git a/src/plugins/mute_plugin/actions/mute_action.py b/src/plugins/mute_plugin/actions/mute_action.py index c19cddadb..fcf5bf540 100644 --- a/src/plugins/mute_plugin/actions/mute_action.py +++ b/src/plugins/mute_plugin/actions/mute_action.py @@ -1,6 +1,6 @@ from src.common.logger_manager import get_logger -from src.chat.focus_chat.planners.actions.plugin_action import PluginAction, register_action, ActionActivationType -from src.chat.focus_chat.planners.actions.base_action import ChatMode +from src.chat.actions.plugin_action import PluginAction, register_action, ActionActivationType +from src.chat.actions.base_action import ChatMode from typing import Tuple logger = get_logger("mute_action") diff --git a/src/plugins/tts_plgin/actions/tts_action.py b/src/plugins/tts_plgin/actions/tts_action.py index d309a27ec..12a67a0c2 100644 --- a/src/plugins/tts_plgin/actions/tts_action.py +++ b/src/plugins/tts_plgin/actions/tts_action.py @@ -1,6 +1,6 @@ from src.common.logger_manager import get_logger -from src.chat.focus_chat.planners.actions.base_action import ActionActivationType -from src.chat.focus_chat.planners.actions.plugin_action import PluginAction, register_action +from src.chat.actions.base_action import ActionActivationType +from src.chat.actions.plugin_action import PluginAction, register_action from typing import Tuple logger = get_logger("tts_action") diff --git a/src/plugins/vtb_action/actions/vtb_action.py b/src/plugins/vtb_action/actions/vtb_action.py index 70d99b951..2d3a8e507 100644 --- a/src/plugins/vtb_action/actions/vtb_action.py +++ b/src/plugins/vtb_action/actions/vtb_action.py @@ -1,5 +1,5 @@ from src.common.logger_manager import get_logger -from src.chat.focus_chat.planners.actions.plugin_action import PluginAction, register_action, ActionActivationType +from src.chat.actions.plugin_action import PluginAction, register_action, ActionActivationType from typing import Tuple logger = get_logger("vtb_action")