feat: pydantic models and inter-process messaging
Moved `InternalMessage` into schemas and created a `BeliefMessage` model. Also added the ability for agents to communicate via ZMQ to agents on another process. ref: N25B-316
This commit is contained in:
@@ -1,16 +1,17 @@
|
||||
import asyncio
|
||||
import copy
|
||||
import json
|
||||
import time
|
||||
from collections.abc import Iterable
|
||||
|
||||
import agentspeak
|
||||
import agentspeak.runtime
|
||||
import agentspeak.stdlib
|
||||
from pydantic import ValidationError
|
||||
|
||||
from control_backend.agents.base import BaseAgent
|
||||
from control_backend.core.agent_system import InternalMessage
|
||||
from control_backend.core.config import settings
|
||||
from control_backend.schemas.belief_message import BeliefMessage
|
||||
from control_backend.schemas.ri_message import SpeechCommand
|
||||
|
||||
|
||||
@@ -58,16 +59,19 @@ class BDICoreAgent(BaseAgent):
|
||||
maybe_more_work = True
|
||||
while maybe_more_work:
|
||||
maybe_more_work = False
|
||||
self.logger.debug("Stepping BDI.")
|
||||
if self.bdi_agent.step():
|
||||
maybe_more_work = True
|
||||
|
||||
if not maybe_more_work:
|
||||
deadline = self.bdi_agent.shortest_deadline()
|
||||
if deadline:
|
||||
self.logger.debug("Sleeping until %s", deadline)
|
||||
await asyncio.sleep(deadline - time.time())
|
||||
maybe_more_work = True
|
||||
else:
|
||||
self._wake_bdi_loop.clear()
|
||||
self.logger.debug("No more deadlines. Halting BDI loop.")
|
||||
|
||||
async def handle_message(self, msg: InternalMessage):
|
||||
"""
|
||||
@@ -80,10 +84,10 @@ class BDICoreAgent(BaseAgent):
|
||||
self.logger.debug("Processing message from belief collector.")
|
||||
try:
|
||||
if msg.thread == "beliefs":
|
||||
beliefs = json.loads(msg.body)
|
||||
beliefs = BeliefMessage.model_validate_json(msg.body).beliefs
|
||||
self._add_beliefs(beliefs)
|
||||
except Exception as e:
|
||||
self.logger.error(f"Error processing belief: {e}")
|
||||
except ValidationError:
|
||||
self.logger.exception("Error processing belief.")
|
||||
case settings.agent_settings.llm_name:
|
||||
content = msg.body
|
||||
self.logger.info("Received LLM response: %s", content)
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
+user_said(NewMessage) <-
|
||||
-user_said(NewMessage);
|
||||
.reply(NewMessage).
|
||||
+user_said(Message) <-
|
||||
-user_said(Message);
|
||||
.reply(Message).
|
||||
|
||||
@@ -3,6 +3,7 @@ import json
|
||||
from control_backend.agents.base import BaseAgent
|
||||
from control_backend.core.agent_system import InternalMessage
|
||||
from control_backend.core.config import settings
|
||||
from control_backend.schemas.belief_message import BeliefMessage
|
||||
|
||||
|
||||
class BDIBeliefCollectorAgent(BaseAgent):
|
||||
@@ -80,7 +81,7 @@ class BDIBeliefCollectorAgent(BaseAgent):
|
||||
msg = InternalMessage(
|
||||
to=settings.agent_settings.bdi_core_name,
|
||||
sender=self.name,
|
||||
body=json.dumps(beliefs),
|
||||
body=BeliefMessage(beliefs=beliefs).model_dump_json(),
|
||||
thread="beliefs",
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user