empathy-framework 4.6.6__py3-none-any.whl → 4.7.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. empathy_framework-4.7.1.dist-info/METADATA +690 -0
  2. empathy_framework-4.7.1.dist-info/RECORD +379 -0
  3. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/top_level.txt +1 -2
  4. empathy_healthcare_plugin/monitors/monitoring/__init__.py +9 -9
  5. empathy_llm_toolkit/agent_factory/__init__.py +6 -6
  6. empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +7 -10
  7. empathy_llm_toolkit/agents_md/__init__.py +22 -0
  8. empathy_llm_toolkit/agents_md/loader.py +218 -0
  9. empathy_llm_toolkit/agents_md/parser.py +271 -0
  10. empathy_llm_toolkit/agents_md/registry.py +307 -0
  11. empathy_llm_toolkit/commands/__init__.py +51 -0
  12. empathy_llm_toolkit/commands/context.py +375 -0
  13. empathy_llm_toolkit/commands/loader.py +301 -0
  14. empathy_llm_toolkit/commands/models.py +231 -0
  15. empathy_llm_toolkit/commands/parser.py +371 -0
  16. empathy_llm_toolkit/commands/registry.py +429 -0
  17. empathy_llm_toolkit/config/__init__.py +8 -8
  18. empathy_llm_toolkit/config/unified.py +3 -7
  19. empathy_llm_toolkit/context/__init__.py +22 -0
  20. empathy_llm_toolkit/context/compaction.py +455 -0
  21. empathy_llm_toolkit/context/manager.py +434 -0
  22. empathy_llm_toolkit/hooks/__init__.py +24 -0
  23. empathy_llm_toolkit/hooks/config.py +306 -0
  24. empathy_llm_toolkit/hooks/executor.py +289 -0
  25. empathy_llm_toolkit/hooks/registry.py +302 -0
  26. empathy_llm_toolkit/hooks/scripts/__init__.py +39 -0
  27. empathy_llm_toolkit/hooks/scripts/evaluate_session.py +201 -0
  28. empathy_llm_toolkit/hooks/scripts/first_time_init.py +285 -0
  29. empathy_llm_toolkit/hooks/scripts/pre_compact.py +207 -0
  30. empathy_llm_toolkit/hooks/scripts/session_end.py +183 -0
  31. empathy_llm_toolkit/hooks/scripts/session_start.py +163 -0
  32. empathy_llm_toolkit/hooks/scripts/suggest_compact.py +225 -0
  33. empathy_llm_toolkit/learning/__init__.py +30 -0
  34. empathy_llm_toolkit/learning/evaluator.py +438 -0
  35. empathy_llm_toolkit/learning/extractor.py +514 -0
  36. empathy_llm_toolkit/learning/storage.py +560 -0
  37. empathy_llm_toolkit/providers.py +4 -11
  38. empathy_llm_toolkit/security/__init__.py +17 -17
  39. empathy_llm_toolkit/utils/tokens.py +2 -5
  40. empathy_os/__init__.py +202 -70
  41. empathy_os/cache_monitor.py +5 -3
  42. empathy_os/cli/__init__.py +11 -55
  43. empathy_os/cli/__main__.py +29 -15
  44. empathy_os/cli/commands/inspection.py +21 -12
  45. empathy_os/cli/commands/memory.py +4 -12
  46. empathy_os/cli/commands/profiling.py +198 -0
  47. empathy_os/cli/commands/utilities.py +27 -7
  48. empathy_os/cli.py +28 -57
  49. empathy_os/cli_unified.py +525 -1164
  50. empathy_os/cost_tracker.py +9 -3
  51. empathy_os/dashboard/server.py +200 -2
  52. empathy_os/hot_reload/__init__.py +7 -7
  53. empathy_os/hot_reload/config.py +6 -7
  54. empathy_os/hot_reload/integration.py +35 -35
  55. empathy_os/hot_reload/reloader.py +57 -57
  56. empathy_os/hot_reload/watcher.py +28 -28
  57. empathy_os/hot_reload/websocket.py +2 -2
  58. empathy_os/memory/__init__.py +11 -4
  59. empathy_os/memory/claude_memory.py +1 -1
  60. empathy_os/memory/cross_session.py +8 -12
  61. empathy_os/memory/edges.py +6 -6
  62. empathy_os/memory/file_session.py +770 -0
  63. empathy_os/memory/graph.py +30 -30
  64. empathy_os/memory/nodes.py +6 -6
  65. empathy_os/memory/short_term.py +15 -9
  66. empathy_os/memory/unified.py +606 -140
  67. empathy_os/meta_workflows/agent_creator.py +3 -9
  68. empathy_os/meta_workflows/cli_meta_workflows.py +113 -53
  69. empathy_os/meta_workflows/form_engine.py +6 -18
  70. empathy_os/meta_workflows/intent_detector.py +64 -24
  71. empathy_os/meta_workflows/models.py +3 -1
  72. empathy_os/meta_workflows/pattern_learner.py +13 -31
  73. empathy_os/meta_workflows/plan_generator.py +55 -47
  74. empathy_os/meta_workflows/session_context.py +2 -3
  75. empathy_os/meta_workflows/workflow.py +20 -51
  76. empathy_os/models/cli.py +2 -2
  77. empathy_os/models/tasks.py +1 -2
  78. empathy_os/models/telemetry.py +4 -1
  79. empathy_os/models/token_estimator.py +3 -1
  80. empathy_os/monitoring/alerts.py +938 -9
  81. empathy_os/monitoring/alerts_cli.py +346 -183
  82. empathy_os/orchestration/execution_strategies.py +12 -29
  83. empathy_os/orchestration/pattern_learner.py +20 -26
  84. empathy_os/orchestration/real_tools.py +6 -15
  85. empathy_os/platform_utils.py +2 -1
  86. empathy_os/plugins/__init__.py +2 -2
  87. empathy_os/plugins/base.py +64 -64
  88. empathy_os/plugins/registry.py +32 -32
  89. empathy_os/project_index/index.py +49 -15
  90. empathy_os/project_index/models.py +1 -2
  91. empathy_os/project_index/reports.py +1 -1
  92. empathy_os/project_index/scanner.py +1 -0
  93. empathy_os/redis_memory.py +10 -7
  94. empathy_os/resilience/__init__.py +1 -1
  95. empathy_os/resilience/health.py +10 -10
  96. empathy_os/routing/__init__.py +7 -7
  97. empathy_os/routing/chain_executor.py +37 -37
  98. empathy_os/routing/classifier.py +36 -36
  99. empathy_os/routing/smart_router.py +40 -40
  100. empathy_os/routing/{wizard_registry.py → workflow_registry.py} +47 -47
  101. empathy_os/scaffolding/__init__.py +8 -8
  102. empathy_os/scaffolding/__main__.py +1 -1
  103. empathy_os/scaffolding/cli.py +28 -28
  104. empathy_os/socratic/__init__.py +3 -19
  105. empathy_os/socratic/ab_testing.py +25 -36
  106. empathy_os/socratic/blueprint.py +38 -38
  107. empathy_os/socratic/cli.py +34 -20
  108. empathy_os/socratic/collaboration.py +30 -28
  109. empathy_os/socratic/domain_templates.py +9 -1
  110. empathy_os/socratic/embeddings.py +17 -13
  111. empathy_os/socratic/engine.py +135 -70
  112. empathy_os/socratic/explainer.py +70 -60
  113. empathy_os/socratic/feedback.py +24 -19
  114. empathy_os/socratic/forms.py +15 -10
  115. empathy_os/socratic/generator.py +51 -35
  116. empathy_os/socratic/llm_analyzer.py +25 -23
  117. empathy_os/socratic/mcp_server.py +99 -159
  118. empathy_os/socratic/session.py +19 -13
  119. empathy_os/socratic/storage.py +98 -67
  120. empathy_os/socratic/success.py +38 -27
  121. empathy_os/socratic/visual_editor.py +51 -39
  122. empathy_os/socratic/web_ui.py +99 -66
  123. empathy_os/telemetry/cli.py +3 -1
  124. empathy_os/telemetry/usage_tracker.py +1 -3
  125. empathy_os/test_generator/__init__.py +3 -3
  126. empathy_os/test_generator/cli.py +28 -28
  127. empathy_os/test_generator/generator.py +64 -66
  128. empathy_os/test_generator/risk_analyzer.py +11 -11
  129. empathy_os/vscode_bridge 2.py +173 -0
  130. empathy_os/vscode_bridge.py +173 -0
  131. empathy_os/workflows/__init__.py +212 -120
  132. empathy_os/workflows/batch_processing.py +8 -24
  133. empathy_os/workflows/bug_predict.py +1 -1
  134. empathy_os/workflows/code_review.py +20 -5
  135. empathy_os/workflows/code_review_pipeline.py +13 -8
  136. empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
  137. empathy_os/workflows/manage_documentation.py +1 -0
  138. empathy_os/workflows/orchestrated_health_check.py +6 -11
  139. empathy_os/workflows/orchestrated_release_prep.py +3 -3
  140. empathy_os/workflows/pr_review.py +18 -10
  141. empathy_os/workflows/progressive/README 2.md +454 -0
  142. empathy_os/workflows/progressive/__init__ 2.py +92 -0
  143. empathy_os/workflows/progressive/__init__.py +2 -12
  144. empathy_os/workflows/progressive/cli 2.py +242 -0
  145. empathy_os/workflows/progressive/cli.py +14 -37
  146. empathy_os/workflows/progressive/core 2.py +488 -0
  147. empathy_os/workflows/progressive/core.py +12 -12
  148. empathy_os/workflows/progressive/orchestrator 2.py +701 -0
  149. empathy_os/workflows/progressive/orchestrator.py +166 -144
  150. empathy_os/workflows/progressive/reports 2.py +528 -0
  151. empathy_os/workflows/progressive/reports.py +22 -31
  152. empathy_os/workflows/progressive/telemetry 2.py +280 -0
  153. empathy_os/workflows/progressive/telemetry.py +8 -14
  154. empathy_os/workflows/progressive/test_gen 2.py +514 -0
  155. empathy_os/workflows/progressive/test_gen.py +29 -48
  156. empathy_os/workflows/progressive/workflow 2.py +628 -0
  157. empathy_os/workflows/progressive/workflow.py +31 -70
  158. empathy_os/workflows/release_prep.py +21 -6
  159. empathy_os/workflows/release_prep_crew.py +1 -0
  160. empathy_os/workflows/secure_release.py +13 -6
  161. empathy_os/workflows/security_audit.py +8 -3
  162. empathy_os/workflows/test_coverage_boost_crew.py +3 -2
  163. empathy_os/workflows/test_maintenance_crew.py +1 -0
  164. empathy_os/workflows/test_runner.py +16 -12
  165. empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
  166. empathy_software_plugin/cli.py +0 -122
  167. patterns/README.md +119 -0
  168. patterns/__init__.py +95 -0
  169. patterns/behavior.py +298 -0
  170. patterns/code_review_memory.json +441 -0
  171. patterns/core.py +97 -0
  172. patterns/debugging.json +3763 -0
  173. patterns/empathy.py +268 -0
  174. patterns/health_check_memory.json +505 -0
  175. patterns/input.py +161 -0
  176. patterns/memory_graph.json +8 -0
  177. patterns/refactoring_memory.json +1113 -0
  178. patterns/registry.py +663 -0
  179. patterns/security_memory.json +8 -0
  180. patterns/structural.py +415 -0
  181. patterns/validation.py +194 -0
  182. coach_wizards/__init__.py +0 -45
  183. coach_wizards/accessibility_wizard.py +0 -91
  184. coach_wizards/api_wizard.py +0 -91
  185. coach_wizards/base_wizard.py +0 -209
  186. coach_wizards/cicd_wizard.py +0 -91
  187. coach_wizards/code_reviewer_README.md +0 -60
  188. coach_wizards/code_reviewer_wizard.py +0 -180
  189. coach_wizards/compliance_wizard.py +0 -91
  190. coach_wizards/database_wizard.py +0 -91
  191. coach_wizards/debugging_wizard.py +0 -91
  192. coach_wizards/documentation_wizard.py +0 -91
  193. coach_wizards/generate_wizards.py +0 -347
  194. coach_wizards/localization_wizard.py +0 -173
  195. coach_wizards/migration_wizard.py +0 -91
  196. coach_wizards/monitoring_wizard.py +0 -91
  197. coach_wizards/observability_wizard.py +0 -91
  198. coach_wizards/performance_wizard.py +0 -91
  199. coach_wizards/prompt_engineering_wizard.py +0 -661
  200. coach_wizards/refactoring_wizard.py +0 -91
  201. coach_wizards/scaling_wizard.py +0 -90
  202. coach_wizards/security_wizard.py +0 -92
  203. coach_wizards/testing_wizard.py +0 -91
  204. empathy_framework-4.6.6.dist-info/METADATA +0 -1597
  205. empathy_framework-4.6.6.dist-info/RECORD +0 -410
  206. empathy_llm_toolkit/wizards/__init__.py +0 -43
  207. empathy_llm_toolkit/wizards/base_wizard.py +0 -364
  208. empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
  209. empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
  210. empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
  211. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
  212. empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
  213. empathy_os/wizard_factory_cli.py +0 -170
  214. empathy_software_plugin/wizards/__init__.py +0 -42
  215. empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
  216. empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
  217. empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
  218. empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
  219. empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
  220. empathy_software_plugin/wizards/base_wizard.py +0 -288
  221. empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
  222. empathy_software_plugin/wizards/code_review_wizard.py +0 -604
  223. empathy_software_plugin/wizards/debugging/__init__.py +0 -50
  224. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
  225. empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
  226. empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
  227. empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
  228. empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
  229. empathy_software_plugin/wizards/debugging/verification.py +0 -369
  230. empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
  231. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
  232. empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
  233. empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
  234. empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
  235. empathy_software_plugin/wizards/performance/__init__.py +0 -9
  236. empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
  237. empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
  238. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
  239. empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
  240. empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
  241. empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
  242. empathy_software_plugin/wizards/security/__init__.py +0 -32
  243. empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
  244. empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
  245. empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
  246. empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
  247. empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
  248. empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
  249. empathy_software_plugin/wizards/testing/__init__.py +0 -27
  250. empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
  251. empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
  252. empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
  253. empathy_software_plugin/wizards/testing_wizard.py +0 -274
  254. wizards/__init__.py +0 -82
  255. wizards/admission_assessment_wizard.py +0 -644
  256. wizards/care_plan.py +0 -321
  257. wizards/clinical_assessment.py +0 -769
  258. wizards/discharge_planning.py +0 -77
  259. wizards/discharge_summary_wizard.py +0 -468
  260. wizards/dosage_calculation.py +0 -497
  261. wizards/incident_report_wizard.py +0 -454
  262. wizards/medication_reconciliation.py +0 -85
  263. wizards/nursing_assessment.py +0 -171
  264. wizards/patient_education.py +0 -654
  265. wizards/quality_improvement.py +0 -705
  266. wizards/sbar_report.py +0 -324
  267. wizards/sbar_wizard.py +0 -608
  268. wizards/shift_handoff_wizard.py +0 -535
  269. wizards/soap_note_wizard.py +0 -679
  270. wizards/treatment_plan.py +0 -15
  271. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/WHEEL +0 -0
  272. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/entry_points.txt +0 -0
  273. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,511 +0,0 @@
1
- """Agent Orchestration Wizard - Level 4 Anticipatory Empathy
2
-
3
- Alerts developers when multi-agent system complexity will become unmanageable.
4
-
5
- In our experience building AI Nurse Florence with LangGraph multi-agent systems,
6
- we learned that agent coordination complexity grows non-linearly. This wizard
7
- detects when simple orchestration patterns will fail at scale.
8
-
9
- Copyright 2025 Smart AI Memory, LLC
10
- Licensed under Fair Source 0.9
11
- """
12
-
13
- import os
14
- import sys
15
- from typing import Any
16
-
17
- sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "src"))
18
-
19
- from empathy_os.plugins import BaseWizard
20
-
21
-
22
- class AgentOrchestrationWizard(BaseWizard):
23
- """Level 4 Anticipatory: Predicts multi-agent coordination issues.
24
-
25
- What We Learned Building Multi-Agent Systems:
26
- - Simple sequential agents scale fine to 3-5 agents
27
- - Parallel agent coordination needs explicit state management at 5+
28
- - Agent-to-agent communication requires structured protocols at 7+
29
- - Without planning, refactoring happens around 10 agents (painful)
30
- """
31
-
32
- def __init__(self):
33
- super().__init__(
34
- name="Agent Orchestration Wizard",
35
- domain="software",
36
- empathy_level=4,
37
- category="ai_development",
38
- )
39
-
40
- def get_required_context(self) -> list[str]:
41
- """Required context for analysis (optional in demo mode)"""
42
- return [
43
- "agent_definitions", # Agent classes/configs
44
- "orchestration_code", # Code that coordinates agents
45
- "project_path", # Project root
46
- ]
47
-
48
- def _parse_agents_from_text(self, text: str) -> list[dict]:
49
- """Parse agent definitions from natural language text input."""
50
- import re
51
-
52
- agents = []
53
-
54
- # Look for patterns like "5 agents", "agents: X, Y, Z", numbered lists
55
- # Pattern 1: "N agents" or "N specialized agents"
56
- count_match = re.search(r"(\d+)\s+(?:specialized\s+)?agents?", text.lower())
57
- if count_match:
58
- count = int(count_match.group(1))
59
- # Try to extract agent names from the text
60
- # Look for colon-separated list: "agents: ingestion, validation, ..."
61
- list_match = re.search(r":\s*([^.]+)", text)
62
- if list_match:
63
- names = [n.strip() for n in list_match.group(1).split(",")]
64
- for name in names[:count]:
65
- agents.append({"name": name, "type": "specialized"})
66
- else:
67
- # Generate generic agent names
68
- for i in range(count):
69
- agents.append({"name": f"Agent_{i + 1}", "type": "specialized"})
70
-
71
- # Pattern 2: Look for specific agent-like words
72
- agent_keywords = [
73
- "ingestion",
74
- "validation",
75
- "transformation",
76
- "analysis",
77
- "reporting",
78
- "extraction",
79
- "processing",
80
- "routing",
81
- "aggregation",
82
- "monitoring",
83
- "scheduler",
84
- "executor",
85
- "coordinator",
86
- "supervisor",
87
- "worker",
88
- ]
89
- for kw in agent_keywords:
90
- if kw in text.lower() and not any(a["name"].lower() == kw for a in agents):
91
- agents.append({"name": kw.title(), "type": "specialized"})
92
-
93
- # Ensure at least 1 agent for demo
94
- if not agents:
95
- agents = [{"name": "DefaultAgent", "type": "generic"}]
96
-
97
- return agents
98
-
99
- async def analyze(self, context: dict[str, Any]) -> dict[str, Any]:
100
- """Analyze agent orchestration patterns and predict coordination issues.
101
-
102
- In our experience: Multi-agent complexity sneaks up fast.
103
- By agent #7-10, you need formal orchestration or face refactoring.
104
-
105
- Supports two modes:
106
- - Structured: Pass agent_definitions, orchestration_code, project_path
107
- - Demo/Text: Pass user_input with natural language description
108
- """
109
- # Support text input mode (from web demo) or structured mode
110
- user_input = context.get("user_input", "")
111
-
112
- if "agent_definitions" not in context:
113
- # Parse agents from text input for demo mode
114
- agents = self._parse_agents_from_text(user_input)
115
- orchestration = [] # No file analysis in demo mode
116
- else:
117
- self.validate_context(context)
118
- agents = context["agent_definitions"]
119
- orchestration = context["orchestration_code"]
120
-
121
- # Current issues
122
- issues = await self._analyze_orchestration_patterns(agents, orchestration)
123
-
124
- # Level 4: Predict future coordination breakdowns
125
- predictions = await self._predict_orchestration_complexity(agents, orchestration, context)
126
-
127
- recommendations = self._generate_recommendations(issues, predictions)
128
- patterns = self._extract_patterns(issues, predictions)
129
-
130
- return {
131
- "issues": issues,
132
- "predictions": predictions,
133
- "recommendations": recommendations,
134
- "patterns": patterns,
135
- "confidence": 0.85,
136
- "metadata": {
137
- "wizard": self.name,
138
- "empathy_level": self.empathy_level,
139
- "agent_count": len(agents),
140
- "orchestration_complexity": self._assess_complexity(orchestration),
141
- },
142
- }
143
-
144
- async def _analyze_orchestration_patterns(
145
- self,
146
- agents: list[dict],
147
- orchestration: list[str],
148
- ) -> list[dict[str, Any]]:
149
- """Analyze current orchestration patterns"""
150
- issues = []
151
-
152
- agent_count = len(agents)
153
-
154
- # Issue: No state management with multiple agents
155
- if agent_count > 3 and not self._has_state_management(orchestration):
156
- issues.append(
157
- {
158
- "severity": "warning",
159
- "type": "missing_state_management",
160
- "message": (
161
- f"You have {agent_count} agents without centralized state management. "
162
- "In our experience, agent coordination becomes unreliable beyond 3 agents "
163
- "without explicit state tracking."
164
- ),
165
- "suggestion": "Implement shared state pattern (e.g., LangGraph StateGraph, custom State class)",
166
- },
167
- )
168
-
169
- # Issue: No error handling between agents
170
- if not self._has_agent_error_handling(orchestration):
171
- issues.append(
172
- {
173
- "severity": "warning",
174
- "type": "missing_error_handling",
175
- "message": (
176
- "No agent-level error handling detected. When one agent fails, "
177
- "entire pipeline crashes. In our experience, this creates brittle systems."
178
- ),
179
- "suggestion": "Add try-except wrappers, fallback agents, retry logic",
180
- },
181
- )
182
-
183
- # Issue: Circular agent dependencies
184
- if self._detect_circular_dependencies(agents):
185
- issues.append(
186
- {
187
- "severity": "error",
188
- "type": "circular_dependencies",
189
- "message": (
190
- "Circular dependencies detected between agents. "
191
- "This creates deadlocks and unpredictable behavior."
192
- ),
193
- "suggestion": "Restructure agent graph to be acyclic (DAG)",
194
- },
195
- )
196
-
197
- # Issue: No agent communication protocol
198
- if agent_count > 5 and not self._has_communication_protocol(agents):
199
- issues.append(
200
- {
201
- "severity": "info",
202
- "type": "ad_hoc_communication",
203
- "message": (
204
- f"{agent_count} agents with ad-hoc communication. "
205
- "In our experience, structured protocols become essential beyond 5 agents."
206
- ),
207
- "suggestion": "Define message schemas, use TypedDict for agent inputs/outputs",
208
- },
209
- )
210
-
211
- return issues
212
-
213
- async def _predict_orchestration_complexity(
214
- self,
215
- agents: list[dict],
216
- orchestration: list[str],
217
- full_context: dict[str, Any],
218
- ) -> list[dict[str, Any]]:
219
- """Level 4: Predict when orchestration will break down.
220
-
221
- Based on our experience: Coordination complexity = O(n²) with agents.
222
- """
223
- predictions = []
224
-
225
- agent_count = len(agents)
226
-
227
- # Pattern 1: Approaching complexity threshold
228
- if 7 <= agent_count <= 12:
229
- predictions.append(
230
- {
231
- "type": "orchestration_complexity_threshold",
232
- "alert": (
233
- f"You have {agent_count} agents. In our experience, multi-agent systems "
234
- "become difficult to manage around 10 agents without formal orchestration. "
235
- "Alert: Design orchestration framework before complexity compounds."
236
- ),
237
- "probability": "high",
238
- "impact": "high",
239
- "prevention_steps": [
240
- "Adopt orchestration framework (LangGraph, CrewAI, custom)",
241
- "Define agent state machine explicitly",
242
- "Implement agent registry (dynamic agent discovery)",
243
- "Add agent performance monitoring",
244
- "Create agent testing framework",
245
- ],
246
- "reasoning": (
247
- f"Coordination complexity: {agent_count} agents = "
248
- f"{agent_count * (agent_count - 1) // 2} potential interactions. "
249
- "We hit refactoring wall at 10 agents. Proactive design prevents crisis."
250
- ),
251
- "personal_experience": (
252
- "Building AI Nurse Florence, we started with 3 agents (simple sequence). "
253
- "By agent 7, we needed LangGraph StateGraph. By agent 12, we needed "
254
- "full orchestration framework. Wish we'd designed for it earlier."
255
- ),
256
- },
257
- )
258
-
259
- # Pattern 2: Sequential agents that should be parallel
260
- if agent_count > 5 and self._all_sequential(orchestration):
261
- predictions.append(
262
- {
263
- "type": "sequential_bottleneck",
264
- "alert": (
265
- f"{agent_count} agents running sequentially. In our experience, "
266
- "sequential execution becomes a bottleneck. Alert: Identify parallelization "
267
- "opportunities before performance degrades."
268
- ),
269
- "probability": "medium-high",
270
- "impact": "medium",
271
- "prevention_steps": [
272
- "Analyze agent dependency graph",
273
- "Identify independent agents (can run parallel)",
274
- "Implement parallel execution (asyncio.gather, ThreadPoolExecutor)",
275
- "Add result aggregation layer",
276
- ],
277
- "reasoning": (
278
- "Many agents have no dependencies on each other. "
279
- "Sequential execution leaves performance on table."
280
- ),
281
- },
282
- )
283
-
284
- # Pattern 3: Growing agent communication overhead
285
- if agent_count > 6:
286
- predictions.append(
287
- {
288
- "type": "communication_overhead",
289
- "alert": (
290
- f"With {agent_count} agents, communication overhead grows quadratically. "
291
- "In our experience, agent-to-agent communication becomes bottleneck. "
292
- "Alert: Implement efficient communication patterns."
293
- ),
294
- "probability": "medium",
295
- "impact": "medium",
296
- "prevention_steps": [
297
- "Use pub-sub pattern (agents subscribe to relevant messages only)",
298
- "Implement message routing (don't broadcast everything)",
299
- "Add message queues for async communication",
300
- "Create agent isolation (agents don't need to know about all others)",
301
- ],
302
- "reasoning": (
303
- f"Full mesh communication: {agent_count}² = {agent_count**2} channels. "
304
- "Selective communication dramatically reduces overhead."
305
- ),
306
- },
307
- )
308
-
309
- # Pattern 4: No agent versioning strategy
310
- if agent_count > 4 and not self._has_agent_versioning(agents):
311
- predictions.append(
312
- {
313
- "type": "agent_version_chaos",
314
- "alert": (
315
- "No agent versioning detected. In our experience, as agents evolve, "
316
- "breaking changes cause cascade failures. Alert: Implement versioning "
317
- "before inter-agent contracts become implicit."
318
- ),
319
- "probability": "medium-high",
320
- "impact": "high",
321
- "prevention_steps": [
322
- "Add version to each agent (semantic versioning)",
323
- "Define agent API contracts (input/output schemas)",
324
- "Implement compatibility checks",
325
- "Create agent migration paths for breaking changes",
326
- ],
327
- "reasoning": (
328
- "When agent A changes output format, agent B breaks. "
329
- "Versioning prevents cascade failures."
330
- ),
331
- },
332
- )
333
-
334
- # Pattern 5: Missing observability
335
- if agent_count > 5 and not self._has_observability(orchestration):
336
- predictions.append(
337
- {
338
- "type": "orchestration_black_box",
339
- "alert": (
340
- f"With {agent_count} agents, you have limited visibility into orchestration flow. "
341
- "In our experience, debugging multi-agent issues without observability is extremely difficult. "
342
- "Alert: Add observability before issues become impossible to diagnose."
343
- ),
344
- "probability": "high",
345
- "impact": "high",
346
- "prevention_steps": [
347
- "Add structured logging (agent name, inputs, outputs, timing)",
348
- "Implement distributed tracing (correlate agent executions)",
349
- "Create agent execution visualizer (see flow in real-time)",
350
- "Add performance metrics per agent",
351
- "Build debugging tools (replay agent execution)",
352
- ],
353
- "reasoning": (
354
- "Multi-agent debugging: 'Which agent failed? Why? With what input?' "
355
- "Impossible to answer without observability."
356
- ),
357
- "personal_experience": (
358
- "We spent 3 days debugging an agent cascade failure. Root cause: "
359
- "Agent #4 was receiving null from Agent #2. No logging made this "
360
- "a nightmare. Never again."
361
- ),
362
- },
363
- )
364
-
365
- return predictions
366
-
367
- def _generate_recommendations(self, issues: list[dict], predictions: list[dict]) -> list[str]:
368
- """Generate actionable recommendations"""
369
- recommendations = []
370
-
371
- # Critical issues first
372
- critical = [i for i in issues if i.get("severity") == "error"]
373
- if critical:
374
- recommendations.append(
375
- f"[CRITICAL] Fix {len(critical)} critical orchestration issues immediately",
376
- )
377
-
378
- # High-impact predictions
379
- for pred in predictions:
380
- if pred.get("impact") == "high":
381
- recommendations.append(f"\n[ALERT] {pred['alert']}")
382
- if "personal_experience" in pred:
383
- recommendations.append(f"Experience: {pred['personal_experience']}")
384
- recommendations.append("Prevention steps:")
385
- for i, step in enumerate(pred["prevention_steps"][:3], 1):
386
- recommendations.append(f" {i}. {step}")
387
-
388
- return recommendations
389
-
390
- def _extract_patterns(
391
- self,
392
- issues: list[dict],
393
- predictions: list[dict],
394
- ) -> list[dict[str, Any]]:
395
- """Extract cross-domain patterns"""
396
- return [
397
- {
398
- "pattern_type": "coordination_complexity_threshold",
399
- "description": (
400
- "Systems with multiple coordinating components hit complexity threshold "
401
- "around 7-10 components. Formal orchestration becomes essential."
402
- ),
403
- "domain_agnostic": True,
404
- "applicable_to": [
405
- "Multi-agent AI systems",
406
- "Microservices architecture",
407
- "Distributed systems",
408
- "Team coordination (humans)",
409
- "Clinical care coordination (healthcare)",
410
- ],
411
- "threshold": "7-10 components",
412
- "solution": "Adopt formal orchestration framework before threshold",
413
- },
414
- ]
415
-
416
- # Helper methods
417
-
418
- def _has_state_management(self, orchestration: list[str]) -> bool:
419
- """Check for centralized state management"""
420
- for file_path in orchestration:
421
- try:
422
- with open(file_path) as f:
423
- content = f.read()
424
- if any(
425
- kw in content
426
- for kw in ["StateGraph", "AgentState", "shared_state", "TypedDict"]
427
- ):
428
- return True
429
- except OSError:
430
- pass
431
- return False
432
-
433
- def _has_agent_error_handling(self, orchestration: list[str]) -> bool:
434
- """Check for agent-level error handling"""
435
- for file_path in orchestration:
436
- try:
437
- with open(file_path) as f:
438
- content = f.read()
439
- # Look for error handling patterns
440
- if "try:" in content and "agent" in content.lower():
441
- return True
442
- except OSError:
443
- pass
444
- return False
445
-
446
- def _detect_circular_dependencies(self, agents: list[dict]) -> bool:
447
- """Detect circular dependencies between agents"""
448
- # Simplified detection - would need actual dependency analysis
449
- # For now, just check if agents reference each other
450
- _agent_names = [a.get("name", "") for a in agents]
451
-
452
- for agent in agents:
453
- deps = agent.get("dependencies", [])
454
- if agent.get("name") in deps:
455
- return True # Self-dependency
456
- return False
457
-
458
- def _has_communication_protocol(self, agents: list[dict]) -> bool:
459
- """Check for structured communication protocol"""
460
- # Look for message schemas, TypedDict, etc.
461
- for agent in agents:
462
- if "message_schema" in agent or "input_schema" in agent:
463
- return True
464
- return False
465
-
466
- def _assess_complexity(self, orchestration: list[str]) -> str:
467
- """Assess orchestration complexity"""
468
- if len(orchestration) == 0:
469
- return "none"
470
- if len(orchestration) <= 2:
471
- return "low"
472
- if len(orchestration) <= 5:
473
- return "medium"
474
- return "high"
475
-
476
- def _all_sequential(self, orchestration: list[str]) -> bool:
477
- """Check if all agents run sequentially"""
478
- for file_path in orchestration:
479
- try:
480
- with open(file_path) as f:
481
- content = f.read()
482
- # Look for parallel execution indicators
483
- if any(
484
- kw in content
485
- for kw in ["asyncio.gather", "ThreadPool", "parallel", "concurrent"]
486
- ):
487
- return False
488
- except OSError:
489
- pass
490
- return True
491
-
492
- def _has_agent_versioning(self, agents: list[dict]) -> bool:
493
- """Check if agents have version information"""
494
- for agent in agents:
495
- if "version" in agent or "api_version" in agent:
496
- return True
497
- return False
498
-
499
- def _has_observability(self, orchestration: list[str]) -> bool:
500
- """Check for observability features"""
501
- for file_path in orchestration:
502
- try:
503
- with open(file_path) as f:
504
- content = f.read()
505
- if any(
506
- kw in content for kw in ["logger", "trace", "span", "metrics", "telemetry"]
507
- ):
508
- return True
509
- except OSError:
510
- pass
511
- return False