feat:可以查看转发消息,新增复杂消息,修复表情包缓存,修改bot自己的消息回调msg_id
This commit is contained in:
99
src/maisaka/builtin_tool/view_complex_message.py
Normal file
99
src/maisaka/builtin_tool/view_complex_message.py
Normal file
@@ -0,0 +1,99 @@
|
||||
"""view_complex_message 内置工具。"""
|
||||
|
||||
from typing import Optional
|
||||
|
||||
from src.common.logger import get_logger
|
||||
from src.core.tooling import ToolExecutionContext, ToolExecutionResult, ToolInvocation, ToolSpec
|
||||
|
||||
from ..context_messages import build_full_complex_message_content, contains_complex_message
|
||||
from .context import BuiltinToolRuntimeContext
|
||||
|
||||
logger = get_logger("maisaka_builtin_view_complex_message")
|
||||
|
||||
|
||||
def get_tool_spec() -> ToolSpec:
|
||||
"""获取 view_complex_message 工具声明。"""
|
||||
|
||||
return ToolSpec(
|
||||
name="view_complex_message",
|
||||
brief_description="根据 msg_id 查看复杂消息的完整内容,适用于 Prompt 中标记为 [消息类型]复杂消息 的消息。",
|
||||
detailed_description=(
|
||||
"参数说明:\n"
|
||||
"- msg_id:string,必填。要查看完整内容的目标消息编号。\n\n"
|
||||
"当你在上下文中看到 [消息类型]复杂消息 时,可调用本工具查看对应转发消息的完整展开内容。"
|
||||
),
|
||||
parameters_schema={
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"msg_id": {
|
||||
"type": "string",
|
||||
"description": "要查看完整内容的目标消息编号。",
|
||||
},
|
||||
},
|
||||
"required": ["msg_id"],
|
||||
},
|
||||
provider_name="maisaka_builtin",
|
||||
provider_type="builtin",
|
||||
)
|
||||
|
||||
|
||||
async def handle_tool(
|
||||
tool_ctx: BuiltinToolRuntimeContext,
|
||||
invocation: ToolInvocation,
|
||||
context: Optional[ToolExecutionContext] = None,
|
||||
) -> ToolExecutionResult:
|
||||
"""执行 view_complex_message 内置工具。"""
|
||||
|
||||
del context
|
||||
target_message_id = str(invocation.arguments.get("msg_id") or "").strip()
|
||||
if not target_message_id:
|
||||
return tool_ctx.build_failure_result(
|
||||
invocation.tool_name,
|
||||
"查看复杂消息工具需要提供有效的 `msg_id` 参数。",
|
||||
)
|
||||
|
||||
target_message = tool_ctx.runtime._source_messages_by_id.get(target_message_id)
|
||||
if target_message is None:
|
||||
return tool_ctx.build_failure_result(
|
||||
invocation.tool_name,
|
||||
f"未找到目标复杂消息,msg_id={target_message_id}",
|
||||
)
|
||||
|
||||
if not contains_complex_message(target_message.raw_message):
|
||||
return tool_ctx.build_failure_result(
|
||||
invocation.tool_name,
|
||||
f"目标消息不是可展开查看的转发消息,msg_id={target_message_id}",
|
||||
)
|
||||
|
||||
logger.info(
|
||||
f"{tool_ctx.runtime.log_prefix} 触发复杂消息查看工具,目标消息编号={target_message_id}"
|
||||
)
|
||||
try:
|
||||
full_content = await build_full_complex_message_content(target_message)
|
||||
except Exception as exc:
|
||||
logger.exception(
|
||||
f"{tool_ctx.runtime.log_prefix} 查看复杂消息时发生异常: 目标消息编号={target_message_id} 异常={exc}"
|
||||
)
|
||||
return tool_ctx.build_failure_result(
|
||||
invocation.tool_name,
|
||||
"查看复杂消息完整内容时发生异常。",
|
||||
)
|
||||
|
||||
if not full_content:
|
||||
return tool_ctx.build_failure_result(
|
||||
invocation.tool_name,
|
||||
f"复杂消息内容为空,msg_id={target_message_id}",
|
||||
)
|
||||
|
||||
return tool_ctx.build_success_result(
|
||||
invocation.tool_name,
|
||||
full_content,
|
||||
structured_content={
|
||||
"msg_id": target_message_id,
|
||||
"message_type": "forward",
|
||||
"full_content": full_content,
|
||||
},
|
||||
metadata={
|
||||
"record_display_prompt": f"你查看了复杂消息 {target_message_id} 的完整内容。",
|
||||
},
|
||||
)
|
||||
Reference in New Issue
Block a user