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.
Files changed (328) hide show
  1. coach_wizards/__init__.py +11 -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 +22 -25
  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.2.3.dist-info → empathy_framework-3.8.2.dist-info}/METADATA +513 -58
  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-3.2.3.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 +177 -22
  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 +51 -49
  64. empathy_llm_toolkit/git_pattern_extractor.py +16 -12
  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 +13 -11
  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 +18 -20
  86. empathy_llm_toolkit/state.py +20 -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 +76 -77
  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} +27 -27
  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 +515 -109
  105. empathy_os/cli_unified.py +189 -42
  106. empathy_os/config/__init__.py +63 -0
  107. empathy_os/config/xml_config.py +239 -0
  108. empathy_os/config.py +87 -36
  109. empathy_os/coordination.py +48 -54
  110. empathy_os/core.py +90 -99
  111. empathy_os/cost_tracker.py +20 -23
  112. empathy_os/dashboard/__init__.py +15 -0
  113. empathy_os/dashboard/server.py +743 -0
  114. empathy_os/discovery.py +9 -11
  115. empathy_os/emergence.py +20 -21
  116. empathy_os/exceptions.py +18 -30
  117. empathy_os/feedback_loops.py +27 -30
  118. empathy_os/levels.py +31 -34
  119. empathy_os/leverage_points.py +27 -28
  120. empathy_os/logging_config.py +11 -12
  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 +29 -28
  160. empathy_os/persistence.py +30 -34
  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 +53 -56
  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 +12 -11
  192. empathy_os/trust/__init__.py +28 -0
  193. empathy_os/trust/circuit_breaker.py +579 -0
  194. empathy_os/trust_building.py +44 -36
  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} +123 -31
  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 +35 -26
  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-3.2.3.dist-info/RECORD +0 -104
  324. empathy_framework-3.2.3.dist-info/entry_points.txt +0 -7
  325. empathy_llm_toolkit/htmlcov/status.json +0 -1
  326. empathy_llm_toolkit/security/htmlcov/status.json +0 -1
  327. {empathy_framework-3.2.3.dist-info → empathy_framework-3.8.2.dist-info}/WHEEL +0 -0
  328. {empathy_framework-3.2.3.dist-info → empathy_framework-3.8.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,382 @@
1
+ """Unified Model Registry - Single Source of Truth
2
+
3
+ This module provides a centralized model configuration that is consumed by:
4
+ - empathy_llm_toolkit.routing.ModelRouter (via compatibility properties)
5
+ - src/empathy_os/workflows.config.WorkflowConfig
6
+ - src/empathy_os.cost_tracker
7
+
8
+ Pricing is stored in per-million tokens (industry standard) with computed
9
+ properties for per-1k compatibility with legacy code.
10
+
11
+ Copyright 2025 Smart-AI-Memory
12
+ Licensed under Fair Source License 0.9
13
+ """
14
+
15
+ from dataclasses import dataclass
16
+ from enum import Enum
17
+ from typing import Any
18
+
19
+
20
+ class ModelTier(Enum):
21
+ """Model tier classification for routing.
22
+
23
+ CHEAP: Fast, low-cost models for simple tasks (~$0.15-1.00/M input)
24
+ CAPABLE: Balanced models for most development work (~$2.50-3.00/M input)
25
+ PREMIUM: Highest capability for complex reasoning (~$15.00/M input)
26
+ """
27
+
28
+ CHEAP = "cheap"
29
+ CAPABLE = "capable"
30
+ PREMIUM = "premium"
31
+
32
+
33
+ class ModelProvider(Enum):
34
+ """Supported model providers."""
35
+
36
+ ANTHROPIC = "anthropic"
37
+ OPENAI = "openai"
38
+ GOOGLE = "google"
39
+ OLLAMA = "ollama"
40
+ HYBRID = "hybrid"
41
+ CUSTOM = "custom"
42
+
43
+
44
+ @dataclass(frozen=True)
45
+ class ModelInfo:
46
+ """Unified model information - single source of truth.
47
+
48
+ Pricing is stored in per-million tokens format. Use the cost_per_1k_*
49
+ properties for compatibility with code expecting per-1k pricing.
50
+
51
+ Attributes:
52
+ id: Model identifier (e.g., "claude-3-5-haiku-20241022")
53
+ provider: Provider name (e.g., "anthropic")
54
+ tier: Tier level (e.g., "cheap")
55
+ input_cost_per_million: Input token cost per million tokens
56
+ output_cost_per_million: Output token cost per million tokens
57
+ max_tokens: Maximum output tokens
58
+ supports_vision: Whether model supports vision/images
59
+ supports_tools: Whether model supports tool/function calling
60
+
61
+ """
62
+
63
+ id: str
64
+ provider: str
65
+ tier: str
66
+ input_cost_per_million: float
67
+ output_cost_per_million: float
68
+ max_tokens: int = 4096
69
+ supports_vision: bool = False
70
+ supports_tools: bool = True
71
+
72
+ # Compatibility properties for toolkit (per-1k pricing)
73
+ @property
74
+ def model_id(self) -> str:
75
+ """Alias for id - compatibility with ModelRouter.ModelConfig."""
76
+ return self.id
77
+
78
+ @property
79
+ def name(self) -> str:
80
+ """Alias for id - compatibility with WorkflowConfig.ModelConfig."""
81
+ return self.id
82
+
83
+ @property
84
+ def cost_per_1k_input(self) -> float:
85
+ """Input cost per 1k tokens - for ModelRouter compatibility."""
86
+ return self.input_cost_per_million / 1000
87
+
88
+ @property
89
+ def cost_per_1k_output(self) -> float:
90
+ """Output cost per 1k tokens - for ModelRouter compatibility."""
91
+ return self.output_cost_per_million / 1000
92
+
93
+ def to_router_config(self) -> dict[str, Any]:
94
+ """Convert to ModelRouter.ModelConfig compatible dict."""
95
+ return {
96
+ "model_id": self.id,
97
+ "cost_per_1k_input": self.cost_per_1k_input,
98
+ "cost_per_1k_output": self.cost_per_1k_output,
99
+ "max_tokens": self.max_tokens,
100
+ "supports_tools": self.supports_tools,
101
+ }
102
+
103
+ def to_workflow_config(self) -> dict[str, Any]:
104
+ """Convert to WorkflowConfig.ModelConfig compatible dict."""
105
+ return {
106
+ "name": self.id,
107
+ "provider": self.provider,
108
+ "tier": self.tier,
109
+ "input_cost_per_million": self.input_cost_per_million,
110
+ "output_cost_per_million": self.output_cost_per_million,
111
+ "max_tokens": self.max_tokens,
112
+ "supports_vision": self.supports_vision,
113
+ "supports_tools": self.supports_tools,
114
+ }
115
+
116
+ def to_cost_tracker_pricing(self) -> dict[str, float]:
117
+ """Convert to cost_tracker MODEL_PRICING format."""
118
+ return {
119
+ "input": self.input_cost_per_million,
120
+ "output": self.output_cost_per_million,
121
+ }
122
+
123
+
124
+ # =============================================================================
125
+ # MODEL REGISTRY - Single Source of Truth
126
+ # =============================================================================
127
+ # All model configurations are defined here. Other modules should import
128
+ # from this registry rather than defining their own model configs.
129
+
130
+ MODEL_REGISTRY: dict[str, dict[str, ModelInfo]] = {
131
+ # -------------------------------------------------------------------------
132
+ # Anthropic Claude Models
133
+ # -------------------------------------------------------------------------
134
+ "anthropic": {
135
+ "cheap": ModelInfo(
136
+ id="claude-3-5-haiku-20241022",
137
+ provider="anthropic",
138
+ tier="cheap",
139
+ input_cost_per_million=0.80,
140
+ output_cost_per_million=4.00,
141
+ max_tokens=8192,
142
+ supports_vision=False,
143
+ supports_tools=True,
144
+ ),
145
+ "capable": ModelInfo(
146
+ id="claude-sonnet-4-20250514",
147
+ provider="anthropic",
148
+ tier="capable",
149
+ input_cost_per_million=3.00,
150
+ output_cost_per_million=15.00,
151
+ max_tokens=8192,
152
+ supports_vision=True,
153
+ supports_tools=True,
154
+ ),
155
+ "premium": ModelInfo(
156
+ id="claude-opus-4-5-20251101",
157
+ provider="anthropic",
158
+ tier="premium",
159
+ input_cost_per_million=15.00,
160
+ output_cost_per_million=75.00,
161
+ max_tokens=8192,
162
+ supports_vision=True,
163
+ supports_tools=True,
164
+ ),
165
+ },
166
+ # -------------------------------------------------------------------------
167
+ # OpenAI Models
168
+ # -------------------------------------------------------------------------
169
+ "openai": {
170
+ "cheap": ModelInfo(
171
+ id="gpt-4o-mini",
172
+ provider="openai",
173
+ tier="cheap",
174
+ input_cost_per_million=0.15,
175
+ output_cost_per_million=0.60,
176
+ max_tokens=4096,
177
+ supports_vision=False,
178
+ supports_tools=True,
179
+ ),
180
+ "capable": ModelInfo(
181
+ id="gpt-4o",
182
+ provider="openai",
183
+ tier="capable",
184
+ input_cost_per_million=2.50,
185
+ output_cost_per_million=10.00,
186
+ max_tokens=4096,
187
+ supports_vision=True,
188
+ supports_tools=True,
189
+ ),
190
+ "premium": ModelInfo(
191
+ id="o1",
192
+ provider="openai",
193
+ tier="premium",
194
+ input_cost_per_million=15.00,
195
+ output_cost_per_million=60.00,
196
+ max_tokens=32768,
197
+ supports_vision=False,
198
+ supports_tools=False, # o1 doesn't support tools yet
199
+ ),
200
+ },
201
+ # -------------------------------------------------------------------------
202
+ # Google Gemini Models
203
+ # Key feature: Massive context windows (1M-2M tokens)
204
+ # Model recommendations by tier:
205
+ # cheap: gemini-2.0-flash-exp (1M context, fast, very cheap)
206
+ # capable: gemini-1.5-pro (2M context, excellent for large codebases)
207
+ # premium: gemini-2.5-pro (Google's most capable reasoning model)
208
+ # -------------------------------------------------------------------------
209
+ "google": {
210
+ "cheap": ModelInfo(
211
+ id="gemini-2.0-flash-exp",
212
+ provider="google",
213
+ tier="cheap",
214
+ input_cost_per_million=0.10,
215
+ output_cost_per_million=0.40,
216
+ max_tokens=8192,
217
+ supports_vision=True,
218
+ supports_tools=True,
219
+ ),
220
+ "capable": ModelInfo(
221
+ id="gemini-1.5-pro",
222
+ provider="google",
223
+ tier="capable",
224
+ input_cost_per_million=1.25,
225
+ output_cost_per_million=5.00,
226
+ max_tokens=8192,
227
+ supports_vision=True,
228
+ supports_tools=True,
229
+ ),
230
+ "premium": ModelInfo(
231
+ id="gemini-2.5-pro",
232
+ provider="google",
233
+ tier="premium",
234
+ input_cost_per_million=1.25,
235
+ output_cost_per_million=10.00,
236
+ max_tokens=8192,
237
+ supports_vision=True,
238
+ supports_tools=True,
239
+ ),
240
+ },
241
+ # -------------------------------------------------------------------------
242
+ # Ollama (Local) Models - Zero cost
243
+ # Model recommendations by tier:
244
+ # cheap: Small, fast models (3B params) - llama3.2:3b
245
+ # capable: Mid-size models (8B params) - llama3.1:8b
246
+ # premium: Large models (70B params) - llama3.1:70b
247
+ # Users need to pull models: ollama pull llama3.2:3b llama3.1:8b llama3.1:70b
248
+ # -------------------------------------------------------------------------
249
+ "ollama": {
250
+ "cheap": ModelInfo(
251
+ id="llama3.2:3b",
252
+ provider="ollama",
253
+ tier="cheap",
254
+ input_cost_per_million=0.0,
255
+ output_cost_per_million=0.0,
256
+ max_tokens=4096,
257
+ supports_vision=False,
258
+ supports_tools=True,
259
+ ),
260
+ "capable": ModelInfo(
261
+ id="llama3.1:8b",
262
+ provider="ollama",
263
+ tier="capable",
264
+ input_cost_per_million=0.0,
265
+ output_cost_per_million=0.0,
266
+ max_tokens=8192,
267
+ supports_vision=False,
268
+ supports_tools=True,
269
+ ),
270
+ "premium": ModelInfo(
271
+ id="llama3.1:70b",
272
+ provider="ollama",
273
+ tier="premium",
274
+ input_cost_per_million=0.0,
275
+ output_cost_per_million=0.0,
276
+ max_tokens=8192,
277
+ supports_vision=False,
278
+ supports_tools=True,
279
+ ),
280
+ },
281
+ # -------------------------------------------------------------------------
282
+ # Hybrid - Mix of best models from different providers
283
+ # -------------------------------------------------------------------------
284
+ "hybrid": {
285
+ "cheap": ModelInfo(
286
+ id="gpt-4o-mini", # OpenAI - cheapest per token
287
+ provider="openai",
288
+ tier="cheap",
289
+ input_cost_per_million=0.15,
290
+ output_cost_per_million=0.60,
291
+ max_tokens=4096,
292
+ supports_vision=False,
293
+ supports_tools=True,
294
+ ),
295
+ "capable": ModelInfo(
296
+ id="claude-sonnet-4-20250514", # Anthropic - best reasoning
297
+ provider="anthropic",
298
+ tier="capable",
299
+ input_cost_per_million=3.00,
300
+ output_cost_per_million=15.00,
301
+ max_tokens=8192,
302
+ supports_vision=True,
303
+ supports_tools=True,
304
+ ),
305
+ "premium": ModelInfo(
306
+ id="claude-opus-4-5-20251101", # Anthropic - best overall
307
+ provider="anthropic",
308
+ tier="premium",
309
+ input_cost_per_million=15.00,
310
+ output_cost_per_million=75.00,
311
+ max_tokens=8192,
312
+ supports_vision=True,
313
+ supports_tools=True,
314
+ ),
315
+ },
316
+ }
317
+
318
+
319
+ # =============================================================================
320
+ # HELPER FUNCTIONS
321
+ # =============================================================================
322
+
323
+
324
+ def get_model(provider: str, tier: str) -> ModelInfo | None:
325
+ """Get model info for a provider/tier combination.
326
+
327
+ Args:
328
+ provider: Provider name (anthropic, openai, ollama, hybrid)
329
+ tier: Tier level (cheap, capable, premium)
330
+
331
+ Returns:
332
+ ModelInfo if found, None otherwise
333
+
334
+ """
335
+ provider_models = MODEL_REGISTRY.get(provider.lower())
336
+ if provider_models is None:
337
+ return None
338
+ return provider_models.get(tier.lower())
339
+
340
+
341
+ def get_all_models() -> dict[str, dict[str, ModelInfo]]:
342
+ """Get the complete model registry."""
343
+ return MODEL_REGISTRY
344
+
345
+
346
+ def get_pricing_for_model(model_id: str) -> dict[str, float] | None:
347
+ """Get pricing for a model by its ID.
348
+
349
+ Args:
350
+ model_id: Model identifier (e.g., "claude-3-5-haiku-20241022")
351
+
352
+ Returns:
353
+ Dict with 'input' and 'output' keys (per-million pricing), or None
354
+
355
+ """
356
+ for provider_models in MODEL_REGISTRY.values():
357
+ for model_info in provider_models.values():
358
+ if model_info.id == model_id:
359
+ return model_info.to_cost_tracker_pricing()
360
+ return None
361
+
362
+
363
+ def get_supported_providers() -> list[str]:
364
+ """Get list of supported provider names."""
365
+ return list(MODEL_REGISTRY.keys())
366
+
367
+
368
+ def get_tiers() -> list[str]:
369
+ """Get list of available tiers."""
370
+ return [tier.value for tier in ModelTier]
371
+
372
+
373
+ # =============================================================================
374
+ # TIER PRICING (for backward compatibility with cost_tracker)
375
+ # =============================================================================
376
+ # These are tier-level pricing aliases for when specific model isn't known
377
+
378
+ TIER_PRICING: dict[str, dict[str, float]] = {
379
+ "cheap": {"input": 0.80, "output": 4.00}, # Haiku 3.5 pricing
380
+ "capable": {"input": 3.00, "output": 15.00}, # Sonnet 4 pricing
381
+ "premium": {"input": 15.00, "output": 75.00}, # Opus 4.5 pricing
382
+ }
@@ -0,0 +1,302 @@
1
+ """Shared Task-Type Schema for Empathy Framework
2
+
3
+ Provides a unified vocabulary for task types across:
4
+ - empathy_llm_toolkit.routing.ModelRouter
5
+ - src/empathy_os/workflows.WorkflowBase
6
+ - empathy_software_plugin.wizards.MultiModelWizard
7
+
8
+ This module defines:
9
+ - TaskType enum with canonical task names
10
+ - Task-to-tier mappings
11
+ - Task normalization and lookup functions
12
+
13
+ Copyright 2025 Smart-AI-Memory
14
+ Licensed under Fair Source License 0.9
15
+ """
16
+
17
+ from dataclasses import dataclass
18
+ from enum import Enum
19
+
20
+ from .registry import ModelTier
21
+
22
+
23
+ class TaskType(Enum):
24
+ """Canonical task types for model routing.
25
+
26
+ Tasks are organized by their typical tier:
27
+ - CHEAP tier: Simple, fast tasks
28
+ - CAPABLE tier: Standard development work
29
+ - PREMIUM tier: Complex reasoning and coordination
30
+ """
31
+
32
+ # =========================================================================
33
+ # CHEAP TIER TASKS (~$0.15-1.00/M input)
34
+ # Fast models for simple, well-defined tasks
35
+ # =========================================================================
36
+ SUMMARIZE = "summarize"
37
+ CLASSIFY = "classify"
38
+ TRIAGE = "triage"
39
+ MATCH_PATTERN = "match_pattern"
40
+ EXTRACT_TOPICS = "extract_topics"
41
+ LINT_CHECK = "lint_check"
42
+ FORMAT_CODE = "format_code"
43
+ SIMPLE_QA = "simple_qa"
44
+ CATEGORIZE = "categorize"
45
+
46
+ # =========================================================================
47
+ # CAPABLE TIER TASKS (~$2.50-3.00/M input)
48
+ # Balanced models for standard development work
49
+ # =========================================================================
50
+ GENERATE_CODE = "generate_code"
51
+ FIX_BUG = "fix_bug"
52
+ REVIEW_SECURITY = "review_security"
53
+ ANALYZE_PERFORMANCE = "analyze_performance"
54
+ WRITE_TESTS = "write_tests"
55
+ REFACTOR = "refactor"
56
+ EXPLAIN_CODE = "explain_code"
57
+ DOCUMENT_CODE = "document_code"
58
+ ANALYZE_ERROR = "analyze_error"
59
+ SUGGEST_FIX = "suggest_fix"
60
+
61
+ # =========================================================================
62
+ # PREMIUM TIER TASKS (~$15.00/M input)
63
+ # Highest capability for complex reasoning
64
+ # =========================================================================
65
+ COORDINATE = "coordinate"
66
+ SYNTHESIZE_RESULTS = "synthesize_results"
67
+ ARCHITECTURAL_DECISION = "architectural_decision"
68
+ NOVEL_PROBLEM = "novel_problem"
69
+ FINAL_REVIEW = "final_review"
70
+ COMPLEX_REASONING = "complex_reasoning"
71
+ MULTI_STEP_PLANNING = "multi_step_planning"
72
+ CRITICAL_DECISION = "critical_decision"
73
+
74
+
75
+ @dataclass(frozen=True)
76
+ class TaskInfo:
77
+ """Information about a task type."""
78
+
79
+ task_type: TaskType
80
+ tier: ModelTier
81
+ description: str
82
+
83
+
84
+ # =============================================================================
85
+ # TASK-TO-TIER MAPPINGS
86
+ # =============================================================================
87
+
88
+ # Cheap tier tasks
89
+ CHEAP_TASKS: frozenset[str] = frozenset(
90
+ [
91
+ TaskType.SUMMARIZE.value,
92
+ TaskType.CLASSIFY.value,
93
+ TaskType.TRIAGE.value,
94
+ TaskType.MATCH_PATTERN.value,
95
+ TaskType.EXTRACT_TOPICS.value,
96
+ TaskType.LINT_CHECK.value,
97
+ TaskType.FORMAT_CODE.value,
98
+ TaskType.SIMPLE_QA.value,
99
+ TaskType.CATEGORIZE.value,
100
+ ],
101
+ )
102
+
103
+ # Capable tier tasks
104
+ CAPABLE_TASKS: frozenset[str] = frozenset(
105
+ [
106
+ TaskType.GENERATE_CODE.value,
107
+ TaskType.FIX_BUG.value,
108
+ TaskType.REVIEW_SECURITY.value,
109
+ TaskType.ANALYZE_PERFORMANCE.value,
110
+ TaskType.WRITE_TESTS.value,
111
+ TaskType.REFACTOR.value,
112
+ TaskType.EXPLAIN_CODE.value,
113
+ TaskType.DOCUMENT_CODE.value,
114
+ TaskType.ANALYZE_ERROR.value,
115
+ TaskType.SUGGEST_FIX.value,
116
+ ],
117
+ )
118
+
119
+ # Premium tier tasks
120
+ PREMIUM_TASKS: frozenset[str] = frozenset(
121
+ [
122
+ TaskType.COORDINATE.value,
123
+ TaskType.SYNTHESIZE_RESULTS.value,
124
+ TaskType.ARCHITECTURAL_DECISION.value,
125
+ TaskType.NOVEL_PROBLEM.value,
126
+ TaskType.FINAL_REVIEW.value,
127
+ TaskType.COMPLEX_REASONING.value,
128
+ TaskType.MULTI_STEP_PLANNING.value,
129
+ TaskType.CRITICAL_DECISION.value,
130
+ ],
131
+ )
132
+
133
+ # Complete mapping for lookup
134
+ TASK_TIER_MAP: dict[str, ModelTier] = {
135
+ **dict.fromkeys(CHEAP_TASKS, ModelTier.CHEAP),
136
+ **dict.fromkeys(CAPABLE_TASKS, ModelTier.CAPABLE),
137
+ **dict.fromkeys(PREMIUM_TASKS, ModelTier.PREMIUM),
138
+ }
139
+
140
+
141
+ # =============================================================================
142
+ # HELPER FUNCTIONS
143
+ # =============================================================================
144
+
145
+
146
+ def normalize_task_type(task_type: str) -> str:
147
+ """Normalize a task type string for lookup.
148
+
149
+ Converts to lowercase and normalizes separators to underscores.
150
+
151
+ Args:
152
+ task_type: Task type string (e.g., "Fix-Bug", "fix bug", "FIX_BUG")
153
+
154
+ Returns:
155
+ Normalized task type (e.g., "fix_bug")
156
+
157
+ """
158
+ return task_type.lower().replace("-", "_").replace(" ", "_")
159
+
160
+
161
+ def get_tier_for_task(task_type: str | TaskType) -> ModelTier:
162
+ """Get the appropriate tier for a task type.
163
+
164
+ Args:
165
+ task_type: Task type string or TaskType enum
166
+
167
+ Returns:
168
+ ModelTier for the task (defaults to CAPABLE for unknown tasks)
169
+
170
+ Example:
171
+ >>> get_tier_for_task("summarize")
172
+ ModelTier.CHEAP
173
+ >>> get_tier_for_task("fix_bug")
174
+ ModelTier.CAPABLE
175
+ >>> get_tier_for_task("coordinate")
176
+ ModelTier.PREMIUM
177
+ >>> get_tier_for_task("unknown_task")
178
+ ModelTier.CAPABLE
179
+
180
+ """
181
+ # Handle TaskType enum
182
+ if isinstance(task_type, TaskType):
183
+ task_str = task_type.value
184
+ else:
185
+ task_str = normalize_task_type(task_type)
186
+
187
+ # Lookup in mapping
188
+ return TASK_TIER_MAP.get(task_str, ModelTier.CAPABLE)
189
+
190
+
191
+ def get_tasks_for_tier(tier: ModelTier) -> list[str]:
192
+ """Get all task types for a given tier.
193
+
194
+ Args:
195
+ tier: ModelTier to get tasks for
196
+
197
+ Returns:
198
+ List of task type strings
199
+
200
+ """
201
+ if tier == ModelTier.CHEAP:
202
+ return list(CHEAP_TASKS)
203
+ if tier == ModelTier.CAPABLE:
204
+ return list(CAPABLE_TASKS)
205
+ if tier == ModelTier.PREMIUM:
206
+ return list(PREMIUM_TASKS)
207
+ return []
208
+
209
+
210
+ def get_all_tasks() -> dict[str, list[str]]:
211
+ """Get all known task types organized by tier.
212
+
213
+ Returns:
214
+ Dict mapping tier name to list of task types
215
+
216
+ """
217
+ return {
218
+ "cheap": list(CHEAP_TASKS),
219
+ "capable": list(CAPABLE_TASKS),
220
+ "premium": list(PREMIUM_TASKS),
221
+ }
222
+
223
+
224
+ def is_known_task(task_type: str) -> bool:
225
+ """Check if a task type is known/defined.
226
+
227
+ Args:
228
+ task_type: Task type string
229
+
230
+ Returns:
231
+ True if task is defined, False otherwise
232
+
233
+ """
234
+ normalized = normalize_task_type(task_type)
235
+ return normalized in TASK_TIER_MAP
236
+
237
+
238
+ # =============================================================================
239
+ # TASK INFO REGISTRY
240
+ # =============================================================================
241
+ # Detailed information about each task type
242
+
243
+ TASK_INFO: dict[TaskType, TaskInfo] = {
244
+ # Cheap tasks
245
+ TaskType.SUMMARIZE: TaskInfo(
246
+ TaskType.SUMMARIZE,
247
+ ModelTier.CHEAP,
248
+ "Summarize text or code into concise form",
249
+ ),
250
+ TaskType.CLASSIFY: TaskInfo(
251
+ TaskType.CLASSIFY,
252
+ ModelTier.CHEAP,
253
+ "Classify input into predefined categories",
254
+ ),
255
+ TaskType.TRIAGE: TaskInfo(
256
+ TaskType.TRIAGE,
257
+ ModelTier.CHEAP,
258
+ "Quick assessment and prioritization",
259
+ ),
260
+ TaskType.SIMPLE_QA: TaskInfo(
261
+ TaskType.SIMPLE_QA,
262
+ ModelTier.CHEAP,
263
+ "Answer simple, factual questions",
264
+ ),
265
+ # Capable tasks
266
+ TaskType.GENERATE_CODE: TaskInfo(
267
+ TaskType.GENERATE_CODE,
268
+ ModelTier.CAPABLE,
269
+ "Generate new code from requirements",
270
+ ),
271
+ TaskType.FIX_BUG: TaskInfo(
272
+ TaskType.FIX_BUG,
273
+ ModelTier.CAPABLE,
274
+ "Identify and fix bugs in code",
275
+ ),
276
+ TaskType.REVIEW_SECURITY: TaskInfo(
277
+ TaskType.REVIEW_SECURITY,
278
+ ModelTier.CAPABLE,
279
+ "Review code for security vulnerabilities",
280
+ ),
281
+ TaskType.WRITE_TESTS: TaskInfo(
282
+ TaskType.WRITE_TESTS,
283
+ ModelTier.CAPABLE,
284
+ "Write unit or integration tests",
285
+ ),
286
+ # Premium tasks
287
+ TaskType.COORDINATE: TaskInfo(
288
+ TaskType.COORDINATE,
289
+ ModelTier.PREMIUM,
290
+ "Coordinate multi-agent workflows",
291
+ ),
292
+ TaskType.ARCHITECTURAL_DECISION: TaskInfo(
293
+ TaskType.ARCHITECTURAL_DECISION,
294
+ ModelTier.PREMIUM,
295
+ "Make complex architectural decisions",
296
+ ),
297
+ TaskType.COMPLEX_REASONING: TaskInfo(
298
+ TaskType.COMPLEX_REASONING,
299
+ ModelTier.PREMIUM,
300
+ "Handle complex multi-step reasoning",
301
+ ),
302
+ }