fix:移除_source_messages_by_id
This commit is contained in:
@@ -25,7 +25,7 @@ services:
|
|||||||
- ./data/MaiMBot/emoji:/data/emoji # 持久化表情包
|
- ./data/MaiMBot/emoji:/data/emoji # 持久化表情包
|
||||||
- ./data/MaiMBot/plugins:/MaiMBot/plugins # 插件目录
|
- ./data/MaiMBot/plugins:/MaiMBot/plugins # 插件目录
|
||||||
- ./data/MaiMBot/logs:/MaiMBot/logs # 日志目录
|
- ./data/MaiMBot/logs:/MaiMBot/logs # 日志目录
|
||||||
- ./depends-data:/MaiMBot/depends-data:ro # 运行时资源文件
|
- ./depends-data:/MaiMBot/depends-data # 运行时资源文件
|
||||||
# - site-packages:/usr/local/lib/python3.13/site-packages # 持久化Python包,需要时启用
|
# - site-packages:/usr/local/lib/python3.13/site-packages # 持久化Python包,需要时启用
|
||||||
restart: always
|
restart: always
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from src.common.data_models.mai_message_data_model import MessageInfo, UserInfo
|
|||||||
from src.common.data_models.message_component_data_model import AtComponent, MessageSequence, ReplyComponent, TextComponent
|
from src.common.data_models.message_component_data_model import AtComponent, MessageSequence, ReplyComponent, TextComponent
|
||||||
from src.config.config import global_config
|
from src.config.config import global_config
|
||||||
from src.maisaka.builtin_tool.context import BuiltinToolRuntimeContext
|
from src.maisaka.builtin_tool.context import BuiltinToolRuntimeContext
|
||||||
|
from src.maisaka.runtime import MaisakaHeartFlowChatting
|
||||||
|
|
||||||
|
|
||||||
def _build_sent_message() -> SessionMessage:
|
def _build_sent_message() -> SessionMessage:
|
||||||
@@ -63,7 +64,9 @@ def test_post_process_reply_message_sequences_converts_at_marker_before_bracket_
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
runtime = SimpleNamespace(_source_messages_by_id={"12160142": target_message})
|
runtime = SimpleNamespace(
|
||||||
|
find_source_message_by_id=lambda message_id: target_message if message_id == "12160142" else None
|
||||||
|
)
|
||||||
engine = SimpleNamespace(_get_runtime_manager=lambda: None)
|
engine = SimpleNamespace(_get_runtime_manager=lambda: None)
|
||||||
tool_ctx = BuiltinToolRuntimeContext(engine=engine, runtime=runtime)
|
tool_ctx = BuiltinToolRuntimeContext(engine=engine, runtime=runtime)
|
||||||
|
|
||||||
@@ -85,7 +88,7 @@ def test_post_process_reply_message_sequences_ignores_at_marker_when_disabled(mo
|
|||||||
"src.maisaka.builtin_tool.context.process_llm_response",
|
"src.maisaka.builtin_tool.context.process_llm_response",
|
||||||
lambda text: [text.strip()] if text.strip() else [],
|
lambda text: [text.strip()] if text.strip() else [],
|
||||||
)
|
)
|
||||||
runtime = SimpleNamespace(_source_messages_by_id={})
|
runtime = SimpleNamespace(find_source_message_by_id=lambda message_id: None)
|
||||||
engine = SimpleNamespace(_get_runtime_manager=lambda: None)
|
engine = SimpleNamespace(_get_runtime_manager=lambda: None)
|
||||||
tool_ctx = BuiltinToolRuntimeContext(engine=engine, runtime=runtime)
|
tool_ctx = BuiltinToolRuntimeContext(engine=engine, runtime=runtime)
|
||||||
|
|
||||||
@@ -96,3 +99,15 @@ def test_post_process_reply_message_sequences_ignores_at_marker_when_disabled(mo
|
|||||||
assert len(components) == 1
|
assert len(components) == 1
|
||||||
assert isinstance(components[0], TextComponent)
|
assert isinstance(components[0], TextComponent)
|
||||||
assert components[0].text == "at[12160142] 就这个群"
|
assert components[0].text == "at[12160142] 就这个群"
|
||||||
|
|
||||||
|
|
||||||
|
def test_runtime_finds_source_message_from_history() -> None:
|
||||||
|
target_message = _build_sent_message()
|
||||||
|
runtime = object.__new__(MaisakaHeartFlowChatting)
|
||||||
|
runtime._chat_history = [
|
||||||
|
SimpleNamespace(message_id="other-message-id", original_message=SimpleNamespace()),
|
||||||
|
SimpleNamespace(message_id="real-message-id", original_message=target_message),
|
||||||
|
]
|
||||||
|
|
||||||
|
assert runtime.find_source_message_by_id("real-message-id") is target_message
|
||||||
|
assert runtime.find_source_message_by_id("missing-message-id") is None
|
||||||
|
|||||||
@@ -199,7 +199,7 @@ async def test_reply_tool_puts_monitor_detail_into_metadata(monkeypatch: pytest.
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
runtime = SimpleNamespace(
|
runtime = SimpleNamespace(
|
||||||
_source_messages_by_id={"msg-1": target_message},
|
find_source_message_by_id=lambda message_id: target_message if message_id == "msg-1" else None,
|
||||||
log_prefix="[test]",
|
log_prefix="[test]",
|
||||||
chat_stream=SimpleNamespace(platform=reply_tool_module.CLI_PLATFORM_NAME),
|
chat_stream=SimpleNamespace(platform=reply_tool_module.CLI_PLATFORM_NAME),
|
||||||
session_id="session-1",
|
session_id="session-1",
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ class BuiltinToolRuntimeContext:
|
|||||||
def _build_at_component_for_message_id(self, message_id: str) -> Optional[AtComponent]:
|
def _build_at_component_for_message_id(self, message_id: str) -> Optional[AtComponent]:
|
||||||
"""根据消息编号构造 at 组件。"""
|
"""根据消息编号构造 at 组件。"""
|
||||||
|
|
||||||
target_message = self.runtime._source_messages_by_id.get(message_id)
|
target_message = self.runtime.find_source_message_by_id(message_id)
|
||||||
if target_message is None:
|
if target_message is None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ async def handle_tool(
|
|||||||
"reply 工具需要提供有效的 `msg_id` 参数。",
|
"reply 工具需要提供有效的 `msg_id` 参数。",
|
||||||
)
|
)
|
||||||
|
|
||||||
target_message = tool_ctx.runtime._source_messages_by_id.get(target_message_id)
|
target_message = tool_ctx.runtime.find_source_message_by_id(target_message_id)
|
||||||
if target_message is None:
|
if target_message is None:
|
||||||
return tool_ctx.build_failure_result(
|
return tool_ctx.build_failure_result(
|
||||||
invocation.tool_name,
|
invocation.tool_name,
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ async def handle_tool(
|
|||||||
"查看复杂消息工具需要提供有效的 `msg_id` 参数。",
|
"查看复杂消息工具需要提供有效的 `msg_id` 参数。",
|
||||||
)
|
)
|
||||||
|
|
||||||
target_message = tool_ctx.runtime._source_messages_by_id.get(target_message_id)
|
target_message = tool_ctx.runtime.find_source_message_by_id(target_message_id)
|
||||||
if target_message is None:
|
if target_message is None:
|
||||||
return tool_ctx.build_failure_result(
|
return tool_ctx.build_failure_result(
|
||||||
invocation.tool_name,
|
invocation.tool_name,
|
||||||
|
|||||||
@@ -90,7 +90,6 @@ class MaisakaHeartFlowChatting:
|
|||||||
self._mcp_manager: Optional[MCPManager] = None
|
self._mcp_manager: Optional[MCPManager] = None
|
||||||
self._mcp_host_bridge: Optional[MCPHostLLMBridge] = None
|
self._mcp_host_bridge: Optional[MCPHostLLMBridge] = None
|
||||||
self._current_cycle_detail: Optional[CycleDetail] = None
|
self._current_cycle_detail: Optional[CycleDetail] = None
|
||||||
self._source_messages_by_id: dict[str, SessionMessage] = {}
|
|
||||||
self._running = False
|
self._running = False
|
||||||
self._cycle_counter = 0
|
self._cycle_counter = 0
|
||||||
self._internal_loop_task: Optional[asyncio.Task] = None
|
self._internal_loop_task: Optional[asyncio.Task] = None
|
||||||
@@ -315,7 +314,6 @@ class MaisakaHeartFlowChatting:
|
|||||||
self._update_message_trigger_state(message)
|
self._update_message_trigger_state(message)
|
||||||
self.message_cache.append(message)
|
self.message_cache.append(message)
|
||||||
self._message_received_at_by_id[message.message_id] = received_at
|
self._message_received_at_by_id[message.message_id] = received_at
|
||||||
self._source_messages_by_id[message.message_id] = message
|
|
||||||
if self._is_reply_effect_tracking_enabled():
|
if self._is_reply_effect_tracking_enabled():
|
||||||
asyncio.create_task(self._reply_effect_tracker.observe_user_message(message))
|
asyncio.create_task(self._reply_effect_tracker.observe_user_message(message))
|
||||||
if self._agent_state == self._STATE_RUNNING:
|
if self._agent_state == self._STATE_RUNNING:
|
||||||
@@ -487,6 +485,23 @@ class MaisakaHeartFlowChatting:
|
|||||||
f"最近10分钟样本数={len(self._recent_reply_latencies)}"
|
f"最近10分钟样本数={len(self._recent_reply_latencies)}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def find_source_message_by_id(self, message_id: str) -> Optional[SessionMessage]:
|
||||||
|
"""从 Maisaka 历史中查找指定消息编号对应的原始消息。"""
|
||||||
|
normalized_message_id = str(message_id or "").strip()
|
||||||
|
if not normalized_message_id:
|
||||||
|
return None
|
||||||
|
|
||||||
|
for history_message in reversed(self._chat_history):
|
||||||
|
if str(getattr(history_message, "message_id", "") or "").strip() != normalized_message_id:
|
||||||
|
continue
|
||||||
|
|
||||||
|
original_message = getattr(history_message, "original_message", None)
|
||||||
|
if original_message is None:
|
||||||
|
continue
|
||||||
|
return original_message
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
def _should_trigger_message_turn_by_idle_compensation(
|
def _should_trigger_message_turn_by_idle_compensation(
|
||||||
self,
|
self,
|
||||||
*,
|
*,
|
||||||
|
|||||||
Reference in New Issue
Block a user