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_llm_toolkit/core.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Empathy LLM - Core Wrapper
|
|
1
|
+
"""Empathy LLM - Core Wrapper
|
|
3
2
|
|
|
4
3
|
Main class that wraps any LLM provider with Empathy Framework levels.
|
|
5
4
|
|
|
@@ -7,6 +6,7 @@ Copyright 2025 Smart AI Memory, LLC
|
|
|
7
6
|
Licensed under Fair Source 0.9
|
|
8
7
|
"""
|
|
9
8
|
|
|
9
|
+
import asyncio
|
|
10
10
|
import logging
|
|
11
11
|
import time
|
|
12
12
|
from typing import Any
|
|
@@ -22,16 +22,21 @@ from empathy_os.memory import (
|
|
|
22
22
|
)
|
|
23
23
|
|
|
24
24
|
from .levels import EmpathyLevel
|
|
25
|
-
from .providers import
|
|
25
|
+
from .providers import (
|
|
26
|
+
AnthropicProvider,
|
|
27
|
+
BaseLLMProvider,
|
|
28
|
+
GeminiProvider,
|
|
29
|
+
LocalProvider,
|
|
30
|
+
OpenAIProvider,
|
|
31
|
+
)
|
|
26
32
|
from .routing import ModelRouter
|
|
27
|
-
from .state import CollaborationState, UserPattern
|
|
33
|
+
from .state import CollaborationState, PatternType, UserPattern
|
|
28
34
|
|
|
29
35
|
logger = logging.getLogger(__name__)
|
|
30
36
|
|
|
31
37
|
|
|
32
38
|
class EmpathyLLM:
|
|
33
|
-
"""
|
|
34
|
-
Wraps any LLM provider with Empathy Framework levels.
|
|
39
|
+
"""Wraps any LLM provider with Empathy Framework levels.
|
|
35
40
|
|
|
36
41
|
Automatically progresses from Level 1 (reactive) to Level 4 (anticipatory)
|
|
37
42
|
based on user collaboration state.
|
|
@@ -85,6 +90,7 @@ class EmpathyLLM:
|
|
|
85
90
|
... user_input="Design the architecture",
|
|
86
91
|
... task_type="architectural_decision"
|
|
87
92
|
... )
|
|
93
|
+
|
|
88
94
|
"""
|
|
89
95
|
|
|
90
96
|
def __init__(
|
|
@@ -101,8 +107,7 @@ class EmpathyLLM:
|
|
|
101
107
|
enable_model_routing: bool = False,
|
|
102
108
|
**kwargs,
|
|
103
109
|
):
|
|
104
|
-
"""
|
|
105
|
-
Initialize EmpathyLLM.
|
|
110
|
+
"""Initialize EmpathyLLM.
|
|
106
111
|
|
|
107
112
|
Args:
|
|
108
113
|
provider: "anthropic", "openai", or "local"
|
|
@@ -126,6 +131,7 @@ class EmpathyLLM:
|
|
|
126
131
|
- CAPABLE (Sonnet): code generation, bug fixes, security review
|
|
127
132
|
- PREMIUM (Opus): coordination, synthesis, architectural decisions
|
|
128
133
|
**kwargs: Provider-specific options
|
|
134
|
+
|
|
129
135
|
"""
|
|
130
136
|
self.target_level = target_level
|
|
131
137
|
self.pattern_library = pattern_library or {}
|
|
@@ -157,7 +163,7 @@ class EmpathyLLM:
|
|
|
157
163
|
self._cached_memory = self.claude_memory_loader.load_all_memory(project_root)
|
|
158
164
|
logger.info(
|
|
159
165
|
f"EmpathyLLM initialized with Claude memory: "
|
|
160
|
-
f"{len(self._cached_memory)} chars loaded"
|
|
166
|
+
f"{len(self._cached_memory)} chars loaded",
|
|
161
167
|
)
|
|
162
168
|
|
|
163
169
|
# Initialize Phase 3 security controls (v1.8.0+)
|
|
@@ -173,7 +179,7 @@ class EmpathyLLM:
|
|
|
173
179
|
logger.info(
|
|
174
180
|
f"EmpathyLLM initialized: provider={provider}, target_level={target_level}, "
|
|
175
181
|
f"security={'enabled' if enable_security else 'disabled'}, "
|
|
176
|
-
f"model_routing={'enabled' if enable_model_routing else 'disabled'}"
|
|
182
|
+
f"model_routing={'enabled' if enable_model_routing else 'disabled'}",
|
|
177
183
|
)
|
|
178
184
|
|
|
179
185
|
def _initialize_security(self):
|
|
@@ -207,24 +213,30 @@ class EmpathyLLM:
|
|
|
207
213
|
logger.info(f"Audit Logger initialized: {audit_log_dir}")
|
|
208
214
|
|
|
209
215
|
def _create_provider(
|
|
210
|
-
self,
|
|
216
|
+
self,
|
|
217
|
+
provider: str,
|
|
218
|
+
api_key: str | None,
|
|
219
|
+
model: str | None,
|
|
220
|
+
**kwargs,
|
|
211
221
|
) -> BaseLLMProvider:
|
|
212
222
|
"""Create appropriate provider instance"""
|
|
213
|
-
|
|
214
223
|
if provider == "anthropic":
|
|
215
224
|
return AnthropicProvider(
|
|
216
|
-
api_key=api_key,
|
|
225
|
+
api_key=api_key,
|
|
226
|
+
model=model or "claude-sonnet-4-5-20250929",
|
|
227
|
+
**kwargs,
|
|
217
228
|
)
|
|
218
|
-
|
|
229
|
+
if provider == "openai":
|
|
219
230
|
return OpenAIProvider(api_key=api_key, model=model or "gpt-4-turbo-preview", **kwargs)
|
|
220
|
-
|
|
231
|
+
if provider in ("google", "gemini"):
|
|
232
|
+
return GeminiProvider(api_key=api_key, model=model or "gemini-1.5-pro", **kwargs)
|
|
233
|
+
if provider == "local":
|
|
221
234
|
return LocalProvider(
|
|
222
235
|
endpoint=kwargs.get("endpoint", "http://localhost:11434"),
|
|
223
236
|
model=model or "llama2",
|
|
224
237
|
**kwargs,
|
|
225
238
|
)
|
|
226
|
-
|
|
227
|
-
raise ValueError(f"Unknown provider: {provider}")
|
|
239
|
+
raise ValueError(f"Unknown provider: {provider}")
|
|
228
240
|
|
|
229
241
|
def _get_or_create_state(self, user_id: str) -> CollaborationState:
|
|
230
242
|
"""Get or create collaboration state for user"""
|
|
@@ -233,8 +245,7 @@ class EmpathyLLM:
|
|
|
233
245
|
return self.states[user_id]
|
|
234
246
|
|
|
235
247
|
def _determine_level(self, state: CollaborationState) -> int:
|
|
236
|
-
"""
|
|
237
|
-
Determine which empathy level to use.
|
|
248
|
+
"""Determine which empathy level to use.
|
|
238
249
|
|
|
239
250
|
Progresses automatically based on state, up to target_level.
|
|
240
251
|
"""
|
|
@@ -251,8 +262,7 @@ class EmpathyLLM:
|
|
|
251
262
|
return level
|
|
252
263
|
|
|
253
264
|
def _build_system_prompt(self, level: int) -> str:
|
|
254
|
-
"""
|
|
255
|
-
Build system prompt including Claude memory (if enabled).
|
|
265
|
+
"""Build system prompt including Claude memory (if enabled).
|
|
256
266
|
|
|
257
267
|
Claude memory is prepended to the level-specific prompt,
|
|
258
268
|
so instructions from CLAUDE.md files affect all interactions.
|
|
@@ -262,6 +272,7 @@ class EmpathyLLM:
|
|
|
262
272
|
|
|
263
273
|
Returns:
|
|
264
274
|
Complete system prompt
|
|
275
|
+
|
|
265
276
|
"""
|
|
266
277
|
level_prompt = EmpathyLevel.get_system_prompt(level)
|
|
267
278
|
|
|
@@ -273,14 +284,12 @@ class EmpathyLLM:
|
|
|
273
284
|
# Empathy Framework Instructions
|
|
274
285
|
{level_prompt}
|
|
275
286
|
|
|
276
|
-
Follow the
|
|
287
|
+
Follow the CLAUDE.md instructions above, then apply the Empathy Framework below.
|
|
277
288
|
"""
|
|
278
|
-
|
|
279
|
-
return level_prompt
|
|
289
|
+
return level_prompt
|
|
280
290
|
|
|
281
291
|
def reload_memory(self):
|
|
282
|
-
"""
|
|
283
|
-
Reload Claude memory files.
|
|
292
|
+
"""Reload Claude memory files.
|
|
284
293
|
|
|
285
294
|
Useful if CLAUDE.md files have been updated during runtime.
|
|
286
295
|
Call this to pick up changes without restarting.
|
|
@@ -301,8 +310,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
|
|
|
301
310
|
force_level: int | None = None,
|
|
302
311
|
task_type: str | None = None,
|
|
303
312
|
) -> dict[str, Any]:
|
|
304
|
-
"""
|
|
305
|
-
Main interaction method.
|
|
313
|
+
"""Main interaction method.
|
|
306
314
|
|
|
307
315
|
Automatically selects appropriate empathy level and responds.
|
|
308
316
|
|
|
@@ -336,6 +344,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
|
|
|
336
344
|
|
|
337
345
|
Raises:
|
|
338
346
|
SecurityError: If secrets detected and block_on_secrets=True
|
|
347
|
+
|
|
339
348
|
"""
|
|
340
349
|
start_time = time.time()
|
|
341
350
|
state = self._get_or_create_state(user_id)
|
|
@@ -358,7 +367,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
|
|
|
358
367
|
"routed_tier": tier.value,
|
|
359
368
|
}
|
|
360
369
|
logger.info(
|
|
361
|
-
f"Model routing: task={effective_task} -> model={routed_model} (tier={tier.value})"
|
|
370
|
+
f"Model routing: task={effective_task} -> model={routed_model} (tier={tier.value})",
|
|
362
371
|
)
|
|
363
372
|
|
|
364
373
|
# Initialize security tracking
|
|
@@ -374,7 +383,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
|
|
|
374
383
|
security_metadata["pii_scrubbed"] = len(pii_detections) > 0
|
|
375
384
|
if pii_detections:
|
|
376
385
|
logger.info(
|
|
377
|
-
f"PII detected for user {user_id}: {len(pii_detections)} items scrubbed"
|
|
386
|
+
f"PII detected for user {user_id}: {len(pii_detections)} items scrubbed",
|
|
378
387
|
)
|
|
379
388
|
|
|
380
389
|
# Phase 3: Security Pipeline (Step 2 - Secrets Detection)
|
|
@@ -386,7 +395,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
|
|
|
386
395
|
block_on_secrets = self.security_config.get("block_on_secrets", True)
|
|
387
396
|
logger.warning(
|
|
388
397
|
f"Secrets detected for user {user_id}: {len(secrets_detections)} secrets, "
|
|
389
|
-
f"blocking={block_on_secrets}"
|
|
398
|
+
f"blocking={block_on_secrets}",
|
|
390
399
|
)
|
|
391
400
|
|
|
392
401
|
# Log security violation
|
|
@@ -406,7 +415,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
|
|
|
406
415
|
if block_on_secrets:
|
|
407
416
|
raise SecurityError(
|
|
408
417
|
f"Request blocked: {len(secrets_detections)} secret(s) detected in input. "
|
|
409
|
-
f"Please remove sensitive credentials before submitting."
|
|
418
|
+
f"Please remove sensitive credentials before submitting.",
|
|
410
419
|
)
|
|
411
420
|
|
|
412
421
|
# Determine level to use
|
|
@@ -486,8 +495,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
|
|
|
486
495
|
context: dict[str, Any],
|
|
487
496
|
model_override: str | None = None,
|
|
488
497
|
) -> dict[str, Any]:
|
|
489
|
-
"""
|
|
490
|
-
Level 1: Reactive - Simple Q&A
|
|
498
|
+
"""Level 1: Reactive - Simple Q&A
|
|
491
499
|
|
|
492
500
|
No memory, no patterns, just respond to question.
|
|
493
501
|
"""
|
|
@@ -515,8 +523,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
|
|
|
515
523
|
context: dict[str, Any],
|
|
516
524
|
model_override: str | None = None,
|
|
517
525
|
) -> dict[str, Any]:
|
|
518
|
-
"""
|
|
519
|
-
Level 2: Guided - Ask clarifying questions
|
|
526
|
+
"""Level 2: Guided - Ask clarifying questions
|
|
520
527
|
|
|
521
528
|
Uses conversation history for context.
|
|
522
529
|
"""
|
|
@@ -552,8 +559,7 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
|
|
|
552
559
|
context: dict[str, Any],
|
|
553
560
|
model_override: str | None = None,
|
|
554
561
|
) -> dict[str, Any]:
|
|
555
|
-
"""
|
|
556
|
-
Level 3: Proactive - Act on detected patterns
|
|
562
|
+
"""Level 3: Proactive - Act on detected patterns
|
|
557
563
|
|
|
558
564
|
Checks for matching patterns and acts proactively.
|
|
559
565
|
"""
|
|
@@ -565,9 +571,9 @@ Follow the instructions from CLAUDE.md files above, then apply the Empathy Frame
|
|
|
565
571
|
prompt = f"""
|
|
566
572
|
User said: "{user_input}"
|
|
567
573
|
|
|
568
|
-
|
|
574
|
+
Pattern detected: When you {matching_pattern.trigger}, you typically {matching_pattern.action}.
|
|
569
575
|
|
|
570
|
-
|
|
576
|
+
Confidence: {matching_pattern.confidence:.0%}. Proactively {matching_pattern.action}.
|
|
571
577
|
|
|
572
578
|
[Provide the expected result/action]
|
|
573
579
|
|
|
@@ -589,8 +595,8 @@ Was this helpful? If not, I can adjust my pattern detection.
|
|
|
589
595
|
proactive = False
|
|
590
596
|
pattern_info = None
|
|
591
597
|
|
|
592
|
-
#
|
|
593
|
-
|
|
598
|
+
# Run pattern detection in background (non-blocking)
|
|
599
|
+
asyncio.create_task(self._detect_patterns_async(state, user_input))
|
|
594
600
|
|
|
595
601
|
generate_kwargs: dict[str, Any] = {
|
|
596
602
|
"messages": messages,
|
|
@@ -620,8 +626,7 @@ Was this helpful? If not, I can adjust my pattern detection.
|
|
|
620
626
|
context: dict[str, Any],
|
|
621
627
|
model_override: str | None = None,
|
|
622
628
|
) -> dict[str, Any]:
|
|
623
|
-
"""
|
|
624
|
-
Level 4: Anticipatory - Predict future needs
|
|
629
|
+
"""Level 4: Anticipatory - Predict future needs
|
|
625
630
|
|
|
626
631
|
Analyzes trajectory and alerts to future bottlenecks.
|
|
627
632
|
"""
|
|
@@ -633,7 +638,7 @@ COLLABORATION CONTEXT:
|
|
|
633
638
|
- Total interactions: {len(state.interactions)}
|
|
634
639
|
- Trust level: {state.trust_level:.2f}
|
|
635
640
|
- Detected patterns: {len(state.detected_patterns)}
|
|
636
|
-
- Success rate: {state.
|
|
641
|
+
- Success rate: {state.success_rate:.0%}
|
|
637
642
|
|
|
638
643
|
TASK:
|
|
639
644
|
1. Respond to immediate request
|
|
@@ -681,8 +686,7 @@ Use anticipatory format:
|
|
|
681
686
|
context: dict[str, Any],
|
|
682
687
|
model_override: str | None = None,
|
|
683
688
|
) -> dict[str, Any]:
|
|
684
|
-
"""
|
|
685
|
-
Level 5: Systems - Cross-domain pattern learning
|
|
689
|
+
"""Level 5: Systems - Cross-domain pattern learning
|
|
686
690
|
|
|
687
691
|
Leverages shared pattern library across domains.
|
|
688
692
|
"""
|
|
@@ -728,14 +732,125 @@ TASK:
|
|
|
728
732
|
},
|
|
729
733
|
}
|
|
730
734
|
|
|
731
|
-
def
|
|
735
|
+
async def _detect_patterns_async(
|
|
736
|
+
self,
|
|
737
|
+
state: CollaborationState,
|
|
738
|
+
current_input: str,
|
|
739
|
+
) -> None:
|
|
740
|
+
"""Detect user behavior patterns in background.
|
|
741
|
+
|
|
742
|
+
Analyzes conversation history to identify:
|
|
743
|
+
- Sequential patterns: User always does X then Y
|
|
744
|
+
- Preference patterns: User prefers certain formats/styles
|
|
745
|
+
- Temporal patterns: User does X at specific times
|
|
746
|
+
- Conditional patterns: When Z happens, user does X
|
|
747
|
+
|
|
748
|
+
This runs asynchronously to avoid blocking the main response.
|
|
749
|
+
Detected patterns enable Level 3 proactive interactions.
|
|
732
750
|
"""
|
|
733
|
-
|
|
751
|
+
try:
|
|
752
|
+
from datetime import datetime
|
|
753
|
+
|
|
754
|
+
interactions = state.interactions
|
|
755
|
+
if len(interactions) < 3:
|
|
756
|
+
# Need at least 3 interactions to detect patterns
|
|
757
|
+
return
|
|
758
|
+
|
|
759
|
+
# Analyze recent interactions for sequential patterns
|
|
760
|
+
recent = interactions[-10:] # Last 10 interactions
|
|
761
|
+
user_messages = [i for i in recent if i.role == "user"]
|
|
762
|
+
|
|
763
|
+
if len(user_messages) < 2:
|
|
764
|
+
return
|
|
765
|
+
|
|
766
|
+
# Pattern 1: Sequential patterns (X followed by Y)
|
|
767
|
+
for i in range(len(user_messages) - 1):
|
|
768
|
+
current = user_messages[i].content.lower()
|
|
769
|
+
next_msg = user_messages[i + 1].content.lower()
|
|
770
|
+
|
|
771
|
+
# Detect common sequential patterns
|
|
772
|
+
sequential_triggers = [
|
|
773
|
+
("review", "fix"), # Review then fix
|
|
774
|
+
("debug", "test"), # Debug then test
|
|
775
|
+
("implement", "test"), # Implement then test
|
|
776
|
+
("refactor", "review"), # Refactor then review
|
|
777
|
+
]
|
|
778
|
+
|
|
779
|
+
for trigger, action in sequential_triggers:
|
|
780
|
+
if trigger in current and action in next_msg:
|
|
781
|
+
pattern = UserPattern(
|
|
782
|
+
pattern_type=PatternType.SEQUENTIAL,
|
|
783
|
+
trigger=trigger,
|
|
784
|
+
action=f"Typically follows with {action}",
|
|
785
|
+
confidence=0.6 + (0.1 * min(i, 3)), # Increase with occurrences
|
|
786
|
+
occurrences=1,
|
|
787
|
+
last_seen=datetime.now(),
|
|
788
|
+
context={"detected_from": "sequential_analysis"},
|
|
789
|
+
)
|
|
790
|
+
state.add_pattern(pattern)
|
|
791
|
+
|
|
792
|
+
# Pattern 2: Preference patterns
|
|
793
|
+
preference_indicators = {
|
|
794
|
+
"concise": "brief, concise responses",
|
|
795
|
+
"detailed": "comprehensive, detailed responses",
|
|
796
|
+
"example": "responses with examples",
|
|
797
|
+
"step by step": "step-by-step explanations",
|
|
798
|
+
"code": "code-focused responses",
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
for indicator, preference in preference_indicators.items():
|
|
802
|
+
occurrences = sum(1 for m in user_messages if indicator in m.content.lower())
|
|
803
|
+
if occurrences >= 2:
|
|
804
|
+
pattern = UserPattern(
|
|
805
|
+
pattern_type=PatternType.PREFERENCE,
|
|
806
|
+
trigger=indicator,
|
|
807
|
+
action=f"User prefers {preference}",
|
|
808
|
+
confidence=min(0.9, 0.5 + (0.1 * occurrences)),
|
|
809
|
+
occurrences=occurrences,
|
|
810
|
+
last_seen=datetime.now(),
|
|
811
|
+
context={"preference_type": indicator},
|
|
812
|
+
)
|
|
813
|
+
state.add_pattern(pattern)
|
|
814
|
+
|
|
815
|
+
# Pattern 3: Conditional patterns (error -> debug)
|
|
816
|
+
conditional_triggers = [
|
|
817
|
+
("error", "debug", "When errors occur, user asks for debugging"),
|
|
818
|
+
("failed", "fix", "When tests fail, user asks for fixes"),
|
|
819
|
+
("slow", "optimize", "When performance issues arise, user asks for optimization"),
|
|
820
|
+
]
|
|
821
|
+
|
|
822
|
+
for condition, response_keyword, description in conditional_triggers:
|
|
823
|
+
for i, msg in enumerate(user_messages[:-1]):
|
|
824
|
+
if condition in msg.content.lower():
|
|
825
|
+
next_msg = user_messages[i + 1].content.lower()
|
|
826
|
+
if response_keyword in next_msg:
|
|
827
|
+
pattern = UserPattern(
|
|
828
|
+
pattern_type=PatternType.CONDITIONAL,
|
|
829
|
+
trigger=condition,
|
|
830
|
+
action=description,
|
|
831
|
+
confidence=0.7,
|
|
832
|
+
occurrences=1,
|
|
833
|
+
last_seen=datetime.now(),
|
|
834
|
+
context={"condition": condition, "response": response_keyword},
|
|
835
|
+
)
|
|
836
|
+
state.add_pattern(pattern)
|
|
837
|
+
|
|
838
|
+
logger.debug(
|
|
839
|
+
f"Pattern detection complete. Detected {len(state.detected_patterns)} patterns.",
|
|
840
|
+
)
|
|
841
|
+
|
|
842
|
+
except Exception as e:
|
|
843
|
+
# Pattern detection should never break the main flow
|
|
844
|
+
logger.warning(f"Pattern detection error (non-critical): {e}")
|
|
845
|
+
|
|
846
|
+
def update_trust(self, user_id: str, outcome: str, magnitude: float = 1.0):
|
|
847
|
+
"""Update trust level based on interaction outcome.
|
|
734
848
|
|
|
735
849
|
Args:
|
|
736
850
|
user_id: User identifier
|
|
737
851
|
outcome: "success" or "failure"
|
|
738
852
|
magnitude: How much to adjust (0.0 to 1.0)
|
|
853
|
+
|
|
739
854
|
"""
|
|
740
855
|
state = self._get_or_create_state(user_id)
|
|
741
856
|
state.update_trust(outcome, magnitude)
|
|
@@ -743,12 +858,12 @@ TASK:
|
|
|
743
858
|
logger.info(f"Trust updated for {user_id}: {outcome} -> {state.trust_level:.2f}")
|
|
744
859
|
|
|
745
860
|
def add_pattern(self, user_id: str, pattern: UserPattern):
|
|
746
|
-
"""
|
|
747
|
-
Manually add a detected pattern.
|
|
861
|
+
"""Manually add a detected pattern.
|
|
748
862
|
|
|
749
863
|
Args:
|
|
750
864
|
user_id: User identifier
|
|
751
865
|
pattern: UserPattern instance
|
|
866
|
+
|
|
752
867
|
"""
|
|
753
868
|
state = self._get_or_create_state(user_id)
|
|
754
869
|
state.add_pattern(pattern)
|
|
@@ -756,14 +871,14 @@ TASK:
|
|
|
756
871
|
logger.info(f"Pattern added for {user_id}: {pattern.pattern_type.value}")
|
|
757
872
|
|
|
758
873
|
def get_statistics(self, user_id: str) -> dict[str, Any]:
|
|
759
|
-
"""
|
|
760
|
-
Get collaboration statistics for user.
|
|
874
|
+
"""Get collaboration statistics for user.
|
|
761
875
|
|
|
762
876
|
Args:
|
|
763
877
|
user_id: User identifier
|
|
764
878
|
|
|
765
879
|
Returns:
|
|
766
880
|
Dictionary with stats
|
|
881
|
+
|
|
767
882
|
"""
|
|
768
883
|
state = self._get_or_create_state(user_id)
|
|
769
884
|
return state.get_statistics()
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Git Pattern Extractor
|
|
1
|
+
"""Git Pattern Extractor
|
|
3
2
|
|
|
4
3
|
Automatically detects bug fixes from git commits and creates
|
|
5
4
|
draft pattern entries for review.
|
|
@@ -32,8 +31,7 @@ logger = logging.getLogger(__name__)
|
|
|
32
31
|
|
|
33
32
|
|
|
34
33
|
class GitPatternExtractor:
|
|
35
|
-
"""
|
|
36
|
-
Extracts bug fix patterns from git commits.
|
|
34
|
+
"""Extracts bug fix patterns from git commits.
|
|
37
35
|
|
|
38
36
|
Analyzes commit messages and diffs to detect common
|
|
39
37
|
fix patterns, then creates draft pattern files.
|
|
@@ -104,14 +102,14 @@ class GitPatternExtractor:
|
|
|
104
102
|
}
|
|
105
103
|
|
|
106
104
|
def extract_from_recent_commits(self, num_commits: int = 1) -> list[dict[str, Any]]:
|
|
107
|
-
"""
|
|
108
|
-
Extract patterns from recent git commits.
|
|
105
|
+
"""Extract patterns from recent git commits.
|
|
109
106
|
|
|
110
107
|
Args:
|
|
111
108
|
num_commits: Number of recent commits to analyze
|
|
112
109
|
|
|
113
110
|
Returns:
|
|
114
111
|
List of detected pattern dicts
|
|
112
|
+
|
|
115
113
|
"""
|
|
116
114
|
patterns = []
|
|
117
115
|
|
|
@@ -138,11 +136,11 @@ class GitPatternExtractor:
|
|
|
138
136
|
return patterns
|
|
139
137
|
|
|
140
138
|
def extract_from_staged(self) -> list[dict[str, Any]]:
|
|
141
|
-
"""
|
|
142
|
-
Extract patterns from currently staged changes.
|
|
139
|
+
"""Extract patterns from currently staged changes.
|
|
143
140
|
|
|
144
141
|
Returns:
|
|
145
142
|
List of detected pattern dicts
|
|
143
|
+
|
|
146
144
|
"""
|
|
147
145
|
diff = self._get_staged_diff()
|
|
148
146
|
if not diff:
|
|
@@ -158,14 +156,14 @@ class GitPatternExtractor:
|
|
|
158
156
|
return self._analyze_diff(diff, commit_info)
|
|
159
157
|
|
|
160
158
|
def save_pattern(self, pattern: dict[str, Any]) -> Path | None:
|
|
161
|
-
"""
|
|
162
|
-
Save a detected pattern as a draft for review.
|
|
159
|
+
"""Save a detected pattern as a draft for review.
|
|
163
160
|
|
|
164
161
|
Args:
|
|
165
162
|
pattern: Pattern dict from extraction
|
|
166
163
|
|
|
167
164
|
Returns:
|
|
168
165
|
Path to saved file, or None if failed
|
|
166
|
+
|
|
169
167
|
"""
|
|
170
168
|
self.debugging_dir.mkdir(parents=True, exist_ok=True)
|
|
171
169
|
|
|
@@ -175,7 +173,7 @@ class GitPatternExtractor:
|
|
|
175
173
|
"date": datetime.now().isoformat(),
|
|
176
174
|
"file_path": pattern.get("file", "unknown"),
|
|
177
175
|
"error_type": pattern.get("type", "unknown"),
|
|
178
|
-
"error_message": f"
|
|
176
|
+
"error_message": f"From commit: {pattern.get('commit_message', '')[:80]}",
|
|
179
177
|
"root_cause": "", # To be filled by user
|
|
180
178
|
"fix_applied": pattern.get("description", ""),
|
|
181
179
|
"fix_code": pattern.get("code_sample", ""),
|
|
@@ -201,6 +199,7 @@ class GitPatternExtractor:
|
|
|
201
199
|
try:
|
|
202
200
|
result = subprocess.run(
|
|
203
201
|
["git", "log", "-1", "--format=%H%n%s%n%an%n%aI", ref],
|
|
202
|
+
check=False,
|
|
204
203
|
capture_output=True,
|
|
205
204
|
text=True,
|
|
206
205
|
timeout=5,
|
|
@@ -226,6 +225,7 @@ class GitPatternExtractor:
|
|
|
226
225
|
try:
|
|
227
226
|
result = subprocess.run(
|
|
228
227
|
["git", "diff", ref1, ref2],
|
|
228
|
+
check=False,
|
|
229
229
|
capture_output=True,
|
|
230
230
|
text=True,
|
|
231
231
|
timeout=10,
|
|
@@ -239,6 +239,7 @@ class GitPatternExtractor:
|
|
|
239
239
|
try:
|
|
240
240
|
result = subprocess.run(
|
|
241
241
|
["git", "diff", "--cached"],
|
|
242
|
+
check=False,
|
|
242
243
|
capture_output=True,
|
|
243
244
|
text=True,
|
|
244
245
|
timeout=10,
|
|
@@ -252,6 +253,7 @@ class GitPatternExtractor:
|
|
|
252
253
|
try:
|
|
253
254
|
result = subprocess.run(
|
|
254
255
|
["git", "config", key],
|
|
256
|
+
check=False,
|
|
255
257
|
capture_output=True,
|
|
256
258
|
text=True,
|
|
257
259
|
timeout=5,
|
|
@@ -286,7 +288,9 @@ class GitPatternExtractor:
|
|
|
286
288
|
# Process previous file
|
|
287
289
|
if current_file and added_lines:
|
|
288
290
|
file_patterns = self._detect_fix_patterns(
|
|
289
|
-
current_file,
|
|
291
|
+
current_file,
|
|
292
|
+
added_lines,
|
|
293
|
+
commit_info,
|
|
290
294
|
)
|
|
291
295
|
patterns.extend(file_patterns)
|
|
292
296
|
|
|
@@ -334,7 +338,7 @@ class GitPatternExtractor:
|
|
|
334
338
|
"matches_count": len(matches),
|
|
335
339
|
"author": commit_info.get("author", "unknown"),
|
|
336
340
|
"date": commit_info.get("date", datetime.now().isoformat()),
|
|
337
|
-
}
|
|
341
|
+
},
|
|
338
342
|
)
|
|
339
343
|
|
|
340
344
|
return detected
|
empathy_llm_toolkit/levels.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Empathy Level Definitions
|
|
1
|
+
"""Empathy Level Definitions
|
|
3
2
|
|
|
4
3
|
Defines behavior for each of the 5 empathy levels.
|
|
5
4
|
|
|
@@ -11,8 +10,7 @@ from enum import IntEnum
|
|
|
11
10
|
|
|
12
11
|
|
|
13
12
|
class EmpathyLevel(IntEnum):
|
|
14
|
-
"""
|
|
15
|
-
The 5 levels of AI-human collaboration empathy.
|
|
13
|
+
"""The 5 levels of AI-human collaboration empathy.
|
|
16
14
|
|
|
17
15
|
Each level builds on previous levels.
|
|
18
16
|
"""
|
|
@@ -38,7 +36,6 @@ class EmpathyLevel(IntEnum):
|
|
|
38
36
|
@classmethod
|
|
39
37
|
def get_system_prompt(cls, level: int) -> str:
|
|
40
38
|
"""Get system prompt for operating at specific level"""
|
|
41
|
-
|
|
42
39
|
base = """You are an AI assistant using the Empathy Framework for collaboration.
|
|
43
40
|
|
|
44
41
|
Your responses should be:
|
|
@@ -117,8 +114,7 @@ Pattern contribution:
|
|
|
117
114
|
|
|
118
115
|
@classmethod
|
|
119
116
|
def get_temperature_recommendation(cls, level: int) -> float:
|
|
120
|
-
"""
|
|
121
|
-
Get recommended temperature for each level.
|
|
117
|
+
"""Get recommended temperature for each level.
|
|
122
118
|
|
|
123
119
|
Higher levels benefit from lower temperature (more focused).
|
|
124
120
|
"""
|
|
@@ -133,8 +129,7 @@ Pattern contribution:
|
|
|
133
129
|
|
|
134
130
|
@classmethod
|
|
135
131
|
def get_required_context(cls, level: int) -> dict[str, bool]:
|
|
136
|
-
"""
|
|
137
|
-
Get context requirements for each level.
|
|
132
|
+
"""Get context requirements for each level.
|
|
138
133
|
|
|
139
134
|
Returns dict of {context_type: required}
|
|
140
135
|
"""
|
|
@@ -175,8 +170,7 @@ Pattern contribution:
|
|
|
175
170
|
|
|
176
171
|
@classmethod
|
|
177
172
|
def get_max_tokens_recommendation(cls, level: int) -> int:
|
|
178
|
-
"""
|
|
179
|
-
Get recommended max_tokens for each level.
|
|
173
|
+
"""Get recommended max_tokens for each level.
|
|
180
174
|
|
|
181
175
|
Higher levels often need longer responses.
|
|
182
176
|
"""
|
|
@@ -190,8 +184,7 @@ Pattern contribution:
|
|
|
190
184
|
|
|
191
185
|
@classmethod
|
|
192
186
|
def should_use_json_mode(cls, level: int) -> bool:
|
|
193
|
-
"""
|
|
194
|
-
Determine if JSON mode is beneficial for level.
|
|
187
|
+
"""Determine if JSON mode is beneficial for level.
|
|
195
188
|
|
|
196
189
|
Levels 4-5 benefit from structured output.
|
|
197
190
|
"""
|