From 8506c0d9effe74889cbe2080786f948e89194caa Mon Sep 17 00:00:00 2001 From: Kasper Marinus Date: Fri, 16 Jan 2026 15:07:44 +0100 Subject: [PATCH] chore: remove belief collector and small tweaks --- .../agents/bdi/bdi_core_agent.py | 2 +- src/control_backend/core/config.py | 2 -- src/control_backend/main.py | 7 ------ .../actuation/test_robot_gesture_agent.py | 3 +-- test/unit/agents/bdi/test_bdi_core_agent.py | 10 ++++---- .../agents/bdi/test_text_belief_extractor.py | 24 +++++++++++++++++++ .../test_speech_recognizer.py | 4 +++- .../perception/vad_agent/test_vad_agent.py | 1 - test/unit/conftest.py | 1 - 9 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/control_backend/agents/bdi/bdi_core_agent.py b/src/control_backend/agents/bdi/bdi_core_agent.py index 0c217dc..628bb53 100644 --- a/src/control_backend/agents/bdi/bdi_core_agent.py +++ b/src/control_backend/agents/bdi/bdi_core_agent.py @@ -167,7 +167,7 @@ class BDICoreAgent(BaseAgent): case "force_next_phase": self._force_next_phase() 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): """ diff --git a/src/control_backend/core/config.py b/src/control_backend/core/config.py index 6deb1b8..329a246 100644 --- a/src/control_backend/core/config.py +++ b/src/control_backend/core/config.py @@ -35,7 +35,6 @@ class AgentSettings(BaseModel): 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_belief_collector_name: Name of the Belief Collector 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 vad_name: Name of the Voice Activity Detection (VAD) Agent. @@ -50,7 +49,6 @@ class AgentSettings(BaseModel): # agent names bdi_core_name: str = "bdi_core_agent" - bdi_belief_collector_name: str = "belief_collector_agent" bdi_program_manager_name: str = "bdi_program_manager_agent" text_belief_extractor_name: str = "text_belief_extractor_agent" vad_name: str = "vad_agent" diff --git a/src/control_backend/main.py b/src/control_backend/main.py index ec93b1e..a0136bd 100644 --- a/src/control_backend/main.py +++ b/src/control_backend/main.py @@ -26,7 +26,6 @@ from zmq.asyncio import Context # BDI agents from control_backend.agents.bdi import ( - BDIBeliefCollectorAgent, BDICoreAgent, TextBeliefExtractorAgent, ) @@ -122,12 +121,6 @@ async def lifespan(app: FastAPI): "name": settings.agent_settings.bdi_core_name, }, ), - "BeliefCollectorAgent": ( - BDIBeliefCollectorAgent, - { - "name": settings.agent_settings.bdi_belief_collector_name, - }, - ), "TextBeliefExtractorAgent": ( TextBeliefExtractorAgent, { diff --git a/test/unit/agents/actuation/test_robot_gesture_agent.py b/test/unit/agents/actuation/test_robot_gesture_agent.py index 225278d..1e6fd8a 100644 --- a/test/unit/agents/actuation/test_robot_gesture_agent.py +++ b/test/unit/agents/actuation/test_robot_gesture_agent.py @@ -478,8 +478,7 @@ async def test_stop_closes_sockets(): pubsocket.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 diff --git a/test/unit/agents/bdi/test_bdi_core_agent.py b/test/unit/agents/bdi/test_bdi_core_agent.py index 152d901..6245d5b 100644 --- a/test/unit/agents/bdi/test_bdi_core_agent.py +++ b/test/unit/agents/bdi/test_bdi_core_agent.py @@ -45,12 +45,12 @@ async def test_setup_no_asl(mock_agentspeak_env, agent): @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""" beliefs = [Belief(name="user_said", arguments=["Hello"])] msg = InternalMessage( 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(), thread="beliefs", ) @@ -82,7 +82,7 @@ async def test_handle_delete_belief_message(agent, mock_settings): msg = InternalMessage( 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(), thread="beliefs", ) @@ -104,11 +104,11 @@ async def test_handle_delete_belief_message(agent, mock_settings): @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.""" msg = InternalMessage( 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"}), thread="beliefs", ) diff --git a/test/unit/agents/bdi/test_text_belief_extractor.py b/test/unit/agents/bdi/test_text_belief_extractor.py index 0d7dc00..353b718 100644 --- a/test/unit/agents/bdi/test_text_belief_extractor.py +++ b/test/unit/agents/bdi/test_text_belief_extractor.py @@ -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) +@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 async def test_llm_failure_handling(agent, llm, sample_program): """ diff --git a/test/unit/agents/perception/transcription_agent/test_speech_recognizer.py b/test/unit/agents/perception/transcription_agent/test_speech_recognizer.py index 47443a9..518d189 100644 --- a/test/unit/agents/perception/transcription_agent/test_speech_recognizer.py +++ b/test/unit/agents/perception/transcription_agent/test_speech_recognizer.py @@ -55,4 +55,6 @@ def test_get_decode_options(): assert isinstance(options["sample_len"], int) # 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 diff --git a/test/unit/agents/perception/vad_agent/test_vad_agent.py b/test/unit/agents/perception/vad_agent/test_vad_agent.py index fe65545..3e6b0ad 100644 --- a/test/unit/agents/perception/vad_agent/test_vad_agent.py +++ b/test/unit/agents/perception/vad_agent/test_vad_agent.py @@ -60,7 +60,6 @@ async def test_handle_message_unknown_command(agent): await agent.handle_message(msg) - agent.logger.warning.assert_called() agent._paused.clear.assert_not_called() agent._paused.set.assert_not_called() diff --git a/test/unit/conftest.py b/test/unit/conftest.py index 6ab989e..d5f06e5 100644 --- a/test/unit/conftest.py +++ b/test/unit/conftest.py @@ -25,7 +25,6 @@ def mock_settings(): mock.zmq_settings.internal_sub_address = "tcp://localhost:5561" mock.zmq_settings.ri_command_address = "tcp://localhost:0000" 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.robot_speech_name = "robot_speech_agent" mock.agent_settings.transcription_name = "transcription_agent"