feat: integrate AgentSpeak with semantic belief extraction
ref: N25B-429
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
import asyncio
|
||||
|
||||
import zmq
|
||||
from pydantic import ValidationError
|
||||
from zmq.asyncio import Context
|
||||
@@ -5,8 +7,9 @@ from zmq.asyncio import Context
|
||||
from control_backend.agents import BaseAgent
|
||||
from control_backend.agents.bdi.agentspeak_generator import AgentSpeakGenerator
|
||||
from control_backend.core.config import settings
|
||||
from control_backend.schemas.belief_list import BeliefList
|
||||
from control_backend.schemas.internal_message import InternalMessage
|
||||
from control_backend.schemas.program import Program
|
||||
from control_backend.schemas.program import Belief, ConditionalNorm, InferredBelief, Program
|
||||
|
||||
|
||||
class BDIProgramManager(BaseAgent):
|
||||
@@ -56,6 +59,45 @@ class BDIProgramManager(BaseAgent):
|
||||
|
||||
await self.send(msg)
|
||||
|
||||
@staticmethod
|
||||
def _extract_beliefs_from_program(program: Program) -> list[Belief]:
|
||||
beliefs: list[Belief] = []
|
||||
|
||||
for phase in program.phases:
|
||||
for norm in phase.norms:
|
||||
if isinstance(norm, ConditionalNorm):
|
||||
beliefs += BDIProgramManager._extract_beliefs_from_belief(norm.condition)
|
||||
|
||||
for trigger in phase.triggers:
|
||||
beliefs += BDIProgramManager._extract_beliefs_from_belief(trigger.condition)
|
||||
|
||||
return beliefs
|
||||
|
||||
@staticmethod
|
||||
def _extract_beliefs_from_belief(belief: Belief) -> list[Belief]:
|
||||
if isinstance(belief, InferredBelief):
|
||||
return BDIProgramManager._extract_beliefs_from_belief(
|
||||
belief.left
|
||||
) + BDIProgramManager._extract_beliefs_from_belief(belief.right)
|
||||
return [belief]
|
||||
|
||||
async def _send_beliefs_to_semantic_belief_extractor(self, program: Program):
|
||||
"""
|
||||
Extract beliefs from the program and send them to the Semantic Belief Extractor Agent.
|
||||
|
||||
:param program: The program received from the API.
|
||||
"""
|
||||
beliefs = BeliefList(beliefs=self._extract_beliefs_from_program(program))
|
||||
|
||||
message = InternalMessage(
|
||||
to=settings.agent_settings.text_belief_extractor_name,
|
||||
sender=self.name,
|
||||
body=beliefs.model_dump_json(),
|
||||
thread="beliefs",
|
||||
)
|
||||
|
||||
await self.send(message)
|
||||
|
||||
async def _receive_programs(self):
|
||||
"""
|
||||
Continuous loop that receives program updates from the HTTP endpoint.
|
||||
@@ -72,7 +114,10 @@ class BDIProgramManager(BaseAgent):
|
||||
self.logger.exception("Received an invalid program.")
|
||||
continue
|
||||
|
||||
await self._create_agentspeak_and_send_to_bdi(program)
|
||||
await asyncio.gather(
|
||||
self._create_agentspeak_and_send_to_bdi(program),
|
||||
self._send_beliefs_to_semantic_belief_extractor(program),
|
||||
)
|
||||
|
||||
async def setup(self):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user