From 23a18ec3184c26573465704a78f9334cf9ebff23 Mon Sep 17 00:00:00 2001 From: xuhd Date: Wed, 3 Jun 2026 16:36:52 +0800 Subject: [PATCH] fix(skill-review): after_agent must be sync, not async --- .../middlewares/skill_review_middleware.py | 2 +- .../tests/test_skill_review_middleware.py | 16 ++++++---------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/agents/middlewares/skill_review_middleware.py b/offline-backend-20260512/backend/packages/harness/deerflow/agents/middlewares/skill_review_middleware.py index cf60c905..318ef746 100644 --- a/offline-backend-20260512/backend/packages/harness/deerflow/agents/middlewares/skill_review_middleware.py +++ b/offline-backend-20260512/backend/packages/harness/deerflow/agents/middlewares/skill_review_middleware.py @@ -39,7 +39,7 @@ class SkillReviewMiddleware(AgentMiddleware[SkillReviewMiddlewareState]): state_schema = SkillReviewMiddlewareState @override - async def after_agent(self, state: Any, runtime: Runtime) -> None: + def after_agent(self, state: Any, runtime: Runtime) -> None: """Fire background review; never raises — failures are logged only.""" try: app_config = get_app_config() diff --git a/offline-backend-20260512/backend/tests/test_skill_review_middleware.py b/offline-backend-20260512/backend/tests/test_skill_review_middleware.py index 9b6f0c88..e7e1e753 100644 --- a/offline-backend-20260512/backend/tests/test_skill_review_middleware.py +++ b/offline-backend-20260512/backend/tests/test_skill_review_middleware.py @@ -1,7 +1,6 @@ """Tests for SkillReviewMiddleware.""" from unittest.mock import MagicMock, patch -import pytest from langchain_core.messages import AIMessage, HumanMessage from deerflow.agents.middlewares.skill_review_middleware import SkillReviewMiddleware @@ -19,8 +18,7 @@ def _make_runtime(thread_id="thread-abc"): return runtime -@pytest.mark.asyncio -async def test_after_agent_calls_maybe_start_review(): +def test_after_agent_calls_maybe_start_review(): """When enabled and tool calls exist, maybe_start_review is called with correct thread_id.""" middleware = SkillReviewMiddleware() @@ -35,7 +33,7 @@ async def test_after_agent_calls_maybe_start_review(): app_cfg = MagicMock() with patch("deerflow.agents.middlewares.skill_review_middleware.get_app_config", return_value=app_cfg): with patch("deerflow.agents.middlewares.skill_review_middleware.maybe_start_review") as mock_review: - await middleware.after_agent(state, runtime) + middleware.after_agent(state, runtime) mock_review.assert_called_once() call_args = mock_review.call_args @@ -43,8 +41,7 @@ async def test_after_agent_calls_maybe_start_review(): assert call_args[0][2] is app_cfg # app_config -@pytest.mark.asyncio -async def test_after_agent_no_thread_id_skips_review(): +def test_after_agent_no_thread_id_skips_review(): """When thread_id is missing, maybe_start_review is NOT called.""" middleware = SkillReviewMiddleware() state = _make_state([HumanMessage(content="hi")]) @@ -53,13 +50,12 @@ async def test_after_agent_no_thread_id_skips_review(): app_cfg = MagicMock() with patch("deerflow.agents.middlewares.skill_review_middleware.get_app_config", return_value=app_cfg): with patch("deerflow.agents.middlewares.skill_review_middleware.maybe_start_review") as mock_review: - await middleware.after_agent(state, runtime) + middleware.after_agent(state, runtime) mock_review.assert_not_called() -@pytest.mark.asyncio -async def test_after_agent_exception_is_swallowed(): +def test_after_agent_exception_is_swallowed(): """Exceptions in after_agent must not propagate.""" middleware = SkillReviewMiddleware() state = _make_state([HumanMessage(content="hi")]) @@ -67,7 +63,7 @@ async def test_after_agent_exception_is_swallowed(): with patch("deerflow.agents.middlewares.skill_review_middleware.get_app_config", side_effect=RuntimeError("boom")): # Must not raise - await middleware.after_agent(state, runtime) + middleware.after_agent(state, runtime) def test_skill_review_middleware_in_chain_when_enabled():