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.
- empathy_framework-4.7.1.dist-info/METADATA +690 -0
- empathy_framework-4.7.1.dist-info/RECORD +379 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/top_level.txt +1 -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 2.py +173 -0
- 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/README 2.md +454 -0
- empathy_os/workflows/progressive/__init__ 2.py +92 -0
- empathy_os/workflows/progressive/__init__.py +2 -12
- empathy_os/workflows/progressive/cli 2.py +242 -0
- empathy_os/workflows/progressive/cli.py +14 -37
- empathy_os/workflows/progressive/core 2.py +488 -0
- empathy_os/workflows/progressive/core.py +12 -12
- empathy_os/workflows/progressive/orchestrator 2.py +701 -0
- empathy_os/workflows/progressive/orchestrator.py +166 -144
- empathy_os/workflows/progressive/reports 2.py +528 -0
- empathy_os/workflows/progressive/reports.py +22 -31
- empathy_os/workflows/progressive/telemetry 2.py +280 -0
- empathy_os/workflows/progressive/telemetry.py +8 -14
- empathy_os/workflows/progressive/test_gen 2.py +514 -0
- empathy_os/workflows/progressive/test_gen.py +29 -48
- empathy_os/workflows/progressive/workflow 2.py +628 -0
- 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
- patterns/README.md +119 -0
- patterns/__init__.py +95 -0
- patterns/behavior.py +298 -0
- patterns/code_review_memory.json +441 -0
- patterns/core.py +97 -0
- patterns/debugging.json +3763 -0
- patterns/empathy.py +268 -0
- patterns/health_check_memory.json +505 -0
- patterns/input.py +161 -0
- patterns/memory_graph.json +8 -0
- patterns/refactoring_memory.json +1113 -0
- patterns/registry.py +663 -0
- patterns/security_memory.json +8 -0
- patterns/structural.py +415 -0
- patterns/validation.py +194 -0
- 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/METADATA +0 -1597
- 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.1.dist-info}/WHEEL +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/entry_points.txt +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,501 +0,0 @@
|
|
|
1
|
-
"""Multi-Model Coordination Wizard - Level 4 Anticipatory Empathy
|
|
2
|
-
|
|
3
|
-
Alerts developers when multi-model strategies will create complexity or cost issues.
|
|
4
|
-
|
|
5
|
-
In our experience, using multiple AI models seems like optimization (pick best
|
|
6
|
-
model for each task). But we learned: model coordination overhead, prompt
|
|
7
|
-
consistency, and cost tracking become complex fast. This wizard alerts before
|
|
8
|
-
those issues compound.
|
|
9
|
-
|
|
10
|
-
Copyright 2025 Smart AI Memory, LLC
|
|
11
|
-
Licensed under Fair Source 0.9
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
import os
|
|
15
|
-
import sys
|
|
16
|
-
from typing import Any
|
|
17
|
-
|
|
18
|
-
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "src"))
|
|
19
|
-
|
|
20
|
-
from empathy_os.plugins import BaseWizard
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class MultiModelWizard(BaseWizard):
|
|
24
|
-
"""Level 4 Anticipatory: Predicts multi-model coordination issues.
|
|
25
|
-
|
|
26
|
-
What We Learned About Multi-Model Systems:
|
|
27
|
-
- Using "best model for task" sounds smart, adds complexity
|
|
28
|
-
- Inconsistent outputs across models confuse users
|
|
29
|
-
- Cost tracking becomes nightmare without abstraction
|
|
30
|
-
- Fallback strategies essential (model outages happen)
|
|
31
|
-
"""
|
|
32
|
-
|
|
33
|
-
def __init__(self):
|
|
34
|
-
super().__init__(
|
|
35
|
-
name="Multi-Model Coordination Wizard",
|
|
36
|
-
domain="software",
|
|
37
|
-
empathy_level=4,
|
|
38
|
-
category="ai_development",
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
def get_required_context(self) -> list[str]:
|
|
42
|
-
"""Required context for analysis"""
|
|
43
|
-
return [
|
|
44
|
-
"model_usage", # Which models are used where
|
|
45
|
-
"model_count", # Number of different models
|
|
46
|
-
"routing_logic", # How requests route to models
|
|
47
|
-
"project_path", # Project root
|
|
48
|
-
]
|
|
49
|
-
|
|
50
|
-
async def analyze(self, context: dict[str, Any]) -> dict[str, Any]:
|
|
51
|
-
"""Analyze multi-model coordination and predict issues.
|
|
52
|
-
|
|
53
|
-
In our experience: Multi-model complexity grows non-linearly.
|
|
54
|
-
2 models = manageable. 4+ models = coordination nightmare without framework.
|
|
55
|
-
"""
|
|
56
|
-
self.validate_context(context)
|
|
57
|
-
|
|
58
|
-
model_usage = context.get("model_usage", [])
|
|
59
|
-
model_count = context.get("model_count", 0)
|
|
60
|
-
routing = context.get("routing_logic", [])
|
|
61
|
-
|
|
62
|
-
# Current issues
|
|
63
|
-
issues = await self._analyze_model_coordination(model_usage, model_count, routing)
|
|
64
|
-
|
|
65
|
-
# Level 4: Predict coordination breakdown
|
|
66
|
-
predictions = await self._predict_multi_model_issues(
|
|
67
|
-
model_usage,
|
|
68
|
-
model_count,
|
|
69
|
-
routing,
|
|
70
|
-
context,
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
recommendations = self._generate_recommendations(issues, predictions)
|
|
74
|
-
patterns = self._extract_patterns(issues, predictions)
|
|
75
|
-
|
|
76
|
-
return {
|
|
77
|
-
"issues": issues,
|
|
78
|
-
"predictions": predictions,
|
|
79
|
-
"recommendations": recommendations,
|
|
80
|
-
"patterns": patterns,
|
|
81
|
-
"confidence": 0.85,
|
|
82
|
-
"metadata": {
|
|
83
|
-
"wizard": self.name,
|
|
84
|
-
"empathy_level": self.empathy_level,
|
|
85
|
-
"model_count": model_count,
|
|
86
|
-
},
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
async def _analyze_model_coordination(
|
|
90
|
-
self,
|
|
91
|
-
model_usage: list[dict],
|
|
92
|
-
model_count: int,
|
|
93
|
-
routing: list[str],
|
|
94
|
-
) -> list[dict[str, Any]]:
|
|
95
|
-
"""Analyze current multi-model coordination"""
|
|
96
|
-
issues = []
|
|
97
|
-
|
|
98
|
-
# Issue: Many models without abstraction
|
|
99
|
-
if model_count > 2 and not self._has_model_abstraction(routing):
|
|
100
|
-
issues.append(
|
|
101
|
-
{
|
|
102
|
-
"severity": "warning",
|
|
103
|
-
"type": "no_model_abstraction",
|
|
104
|
-
"message": (
|
|
105
|
-
f"Using {model_count} models without abstraction layer. "
|
|
106
|
-
"In our experience, direct model calls become unmaintainable "
|
|
107
|
-
"beyond 2 models."
|
|
108
|
-
),
|
|
109
|
-
"suggestion": (
|
|
110
|
-
"Create model abstraction layer (unified interface, "
|
|
111
|
-
"routing logic, fallback handling)"
|
|
112
|
-
),
|
|
113
|
-
},
|
|
114
|
-
)
|
|
115
|
-
|
|
116
|
-
# Issue: No fallback strategy
|
|
117
|
-
if model_count > 1 and not self._has_fallback_strategy(routing):
|
|
118
|
-
issues.append(
|
|
119
|
-
{
|
|
120
|
-
"severity": "warning",
|
|
121
|
-
"type": "no_fallback_strategy",
|
|
122
|
-
"message": (
|
|
123
|
-
"Multiple models but no fallback strategy. When primary model "
|
|
124
|
-
"fails or is rate-limited, entire feature breaks."
|
|
125
|
-
),
|
|
126
|
-
"suggestion": "Implement model fallback chain (primary → secondary → cached)",
|
|
127
|
-
},
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
# Issue: Inconsistent prompt templates
|
|
131
|
-
if not self._has_consistent_prompts(model_usage):
|
|
132
|
-
issues.append(
|
|
133
|
-
{
|
|
134
|
-
"severity": "info",
|
|
135
|
-
"type": "inconsistent_prompts",
|
|
136
|
-
"message": (
|
|
137
|
-
"Different prompt templates per model. In our experience, "
|
|
138
|
-
"this causes output inconsistency across models."
|
|
139
|
-
),
|
|
140
|
-
"suggestion": (
|
|
141
|
-
"Use model-agnostic prompt templates with model-specific adaptations"
|
|
142
|
-
),
|
|
143
|
-
},
|
|
144
|
-
)
|
|
145
|
-
|
|
146
|
-
# Issue: No cost tracking per model
|
|
147
|
-
if model_count > 2 and not self._has_cost_tracking(routing):
|
|
148
|
-
issues.append(
|
|
149
|
-
{
|
|
150
|
-
"severity": "warning",
|
|
151
|
-
"type": "no_cost_tracking",
|
|
152
|
-
"message": (
|
|
153
|
-
f"{model_count} models without per-model cost tracking. "
|
|
154
|
-
"Impossible to optimize spend without visibility."
|
|
155
|
-
),
|
|
156
|
-
"suggestion": "Add cost tracking middleware (log tokens/costs per model)",
|
|
157
|
-
},
|
|
158
|
-
)
|
|
159
|
-
|
|
160
|
-
# Issue: No performance monitoring
|
|
161
|
-
if not self._has_performance_monitoring(routing):
|
|
162
|
-
issues.append(
|
|
163
|
-
{
|
|
164
|
-
"severity": "info",
|
|
165
|
-
"type": "no_performance_monitoring",
|
|
166
|
-
"message": (
|
|
167
|
-
"No performance monitoring across models. Can't identify "
|
|
168
|
-
"which models are slow, failing, or degrading."
|
|
169
|
-
),
|
|
170
|
-
"suggestion": "Add per-model metrics (latency, errors, quality)",
|
|
171
|
-
},
|
|
172
|
-
)
|
|
173
|
-
|
|
174
|
-
return issues
|
|
175
|
-
|
|
176
|
-
async def _predict_multi_model_issues(
|
|
177
|
-
self,
|
|
178
|
-
model_usage: list[dict],
|
|
179
|
-
model_count: int,
|
|
180
|
-
routing: list[str],
|
|
181
|
-
full_context: dict[str, Any],
|
|
182
|
-
) -> list[dict[str, Any]]:
|
|
183
|
-
"""Level 4: Predict multi-model coordination breakdown.
|
|
184
|
-
|
|
185
|
-
Based on our experience: Coordination complexity = O(n) × configuration.
|
|
186
|
-
"""
|
|
187
|
-
predictions = []
|
|
188
|
-
|
|
189
|
-
# Pattern 1: Model count approaching complexity threshold
|
|
190
|
-
if 4 <= model_count <= 7:
|
|
191
|
-
predictions.append(
|
|
192
|
-
{
|
|
193
|
-
"type": "coordination_complexity",
|
|
194
|
-
"alert": (
|
|
195
|
-
f"You're using {model_count} different models. In our experience, "
|
|
196
|
-
"multi-model systems become difficult to manage beyond 5 models "
|
|
197
|
-
"without formal coordination framework. Alert: Design model "
|
|
198
|
-
"orchestration layer before complexity compounds."
|
|
199
|
-
),
|
|
200
|
-
"probability": "high",
|
|
201
|
-
"impact": "high",
|
|
202
|
-
"prevention_steps": [
|
|
203
|
-
"Create model registry (centralized model configuration)",
|
|
204
|
-
"Implement routing layer (smart model selection)",
|
|
205
|
-
"Add model health monitoring",
|
|
206
|
-
"Build unified API (abstract model differences)",
|
|
207
|
-
"Create model testing framework",
|
|
208
|
-
],
|
|
209
|
-
"reasoning": (
|
|
210
|
-
f"{model_count} models × configuration × prompts × monitoring = "
|
|
211
|
-
"high coordination overhead. Formal framework reduces complexity."
|
|
212
|
-
),
|
|
213
|
-
"personal_experience": (
|
|
214
|
-
"We started with GPT-4 for everything. Added Claude for long context. "
|
|
215
|
-
"Added GPT-3.5 for cheap tasks. Added Gemini for... "
|
|
216
|
-
"By model #5, configuration chaos. Should have built framework at #3."
|
|
217
|
-
),
|
|
218
|
-
},
|
|
219
|
-
)
|
|
220
|
-
|
|
221
|
-
# Pattern 2: Cost optimization will become critical
|
|
222
|
-
if model_count > 2 and not self._has_cost_optimization(routing):
|
|
223
|
-
predictions.append(
|
|
224
|
-
{
|
|
225
|
-
"type": "cost_optimization_needed",
|
|
226
|
-
"alert": (
|
|
227
|
-
f"Using {model_count} models without cost optimization. "
|
|
228
|
-
"In our experience, multi-model costs grow unpredictably. "
|
|
229
|
-
"Alert: Implement cost controls before bills surprise you."
|
|
230
|
-
),
|
|
231
|
-
"probability": "high",
|
|
232
|
-
"impact": "medium",
|
|
233
|
-
"prevention_steps": [
|
|
234
|
-
"Add per-request cost calculation",
|
|
235
|
-
"Implement cost-based routing (use cheaper model when possible)",
|
|
236
|
-
"Create cost budgets and alerts",
|
|
237
|
-
"Add caching layer (avoid repeated expensive calls)",
|
|
238
|
-
"Build cost analytics dashboard",
|
|
239
|
-
],
|
|
240
|
-
"reasoning": (
|
|
241
|
-
"GPT-4: $30/1M tokens. GPT-3.5: $1/1M tokens. Claude Haiku: $0.25/1M. "
|
|
242
|
-
"Routing all requests to GPT-4 wastes money. Smart routing saves 60-80%."
|
|
243
|
-
),
|
|
244
|
-
"personal_experience": (
|
|
245
|
-
"Our first multi-model bill: 3x expected. Turns out 90% of requests "
|
|
246
|
-
"went to most expensive model. Added smart routing, costs dropped 70%."
|
|
247
|
-
),
|
|
248
|
-
},
|
|
249
|
-
)
|
|
250
|
-
|
|
251
|
-
# Pattern 3: Output consistency issues
|
|
252
|
-
if model_count > 2 and not self._has_output_validation(routing):
|
|
253
|
-
predictions.append(
|
|
254
|
-
{
|
|
255
|
-
"type": "output_inconsistency",
|
|
256
|
-
"alert": (
|
|
257
|
-
"Multiple models without output validation. In our experience, "
|
|
258
|
-
"different models return different formats, causing downstream errors. "
|
|
259
|
-
"Alert: Add output validation before inconsistency creates bugs."
|
|
260
|
-
),
|
|
261
|
-
"probability": "medium-high",
|
|
262
|
-
"impact": "medium",
|
|
263
|
-
"prevention_steps": [
|
|
264
|
-
"Define output schemas (Pydantic, JSON Schema)",
|
|
265
|
-
"Implement validation layer (all models must conform)",
|
|
266
|
-
"Add output normalization (convert to standard format)",
|
|
267
|
-
"Create model-specific adapters",
|
|
268
|
-
"Build output quality tests",
|
|
269
|
-
],
|
|
270
|
-
"reasoning": (
|
|
271
|
-
'GPT returns {"answer": "..."}. Claude returns {"result": "..."}. '
|
|
272
|
-
"Your code expects one format. Random failures ensue."
|
|
273
|
-
),
|
|
274
|
-
},
|
|
275
|
-
)
|
|
276
|
-
|
|
277
|
-
# Pattern 4: Model version drift
|
|
278
|
-
if model_count > 1 and not self._has_version_tracking(routing):
|
|
279
|
-
predictions.append(
|
|
280
|
-
{
|
|
281
|
-
"type": "model_version_drift",
|
|
282
|
-
"alert": (
|
|
283
|
-
"No model version tracking. In our experience, providers update models "
|
|
284
|
-
"(GPT-4 → GPT-4-turbo), changing behavior silently. Alert: Track versions "
|
|
285
|
-
"before updates break your system."
|
|
286
|
-
),
|
|
287
|
-
"probability": "medium",
|
|
288
|
-
"impact": "high",
|
|
289
|
-
"prevention_steps": [
|
|
290
|
-
"Pin model versions (gpt-4-0613, not gpt-4)",
|
|
291
|
-
"Log model version with each request",
|
|
292
|
-
"Monitor for version changes",
|
|
293
|
-
"Test before upgrading versions",
|
|
294
|
-
"Create version migration path",
|
|
295
|
-
],
|
|
296
|
-
"reasoning": (
|
|
297
|
-
"OpenAI updates GPT-4. Your carefully tuned prompts stop working. "
|
|
298
|
-
"No logs = can't diagnose. Version tracking = control."
|
|
299
|
-
),
|
|
300
|
-
"personal_experience": (
|
|
301
|
-
"Provider updated model, our outputs changed format. Took 2 days to "
|
|
302
|
-
"realize it wasn't our code. Now we pin versions and test upgrades explicitly."
|
|
303
|
-
),
|
|
304
|
-
},
|
|
305
|
-
)
|
|
306
|
-
|
|
307
|
-
# Pattern 5: Lack of routing intelligence
|
|
308
|
-
if model_count > 3 and not self._has_smart_routing(routing):
|
|
309
|
-
predictions.append(
|
|
310
|
-
{
|
|
311
|
-
"type": "suboptimal_routing",
|
|
312
|
-
"alert": (
|
|
313
|
-
f"With {model_count} models, you need intelligent routing. "
|
|
314
|
-
"In our experience, static routing wastes money and quality. "
|
|
315
|
-
"Alert: Implement smart routing before inefficiency compounds."
|
|
316
|
-
),
|
|
317
|
-
"probability": "medium",
|
|
318
|
-
"impact": "medium",
|
|
319
|
-
"prevention_steps": [
|
|
320
|
-
"Classify requests (simple vs complex, short vs long)",
|
|
321
|
-
"Route based on requirements (cost, speed, quality)",
|
|
322
|
-
"Implement adaptive routing (learn from outcomes)",
|
|
323
|
-
"Add A/B testing (compare routing strategies)",
|
|
324
|
-
"Create routing analytics",
|
|
325
|
-
],
|
|
326
|
-
"reasoning": (
|
|
327
|
-
"Simple question → expensive model = waste. "
|
|
328
|
-
"Complex task → cheap model = bad quality. "
|
|
329
|
-
"Smart routing = right model for right task."
|
|
330
|
-
),
|
|
331
|
-
"personal_experience": (
|
|
332
|
-
"We route: Simple Q&A → Haiku. Long context → Claude. Code → GPT-4. "
|
|
333
|
-
"Same quality, 65% cost reduction. Should have done this from day one."
|
|
334
|
-
),
|
|
335
|
-
},
|
|
336
|
-
)
|
|
337
|
-
|
|
338
|
-
return predictions
|
|
339
|
-
|
|
340
|
-
def _generate_recommendations(self, issues: list[dict], predictions: list[dict]) -> list[str]:
|
|
341
|
-
"""Generate actionable recommendations"""
|
|
342
|
-
recommendations = []
|
|
343
|
-
|
|
344
|
-
# High-impact predictions
|
|
345
|
-
for pred in predictions:
|
|
346
|
-
if pred.get("impact") in ["high", "medium"]:
|
|
347
|
-
recommendations.append(f"\n[ALERT] {pred['alert']}")
|
|
348
|
-
if "personal_experience" in pred:
|
|
349
|
-
recommendations.append(f"Experience: {pred['personal_experience']}")
|
|
350
|
-
recommendations.append("Prevention steps:")
|
|
351
|
-
for i, step in enumerate(pred["prevention_steps"][:3], 1):
|
|
352
|
-
recommendations.append(f" {i}. {step}")
|
|
353
|
-
|
|
354
|
-
return recommendations
|
|
355
|
-
|
|
356
|
-
def _extract_patterns(
|
|
357
|
-
self,
|
|
358
|
-
issues: list[dict],
|
|
359
|
-
predictions: list[dict],
|
|
360
|
-
) -> list[dict[str, Any]]:
|
|
361
|
-
"""Extract cross-domain patterns"""
|
|
362
|
-
return [
|
|
363
|
-
{
|
|
364
|
-
"pattern_type": "multi_provider_coordination",
|
|
365
|
-
"description": (
|
|
366
|
-
"Systems using multiple providers/services hit coordination "
|
|
367
|
-
"complexity around 4-5 providers. Abstraction layer becomes essential."
|
|
368
|
-
),
|
|
369
|
-
"domain_agnostic": True,
|
|
370
|
-
"applicable_to": [
|
|
371
|
-
"Multi-model AI systems",
|
|
372
|
-
"Multi-cloud infrastructure",
|
|
373
|
-
"Multi-vendor integrations",
|
|
374
|
-
"Payment processors (healthcare, finance)",
|
|
375
|
-
"Any system with provider diversity",
|
|
376
|
-
],
|
|
377
|
-
"threshold": "4-5 providers",
|
|
378
|
-
"solution": "Build abstraction layer + unified interface",
|
|
379
|
-
},
|
|
380
|
-
]
|
|
381
|
-
|
|
382
|
-
# Helper methods
|
|
383
|
-
|
|
384
|
-
def _has_model_abstraction(self, routing: list[str]) -> bool:
|
|
385
|
-
"""Check for model abstraction layer"""
|
|
386
|
-
for file_path in routing:
|
|
387
|
-
try:
|
|
388
|
-
with open(file_path) as f:
|
|
389
|
-
content = f.read()
|
|
390
|
-
if any(
|
|
391
|
-
kw in content
|
|
392
|
-
for kw in ["ModelRouter", "ModelRegistry", "AbstractModel", "UnifiedAPI"]
|
|
393
|
-
):
|
|
394
|
-
return True
|
|
395
|
-
except OSError:
|
|
396
|
-
pass
|
|
397
|
-
return False
|
|
398
|
-
|
|
399
|
-
def _has_fallback_strategy(self, routing: list[str]) -> bool:
|
|
400
|
-
"""Check for fallback/retry logic"""
|
|
401
|
-
for file_path in routing:
|
|
402
|
-
try:
|
|
403
|
-
with open(file_path) as f:
|
|
404
|
-
content = f.read()
|
|
405
|
-
if "fallback" in content.lower() or "retry" in content.lower():
|
|
406
|
-
return True
|
|
407
|
-
except OSError:
|
|
408
|
-
pass
|
|
409
|
-
return False
|
|
410
|
-
|
|
411
|
-
def _has_consistent_prompts(self, model_usage: list[dict]) -> bool:
|
|
412
|
-
"""Check for consistent prompt templates"""
|
|
413
|
-
# Simplified - would need actual analysis
|
|
414
|
-
return any(usage.get("uses_template_system") for usage in model_usage)
|
|
415
|
-
|
|
416
|
-
def _has_cost_tracking(self, routing: list[str]) -> bool:
|
|
417
|
-
"""Check for cost tracking"""
|
|
418
|
-
for file_path in routing:
|
|
419
|
-
try:
|
|
420
|
-
with open(file_path) as f:
|
|
421
|
-
content = f.read()
|
|
422
|
-
if "cost" in content.lower() and (
|
|
423
|
-
"track" in content.lower() or "log" in content.lower()
|
|
424
|
-
):
|
|
425
|
-
return True
|
|
426
|
-
except OSError:
|
|
427
|
-
pass
|
|
428
|
-
return False
|
|
429
|
-
|
|
430
|
-
def _has_performance_monitoring(self, routing: list[str]) -> bool:
|
|
431
|
-
"""Check for performance monitoring"""
|
|
432
|
-
for file_path in routing:
|
|
433
|
-
try:
|
|
434
|
-
with open(file_path) as f:
|
|
435
|
-
content = f.read()
|
|
436
|
-
if any(
|
|
437
|
-
kw in content.lower()
|
|
438
|
-
for kw in ["latency", "metrics", "monitoring", "telemetry"]
|
|
439
|
-
):
|
|
440
|
-
return True
|
|
441
|
-
except OSError:
|
|
442
|
-
pass
|
|
443
|
-
return False
|
|
444
|
-
|
|
445
|
-
def _has_cost_optimization(self, routing: list[str]) -> bool:
|
|
446
|
-
"""Check for cost optimization strategies"""
|
|
447
|
-
for file_path in routing:
|
|
448
|
-
try:
|
|
449
|
-
with open(file_path) as f:
|
|
450
|
-
content = f.read()
|
|
451
|
-
if "cache" in content.lower() or "budget" in content.lower():
|
|
452
|
-
return True
|
|
453
|
-
except OSError:
|
|
454
|
-
pass
|
|
455
|
-
return False
|
|
456
|
-
|
|
457
|
-
def _has_output_validation(self, routing: list[str]) -> bool:
|
|
458
|
-
"""Check for output validation"""
|
|
459
|
-
for file_path in routing:
|
|
460
|
-
try:
|
|
461
|
-
with open(file_path) as f:
|
|
462
|
-
content = f.read()
|
|
463
|
-
if any(kw in content for kw in ["Pydantic", "validate", "schema", "BaseModel"]):
|
|
464
|
-
return True
|
|
465
|
-
except OSError:
|
|
466
|
-
pass
|
|
467
|
-
return False
|
|
468
|
-
|
|
469
|
-
def _has_version_tracking(self, routing: list[str]) -> bool:
|
|
470
|
-
"""Check for model version tracking"""
|
|
471
|
-
for file_path in routing:
|
|
472
|
-
try:
|
|
473
|
-
with open(file_path) as f:
|
|
474
|
-
content = f.read()
|
|
475
|
-
# Look for specific version strings
|
|
476
|
-
if "gpt-4-" in content or "claude-3" in content or "version" in content.lower():
|
|
477
|
-
return True
|
|
478
|
-
except OSError:
|
|
479
|
-
pass
|
|
480
|
-
return False
|
|
481
|
-
|
|
482
|
-
def _has_smart_routing(self, routing: list[str]) -> bool:
|
|
483
|
-
"""Check for intelligent routing logic"""
|
|
484
|
-
for file_path in routing:
|
|
485
|
-
try:
|
|
486
|
-
with open(file_path) as f:
|
|
487
|
-
content = f.read()
|
|
488
|
-
if any(
|
|
489
|
-
kw in content.lower()
|
|
490
|
-
for kw in [
|
|
491
|
-
"classify",
|
|
492
|
-
"route_by",
|
|
493
|
-
"select_model",
|
|
494
|
-
"intelligent",
|
|
495
|
-
"adaptive",
|
|
496
|
-
]
|
|
497
|
-
):
|
|
498
|
-
return True
|
|
499
|
-
except OSError:
|
|
500
|
-
pass
|
|
501
|
-
return False
|