[Improvement] Modular middleware stack + agent/prompt caching + subagent resilience + unit tests#1351
Conversation
…dleware factories
…m from registry subagents
…rop deepagent_stack
|
@CREDO23 is attempting to deploy a commit to the Rohan Verma's projects Team on Vercel. A member of the Team first needs to authorize it. |
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Hardening pass on top of #1326. Behind
MULTI_AGENT_CHAT_ENABLED.shared/,main_agent/,subagent/)._build_main_agent_for_threadhelper across all rebuild paths (prevents factory drift on 429 recovery).High-level PR Summary
This PR refactors the multi-agent chat middleware into a modular, layered architecture organized into
shared/,main_agent/, andsubagent/folders. It introduces compile-time agent graph caching combined with per-thread LiteLLM prompt caching to improve performance. The changes enhance subagent resilience through scoped model fallback (only on provider/network errors), retry logic, and model/tool call limits. A unified_build_main_agent_for_threadhelper ensures consistent agent factory behavior across initial build, preflight, and 429 recovery paths. The system now degrades gracefully to builtin-only mode when MCP, registry, or connector discovery fails, preventing transient errors from blocking user responses. The main agent factory is renamed fromcreate_surfsense_deep_agenttocreate_multi_agent_chat_deep_agentfor clarity.⏱️ Estimated Review Time: 30-90 minutes
💡 Review Order Suggestion
surfsense_backend/app/agents/multi_agent_chat/__init__.pysurfsense_backend/app/agents/multi_agent_chat/main_agent/__init__.pysurfsense_backend/app/agents/multi_agent_chat/main_agent/runtime/__init__.pysurfsense_backend/app/agents/multi_agent_chat/middleware/shared/flags.pysurfsense_backend/app/agents/multi_agent_chat/middleware/shared/todos.pysurfsense_backend/app/agents/multi_agent_chat/middleware/shared/memory.pysurfsense_backend/app/agents/multi_agent_chat/middleware/shared/anthropic_cache.pysurfsense_backend/app/agents/multi_agent_chat/middleware/shared/patch_tool_calls.pysurfsense_backend/app/agents/multi_agent_chat/middleware/shared/compaction.pysurfsense_backend/app/agents/multi_agent_chat/middleware/shared/file_intent.pysurfsense_backend/app/agents/multi_agent_chat/middleware/shared/filesystem.pysurfsense_backend/app/agents/multi_agent_chat/middleware/shared/resilience/retry.pysurfsense_backend/app/agents/multi_agent_chat/middleware/shared/resilience/fallback.pysurfsense_backend/app/agents/multi_agent_chat/middleware/shared/resilience/model_call_limit.pysurfsense_backend/app/agents/multi_agent_chat/middleware/shared/resilience/tool_call_limit.pysurfsense_backend/app/agents/multi_agent_chat/middleware/shared/resilience/bundle.pysurfsense_backend/app/agents/new_chat/middleware/scoped_model_fallback.pysurfsense_backend/app/agents/multi_agent_chat/middleware/shared/permissions/context.pysurfsense_backend/app/agents/multi_agent_chat/middleware/shared/permissions/middleware.pysurfsense_backend/app/agents/multi_agent_chat/middleware/shared/permissions/__init__.pysurfsense_backend/app/agents/multi_agent_chat/middleware/subagent/extras.pysurfsense_backend/app/agents/multi_agent_chat/subagents/builtins/general_purpose/agent.pysurfsense_backend/app/agents/multi_agent_chat/middleware/main_agent/busy_mutex.pysurfsense_backend/app/agents/multi_agent_chat/middleware/main_agent/otel.pysurfsense_backend/app/agents/multi_agent_chat/middleware/main_agent/anonymous_doc.pysurfsense_backend/app/agents/multi_agent_chat/middleware/main_agent/knowledge_tree.pysurfsense_backend/app/agents/multi_agent_chat/middleware/main_agent/knowledge_priority.pysurfsense_backend/app/agents/multi_agent_chat/middleware/main_agent/kb_persistence.pysurfsense_backend/app/agents/multi_agent_chat/middleware/main_agent/skills.pysurfsense_backend/app/agents/multi_agent_chat/middleware/main_agent/selector.pysurfsense_backend/app/agents/multi_agent_chat/middleware/main_agent/context_editing.pysurfsense_backend/app/agents/multi_agent_chat/middleware/main_agent/noop_injection.pysurfsense_backend/app/agents/multi_agent_chat/middleware/main_agent/repair.pysurfsense_backend/app/agents/multi_agent_chat/middleware/main_agent/doom_loop.pysurfsense_backend/app/agents/multi_agent_chat/middleware/main_agent/action_log.pysurfsense_backend/app/agents/multi_agent_chat/middleware/main_agent/dedup_hitl.pysurfsense_backend/app/agents/multi_agent_chat/middleware/main_agent/plugins.pysurfsense_backend/app/agents/multi_agent_chat/middleware/main_agent/checkpointed_subagent_middleware/task_tool.pysurfsense_backend/app/agents/multi_agent_chat/middleware/stack.pysurfsense_backend/app/agents/multi_agent_chat/middleware/__init__.pysurfsense_backend/app/agents/multi_agent_chat/main_agent/graph/compile_graph_sync.pysurfsense_backend/app/agents/multi_agent_chat/main_agent/runtime/agent_cache.pysurfsense_backend/app/agents/multi_agent_chat/main_agent/runtime/factory.pysurfsense_backend/app/tasks/chat/stream_new_chat.pysurfsense_backend/app/agents/new_chat/chat_deepagent.pysurfsense_backend/tests/unit/agents/multi_agent_chat/middleware/checkpointed_subagent_middleware/test_resume_helpers.pysurfsense_backend/tests/unit/agents/multi_agent_chat/middleware/checkpointed_subagent_middleware/test_pending_interrupt.pysurfsense_backend/tests/unit/agents/multi_agent_chat/middleware/checkpointed_subagent_middleware/test_hitl_bridge.pysurfsense_backend/tests/unit/agents/multi_agent_chat/subagents/shared/test_subagent_builder.pysurfsense_backend/tests/unit/agents/new_chat/middleware/test_scoped_model_fallback.pysurfsense_backend/tests/unit/middleware/test_knowledge_search.py