diff --git a/pyproject.toml b/pyproject.toml index 2ad3c5433..f5de2e25f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,7 +74,7 @@ dependencies = [ "websockets>=15.0.1", "aiomysql>=0.2.0", "aiosqlite>=0.21.0", - "inkfox>=0.1.0", + "inkfox>=0.1.1", "rrjieba>=0.1.13", "mcp>=0.9.0", "sse-starlette>=2.2.1", diff --git a/src/chat/memory_system/memory_metadata_index.py b/src/chat/memory_system/memory_metadata_index.py index 863961d69..eff666b2c 100644 --- a/src/chat/memory_system/memory_metadata_index.py +++ b/src/chat/memory_system/memory_metadata_index.py @@ -10,17 +10,7 @@ from src.common.logger import get_logger logger = get_logger(__name__) -# 仅允许规范导入路径:from inkfox.memory import PyMetadataIndex -try: # pragma: no cover - from inkfox.memory import PyMetadataIndex as _RustIndex # type: ignore - logger.debug("已从 inkfox.memory 成功导入 PyMetadataIndex") -except Exception as ex: # noqa: BLE001 - # 不再做任何回退;强制要求正确的 Rust 模块子模块注册 - raise RuntimeError( - "无法导入 inkfox.memory.PyMetadataIndex: %s\n" - "请确认: 1) 已在当前虚拟环境下执行 'maturin develop --release' 安装扩展; " - "2) 运行进程使用同一个 venv; 3) 没有旧的 'inkfox' 目录遮蔽 so/pyd; 4) Python 版本与编译匹配" % ex - ) from ex +from inkfox.memory import PyMetadataIndex as _RustIndex # type: ignore @dataclass class MemoryMetadataIndexEntry: diff --git a/src/chat/memory_system/memory_system.py b/src/chat/memory_system/memory_system.py index a0c08c56e..e2fd710e8 100644 --- a/src/chat/memory_system/memory_system.py +++ b/src/chat/memory_system/memory_system.py @@ -1111,7 +1111,6 @@ class MemorySystem: from src.chat.message_receive.chat_stream import get_chat_manager chat_manager = get_chat_manager() - # ChatManager.get_stream 是异步方法,需要 await,否则会产生 "coroutine was never awaited" 警告 chat_stream = await chat_manager.get_stream(stream_id) if chat_stream and hasattr(chat_stream, "context_manager"): history_limit = self._determine_history_limit(context) diff --git a/src/chat/planner_actions/action_manager.py b/src/chat/planner_actions/action_manager.py index 054acce63..13eebb548 100644 --- a/src/chat/planner_actions/action_manager.py +++ b/src/chat/planner_actions/action_manager.py @@ -615,6 +615,7 @@ class ChatterActionManager: """禁用批量存储模式""" self._batch_storage_enabled = False self._current_chat_id = None + self._pending_actions = [] # 清空队列 logger.debug("已禁用批量存储模式") def add_action_to_batch(self, action_name: str, action_data: dict, thinking_id: str = "", diff --git a/src/chat/replyer/replyer_manager.py b/src/chat/replyer/replyer_manager.py index 3e11c8a2f..e1aef6a4f 100644 --- a/src/chat/replyer/replyer_manager.py +++ b/src/chat/replyer/replyer_manager.py @@ -9,6 +9,7 @@ class ReplyerManager: def __init__(self): self._repliers: dict[str, DefaultReplyer] = {} + async def get_replyer( async def get_replyer( self, chat_stream: ChatStream | None = None, @@ -37,7 +38,6 @@ class ReplyerManager: target_stream = chat_stream if not target_stream: if chat_manager := get_chat_manager(): - # get_stream 为异步,需要等待 target_stream = await chat_manager.get_stream(stream_id) if not target_stream: diff --git a/src/plugin_system/apis/generator_api.py b/src/plugin_system/apis/generator_api.py index c3eefe6ca..458ab1572 100644 --- a/src/plugin_system/apis/generator_api.py +++ b/src/plugin_system/apis/generator_api.py @@ -9,17 +9,18 @@ """ import traceback -from typing import Any +from typing import TYPE_CHECKING, Any from rich.traceback import install from src.chat.message_receive.chat_stream import ChatStream -from src.chat.replyer.default_generator import DefaultReplyer -from src.chat.replyer.replyer_manager import replyer_manager from src.chat.utils.utils import process_llm_response from src.common.logger import get_logger from src.plugin_system.base.component_types import ActionInfo +if TYPE_CHECKING: + from src.chat.replyer.default_generator import DefaultReplyer + install(extra_lines=3) # 日志记录器 @@ -31,11 +32,12 @@ logger = get_logger("generator_api") # ============================================================================= +async def get_replyer( async def get_replyer( chat_stream: ChatStream | None = None, chat_id: str | None = None, request_type: str = "replyer", -) -> DefaultReplyer | None: +) -> Any | None: """获取回复器对象 优先使用chat_stream,如果没有则使用chat_id直接查找。 @@ -56,6 +58,8 @@ async def get_replyer( raise ValueError("chat_stream 和 chat_id 不可均为空") try: logger.debug(f"[GeneratorAPI] 正在获取回复器,chat_id: {chat_id}, chat_stream: {'有' if chat_stream else '无'}") + # 动态导入避免循环依赖 + from src.chat.replyer.replyer_manager import replyer_manager return await replyer_manager.get_replyer( chat_stream=chat_stream, chat_id=chat_id, diff --git a/src/plugins/built_in/affinity_flow_chatter/plan_executor.py b/src/plugins/built_in/affinity_flow_chatter/plan_executor.py index 10d44b1a8..91ea6ccc7 100644 --- a/src/plugins/built_in/affinity_flow_chatter/plan_executor.py +++ b/src/plugins/built_in/affinity_flow_chatter/plan_executor.py @@ -441,7 +441,7 @@ class ChatterPlanExecutor: # 通过 chat_id 获取真实的 chat_stream 对象 from src.plugin_system.apis.chat_api import get_chat_manager chat_manager = get_chat_manager() - chat_stream = chat_manager.get_stream(plan.chat_id) + chat_stream = await chat_manager.get_stream(plan.chat_id) if chat_stream: # 调用 action_manager 的批量存储