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.
Files changed (329) hide show
  1. coach_wizards/__init__.py +13 -12
  2. coach_wizards/accessibility_wizard.py +12 -12
  3. coach_wizards/api_wizard.py +12 -12
  4. coach_wizards/base_wizard.py +26 -20
  5. coach_wizards/cicd_wizard.py +15 -13
  6. coach_wizards/code_reviewer_README.md +60 -0
  7. coach_wizards/code_reviewer_wizard.py +180 -0
  8. coach_wizards/compliance_wizard.py +12 -12
  9. coach_wizards/database_wizard.py +12 -12
  10. coach_wizards/debugging_wizard.py +12 -12
  11. coach_wizards/documentation_wizard.py +12 -12
  12. coach_wizards/generate_wizards.py +1 -2
  13. coach_wizards/localization_wizard.py +101 -19
  14. coach_wizards/migration_wizard.py +12 -12
  15. coach_wizards/monitoring_wizard.py +12 -12
  16. coach_wizards/observability_wizard.py +12 -12
  17. coach_wizards/performance_wizard.py +12 -12
  18. coach_wizards/prompt_engineering_wizard.py +661 -0
  19. coach_wizards/refactoring_wizard.py +12 -12
  20. coach_wizards/scaling_wizard.py +12 -12
  21. coach_wizards/security_wizard.py +12 -12
  22. coach_wizards/testing_wizard.py +12 -12
  23. empathy_framework-3.8.2.dist-info/METADATA +1176 -0
  24. empathy_framework-3.8.2.dist-info/RECORD +333 -0
  25. empathy_framework-3.8.2.dist-info/entry_points.txt +22 -0
  26. {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/top_level.txt +5 -1
  27. empathy_healthcare_plugin/__init__.py +1 -2
  28. empathy_healthcare_plugin/monitors/__init__.py +9 -0
  29. empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
  30. empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
  31. empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
  32. empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
  33. empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
  34. empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
  35. empathy_llm_toolkit/__init__.py +7 -7
  36. empathy_llm_toolkit/agent_factory/__init__.py +53 -0
  37. empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
  38. empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
  39. empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
  40. empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
  41. empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
  42. empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
  43. empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
  44. empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
  45. empathy_llm_toolkit/agent_factory/base.py +305 -0
  46. empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
  47. empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
  48. empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
  49. empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
  50. empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
  51. empathy_llm_toolkit/agent_factory/decorators.py +286 -0
  52. empathy_llm_toolkit/agent_factory/factory.py +558 -0
  53. empathy_llm_toolkit/agent_factory/framework.py +192 -0
  54. empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
  55. empathy_llm_toolkit/agent_factory/resilient.py +320 -0
  56. empathy_llm_toolkit/claude_memory.py +14 -15
  57. empathy_llm_toolkit/cli/__init__.py +8 -0
  58. empathy_llm_toolkit/cli/sync_claude.py +487 -0
  59. empathy_llm_toolkit/code_health.py +186 -28
  60. empathy_llm_toolkit/config/__init__.py +29 -0
  61. empathy_llm_toolkit/config/unified.py +295 -0
  62. empathy_llm_toolkit/contextual_patterns.py +11 -12
  63. empathy_llm_toolkit/core.py +168 -53
  64. empathy_llm_toolkit/git_pattern_extractor.py +17 -13
  65. empathy_llm_toolkit/levels.py +6 -13
  66. empathy_llm_toolkit/pattern_confidence.py +14 -18
  67. empathy_llm_toolkit/pattern_resolver.py +10 -12
  68. empathy_llm_toolkit/pattern_summary.py +16 -14
  69. empathy_llm_toolkit/providers.py +194 -28
  70. empathy_llm_toolkit/routing/__init__.py +32 -0
  71. empathy_llm_toolkit/routing/model_router.py +362 -0
  72. empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
  73. empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
  74. empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
  75. empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
  76. empathy_llm_toolkit/security/README.md +262 -0
  77. empathy_llm_toolkit/security/__init__.py +62 -0
  78. empathy_llm_toolkit/security/audit_logger.py +929 -0
  79. empathy_llm_toolkit/security/audit_logger_example.py +152 -0
  80. empathy_llm_toolkit/security/pii_scrubber.py +640 -0
  81. empathy_llm_toolkit/security/secrets_detector.py +678 -0
  82. empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
  83. empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
  84. empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
  85. empathy_llm_toolkit/session_status.py +20 -22
  86. empathy_llm_toolkit/state.py +28 -21
  87. empathy_llm_toolkit/wizards/__init__.py +38 -0
  88. empathy_llm_toolkit/wizards/base_wizard.py +364 -0
  89. empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
  90. empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
  91. empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
  92. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
  93. empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
  94. empathy_os/__init__.py +125 -84
  95. empathy_os/adaptive/__init__.py +13 -0
  96. empathy_os/adaptive/task_complexity.py +127 -0
  97. empathy_os/{monitoring.py → agent_monitoring.py} +28 -28
  98. empathy_os/cache/__init__.py +117 -0
  99. empathy_os/cache/base.py +166 -0
  100. empathy_os/cache/dependency_manager.py +253 -0
  101. empathy_os/cache/hash_only.py +248 -0
  102. empathy_os/cache/hybrid.py +390 -0
  103. empathy_os/cache/storage.py +282 -0
  104. empathy_os/cli.py +1516 -70
  105. empathy_os/cli_unified.py +597 -0
  106. empathy_os/config/__init__.py +63 -0
  107. empathy_os/config/xml_config.py +239 -0
  108. empathy_os/config.py +95 -37
  109. empathy_os/coordination.py +72 -68
  110. empathy_os/core.py +94 -107
  111. empathy_os/cost_tracker.py +74 -55
  112. empathy_os/dashboard/__init__.py +15 -0
  113. empathy_os/dashboard/server.py +743 -0
  114. empathy_os/discovery.py +17 -14
  115. empathy_os/emergence.py +21 -22
  116. empathy_os/exceptions.py +18 -30
  117. empathy_os/feedback_loops.py +30 -33
  118. empathy_os/levels.py +32 -35
  119. empathy_os/leverage_points.py +31 -32
  120. empathy_os/logging_config.py +19 -16
  121. empathy_os/memory/__init__.py +195 -0
  122. empathy_os/memory/claude_memory.py +466 -0
  123. empathy_os/memory/config.py +224 -0
  124. empathy_os/memory/control_panel.py +1298 -0
  125. empathy_os/memory/edges.py +179 -0
  126. empathy_os/memory/graph.py +567 -0
  127. empathy_os/memory/long_term.py +1194 -0
  128. empathy_os/memory/nodes.py +179 -0
  129. empathy_os/memory/redis_bootstrap.py +540 -0
  130. empathy_os/memory/security/__init__.py +31 -0
  131. empathy_os/memory/security/audit_logger.py +930 -0
  132. empathy_os/memory/security/pii_scrubber.py +640 -0
  133. empathy_os/memory/security/secrets_detector.py +678 -0
  134. empathy_os/memory/short_term.py +2119 -0
  135. empathy_os/memory/storage/__init__.py +15 -0
  136. empathy_os/memory/summary_index.py +583 -0
  137. empathy_os/memory/unified.py +619 -0
  138. empathy_os/metrics/__init__.py +12 -0
  139. empathy_os/metrics/prompt_metrics.py +190 -0
  140. empathy_os/models/__init__.py +136 -0
  141. empathy_os/models/__main__.py +13 -0
  142. empathy_os/models/cli.py +655 -0
  143. empathy_os/models/empathy_executor.py +354 -0
  144. empathy_os/models/executor.py +252 -0
  145. empathy_os/models/fallback.py +671 -0
  146. empathy_os/models/provider_config.py +563 -0
  147. empathy_os/models/registry.py +382 -0
  148. empathy_os/models/tasks.py +302 -0
  149. empathy_os/models/telemetry.py +548 -0
  150. empathy_os/models/token_estimator.py +378 -0
  151. empathy_os/models/validation.py +274 -0
  152. empathy_os/monitoring/__init__.py +52 -0
  153. empathy_os/monitoring/alerts.py +23 -0
  154. empathy_os/monitoring/alerts_cli.py +268 -0
  155. empathy_os/monitoring/multi_backend.py +271 -0
  156. empathy_os/monitoring/otel_backend.py +363 -0
  157. empathy_os/optimization/__init__.py +19 -0
  158. empathy_os/optimization/context_optimizer.py +272 -0
  159. empathy_os/pattern_library.py +30 -29
  160. empathy_os/persistence.py +35 -37
  161. empathy_os/platform_utils.py +261 -0
  162. empathy_os/plugins/__init__.py +28 -0
  163. empathy_os/plugins/base.py +361 -0
  164. empathy_os/plugins/registry.py +268 -0
  165. empathy_os/project_index/__init__.py +30 -0
  166. empathy_os/project_index/cli.py +335 -0
  167. empathy_os/project_index/crew_integration.py +430 -0
  168. empathy_os/project_index/index.py +425 -0
  169. empathy_os/project_index/models.py +501 -0
  170. empathy_os/project_index/reports.py +473 -0
  171. empathy_os/project_index/scanner.py +538 -0
  172. empathy_os/prompts/__init__.py +61 -0
  173. empathy_os/prompts/config.py +77 -0
  174. empathy_os/prompts/context.py +177 -0
  175. empathy_os/prompts/parser.py +285 -0
  176. empathy_os/prompts/registry.py +313 -0
  177. empathy_os/prompts/templates.py +208 -0
  178. empathy_os/redis_config.py +144 -58
  179. empathy_os/redis_memory.py +79 -77
  180. empathy_os/resilience/__init__.py +56 -0
  181. empathy_os/resilience/circuit_breaker.py +256 -0
  182. empathy_os/resilience/fallback.py +179 -0
  183. empathy_os/resilience/health.py +300 -0
  184. empathy_os/resilience/retry.py +209 -0
  185. empathy_os/resilience/timeout.py +135 -0
  186. empathy_os/routing/__init__.py +43 -0
  187. empathy_os/routing/chain_executor.py +433 -0
  188. empathy_os/routing/classifier.py +217 -0
  189. empathy_os/routing/smart_router.py +234 -0
  190. empathy_os/routing/wizard_registry.py +307 -0
  191. empathy_os/templates.py +19 -14
  192. empathy_os/trust/__init__.py +28 -0
  193. empathy_os/trust/circuit_breaker.py +579 -0
  194. empathy_os/trust_building.py +67 -58
  195. empathy_os/validation/__init__.py +19 -0
  196. empathy_os/validation/xml_validator.py +281 -0
  197. empathy_os/wizard_factory_cli.py +170 -0
  198. empathy_os/{workflows.py → workflow_commands.py} +131 -37
  199. empathy_os/workflows/__init__.py +360 -0
  200. empathy_os/workflows/base.py +1660 -0
  201. empathy_os/workflows/bug_predict.py +962 -0
  202. empathy_os/workflows/code_review.py +960 -0
  203. empathy_os/workflows/code_review_adapters.py +310 -0
  204. empathy_os/workflows/code_review_pipeline.py +720 -0
  205. empathy_os/workflows/config.py +600 -0
  206. empathy_os/workflows/dependency_check.py +648 -0
  207. empathy_os/workflows/document_gen.py +1069 -0
  208. empathy_os/workflows/documentation_orchestrator.py +1205 -0
  209. empathy_os/workflows/health_check.py +679 -0
  210. empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
  211. empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
  212. empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
  213. empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
  214. empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
  215. empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
  216. empathy_os/workflows/manage_documentation.py +804 -0
  217. empathy_os/workflows/new_sample_workflow1.py +146 -0
  218. empathy_os/workflows/new_sample_workflow1_README.md +150 -0
  219. empathy_os/workflows/perf_audit.py +687 -0
  220. empathy_os/workflows/pr_review.py +748 -0
  221. empathy_os/workflows/progress.py +445 -0
  222. empathy_os/workflows/progress_server.py +322 -0
  223. empathy_os/workflows/refactor_plan.py +693 -0
  224. empathy_os/workflows/release_prep.py +808 -0
  225. empathy_os/workflows/research_synthesis.py +404 -0
  226. empathy_os/workflows/secure_release.py +585 -0
  227. empathy_os/workflows/security_adapters.py +297 -0
  228. empathy_os/workflows/security_audit.py +1046 -0
  229. empathy_os/workflows/step_config.py +234 -0
  230. empathy_os/workflows/test5.py +125 -0
  231. empathy_os/workflows/test5_README.md +158 -0
  232. empathy_os/workflows/test_gen.py +1855 -0
  233. empathy_os/workflows/test_lifecycle.py +526 -0
  234. empathy_os/workflows/test_maintenance.py +626 -0
  235. empathy_os/workflows/test_maintenance_cli.py +590 -0
  236. empathy_os/workflows/test_maintenance_crew.py +821 -0
  237. empathy_os/workflows/xml_enhanced_crew.py +285 -0
  238. empathy_software_plugin/__init__.py +1 -2
  239. empathy_software_plugin/cli/__init__.py +120 -0
  240. empathy_software_plugin/cli/inspect.py +362 -0
  241. empathy_software_plugin/cli.py +49 -27
  242. empathy_software_plugin/plugin.py +4 -8
  243. empathy_software_plugin/wizards/__init__.py +42 -0
  244. empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
  245. empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
  246. empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
  247. empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
  248. empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
  249. empathy_software_plugin/wizards/base_wizard.py +288 -0
  250. empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
  251. empathy_software_plugin/wizards/code_review_wizard.py +606 -0
  252. empathy_software_plugin/wizards/debugging/__init__.py +50 -0
  253. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
  254. empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
  255. empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
  256. empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
  257. empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
  258. empathy_software_plugin/wizards/debugging/verification.py +369 -0
  259. empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
  260. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
  261. empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
  262. empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
  263. empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
  264. empathy_software_plugin/wizards/performance/__init__.py +9 -0
  265. empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
  266. empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
  267. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
  268. empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
  269. empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
  270. empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
  271. empathy_software_plugin/wizards/security/__init__.py +32 -0
  272. empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
  273. empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
  274. empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
  275. empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
  276. empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
  277. empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
  278. empathy_software_plugin/wizards/testing/__init__.py +27 -0
  279. empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
  280. empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
  281. empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
  282. empathy_software_plugin/wizards/testing_wizard.py +274 -0
  283. hot_reload/README.md +473 -0
  284. hot_reload/__init__.py +62 -0
  285. hot_reload/config.py +84 -0
  286. hot_reload/integration.py +228 -0
  287. hot_reload/reloader.py +298 -0
  288. hot_reload/watcher.py +179 -0
  289. hot_reload/websocket.py +176 -0
  290. scaffolding/README.md +589 -0
  291. scaffolding/__init__.py +35 -0
  292. scaffolding/__main__.py +14 -0
  293. scaffolding/cli.py +240 -0
  294. test_generator/__init__.py +38 -0
  295. test_generator/__main__.py +14 -0
  296. test_generator/cli.py +226 -0
  297. test_generator/generator.py +325 -0
  298. test_generator/risk_analyzer.py +216 -0
  299. workflow_patterns/__init__.py +33 -0
  300. workflow_patterns/behavior.py +249 -0
  301. workflow_patterns/core.py +76 -0
  302. workflow_patterns/output.py +99 -0
  303. workflow_patterns/registry.py +255 -0
  304. workflow_patterns/structural.py +288 -0
  305. workflow_scaffolding/__init__.py +11 -0
  306. workflow_scaffolding/__main__.py +12 -0
  307. workflow_scaffolding/cli.py +206 -0
  308. workflow_scaffolding/generator.py +265 -0
  309. agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
  310. agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
  311. agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
  312. agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
  313. agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
  314. agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
  315. agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
  316. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
  317. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
  318. agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
  319. agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
  320. agents/compliance_anticipation_agent.py +0 -1427
  321. agents/epic_integration_wizard.py +0 -541
  322. agents/trust_building_behaviors.py +0 -891
  323. empathy_framework-2.4.0.dist-info/METADATA +0 -485
  324. empathy_framework-2.4.0.dist-info/RECORD +0 -102
  325. empathy_framework-2.4.0.dist-info/entry_points.txt +0 -6
  326. empathy_llm_toolkit/htmlcov/status.json +0 -1
  327. empathy_llm_toolkit/security/htmlcov/status.json +0 -1
  328. {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/WHEEL +0 -0
  329. {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/licenses/LICENSE +0 -0
@@ -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
- # Pricing per million tokens (as of December 2024)
22
- MODEL_PRICING = {
23
- # Anthropic Claude models
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-20250514"
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, MODEL_PRICING.get("capable"))
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
- elif "opus" in model.lower():
196
+ if "opus" in model.lower():
179
197
  return "premium"
180
- else:
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, 1
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
- return self.data.get("daily_totals", {}).get(
312
- today,
313
- {
314
- "requests": 0,
315
- "input_tokens": 0,
316
- "output_tokens": 0,
317
- "actual_cost": 0,
318
- "baseline_cost": 0,
319
- "savings": 0,
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"]