179 lines
5.4 KiB
Python
Raw Normal View History

2025-11-04 05:17:27 +01:00
import json
2025-11-04 08:09:12 +01:00
import sqlite3
2025-11-04 05:17:27 +01:00
from dataclasses import dataclass
from enum import Enum
2025-11-04 08:09:12 +01:00
from typing import List, Optional
2025-11-04 05:17:27 +01:00
class MessageType(Enum):
REQUEST = "request"
RESPONSE = "response"
NOTIFICATION = "notification"
2025-11-04 08:09:12 +01:00
2025-11-04 05:17:27 +01:00
@dataclass
class AgentMessage:
message_id: str
from_agent: str
to_agent: str
message_type: MessageType
content: str
metadata: dict
timestamp: float
def to_dict(self) -> dict:
return {
2025-11-04 08:09:12 +01:00
"message_id": self.message_id,
"from_agent": self.from_agent,
"to_agent": self.to_agent,
"message_type": self.message_type.value,
"content": self.content,
"metadata": self.metadata,
"timestamp": self.timestamp,
2025-11-04 05:17:27 +01:00
}
@classmethod
2025-11-04 08:09:12 +01:00
def from_dict(cls, data: dict) -> "AgentMessage":
2025-11-04 05:17:27 +01:00
return cls(
2025-11-04 08:09:12 +01:00
message_id=data["message_id"],
from_agent=data["from_agent"],
to_agent=data["to_agent"],
message_type=MessageType(data["message_type"]),
content=data["content"],
metadata=data["metadata"],
timestamp=data["timestamp"],
2025-11-04 05:17:27 +01:00
)
2025-11-04 08:09:12 +01:00
2025-11-04 05:17:27 +01:00
class AgentCommunicationBus:
def __init__(self, db_path: str):
self.db_path = db_path
self.conn = sqlite3.connect(db_path)
self._create_tables()
def _create_tables(self):
cursor = self.conn.cursor()
2025-11-04 08:09:12 +01:00
cursor.execute(
"""
2025-11-04 05:17:27 +01:00
CREATE TABLE IF NOT EXISTS agent_messages (
message_id TEXT PRIMARY KEY,
from_agent TEXT,
to_agent TEXT,
message_type TEXT,
content TEXT,
metadata TEXT,
timestamp REAL,
session_id TEXT,
read INTEGER DEFAULT 0
)
2025-11-04 08:09:12 +01:00
"""
)
2025-11-04 05:17:27 +01:00
self.conn.commit()
def send_message(self, message: AgentMessage, session_id: Optional[str] = None):
cursor = self.conn.cursor()
2025-11-04 08:09:12 +01:00
cursor.execute(
"""
2025-11-04 05:17:27 +01:00
INSERT INTO agent_messages
(message_id, from_agent, to_agent, message_type, content, metadata, timestamp, session_id)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
2025-11-04 08:09:12 +01:00
""",
(
message.message_id,
message.from_agent,
message.to_agent,
message.message_type.value,
message.content,
json.dumps(message.metadata),
message.timestamp,
session_id,
),
)
2025-11-04 05:17:27 +01:00
self.conn.commit()
2025-11-04 08:10:37 +01:00
def get_messages(self, agent_id: str, unread_only: bool = True) -> List[AgentMessage]:
2025-11-04 05:17:27 +01:00
cursor = self.conn.cursor()
if unread_only:
2025-11-04 08:09:12 +01:00
cursor.execute(
"""
2025-11-04 05:17:27 +01:00
SELECT message_id, from_agent, to_agent, message_type, content, metadata, timestamp
FROM agent_messages
WHERE to_agent = ? AND read = 0
ORDER BY timestamp ASC
2025-11-04 08:09:12 +01:00
""",
(agent_id,),
)
2025-11-04 05:17:27 +01:00
else:
2025-11-04 08:09:12 +01:00
cursor.execute(
"""
2025-11-04 05:17:27 +01:00
SELECT message_id, from_agent, to_agent, message_type, content, metadata, timestamp
FROM agent_messages
WHERE to_agent = ?
ORDER BY timestamp ASC
2025-11-04 08:09:12 +01:00
""",
(agent_id,),
)
2025-11-04 05:17:27 +01:00
messages = []
for row in cursor.fetchall():
2025-11-04 08:09:12 +01:00
messages.append(
AgentMessage(
message_id=row[0],
from_agent=row[1],
to_agent=row[2],
message_type=MessageType(row[3]),
content=row[4],
metadata=json.loads(row[5]) if row[5] else {},
timestamp=row[6],
)
)
2025-11-04 05:17:27 +01:00
return messages
def mark_as_read(self, message_id: str):
cursor = self.conn.cursor()
2025-11-04 08:10:37 +01:00
cursor.execute("UPDATE agent_messages SET read = 1 WHERE message_id = ?", (message_id,))
2025-11-04 05:17:27 +01:00
self.conn.commit()
def clear_messages(self, session_id: Optional[str] = None):
cursor = self.conn.cursor()
if session_id:
2025-11-04 08:10:37 +01:00
cursor.execute("DELETE FROM agent_messages WHERE session_id = ?", (session_id,))
2025-11-04 05:17:27 +01:00
else:
2025-11-04 08:09:12 +01:00
cursor.execute("DELETE FROM agent_messages")
2025-11-04 05:17:27 +01:00
self.conn.commit()
def close(self):
self.conn.close()
def receive_messages(self, agent_id: str) -> List[AgentMessage]:
return self.get_messages(agent_id, unread_only=True)
2025-11-04 08:10:37 +01:00
def get_conversation_history(self, agent_a: str, agent_b: str) -> List[AgentMessage]:
2025-11-04 05:17:27 +01:00
cursor = self.conn.cursor()
2025-11-04 08:09:12 +01:00
cursor.execute(
"""
2025-11-04 05:17:27 +01:00
SELECT message_id, from_agent, to_agent, message_type, content, metadata, timestamp
FROM agent_messages
WHERE (from_agent = ? AND to_agent = ?) OR (from_agent = ? AND to_agent = ?)
ORDER BY timestamp ASC
2025-11-04 08:09:12 +01:00
""",
(agent_a, agent_b, agent_b, agent_a),
)
2025-11-04 05:17:27 +01:00
messages = []
for row in cursor.fetchall():
2025-11-04 08:09:12 +01:00
messages.append(
AgentMessage(
message_id=row[0],
from_agent=row[1],
to_agent=row[2],
message_type=MessageType(row[3]),
content=row[4],
metadata=json.loads(row[5]) if row[5] else {},
timestamp=row[6],
)
)
return messages