empathy-framework 2.4.0__py3-none-any.whl → 3.8.2__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.
- coach_wizards/__init__.py +13 -12
- coach_wizards/accessibility_wizard.py +12 -12
- coach_wizards/api_wizard.py +12 -12
- coach_wizards/base_wizard.py +26 -20
- coach_wizards/cicd_wizard.py +15 -13
- coach_wizards/code_reviewer_README.md +60 -0
- coach_wizards/code_reviewer_wizard.py +180 -0
- coach_wizards/compliance_wizard.py +12 -12
- coach_wizards/database_wizard.py +12 -12
- coach_wizards/debugging_wizard.py +12 -12
- coach_wizards/documentation_wizard.py +12 -12
- coach_wizards/generate_wizards.py +1 -2
- coach_wizards/localization_wizard.py +101 -19
- coach_wizards/migration_wizard.py +12 -12
- coach_wizards/monitoring_wizard.py +12 -12
- coach_wizards/observability_wizard.py +12 -12
- coach_wizards/performance_wizard.py +12 -12
- coach_wizards/prompt_engineering_wizard.py +661 -0
- coach_wizards/refactoring_wizard.py +12 -12
- coach_wizards/scaling_wizard.py +12 -12
- coach_wizards/security_wizard.py +12 -12
- coach_wizards/testing_wizard.py +12 -12
- empathy_framework-3.8.2.dist-info/METADATA +1176 -0
- empathy_framework-3.8.2.dist-info/RECORD +333 -0
- empathy_framework-3.8.2.dist-info/entry_points.txt +22 -0
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/top_level.txt +5 -1
- empathy_healthcare_plugin/__init__.py +1 -2
- empathy_healthcare_plugin/monitors/__init__.py +9 -0
- empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
- empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
- empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
- empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
- empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
- empathy_llm_toolkit/__init__.py +7 -7
- empathy_llm_toolkit/agent_factory/__init__.py +53 -0
- empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
- empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
- empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
- empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
- empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
- empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
- empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
- empathy_llm_toolkit/agent_factory/base.py +305 -0
- empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
- empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
- empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
- empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
- empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
- empathy_llm_toolkit/agent_factory/decorators.py +286 -0
- empathy_llm_toolkit/agent_factory/factory.py +558 -0
- empathy_llm_toolkit/agent_factory/framework.py +192 -0
- empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
- empathy_llm_toolkit/agent_factory/resilient.py +320 -0
- empathy_llm_toolkit/claude_memory.py +14 -15
- empathy_llm_toolkit/cli/__init__.py +8 -0
- empathy_llm_toolkit/cli/sync_claude.py +487 -0
- empathy_llm_toolkit/code_health.py +186 -28
- empathy_llm_toolkit/config/__init__.py +29 -0
- empathy_llm_toolkit/config/unified.py +295 -0
- empathy_llm_toolkit/contextual_patterns.py +11 -12
- empathy_llm_toolkit/core.py +168 -53
- empathy_llm_toolkit/git_pattern_extractor.py +17 -13
- empathy_llm_toolkit/levels.py +6 -13
- empathy_llm_toolkit/pattern_confidence.py +14 -18
- empathy_llm_toolkit/pattern_resolver.py +10 -12
- empathy_llm_toolkit/pattern_summary.py +16 -14
- empathy_llm_toolkit/providers.py +194 -28
- empathy_llm_toolkit/routing/__init__.py +32 -0
- empathy_llm_toolkit/routing/model_router.py +362 -0
- empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
- empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
- empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
- empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
- empathy_llm_toolkit/security/README.md +262 -0
- empathy_llm_toolkit/security/__init__.py +62 -0
- empathy_llm_toolkit/security/audit_logger.py +929 -0
- empathy_llm_toolkit/security/audit_logger_example.py +152 -0
- empathy_llm_toolkit/security/pii_scrubber.py +640 -0
- empathy_llm_toolkit/security/secrets_detector.py +678 -0
- empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
- empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
- empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
- empathy_llm_toolkit/session_status.py +20 -22
- empathy_llm_toolkit/state.py +28 -21
- empathy_llm_toolkit/wizards/__init__.py +38 -0
- empathy_llm_toolkit/wizards/base_wizard.py +364 -0
- empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
- empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
- empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
- empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
- empathy_os/__init__.py +125 -84
- empathy_os/adaptive/__init__.py +13 -0
- empathy_os/adaptive/task_complexity.py +127 -0
- empathy_os/{monitoring.py → agent_monitoring.py} +28 -28
- empathy_os/cache/__init__.py +117 -0
- empathy_os/cache/base.py +166 -0
- empathy_os/cache/dependency_manager.py +253 -0
- empathy_os/cache/hash_only.py +248 -0
- empathy_os/cache/hybrid.py +390 -0
- empathy_os/cache/storage.py +282 -0
- empathy_os/cli.py +1516 -70
- empathy_os/cli_unified.py +597 -0
- empathy_os/config/__init__.py +63 -0
- empathy_os/config/xml_config.py +239 -0
- empathy_os/config.py +95 -37
- empathy_os/coordination.py +72 -68
- empathy_os/core.py +94 -107
- empathy_os/cost_tracker.py +74 -55
- empathy_os/dashboard/__init__.py +15 -0
- empathy_os/dashboard/server.py +743 -0
- empathy_os/discovery.py +17 -14
- empathy_os/emergence.py +21 -22
- empathy_os/exceptions.py +18 -30
- empathy_os/feedback_loops.py +30 -33
- empathy_os/levels.py +32 -35
- empathy_os/leverage_points.py +31 -32
- empathy_os/logging_config.py +19 -16
- empathy_os/memory/__init__.py +195 -0
- empathy_os/memory/claude_memory.py +466 -0
- empathy_os/memory/config.py +224 -0
- empathy_os/memory/control_panel.py +1298 -0
- empathy_os/memory/edges.py +179 -0
- empathy_os/memory/graph.py +567 -0
- empathy_os/memory/long_term.py +1194 -0
- empathy_os/memory/nodes.py +179 -0
- empathy_os/memory/redis_bootstrap.py +540 -0
- empathy_os/memory/security/__init__.py +31 -0
- empathy_os/memory/security/audit_logger.py +930 -0
- empathy_os/memory/security/pii_scrubber.py +640 -0
- empathy_os/memory/security/secrets_detector.py +678 -0
- empathy_os/memory/short_term.py +2119 -0
- empathy_os/memory/storage/__init__.py +15 -0
- empathy_os/memory/summary_index.py +583 -0
- empathy_os/memory/unified.py +619 -0
- empathy_os/metrics/__init__.py +12 -0
- empathy_os/metrics/prompt_metrics.py +190 -0
- empathy_os/models/__init__.py +136 -0
- empathy_os/models/__main__.py +13 -0
- empathy_os/models/cli.py +655 -0
- empathy_os/models/empathy_executor.py +354 -0
- empathy_os/models/executor.py +252 -0
- empathy_os/models/fallback.py +671 -0
- empathy_os/models/provider_config.py +563 -0
- empathy_os/models/registry.py +382 -0
- empathy_os/models/tasks.py +302 -0
- empathy_os/models/telemetry.py +548 -0
- empathy_os/models/token_estimator.py +378 -0
- empathy_os/models/validation.py +274 -0
- empathy_os/monitoring/__init__.py +52 -0
- empathy_os/monitoring/alerts.py +23 -0
- empathy_os/monitoring/alerts_cli.py +268 -0
- empathy_os/monitoring/multi_backend.py +271 -0
- empathy_os/monitoring/otel_backend.py +363 -0
- empathy_os/optimization/__init__.py +19 -0
- empathy_os/optimization/context_optimizer.py +272 -0
- empathy_os/pattern_library.py +30 -29
- empathy_os/persistence.py +35 -37
- empathy_os/platform_utils.py +261 -0
- empathy_os/plugins/__init__.py +28 -0
- empathy_os/plugins/base.py +361 -0
- empathy_os/plugins/registry.py +268 -0
- empathy_os/project_index/__init__.py +30 -0
- empathy_os/project_index/cli.py +335 -0
- empathy_os/project_index/crew_integration.py +430 -0
- empathy_os/project_index/index.py +425 -0
- empathy_os/project_index/models.py +501 -0
- empathy_os/project_index/reports.py +473 -0
- empathy_os/project_index/scanner.py +538 -0
- empathy_os/prompts/__init__.py +61 -0
- empathy_os/prompts/config.py +77 -0
- empathy_os/prompts/context.py +177 -0
- empathy_os/prompts/parser.py +285 -0
- empathy_os/prompts/registry.py +313 -0
- empathy_os/prompts/templates.py +208 -0
- empathy_os/redis_config.py +144 -58
- empathy_os/redis_memory.py +79 -77
- empathy_os/resilience/__init__.py +56 -0
- empathy_os/resilience/circuit_breaker.py +256 -0
- empathy_os/resilience/fallback.py +179 -0
- empathy_os/resilience/health.py +300 -0
- empathy_os/resilience/retry.py +209 -0
- empathy_os/resilience/timeout.py +135 -0
- empathy_os/routing/__init__.py +43 -0
- empathy_os/routing/chain_executor.py +433 -0
- empathy_os/routing/classifier.py +217 -0
- empathy_os/routing/smart_router.py +234 -0
- empathy_os/routing/wizard_registry.py +307 -0
- empathy_os/templates.py +19 -14
- empathy_os/trust/__init__.py +28 -0
- empathy_os/trust/circuit_breaker.py +579 -0
- empathy_os/trust_building.py +67 -58
- empathy_os/validation/__init__.py +19 -0
- empathy_os/validation/xml_validator.py +281 -0
- empathy_os/wizard_factory_cli.py +170 -0
- empathy_os/{workflows.py → workflow_commands.py} +131 -37
- empathy_os/workflows/__init__.py +360 -0
- empathy_os/workflows/base.py +1660 -0
- empathy_os/workflows/bug_predict.py +962 -0
- empathy_os/workflows/code_review.py +960 -0
- empathy_os/workflows/code_review_adapters.py +310 -0
- empathy_os/workflows/code_review_pipeline.py +720 -0
- empathy_os/workflows/config.py +600 -0
- empathy_os/workflows/dependency_check.py +648 -0
- empathy_os/workflows/document_gen.py +1069 -0
- empathy_os/workflows/documentation_orchestrator.py +1205 -0
- empathy_os/workflows/health_check.py +679 -0
- empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
- empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
- empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
- empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
- empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
- empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
- empathy_os/workflows/manage_documentation.py +804 -0
- empathy_os/workflows/new_sample_workflow1.py +146 -0
- empathy_os/workflows/new_sample_workflow1_README.md +150 -0
- empathy_os/workflows/perf_audit.py +687 -0
- empathy_os/workflows/pr_review.py +748 -0
- empathy_os/workflows/progress.py +445 -0
- empathy_os/workflows/progress_server.py +322 -0
- empathy_os/workflows/refactor_plan.py +693 -0
- empathy_os/workflows/release_prep.py +808 -0
- empathy_os/workflows/research_synthesis.py +404 -0
- empathy_os/workflows/secure_release.py +585 -0
- empathy_os/workflows/security_adapters.py +297 -0
- empathy_os/workflows/security_audit.py +1046 -0
- empathy_os/workflows/step_config.py +234 -0
- empathy_os/workflows/test5.py +125 -0
- empathy_os/workflows/test5_README.md +158 -0
- empathy_os/workflows/test_gen.py +1855 -0
- empathy_os/workflows/test_lifecycle.py +526 -0
- empathy_os/workflows/test_maintenance.py +626 -0
- empathy_os/workflows/test_maintenance_cli.py +590 -0
- empathy_os/workflows/test_maintenance_crew.py +821 -0
- empathy_os/workflows/xml_enhanced_crew.py +285 -0
- empathy_software_plugin/__init__.py +1 -2
- empathy_software_plugin/cli/__init__.py +120 -0
- empathy_software_plugin/cli/inspect.py +362 -0
- empathy_software_plugin/cli.py +49 -27
- empathy_software_plugin/plugin.py +4 -8
- empathy_software_plugin/wizards/__init__.py +42 -0
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
- empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
- empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
- empathy_software_plugin/wizards/base_wizard.py +288 -0
- empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
- empathy_software_plugin/wizards/code_review_wizard.py +606 -0
- empathy_software_plugin/wizards/debugging/__init__.py +50 -0
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
- empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
- empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
- empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
- empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
- empathy_software_plugin/wizards/debugging/verification.py +369 -0
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
- empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
- empathy_software_plugin/wizards/performance/__init__.py +9 -0
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
- empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
- empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
- empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
- empathy_software_plugin/wizards/security/__init__.py +32 -0
- empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
- empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
- empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
- empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
- empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
- empathy_software_plugin/wizards/testing/__init__.py +27 -0
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
- empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
- empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
- empathy_software_plugin/wizards/testing_wizard.py +274 -0
- hot_reload/README.md +473 -0
- hot_reload/__init__.py +62 -0
- hot_reload/config.py +84 -0
- hot_reload/integration.py +228 -0
- hot_reload/reloader.py +298 -0
- hot_reload/watcher.py +179 -0
- hot_reload/websocket.py +176 -0
- scaffolding/README.md +589 -0
- scaffolding/__init__.py +35 -0
- scaffolding/__main__.py +14 -0
- scaffolding/cli.py +240 -0
- test_generator/__init__.py +38 -0
- test_generator/__main__.py +14 -0
- test_generator/cli.py +226 -0
- test_generator/generator.py +325 -0
- test_generator/risk_analyzer.py +216 -0
- workflow_patterns/__init__.py +33 -0
- workflow_patterns/behavior.py +249 -0
- workflow_patterns/core.py +76 -0
- workflow_patterns/output.py +99 -0
- workflow_patterns/registry.py +255 -0
- workflow_patterns/structural.py +288 -0
- workflow_scaffolding/__init__.py +11 -0
- workflow_scaffolding/__main__.py +12 -0
- workflow_scaffolding/cli.py +206 -0
- workflow_scaffolding/generator.py +265 -0
- agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
- agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
- agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
- agents/compliance_anticipation_agent.py +0 -1427
- agents/epic_integration_wizard.py +0 -541
- agents/trust_building_behaviors.py +0 -891
- empathy_framework-2.4.0.dist-info/METADATA +0 -485
- empathy_framework-2.4.0.dist-info/RECORD +0 -102
- empathy_framework-2.4.0.dist-info/entry_points.txt +0 -6
- empathy_llm_toolkit/htmlcov/status.json +0 -1
- empathy_llm_toolkit/security/htmlcov/status.json +0 -1
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/WHEEL +0 -0
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Agent Monitoring for Distributed Memory Networks
|
|
1
|
+
"""Agent Monitoring for Distributed Memory Networks
|
|
3
2
|
|
|
4
3
|
Provides monitoring and metrics collection for multi-agent systems.
|
|
5
4
|
Tracks individual agent performance, pattern contributions, and
|
|
@@ -79,8 +78,7 @@ class TeamMetrics:
|
|
|
79
78
|
|
|
80
79
|
@property
|
|
81
80
|
def collaboration_efficiency(self) -> float:
|
|
82
|
-
"""
|
|
83
|
-
Measure of how effectively agents collaborate.
|
|
81
|
+
"""Measure of how effectively agents collaborate.
|
|
84
82
|
|
|
85
83
|
Higher values indicate more cross-agent pattern reuse,
|
|
86
84
|
meaning agents are learning from each other.
|
|
@@ -91,8 +89,7 @@ class TeamMetrics:
|
|
|
91
89
|
|
|
92
90
|
|
|
93
91
|
class AgentMonitor:
|
|
94
|
-
"""
|
|
95
|
-
Monitors and tracks metrics for multi-agent systems.
|
|
92
|
+
"""Monitors and tracks metrics for multi-agent systems.
|
|
96
93
|
|
|
97
94
|
Provides insights into:
|
|
98
95
|
- Individual agent performance
|
|
@@ -106,7 +103,7 @@ class AgentMonitor:
|
|
|
106
103
|
>>> # Record agent activity
|
|
107
104
|
>>> monitor.record_interaction("code_reviewer", response_time_ms=150.0)
|
|
108
105
|
>>> monitor.record_pattern_discovery("code_reviewer")
|
|
109
|
-
>>> monitor.record_pattern_use("
|
|
106
|
+
>>> monitor.record_pattern_use("test_gen", pattern_agent="code_reviewer", success=True)
|
|
110
107
|
>>>
|
|
111
108
|
>>> # Get individual stats
|
|
112
109
|
>>> stats = monitor.get_agent_stats("code_reviewer")
|
|
@@ -116,14 +113,15 @@ class AgentMonitor:
|
|
|
116
113
|
>>> # Get team stats
|
|
117
114
|
>>> team = monitor.get_team_stats()
|
|
118
115
|
>>> print(f"Collaboration efficiency: {team['collaboration_efficiency']:.0%}")
|
|
116
|
+
|
|
119
117
|
"""
|
|
120
118
|
|
|
121
119
|
def __init__(self, pattern_library: PatternLibrary | None = None):
|
|
122
|
-
"""
|
|
123
|
-
Initialize the AgentMonitor.
|
|
120
|
+
"""Initialize the AgentMonitor.
|
|
124
121
|
|
|
125
122
|
Args:
|
|
126
123
|
pattern_library: Optional pattern library to track for shared patterns
|
|
124
|
+
|
|
127
125
|
"""
|
|
128
126
|
self.agents: dict[str, AgentMetrics] = {}
|
|
129
127
|
self.pattern_library = pattern_library
|
|
@@ -139,12 +137,12 @@ class AgentMonitor:
|
|
|
139
137
|
agent_id: str,
|
|
140
138
|
response_time_ms: float = 0.0,
|
|
141
139
|
):
|
|
142
|
-
"""
|
|
143
|
-
Record an agent interaction.
|
|
140
|
+
"""Record an agent interaction.
|
|
144
141
|
|
|
145
142
|
Args:
|
|
146
143
|
agent_id: ID of the agent
|
|
147
144
|
response_time_ms: Response time in milliseconds
|
|
145
|
+
|
|
148
146
|
"""
|
|
149
147
|
agent = self._get_or_create_agent(agent_id)
|
|
150
148
|
agent.total_interactions += 1
|
|
@@ -160,12 +158,12 @@ class AgentMonitor:
|
|
|
160
158
|
)
|
|
161
159
|
|
|
162
160
|
def record_pattern_discovery(self, agent_id: str, pattern_id: str | None = None):
|
|
163
|
-
"""
|
|
164
|
-
Record that an agent discovered a new pattern.
|
|
161
|
+
"""Record that an agent discovered a new pattern.
|
|
165
162
|
|
|
166
163
|
Args:
|
|
167
164
|
agent_id: ID of the agent that discovered the pattern
|
|
168
165
|
pattern_id: Optional pattern ID for tracking
|
|
166
|
+
|
|
169
167
|
"""
|
|
170
168
|
agent = self._get_or_create_agent(agent_id)
|
|
171
169
|
agent.patterns_discovered += 1
|
|
@@ -178,14 +176,14 @@ class AgentMonitor:
|
|
|
178
176
|
pattern_agent: str | None = None,
|
|
179
177
|
success: bool = True,
|
|
180
178
|
):
|
|
181
|
-
"""
|
|
182
|
-
Record that an agent used a pattern.
|
|
179
|
+
"""Record that an agent used a pattern.
|
|
183
180
|
|
|
184
181
|
Args:
|
|
185
182
|
agent_id: ID of the agent using the pattern
|
|
186
183
|
pattern_id: ID of the pattern being used
|
|
187
184
|
pattern_agent: ID of the agent that contributed the pattern
|
|
188
185
|
success: Whether the pattern use was successful
|
|
186
|
+
|
|
189
187
|
"""
|
|
190
188
|
agent = self._get_or_create_agent(agent_id)
|
|
191
189
|
agent.patterns_used += 1
|
|
@@ -207,18 +205,18 @@ class AgentMonitor:
|
|
|
207
205
|
"cross_agent": is_cross_agent,
|
|
208
206
|
"success": success,
|
|
209
207
|
"timestamp": datetime.now(),
|
|
210
|
-
}
|
|
208
|
+
},
|
|
211
209
|
)
|
|
212
210
|
|
|
213
211
|
def get_agent_stats(self, agent_id: str) -> dict[str, Any]:
|
|
214
|
-
"""
|
|
215
|
-
Get statistics for a specific agent.
|
|
212
|
+
"""Get statistics for a specific agent.
|
|
216
213
|
|
|
217
214
|
Args:
|
|
218
215
|
agent_id: ID of the agent
|
|
219
216
|
|
|
220
217
|
Returns:
|
|
221
218
|
Dictionary with agent statistics
|
|
219
|
+
|
|
222
220
|
"""
|
|
223
221
|
agent = self.agents.get(agent_id)
|
|
224
222
|
|
|
@@ -252,11 +250,11 @@ class AgentMonitor:
|
|
|
252
250
|
}
|
|
253
251
|
|
|
254
252
|
def get_team_stats(self) -> dict[str, Any]:
|
|
255
|
-
"""
|
|
256
|
-
Get aggregated statistics for the entire agent team.
|
|
253
|
+
"""Get aggregated statistics for the entire agent team.
|
|
257
254
|
|
|
258
255
|
Returns:
|
|
259
256
|
Dictionary with team-wide statistics
|
|
257
|
+
|
|
260
258
|
"""
|
|
261
259
|
if not self.agents:
|
|
262
260
|
# Get shared patterns count from library even if no agents
|
|
@@ -319,39 +317,41 @@ class AgentMonitor:
|
|
|
319
317
|
}
|
|
320
318
|
|
|
321
319
|
def get_top_contributors(self, n: int = 5) -> list[dict[str, Any]]:
|
|
322
|
-
"""
|
|
323
|
-
Get the top pattern-contributing agents.
|
|
320
|
+
"""Get the top pattern-contributing agents.
|
|
324
321
|
|
|
325
322
|
Args:
|
|
326
323
|
n: Number of agents to return
|
|
327
324
|
|
|
328
325
|
Returns:
|
|
329
326
|
List of agent stats, sorted by patterns discovered
|
|
327
|
+
|
|
330
328
|
"""
|
|
331
329
|
sorted_agents = sorted(
|
|
332
|
-
self.agents.values(),
|
|
330
|
+
self.agents.values(),
|
|
331
|
+
key=lambda a: a.patterns_discovered,
|
|
332
|
+
reverse=True,
|
|
333
333
|
)
|
|
334
334
|
|
|
335
335
|
return [self.get_agent_stats(agent.agent_id) for agent in sorted_agents[:n]]
|
|
336
336
|
|
|
337
337
|
def get_alerts(self, limit: int = 100) -> list[dict[str, Any]]:
|
|
338
|
-
"""
|
|
339
|
-
Get recent alerts.
|
|
338
|
+
"""Get recent alerts.
|
|
340
339
|
|
|
341
340
|
Args:
|
|
342
341
|
limit: Maximum number of alerts to return
|
|
343
342
|
|
|
344
343
|
Returns:
|
|
345
344
|
List of alert dictionaries
|
|
345
|
+
|
|
346
346
|
"""
|
|
347
347
|
return self.alerts[-limit:]
|
|
348
348
|
|
|
349
349
|
def check_health(self) -> dict[str, Any]:
|
|
350
|
-
"""
|
|
351
|
-
Check overall system health.
|
|
350
|
+
"""Check overall system health.
|
|
352
351
|
|
|
353
352
|
Returns:
|
|
354
353
|
Health status dictionary
|
|
354
|
+
|
|
355
355
|
"""
|
|
356
356
|
team_stats = self.get_team_stats()
|
|
357
357
|
recent_alerts = [
|
|
@@ -400,7 +400,7 @@ class AgentMonitor:
|
|
|
400
400
|
"message": message,
|
|
401
401
|
"severity": severity,
|
|
402
402
|
"timestamp": datetime.now(),
|
|
403
|
-
}
|
|
403
|
+
},
|
|
404
404
|
)
|
|
405
405
|
|
|
406
406
|
# Keep alerts bounded
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"""Response caching for Empathy Framework workflows.
|
|
2
|
+
|
|
3
|
+
Provides hybrid hash + semantic similarity caching to reduce API costs by 70%.
|
|
4
|
+
|
|
5
|
+
Usage:
|
|
6
|
+
from empathy_os.cache import create_cache
|
|
7
|
+
|
|
8
|
+
# Auto-detect best cache (hybrid if deps available, hash-only otherwise)
|
|
9
|
+
cache = create_cache()
|
|
10
|
+
|
|
11
|
+
# Manual cache selection
|
|
12
|
+
from empathy_os.cache import HashOnlyCache, HybridCache
|
|
13
|
+
|
|
14
|
+
cache = HashOnlyCache() # Always available
|
|
15
|
+
cache = HybridCache() # Requires sentence-transformers
|
|
16
|
+
|
|
17
|
+
Copyright 2025 Smart-AI-Memory
|
|
18
|
+
Licensed under Fair Source License 0.9
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import logging
|
|
22
|
+
from typing import Optional
|
|
23
|
+
|
|
24
|
+
from .base import BaseCache, CacheEntry, CacheStats
|
|
25
|
+
from .hash_only import HashOnlyCache
|
|
26
|
+
|
|
27
|
+
logger = logging.getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
# Try to import HybridCache (requires optional dependencies)
|
|
30
|
+
try:
|
|
31
|
+
from .hybrid import HybridCache
|
|
32
|
+
|
|
33
|
+
HYBRID_AVAILABLE = True
|
|
34
|
+
except ImportError:
|
|
35
|
+
HYBRID_AVAILABLE = False
|
|
36
|
+
HybridCache = None # type: ignore
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def create_cache(
|
|
40
|
+
cache_type: str | None = None,
|
|
41
|
+
**kwargs,
|
|
42
|
+
) -> BaseCache:
|
|
43
|
+
"""Create appropriate cache based on available dependencies.
|
|
44
|
+
|
|
45
|
+
Auto-detects if sentence-transformers is available and creates
|
|
46
|
+
HybridCache if possible, otherwise falls back to HashOnlyCache.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
cache_type: Force specific cache type ("hash" | "hybrid" | None for auto).
|
|
50
|
+
**kwargs: Additional arguments passed to cache constructor.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
BaseCache instance (HybridCache or HashOnlyCache).
|
|
54
|
+
|
|
55
|
+
Example:
|
|
56
|
+
# Auto-detect (recommended)
|
|
57
|
+
cache = create_cache()
|
|
58
|
+
|
|
59
|
+
# Force hash-only
|
|
60
|
+
cache = create_cache(cache_type="hash")
|
|
61
|
+
|
|
62
|
+
# Force hybrid (raises ImportError if deps missing)
|
|
63
|
+
cache = create_cache(cache_type="hybrid")
|
|
64
|
+
|
|
65
|
+
"""
|
|
66
|
+
# Force hash-only
|
|
67
|
+
if cache_type == "hash":
|
|
68
|
+
logger.info("Using hash-only cache (explicit)")
|
|
69
|
+
return HashOnlyCache(**kwargs)
|
|
70
|
+
|
|
71
|
+
# Force hybrid
|
|
72
|
+
if cache_type == "hybrid":
|
|
73
|
+
if not HYBRID_AVAILABLE:
|
|
74
|
+
raise ImportError(
|
|
75
|
+
"HybridCache requires sentence-transformers. "
|
|
76
|
+
"Install with: pip install empathy-framework[cache]"
|
|
77
|
+
)
|
|
78
|
+
logger.info("Using hybrid cache (explicit)")
|
|
79
|
+
return HybridCache(**kwargs)
|
|
80
|
+
|
|
81
|
+
# Auto-detect (default)
|
|
82
|
+
if HYBRID_AVAILABLE:
|
|
83
|
+
logger.info("Using hybrid cache (auto-detected)")
|
|
84
|
+
return HybridCache(**kwargs)
|
|
85
|
+
else:
|
|
86
|
+
logger.info(
|
|
87
|
+
"Using hash-only cache (sentence-transformers not available). "
|
|
88
|
+
"For 70% cost savings, install with: pip install empathy-framework[cache]"
|
|
89
|
+
)
|
|
90
|
+
return HashOnlyCache(**kwargs)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def auto_setup_cache() -> None:
|
|
94
|
+
"""Auto-setup cache with one-time prompt if dependencies missing.
|
|
95
|
+
|
|
96
|
+
Called automatically by BaseWorkflow on first run.
|
|
97
|
+
Prompts user to install cache dependencies if not available.
|
|
98
|
+
|
|
99
|
+
"""
|
|
100
|
+
from .dependency_manager import DependencyManager
|
|
101
|
+
|
|
102
|
+
manager = DependencyManager()
|
|
103
|
+
|
|
104
|
+
if manager.should_prompt_cache_install():
|
|
105
|
+
manager.prompt_cache_install()
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
__all__ = [
|
|
109
|
+
"BaseCache",
|
|
110
|
+
"CacheEntry",
|
|
111
|
+
"CacheStats",
|
|
112
|
+
"HashOnlyCache",
|
|
113
|
+
"HybridCache",
|
|
114
|
+
"create_cache",
|
|
115
|
+
"auto_setup_cache",
|
|
116
|
+
"HYBRID_AVAILABLE",
|
|
117
|
+
]
|
empathy_os/cache/base.py
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"""Base cache interface for Empathy Framework response caching.
|
|
2
|
+
|
|
3
|
+
Copyright 2025 Smart-AI-Memory
|
|
4
|
+
Licensed under Fair Source License 0.9
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from abc import ABC, abstractmethod
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass
|
|
13
|
+
class CacheEntry:
|
|
14
|
+
"""Cached LLM response with metadata."""
|
|
15
|
+
|
|
16
|
+
key: str
|
|
17
|
+
response: Any
|
|
18
|
+
workflow: str
|
|
19
|
+
stage: str
|
|
20
|
+
model: str
|
|
21
|
+
prompt_hash: str
|
|
22
|
+
timestamp: float
|
|
23
|
+
ttl: int | None = None # Time-to-live in seconds
|
|
24
|
+
|
|
25
|
+
def is_expired(self, current_time: float) -> bool:
|
|
26
|
+
"""Check if entry has expired."""
|
|
27
|
+
if self.ttl is None:
|
|
28
|
+
return False
|
|
29
|
+
return (current_time - self.timestamp) > self.ttl
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass
|
|
33
|
+
class CacheStats:
|
|
34
|
+
"""Cache hit/miss statistics."""
|
|
35
|
+
|
|
36
|
+
hits: int = 0
|
|
37
|
+
misses: int = 0
|
|
38
|
+
evictions: int = 0
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
def total(self) -> int:
|
|
42
|
+
"""Total cache lookups."""
|
|
43
|
+
return self.hits + self.misses
|
|
44
|
+
|
|
45
|
+
@property
|
|
46
|
+
def hit_rate(self) -> float:
|
|
47
|
+
"""Cache hit rate percentage."""
|
|
48
|
+
if self.total == 0:
|
|
49
|
+
return 0.0
|
|
50
|
+
return (self.hits / self.total) * 100.0
|
|
51
|
+
|
|
52
|
+
def to_dict(self) -> dict[str, Any]:
|
|
53
|
+
"""Convert to dictionary for logging."""
|
|
54
|
+
return {
|
|
55
|
+
"hits": self.hits,
|
|
56
|
+
"misses": self.misses,
|
|
57
|
+
"evictions": self.evictions,
|
|
58
|
+
"total": self.total,
|
|
59
|
+
"hit_rate": round(self.hit_rate, 1),
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class BaseCache(ABC):
|
|
64
|
+
"""Abstract base class for LLM response caching."""
|
|
65
|
+
|
|
66
|
+
def __init__(self, max_size_mb: int = 500, default_ttl: int = 86400):
|
|
67
|
+
"""Initialize cache.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
max_size_mb: Maximum cache size in megabytes.
|
|
71
|
+
default_ttl: Default time-to-live in seconds (default: 24 hours).
|
|
72
|
+
|
|
73
|
+
"""
|
|
74
|
+
self.max_size_mb = max_size_mb
|
|
75
|
+
self.default_ttl = default_ttl
|
|
76
|
+
self.stats = CacheStats()
|
|
77
|
+
|
|
78
|
+
@abstractmethod
|
|
79
|
+
def get(
|
|
80
|
+
self,
|
|
81
|
+
workflow: str,
|
|
82
|
+
stage: str,
|
|
83
|
+
prompt: str,
|
|
84
|
+
model: str,
|
|
85
|
+
) -> Any | None:
|
|
86
|
+
"""Get cached response.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
workflow: Workflow name (e.g., "code-review").
|
|
90
|
+
stage: Stage name (e.g., "scan").
|
|
91
|
+
prompt: Prompt text.
|
|
92
|
+
model: Model identifier (e.g., "claude-3-5-sonnet-20241022").
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
Cached response if found, None otherwise.
|
|
96
|
+
|
|
97
|
+
"""
|
|
98
|
+
pass
|
|
99
|
+
|
|
100
|
+
@abstractmethod
|
|
101
|
+
def put(
|
|
102
|
+
self,
|
|
103
|
+
workflow: str,
|
|
104
|
+
stage: str,
|
|
105
|
+
prompt: str,
|
|
106
|
+
model: str,
|
|
107
|
+
response: Any,
|
|
108
|
+
ttl: int | None = None,
|
|
109
|
+
) -> None:
|
|
110
|
+
"""Store response in cache.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
workflow: Workflow name.
|
|
114
|
+
stage: Stage name.
|
|
115
|
+
prompt: Prompt text.
|
|
116
|
+
model: Model identifier.
|
|
117
|
+
response: LLM response to cache.
|
|
118
|
+
ttl: Optional custom TTL (uses default if None).
|
|
119
|
+
|
|
120
|
+
"""
|
|
121
|
+
pass
|
|
122
|
+
|
|
123
|
+
@abstractmethod
|
|
124
|
+
def clear(self) -> None:
|
|
125
|
+
"""Clear all cached entries."""
|
|
126
|
+
pass
|
|
127
|
+
|
|
128
|
+
@abstractmethod
|
|
129
|
+
def get_stats(self) -> CacheStats:
|
|
130
|
+
"""Get cache statistics.
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
CacheStats with hit/miss counts.
|
|
134
|
+
|
|
135
|
+
"""
|
|
136
|
+
pass
|
|
137
|
+
|
|
138
|
+
def _create_cache_key(
|
|
139
|
+
self,
|
|
140
|
+
workflow: str,
|
|
141
|
+
stage: str,
|
|
142
|
+
prompt: str,
|
|
143
|
+
model: str,
|
|
144
|
+
) -> str:
|
|
145
|
+
"""Create cache key from workflow, stage, prompt, and model.
|
|
146
|
+
|
|
147
|
+
Uses SHA256 hash of concatenated values.
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
workflow: Workflow name.
|
|
151
|
+
stage: Stage name.
|
|
152
|
+
prompt: Prompt text.
|
|
153
|
+
model: Model identifier.
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
Cache key (SHA256 hash).
|
|
157
|
+
|
|
158
|
+
"""
|
|
159
|
+
import hashlib
|
|
160
|
+
|
|
161
|
+
# Combine all inputs for cache key
|
|
162
|
+
key_parts = [workflow, stage, prompt, model]
|
|
163
|
+
key_string = "|".join(key_parts)
|
|
164
|
+
|
|
165
|
+
# SHA256 hash for consistent key length
|
|
166
|
+
return hashlib.sha256(key_string.encode()).hexdigest()
|