refactor(agents): move MAC middleware impls out of shared kernel

knowledge_search, memory_injection and scoped_model_fallback no longer
belong in the cross-agent kernel (app/agents/shared/middleware): they are
consumed only inside multi_agent_chat. Relocate each impl next to the
builder that uses it:

- knowledge_search.py -> multi_agent_chat/shared/middleware/ (genuinely
  shared: its _render_priority_message feeds kb_context_projection, used by
  both the main agent and the KB subagent)
- memory_injection.py -> multi_agent_chat/shared/middleware/ (beside its
  memory.py builder)
- scoped_model_fallback.py -> multi_agent_chat/shared/middleware/resilience/
  (beside fallback.py/bundle.py)

Impls moved verbatim (git rename). Builders/consumers now import the local
sibling; main_agent knowledge_priority imports the new shared path; shared
middleware barrel trimmed.

Tests: repoint imports; convert the knowledge_search monkeypatch targets
from brittle dotted-string form to object-based patching (monkeypatch.setattr
on the imported module), which is robust to import ordering. No behavior
change.
This commit is contained in:
CREDO23 2026-06-05 12:04:31 +02:00
parent 9493519c61
commit 8ae190a11d
12 changed files with 35 additions and 39 deletions

View file

@ -8,7 +8,10 @@ from datetime import UTC, datetime, timedelta
import numpy as np
import pytest
from app.agents.shared.middleware.knowledge_search import search_knowledge_base
from app.agents.multi_agent_chat.shared.middleware import knowledge_search as ks
from app.agents.multi_agent_chat.shared.middleware.knowledge_search import (
search_knowledge_base,
)
from .conftest import DUMMY_EMBEDDING
@ -26,13 +29,9 @@ async def test_search_knowledge_base_applies_date_filters(
async def fake_shielded_async_session():
yield db_session
monkeypatch.setattr(ks, "shielded_async_session", fake_shielded_async_session)
monkeypatch.setattr(
"app.agents.shared.middleware.knowledge_search.shielded_async_session",
fake_shielded_async_session,
)
monkeypatch.setattr(
"app.agents.shared.middleware.knowledge_search.embed_texts",
lambda texts: [np.array(DUMMY_EMBEDDING) for _ in texts],
ks, "embed_texts", lambda texts: [np.array(DUMMY_EMBEDDING) for _ in texts]
)
space_id = seed_date_filtered_docs["search_space"].id

View file

@ -87,7 +87,7 @@ class RateLimitError(Exception):
def _build_agent(primary: BaseChatModel, fallback: BaseChatModel):
from langchain.agents import create_agent
from app.agents.shared.middleware.scoped_model_fallback import (
from app.agents.multi_agent_chat.shared.middleware.resilience.scoped_model_fallback import (
ScopedModelFallbackMiddleware,
)

View file

@ -5,10 +5,11 @@ import json
import pytest
from langchain_core.messages import AIMessage, HumanMessage
from app.agents.multi_agent_chat.shared.middleware import knowledge_search as ks
from app.agents.multi_agent_chat.shared.middleware.filesystem.backends.document_xml import (
build_document_xml as _build_document_xml,
)
from app.agents.shared.middleware.knowledge_search import (
from app.agents.multi_agent_chat.shared.middleware.knowledge_search import (
KBSearchPlan,
KnowledgePriorityMiddleware,
_normalize_optional_date_range,
@ -260,7 +261,7 @@ class TestKnowledgePriorityMiddlewarePlanner:
return []
monkeypatch.setattr(
"app.agents.shared.middleware.knowledge_search.search_knowledge_base",
ks, "search_knowledge_base",
fake_search_knowledge_base,
)
@ -303,7 +304,7 @@ class TestKnowledgePriorityMiddlewarePlanner:
return []
monkeypatch.setattr(
"app.agents.shared.middleware.knowledge_search.search_knowledge_base",
ks, "search_knowledge_base",
fake_search_knowledge_base,
)
@ -332,7 +333,7 @@ class TestKnowledgePriorityMiddlewarePlanner:
return []
monkeypatch.setattr(
"app.agents.shared.middleware.knowledge_search.search_knowledge_base",
ks, "search_knowledge_base",
fake_search_knowledge_base,
)
@ -377,11 +378,11 @@ class TestKnowledgePriorityMiddlewarePlanner:
return []
monkeypatch.setattr(
"app.agents.shared.middleware.knowledge_search.browse_recent_documents",
ks, "browse_recent_documents",
fake_browse_recent_documents,
)
monkeypatch.setattr(
"app.agents.shared.middleware.knowledge_search.search_knowledge_base",
ks, "search_knowledge_base",
fake_search_knowledge_base,
)
@ -424,11 +425,11 @@ class TestKnowledgePriorityMiddlewarePlanner:
return []
monkeypatch.setattr(
"app.agents.shared.middleware.knowledge_search.browse_recent_documents",
ks, "browse_recent_documents",
fake_browse_recent_documents,
)
monkeypatch.setattr(
"app.agents.shared.middleware.knowledge_search.search_knowledge_base",
ks, "search_knowledge_base",
fake_search_knowledge_base,
)
@ -551,11 +552,11 @@ class TestKnowledgePriorityMentionDrain:
return []
monkeypatch.setattr(
"app.agents.shared.middleware.knowledge_search.fetch_mentioned_documents",
ks, "fetch_mentioned_documents",
fake_fetch_mentioned_documents,
)
monkeypatch.setattr(
"app.agents.shared.middleware.knowledge_search.search_knowledge_base",
ks, "search_knowledge_base",
fake_search_knowledge_base,
)
@ -599,11 +600,11 @@ class TestKnowledgePriorityMentionDrain:
return []
monkeypatch.setattr(
"app.agents.shared.middleware.knowledge_search.fetch_mentioned_documents",
ks, "fetch_mentioned_documents",
fake_fetch_mentioned_documents,
)
monkeypatch.setattr(
"app.agents.shared.middleware.knowledge_search.search_knowledge_base",
ks, "search_knowledge_base",
fake_search_knowledge_base,
)
@ -644,11 +645,11 @@ class TestKnowledgePriorityMentionDrain:
return []
monkeypatch.setattr(
"app.agents.shared.middleware.knowledge_search.fetch_mentioned_documents",
ks, "fetch_mentioned_documents",
fake_fetch_mentioned_documents,
)
monkeypatch.setattr(
"app.agents.shared.middleware.knowledge_search.search_knowledge_base",
ks, "search_knowledge_base",
fake_search_knowledge_base,
)