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,305 +0,0 @@
|
|
|
1
|
-
"""Performance Profiling Wizard (Level 4)
|
|
2
|
-
|
|
3
|
-
Predicts performance bottlenecks BEFORE they become critical.
|
|
4
|
-
|
|
5
|
-
Level 4: Anticipatory - alerts to performance degradation trajectory.
|
|
6
|
-
|
|
7
|
-
Copyright 2025 Smart AI Memory, LLC
|
|
8
|
-
Licensed under Fair Source 0.9
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
import logging
|
|
12
|
-
from typing import Any
|
|
13
|
-
|
|
14
|
-
from .base_wizard import BaseWizard
|
|
15
|
-
from .performance.bottleneck_detector import Bottleneck, BottleneckDetector
|
|
16
|
-
from .performance.profiler_parsers import (
|
|
17
|
-
FunctionProfile,
|
|
18
|
-
SimpleJSONProfilerParser,
|
|
19
|
-
parse_profiler_output,
|
|
20
|
-
)
|
|
21
|
-
from .performance.trajectory_analyzer import PerformanceTrajectoryAnalyzer, TrajectoryPrediction
|
|
22
|
-
|
|
23
|
-
logger = logging.getLogger(__name__)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class PerformanceProfilingWizard(BaseWizard):
|
|
27
|
-
"""Performance Profiling Wizard - Level 4
|
|
28
|
-
|
|
29
|
-
Beyond identifying current bottlenecks:
|
|
30
|
-
- Predicts future performance degradation
|
|
31
|
-
- Analyzes performance trajectory
|
|
32
|
-
- Suggests optimizations based on impact
|
|
33
|
-
- Cross-language performance patterns
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
@property
|
|
37
|
-
def name(self) -> str:
|
|
38
|
-
return "Performance Profiling Wizard"
|
|
39
|
-
|
|
40
|
-
@property
|
|
41
|
-
def level(self) -> int:
|
|
42
|
-
return 4
|
|
43
|
-
|
|
44
|
-
def __init__(self):
|
|
45
|
-
super().__init__()
|
|
46
|
-
|
|
47
|
-
self.profiler_parser = SimpleJSONProfilerParser() # Default parser
|
|
48
|
-
self.bottleneck_detector = BottleneckDetector()
|
|
49
|
-
self.trajectory_analyzer = PerformanceTrajectoryAnalyzer()
|
|
50
|
-
|
|
51
|
-
async def analyze(self, context: dict[str, Any]) -> dict[str, Any]:
|
|
52
|
-
"""Analyze performance and predict bottlenecks.
|
|
53
|
-
|
|
54
|
-
Context expects:
|
|
55
|
-
- profiler_data: Profiling output (string or dict)
|
|
56
|
-
- profiler_type: "cprofile", "chrome_devtools", etc.
|
|
57
|
-
- current_metrics: Current performance metrics (optional)
|
|
58
|
-
- historical_metrics: Historical performance data (optional)
|
|
59
|
-
- threshold_percent: Min % of time to consider (default: 5.0)
|
|
60
|
-
|
|
61
|
-
Returns:
|
|
62
|
-
Analysis with bottlenecks, trajectory, predictions, recommendations
|
|
63
|
-
|
|
64
|
-
"""
|
|
65
|
-
profiler_data = context.get("profiler_data")
|
|
66
|
-
profiler_type = context.get("profiler_type", "simple_json")
|
|
67
|
-
current_metrics = context.get("current_metrics", {})
|
|
68
|
-
historical_metrics = context.get("historical_metrics", [])
|
|
69
|
-
threshold_percent = context.get("threshold_percent", 5.0)
|
|
70
|
-
|
|
71
|
-
if not profiler_data:
|
|
72
|
-
return {
|
|
73
|
-
"error": "profiler_data required",
|
|
74
|
-
"help": "Provide profiling output from cProfile, Chrome DevTools, etc.",
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
# Phase 1: Parse profiler output
|
|
78
|
-
profiles = parse_profiler_output(profiler_type, profiler_data)
|
|
79
|
-
|
|
80
|
-
# Phase 2: Detect bottlenecks
|
|
81
|
-
bottlenecks = self.bottleneck_detector.detect_bottlenecks(profiles, threshold_percent)
|
|
82
|
-
|
|
83
|
-
# Phase 3: Analyze trajectory (Level 4)
|
|
84
|
-
trajectory_prediction = None
|
|
85
|
-
if historical_metrics:
|
|
86
|
-
# If no current_metrics provided, analyzer will extract from last historical entry
|
|
87
|
-
trajectory_prediction = self.trajectory_analyzer.analyze_trajectory(
|
|
88
|
-
current_metrics if current_metrics else historical_metrics,
|
|
89
|
-
historical_metrics if current_metrics else None,
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
# Phase 4: Generate insights
|
|
93
|
-
insights = self._generate_insights(profiles, bottlenecks)
|
|
94
|
-
|
|
95
|
-
# Phase 5: Predictions (Level 4)
|
|
96
|
-
predictions = self._generate_predictions(bottlenecks, trajectory_prediction, profiles)
|
|
97
|
-
|
|
98
|
-
# Phase 6: Recommendations
|
|
99
|
-
recommendations = self._generate_recommendations(
|
|
100
|
-
bottlenecks,
|
|
101
|
-
trajectory_prediction,
|
|
102
|
-
insights,
|
|
103
|
-
)
|
|
104
|
-
|
|
105
|
-
# Get top function
|
|
106
|
-
top_func = profiles[0] if profiles else None
|
|
107
|
-
top_function_str = (
|
|
108
|
-
f"{top_func.function_name} ({top_func.percent_total:.1f}% of time)"
|
|
109
|
-
if top_func
|
|
110
|
-
else "None"
|
|
111
|
-
)
|
|
112
|
-
|
|
113
|
-
return {
|
|
114
|
-
"profiling_summary": {
|
|
115
|
-
"total_functions": len(profiles),
|
|
116
|
-
"total_time": sum(p.total_time for p in profiles),
|
|
117
|
-
"top_function": top_function_str,
|
|
118
|
-
"top_5_slowest": [
|
|
119
|
-
{"function": p.function_name, "time": p.total_time, "percent": p.percent_total}
|
|
120
|
-
for p in profiles[:5]
|
|
121
|
-
],
|
|
122
|
-
},
|
|
123
|
-
"bottlenecks": [b.to_dict() for b in bottlenecks],
|
|
124
|
-
"trajectory": trajectory_prediction.to_dict() if trajectory_prediction else None,
|
|
125
|
-
"trajectory_analysis": (
|
|
126
|
-
trajectory_prediction.to_dict()
|
|
127
|
-
if trajectory_prediction
|
|
128
|
-
else {"state": "unknown", "trends": []}
|
|
129
|
-
),
|
|
130
|
-
"insights": insights,
|
|
131
|
-
# Standard wizard outputs
|
|
132
|
-
"predictions": predictions,
|
|
133
|
-
"recommendations": recommendations,
|
|
134
|
-
"confidence": 0.85,
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
def _generate_insights(
|
|
138
|
-
self,
|
|
139
|
-
profiles: list[FunctionProfile],
|
|
140
|
-
bottlenecks: list[Bottleneck],
|
|
141
|
-
) -> dict[str, Any]:
|
|
142
|
-
"""Generate performance insights"""
|
|
143
|
-
# Identify patterns
|
|
144
|
-
io_heavy = sum(1 for b in bottlenecks if b.type.value == "io_bound")
|
|
145
|
-
cpu_heavy = sum(1 for b in bottlenecks if b.type.value == "cpu_bound")
|
|
146
|
-
n_plus_one = sum(1 for b in bottlenecks if b.type.value == "n_plus_one")
|
|
147
|
-
|
|
148
|
-
insights = {
|
|
149
|
-
"dominant_pattern": self._identify_dominant_pattern(io_heavy, cpu_heavy, n_plus_one),
|
|
150
|
-
"io_bound_operations": io_heavy,
|
|
151
|
-
"cpu_bound_operations": cpu_heavy,
|
|
152
|
-
"n_plus_one_queries": n_plus_one,
|
|
153
|
-
"optimization_potential": self._estimate_optimization_potential(bottlenecks),
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
return insights
|
|
157
|
-
|
|
158
|
-
def _identify_dominant_pattern(self, io_heavy: int, cpu_heavy: int, n_plus_one: int) -> str:
|
|
159
|
-
"""Identify dominant performance pattern"""
|
|
160
|
-
if n_plus_one > 0:
|
|
161
|
-
return "database_n_plus_one"
|
|
162
|
-
if io_heavy > cpu_heavy:
|
|
163
|
-
return "io_bound"
|
|
164
|
-
if cpu_heavy > 0:
|
|
165
|
-
return "cpu_bound"
|
|
166
|
-
return "balanced"
|
|
167
|
-
|
|
168
|
-
def _estimate_optimization_potential(self, bottlenecks: list[Bottleneck]) -> dict[str, Any]:
|
|
169
|
-
"""Estimate potential time savings from optimizations"""
|
|
170
|
-
if not bottlenecks:
|
|
171
|
-
return {"potential_savings": 0.0, "percentage": 0.0, "assessment": "LOW"}
|
|
172
|
-
|
|
173
|
-
# Sum time from all bottlenecks
|
|
174
|
-
total_bottleneck_time = sum(b.time_cost for b in bottlenecks)
|
|
175
|
-
|
|
176
|
-
# Assume we can optimize 50% of bottleneck time
|
|
177
|
-
potential_savings = total_bottleneck_time * 0.5
|
|
178
|
-
|
|
179
|
-
# Calculate percentage of total
|
|
180
|
-
total_time = (
|
|
181
|
-
bottlenecks[0].time_cost / (bottlenecks[0].percent_total / 100) if bottlenecks else 1
|
|
182
|
-
)
|
|
183
|
-
percentage = (potential_savings / total_time * 100) if total_time > 0 else 0
|
|
184
|
-
|
|
185
|
-
return {
|
|
186
|
-
"potential_savings": potential_savings,
|
|
187
|
-
"percentage": percentage,
|
|
188
|
-
"assessment": self._assess_optimization_potential(percentage),
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
def _assess_optimization_potential(self, percentage: float) -> str:
|
|
192
|
-
"""Assess optimization potential"""
|
|
193
|
-
if percentage > 30:
|
|
194
|
-
return "HIGH"
|
|
195
|
-
if percentage > 15:
|
|
196
|
-
return "MEDIUM"
|
|
197
|
-
if percentage > 5:
|
|
198
|
-
return "LOW"
|
|
199
|
-
return "MINIMAL"
|
|
200
|
-
|
|
201
|
-
def _generate_predictions(
|
|
202
|
-
self,
|
|
203
|
-
bottlenecks: list[Bottleneck],
|
|
204
|
-
trajectory: TrajectoryPrediction | None,
|
|
205
|
-
profiles: list[FunctionProfile],
|
|
206
|
-
) -> list[dict[str, Any]]:
|
|
207
|
-
"""Generate Level 4 predictions"""
|
|
208
|
-
predictions = []
|
|
209
|
-
|
|
210
|
-
# Prediction 1: Critical bottlenecks
|
|
211
|
-
critical_bottlenecks = [b for b in bottlenecks if b.severity == "CRITICAL"]
|
|
212
|
-
if critical_bottlenecks:
|
|
213
|
-
predictions.append(
|
|
214
|
-
{
|
|
215
|
-
"type": "performance_degradation_risk",
|
|
216
|
-
"severity": "critical",
|
|
217
|
-
"description": (
|
|
218
|
-
f"{len(critical_bottlenecks)} critical bottlenecks detected. "
|
|
219
|
-
f"In our experience, functions consuming >30% of execution time "
|
|
220
|
-
"cause timeout errors under load."
|
|
221
|
-
),
|
|
222
|
-
"affected_functions": [b.function_name for b in critical_bottlenecks[:3]],
|
|
223
|
-
"prevention_steps": [b.fix_suggestion for b in critical_bottlenecks[:3]],
|
|
224
|
-
},
|
|
225
|
-
)
|
|
226
|
-
|
|
227
|
-
# Prediction 2: N+1 query pattern
|
|
228
|
-
n_plus_one = [b for b in bottlenecks if b.type.value == "n_plus_one"]
|
|
229
|
-
if n_plus_one:
|
|
230
|
-
predictions.append(
|
|
231
|
-
{
|
|
232
|
-
"type": "scalability_risk",
|
|
233
|
-
"severity": "high",
|
|
234
|
-
"description": (
|
|
235
|
-
f"{len(n_plus_one)} potential N+1 query patterns detected. "
|
|
236
|
-
"In our experience, these cause exponential slowdown as data grows."
|
|
237
|
-
),
|
|
238
|
-
"prevention_steps": [
|
|
239
|
-
"Implement eager loading or query batching",
|
|
240
|
-
"Add database query monitoring",
|
|
241
|
-
"Review ORM usage patterns",
|
|
242
|
-
],
|
|
243
|
-
},
|
|
244
|
-
)
|
|
245
|
-
|
|
246
|
-
# Prediction 3: Trajectory-based prediction
|
|
247
|
-
if trajectory and trajectory.trajectory_state in ["degrading", "critical"]:
|
|
248
|
-
predictions.append(
|
|
249
|
-
{
|
|
250
|
-
"type": "performance_trajectory",
|
|
251
|
-
"severity": "high" if trajectory.trajectory_state == "critical" else "medium",
|
|
252
|
-
"description": trajectory.overall_assessment,
|
|
253
|
-
"time_horizon": trajectory.estimated_time_to_critical,
|
|
254
|
-
"confidence": trajectory.confidence,
|
|
255
|
-
"prevention_steps": trajectory.recommendations,
|
|
256
|
-
},
|
|
257
|
-
)
|
|
258
|
-
|
|
259
|
-
return predictions
|
|
260
|
-
|
|
261
|
-
def _generate_recommendations(
|
|
262
|
-
self,
|
|
263
|
-
bottlenecks: list[Bottleneck],
|
|
264
|
-
trajectory: TrajectoryPrediction | None,
|
|
265
|
-
insights: dict[str, Any],
|
|
266
|
-
) -> list[str]:
|
|
267
|
-
"""Generate actionable recommendations"""
|
|
268
|
-
recommendations = []
|
|
269
|
-
|
|
270
|
-
# Pattern-based recommendations
|
|
271
|
-
dominant_pattern = insights.get("dominant_pattern", "balanced")
|
|
272
|
-
|
|
273
|
-
if dominant_pattern == "database_n_plus_one":
|
|
274
|
-
recommendations.append(
|
|
275
|
-
"⚠️ CRITICAL: Fix N+1 database queries with eager loading or batching",
|
|
276
|
-
)
|
|
277
|
-
|
|
278
|
-
if dominant_pattern == "io_bound":
|
|
279
|
-
recommendations.append(
|
|
280
|
-
"Optimize I/O operations: Use async I/O, connection pooling, or caching",
|
|
281
|
-
)
|
|
282
|
-
|
|
283
|
-
if dominant_pattern == "cpu_bound":
|
|
284
|
-
recommendations.append(
|
|
285
|
-
"Optimize CPU-heavy operations: Review algorithms, consider caching results",
|
|
286
|
-
)
|
|
287
|
-
|
|
288
|
-
# Bottleneck-specific recommendations
|
|
289
|
-
for bottleneck in bottlenecks[:3]: # Top 3
|
|
290
|
-
recommendations.append(
|
|
291
|
-
f"{bottleneck.severity}: {bottleneck.function_name} - {bottleneck.fix_suggestion}",
|
|
292
|
-
)
|
|
293
|
-
|
|
294
|
-
# Trajectory recommendations
|
|
295
|
-
if trajectory and trajectory.trajectory_state != "optimal":
|
|
296
|
-
recommendations.extend(trajectory.recommendations)
|
|
297
|
-
|
|
298
|
-
# Optimization potential
|
|
299
|
-
opt_potential = insights.get("optimization_potential", "LOW")
|
|
300
|
-
if opt_potential in ["HIGH", "MEDIUM"]:
|
|
301
|
-
recommendations.append(
|
|
302
|
-
f"{opt_potential} optimization potential - significant performance gains possible",
|
|
303
|
-
)
|
|
304
|
-
|
|
305
|
-
return list(dict.fromkeys(recommendations)) # Deduplicate (preserves order)
|