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
empathy_os/redis_memory.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Redis Short-Term Memory for Empathy Framework
|
|
1
|
+
"""Redis Short-Term Memory for Empathy Framework
|
|
3
2
|
|
|
4
3
|
Per EMPATHY_PHILOSOPHY.md v1.1.0:
|
|
5
4
|
- Implements fast, TTL-based working memory for agent coordination
|
|
@@ -25,25 +24,12 @@ except ImportError:
|
|
|
25
24
|
REDIS_AVAILABLE = False
|
|
26
25
|
|
|
27
26
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
Role-based access tiers per EMPATHY_PHILOSOPHY.md
|
|
31
|
-
|
|
32
|
-
Tier 1 - Observer: Read-only access to validated patterns
|
|
33
|
-
Tier 2 - Contributor: Can stage patterns for validation
|
|
34
|
-
Tier 3 - Validator: Can promote staged patterns to active
|
|
35
|
-
Tier 4 - Steward: Full access including deprecation and audit
|
|
36
|
-
"""
|
|
37
|
-
|
|
38
|
-
OBSERVER = 1
|
|
39
|
-
CONTRIBUTOR = 2
|
|
40
|
-
VALIDATOR = 3
|
|
41
|
-
STEWARD = 4
|
|
27
|
+
# Import AccessTier from the canonical location to avoid duplicate enums
|
|
28
|
+
from .memory.short_term import AccessTier
|
|
42
29
|
|
|
43
30
|
|
|
44
31
|
class TTLStrategy(Enum):
|
|
45
|
-
"""
|
|
46
|
-
TTL strategies for different memory types
|
|
32
|
+
"""TTL strategies for different memory types
|
|
47
33
|
|
|
48
34
|
Per EMPATHY_PHILOSOPHY.md Section 9.3:
|
|
49
35
|
- Working results: 1 hour
|
|
@@ -132,8 +118,7 @@ class StagedPattern:
|
|
|
132
118
|
|
|
133
119
|
@dataclass
|
|
134
120
|
class ConflictContext:
|
|
135
|
-
"""
|
|
136
|
-
Context for principled negotiation
|
|
121
|
+
"""Context for principled negotiation
|
|
137
122
|
|
|
138
123
|
Per Getting to Yes framework:
|
|
139
124
|
- Positions: What each party says they want
|
|
@@ -174,8 +159,7 @@ class ConflictContext:
|
|
|
174
159
|
|
|
175
160
|
|
|
176
161
|
class RedisShortTermMemory:
|
|
177
|
-
"""
|
|
178
|
-
Redis-backed short-term memory for agent coordination
|
|
162
|
+
"""Redis-backed short-term memory for agent coordination
|
|
179
163
|
|
|
180
164
|
Features:
|
|
181
165
|
- Fast read/write with automatic TTL expiration
|
|
@@ -189,6 +173,7 @@ class RedisShortTermMemory:
|
|
|
189
173
|
>>> creds = AgentCredentials("agent_1", AccessTier.CONTRIBUTOR)
|
|
190
174
|
>>> memory.stash("analysis_results", {"issues": 3}, creds)
|
|
191
175
|
>>> data = memory.retrieve("analysis_results", creds)
|
|
176
|
+
|
|
192
177
|
"""
|
|
193
178
|
|
|
194
179
|
# Key prefixes for namespacing
|
|
@@ -206,8 +191,7 @@ class RedisShortTermMemory:
|
|
|
206
191
|
password: str | None = None,
|
|
207
192
|
use_mock: bool = False,
|
|
208
193
|
):
|
|
209
|
-
"""
|
|
210
|
-
Initialize Redis connection
|
|
194
|
+
"""Initialize Redis connection
|
|
211
195
|
|
|
212
196
|
Args:
|
|
213
197
|
host: Redis host
|
|
@@ -215,6 +199,7 @@ class RedisShortTermMemory:
|
|
|
215
199
|
db: Redis database number
|
|
216
200
|
password: Redis password (optional)
|
|
217
201
|
use_mock: Use in-memory mock for testing
|
|
202
|
+
|
|
218
203
|
"""
|
|
219
204
|
self.use_mock = use_mock or not REDIS_AVAILABLE
|
|
220
205
|
|
|
@@ -236,10 +221,13 @@ class RedisShortTermMemory:
|
|
|
236
221
|
if key in self._mock_storage:
|
|
237
222
|
value, expires = self._mock_storage[key]
|
|
238
223
|
if expires is None or datetime.now().timestamp() < expires:
|
|
239
|
-
return value
|
|
224
|
+
return str(value) if value is not None else None
|
|
240
225
|
del self._mock_storage[key]
|
|
241
226
|
return None
|
|
242
|
-
|
|
227
|
+
if self._client is None:
|
|
228
|
+
return None
|
|
229
|
+
result = self._client.get(key)
|
|
230
|
+
return str(result) if result else None
|
|
243
231
|
|
|
244
232
|
def _set(self, key: str, value: str, ttl: int | None = None) -> bool:
|
|
245
233
|
"""Set value in Redis or mock"""
|
|
@@ -247,9 +235,13 @@ class RedisShortTermMemory:
|
|
|
247
235
|
expires = datetime.now().timestamp() + ttl if ttl else None
|
|
248
236
|
self._mock_storage[key] = (value, expires)
|
|
249
237
|
return True
|
|
238
|
+
if self._client is None:
|
|
239
|
+
return False
|
|
250
240
|
if ttl:
|
|
251
|
-
|
|
252
|
-
|
|
241
|
+
self._client.setex(key, ttl, value)
|
|
242
|
+
return True
|
|
243
|
+
result = self._client.set(key, value)
|
|
244
|
+
return bool(result)
|
|
253
245
|
|
|
254
246
|
def _delete(self, key: str) -> bool:
|
|
255
247
|
"""Delete key from Redis or mock"""
|
|
@@ -258,6 +250,8 @@ class RedisShortTermMemory:
|
|
|
258
250
|
del self._mock_storage[key]
|
|
259
251
|
return True
|
|
260
252
|
return False
|
|
253
|
+
if self._client is None:
|
|
254
|
+
return False
|
|
261
255
|
return self._client.delete(key) > 0
|
|
262
256
|
|
|
263
257
|
def _keys(self, pattern: str) -> list[str]:
|
|
@@ -266,7 +260,10 @@ class RedisShortTermMemory:
|
|
|
266
260
|
import fnmatch
|
|
267
261
|
|
|
268
262
|
return [k for k in self._mock_storage.keys() if fnmatch.fnmatch(k, pattern)]
|
|
269
|
-
|
|
263
|
+
if self._client is None:
|
|
264
|
+
return []
|
|
265
|
+
keys = self._client.keys(pattern)
|
|
266
|
+
return [k.decode() if isinstance(k, bytes) else str(k) for k in keys]
|
|
270
267
|
|
|
271
268
|
# === Working Memory (Stash/Retrieve) ===
|
|
272
269
|
|
|
@@ -277,8 +274,7 @@ class RedisShortTermMemory:
|
|
|
277
274
|
credentials: AgentCredentials,
|
|
278
275
|
ttl: TTLStrategy = TTLStrategy.WORKING_RESULTS,
|
|
279
276
|
) -> bool:
|
|
280
|
-
"""
|
|
281
|
-
Stash data in short-term memory
|
|
277
|
+
"""Stash data in short-term memory
|
|
282
278
|
|
|
283
279
|
Args:
|
|
284
280
|
key: Unique key for the data
|
|
@@ -291,11 +287,12 @@ class RedisShortTermMemory:
|
|
|
291
287
|
|
|
292
288
|
Example:
|
|
293
289
|
>>> memory.stash("analysis_v1", {"findings": [...]}, creds)
|
|
290
|
+
|
|
294
291
|
"""
|
|
295
292
|
if not credentials.can_stage():
|
|
296
293
|
raise PermissionError(
|
|
297
294
|
f"Agent {credentials.agent_id} (Tier {credentials.tier.name}) "
|
|
298
|
-
"cannot write to memory. Requires CONTRIBUTOR or higher."
|
|
295
|
+
"cannot write to memory. Requires CONTRIBUTOR or higher.",
|
|
299
296
|
)
|
|
300
297
|
|
|
301
298
|
full_key = f"{self.PREFIX_WORKING}{credentials.agent_id}:{key}"
|
|
@@ -312,8 +309,7 @@ class RedisShortTermMemory:
|
|
|
312
309
|
credentials: AgentCredentials,
|
|
313
310
|
agent_id: str | None = None,
|
|
314
311
|
) -> Any | None:
|
|
315
|
-
"""
|
|
316
|
-
Retrieve data from short-term memory
|
|
312
|
+
"""Retrieve data from short-term memory
|
|
317
313
|
|
|
318
314
|
Args:
|
|
319
315
|
key: Key to retrieve
|
|
@@ -325,6 +321,7 @@ class RedisShortTermMemory:
|
|
|
325
321
|
|
|
326
322
|
Example:
|
|
327
323
|
>>> data = memory.retrieve("analysis_v1", creds)
|
|
324
|
+
|
|
328
325
|
"""
|
|
329
326
|
owner = agent_id or credentials.agent_id
|
|
330
327
|
full_key = f"{self.PREFIX_WORKING}{owner}:{key}"
|
|
@@ -337,14 +334,14 @@ class RedisShortTermMemory:
|
|
|
337
334
|
return payload.get("data")
|
|
338
335
|
|
|
339
336
|
def clear_working_memory(self, credentials: AgentCredentials) -> int:
|
|
340
|
-
"""
|
|
341
|
-
Clear all working memory for an agent
|
|
337
|
+
"""Clear all working memory for an agent
|
|
342
338
|
|
|
343
339
|
Args:
|
|
344
340
|
credentials: Agent credentials (must own the memory or be Steward)
|
|
345
341
|
|
|
346
342
|
Returns:
|
|
347
343
|
Number of keys deleted
|
|
344
|
+
|
|
348
345
|
"""
|
|
349
346
|
pattern = f"{self.PREFIX_WORKING}{credentials.agent_id}:*"
|
|
350
347
|
keys = self._keys(pattern)
|
|
@@ -361,8 +358,7 @@ class RedisShortTermMemory:
|
|
|
361
358
|
pattern: StagedPattern,
|
|
362
359
|
credentials: AgentCredentials,
|
|
363
360
|
) -> bool:
|
|
364
|
-
"""
|
|
365
|
-
Stage a pattern for validation
|
|
361
|
+
"""Stage a pattern for validation
|
|
366
362
|
|
|
367
363
|
Per EMPATHY_PHILOSOPHY.md: Patterns must be staged before
|
|
368
364
|
being promoted to the active library.
|
|
@@ -373,11 +369,12 @@ class RedisShortTermMemory:
|
|
|
373
369
|
|
|
374
370
|
Returns:
|
|
375
371
|
True if staged successfully
|
|
372
|
+
|
|
376
373
|
"""
|
|
377
374
|
if not credentials.can_stage():
|
|
378
375
|
raise PermissionError(
|
|
379
376
|
f"Agent {credentials.agent_id} cannot stage patterns. "
|
|
380
|
-
"Requires CONTRIBUTOR tier or higher."
|
|
377
|
+
"Requires CONTRIBUTOR tier or higher.",
|
|
381
378
|
)
|
|
382
379
|
|
|
383
380
|
key = f"{self.PREFIX_STAGED}{pattern.pattern_id}"
|
|
@@ -392,8 +389,7 @@ class RedisShortTermMemory:
|
|
|
392
389
|
pattern_id: str,
|
|
393
390
|
credentials: AgentCredentials,
|
|
394
391
|
) -> StagedPattern | None:
|
|
395
|
-
"""
|
|
396
|
-
Retrieve a staged pattern
|
|
392
|
+
"""Retrieve a staged pattern
|
|
397
393
|
|
|
398
394
|
Args:
|
|
399
395
|
pattern_id: Pattern ID
|
|
@@ -401,6 +397,7 @@ class RedisShortTermMemory:
|
|
|
401
397
|
|
|
402
398
|
Returns:
|
|
403
399
|
StagedPattern or None
|
|
400
|
+
|
|
404
401
|
"""
|
|
405
402
|
key = f"{self.PREFIX_STAGED}{pattern_id}"
|
|
406
403
|
raw = self._get(key)
|
|
@@ -414,14 +411,14 @@ class RedisShortTermMemory:
|
|
|
414
411
|
self,
|
|
415
412
|
credentials: AgentCredentials,
|
|
416
413
|
) -> list[StagedPattern]:
|
|
417
|
-
"""
|
|
418
|
-
List all staged patterns awaiting validation
|
|
414
|
+
"""List all staged patterns awaiting validation
|
|
419
415
|
|
|
420
416
|
Args:
|
|
421
417
|
credentials: Any tier can read
|
|
422
418
|
|
|
423
419
|
Returns:
|
|
424
420
|
List of staged patterns
|
|
421
|
+
|
|
425
422
|
"""
|
|
426
423
|
pattern = f"{self.PREFIX_STAGED}*"
|
|
427
424
|
keys = self._keys(pattern)
|
|
@@ -439,8 +436,7 @@ class RedisShortTermMemory:
|
|
|
439
436
|
pattern_id: str,
|
|
440
437
|
credentials: AgentCredentials,
|
|
441
438
|
) -> StagedPattern | None:
|
|
442
|
-
"""
|
|
443
|
-
Promote staged pattern (remove from staging for library add)
|
|
439
|
+
"""Promote staged pattern (remove from staging for library add)
|
|
444
440
|
|
|
445
441
|
Args:
|
|
446
442
|
pattern_id: Pattern to promote
|
|
@@ -448,11 +444,12 @@ class RedisShortTermMemory:
|
|
|
448
444
|
|
|
449
445
|
Returns:
|
|
450
446
|
The promoted pattern (for adding to PatternLibrary)
|
|
447
|
+
|
|
451
448
|
"""
|
|
452
449
|
if not credentials.can_validate():
|
|
453
450
|
raise PermissionError(
|
|
454
451
|
f"Agent {credentials.agent_id} cannot promote patterns. "
|
|
455
|
-
"Requires VALIDATOR tier or higher."
|
|
452
|
+
"Requires VALIDATOR tier or higher.",
|
|
456
453
|
)
|
|
457
454
|
|
|
458
455
|
pattern = self.get_staged_pattern(pattern_id, credentials)
|
|
@@ -467,8 +464,7 @@ class RedisShortTermMemory:
|
|
|
467
464
|
credentials: AgentCredentials,
|
|
468
465
|
reason: str = "",
|
|
469
466
|
) -> bool:
|
|
470
|
-
"""
|
|
471
|
-
Reject a staged pattern
|
|
467
|
+
"""Reject a staged pattern
|
|
472
468
|
|
|
473
469
|
Args:
|
|
474
470
|
pattern_id: Pattern to reject
|
|
@@ -477,11 +473,12 @@ class RedisShortTermMemory:
|
|
|
477
473
|
|
|
478
474
|
Returns:
|
|
479
475
|
True if rejected
|
|
476
|
+
|
|
480
477
|
"""
|
|
481
478
|
if not credentials.can_validate():
|
|
482
479
|
raise PermissionError(
|
|
483
480
|
f"Agent {credentials.agent_id} cannot reject patterns. "
|
|
484
|
-
"Requires VALIDATOR tier or higher."
|
|
481
|
+
"Requires VALIDATOR tier or higher.",
|
|
485
482
|
)
|
|
486
483
|
|
|
487
484
|
key = f"{self.PREFIX_STAGED}{pattern_id}"
|
|
@@ -497,8 +494,7 @@ class RedisShortTermMemory:
|
|
|
497
494
|
credentials: AgentCredentials,
|
|
498
495
|
batna: str | None = None,
|
|
499
496
|
) -> ConflictContext:
|
|
500
|
-
"""
|
|
501
|
-
Create context for principled negotiation
|
|
497
|
+
"""Create context for principled negotiation
|
|
502
498
|
|
|
503
499
|
Per Getting to Yes framework:
|
|
504
500
|
- Separate positions from interests
|
|
@@ -513,11 +509,12 @@ class RedisShortTermMemory:
|
|
|
513
509
|
|
|
514
510
|
Returns:
|
|
515
511
|
ConflictContext for resolution
|
|
512
|
+
|
|
516
513
|
"""
|
|
517
514
|
if not credentials.can_stage():
|
|
518
515
|
raise PermissionError(
|
|
519
516
|
f"Agent {credentials.agent_id} cannot create conflict context. "
|
|
520
|
-
"Requires CONTRIBUTOR tier or higher."
|
|
517
|
+
"Requires CONTRIBUTOR tier or higher.",
|
|
521
518
|
)
|
|
522
519
|
|
|
523
520
|
context = ConflictContext(
|
|
@@ -541,8 +538,7 @@ class RedisShortTermMemory:
|
|
|
541
538
|
conflict_id: str,
|
|
542
539
|
credentials: AgentCredentials,
|
|
543
540
|
) -> ConflictContext | None:
|
|
544
|
-
"""
|
|
545
|
-
Retrieve conflict context
|
|
541
|
+
"""Retrieve conflict context
|
|
546
542
|
|
|
547
543
|
Args:
|
|
548
544
|
conflict_id: Conflict identifier
|
|
@@ -550,6 +546,7 @@ class RedisShortTermMemory:
|
|
|
550
546
|
|
|
551
547
|
Returns:
|
|
552
548
|
ConflictContext or None
|
|
549
|
+
|
|
553
550
|
"""
|
|
554
551
|
key = f"{self.PREFIX_CONFLICT}{conflict_id}"
|
|
555
552
|
raw = self._get(key)
|
|
@@ -565,8 +562,7 @@ class RedisShortTermMemory:
|
|
|
565
562
|
resolution: str,
|
|
566
563
|
credentials: AgentCredentials,
|
|
567
564
|
) -> bool:
|
|
568
|
-
"""
|
|
569
|
-
Mark conflict as resolved
|
|
565
|
+
"""Mark conflict as resolved
|
|
570
566
|
|
|
571
567
|
Args:
|
|
572
568
|
conflict_id: Conflict to resolve
|
|
@@ -575,11 +571,12 @@ class RedisShortTermMemory:
|
|
|
575
571
|
|
|
576
572
|
Returns:
|
|
577
573
|
True if resolved
|
|
574
|
+
|
|
578
575
|
"""
|
|
579
576
|
if not credentials.can_validate():
|
|
580
577
|
raise PermissionError(
|
|
581
578
|
f"Agent {credentials.agent_id} cannot resolve conflicts. "
|
|
582
|
-
"Requires VALIDATOR tier or higher."
|
|
579
|
+
"Requires VALIDATOR tier or higher.",
|
|
583
580
|
)
|
|
584
581
|
|
|
585
582
|
context = self.get_conflict_context(conflict_id, credentials)
|
|
@@ -603,8 +600,7 @@ class RedisShortTermMemory:
|
|
|
603
600
|
credentials: AgentCredentials,
|
|
604
601
|
target_agent: str | None = None,
|
|
605
602
|
) -> bool:
|
|
606
|
-
"""
|
|
607
|
-
Send coordination signal to other agents
|
|
603
|
+
"""Send coordination signal to other agents
|
|
608
604
|
|
|
609
605
|
Args:
|
|
610
606
|
signal_type: Type of signal (e.g., "ready", "blocking", "complete")
|
|
@@ -614,11 +610,12 @@ class RedisShortTermMemory:
|
|
|
614
610
|
|
|
615
611
|
Returns:
|
|
616
612
|
True if sent
|
|
613
|
+
|
|
617
614
|
"""
|
|
618
615
|
if not credentials.can_stage():
|
|
619
616
|
raise PermissionError(
|
|
620
617
|
f"Agent {credentials.agent_id} cannot send signals. "
|
|
621
|
-
"Requires CONTRIBUTOR tier or higher."
|
|
618
|
+
"Requires CONTRIBUTOR tier or higher.",
|
|
622
619
|
)
|
|
623
620
|
|
|
624
621
|
target = target_agent or "broadcast"
|
|
@@ -637,8 +634,7 @@ class RedisShortTermMemory:
|
|
|
637
634
|
credentials: AgentCredentials,
|
|
638
635
|
signal_type: str | None = None,
|
|
639
636
|
) -> list[dict]:
|
|
640
|
-
"""
|
|
641
|
-
Receive coordination signals
|
|
637
|
+
"""Receive coordination signals
|
|
642
638
|
|
|
643
639
|
Args:
|
|
644
640
|
credentials: Agent receiving signals
|
|
@@ -646,6 +642,7 @@ class RedisShortTermMemory:
|
|
|
646
642
|
|
|
647
643
|
Returns:
|
|
648
644
|
List of signals
|
|
645
|
+
|
|
649
646
|
"""
|
|
650
647
|
if signal_type:
|
|
651
648
|
pattern = f"{self.PREFIX_COORDINATION}{signal_type}:*:{credentials.agent_id}"
|
|
@@ -673,8 +670,7 @@ class RedisShortTermMemory:
|
|
|
673
670
|
credentials: AgentCredentials,
|
|
674
671
|
metadata: dict | None = None,
|
|
675
672
|
) -> bool:
|
|
676
|
-
"""
|
|
677
|
-
Create a collaboration session
|
|
673
|
+
"""Create a collaboration session
|
|
678
674
|
|
|
679
675
|
Args:
|
|
680
676
|
session_id: Unique session identifier
|
|
@@ -683,6 +679,7 @@ class RedisShortTermMemory:
|
|
|
683
679
|
|
|
684
680
|
Returns:
|
|
685
681
|
True if created
|
|
682
|
+
|
|
686
683
|
"""
|
|
687
684
|
key = f"{self.PREFIX_SESSION}{session_id}"
|
|
688
685
|
payload = {
|
|
@@ -699,8 +696,7 @@ class RedisShortTermMemory:
|
|
|
699
696
|
session_id: str,
|
|
700
697
|
credentials: AgentCredentials,
|
|
701
698
|
) -> bool:
|
|
702
|
-
"""
|
|
703
|
-
Join an existing session
|
|
699
|
+
"""Join an existing session
|
|
704
700
|
|
|
705
701
|
Args:
|
|
706
702
|
session_id: Session to join
|
|
@@ -708,6 +704,7 @@ class RedisShortTermMemory:
|
|
|
708
704
|
|
|
709
705
|
Returns:
|
|
710
706
|
True if joined
|
|
707
|
+
|
|
711
708
|
"""
|
|
712
709
|
key = f"{self.PREFIX_SESSION}{session_id}"
|
|
713
710
|
raw = self._get(key)
|
|
@@ -726,8 +723,7 @@ class RedisShortTermMemory:
|
|
|
726
723
|
session_id: str,
|
|
727
724
|
credentials: AgentCredentials,
|
|
728
725
|
) -> dict | None:
|
|
729
|
-
"""
|
|
730
|
-
Get session information
|
|
726
|
+
"""Get session information
|
|
731
727
|
|
|
732
728
|
Args:
|
|
733
729
|
session_id: Session identifier
|
|
@@ -735,6 +731,7 @@ class RedisShortTermMemory:
|
|
|
735
731
|
|
|
736
732
|
Returns:
|
|
737
733
|
Session data or None
|
|
734
|
+
|
|
738
735
|
"""
|
|
739
736
|
key = f"{self.PREFIX_SESSION}{session_id}"
|
|
740
737
|
raw = self._get(key)
|
|
@@ -742,46 +739,51 @@ class RedisShortTermMemory:
|
|
|
742
739
|
if raw is None:
|
|
743
740
|
return None
|
|
744
741
|
|
|
745
|
-
|
|
742
|
+
result: dict = json.loads(raw)
|
|
743
|
+
return result
|
|
746
744
|
|
|
747
745
|
# === Health Check ===
|
|
748
746
|
|
|
749
747
|
def ping(self) -> bool:
|
|
750
|
-
"""
|
|
751
|
-
Check Redis connection health
|
|
748
|
+
"""Check Redis connection health
|
|
752
749
|
|
|
753
750
|
Returns:
|
|
754
751
|
True if connected and responsive
|
|
752
|
+
|
|
755
753
|
"""
|
|
756
754
|
if self.use_mock:
|
|
757
755
|
return True
|
|
756
|
+
if self._client is None:
|
|
757
|
+
return False
|
|
758
758
|
try:
|
|
759
|
-
return self._client.ping()
|
|
759
|
+
return bool(self._client.ping())
|
|
760
760
|
except Exception:
|
|
761
761
|
return False
|
|
762
762
|
|
|
763
763
|
def get_stats(self) -> dict:
|
|
764
|
-
"""
|
|
765
|
-
Get memory statistics
|
|
764
|
+
"""Get memory statistics
|
|
766
765
|
|
|
767
766
|
Returns:
|
|
768
767
|
Dict with memory stats
|
|
768
|
+
|
|
769
769
|
"""
|
|
770
770
|
if self.use_mock:
|
|
771
771
|
return {
|
|
772
772
|
"mode": "mock",
|
|
773
773
|
"total_keys": len(self._mock_storage),
|
|
774
774
|
"working_keys": len(
|
|
775
|
-
[k for k in self._mock_storage if k.startswith(self.PREFIX_WORKING)]
|
|
775
|
+
[k for k in self._mock_storage if k.startswith(self.PREFIX_WORKING)],
|
|
776
776
|
),
|
|
777
777
|
"staged_keys": len(
|
|
778
|
-
[k for k in self._mock_storage if k.startswith(self.PREFIX_STAGED)]
|
|
778
|
+
[k for k in self._mock_storage if k.startswith(self.PREFIX_STAGED)],
|
|
779
779
|
),
|
|
780
780
|
"conflict_keys": len(
|
|
781
|
-
[k for k in self._mock_storage if k.startswith(self.PREFIX_CONFLICT)]
|
|
781
|
+
[k for k in self._mock_storage if k.startswith(self.PREFIX_CONFLICT)],
|
|
782
782
|
),
|
|
783
783
|
}
|
|
784
784
|
|
|
785
|
+
if self._client is None:
|
|
786
|
+
return {"mode": "disconnected", "error": "No Redis client"}
|
|
785
787
|
info = self._client.info("memory")
|
|
786
788
|
return {
|
|
787
789
|
"mode": "redis",
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""Empathy Framework Resilience Module
|
|
2
|
+
|
|
3
|
+
Provides reliability patterns for fault-tolerant wizard operations.
|
|
4
|
+
|
|
5
|
+
Usage:
|
|
6
|
+
from empathy_os.resilience import retry, circuit_breaker, timeout, fallback
|
|
7
|
+
|
|
8
|
+
@retry(max_attempts=3, backoff_factor=2.0)
|
|
9
|
+
async def call_llm(prompt: str) -> str:
|
|
10
|
+
...
|
|
11
|
+
|
|
12
|
+
@circuit_breaker(failure_threshold=5, reset_timeout=60)
|
|
13
|
+
async def external_api_call():
|
|
14
|
+
...
|
|
15
|
+
|
|
16
|
+
Copyright 2025 Smart AI Memory, LLC
|
|
17
|
+
Licensed under Fair Source 0.9
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from .circuit_breaker import (
|
|
21
|
+
CircuitBreaker,
|
|
22
|
+
CircuitOpenError,
|
|
23
|
+
CircuitState,
|
|
24
|
+
circuit_breaker,
|
|
25
|
+
get_circuit_breaker,
|
|
26
|
+
)
|
|
27
|
+
from .fallback import Fallback, fallback, with_fallback
|
|
28
|
+
from .health import HealthCheck, HealthStatus, SystemHealth
|
|
29
|
+
from .retry import RetryConfig, retry, retry_with_backoff
|
|
30
|
+
from .timeout import TimeoutError as ResilienceTimeoutError
|
|
31
|
+
from .timeout import timeout, with_timeout
|
|
32
|
+
|
|
33
|
+
__all__ = [
|
|
34
|
+
"CircuitBreaker",
|
|
35
|
+
"CircuitOpenError",
|
|
36
|
+
"CircuitState",
|
|
37
|
+
"Fallback",
|
|
38
|
+
# Health
|
|
39
|
+
"HealthCheck",
|
|
40
|
+
"HealthStatus",
|
|
41
|
+
"ResilienceTimeoutError",
|
|
42
|
+
"RetryConfig",
|
|
43
|
+
"SystemHealth",
|
|
44
|
+
# Circuit Breaker
|
|
45
|
+
"circuit_breaker",
|
|
46
|
+
# Fallback
|
|
47
|
+
"fallback",
|
|
48
|
+
"get_circuit_breaker",
|
|
49
|
+
# Retry
|
|
50
|
+
"retry",
|
|
51
|
+
"retry_with_backoff",
|
|
52
|
+
# Timeout
|
|
53
|
+
"timeout",
|
|
54
|
+
"with_fallback",
|
|
55
|
+
"with_timeout",
|
|
56
|
+
]
|