Compare commits

..

1 Commits

Author SHA1 Message Date
Björn Otgaar
dd2755b7f9 feat: intitial commit, containing comments for myself
ref: N25B-401
2026-01-13 11:19:55 +01:00
4 changed files with 20 additions and 88 deletions

View File

@@ -1,5 +1,7 @@
version: 1 version: 1
# Maak nieuwe (obvervation action)
# tussen 20-30
custom_levels: custom_levels:
OBSERVATION: 25 OBSERVATION: 25
ACTION: 26 ACTION: 26
@@ -19,6 +21,8 @@ formatters:
format: "{name} {levelname} {levelno} {message} {created} {relativeCreated}" format: "{name} {levelname} {levelno} {message} {created} {relativeCreated}"
style: "{" style: "{"
# Maak class = logging.fileHandler
#
handlers: handlers:
console: console:
class: logging.StreamHandler class: logging.StreamHandler
@@ -35,6 +39,8 @@ root:
level: WARN level: WARN
handlers: [console] handlers: [console]
# Maak research logger, laagste level (21)
# Handler: UI Handler
loggers: loggers:
control_backend: control_backend:
level: LLM level: LLM

View File

@@ -60,9 +60,6 @@ class BaseAgent(ABC):
self._tasks: set[asyncio.Task] = set() self._tasks: set[asyncio.Task] = set()
self._running = False self._running = False
self._internal_pub_socket: None | azmq.Socket = None
self._internal_sub_socket: None | azmq.Socket = None
# Register immediately # Register immediately
AgentDirectory.register(name, self) AgentDirectory.register(name, self)
@@ -133,19 +130,13 @@ class BaseAgent(ABC):
:param message: The message to send. :param message: The message to send.
""" """
message.sender = self.name target = AgentDirectory.get(message.to)
to = message.to
receivers = [to] if isinstance(to, str) else to
for receiver in receivers:
target = AgentDirectory.get(receiver)
if target: if target:
await target.inbox.put(message) await target.inbox.put(message)
self.logger.debug(f"Sent message {message.body} to {message.to} via regular inbox.") self.logger.debug(f"Sent message {message.body} to {message.to} via regular inbox.")
else: else:
# Apparently target agent is on a different process, send via ZMQ # Apparently target agent is on a different process, send via ZMQ
topic = f"internal/{receiver}".encode() topic = f"internal/{message.to}".encode()
body = message.model_dump_json().encode() body = message.model_dump_json().encode()
await self._internal_pub_socket.send_multipart([topic, body]) await self._internal_pub_socket.send_multipart([topic, body])
self.logger.debug(f"Sent message {message.body} to {message.to} via ZMQ.") self.logger.debug(f"Sent message {message.body} to {message.to} via ZMQ.")

View File

@@ -1,5 +1,3 @@
from collections.abc import Iterable
from pydantic import BaseModel from pydantic import BaseModel
@@ -7,13 +5,13 @@ class InternalMessage(BaseModel):
""" """
Standard message envelope for communication between agents within the Control Backend. Standard message envelope for communication between agents within the Control Backend.
:ivar to: The name(s) of the destination agent(s). :ivar to: The name of the destination agent.
:ivar sender: The name of the sending agent. :ivar sender: The name of the sending agent.
:ivar body: The string payload (often a JSON-serialized model). :ivar body: The string payload (often a JSON-serialized model).
:ivar thread: An optional thread identifier/topic to categorize the message (e.g., 'beliefs'). :ivar thread: An optional thread identifier/topic to categorize the message (e.g., 'beliefs').
""" """
to: str | Iterable[str] to: str
sender: str sender: str
body: str body: str
thread: str | None = None thread: str | None = None

View File

@@ -99,75 +99,12 @@ async def test_send_to_local_agent(monkeypatch):
# Patch inbox.put # Patch inbox.put
target.inbox.put = AsyncMock() target.inbox.put = AsyncMock()
message = InternalMessage(to=target.name, sender=sender.name, body="hello") message = InternalMessage(to="receiver", sender="sender", body="hello")
await sender.send(message) await sender.send(message)
target.inbox.put.assert_awaited_once_with(message) target.inbox.put.assert_awaited_once_with(message)
sender.logger.debug.assert_called_once()
@pytest.mark.asyncio
async def test_send_to_zmq_agent(monkeypatch):
sender = DummyAgent("sender")
target = "remote_receiver"
# Fake logger
sender.logger = MagicMock()
# Fake zmq
sender._internal_pub_socket = AsyncMock()
message = InternalMessage(to=target, sender=sender.name, body="hello")
await sender.send(message)
zmq_calls = sender._internal_pub_socket.send_multipart.call_args[0][0]
assert zmq_calls[0] == f"internal/{target}".encode()
@pytest.mark.asyncio
async def test_send_to_multiple_local_agents(monkeypatch):
sender = DummyAgent("sender")
target1 = DummyAgent("receiver1")
target2 = DummyAgent("receiver2")
# Fake logger
sender.logger = MagicMock()
# Patch inbox.put
target1.inbox.put = AsyncMock()
target2.inbox.put = AsyncMock()
message = InternalMessage(to=[target1.name, target2.name], sender=sender.name, body="hello")
await sender.send(message)
target1.inbox.put.assert_awaited_once_with(message)
target2.inbox.put.assert_awaited_once_with(message)
@pytest.mark.asyncio
async def test_send_to_multiple_agents(monkeypatch):
sender = DummyAgent("sender")
target1 = DummyAgent("receiver1")
target2 = "remote_receiver"
# Fake logger
sender.logger = MagicMock()
# Fake zmq
sender._internal_pub_socket = AsyncMock()
# Patch inbox.put
target1.inbox.put = AsyncMock()
message = InternalMessage(to=[target1.name, target2], sender=sender.name, body="hello")
await sender.send(message)
target1.inbox.put.assert_awaited_once_with(message)
zmq_calls = sender._internal_pub_socket.send_multipart.call_args[0][0]
assert zmq_calls[0] == f"internal/{target2}".encode()
@pytest.mark.asyncio @pytest.mark.asyncio