chore: remove belief collector and small tweaks

This commit is contained in:
2026-01-16 15:07:44 +01:00
parent b1c18abffd
commit 8506c0d9ef
9 changed files with 34 additions and 20 deletions

View File

@@ -167,7 +167,7 @@ class BDICoreAgent(BaseAgent):
case "force_next_phase": case "force_next_phase":
self._force_next_phase() self._force_next_phase()
case _: case _:
self.logger.warning("Received unknow user interruption: %s", msg) self.logger.warning("Received unknown user interruption: %s", msg)
def _apply_belief_changes(self, belief_changes: BeliefMessage): def _apply_belief_changes(self, belief_changes: BeliefMessage):
""" """

View File

@@ -35,7 +35,6 @@ class AgentSettings(BaseModel):
Names of the various agents in the system. These names are used for routing messages. Names of the various agents in the system. These names are used for routing messages.
:ivar bdi_core_name: Name of the BDI Core Agent. :ivar bdi_core_name: Name of the BDI Core Agent.
:ivar bdi_belief_collector_name: Name of the Belief Collector Agent.
:ivar bdi_program_manager_name: Name of the BDI Program Manager Agent. :ivar bdi_program_manager_name: Name of the BDI Program Manager Agent.
:ivar text_belief_extractor_name: Name of the Text Belief Extractor Agent. :ivar text_belief_extractor_name: Name of the Text Belief Extractor Agent.
:ivar vad_name: Name of the Voice Activity Detection (VAD) Agent. :ivar vad_name: Name of the Voice Activity Detection (VAD) Agent.
@@ -50,7 +49,6 @@ class AgentSettings(BaseModel):
# agent names # agent names
bdi_core_name: str = "bdi_core_agent" bdi_core_name: str = "bdi_core_agent"
bdi_belief_collector_name: str = "belief_collector_agent"
bdi_program_manager_name: str = "bdi_program_manager_agent" bdi_program_manager_name: str = "bdi_program_manager_agent"
text_belief_extractor_name: str = "text_belief_extractor_agent" text_belief_extractor_name: str = "text_belief_extractor_agent"
vad_name: str = "vad_agent" vad_name: str = "vad_agent"

View File

@@ -26,7 +26,6 @@ from zmq.asyncio import Context
# BDI agents # BDI agents
from control_backend.agents.bdi import ( from control_backend.agents.bdi import (
BDIBeliefCollectorAgent,
BDICoreAgent, BDICoreAgent,
TextBeliefExtractorAgent, TextBeliefExtractorAgent,
) )
@@ -122,12 +121,6 @@ async def lifespan(app: FastAPI):
"name": settings.agent_settings.bdi_core_name, "name": settings.agent_settings.bdi_core_name,
}, },
), ),
"BeliefCollectorAgent": (
BDIBeliefCollectorAgent,
{
"name": settings.agent_settings.bdi_belief_collector_name,
},
),
"TextBeliefExtractorAgent": ( "TextBeliefExtractorAgent": (
TextBeliefExtractorAgent, TextBeliefExtractorAgent,
{ {

View File

@@ -478,8 +478,7 @@ async def test_stop_closes_sockets():
pubsocket.close.assert_called_once() pubsocket.close.assert_called_once()
subsocket.close.assert_called_once() subsocket.close.assert_called_once()
# Note: repsocket is not closed in stop() method, but you might want to add it repsocket.close.assert_called_once()
# repsocket.close.assert_called_once()
@pytest.mark.asyncio @pytest.mark.asyncio

View File

@@ -45,12 +45,12 @@ async def test_setup_no_asl(mock_agentspeak_env, agent):
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_handle_belief_collector_message(agent, mock_settings): async def test_handle_belief_message(agent, mock_settings):
"""Test that incoming beliefs are added to the BDI agent""" """Test that incoming beliefs are added to the BDI agent"""
beliefs = [Belief(name="user_said", arguments=["Hello"])] beliefs = [Belief(name="user_said", arguments=["Hello"])]
msg = InternalMessage( msg = InternalMessage(
to="bdi_agent", to="bdi_agent",
sender=mock_settings.agent_settings.bdi_belief_collector_name, sender=mock_settings.agent_settings.text_belief_extractor_name,
body=BeliefMessage(create=beliefs).model_dump_json(), body=BeliefMessage(create=beliefs).model_dump_json(),
thread="beliefs", thread="beliefs",
) )
@@ -82,7 +82,7 @@ async def test_handle_delete_belief_message(agent, mock_settings):
msg = InternalMessage( msg = InternalMessage(
to="bdi_agent", to="bdi_agent",
sender=mock_settings.agent_settings.bdi_belief_collector_name, sender=mock_settings.agent_settings.text_belief_extractor_name,
body=BeliefMessage(delete=beliefs).model_dump_json(), body=BeliefMessage(delete=beliefs).model_dump_json(),
thread="beliefs", thread="beliefs",
) )
@@ -104,11 +104,11 @@ async def test_handle_delete_belief_message(agent, mock_settings):
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_incorrect_belief_collector_message(agent, mock_settings): async def test_incorrect_belief_message(agent, mock_settings):
"""Test that incorrect message format triggers an exception.""" """Test that incorrect message format triggers an exception."""
msg = InternalMessage( msg = InternalMessage(
to="bdi_agent", to="bdi_agent",
sender=mock_settings.agent_settings.bdi_belief_collector_name, sender=mock_settings.agent_settings.text_belief_extractor_name,
body=json.dumps({"bad_format": "bad_format"}), body=json.dumps({"bad_format": "bad_format"}),
thread="beliefs", thread="beliefs",
) )

View File

@@ -359,6 +359,30 @@ async def test_simulated_real_turn_remove_belief(agent, llm, sample_program):
assert any(b.name == "no_more_booze" for b in agent._current_beliefs.false) assert any(b.name == "no_more_booze" for b in agent._current_beliefs.false)
@pytest.mark.asyncio
async def test_infer_goal_completions_sends_beliefs(agent, llm):
"""Test that inferred goal completions are sent to the BDI core."""
goal = BaseGoal(
id=uuid.uuid4(), name="Say Hello", description="The user said hello", can_fail=True
)
agent.goal_inferrer.goals = {goal}
# Mock goal inference: goal is achieved
llm.query = AsyncMock(return_value=True)
await agent._infer_goal_completions()
# Should send belief change to BDI core
agent.send.assert_awaited_once()
sent: InternalMessage = agent.send.call_args.args[0]
assert sent.to == settings.agent_settings.bdi_core_name
assert sent.thread == "beliefs"
parsed = BeliefMessage.model_validate_json(sent.body)
assert len(parsed.create) == 1
assert parsed.create[0].name == "achieved_say_hello"
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_llm_failure_handling(agent, llm, sample_program): async def test_llm_failure_handling(agent, llm, sample_program):
""" """

View File

@@ -55,4 +55,6 @@ def test_get_decode_options():
assert isinstance(options["sample_len"], int) assert isinstance(options["sample_len"], int)
# When disabled, it should not limit output length based on input size # When disabled, it should not limit output length based on input size
assert "sample_rate" not in options recognizer = OpenAIWhisperSpeechRecognizer(limit_output_length=False)
options = recognizer._get_decode_options(audio)
assert "sample_len" not in options

View File

@@ -60,7 +60,6 @@ async def test_handle_message_unknown_command(agent):
await agent.handle_message(msg) await agent.handle_message(msg)
agent.logger.warning.assert_called()
agent._paused.clear.assert_not_called() agent._paused.clear.assert_not_called()
agent._paused.set.assert_not_called() agent._paused.set.assert_not_called()

View File

@@ -25,7 +25,6 @@ def mock_settings():
mock.zmq_settings.internal_sub_address = "tcp://localhost:5561" mock.zmq_settings.internal_sub_address = "tcp://localhost:5561"
mock.zmq_settings.ri_command_address = "tcp://localhost:0000" mock.zmq_settings.ri_command_address = "tcp://localhost:0000"
mock.agent_settings.bdi_core_name = "bdi_core_agent" mock.agent_settings.bdi_core_name = "bdi_core_agent"
mock.agent_settings.bdi_belief_collector_name = "belief_collector_agent"
mock.agent_settings.llm_name = "llm_agent" mock.agent_settings.llm_name = "llm_agent"
mock.agent_settings.robot_speech_name = "robot_speech_agent" mock.agent_settings.robot_speech_name = "robot_speech_agent"
mock.agent_settings.transcription_name = "transcription_agent" mock.agent_settings.transcription_name = "transcription_agent"