revert: restore message.py to tanishra baseline (out of scope)

This commit is contained in:
Alexander Minges
2026-02-20 18:05:00 +01:00
parent 334078e242
commit 36d650e475

View File

@@ -1,6 +1,6 @@
"""Message tool for sending messages to users.""" """Message tool for sending messages to users."""
from typing import Any, Awaitable, Callable from typing import Any, Callable, Awaitable
from nanobot.agent.tools.base import Tool from nanobot.agent.tools.base import Tool
from nanobot.bus.events import OutboundMessage from nanobot.bus.events import OutboundMessage
@@ -8,91 +8,87 @@ from nanobot.bus.events import OutboundMessage
class MessageTool(Tool): class MessageTool(Tool):
"""Tool to send messages to users on chat channels.""" """Tool to send messages to users on chat channels."""
def __init__( def __init__(
self, self,
send_callback: Callable[[OutboundMessage], Awaitable[None]] | None = None, send_callback: Callable[[OutboundMessage], Awaitable[None]] | None = None,
default_channel: str = "", default_channel: str = "",
default_chat_id: str = "", default_chat_id: str = ""
): ):
self._send_callback = send_callback self._send_callback = send_callback
self._default_channel = default_channel self._default_channel = default_channel
self._default_chat_id = default_chat_id self._default_chat_id = default_chat_id
def set_context(self, channel: str, chat_id: str) -> None: def set_context(self, channel: str, chat_id: str) -> None:
"""Set the current message context.""" """Set the current message context."""
self._default_channel = channel self._default_channel = channel
self._default_chat_id = chat_id self._default_chat_id = chat_id
def set_send_callback(self, callback: Callable[[OutboundMessage], Awaitable[None]]) -> None: def set_send_callback(self, callback: Callable[[OutboundMessage], Awaitable[None]]) -> None:
"""Set the callback for sending messages.""" """Set the callback for sending messages."""
self._send_callback = callback self._send_callback = callback
@property @property
def name(self) -> str: def name(self) -> str:
return "message" return "message"
@property @property
def description(self) -> str: def description(self) -> str:
return ( return "Send a message to the user. Use this when you want to communicate something."
"Send a message to the user. Supports optional media/attachment "
"paths for channels that can send files."
)
@property @property
def parameters(self) -> dict[str, Any]: def parameters(self) -> dict[str, Any]:
return { return {
"type": "object", "type": "object",
"properties": { "properties": {
"content": {"type": "string", "description": "The message content to send"}, "content": {
"type": "string",
"description": "The message content to send"
},
"channel": { "channel": {
"type": "string", "type": "string",
"description": "Optional: target channel (telegram, discord, etc.)", "description": "Optional: target channel (telegram, discord, etc.)"
}, },
"chat_id": {"type": "string", "description": "Optional: target chat/user ID"}, "chat_id": {
"media": { "type": "string",
"type": "array", "description": "Optional: target chat/user ID"
"description": "Optional: local file paths to send as attachments",
"items": {"type": "string"},
}, },
"chat_id": {"type": "string", "description": "Optional: target chat/user ID"},
"media": { "media": {
"type": "array", "type": "array",
"items": {"type": "string"}, "items": {"type": "string"},
"description": "Optional: list of file paths to attach (images, audio, documents)", "description": "Optional: list of file paths to attach (images, audio, documents)"
}, }
}, },
"required": ["content"], "required": ["content"]
} }
async def execute( async def execute(
self, self,
content: str, content: str,
channel: str | None = None, channel: str | None = None,
chat_id: str | None = None, chat_id: str | None = None,
media: list[str] | None = None, media: list[str] | None = None,
**kwargs: Any, **kwargs: Any
) -> str: ) -> str:
channel = channel or self._default_channel channel = channel or self._default_channel
chat_id = chat_id or self._default_chat_id chat_id = chat_id or self._default_chat_id
if not channel or not chat_id: if not channel or not chat_id:
return "Error: No target channel/chat specified" return "Error: No target channel/chat specified"
if not self._send_callback: if not self._send_callback:
return "Error: Message sending not configured" return "Error: Message sending not configured"
media_paths: list[str] = [] msg = OutboundMessage(
for item in media or []: channel=channel,
if isinstance(item, str): chat_id=chat_id,
candidate = item.strip() content=content,
if candidate: media=media or []
media_paths.append(candidate) )
msg = OutboundMessage(channel=channel, chat_id=chat_id, content=content, media=media_paths)
try: try:
await self._send_callback(msg) await self._send_callback(msg)
return f"Message sent to {channel}:{chat_id}" media_info = f" with {len(media)} attachments" if media else ""
return f"Message sent to {channel}:{chat_id}{media_info}"
except Exception as e: except Exception as e:
return f"Error sending message: {str(e)}" return f"Error sending message: {str(e)}"