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_config.py
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Redis Configuration for Empathy Framework
|
|
1
|
+
"""Redis Configuration for Empathy Framework
|
|
3
2
|
|
|
4
3
|
Handles connection to Redis from environment variables.
|
|
5
|
-
Supports Railway, redis.com, local Docker, or mock mode.
|
|
4
|
+
Supports Railway, redis.com, local Docker, managed Redis, or mock mode.
|
|
6
5
|
|
|
7
6
|
Environment Variables:
|
|
8
7
|
REDIS_URL: Full Redis URL (redis://user:pass@host:port)
|
|
@@ -12,8 +11,29 @@ Environment Variables:
|
|
|
12
11
|
REDIS_DB: Redis database number (default: 0)
|
|
13
12
|
EMPATHY_REDIS_MOCK: Set to "true" to use mock mode
|
|
14
13
|
|
|
14
|
+
# SSL/TLS (for managed Redis services)
|
|
15
|
+
REDIS_SSL: Set to "true" to enable SSL
|
|
16
|
+
REDIS_SSL_CERT_REQS: Certificate requirement ("required", "optional", "none")
|
|
17
|
+
REDIS_SSL_CA_CERTS: Path to CA certificate file
|
|
18
|
+
REDIS_SSL_CERTFILE: Path to client certificate
|
|
19
|
+
REDIS_SSL_KEYFILE: Path to client key
|
|
20
|
+
|
|
21
|
+
# Connection settings
|
|
22
|
+
REDIS_SOCKET_TIMEOUT: Socket timeout in seconds (default: 5.0)
|
|
23
|
+
REDIS_MAX_CONNECTIONS: Connection pool size (default: 10)
|
|
24
|
+
|
|
25
|
+
# Retry settings
|
|
26
|
+
REDIS_RETRY_MAX_ATTEMPTS: Max retry attempts (default: 3)
|
|
27
|
+
REDIS_RETRY_BASE_DELAY: Base retry delay in seconds (default: 0.1)
|
|
28
|
+
REDIS_RETRY_MAX_DELAY: Max retry delay in seconds (default: 2.0)
|
|
29
|
+
|
|
30
|
+
# Sentinel (for high availability)
|
|
31
|
+
REDIS_SENTINEL_HOSTS: Comma-separated host:port pairs
|
|
32
|
+
REDIS_SENTINEL_MASTER: Sentinel master name
|
|
33
|
+
|
|
15
34
|
Railway Auto-Detection:
|
|
16
35
|
When deployed on Railway, REDIS_URL is automatically set.
|
|
36
|
+
For Railway Redis with SSL, the URL starts with "rediss://"
|
|
17
37
|
|
|
18
38
|
Usage:
|
|
19
39
|
from empathy_os.redis_config import get_redis_memory
|
|
@@ -21,8 +41,13 @@ Usage:
|
|
|
21
41
|
# Automatically uses environment variables
|
|
22
42
|
memory = get_redis_memory()
|
|
23
43
|
|
|
24
|
-
# Or with explicit URL
|
|
25
|
-
memory = get_redis_memory(url="
|
|
44
|
+
# Or with explicit URL (SSL auto-detected from rediss://)
|
|
45
|
+
memory = get_redis_memory(url="rediss://user:pass@managed-redis.com:6379")
|
|
46
|
+
|
|
47
|
+
# Or with explicit config
|
|
48
|
+
from empathy_os.memory.short_term import RedisConfig
|
|
49
|
+
config = RedisConfig(host="localhost", ssl=True)
|
|
50
|
+
memory = get_redis_memory(config=config)
|
|
26
51
|
|
|
27
52
|
Copyright 2025 Smart AI Memory, LLC
|
|
28
53
|
Licensed under Fair Source 0.9
|
|
@@ -31,72 +56,126 @@ Licensed under Fair Source 0.9
|
|
|
31
56
|
import os
|
|
32
57
|
from urllib.parse import urlparse
|
|
33
58
|
|
|
34
|
-
from .
|
|
59
|
+
from .memory.short_term import RedisConfig, RedisShortTermMemory
|
|
35
60
|
|
|
36
61
|
|
|
37
62
|
def parse_redis_url(url: str) -> dict:
|
|
38
|
-
"""
|
|
39
|
-
|
|
63
|
+
"""Parse Redis URL into connection parameters.
|
|
64
|
+
|
|
65
|
+
Supports:
|
|
66
|
+
- redis://user:pass@host:port/db (standard)
|
|
67
|
+
- rediss://user:pass@host:port/db (SSL enabled)
|
|
40
68
|
|
|
41
69
|
Args:
|
|
42
|
-
url: Redis URL (redis://
|
|
70
|
+
url: Redis URL (redis:// or rediss://)
|
|
43
71
|
|
|
44
72
|
Returns:
|
|
45
|
-
Dict with host, port, password, db
|
|
73
|
+
Dict with host, port, password, db, ssl
|
|
74
|
+
|
|
46
75
|
"""
|
|
47
76
|
parsed = urlparse(url)
|
|
48
77
|
|
|
78
|
+
# Detect SSL from scheme
|
|
79
|
+
ssl = parsed.scheme == "rediss"
|
|
80
|
+
|
|
49
81
|
return {
|
|
50
82
|
"host": parsed.hostname or "localhost",
|
|
51
83
|
"port": parsed.port or 6379,
|
|
52
84
|
"password": parsed.password,
|
|
53
85
|
"db": int(parsed.path.lstrip("/") or 0) if parsed.path else 0,
|
|
86
|
+
"ssl": ssl,
|
|
54
87
|
}
|
|
55
88
|
|
|
56
89
|
|
|
57
|
-
def get_redis_config() ->
|
|
58
|
-
"""
|
|
59
|
-
Get Redis configuration from environment variables.
|
|
90
|
+
def get_redis_config() -> RedisConfig:
|
|
91
|
+
"""Get Redis configuration from environment variables.
|
|
60
92
|
|
|
61
93
|
Priority:
|
|
62
|
-
1. REDIS_URL (full URL, used by Railway)
|
|
94
|
+
1. REDIS_URL (full URL, used by Railway/Heroku/managed services)
|
|
63
95
|
2. Individual env vars (REDIS_HOST, REDIS_PORT, etc.)
|
|
64
96
|
3. Defaults (localhost:6379)
|
|
65
97
|
|
|
66
98
|
Returns:
|
|
67
|
-
|
|
99
|
+
RedisConfig with all connection parameters
|
|
100
|
+
|
|
68
101
|
"""
|
|
69
102
|
# Check for mock mode
|
|
70
103
|
if os.getenv("EMPATHY_REDIS_MOCK", "").lower() == "true":
|
|
71
|
-
return
|
|
104
|
+
return RedisConfig(use_mock=True)
|
|
72
105
|
|
|
73
|
-
# Check for full URL (Railway, Heroku,
|
|
106
|
+
# Check for full URL (Railway, Heroku, managed services)
|
|
74
107
|
redis_url = os.getenv("REDIS_URL") or os.getenv("REDIS_PRIVATE_URL")
|
|
75
108
|
if redis_url:
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
109
|
+
url_config = parse_redis_url(redis_url)
|
|
110
|
+
return RedisConfig(
|
|
111
|
+
host=url_config["host"],
|
|
112
|
+
port=url_config["port"],
|
|
113
|
+
password=url_config["password"],
|
|
114
|
+
db=url_config["db"],
|
|
115
|
+
ssl=url_config.get("ssl", False),
|
|
116
|
+
use_mock=False,
|
|
117
|
+
# Apply additional env var overrides
|
|
118
|
+
socket_timeout=float(os.getenv("REDIS_SOCKET_TIMEOUT", "5.0")),
|
|
119
|
+
max_connections=int(os.getenv("REDIS_MAX_CONNECTIONS", "10")),
|
|
120
|
+
retry_max_attempts=int(os.getenv("REDIS_RETRY_MAX_ATTEMPTS", "3")),
|
|
121
|
+
retry_base_delay=float(os.getenv("REDIS_RETRY_BASE_DELAY", "0.1")),
|
|
122
|
+
retry_max_delay=float(os.getenv("REDIS_RETRY_MAX_DELAY", "2.0")),
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
# Build config from individual env vars
|
|
126
|
+
return RedisConfig(
|
|
127
|
+
host=os.getenv("REDIS_HOST", "localhost"),
|
|
128
|
+
port=int(os.getenv("REDIS_PORT", "6379")),
|
|
129
|
+
password=os.getenv("REDIS_PASSWORD"),
|
|
130
|
+
db=int(os.getenv("REDIS_DB", "0")),
|
|
131
|
+
use_mock=False,
|
|
132
|
+
# SSL settings
|
|
133
|
+
ssl=os.getenv("REDIS_SSL", "").lower() == "true",
|
|
134
|
+
ssl_cert_reqs=os.getenv("REDIS_SSL_CERT_REQS"),
|
|
135
|
+
ssl_ca_certs=os.getenv("REDIS_SSL_CA_CERTS"),
|
|
136
|
+
ssl_certfile=os.getenv("REDIS_SSL_CERTFILE"),
|
|
137
|
+
ssl_keyfile=os.getenv("REDIS_SSL_KEYFILE"),
|
|
138
|
+
# Connection settings
|
|
139
|
+
socket_timeout=float(os.getenv("REDIS_SOCKET_TIMEOUT", "5.0")),
|
|
140
|
+
socket_connect_timeout=float(os.getenv("REDIS_SOCKET_CONNECT_TIMEOUT", "5.0")),
|
|
141
|
+
max_connections=int(os.getenv("REDIS_MAX_CONNECTIONS", "10")),
|
|
142
|
+
# Retry settings
|
|
143
|
+
retry_on_timeout=os.getenv("REDIS_RETRY_ON_TIMEOUT", "true").lower() == "true",
|
|
144
|
+
retry_max_attempts=int(os.getenv("REDIS_RETRY_MAX_ATTEMPTS", "3")),
|
|
145
|
+
retry_base_delay=float(os.getenv("REDIS_RETRY_BASE_DELAY", "0.1")),
|
|
146
|
+
retry_max_delay=float(os.getenv("REDIS_RETRY_MAX_DELAY", "2.0")),
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def get_redis_config_dict() -> dict:
|
|
151
|
+
"""Get Redis configuration as a dictionary (legacy compatibility).
|
|
79
152
|
|
|
80
|
-
|
|
153
|
+
Returns:
|
|
154
|
+
Dict with connection parameters
|
|
155
|
+
|
|
156
|
+
"""
|
|
157
|
+
config = get_redis_config()
|
|
81
158
|
return {
|
|
82
|
-
"host":
|
|
83
|
-
"port":
|
|
84
|
-
"password":
|
|
85
|
-
"db":
|
|
86
|
-
"use_mock":
|
|
159
|
+
"host": config.host,
|
|
160
|
+
"port": config.port,
|
|
161
|
+
"password": config.password,
|
|
162
|
+
"db": config.db,
|
|
163
|
+
"use_mock": config.use_mock,
|
|
164
|
+
"ssl": config.ssl,
|
|
87
165
|
}
|
|
88
166
|
|
|
89
167
|
|
|
90
168
|
def get_redis_memory(
|
|
91
169
|
url: str | None = None,
|
|
92
170
|
use_mock: bool | None = None,
|
|
171
|
+
config: RedisConfig | None = None,
|
|
93
172
|
) -> RedisShortTermMemory:
|
|
94
|
-
"""
|
|
95
|
-
Create a RedisShortTermMemory instance with environment-based config.
|
|
173
|
+
"""Create a RedisShortTermMemory instance with environment-based config.
|
|
96
174
|
|
|
97
175
|
Args:
|
|
98
176
|
url: Optional explicit Redis URL (overrides env vars)
|
|
99
177
|
use_mock: Optional explicit mock mode (overrides env vars)
|
|
178
|
+
config: Optional explicit RedisConfig (overrides all other options)
|
|
100
179
|
|
|
101
180
|
Returns:
|
|
102
181
|
Configured RedisShortTermMemory instance
|
|
@@ -105,45 +184,51 @@ def get_redis_memory(
|
|
|
105
184
|
# Auto-configure from environment
|
|
106
185
|
memory = get_redis_memory()
|
|
107
186
|
|
|
108
|
-
# Explicit URL
|
|
109
|
-
memory = get_redis_memory(url="
|
|
187
|
+
# Explicit URL (SSL auto-detected from rediss://)
|
|
188
|
+
memory = get_redis_memory(url="rediss://user:pass@managed-redis.com:6379")
|
|
110
189
|
|
|
111
190
|
# Force mock mode
|
|
112
191
|
memory = get_redis_memory(use_mock=True)
|
|
192
|
+
|
|
193
|
+
# Explicit config with all options
|
|
194
|
+
from empathy_os.memory.short_term import RedisConfig
|
|
195
|
+
config = RedisConfig(
|
|
196
|
+
host="redis.example.com",
|
|
197
|
+
port=6379,
|
|
198
|
+
ssl=True,
|
|
199
|
+
retry_max_attempts=5,
|
|
200
|
+
)
|
|
201
|
+
memory = get_redis_memory(config=config)
|
|
202
|
+
|
|
113
203
|
"""
|
|
204
|
+
# Explicit config takes highest priority
|
|
205
|
+
if config is not None:
|
|
206
|
+
return RedisShortTermMemory(config=config)
|
|
207
|
+
|
|
114
208
|
# Explicit mock mode
|
|
115
209
|
if use_mock is True:
|
|
116
210
|
return RedisShortTermMemory(use_mock=True)
|
|
117
211
|
|
|
118
212
|
# Explicit URL
|
|
119
213
|
if url:
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
host=
|
|
123
|
-
port=
|
|
124
|
-
password=
|
|
125
|
-
db=
|
|
214
|
+
url_config = parse_redis_url(url)
|
|
215
|
+
redis_config = RedisConfig(
|
|
216
|
+
host=url_config["host"],
|
|
217
|
+
port=url_config["port"],
|
|
218
|
+
password=url_config["password"],
|
|
219
|
+
db=url_config["db"],
|
|
220
|
+
ssl=url_config.get("ssl", False),
|
|
126
221
|
use_mock=False,
|
|
127
222
|
)
|
|
223
|
+
return RedisShortTermMemory(config=redis_config)
|
|
128
224
|
|
|
129
225
|
# Environment-based config
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
if config.get("use_mock"):
|
|
133
|
-
return RedisShortTermMemory(use_mock=True)
|
|
134
|
-
|
|
135
|
-
return RedisShortTermMemory(
|
|
136
|
-
host=config["host"],
|
|
137
|
-
port=config["port"],
|
|
138
|
-
password=config.get("password"),
|
|
139
|
-
db=config.get("db", 0),
|
|
140
|
-
use_mock=False,
|
|
141
|
-
)
|
|
226
|
+
env_config = get_redis_config()
|
|
227
|
+
return RedisShortTermMemory(config=env_config)
|
|
142
228
|
|
|
143
229
|
|
|
144
230
|
def check_redis_connection() -> dict:
|
|
145
|
-
"""
|
|
146
|
-
Check Redis connection and return status.
|
|
231
|
+
"""Check Redis connection and return status.
|
|
147
232
|
|
|
148
233
|
Returns:
|
|
149
234
|
Dict with connection status and info
|
|
@@ -152,16 +237,17 @@ def check_redis_connection() -> dict:
|
|
|
152
237
|
>>> status = check_redis_connection()
|
|
153
238
|
>>> if status["connected"]:
|
|
154
239
|
... print(f"Connected to {status['host']}:{status['port']}")
|
|
240
|
+
|
|
155
241
|
"""
|
|
156
242
|
config = get_redis_config()
|
|
157
243
|
|
|
158
244
|
result = {
|
|
159
245
|
"config_source": "environment",
|
|
160
|
-
"use_mock": config.
|
|
161
|
-
"host": config.
|
|
162
|
-
"port": config.
|
|
163
|
-
"has_password": bool(config.
|
|
164
|
-
"db": config.
|
|
246
|
+
"use_mock": config.use_mock,
|
|
247
|
+
"host": config.host,
|
|
248
|
+
"port": config.port,
|
|
249
|
+
"has_password": bool(config.password),
|
|
250
|
+
"db": config.db,
|
|
165
251
|
"connected": False,
|
|
166
252
|
"error": None,
|
|
167
253
|
}
|
|
@@ -194,8 +280,7 @@ def check_redis_connection() -> dict:
|
|
|
194
280
|
|
|
195
281
|
# Convenience function for Railway deployments
|
|
196
282
|
def get_railway_redis() -> RedisShortTermMemory:
|
|
197
|
-
"""
|
|
198
|
-
Get Redis configured for Railway deployment.
|
|
283
|
+
"""Get Redis configured for Railway deployment.
|
|
199
284
|
|
|
200
285
|
Railway automatically sets REDIS_URL when you add a Redis service.
|
|
201
286
|
|
|
@@ -204,13 +289,14 @@ def get_railway_redis() -> RedisShortTermMemory:
|
|
|
204
289
|
|
|
205
290
|
Raises:
|
|
206
291
|
EnvironmentError: If REDIS_URL is not set
|
|
292
|
+
|
|
207
293
|
"""
|
|
208
294
|
redis_url = os.getenv("REDIS_URL") or os.getenv("REDIS_PRIVATE_URL")
|
|
209
295
|
|
|
210
296
|
if not redis_url:
|
|
211
297
|
raise OSError(
|
|
212
298
|
"REDIS_URL not found. Make sure Redis is added to your Railway project.\n"
|
|
213
|
-
"Run: railway add --database redis"
|
|
299
|
+
"Run: railway add --database redis",
|
|
214
300
|
)
|
|
215
301
|
|
|
216
302
|
return get_redis_memory(url=redis_url)
|