diff --git a/backend/packages/harness/deerflow/agents/middlewares/summarization_middleware.py b/backend/packages/harness/deerflow/agents/middlewares/summarization_middleware.py index d6a149d32..b2f11b446 100644 --- a/backend/packages/harness/deerflow/agents/middlewares/summarization_middleware.py +++ b/backend/packages/harness/deerflow/agents/middlewares/summarization_middleware.py @@ -201,7 +201,7 @@ class DeerFlowSummarizationMiddleware(SummarizationMiddleware): "callbacks": [], }, ) - return response.text.strip() + return self._extract_summary_text(response) except Exception as e: return f"Error generating summary: {e!s}" @@ -230,10 +230,16 @@ class DeerFlowSummarizationMiddleware(SummarizationMiddleware): "callbacks": [], }, ) - return response.text.strip() + return self._extract_summary_text(response) except Exception as e: return f"Error generating summary: {e!s}" + def _extract_summary_text(self, response: Any) -> str: + summary_text = getattr(response, "content", None) + if summary_text is None: + summary_text = getattr(response, "text", "") + return summary_text.strip() if isinstance(summary_text, str) else str(summary_text).strip() + @override def _build_new_messages(self, summary: str) -> list[HumanMessage]: """Override the base implementation to let the human message with the special name 'summary'. diff --git a/backend/tests/test_summarization_middleware.py b/backend/tests/test_summarization_middleware.py index 8729374e7..b147acaf6 100644 --- a/backend/tests/test_summarization_middleware.py +++ b/backend/tests/test_summarization_middleware.py @@ -50,7 +50,7 @@ def _middleware( preserve_recent_skill_tokens_per_skill: int = 0, ) -> DeerFlowSummarizationMiddleware: model = MagicMock() - model.invoke.return_value = SimpleNamespace(text="compressed summary") + model.invoke.return_value = AIMessage(content="compressed summary") return DeerFlowSummarizationMiddleware( model=model, trigger=trigger, @@ -672,7 +672,7 @@ async def test_acreate_summary_suppresses_callbacks() -> None: """_acreate_summary must pass callbacks=[] to prevent the internal LLM call from producing visible streaming events in the frontend (issue #2804).""" middleware = _middleware() - middleware.model.ainvoke = mock.AsyncMock(return_value=SimpleNamespace(text="async summary")) + middleware.model.ainvoke = mock.AsyncMock(return_value=AIMessage(content="async summary")) await middleware._acreate_summary(_messages())