Remove SPADE dependency #29
@@ -1,7 +1,7 @@
|
|||||||
from .bdi_core_agent.bdi_core_agent import BDICoreAgent as BDICoreAgent
|
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,
|
BDIBeliefCollectorAgent as BDIBeliefCollectorAgent,
|
||||||
)
|
)
|
||||||
from .text_belief_extractor_agent.text_belief_extractor_agent import (
|
from .text_belief_extractor_agent import (
|
||||||
TextBeliefExtractorAgent as TextBeliefExtractorAgent,
|
TextBeliefExtractorAgent as TextBeliefExtractorAgent,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import copy
|
import copy
|
||||||
import json
|
import json
|
||||||
|
import time
|
||||||
from collections.abc import Iterable
|
from collections.abc import Iterable
|
||||||
|
|
||||||
import agentspeak
|
import agentspeak
|
||||||
@@ -22,6 +23,7 @@ class BDICoreAgent(BaseAgent):
|
|||||||
self.env = agentspeak.runtime.Environment()
|
self.env = agentspeak.runtime.Environment()
|
||||||
# Deep copy because we don't actually want to modify the standard actions globally
|
# Deep copy because we don't actually want to modify the standard actions globally
|
||||||
self.actions = copy.deepcopy(agentspeak.stdlib.actions)
|
self.actions = copy.deepcopy(agentspeak.stdlib.actions)
|
||||||
|
self._wake_bdi_loop = asyncio.Event()
|
||||||
|
|
||||||
async def setup(self) -> None:
|
async def setup(self) -> None:
|
||||||
self.logger.debug("Setup started.")
|
self.logger.debug("Setup started.")
|
||||||
@@ -32,6 +34,7 @@ class BDICoreAgent(BaseAgent):
|
|||||||
|
|
||||||
# Start the BDI cycle loop
|
# Start the BDI cycle loop
|
||||||
await self.add_behavior(self._bdi_loop())
|
await self.add_behavior(self._bdi_loop())
|
||||||
|
self._wake_bdi_loop.set()
|
||||||
self.logger.debug("Setup complete.")
|
self.logger.debug("Setup complete.")
|
||||||
|
|
||||||
async def _load_asl(self):
|
async def _load_asl(self):
|
||||||
@@ -43,10 +46,28 @@ class BDICoreAgent(BaseAgent):
|
|||||||
self.bdi_agent = agentspeak.runtime.Agent(self.env, self.name)
|
self.bdi_agent = agentspeak.runtime.Agent(self.env, self.name)
|
||||||
|
|
||||||
async def _bdi_loop(self):
|
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:
|
while self._running:
|
||||||
self.bdi_agent.step()
|
await (
|
||||||
await asyncio.sleep(0.01)
|
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):
|
async def handle_message(self, msg: InternalMessage):
|
||||||
"""
|
"""
|
||||||
@@ -93,6 +114,9 @@ class BDICoreAgent(BaseAgent):
|
|||||||
term,
|
term,
|
||||||
agentspeak.runtime.Intention(),
|
agentspeak.runtime.Intention(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self._wake_bdi_loop.set()
|
||||||
|
|
||||||
self.logger.debug(f"Added belief {self.format_belief_string(name, args)}")
|
self.logger.debug(f"Added belief {self.format_belief_string(name, args)}")
|
||||||
|
|
||||||
def _remove_belief(self, name: str, args: Iterable[str]):
|
def _remove_belief(self, name: str, args: Iterable[str]):
|
||||||
@@ -111,6 +135,7 @@ class BDICoreAgent(BaseAgent):
|
|||||||
|
|
||||||
if result:
|
if result:
|
||||||
self.logger.debug(f"Removed belief {self.format_belief_string(name, args)}")
|
self.logger.debug(f"Removed belief {self.format_belief_string(name, args)}")
|
||||||
|
self._wake_bdi_loop.set()
|
||||||
else:
|
else:
|
||||||
self.logger.debug("Failed to remove belief (it was not in the belief base).")
|
self.logger.debug("Failed to remove belief (it was not in the belief base).")
|
||||||
|
|
||||||
@@ -135,6 +160,8 @@ class BDICoreAgent(BaseAgent):
|
|||||||
)
|
)
|
||||||
removed_count += 1
|
removed_count += 1
|
||||||
|
|
||||||
|
self._wake_bdi_loop.set()
|
||||||
|
|
||||||
self.logger.debug(f"Removed {removed_count} beliefs.")
|
self.logger.debug(f"Removed {removed_count} beliefs.")
|
||||||
|
|
||||||
def _add_custom_actions(self) -> None:
|
def _add_custom_actions(self) -> None:
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ class VADAgent(BaseAgent):
|
|||||||
|
|
||||||
self.audio_buffer = np.array([], dtype=np.float32)
|
self.audio_buffer = np.array([], dtype=np.float32)
|
||||||
self.i_since_speech = settings.behaviour_settings.vad_initial_since_speech
|
self.i_since_speech = settings.behaviour_settings.vad_initial_since_speech
|
||||||
self._ready = False
|
self._ready = asyncio.Event()
|
||||||
self.model = None
|
self.model = None
|
||||||
|
|
||||||
async def setup(self):
|
async def setup(self):
|
||||||
@@ -141,14 +141,11 @@ class VADAgent(BaseAgent):
|
|||||||
while await self.audio_in_poller.poll(1) is not None:
|
while await self.audio_in_poller.poll(1) is not None:
|
||||||
discarded += 1
|
discarded += 1
|
||||||
self.logger.info(f"Discarded {discarded} audio packets before starting.")
|
self.logger.info(f"Discarded {discarded} audio packets before starting.")
|
||||||
self._ready = True
|
self._ready.set()
|
||||||
|
|
||||||
async def _streaming_loop(self):
|
async def _streaming_loop(self):
|
||||||
|
await self._ready.wait()
|
||||||
while self._running:
|
while self._running:
|
||||||
if not self._ready:
|
|
||||||
await asyncio.sleep(0.1)
|
|
||||||
continue
|
|
||||||
|
|
||||||
assert self.audio_in_poller is not None
|
assert self.audio_in_poller is not None
|
||||||
data = await self.audio_in_poller.poll()
|
data = await self.audio_in_poller.poll()
|
||||||
if data is None:
|
if data is None:
|
||||||
|
|||||||
Reference in New Issue
Block a user