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.
Files changed (247) hide show
  1. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/METADATA +7 -6
  2. empathy_framework-4.7.0.dist-info/RECORD +354 -0
  3. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/top_level.txt +0 -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.py +173 -0
  130. empathy_os/workflows/__init__.py +212 -120
  131. empathy_os/workflows/batch_processing.py +8 -24
  132. empathy_os/workflows/bug_predict.py +1 -1
  133. empathy_os/workflows/code_review.py +20 -5
  134. empathy_os/workflows/code_review_pipeline.py +13 -8
  135. empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
  136. empathy_os/workflows/manage_documentation.py +1 -0
  137. empathy_os/workflows/orchestrated_health_check.py +6 -11
  138. empathy_os/workflows/orchestrated_release_prep.py +3 -3
  139. empathy_os/workflows/pr_review.py +18 -10
  140. empathy_os/workflows/progressive/__init__.py +2 -12
  141. empathy_os/workflows/progressive/cli.py +14 -37
  142. empathy_os/workflows/progressive/core.py +12 -12
  143. empathy_os/workflows/progressive/orchestrator.py +166 -144
  144. empathy_os/workflows/progressive/reports.py +22 -31
  145. empathy_os/workflows/progressive/telemetry.py +8 -14
  146. empathy_os/workflows/progressive/test_gen.py +29 -48
  147. empathy_os/workflows/progressive/workflow.py +31 -70
  148. empathy_os/workflows/release_prep.py +21 -6
  149. empathy_os/workflows/release_prep_crew.py +1 -0
  150. empathy_os/workflows/secure_release.py +13 -6
  151. empathy_os/workflows/security_audit.py +8 -3
  152. empathy_os/workflows/test_coverage_boost_crew.py +3 -2
  153. empathy_os/workflows/test_maintenance_crew.py +1 -0
  154. empathy_os/workflows/test_runner.py +16 -12
  155. empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
  156. empathy_software_plugin/cli.py +0 -122
  157. coach_wizards/__init__.py +0 -45
  158. coach_wizards/accessibility_wizard.py +0 -91
  159. coach_wizards/api_wizard.py +0 -91
  160. coach_wizards/base_wizard.py +0 -209
  161. coach_wizards/cicd_wizard.py +0 -91
  162. coach_wizards/code_reviewer_README.md +0 -60
  163. coach_wizards/code_reviewer_wizard.py +0 -180
  164. coach_wizards/compliance_wizard.py +0 -91
  165. coach_wizards/database_wizard.py +0 -91
  166. coach_wizards/debugging_wizard.py +0 -91
  167. coach_wizards/documentation_wizard.py +0 -91
  168. coach_wizards/generate_wizards.py +0 -347
  169. coach_wizards/localization_wizard.py +0 -173
  170. coach_wizards/migration_wizard.py +0 -91
  171. coach_wizards/monitoring_wizard.py +0 -91
  172. coach_wizards/observability_wizard.py +0 -91
  173. coach_wizards/performance_wizard.py +0 -91
  174. coach_wizards/prompt_engineering_wizard.py +0 -661
  175. coach_wizards/refactoring_wizard.py +0 -91
  176. coach_wizards/scaling_wizard.py +0 -90
  177. coach_wizards/security_wizard.py +0 -92
  178. coach_wizards/testing_wizard.py +0 -91
  179. empathy_framework-4.6.6.dist-info/RECORD +0 -410
  180. empathy_llm_toolkit/wizards/__init__.py +0 -43
  181. empathy_llm_toolkit/wizards/base_wizard.py +0 -364
  182. empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
  183. empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
  184. empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
  185. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
  186. empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
  187. empathy_os/wizard_factory_cli.py +0 -170
  188. empathy_software_plugin/wizards/__init__.py +0 -42
  189. empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
  190. empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
  191. empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
  192. empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
  193. empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
  194. empathy_software_plugin/wizards/base_wizard.py +0 -288
  195. empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
  196. empathy_software_plugin/wizards/code_review_wizard.py +0 -604
  197. empathy_software_plugin/wizards/debugging/__init__.py +0 -50
  198. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
  199. empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
  200. empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
  201. empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
  202. empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
  203. empathy_software_plugin/wizards/debugging/verification.py +0 -369
  204. empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
  205. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
  206. empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
  207. empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
  208. empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
  209. empathy_software_plugin/wizards/performance/__init__.py +0 -9
  210. empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
  211. empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
  212. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
  213. empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
  214. empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
  215. empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
  216. empathy_software_plugin/wizards/security/__init__.py +0 -32
  217. empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
  218. empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
  219. empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
  220. empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
  221. empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
  222. empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
  223. empathy_software_plugin/wizards/testing/__init__.py +0 -27
  224. empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
  225. empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
  226. empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
  227. empathy_software_plugin/wizards/testing_wizard.py +0 -274
  228. wizards/__init__.py +0 -82
  229. wizards/admission_assessment_wizard.py +0 -644
  230. wizards/care_plan.py +0 -321
  231. wizards/clinical_assessment.py +0 -769
  232. wizards/discharge_planning.py +0 -77
  233. wizards/discharge_summary_wizard.py +0 -468
  234. wizards/dosage_calculation.py +0 -497
  235. wizards/incident_report_wizard.py +0 -454
  236. wizards/medication_reconciliation.py +0 -85
  237. wizards/nursing_assessment.py +0 -171
  238. wizards/patient_education.py +0 -654
  239. wizards/quality_improvement.py +0 -705
  240. wizards/sbar_report.py +0 -324
  241. wizards/sbar_wizard.py +0 -608
  242. wizards/shift_handoff_wizard.py +0 -535
  243. wizards/soap_note_wizard.py +0 -679
  244. wizards/treatment_plan.py +0 -15
  245. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/WHEEL +0 -0
  246. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/entry_points.txt +0 -0
  247. {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.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