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/cost_tracker.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Cost Tracking for Empathy Framework
|
|
1
|
+
"""Cost Tracking for Empathy Framework
|
|
3
2
|
|
|
4
3
|
Tracks API costs across model tiers and calculates savings from
|
|
5
4
|
smart model routing (Haiku/Sonnet/Opus selection).
|
|
@@ -10,6 +9,8 @@ Features:
|
|
|
10
9
|
- Generate weekly/monthly reports
|
|
11
10
|
- Integrate with `empathy costs` and `empathy morning` commands
|
|
12
11
|
|
|
12
|
+
Model pricing is sourced from empathy_os.models.MODEL_REGISTRY.
|
|
13
|
+
|
|
13
14
|
Copyright 2025 Smart-AI-Memory
|
|
14
15
|
Licensed under Fair Source License 0.9
|
|
15
16
|
"""
|
|
@@ -17,32 +18,49 @@ Licensed under Fair Source License 0.9
|
|
|
17
18
|
import json
|
|
18
19
|
from datetime import datetime, timedelta
|
|
19
20
|
from pathlib import Path
|
|
21
|
+
from typing import Any
|
|
22
|
+
|
|
23
|
+
# Import pricing from unified registry
|
|
24
|
+
from empathy_os.models import MODEL_REGISTRY
|
|
25
|
+
from empathy_os.models.registry import TIER_PRICING
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _build_model_pricing() -> dict[str, dict[str, float]]:
|
|
29
|
+
"""Build MODEL_PRICING from unified registry."""
|
|
30
|
+
pricing: dict[str, dict[str, float]] = {}
|
|
31
|
+
|
|
32
|
+
# Add all models from registry
|
|
33
|
+
for provider_models in MODEL_REGISTRY.values():
|
|
34
|
+
for model_info in provider_models.values():
|
|
35
|
+
pricing[model_info.id] = {
|
|
36
|
+
"input": model_info.input_cost_per_million,
|
|
37
|
+
"output": model_info.output_cost_per_million,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
# Add tier aliases from registry
|
|
41
|
+
pricing.update(TIER_PRICING)
|
|
42
|
+
|
|
43
|
+
# Add legacy model names for backward compatibility
|
|
44
|
+
legacy_models = {
|
|
45
|
+
"claude-3-haiku-20240307": {"input": 0.25, "output": 1.25},
|
|
46
|
+
"claude-3-5-sonnet-20241022": {"input": 3.00, "output": 15.00},
|
|
47
|
+
"claude-opus-4-20250514": {"input": 15.00, "output": 75.00},
|
|
48
|
+
"gpt-4-turbo": {"input": 10.00, "output": 30.00},
|
|
49
|
+
}
|
|
50
|
+
pricing.update(legacy_models)
|
|
51
|
+
|
|
52
|
+
return pricing
|
|
20
53
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"claude-3-haiku-20240307": {"input": 0.25, "output": 1.25},
|
|
25
|
-
"claude-3-5-haiku-20241022": {"input": 0.80, "output": 4.00},
|
|
26
|
-
"claude-3-5-sonnet-20241022": {"input": 3.00, "output": 15.00},
|
|
27
|
-
"claude-sonnet-4-20250514": {"input": 3.00, "output": 15.00},
|
|
28
|
-
"claude-opus-4-20250514": {"input": 15.00, "output": 75.00},
|
|
29
|
-
# Tier aliases (for backward compatibility)
|
|
30
|
-
"cheap": {"input": 0.25, "output": 1.25},
|
|
31
|
-
"capable": {"input": 3.00, "output": 15.00},
|
|
32
|
-
"premium": {"input": 15.00, "output": 75.00},
|
|
33
|
-
# OpenAI models (for comparison)
|
|
34
|
-
"gpt-4o": {"input": 2.50, "output": 10.00},
|
|
35
|
-
"gpt-4o-mini": {"input": 0.15, "output": 0.60},
|
|
36
|
-
"gpt-4-turbo": {"input": 10.00, "output": 30.00},
|
|
37
|
-
}
|
|
54
|
+
|
|
55
|
+
# Pricing per million tokens - sourced from unified registry
|
|
56
|
+
MODEL_PRICING = _build_model_pricing()
|
|
38
57
|
|
|
39
58
|
# Default premium model for baseline comparison
|
|
40
|
-
BASELINE_MODEL = "claude-opus-4-
|
|
59
|
+
BASELINE_MODEL = "claude-opus-4-5-20251101"
|
|
41
60
|
|
|
42
61
|
|
|
43
62
|
class CostTracker:
|
|
44
|
-
"""
|
|
45
|
-
Tracks API costs and calculates savings from model routing.
|
|
63
|
+
"""Tracks API costs and calculates savings from model routing.
|
|
46
64
|
|
|
47
65
|
Usage:
|
|
48
66
|
tracker = CostTracker()
|
|
@@ -51,11 +69,11 @@ class CostTracker:
|
|
|
51
69
|
"""
|
|
52
70
|
|
|
53
71
|
def __init__(self, storage_dir: str = ".empathy"):
|
|
54
|
-
"""
|
|
55
|
-
Initialize cost tracker.
|
|
72
|
+
"""Initialize cost tracker.
|
|
56
73
|
|
|
57
74
|
Args:
|
|
58
75
|
storage_dir: Directory for cost data storage
|
|
76
|
+
|
|
59
77
|
"""
|
|
60
78
|
self.storage_dir = Path(storage_dir)
|
|
61
79
|
self.storage_dir.mkdir(parents=True, exist_ok=True)
|
|
@@ -89,8 +107,7 @@ class CostTracker:
|
|
|
89
107
|
json.dump(self.data, f, indent=2)
|
|
90
108
|
|
|
91
109
|
def _calculate_cost(self, model: str, input_tokens: int, output_tokens: int) -> float:
|
|
92
|
-
"""
|
|
93
|
-
Calculate cost for a request.
|
|
110
|
+
"""Calculate cost for a request.
|
|
94
111
|
|
|
95
112
|
Args:
|
|
96
113
|
model: Model name or tier
|
|
@@ -99,8 +116,9 @@ class CostTracker:
|
|
|
99
116
|
|
|
100
117
|
Returns:
|
|
101
118
|
Cost in USD
|
|
119
|
+
|
|
102
120
|
"""
|
|
103
|
-
pricing = MODEL_PRICING.get(model
|
|
121
|
+
pricing = MODEL_PRICING.get(model) or MODEL_PRICING["capable"]
|
|
104
122
|
input_cost = (input_tokens / 1_000_000) * pricing["input"]
|
|
105
123
|
output_cost = (output_tokens / 1_000_000) * pricing["output"]
|
|
106
124
|
return input_cost + output_cost
|
|
@@ -113,8 +131,7 @@ class CostTracker:
|
|
|
113
131
|
task_type: str = "unknown",
|
|
114
132
|
tier: str | None = None,
|
|
115
133
|
) -> dict:
|
|
116
|
-
"""
|
|
117
|
-
Log an API request with cost tracking.
|
|
134
|
+
"""Log an API request with cost tracking.
|
|
118
135
|
|
|
119
136
|
Args:
|
|
120
137
|
model: Model name used
|
|
@@ -125,6 +142,7 @@ class CostTracker:
|
|
|
125
142
|
|
|
126
143
|
Returns:
|
|
127
144
|
Request record with cost information
|
|
145
|
+
|
|
128
146
|
"""
|
|
129
147
|
actual_cost = self._calculate_cost(model, input_tokens, output_tokens)
|
|
130
148
|
baseline_cost = self._calculate_cost(BASELINE_MODEL, input_tokens, output_tokens)
|
|
@@ -175,25 +193,24 @@ class CostTracker:
|
|
|
175
193
|
"""Determine tier from model name."""
|
|
176
194
|
if "haiku" in model.lower():
|
|
177
195
|
return "cheap"
|
|
178
|
-
|
|
196
|
+
if "opus" in model.lower():
|
|
179
197
|
return "premium"
|
|
180
|
-
|
|
181
|
-
return "capable"
|
|
198
|
+
return "capable"
|
|
182
199
|
|
|
183
200
|
def get_summary(self, days: int = 7) -> dict:
|
|
184
|
-
"""
|
|
185
|
-
Get cost summary for recent period.
|
|
201
|
+
"""Get cost summary for recent period.
|
|
186
202
|
|
|
187
203
|
Args:
|
|
188
204
|
days: Number of days to include
|
|
189
205
|
|
|
190
206
|
Returns:
|
|
191
207
|
Summary with totals and savings percentage
|
|
208
|
+
|
|
192
209
|
"""
|
|
193
210
|
cutoff = datetime.now() - timedelta(days=days)
|
|
194
211
|
cutoff_str = cutoff.strftime("%Y-%m-%d")
|
|
195
212
|
|
|
196
|
-
totals = {
|
|
213
|
+
totals: dict[str, Any] = {
|
|
197
214
|
"days": days,
|
|
198
215
|
"requests": 0,
|
|
199
216
|
"input_tokens": 0,
|
|
@@ -226,7 +243,8 @@ class CostTracker:
|
|
|
226
243
|
# Calculate savings percentage
|
|
227
244
|
if totals["baseline_cost"] > 0:
|
|
228
245
|
totals["savings_percent"] = round(
|
|
229
|
-
(totals["savings"] / totals["baseline_cost"]) * 100,
|
|
246
|
+
(totals["savings"] / totals["baseline_cost"]) * 100,
|
|
247
|
+
1,
|
|
230
248
|
)
|
|
231
249
|
else:
|
|
232
250
|
totals["savings_percent"] = 0
|
|
@@ -234,14 +252,14 @@ class CostTracker:
|
|
|
234
252
|
return totals
|
|
235
253
|
|
|
236
254
|
def get_report(self, days: int = 7) -> str:
|
|
237
|
-
"""
|
|
238
|
-
Generate a formatted cost report.
|
|
255
|
+
"""Generate a formatted cost report.
|
|
239
256
|
|
|
240
257
|
Args:
|
|
241
258
|
days: Number of days to include
|
|
242
259
|
|
|
243
260
|
Returns:
|
|
244
261
|
Formatted report string
|
|
262
|
+
|
|
245
263
|
"""
|
|
246
264
|
summary = self.get_summary(days)
|
|
247
265
|
|
|
@@ -272,7 +290,7 @@ class CostTracker:
|
|
|
272
290
|
[
|
|
273
291
|
"BY MODEL TIER",
|
|
274
292
|
"-" * 40,
|
|
275
|
-
]
|
|
293
|
+
],
|
|
276
294
|
)
|
|
277
295
|
for tier, count in sorted(summary["by_tier"].items(), key=lambda x: -x[1]):
|
|
278
296
|
if count > 0:
|
|
@@ -286,7 +304,7 @@ class CostTracker:
|
|
|
286
304
|
[
|
|
287
305
|
"BY TASK TYPE (Top 5)",
|
|
288
306
|
"-" * 40,
|
|
289
|
-
]
|
|
307
|
+
],
|
|
290
308
|
)
|
|
291
309
|
sorted_tasks = sorted(summary["by_task"].items(), key=lambda x: -x[1])[:5]
|
|
292
310
|
for task, count in sorted_tasks:
|
|
@@ -300,25 +318,27 @@ class CostTracker:
|
|
|
300
318
|
" for simple tasks and Opus only when needed.",
|
|
301
319
|
"=" * 60,
|
|
302
320
|
"",
|
|
303
|
-
]
|
|
321
|
+
],
|
|
304
322
|
)
|
|
305
323
|
|
|
306
324
|
return "\n".join(lines)
|
|
307
325
|
|
|
308
|
-
def get_today(self) -> dict:
|
|
326
|
+
def get_today(self) -> dict[str, int | float]:
|
|
309
327
|
"""Get today's cost summary."""
|
|
310
328
|
today = datetime.now().strftime("%Y-%m-%d")
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
329
|
+
daily_totals = self.data.get("daily_totals", {})
|
|
330
|
+
default: dict[str, int | float] = {
|
|
331
|
+
"requests": 0,
|
|
332
|
+
"input_tokens": 0,
|
|
333
|
+
"output_tokens": 0,
|
|
334
|
+
"actual_cost": 0,
|
|
335
|
+
"baseline_cost": 0,
|
|
336
|
+
"savings": 0,
|
|
337
|
+
}
|
|
338
|
+
if isinstance(daily_totals, dict) and today in daily_totals:
|
|
339
|
+
result = daily_totals[today]
|
|
340
|
+
return result if isinstance(result, dict) else default
|
|
341
|
+
return default
|
|
322
342
|
|
|
323
343
|
|
|
324
344
|
def cmd_costs(args):
|
|
@@ -355,8 +375,7 @@ def log_request(
|
|
|
355
375
|
task_type: str = "unknown",
|
|
356
376
|
tier: str | None = None,
|
|
357
377
|
) -> dict:
|
|
358
|
-
"""
|
|
359
|
-
Convenience function to log a request to the global tracker.
|
|
378
|
+
"""Convenience function to log a request to the global tracker.
|
|
360
379
|
|
|
361
380
|
Usage:
|
|
362
381
|
from empathy_os.cost_tracker import log_request
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Visual Dashboard for Empathy Framework
|
|
2
|
+
|
|
3
|
+
Web-based view of patterns, costs, and health trends.
|
|
4
|
+
|
|
5
|
+
Usage:
|
|
6
|
+
empathy dashboard
|
|
7
|
+
# Opens browser to http://localhost:8765
|
|
8
|
+
|
|
9
|
+
Copyright 2025 Smart-AI-Memory
|
|
10
|
+
Licensed under Fair Source License 0.9
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from empathy_os.dashboard.server import cmd_dashboard, run_dashboard
|
|
14
|
+
|
|
15
|
+
__all__ = ["cmd_dashboard", "run_dashboard"]
|