Remove SPADE dependency #29

Merged
k.marinus merged 28 commits from refactor/remove-spade into dev 2025-11-25 10:26:07 +00:00
5 changed files with 35 additions and 11 deletions
Showing only changes of commit 4d076eac48 - Show all commits

View File

@@ -1,7 +1,7 @@
from .bdi_core_agent.bdi_core_agent import BDICoreAgent as BDICoreAgent
from .belief_collector_agent.belief_collector_agent import (
from .belief_collector_agent import (
BDIBeliefCollectorAgent as BDIBeliefCollectorAgent,
)
from .text_belief_extractor_agent.text_belief_extractor_agent import (
from .text_belief_extractor_agent import (
TextBeliefExtractorAgent as TextBeliefExtractorAgent,
)

View File

@@ -1,6 +1,7 @@
import asyncio
import copy
import json
import time
from collections.abc import Iterable
import agentspeak
@@ -22,6 +23,7 @@ class BDICoreAgent(BaseAgent):
self.env = agentspeak.runtime.Environment()
# Deep copy because we don't actually want to modify the standard actions globally
self.actions = copy.deepcopy(agentspeak.stdlib.actions)
self._wake_bdi_loop = asyncio.Event()
async def setup(self) -> None:
self.logger.debug("Setup started.")
@@ -32,6 +34,7 @@ class BDICoreAgent(BaseAgent):
# Start the BDI cycle loop
await self.add_behavior(self._bdi_loop())
self._wake_bdi_loop.set()
self.logger.debug("Setup complete.")
async def _load_asl(self):
@@ -43,10 +46,28 @@ class BDICoreAgent(BaseAgent):
self.bdi_agent = agentspeak.runtime.Agent(self.env, self.name)
async def _bdi_loop(self):
"""Runs the AgentSpeak BDI loop."""
"""
Runs the AgentSpeak BDI loop. Efficiently checks for when the next expected work will be.
"""
while self._running:
self.bdi_agent.step()
await asyncio.sleep(0.01)
await (
self._wake_bdi_loop.wait()
) # gets set whenever there's an update to the belief base
# Agent knows when it's expected to have to do its next thing
maybe_more_work = True
while maybe_more_work:
maybe_more_work = False
if self.bdi_agent.step():
maybe_more_work = True
if not maybe_more_work:
deadline = self.bdi_agent.shortest_deadline()
if deadline:
await asyncio.sleep(deadline - time.time())
maybe_more_work = True
else:
self._wake_bdi_loop.clear()
async def handle_message(self, msg: InternalMessage):
"""
@@ -93,6 +114,9 @@ class BDICoreAgent(BaseAgent):
term,
agentspeak.runtime.Intention(),
)
self._wake_bdi_loop.set()
self.logger.debug(f"Added belief {self.format_belief_string(name, args)}")
def _remove_belief(self, name: str, args: Iterable[str]):
@@ -111,6 +135,7 @@ class BDICoreAgent(BaseAgent):
if result:
self.logger.debug(f"Removed belief {self.format_belief_string(name, args)}")
self._wake_bdi_loop.set()
else:
self.logger.debug("Failed to remove belief (it was not in the belief base).")
@@ -135,6 +160,8 @@ class BDICoreAgent(BaseAgent):
)
removed_count += 1
self._wake_bdi_loop.set()
self.logger.debug(f"Removed {removed_count} beliefs.")
def _add_custom_actions(self) -> None:

View File

@@ -63,7 +63,7 @@ class VADAgent(BaseAgent):
self.audio_buffer = np.array([], dtype=np.float32)
self.i_since_speech = settings.behaviour_settings.vad_initial_since_speech
self._ready = False
self._ready = asyncio.Event()
self.model = None
async def setup(self):
@@ -141,14 +141,11 @@ class VADAgent(BaseAgent):
while await self.audio_in_poller.poll(1) is not None:
discarded += 1
self.logger.info(f"Discarded {discarded} audio packets before starting.")
self._ready = True
self._ready.set()
async def _streaming_loop(self):
await self._ready.wait()
while self._running:
if not self._ready:
await asyncio.sleep(0.1)
continue
assert self.audio_in_poller is not None
data = await self.audio_in_poller.poll()
if data is None: