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/levels.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Five Levels of AI Empathy - Individual Level Classes
|
|
1
|
+
"""Five Levels of AI Empathy - Individual Level Classes
|
|
3
2
|
|
|
4
3
|
Provides concrete implementations for each empathy level:
|
|
5
4
|
- Level 1: Reactive Empathy (respond to explicit requests)
|
|
@@ -23,8 +22,7 @@ from typing import Any
|
|
|
23
22
|
|
|
24
23
|
@dataclass
|
|
25
24
|
class EmpathyAction:
|
|
26
|
-
"""
|
|
27
|
-
An action taken at a specific empathy level
|
|
25
|
+
"""An action taken at a specific empathy level
|
|
28
26
|
|
|
29
27
|
Records what action was taken, at what level, and the outcome.
|
|
30
28
|
"""
|
|
@@ -38,8 +36,7 @@ class EmpathyAction:
|
|
|
38
36
|
|
|
39
37
|
|
|
40
38
|
class EmpathyLevel(ABC):
|
|
41
|
-
"""
|
|
42
|
-
Abstract base class for empathy levels
|
|
39
|
+
"""Abstract base class for empathy levels
|
|
43
40
|
|
|
44
41
|
Each level implements specific behaviors appropriate to that
|
|
45
42
|
level of empathy sophistication.
|
|
@@ -53,8 +50,7 @@ class EmpathyLevel(ABC):
|
|
|
53
50
|
|
|
54
51
|
@abstractmethod
|
|
55
52
|
def respond(self, context: dict[str, Any]) -> dict[str, Any]:
|
|
56
|
-
"""
|
|
57
|
-
Respond to a situation at this empathy level.
|
|
53
|
+
"""Respond to a situation at this empathy level.
|
|
58
54
|
|
|
59
55
|
This abstract method defines the core behavior for each empathy level.
|
|
60
56
|
Subclasses must implement level-specific response logic that corresponds
|
|
@@ -73,7 +69,7 @@ class EmpathyLevel(ABC):
|
|
|
73
69
|
- 'level_name': str - Human-readable level name
|
|
74
70
|
- 'action': str - Type of action taken
|
|
75
71
|
- 'description': str - Description of the response
|
|
76
|
-
- 'initiative': str -
|
|
72
|
+
- 'initiative': str - Level ('none'|'guided'|'proactive'|'anticipatory'|'systems')
|
|
77
73
|
- 'reasoning': str - Explanation of why this level's approach was used
|
|
78
74
|
- Additional fields specific to the level implementation
|
|
79
75
|
|
|
@@ -90,8 +86,8 @@ class EmpathyLevel(ABC):
|
|
|
90
86
|
|
|
91
87
|
Implementations should record actions via self.record_action() and
|
|
92
88
|
maintain consistency in the response format across levels.
|
|
89
|
+
|
|
93
90
|
"""
|
|
94
|
-
pass
|
|
95
91
|
|
|
96
92
|
def record_action(
|
|
97
93
|
self,
|
|
@@ -116,8 +112,7 @@ class EmpathyLevel(ABC):
|
|
|
116
112
|
|
|
117
113
|
|
|
118
114
|
class Level1Reactive(EmpathyLevel):
|
|
119
|
-
"""
|
|
120
|
-
Level 1: Reactive Empathy
|
|
115
|
+
"""Level 1: Reactive Empathy
|
|
121
116
|
|
|
122
117
|
**Principle**: Help after being asked
|
|
123
118
|
|
|
@@ -143,14 +138,14 @@ class Level1Reactive(EmpathyLevel):
|
|
|
143
138
|
>>> response = level1.respond({"request": "status", "subject": "project"})
|
|
144
139
|
>>> print(response["action"])
|
|
145
140
|
'provide_requested_information'
|
|
141
|
+
|
|
146
142
|
"""
|
|
147
143
|
|
|
148
144
|
level_number = 1
|
|
149
145
|
level_name = "Reactive Empathy"
|
|
150
146
|
|
|
151
147
|
def respond(self, context: dict[str, Any]) -> dict[str, Any]:
|
|
152
|
-
"""
|
|
153
|
-
Respond reactively to explicit request
|
|
148
|
+
"""Respond reactively to explicit request
|
|
154
149
|
|
|
155
150
|
Only provides what was directly asked for.
|
|
156
151
|
"""
|
|
@@ -177,8 +172,7 @@ class Level1Reactive(EmpathyLevel):
|
|
|
177
172
|
|
|
178
173
|
|
|
179
174
|
class Level2Guided(EmpathyLevel):
|
|
180
|
-
"""
|
|
181
|
-
Level 2: Guided Empathy
|
|
175
|
+
"""Level 2: Guided Empathy
|
|
182
176
|
|
|
183
177
|
**Principle**: Collaborative exploration with user input
|
|
184
178
|
|
|
@@ -208,14 +202,14 @@ class Level2Guided(EmpathyLevel):
|
|
|
208
202
|
... })
|
|
209
203
|
>>> print(len(response["clarifying_questions"]))
|
|
210
204
|
3
|
|
205
|
+
|
|
211
206
|
"""
|
|
212
207
|
|
|
213
208
|
level_number = 2
|
|
214
209
|
level_name = "Guided Empathy"
|
|
215
210
|
|
|
216
211
|
def respond(self, context: dict[str, Any]) -> dict[str, Any]:
|
|
217
|
-
"""
|
|
218
|
-
Respond with guided exploration
|
|
212
|
+
"""Respond with guided exploration
|
|
219
213
|
|
|
220
214
|
Asks questions to understand needs and collaboratively explore solutions.
|
|
221
215
|
"""
|
|
@@ -266,8 +260,7 @@ class Level2Guided(EmpathyLevel):
|
|
|
266
260
|
|
|
267
261
|
|
|
268
262
|
class Level3Proactive(EmpathyLevel):
|
|
269
|
-
"""
|
|
270
|
-
Level 3: Proactive Empathy
|
|
263
|
+
"""Level 3: Proactive Empathy
|
|
271
264
|
|
|
272
265
|
**Principle**: Act before being asked (when confidence is high)
|
|
273
266
|
|
|
@@ -296,14 +289,14 @@ class Level3Proactive(EmpathyLevel):
|
|
|
296
289
|
... "confidence": 0.9
|
|
297
290
|
... })
|
|
298
291
|
>>> print(response["proactive_offer"])
|
|
292
|
+
|
|
299
293
|
"""
|
|
300
294
|
|
|
301
295
|
level_number = 3
|
|
302
296
|
level_name = "Proactive Empathy"
|
|
303
297
|
|
|
304
298
|
def respond(self, context: dict[str, Any]) -> dict[str, Any]:
|
|
305
|
-
"""
|
|
306
|
-
Respond proactively to observed needs
|
|
299
|
+
"""Respond proactively to observed needs
|
|
307
300
|
|
|
308
301
|
Takes initiative on obvious needs without being asked.
|
|
309
302
|
"""
|
|
@@ -351,8 +344,7 @@ class Level3Proactive(EmpathyLevel):
|
|
|
351
344
|
|
|
352
345
|
|
|
353
346
|
class Level4Anticipatory(EmpathyLevel):
|
|
354
|
-
"""
|
|
355
|
-
Level 4: Anticipatory Empathy
|
|
347
|
+
"""Level 4: Anticipatory Empathy
|
|
356
348
|
|
|
357
349
|
**Principle**: Predict and prepare for future needs
|
|
358
350
|
|
|
@@ -387,14 +379,14 @@ class Level4Anticipatory(EmpathyLevel):
|
|
|
387
379
|
... "prediction_horizon": "30_days"
|
|
388
380
|
... })
|
|
389
381
|
>>> print(response["predicted_needs"])
|
|
382
|
+
|
|
390
383
|
"""
|
|
391
384
|
|
|
392
385
|
level_number = 4
|
|
393
386
|
level_name = "Anticipatory Empathy"
|
|
394
387
|
|
|
395
388
|
def respond(self, context: dict[str, Any]) -> dict[str, Any]:
|
|
396
|
-
"""
|
|
397
|
-
Respond anticipatorily to predicted future needs
|
|
389
|
+
"""Respond anticipatorily to predicted future needs
|
|
398
390
|
|
|
399
391
|
Analyzes trajectory and prepares for future needs before they arise.
|
|
400
392
|
"""
|
|
@@ -427,7 +419,10 @@ class Level4Anticipatory(EmpathyLevel):
|
|
|
427
419
|
return response
|
|
428
420
|
|
|
429
421
|
def _predict_future_needs(
|
|
430
|
-
self,
|
|
422
|
+
self,
|
|
423
|
+
current_state: dict[str, Any],
|
|
424
|
+
trajectory: str,
|
|
425
|
+
horizon: str,
|
|
431
426
|
) -> dict[str, Any]:
|
|
432
427
|
"""Predict future needs based on current trajectory"""
|
|
433
428
|
# Simulate prediction logic
|
|
@@ -452,8 +447,7 @@ class Level4Anticipatory(EmpathyLevel):
|
|
|
452
447
|
|
|
453
448
|
|
|
454
449
|
class Level5Systems(EmpathyLevel):
|
|
455
|
-
"""
|
|
456
|
-
Level 5: Systems Empathy
|
|
450
|
+
"""Level 5: Systems Empathy
|
|
457
451
|
|
|
458
452
|
**Principle**: Build structures that help at scale
|
|
459
453
|
|
|
@@ -489,20 +483,20 @@ class Level5Systems(EmpathyLevel):
|
|
|
489
483
|
... "pattern": "repetitive_structure"
|
|
490
484
|
... })
|
|
491
485
|
>>> print(response["system_created"])
|
|
486
|
+
|
|
492
487
|
"""
|
|
493
488
|
|
|
494
489
|
level_number = 5
|
|
495
490
|
level_name = "Systems Empathy"
|
|
496
491
|
|
|
497
492
|
def respond(self, context: dict[str, Any]) -> dict[str, Any]:
|
|
498
|
-
"""
|
|
499
|
-
Respond with systems-level solution
|
|
493
|
+
"""Respond with systems-level solution
|
|
500
494
|
|
|
501
495
|
Creates reusable structures that help at scale.
|
|
502
496
|
"""
|
|
503
497
|
problem_class = context.get("problem_class", "unknown")
|
|
504
498
|
instances = context.get("instances", 0)
|
|
505
|
-
pattern = context.get("pattern"
|
|
499
|
+
pattern = context.get("pattern")
|
|
506
500
|
|
|
507
501
|
system_design = self._design_system_solution(problem_class, instances, pattern)
|
|
508
502
|
|
|
@@ -530,7 +524,10 @@ class Level5Systems(EmpathyLevel):
|
|
|
530
524
|
return response
|
|
531
525
|
|
|
532
526
|
def _design_system_solution(
|
|
533
|
-
self,
|
|
527
|
+
self,
|
|
528
|
+
problem_class: str,
|
|
529
|
+
instances: int,
|
|
530
|
+
pattern: str | None,
|
|
534
531
|
) -> dict[str, Any]:
|
|
535
532
|
"""Design a system-level solution"""
|
|
536
533
|
return {
|
|
@@ -555,8 +552,7 @@ class Level5Systems(EmpathyLevel):
|
|
|
555
552
|
|
|
556
553
|
# Convenience function to get level class by number
|
|
557
554
|
def get_level_class(level: int) -> type:
|
|
558
|
-
"""
|
|
559
|
-
Get the class for a specific empathy level
|
|
555
|
+
"""Get the class for a specific empathy level
|
|
560
556
|
|
|
561
557
|
Args:
|
|
562
558
|
level: Level number (1-5)
|
|
@@ -569,6 +565,7 @@ def get_level_class(level: int) -> type:
|
|
|
569
565
|
>>> level4 = LevelClass()
|
|
570
566
|
>>> print(level4.level_name)
|
|
571
567
|
'Anticipatory Empathy'
|
|
568
|
+
|
|
572
569
|
"""
|
|
573
570
|
levels = {
|
|
574
571
|
1: Level1Reactive,
|
empathy_os/leverage_points.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Leverage Point Analysis for System Interventions
|
|
1
|
+
"""Leverage Point Analysis for System Interventions
|
|
3
2
|
|
|
4
3
|
Identifies high-leverage intervention points based on Donella Meadows's
|
|
5
4
|
seminal work "Leverage Points: Places to Intervene in a System".
|
|
@@ -17,8 +16,7 @@ from typing import Any
|
|
|
17
16
|
|
|
18
17
|
|
|
19
18
|
class LeverageLevel(IntEnum):
|
|
20
|
-
"""
|
|
21
|
-
Donella Meadows's 12 Leverage Points (ordered by effectiveness)
|
|
19
|
+
"""Donella Meadows's 12 Leverage Points (ordered by effectiveness)
|
|
22
20
|
|
|
23
21
|
Higher numbers = More effective leverage points
|
|
24
22
|
Lower numbers = Less effective (but often easier to implement)
|
|
@@ -45,8 +43,7 @@ class LeverageLevel(IntEnum):
|
|
|
45
43
|
|
|
46
44
|
@dataclass
|
|
47
45
|
class LeveragePoint:
|
|
48
|
-
"""
|
|
49
|
-
A specific leverage point identified in the system
|
|
46
|
+
"""A specific leverage point identified in the system
|
|
50
47
|
|
|
51
48
|
Represents a place where intervention can create significant change
|
|
52
49
|
in system behavior.
|
|
@@ -64,8 +61,7 @@ class LeveragePoint:
|
|
|
64
61
|
|
|
65
62
|
|
|
66
63
|
class LeveragePointAnalyzer:
|
|
67
|
-
"""
|
|
68
|
-
Identifies high-leverage intervention points in AI-human systems
|
|
64
|
+
"""Identifies high-leverage intervention points in AI-human systems
|
|
69
65
|
|
|
70
66
|
Based on Donella Meadows's 12 leverage points. Helps identify where
|
|
71
67
|
to intervene in a system for maximum effectiveness.
|
|
@@ -118,6 +114,7 @@ class LeveragePointAnalyzer:
|
|
|
118
114
|
>>> points = analyzer.find_leverage_points(problem)
|
|
119
115
|
>>> for point in points:
|
|
120
116
|
... print(f"{point.level.name}: {point.description}")
|
|
117
|
+
|
|
121
118
|
"""
|
|
122
119
|
|
|
123
120
|
def __init__(self):
|
|
@@ -125,8 +122,7 @@ class LeveragePointAnalyzer:
|
|
|
125
122
|
self.identified_points: list[LeveragePoint] = []
|
|
126
123
|
|
|
127
124
|
def find_leverage_points(self, problem_class: dict[str, Any]) -> list[LeveragePoint]:
|
|
128
|
-
"""
|
|
129
|
-
Find high-leverage intervention points for a problem class
|
|
125
|
+
"""Find high-leverage intervention points for a problem class
|
|
130
126
|
|
|
131
127
|
Analyzes the problem and identifies leverage points at different
|
|
132
128
|
levels of the Meadows hierarchy.
|
|
@@ -148,6 +144,7 @@ class LeveragePointAnalyzer:
|
|
|
148
144
|
... "instances": 50
|
|
149
145
|
... }
|
|
150
146
|
>>> points = analyzer.find_leverage_points(problem)
|
|
147
|
+
|
|
151
148
|
"""
|
|
152
149
|
points: list[LeveragePoint] = []
|
|
153
150
|
problem_type = problem_class.get("class", "unknown")
|
|
@@ -174,8 +171,7 @@ class LeveragePointAnalyzer:
|
|
|
174
171
|
return points_ranked
|
|
175
172
|
|
|
176
173
|
def rank_by_effectiveness(self, points: list[LeveragePoint]) -> list[LeveragePoint]:
|
|
177
|
-
"""
|
|
178
|
-
Rank leverage points by Meadows's hierarchy
|
|
174
|
+
"""Rank leverage points by Meadows's hierarchy
|
|
179
175
|
|
|
180
176
|
Higher leverage levels (paradigms, goals) ranked before lower
|
|
181
177
|
levels (parameters, buffers).
|
|
@@ -185,6 +181,7 @@ class LeveragePointAnalyzer:
|
|
|
185
181
|
|
|
186
182
|
Returns:
|
|
187
183
|
Sorted list with most effective points first
|
|
184
|
+
|
|
188
185
|
"""
|
|
189
186
|
return sorted(points, key=lambda p: p.level, reverse=True)
|
|
190
187
|
|
|
@@ -196,17 +193,17 @@ class LeveragePointAnalyzer:
|
|
|
196
193
|
points.append(
|
|
197
194
|
LeveragePoint(
|
|
198
195
|
level=LeverageLevel.PARADIGM,
|
|
199
|
-
description="
|
|
196
|
+
description="Paradigm shift: Docs as learning artifact, not compliance burden",
|
|
200
197
|
problem_domain="documentation",
|
|
201
198
|
impact_potential=0.9,
|
|
202
199
|
implementation_difficulty=0.8,
|
|
203
|
-
proposed_intervention="Reframe
|
|
200
|
+
proposed_intervention="Reframe docs as 'capturing team learning' not 'creating artifacts'",
|
|
204
201
|
expected_outcomes=[
|
|
205
202
|
"Developers see value in documentation",
|
|
206
203
|
"Documentation becomes natural part of workflow",
|
|
207
204
|
"Quality improves as purpose clarifies",
|
|
208
205
|
],
|
|
209
|
-
)
|
|
206
|
+
),
|
|
210
207
|
)
|
|
211
208
|
|
|
212
209
|
# High leverage: Change goal
|
|
@@ -223,7 +220,7 @@ class LeveragePointAnalyzer:
|
|
|
223
220
|
"Less redundant documentation",
|
|
224
221
|
"More collaboration",
|
|
225
222
|
],
|
|
226
|
-
)
|
|
223
|
+
),
|
|
227
224
|
)
|
|
228
225
|
|
|
229
226
|
# Medium leverage: Self-organization (Level 5 systems thinking)
|
|
@@ -234,13 +231,13 @@ class LeveragePointAnalyzer:
|
|
|
234
231
|
problem_domain="documentation",
|
|
235
232
|
impact_potential=0.8,
|
|
236
233
|
implementation_difficulty=0.5,
|
|
237
|
-
proposed_intervention="Deploy Level 5
|
|
234
|
+
proposed_intervention="Deploy Level 5 system that detects patterns and auto-documents",
|
|
238
235
|
expected_outcomes=[
|
|
239
236
|
"Reduce manual documentation by 70%",
|
|
240
237
|
"Free developers for creative work",
|
|
241
238
|
"Maintain quality through pattern detection",
|
|
242
239
|
],
|
|
243
|
-
)
|
|
240
|
+
),
|
|
244
241
|
)
|
|
245
242
|
|
|
246
243
|
# Low leverage: Parameters (quickest but least impactful)
|
|
@@ -253,7 +250,7 @@ class LeveragePointAnalyzer:
|
|
|
253
250
|
implementation_difficulty=0.1,
|
|
254
251
|
proposed_intervention="Cut required fields from 20 to 8",
|
|
255
252
|
expected_outcomes=["Faster documentation", "May not address root cause"],
|
|
256
|
-
)
|
|
253
|
+
),
|
|
257
254
|
)
|
|
258
255
|
|
|
259
256
|
return points
|
|
@@ -276,7 +273,7 @@ class LeveragePointAnalyzer:
|
|
|
276
273
|
"Set appropriate expectations",
|
|
277
274
|
"Build genuine partnership",
|
|
278
275
|
],
|
|
279
|
-
)
|
|
276
|
+
),
|
|
280
277
|
)
|
|
281
278
|
|
|
282
279
|
# High leverage: Information flows
|
|
@@ -293,7 +290,7 @@ class LeveragePointAnalyzer:
|
|
|
293
290
|
"Can verify AI logic",
|
|
294
291
|
"Trust through transparency",
|
|
295
292
|
],
|
|
296
|
-
)
|
|
293
|
+
),
|
|
297
294
|
)
|
|
298
295
|
|
|
299
296
|
# Medium leverage: Reinforcing feedback loops
|
|
@@ -304,13 +301,13 @@ class LeveragePointAnalyzer:
|
|
|
304
301
|
problem_domain="trust",
|
|
305
302
|
impact_potential=0.7,
|
|
306
303
|
implementation_difficulty=0.5,
|
|
307
|
-
proposed_intervention="Start with high-confidence, low-risk tasks
|
|
304
|
+
proposed_intervention="Start with high-confidence, low-risk tasks for momentum",
|
|
308
305
|
expected_outcomes=[
|
|
309
306
|
"Quick wins build trust",
|
|
310
307
|
"Positive feedback loop activated",
|
|
311
308
|
"Natural progression to harder tasks",
|
|
312
309
|
],
|
|
313
|
-
)
|
|
310
|
+
),
|
|
314
311
|
)
|
|
315
312
|
|
|
316
313
|
return points
|
|
@@ -329,7 +326,7 @@ class LeveragePointAnalyzer:
|
|
|
329
326
|
implementation_difficulty=0.6,
|
|
330
327
|
proposed_intervention="Optimize for long-term throughput not short-term speed",
|
|
331
328
|
expected_outcomes=["Prevent burnout", "Sustainable productivity", "Higher quality"],
|
|
332
|
-
)
|
|
329
|
+
),
|
|
333
330
|
)
|
|
334
331
|
|
|
335
332
|
# Medium leverage: Delays
|
|
@@ -342,7 +339,7 @@ class LeveragePointAnalyzer:
|
|
|
342
339
|
implementation_difficulty=0.4,
|
|
343
340
|
proposed_intervention="Implement continuous testing with instant feedback",
|
|
344
341
|
expected_outcomes=["Faster iteration", "Catch errors early", "Better learning"],
|
|
345
|
-
)
|
|
342
|
+
),
|
|
346
343
|
)
|
|
347
344
|
|
|
348
345
|
return points
|
|
@@ -360,7 +357,7 @@ class LeveragePointAnalyzer:
|
|
|
360
357
|
impact_potential=0.8,
|
|
361
358
|
implementation_difficulty=0.8,
|
|
362
359
|
proposed_intervention="Examine and challenge fundamental beliefs about problem",
|
|
363
|
-
)
|
|
360
|
+
),
|
|
364
361
|
)
|
|
365
362
|
|
|
366
363
|
# Consider information flows
|
|
@@ -372,16 +369,17 @@ class LeveragePointAnalyzer:
|
|
|
372
369
|
impact_potential=0.6,
|
|
373
370
|
implementation_difficulty=0.4,
|
|
374
371
|
proposed_intervention="Make relevant information more accessible to stakeholders",
|
|
375
|
-
)
|
|
372
|
+
),
|
|
376
373
|
)
|
|
377
374
|
|
|
378
375
|
return points
|
|
379
376
|
|
|
380
377
|
def get_top_leverage_points(
|
|
381
|
-
self,
|
|
378
|
+
self,
|
|
379
|
+
n: int = 3,
|
|
380
|
+
min_level: LeverageLevel | None = None,
|
|
382
381
|
) -> list[LeveragePoint]:
|
|
383
|
-
"""
|
|
384
|
-
Get top N leverage points, optionally filtered by minimum level
|
|
382
|
+
"""Get top N leverage points, optionally filtered by minimum level
|
|
385
383
|
|
|
386
384
|
Args:
|
|
387
385
|
n: Number of top points to return
|
|
@@ -389,6 +387,7 @@ class LeveragePointAnalyzer:
|
|
|
389
387
|
|
|
390
388
|
Returns:
|
|
391
389
|
Top N leverage points
|
|
390
|
+
|
|
392
391
|
"""
|
|
393
392
|
points = self.identified_points
|
|
394
393
|
|
|
@@ -398,8 +397,7 @@ class LeveragePointAnalyzer:
|
|
|
398
397
|
return sorted(points, key=lambda p: p.level, reverse=True)[:n]
|
|
399
398
|
|
|
400
399
|
def analyze_intervention_feasibility(self, point: LeveragePoint) -> dict[str, Any]:
|
|
401
|
-
"""
|
|
402
|
-
Analyze feasibility of intervening at a leverage point
|
|
400
|
+
"""Analyze feasibility of intervening at a leverage point
|
|
403
401
|
|
|
404
402
|
Considers:
|
|
405
403
|
- Impact potential
|
|
@@ -412,6 +410,7 @@ class LeveragePointAnalyzer:
|
|
|
412
410
|
|
|
413
411
|
Returns:
|
|
414
412
|
Feasibility analysis with recommendation
|
|
413
|
+
|
|
415
414
|
"""
|
|
416
415
|
# Calculate feasibility score (impact vs difficulty)
|
|
417
416
|
feasibility_score = point.impact_potential / max(point.implementation_difficulty, 0.1)
|
empathy_os/logging_config.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Centralized Logging Configuration for Empathy Framework
|
|
1
|
+
"""Centralized Logging Configuration for Empathy Framework
|
|
3
2
|
|
|
4
3
|
Provides professional logging setup with:
|
|
5
4
|
- Console and file logging
|
|
@@ -32,12 +31,12 @@ class StructuredFormatter(logging.Formatter):
|
|
|
32
31
|
BOLD = "\033[1m"
|
|
33
32
|
|
|
34
33
|
def __init__(self, use_color: bool = True, include_context: bool = False):
|
|
35
|
-
"""
|
|
36
|
-
Initialize formatter.
|
|
34
|
+
"""Initialize formatter.
|
|
37
35
|
|
|
38
36
|
Args:
|
|
39
37
|
use_color: Whether to use colored output
|
|
40
38
|
include_context: Whether to include contextual information
|
|
39
|
+
|
|
41
40
|
"""
|
|
42
41
|
self.use_color = use_color and sys.stderr.isatty()
|
|
43
42
|
self.include_context = include_context
|
|
@@ -80,8 +79,7 @@ def create_logger(
|
|
|
80
79
|
max_bytes: int = 10 * 1024 * 1024, # 10MB
|
|
81
80
|
backup_count: int = 5,
|
|
82
81
|
) -> logging.Logger:
|
|
83
|
-
"""
|
|
84
|
-
Create a configured logger instance.
|
|
82
|
+
"""Create a configured logger instance.
|
|
85
83
|
|
|
86
84
|
Args:
|
|
87
85
|
name: Logger name (typically __name__)
|
|
@@ -100,6 +98,7 @@ def create_logger(
|
|
|
100
98
|
>>> logger = create_logger(__name__, level=logging.DEBUG)
|
|
101
99
|
>>> logger.info("Application started")
|
|
102
100
|
>>> logger.debug("Detailed debug information")
|
|
101
|
+
|
|
103
102
|
"""
|
|
104
103
|
logger = logging.getLogger(name)
|
|
105
104
|
|
|
@@ -121,13 +120,13 @@ def create_logger(
|
|
|
121
120
|
if log_dir:
|
|
122
121
|
log_dir_path = Path(log_dir)
|
|
123
122
|
log_dir_path.mkdir(parents=True, exist_ok=True)
|
|
124
|
-
|
|
123
|
+
log_file_path = log_dir_path / f"{name.replace('.', '_')}.log"
|
|
125
124
|
else:
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
log_file_path = Path(log_file) # type: ignore[arg-type]
|
|
126
|
+
log_file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
128
127
|
|
|
129
128
|
file_handler = logging.handlers.RotatingFileHandler(
|
|
130
|
-
str(
|
|
129
|
+
str(log_file_path),
|
|
131
130
|
maxBytes=max_bytes,
|
|
132
131
|
backupCount=backup_count,
|
|
133
132
|
)
|
|
@@ -144,6 +143,10 @@ class LoggingConfig:
|
|
|
144
143
|
|
|
145
144
|
_configured = False
|
|
146
145
|
_loggers: dict[str, logging.Logger] = {}
|
|
146
|
+
_level: int = logging.INFO
|
|
147
|
+
_log_dir: str | None = None
|
|
148
|
+
_use_color: bool = True
|
|
149
|
+
_include_context: bool = False
|
|
147
150
|
|
|
148
151
|
@classmethod
|
|
149
152
|
def configure(
|
|
@@ -153,8 +156,7 @@ class LoggingConfig:
|
|
|
153
156
|
use_color: bool = True,
|
|
154
157
|
include_context: bool = False,
|
|
155
158
|
) -> None:
|
|
156
|
-
"""
|
|
157
|
-
Configure global logging settings.
|
|
159
|
+
"""Configure global logging settings.
|
|
158
160
|
|
|
159
161
|
Args:
|
|
160
162
|
level: Default logging level
|
|
@@ -168,6 +170,7 @@ class LoggingConfig:
|
|
|
168
170
|
... log_dir="./logs",
|
|
169
171
|
... use_color=True
|
|
170
172
|
... )
|
|
173
|
+
|
|
171
174
|
"""
|
|
172
175
|
cls._level = level
|
|
173
176
|
cls._log_dir = log_dir
|
|
@@ -181,8 +184,7 @@ class LoggingConfig:
|
|
|
181
184
|
name: str,
|
|
182
185
|
level: int | None = None,
|
|
183
186
|
) -> logging.Logger:
|
|
184
|
-
"""
|
|
185
|
-
Get or create a logger instance.
|
|
187
|
+
"""Get or create a logger instance.
|
|
186
188
|
|
|
187
189
|
Args:
|
|
188
190
|
name: Logger name (typically __name__)
|
|
@@ -194,6 +196,7 @@ class LoggingConfig:
|
|
|
194
196
|
Example:
|
|
195
197
|
>>> logger = LoggingConfig.get_logger(__name__)
|
|
196
198
|
>>> logger.info("Processing data")
|
|
199
|
+
|
|
197
200
|
"""
|
|
198
201
|
if name not in cls._loggers:
|
|
199
202
|
if not cls._configured:
|
|
@@ -220,8 +223,7 @@ class LoggingConfig:
|
|
|
220
223
|
|
|
221
224
|
|
|
222
225
|
def get_logger(name: str) -> logging.Logger:
|
|
223
|
-
"""
|
|
224
|
-
Convenience function to get a logger.
|
|
226
|
+
"""Convenience function to get a logger.
|
|
225
227
|
|
|
226
228
|
This is the primary function to use throughout the codebase.
|
|
227
229
|
|
|
@@ -236,6 +238,7 @@ def get_logger(name: str) -> logging.Logger:
|
|
|
236
238
|
>>> logger = get_logger(__name__)
|
|
237
239
|
>>> logger.info("Starting process")
|
|
238
240
|
>>> logger.debug("Processing item", extra={"context": {"item_id": 123}})
|
|
241
|
+
|
|
239
242
|
"""
|
|
240
243
|
return LoggingConfig.get_logger(name)
|
|
241
244
|
|