empathy-framework 4.6.6__py3-none-any.whl → 4.7.0__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.
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/METADATA +7 -6
- empathy_framework-4.7.0.dist-info/RECORD +354 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/top_level.txt +0 -2
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +9 -9
- empathy_llm_toolkit/agent_factory/__init__.py +6 -6
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +7 -10
- empathy_llm_toolkit/agents_md/__init__.py +22 -0
- empathy_llm_toolkit/agents_md/loader.py +218 -0
- empathy_llm_toolkit/agents_md/parser.py +271 -0
- empathy_llm_toolkit/agents_md/registry.py +307 -0
- empathy_llm_toolkit/commands/__init__.py +51 -0
- empathy_llm_toolkit/commands/context.py +375 -0
- empathy_llm_toolkit/commands/loader.py +301 -0
- empathy_llm_toolkit/commands/models.py +231 -0
- empathy_llm_toolkit/commands/parser.py +371 -0
- empathy_llm_toolkit/commands/registry.py +429 -0
- empathy_llm_toolkit/config/__init__.py +8 -8
- empathy_llm_toolkit/config/unified.py +3 -7
- empathy_llm_toolkit/context/__init__.py +22 -0
- empathy_llm_toolkit/context/compaction.py +455 -0
- empathy_llm_toolkit/context/manager.py +434 -0
- empathy_llm_toolkit/hooks/__init__.py +24 -0
- empathy_llm_toolkit/hooks/config.py +306 -0
- empathy_llm_toolkit/hooks/executor.py +289 -0
- empathy_llm_toolkit/hooks/registry.py +302 -0
- empathy_llm_toolkit/hooks/scripts/__init__.py +39 -0
- empathy_llm_toolkit/hooks/scripts/evaluate_session.py +201 -0
- empathy_llm_toolkit/hooks/scripts/first_time_init.py +285 -0
- empathy_llm_toolkit/hooks/scripts/pre_compact.py +207 -0
- empathy_llm_toolkit/hooks/scripts/session_end.py +183 -0
- empathy_llm_toolkit/hooks/scripts/session_start.py +163 -0
- empathy_llm_toolkit/hooks/scripts/suggest_compact.py +225 -0
- empathy_llm_toolkit/learning/__init__.py +30 -0
- empathy_llm_toolkit/learning/evaluator.py +438 -0
- empathy_llm_toolkit/learning/extractor.py +514 -0
- empathy_llm_toolkit/learning/storage.py +560 -0
- empathy_llm_toolkit/providers.py +4 -11
- empathy_llm_toolkit/security/__init__.py +17 -17
- empathy_llm_toolkit/utils/tokens.py +2 -5
- empathy_os/__init__.py +202 -70
- empathy_os/cache_monitor.py +5 -3
- empathy_os/cli/__init__.py +11 -55
- empathy_os/cli/__main__.py +29 -15
- empathy_os/cli/commands/inspection.py +21 -12
- empathy_os/cli/commands/memory.py +4 -12
- empathy_os/cli/commands/profiling.py +198 -0
- empathy_os/cli/commands/utilities.py +27 -7
- empathy_os/cli.py +28 -57
- empathy_os/cli_unified.py +525 -1164
- empathy_os/cost_tracker.py +9 -3
- empathy_os/dashboard/server.py +200 -2
- empathy_os/hot_reload/__init__.py +7 -7
- empathy_os/hot_reload/config.py +6 -7
- empathy_os/hot_reload/integration.py +35 -35
- empathy_os/hot_reload/reloader.py +57 -57
- empathy_os/hot_reload/watcher.py +28 -28
- empathy_os/hot_reload/websocket.py +2 -2
- empathy_os/memory/__init__.py +11 -4
- empathy_os/memory/claude_memory.py +1 -1
- empathy_os/memory/cross_session.py +8 -12
- empathy_os/memory/edges.py +6 -6
- empathy_os/memory/file_session.py +770 -0
- empathy_os/memory/graph.py +30 -30
- empathy_os/memory/nodes.py +6 -6
- empathy_os/memory/short_term.py +15 -9
- empathy_os/memory/unified.py +606 -140
- empathy_os/meta_workflows/agent_creator.py +3 -9
- empathy_os/meta_workflows/cli_meta_workflows.py +113 -53
- empathy_os/meta_workflows/form_engine.py +6 -18
- empathy_os/meta_workflows/intent_detector.py +64 -24
- empathy_os/meta_workflows/models.py +3 -1
- empathy_os/meta_workflows/pattern_learner.py +13 -31
- empathy_os/meta_workflows/plan_generator.py +55 -47
- empathy_os/meta_workflows/session_context.py +2 -3
- empathy_os/meta_workflows/workflow.py +20 -51
- empathy_os/models/cli.py +2 -2
- empathy_os/models/tasks.py +1 -2
- empathy_os/models/telemetry.py +4 -1
- empathy_os/models/token_estimator.py +3 -1
- empathy_os/monitoring/alerts.py +938 -9
- empathy_os/monitoring/alerts_cli.py +346 -183
- empathy_os/orchestration/execution_strategies.py +12 -29
- empathy_os/orchestration/pattern_learner.py +20 -26
- empathy_os/orchestration/real_tools.py +6 -15
- empathy_os/platform_utils.py +2 -1
- empathy_os/plugins/__init__.py +2 -2
- empathy_os/plugins/base.py +64 -64
- empathy_os/plugins/registry.py +32 -32
- empathy_os/project_index/index.py +49 -15
- empathy_os/project_index/models.py +1 -2
- empathy_os/project_index/reports.py +1 -1
- empathy_os/project_index/scanner.py +1 -0
- empathy_os/redis_memory.py +10 -7
- empathy_os/resilience/__init__.py +1 -1
- empathy_os/resilience/health.py +10 -10
- empathy_os/routing/__init__.py +7 -7
- empathy_os/routing/chain_executor.py +37 -37
- empathy_os/routing/classifier.py +36 -36
- empathy_os/routing/smart_router.py +40 -40
- empathy_os/routing/{wizard_registry.py → workflow_registry.py} +47 -47
- empathy_os/scaffolding/__init__.py +8 -8
- empathy_os/scaffolding/__main__.py +1 -1
- empathy_os/scaffolding/cli.py +28 -28
- empathy_os/socratic/__init__.py +3 -19
- empathy_os/socratic/ab_testing.py +25 -36
- empathy_os/socratic/blueprint.py +38 -38
- empathy_os/socratic/cli.py +34 -20
- empathy_os/socratic/collaboration.py +30 -28
- empathy_os/socratic/domain_templates.py +9 -1
- empathy_os/socratic/embeddings.py +17 -13
- empathy_os/socratic/engine.py +135 -70
- empathy_os/socratic/explainer.py +70 -60
- empathy_os/socratic/feedback.py +24 -19
- empathy_os/socratic/forms.py +15 -10
- empathy_os/socratic/generator.py +51 -35
- empathy_os/socratic/llm_analyzer.py +25 -23
- empathy_os/socratic/mcp_server.py +99 -159
- empathy_os/socratic/session.py +19 -13
- empathy_os/socratic/storage.py +98 -67
- empathy_os/socratic/success.py +38 -27
- empathy_os/socratic/visual_editor.py +51 -39
- empathy_os/socratic/web_ui.py +99 -66
- empathy_os/telemetry/cli.py +3 -1
- empathy_os/telemetry/usage_tracker.py +1 -3
- empathy_os/test_generator/__init__.py +3 -3
- empathy_os/test_generator/cli.py +28 -28
- empathy_os/test_generator/generator.py +64 -66
- empathy_os/test_generator/risk_analyzer.py +11 -11
- empathy_os/vscode_bridge.py +173 -0
- empathy_os/workflows/__init__.py +212 -120
- empathy_os/workflows/batch_processing.py +8 -24
- empathy_os/workflows/bug_predict.py +1 -1
- empathy_os/workflows/code_review.py +20 -5
- empathy_os/workflows/code_review_pipeline.py +13 -8
- empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
- empathy_os/workflows/manage_documentation.py +1 -0
- empathy_os/workflows/orchestrated_health_check.py +6 -11
- empathy_os/workflows/orchestrated_release_prep.py +3 -3
- empathy_os/workflows/pr_review.py +18 -10
- empathy_os/workflows/progressive/__init__.py +2 -12
- empathy_os/workflows/progressive/cli.py +14 -37
- empathy_os/workflows/progressive/core.py +12 -12
- empathy_os/workflows/progressive/orchestrator.py +166 -144
- empathy_os/workflows/progressive/reports.py +22 -31
- empathy_os/workflows/progressive/telemetry.py +8 -14
- empathy_os/workflows/progressive/test_gen.py +29 -48
- empathy_os/workflows/progressive/workflow.py +31 -70
- empathy_os/workflows/release_prep.py +21 -6
- empathy_os/workflows/release_prep_crew.py +1 -0
- empathy_os/workflows/secure_release.py +13 -6
- empathy_os/workflows/security_audit.py +8 -3
- empathy_os/workflows/test_coverage_boost_crew.py +3 -2
- empathy_os/workflows/test_maintenance_crew.py +1 -0
- empathy_os/workflows/test_runner.py +16 -12
- empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
- empathy_software_plugin/cli.py +0 -122
- coach_wizards/__init__.py +0 -45
- coach_wizards/accessibility_wizard.py +0 -91
- coach_wizards/api_wizard.py +0 -91
- coach_wizards/base_wizard.py +0 -209
- coach_wizards/cicd_wizard.py +0 -91
- coach_wizards/code_reviewer_README.md +0 -60
- coach_wizards/code_reviewer_wizard.py +0 -180
- coach_wizards/compliance_wizard.py +0 -91
- coach_wizards/database_wizard.py +0 -91
- coach_wizards/debugging_wizard.py +0 -91
- coach_wizards/documentation_wizard.py +0 -91
- coach_wizards/generate_wizards.py +0 -347
- coach_wizards/localization_wizard.py +0 -173
- coach_wizards/migration_wizard.py +0 -91
- coach_wizards/monitoring_wizard.py +0 -91
- coach_wizards/observability_wizard.py +0 -91
- coach_wizards/performance_wizard.py +0 -91
- coach_wizards/prompt_engineering_wizard.py +0 -661
- coach_wizards/refactoring_wizard.py +0 -91
- coach_wizards/scaling_wizard.py +0 -90
- coach_wizards/security_wizard.py +0 -92
- coach_wizards/testing_wizard.py +0 -91
- empathy_framework-4.6.6.dist-info/RECORD +0 -410
- empathy_llm_toolkit/wizards/__init__.py +0 -43
- empathy_llm_toolkit/wizards/base_wizard.py +0 -364
- empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
- empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
- empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
- empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
- empathy_os/wizard_factory_cli.py +0 -170
- empathy_software_plugin/wizards/__init__.py +0 -42
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
- empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
- empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
- empathy_software_plugin/wizards/base_wizard.py +0 -288
- empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
- empathy_software_plugin/wizards/code_review_wizard.py +0 -604
- empathy_software_plugin/wizards/debugging/__init__.py +0 -50
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
- empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
- empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
- empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
- empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
- empathy_software_plugin/wizards/debugging/verification.py +0 -369
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
- empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
- empathy_software_plugin/wizards/performance/__init__.py +0 -9
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
- empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
- empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
- empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
- empathy_software_plugin/wizards/security/__init__.py +0 -32
- empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
- empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
- empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
- empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
- empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
- empathy_software_plugin/wizards/testing/__init__.py +0 -27
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
- empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
- empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
- empathy_software_plugin/wizards/testing_wizard.py +0 -274
- wizards/__init__.py +0 -82
- wizards/admission_assessment_wizard.py +0 -644
- wizards/care_plan.py +0 -321
- wizards/clinical_assessment.py +0 -769
- wizards/discharge_planning.py +0 -77
- wizards/discharge_summary_wizard.py +0 -468
- wizards/dosage_calculation.py +0 -497
- wizards/incident_report_wizard.py +0 -454
- wizards/medication_reconciliation.py +0 -85
- wizards/nursing_assessment.py +0 -171
- wizards/patient_education.py +0 -654
- wizards/quality_improvement.py +0 -705
- wizards/sbar_report.py +0 -324
- wizards/sbar_wizard.py +0 -608
- wizards/shift_handoff_wizard.py +0 -535
- wizards/soap_note_wizard.py +0 -679
- wizards/treatment_plan.py +0 -15
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/WHEEL +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/entry_points.txt +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.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
|