feat:支持msg_id获取消息能力

This commit is contained in:
SengokuCola
2026-04-22 11:26:39 +08:00
parent e9da641dbb
commit 1716272b25
4 changed files with 42 additions and 2 deletions

View File

@@ -19,7 +19,7 @@ def get_tool_spec() -> ToolSpec:
return ToolSpec(
name="at",
brief_description="根据一条已知 msg_id 找到发言用户,并发送一条 @ 该用户的消息。",
brief_description="当明确提及某位用户时,发送一条 @ 该用户的消息。",
detailed_description=(
"参数说明:\n"
"- msg_idstring必填。要 @ 的目标用户发过的消息编号。\n"

View File

@@ -8,6 +8,7 @@ from src.chat.message_receive.chat_manager import BotChatSession, chat_manager
from src.common.data_models.image_data_model import MaiEmoji
from src.common.logger import get_logger
from src.common.utils.utils_image import ImageUtils
from src.plugin_runtime.host.message_utils import PluginMessageUtils
logger = get_logger("plugin_runtime.integration")
@@ -298,7 +299,9 @@ class RuntimeDataCapabilityMixin:
def _serialize_messages(messages: list) -> List[Any]:
result: List[Any] = []
for msg in messages:
if hasattr(msg, "model_dump"):
if all(hasattr(msg, attr) for attr in ("message_id", "timestamp", "platform", "message_info", "raw_message")):
result.append(dict(PluginMessageUtils._session_message_to_dict(msg)))
elif hasattr(msg, "model_dump"):
result.append(msg.model_dump())
elif hasattr(msg, "__dict__"):
result.append(dict(msg.__dict__))
@@ -306,6 +309,24 @@ class RuntimeDataCapabilityMixin:
result.append(str(msg))
return result
async def _cap_message_get_by_id(self, plugin_id: str, capability: str, args: Dict[str, Any]) -> Any:
from src.services import message_service
message_id = str(args.get("message_id") or args.get("msg_id") or "").strip()
if not message_id:
return {"success": False, "error": "缺少必要参数 message_id"}
try:
message = message_service.get_message_by_id(
message_id=message_id,
chat_id=str(args.get("chat_id") or args.get("stream_id") or "").strip() or None,
)
serialized_message = self._serialize_messages([message])[0] if message is not None else None
return {"success": True, "message": serialized_message}
except Exception as e:
logger.error(f"[cap.message.get_by_id] 执行失败: {e}", exc_info=True)
return {"success": False, "error": str(e)}
async def _cap_message_get_by_time(self, plugin_id: str, capability: str, args: Dict[str, Any]) -> Any:
from src.services import message_service

View File

@@ -51,6 +51,7 @@ def register_capability_impls(manager: "PluginRuntimeManager", supervisor: Plugi
_register("message.get_by_time", manager._cap_message_get_by_time)
_register("message.get_by_time_in_chat", manager._cap_message_get_by_time_in_chat)
_register("message.get_by_id", manager._cap_message_get_by_id)
_register("message.get_recent", manager._cap_message_get_recent)
_register("message.count_new", manager._cap_message_count_new)
_register("message.build_readable", manager._cap_message_build_readable)

View File

@@ -97,6 +97,24 @@ def get_messages_by_time_in_chat(
return _normalize_messages(messages)
def get_message_by_id(message_id: str, chat_id: Optional[str] = None) -> Optional[SessionMessage]:
"""按消息 ID 查询单条消息,可选限定会话。"""
normalized_message_id = str(message_id or "").strip()
if not normalized_message_id:
raise ValueError("message_id 不能为空")
normalized_chat_id = str(chat_id or "").strip()
messages = find_messages(
session_id=normalized_chat_id or None,
message_id=normalized_message_id,
limit=1,
limit_mode="latest",
)
normalized_messages = _normalize_messages(messages)
return normalized_messages[0] if normalized_messages else None
def get_messages_before_time(timestamp: float, limit: int = 0, filter_mai: bool = False) -> List[SessionMessage]:
if not isinstance(timestamp, (int, float)):
raise ValueError("timestamp 必须是数字类型")