refactor(agents): colocate 8 main-agent-only middleware as per-concept folders

Each main-agent-only middleware now lives in its own folder under
main_agent/middleware/<concept>/ with builder.py (flag-gated construction)
+ middleware.py (the impl), re-exported via __init__.py. This kills the
cross-folder hop into agents/shared/middleware and keeps each middleware's
two responsibilities (build vs behavior) as colocated siblings.

Moved (impl from shared/middleware, builder from main_agent/middleware):
action_log, anonymous_document, context_editing, doom_loop, knowledge_tree,
noop_injection, otel_span, tool_call_repair.

Impls moved verbatim (git rename, no body edits) so behavior is unchanged.
Builders now import from the local .middleware sibling. stack.py import
paths updated for the 3 renamed folders; shared middleware barrel trimmed;
tests repointed (imports + patch targets).
This commit is contained in:
CREDO23 2026-06-05 11:42:58 +02:00
parent fbd5ccc35a
commit 9493519c61
33 changed files with 149 additions and 83 deletions

View file

@ -10,9 +10,11 @@ import pytest
from langchain_core.messages import ToolMessage
from langchain_core.tools import tool
from app.agents.multi_agent_chat.main_agent.middleware.action_log.middleware import (
ActionLogMiddleware,
ToolDefinition,
)
from app.agents.shared.feature_flags import AgentFeatureFlags
from app.agents.shared.middleware.action_log import ActionLogMiddleware
from app.agents.shared.middleware.action_log import ToolDefinition
@dataclass
@ -58,7 +60,7 @@ def _disabled_flags() -> AgentFeatureFlags:
def patch_get_flags():
def _patch(flags: AgentFeatureFlags):
return patch(
"app.agents.shared.middleware.action_log.get_flags",
"app.agents.multi_agent_chat.main_agent.middleware.action_log.middleware.get_flags",
return_value=flags,
)
@ -360,7 +362,7 @@ class TestActionLogDispatch:
patch_get_flags(_enabled_flags()),
patch("app.db.shielded_async_session", side_effect=lambda: factory()),
patch(
"app.agents.shared.middleware.action_log.adispatch_custom_event",
"app.agents.multi_agent_chat.main_agent.middleware.action_log.middleware.adispatch_custom_event",
dispatch_mock,
),
):
@ -395,7 +397,7 @@ class TestActionLogDispatch:
patch_get_flags(_enabled_flags()),
patch("app.db.shielded_async_session", side_effect=_exploding_session),
patch(
"app.agents.shared.middleware.action_log.adispatch_custom_event",
"app.agents.multi_agent_chat.main_agent.middleware.action_log.middleware.adispatch_custom_event",
dispatch_mock,
),
):

View file

@ -7,7 +7,7 @@ from typing import Any
import pytest
from langchain_core.messages import AIMessage, HumanMessage, ToolMessage
from app.agents.shared.middleware.context_editing import (
from app.agents.multi_agent_chat.main_agent.middleware.context_editing.middleware import (
SpillToBackendEdit,
_build_spill_placeholder,
)

View file

@ -5,7 +5,10 @@ from __future__ import annotations
import pytest
from langchain_core.messages import AIMessage
from app.agents.shared.middleware.doom_loop import DoomLoopMiddleware, _signature
from app.agents.multi_agent_chat.main_agent.middleware.doom_loop.middleware import (
DoomLoopMiddleware,
_signature,
)
pytestmark = pytest.mark.unit

View file

@ -5,7 +5,7 @@ from __future__ import annotations
import pytest
from langchain_core.messages import AIMessage, HumanMessage
from app.agents.shared.middleware.noop_injection import (
from app.agents.multi_agent_chat.main_agent.middleware.noop_injection.middleware import (
NOOP_TOOL_NAME,
NoopInjectionMiddleware,
_last_ai_has_tool_calls,

View file

@ -8,7 +8,7 @@ from unittest.mock import MagicMock
import pytest
from langchain_core.messages import AIMessage, ToolMessage
from app.agents.shared.middleware.otel_span import (
from app.agents.multi_agent_chat.main_agent.middleware.otel_span.middleware import (
OtelSpanMiddleware,
_annotate_model_response,
_annotate_tool_result,
@ -206,13 +206,13 @@ class TestMiddlewareIntegration:
duration_calls: list[dict[str, Any]] = []
token_calls: list[dict[str, Any]] = []
monkeypatch.setattr(
"app.agents.shared.middleware.otel_span.ot_metrics.record_model_call_duration",
"app.agents.multi_agent_chat.main_agent.middleware.otel_span.middleware.ot_metrics.record_model_call_duration",
lambda duration_ms, **attrs: duration_calls.append(
{"duration_ms": duration_ms, **attrs}
),
)
monkeypatch.setattr(
"app.agents.shared.middleware.otel_span.ot_metrics.record_model_token_usage",
"app.agents.multi_agent_chat.main_agent.middleware.otel_span.middleware.ot_metrics.record_model_token_usage",
lambda **attrs: token_calls.append(attrs),
)
@ -257,11 +257,11 @@ class TestMiddlewareIntegration:
errors: list[str] = []
monkeypatch.setattr(
"app.agents.shared.middleware.otel_span.ot_metrics.record_tool_call_error",
"app.agents.multi_agent_chat.main_agent.middleware.otel_span.middleware.ot_metrics.record_tool_call_error",
lambda *, tool_name: errors.append(tool_name),
)
monkeypatch.setattr(
"app.agents.shared.middleware.otel_span.ot_metrics.record_tool_call_duration",
"app.agents.multi_agent_chat.main_agent.middleware.otel_span.middleware.ot_metrics.record_tool_call_duration",
lambda *args, **kwargs: None,
)

View file

@ -5,10 +5,10 @@ from __future__ import annotations
import pytest
from langchain_core.messages import AIMessage
from app.agents.multi_agent_chat.main_agent.tools.invalid_tool import INVALID_TOOL_NAME
from app.agents.shared.middleware.tool_call_repair import (
from app.agents.multi_agent_chat.main_agent.middleware.tool_call_repair.middleware import (
ToolCallNameRepairMiddleware,
)
from app.agents.multi_agent_chat.main_agent.tools.invalid_tool import INVALID_TOOL_NAME
pytestmark = pytest.mark.unit

View file

@ -9,7 +9,9 @@ contract cannot silently regress.
from __future__ import annotations
from app.agents.shared.middleware.knowledge_tree import KnowledgeTreeMiddleware
from app.agents.multi_agent_chat.main_agent.middleware.knowledge_tree.middleware import (
KnowledgeTreeMiddleware,
)
from app.agents.shared.path_resolver import DOCUMENTS_ROOT