empathy-framework 3.2.3__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 +11 -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 +22 -25
- 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.2.3.dist-info → empathy_framework-3.8.2.dist-info}/METADATA +513 -58
- empathy_framework-3.8.2.dist-info/RECORD +333 -0
- empathy_framework-3.8.2.dist-info/entry_points.txt +22 -0
- {empathy_framework-3.2.3.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 +177 -22
- 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 +51 -49
- empathy_llm_toolkit/git_pattern_extractor.py +16 -12
- 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 +13 -11
- 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 +18 -20
- empathy_llm_toolkit/state.py +20 -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 +76 -77
- empathy_os/adaptive/__init__.py +13 -0
- empathy_os/adaptive/task_complexity.py +127 -0
- empathy_os/{monitoring.py → agent_monitoring.py} +27 -27
- 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 +515 -109
- empathy_os/cli_unified.py +189 -42
- empathy_os/config/__init__.py +63 -0
- empathy_os/config/xml_config.py +239 -0
- empathy_os/config.py +87 -36
- empathy_os/coordination.py +48 -54
- empathy_os/core.py +90 -99
- empathy_os/cost_tracker.py +20 -23
- empathy_os/dashboard/__init__.py +15 -0
- empathy_os/dashboard/server.py +743 -0
- empathy_os/discovery.py +9 -11
- empathy_os/emergence.py +20 -21
- empathy_os/exceptions.py +18 -30
- empathy_os/feedback_loops.py +27 -30
- empathy_os/levels.py +31 -34
- empathy_os/leverage_points.py +27 -28
- empathy_os/logging_config.py +11 -12
- 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 +29 -28
- empathy_os/persistence.py +30 -34
- 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 +53 -56
- 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 +12 -11
- empathy_os/trust/__init__.py +28 -0
- empathy_os/trust/circuit_breaker.py +579 -0
- empathy_os/trust_building.py +44 -36
- 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} +123 -31
- 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 +35 -26
- 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-3.2.3.dist-info/RECORD +0 -104
- empathy_framework-3.2.3.dist-info/entry_points.txt +0 -7
- empathy_llm_toolkit/htmlcov/status.json +0 -1
- empathy_llm_toolkit/security/htmlcov/status.json +0 -1
- {empathy_framework-3.2.3.dist-info → empathy_framework-3.8.2.dist-info}/WHEEL +0 -0
- {empathy_framework-3.2.3.dist-info → empathy_framework-3.8.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Pattern Summary Generator
|
|
1
|
+
"""Pattern Summary Generator
|
|
3
2
|
|
|
4
3
|
Generates a markdown summary of stored patterns for inclusion in CLAUDE.md.
|
|
5
4
|
This enables Claude Code sessions to have context about historical patterns.
|
|
@@ -29,8 +28,7 @@ logger = logging.getLogger(__name__)
|
|
|
29
28
|
|
|
30
29
|
|
|
31
30
|
class PatternSummaryGenerator:
|
|
32
|
-
"""
|
|
33
|
-
Generates markdown summaries of stored patterns.
|
|
31
|
+
"""Generates markdown summaries of stored patterns.
|
|
34
32
|
|
|
35
33
|
Scans the patterns directory and produces a concise summary
|
|
36
34
|
suitable for inclusion in CLAUDE.md via @import.
|
|
@@ -119,11 +117,11 @@ class PatternSummaryGenerator:
|
|
|
119
117
|
return snapshots
|
|
120
118
|
|
|
121
119
|
def generate_markdown(self) -> str:
|
|
122
|
-
"""
|
|
123
|
-
Generate a markdown summary of all patterns.
|
|
120
|
+
"""Generate a markdown summary of all patterns.
|
|
124
121
|
|
|
125
122
|
Returns:
|
|
126
123
|
Markdown string suitable for CLAUDE.md inclusion
|
|
124
|
+
|
|
127
125
|
"""
|
|
128
126
|
if not any([self._bug_patterns, self._security_decisions, self._tech_debt_history]):
|
|
129
127
|
self.load_all_patterns()
|
|
@@ -157,7 +155,7 @@ class PatternSummaryGenerator:
|
|
|
157
155
|
"- **Security**: Check team decisions for false positives",
|
|
158
156
|
"- **Tech Debt**: Consider debt trajectory when planning refactoring work",
|
|
159
157
|
"",
|
|
160
|
-
]
|
|
158
|
+
],
|
|
161
159
|
)
|
|
162
160
|
|
|
163
161
|
return "\n".join(lines)
|
|
@@ -247,7 +245,9 @@ class PatternSummaryGenerator:
|
|
|
247
245
|
|
|
248
246
|
# Sort by date
|
|
249
247
|
sorted_snapshots = sorted(
|
|
250
|
-
self._tech_debt_history,
|
|
248
|
+
self._tech_debt_history,
|
|
249
|
+
key=lambda s: s.get("date", ""),
|
|
250
|
+
reverse=True,
|
|
251
251
|
)
|
|
252
252
|
|
|
253
253
|
# Current state (most recent)
|
|
@@ -295,11 +295,11 @@ class PatternSummaryGenerator:
|
|
|
295
295
|
return lines
|
|
296
296
|
|
|
297
297
|
def write_to_file(self, output_path: str) -> None:
|
|
298
|
-
"""
|
|
299
|
-
Write the markdown summary to a file.
|
|
298
|
+
"""Write the markdown summary to a file.
|
|
300
299
|
|
|
301
300
|
Args:
|
|
302
301
|
output_path: Path to write the summary
|
|
302
|
+
|
|
303
303
|
"""
|
|
304
304
|
output = Path(output_path)
|
|
305
305
|
output.parent.mkdir(parents=True, exist_ok=True)
|
|
@@ -326,7 +326,9 @@ def main():
|
|
|
326
326
|
help="Output file path (default: ./.claude/patterns_summary.md)",
|
|
327
327
|
)
|
|
328
328
|
parser.add_argument(
|
|
329
|
-
"--print",
|
|
329
|
+
"--print",
|
|
330
|
+
action="store_true",
|
|
331
|
+
help="Print to stdout instead of writing to file",
|
|
330
332
|
)
|
|
331
333
|
|
|
332
334
|
args = parser.parse_args()
|
empathy_llm_toolkit/providers.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
LLM Provider Adapters
|
|
1
|
+
"""LLM Provider Adapters
|
|
3
2
|
|
|
4
3
|
Unified interface for different LLM providers (OpenAI, Anthropic, local models).
|
|
5
4
|
|
|
@@ -24,8 +23,7 @@ class LLMResponse:
|
|
|
24
23
|
|
|
25
24
|
|
|
26
25
|
class BaseLLMProvider(ABC):
|
|
27
|
-
"""
|
|
28
|
-
Base class for all LLM providers.
|
|
26
|
+
"""Base class for all LLM providers.
|
|
29
27
|
|
|
30
28
|
Provides unified interface regardless of backend.
|
|
31
29
|
"""
|
|
@@ -43,8 +41,7 @@ class BaseLLMProvider(ABC):
|
|
|
43
41
|
max_tokens: int = 1024,
|
|
44
42
|
**kwargs,
|
|
45
43
|
) -> LLMResponse:
|
|
46
|
-
"""
|
|
47
|
-
Generate response from LLM.
|
|
44
|
+
"""Generate response from LLM.
|
|
48
45
|
|
|
49
46
|
Args:
|
|
50
47
|
messages: List of {"role": "user/assistant", "content": "..."}
|
|
@@ -55,17 +52,15 @@ class BaseLLMProvider(ABC):
|
|
|
55
52
|
|
|
56
53
|
Returns:
|
|
57
54
|
LLMResponse with standardized format
|
|
55
|
+
|
|
58
56
|
"""
|
|
59
|
-
pass
|
|
60
57
|
|
|
61
58
|
@abstractmethod
|
|
62
59
|
def get_model_info(self) -> dict[str, Any]:
|
|
63
60
|
"""Get information about the model being used"""
|
|
64
|
-
pass
|
|
65
61
|
|
|
66
62
|
def estimate_tokens(self, text: str) -> int:
|
|
67
|
-
"""
|
|
68
|
-
Estimate token count for text.
|
|
63
|
+
"""Estimate token count for text.
|
|
69
64
|
|
|
70
65
|
Rough approximation: ~4 chars per token
|
|
71
66
|
"""
|
|
@@ -73,8 +68,7 @@ class BaseLLMProvider(ABC):
|
|
|
73
68
|
|
|
74
69
|
|
|
75
70
|
class AnthropicProvider(BaseLLMProvider):
|
|
76
|
-
"""
|
|
77
|
-
Anthropic (Claude) provider with enhanced features.
|
|
71
|
+
"""Anthropic (Claude) provider with enhanced features.
|
|
78
72
|
|
|
79
73
|
Supports Claude 3 family models with advanced capabilities:
|
|
80
74
|
- Extended context windows (200K tokens)
|
|
@@ -100,7 +94,7 @@ class AnthropicProvider(BaseLLMProvider):
|
|
|
100
94
|
if not api_key or not api_key.strip():
|
|
101
95
|
raise ValueError(
|
|
102
96
|
"API key is required for Anthropic provider. "
|
|
103
|
-
"Provide via api_key parameter or ANTHROPIC_API_KEY environment variable"
|
|
97
|
+
"Provide via api_key parameter or ANTHROPIC_API_KEY environment variable",
|
|
104
98
|
)
|
|
105
99
|
|
|
106
100
|
# Lazy import to avoid requiring anthropic if not used
|
|
@@ -110,7 +104,7 @@ class AnthropicProvider(BaseLLMProvider):
|
|
|
110
104
|
self.client = anthropic.Anthropic(api_key=api_key)
|
|
111
105
|
except ImportError as e:
|
|
112
106
|
raise ImportError(
|
|
113
|
-
"anthropic package required. Install with: pip install anthropic"
|
|
107
|
+
"anthropic package required. Install with: pip install anthropic",
|
|
114
108
|
) from e
|
|
115
109
|
|
|
116
110
|
async def generate(
|
|
@@ -121,15 +115,13 @@ class AnthropicProvider(BaseLLMProvider):
|
|
|
121
115
|
max_tokens: int = 1024,
|
|
122
116
|
**kwargs,
|
|
123
117
|
) -> LLMResponse:
|
|
124
|
-
"""
|
|
125
|
-
Generate response using Anthropic API with enhanced features.
|
|
118
|
+
"""Generate response using Anthropic API with enhanced features.
|
|
126
119
|
|
|
127
120
|
Claude-specific enhancements:
|
|
128
121
|
- Prompt caching for repeated system prompts (90% cost reduction)
|
|
129
122
|
- Extended context (200K tokens) for large codebase analysis
|
|
130
123
|
- Thinking mode for complex reasoning tasks
|
|
131
124
|
"""
|
|
132
|
-
|
|
133
125
|
# Build kwargs for Anthropic
|
|
134
126
|
api_kwargs = {
|
|
135
127
|
"model": self.model,
|
|
@@ -145,7 +137,7 @@ class AnthropicProvider(BaseLLMProvider):
|
|
|
145
137
|
"type": "text",
|
|
146
138
|
"text": system_prompt,
|
|
147
139
|
"cache_control": {"type": "ephemeral"}, # Cache for 5 minutes
|
|
148
|
-
}
|
|
140
|
+
},
|
|
149
141
|
]
|
|
150
142
|
elif system_prompt:
|
|
151
143
|
api_kwargs["system"] = system_prompt
|
|
@@ -202,10 +194,12 @@ class AnthropicProvider(BaseLLMProvider):
|
|
|
202
194
|
)
|
|
203
195
|
|
|
204
196
|
async def analyze_large_codebase(
|
|
205
|
-
self,
|
|
197
|
+
self,
|
|
198
|
+
codebase_files: list[dict[str, str]],
|
|
199
|
+
analysis_prompt: str,
|
|
200
|
+
**kwargs,
|
|
206
201
|
) -> LLMResponse:
|
|
207
|
-
"""
|
|
208
|
-
Analyze large codebases using Claude's 200K context window.
|
|
202
|
+
"""Analyze large codebases using Claude's 200K context window.
|
|
209
203
|
|
|
210
204
|
Claude-specific feature: Can process entire repositories in one call.
|
|
211
205
|
|
|
@@ -216,10 +210,11 @@ class AnthropicProvider(BaseLLMProvider):
|
|
|
216
210
|
|
|
217
211
|
Returns:
|
|
218
212
|
LLMResponse with analysis results
|
|
213
|
+
|
|
219
214
|
"""
|
|
220
215
|
# Build context from all files
|
|
221
216
|
file_context = "\n\n".join(
|
|
222
|
-
[f"# File: {file['path']}\n{file['content']}" for file in codebase_files]
|
|
217
|
+
[f"# File: {file['path']}\n{file['content']}" for file in codebase_files],
|
|
223
218
|
)
|
|
224
219
|
|
|
225
220
|
# Create system prompt with caching for file context
|
|
@@ -287,8 +282,7 @@ class AnthropicProvider(BaseLLMProvider):
|
|
|
287
282
|
|
|
288
283
|
|
|
289
284
|
class OpenAIProvider(BaseLLMProvider):
|
|
290
|
-
"""
|
|
291
|
-
OpenAI provider.
|
|
285
|
+
"""OpenAI provider.
|
|
292
286
|
|
|
293
287
|
Supports GPT-4, GPT-3.5, and other OpenAI models.
|
|
294
288
|
"""
|
|
@@ -301,7 +295,7 @@ class OpenAIProvider(BaseLLMProvider):
|
|
|
301
295
|
if not api_key or not api_key.strip():
|
|
302
296
|
raise ValueError(
|
|
303
297
|
"API key is required for OpenAI provider. "
|
|
304
|
-
"Provide via api_key parameter or OPENAI_API_KEY environment variable"
|
|
298
|
+
"Provide via api_key parameter or OPENAI_API_KEY environment variable",
|
|
305
299
|
)
|
|
306
300
|
|
|
307
301
|
# Lazy import
|
|
@@ -321,7 +315,6 @@ class OpenAIProvider(BaseLLMProvider):
|
|
|
321
315
|
**kwargs,
|
|
322
316
|
) -> LLMResponse:
|
|
323
317
|
"""Generate response using OpenAI API"""
|
|
324
|
-
|
|
325
318
|
# Add system prompt if provided
|
|
326
319
|
if system_prompt:
|
|
327
320
|
messages = [{"role": "system", "content": system_prompt}] + messages
|
|
@@ -372,9 +365,182 @@ class OpenAIProvider(BaseLLMProvider):
|
|
|
372
365
|
)
|
|
373
366
|
|
|
374
367
|
|
|
375
|
-
class
|
|
368
|
+
class GeminiProvider(BaseLLMProvider):
|
|
369
|
+
"""Google Gemini provider with cost tracking integration.
|
|
370
|
+
|
|
371
|
+
Supports Gemini models:
|
|
372
|
+
- gemini-2.0-flash-exp: Fast, cheap tier (1M context)
|
|
373
|
+
- gemini-1.5-pro: Balanced, capable tier (2M context)
|
|
374
|
+
- gemini-2.5-pro: Premium reasoning tier
|
|
376
375
|
"""
|
|
377
|
-
|
|
376
|
+
|
|
377
|
+
def __init__(
|
|
378
|
+
self,
|
|
379
|
+
api_key: str | None = None,
|
|
380
|
+
model: str = "gemini-1.5-pro",
|
|
381
|
+
**kwargs,
|
|
382
|
+
):
|
|
383
|
+
super().__init__(api_key, **kwargs)
|
|
384
|
+
self.model = model
|
|
385
|
+
|
|
386
|
+
# Validate API key is provided
|
|
387
|
+
if not api_key or not api_key.strip():
|
|
388
|
+
raise ValueError(
|
|
389
|
+
"API key is required for Gemini provider. "
|
|
390
|
+
"Provide via api_key parameter or GOOGLE_API_KEY environment variable",
|
|
391
|
+
)
|
|
392
|
+
|
|
393
|
+
# Lazy import to avoid requiring google-generativeai if not used
|
|
394
|
+
try:
|
|
395
|
+
import google.generativeai as genai
|
|
396
|
+
|
|
397
|
+
genai.configure(api_key=api_key)
|
|
398
|
+
self.genai = genai
|
|
399
|
+
self.client = genai.GenerativeModel(model)
|
|
400
|
+
except ImportError as e:
|
|
401
|
+
raise ImportError(
|
|
402
|
+
"google-generativeai package required. Install with: pip install google-generativeai",
|
|
403
|
+
) from e
|
|
404
|
+
|
|
405
|
+
async def generate(
|
|
406
|
+
self,
|
|
407
|
+
messages: list[dict[str, str]],
|
|
408
|
+
system_prompt: str | None = None,
|
|
409
|
+
temperature: float = 0.7,
|
|
410
|
+
max_tokens: int = 1024,
|
|
411
|
+
**kwargs,
|
|
412
|
+
) -> LLMResponse:
|
|
413
|
+
"""Generate response using Google Gemini API.
|
|
414
|
+
|
|
415
|
+
Gemini-specific features:
|
|
416
|
+
- Large context windows (1M-2M tokens)
|
|
417
|
+
- Multimodal support
|
|
418
|
+
- Grounding with Google Search
|
|
419
|
+
"""
|
|
420
|
+
import asyncio
|
|
421
|
+
|
|
422
|
+
# Convert messages to Gemini format
|
|
423
|
+
gemini_messages = []
|
|
424
|
+
for msg in messages:
|
|
425
|
+
role = "user" if msg["role"] == "user" else "model"
|
|
426
|
+
gemini_messages.append({"role": role, "parts": [msg["content"]]})
|
|
427
|
+
|
|
428
|
+
# Build generation config
|
|
429
|
+
generation_config = self.genai.GenerationConfig(
|
|
430
|
+
temperature=temperature,
|
|
431
|
+
max_output_tokens=max_tokens,
|
|
432
|
+
)
|
|
433
|
+
|
|
434
|
+
# Create model with system instruction if provided
|
|
435
|
+
if system_prompt:
|
|
436
|
+
model = self.genai.GenerativeModel(
|
|
437
|
+
self.model,
|
|
438
|
+
system_instruction=system_prompt,
|
|
439
|
+
)
|
|
440
|
+
else:
|
|
441
|
+
model = self.client
|
|
442
|
+
|
|
443
|
+
# Call Gemini API (run sync in thread pool for async compatibility)
|
|
444
|
+
loop = asyncio.get_event_loop()
|
|
445
|
+
response = await loop.run_in_executor(
|
|
446
|
+
None,
|
|
447
|
+
lambda: model.generate_content(
|
|
448
|
+
gemini_messages, # type: ignore[arg-type]
|
|
449
|
+
generation_config=generation_config,
|
|
450
|
+
),
|
|
451
|
+
)
|
|
452
|
+
|
|
453
|
+
# Extract token counts from usage metadata
|
|
454
|
+
input_tokens = 0
|
|
455
|
+
output_tokens = 0
|
|
456
|
+
if hasattr(response, "usage_metadata"):
|
|
457
|
+
input_tokens = getattr(response.usage_metadata, "prompt_token_count", 0)
|
|
458
|
+
output_tokens = getattr(response.usage_metadata, "candidates_token_count", 0)
|
|
459
|
+
|
|
460
|
+
# Log to cost tracker
|
|
461
|
+
try:
|
|
462
|
+
from empathy_os.cost_tracker import log_request
|
|
463
|
+
|
|
464
|
+
tier = self._get_tier()
|
|
465
|
+
log_request(
|
|
466
|
+
model=self.model,
|
|
467
|
+
input_tokens=input_tokens,
|
|
468
|
+
output_tokens=output_tokens,
|
|
469
|
+
task_type=kwargs.get("task_type", "gemini_generate"),
|
|
470
|
+
tier=tier,
|
|
471
|
+
)
|
|
472
|
+
except ImportError:
|
|
473
|
+
pass # Cost tracking not available
|
|
474
|
+
|
|
475
|
+
# Convert to standardized format
|
|
476
|
+
content = ""
|
|
477
|
+
if response.candidates:
|
|
478
|
+
content = response.candidates[0].content.parts[0].text
|
|
479
|
+
|
|
480
|
+
finish_reason = "stop"
|
|
481
|
+
if response.candidates and hasattr(response.candidates[0], "finish_reason"):
|
|
482
|
+
finish_reason = str(response.candidates[0].finish_reason.name).lower()
|
|
483
|
+
|
|
484
|
+
return LLMResponse(
|
|
485
|
+
content=content,
|
|
486
|
+
model=self.model,
|
|
487
|
+
tokens_used=input_tokens + output_tokens,
|
|
488
|
+
finish_reason=finish_reason,
|
|
489
|
+
metadata={
|
|
490
|
+
"input_tokens": input_tokens,
|
|
491
|
+
"output_tokens": output_tokens,
|
|
492
|
+
"provider": "google",
|
|
493
|
+
"model_family": "gemini",
|
|
494
|
+
},
|
|
495
|
+
)
|
|
496
|
+
|
|
497
|
+
def _get_tier(self) -> str:
|
|
498
|
+
"""Determine tier from model name."""
|
|
499
|
+
if "flash" in self.model.lower():
|
|
500
|
+
return "cheap"
|
|
501
|
+
if "2.5" in self.model or "ultra" in self.model.lower():
|
|
502
|
+
return "premium"
|
|
503
|
+
return "capable"
|
|
504
|
+
|
|
505
|
+
def get_model_info(self) -> dict[str, Any]:
|
|
506
|
+
"""Get Gemini model information"""
|
|
507
|
+
model_info = {
|
|
508
|
+
"gemini-2.0-flash-exp": {
|
|
509
|
+
"max_tokens": 1000000,
|
|
510
|
+
"cost_per_1m_input": 0.075,
|
|
511
|
+
"cost_per_1m_output": 0.30,
|
|
512
|
+
"supports_vision": True,
|
|
513
|
+
"ideal_for": "Fast responses, simple tasks, large context",
|
|
514
|
+
},
|
|
515
|
+
"gemini-1.5-pro": {
|
|
516
|
+
"max_tokens": 2000000,
|
|
517
|
+
"cost_per_1m_input": 1.25,
|
|
518
|
+
"cost_per_1m_output": 5.00,
|
|
519
|
+
"supports_vision": True,
|
|
520
|
+
"ideal_for": "Complex reasoning, large codebases",
|
|
521
|
+
},
|
|
522
|
+
"gemini-2.5-pro": {
|
|
523
|
+
"max_tokens": 1000000,
|
|
524
|
+
"cost_per_1m_input": 2.50,
|
|
525
|
+
"cost_per_1m_output": 10.00,
|
|
526
|
+
"supports_vision": True,
|
|
527
|
+
"ideal_for": "Advanced reasoning, complex tasks",
|
|
528
|
+
},
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
return model_info.get(
|
|
532
|
+
self.model,
|
|
533
|
+
{
|
|
534
|
+
"max_tokens": 1000000,
|
|
535
|
+
"cost_per_1m_input": 1.25,
|
|
536
|
+
"cost_per_1m_output": 5.00,
|
|
537
|
+
"supports_vision": True,
|
|
538
|
+
},
|
|
539
|
+
)
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
class LocalProvider(BaseLLMProvider):
|
|
543
|
+
"""Local model provider (Ollama, LM Studio, etc.).
|
|
378
544
|
|
|
379
545
|
For running models locally.
|
|
380
546
|
"""
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Empathy Framework Model Routing
|
|
2
|
+
|
|
3
|
+
Smart routing of tasks to appropriate model tiers for cost optimization:
|
|
4
|
+
- CHEAP tier: Triage, summarization, classification (Haiku/GPT-4o-mini)
|
|
5
|
+
- CAPABLE tier: Code generation, analysis, sub-agent work (Sonnet/GPT-4o)
|
|
6
|
+
- PREMIUM tier: Coordination, synthesis, critical decisions (Opus/o1)
|
|
7
|
+
|
|
8
|
+
Example:
|
|
9
|
+
>>> from empathy_llm_toolkit.routing import ModelRouter
|
|
10
|
+
>>>
|
|
11
|
+
>>> router = ModelRouter()
|
|
12
|
+
>>> model = router.route("summarize", provider="anthropic")
|
|
13
|
+
>>> print(model) # claude-3-5-haiku-20241022
|
|
14
|
+
>>>
|
|
15
|
+
>>> model = router.route("coordinate", provider="anthropic")
|
|
16
|
+
>>> print(model) # claude-opus-4-20250514
|
|
17
|
+
>>>
|
|
18
|
+
>>> cost = router.estimate_cost("fix_bug", input_tokens=5000, output_tokens=1000)
|
|
19
|
+
>>> print(f"Estimated cost: ${cost:.4f}")
|
|
20
|
+
|
|
21
|
+
Copyright 2025 Smart AI Memory, LLC
|
|
22
|
+
Licensed under Fair Source 0.9
|
|
23
|
+
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from .model_router import ModelRouter, ModelTier, TaskRouting
|
|
27
|
+
|
|
28
|
+
__all__ = [
|
|
29
|
+
"ModelRouter",
|
|
30
|
+
"ModelTier",
|
|
31
|
+
"TaskRouting",
|
|
32
|
+
]
|