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
@@ -0,0 +1,600 @@
1
+ """Workflow Configuration
2
+
3
+ Provides flexible configuration for workflow model selection:
4
+ - YAML/JSON config file support
5
+ - Environment variable overrides
6
+ - Per-workflow provider and model customization
7
+ - Easy extension for new models/providers
8
+
9
+ Configuration priority (highest to lowest):
10
+ 1. Constructor arguments
11
+ 2. Environment variables (EMPATHY_WORKFLOW_PROVIDER, etc.)
12
+ 3. Config file (.empathy/workflows.yaml)
13
+ 4. Built-in defaults
14
+
15
+ Model configurations are sourced from the unified registry at
16
+ empathy_os.models.MODEL_REGISTRY.
17
+
18
+ Copyright 2025 Smart-AI-Memory
19
+ Licensed under Fair Source License 0.9
20
+ """
21
+
22
+ import json
23
+ import os
24
+ from dataclasses import dataclass, field
25
+ from pathlib import Path
26
+ from typing import Any
27
+
28
+ # Import from unified registry
29
+ from empathy_os.models import MODEL_REGISTRY, ModelInfo
30
+ from empathy_os.models.registry import ModelProvider, ModelTier
31
+
32
+ # Try to import yaml, fall back gracefully
33
+ try:
34
+ import yaml
35
+
36
+ YAML_AVAILABLE = True
37
+ except ImportError:
38
+ YAML_AVAILABLE = False
39
+
40
+
41
+ # Re-export for backward compatibility
42
+ __all__ = [
43
+ "DEFAULT_MODELS",
44
+ "ModelConfig",
45
+ "ModelProvider",
46
+ "ModelTier",
47
+ "WorkflowConfig",
48
+ "get_model",
49
+ ]
50
+
51
+
52
+ @dataclass
53
+ class ModelConfig:
54
+ """Configuration for a specific model.
55
+
56
+ Note: This class is kept for backward compatibility. New code should
57
+ use empathy_os.models.ModelInfo from the unified registry.
58
+ """
59
+
60
+ name: str
61
+ provider: str
62
+ tier: str
63
+ input_cost_per_million: float = 0.0
64
+ output_cost_per_million: float = 0.0
65
+ max_tokens: int = 4096
66
+ supports_vision: bool = False
67
+ supports_tools: bool = True
68
+
69
+ @classmethod
70
+ def from_model_info(cls, info: ModelInfo) -> "ModelConfig":
71
+ """Create ModelConfig from unified ModelInfo."""
72
+ return cls(
73
+ name=info.id,
74
+ provider=info.provider,
75
+ tier=info.tier,
76
+ input_cost_per_million=info.input_cost_per_million,
77
+ output_cost_per_million=info.output_cost_per_million,
78
+ max_tokens=info.max_tokens,
79
+ supports_vision=info.supports_vision,
80
+ supports_tools=info.supports_tools,
81
+ )
82
+
83
+
84
+ @dataclass
85
+ class WorkflowConfig:
86
+ """Configuration for workflow model selection and XML prompts."""
87
+
88
+ # Default provider for all workflows
89
+ default_provider: str = "anthropic"
90
+
91
+ # Per-workflow provider overrides
92
+ workflow_providers: dict[str, str] = field(default_factory=dict)
93
+
94
+ # Custom model mappings (provider -> tier -> model)
95
+ custom_models: dict[str, dict[str, str]] = field(default_factory=dict)
96
+
97
+ # Model pricing overrides
98
+ pricing_overrides: dict[str, dict[str, float]] = field(default_factory=dict)
99
+
100
+ # XML prompt configuration - global defaults
101
+ xml_prompt_defaults: dict[str, Any] = field(default_factory=dict)
102
+
103
+ # Per-workflow XML prompt configuration overrides
104
+ workflow_xml_configs: dict[str, dict[str, Any]] = field(default_factory=dict)
105
+
106
+ # ==========================================================================
107
+ # Compliance and Feature Flags
108
+ # ==========================================================================
109
+
110
+ # Compliance mode: "standard" (default) or "hipaa" (healthcare)
111
+ # - standard: PII scrubbing disabled, test-gen disabled
112
+ # - hipaa: PII scrubbing enabled, test-gen enabled, stricter auditing
113
+ compliance_mode: str = "standard"
114
+
115
+ # Explicitly enabled workflows (added to defaults)
116
+ # Use this to opt-in to workflows like "test-gen"
117
+ enabled_workflows: list[str] = field(default_factory=list)
118
+
119
+ # Explicitly disabled workflows (removed from defaults)
120
+ disabled_workflows: list[str] = field(default_factory=list)
121
+
122
+ # PII scrubbing - auto-enabled in hipaa mode, opt-in otherwise
123
+ pii_scrubbing_enabled: bool | None = None # None = use compliance_mode default
124
+
125
+ # Audit logging level - "standard", "enhanced", or "hipaa"
126
+ audit_level: str = "standard"
127
+
128
+ @classmethod
129
+ def load(cls, config_path: str | Path | None = None) -> "WorkflowConfig":
130
+ """Load workflow configuration from file and environment.
131
+
132
+ Args:
133
+ config_path: Optional path to config file. If None, searches:
134
+ 1. .empathy/workflows.yaml
135
+ 2. .empathy/workflows.json
136
+ 3. empathy.config.yaml (workflows section)
137
+
138
+ Returns:
139
+ WorkflowConfig instance
140
+
141
+ """
142
+ config_data: dict[str, Any] = {}
143
+
144
+ # Search for config file
145
+ if config_path is None:
146
+ search_paths = [
147
+ Path(".empathy/workflows.yaml"),
148
+ Path(".empathy/workflows.yml"),
149
+ Path(".empathy/workflows.json"),
150
+ Path("empathy.config.yml"), # Main config file
151
+ Path("empathy.config.yaml"),
152
+ ]
153
+ for path in search_paths:
154
+ if path.exists():
155
+ config_path = path
156
+ break
157
+
158
+ # Load from file if found
159
+ if config_path is not None:
160
+ config_path = Path(config_path)
161
+ if config_path.exists():
162
+ config_data = cls._load_file(config_path)
163
+
164
+ # Apply environment variable overrides
165
+ config_data = cls._apply_env_overrides(config_data)
166
+
167
+ return cls(
168
+ default_provider=config_data.get("default_provider", "anthropic"),
169
+ workflow_providers=config_data.get("workflow_providers", {}),
170
+ custom_models=config_data.get("custom_models", {}),
171
+ pricing_overrides=config_data.get("pricing_overrides", {}),
172
+ xml_prompt_defaults=config_data.get("xml_prompt_defaults", {}),
173
+ workflow_xml_configs=config_data.get("workflow_xml_configs", {}),
174
+ # Compliance and feature flags
175
+ compliance_mode=config_data.get("compliance_mode", "standard"),
176
+ enabled_workflows=config_data.get("enabled_workflows", []),
177
+ disabled_workflows=config_data.get("disabled_workflows", []),
178
+ pii_scrubbing_enabled=config_data.get("pii_scrubbing_enabled"),
179
+ audit_level=config_data.get("audit_level", "standard"),
180
+ )
181
+
182
+ @staticmethod
183
+ def _load_file(path: Path) -> dict[str, Any]:
184
+ """Load config from YAML or JSON file."""
185
+ content = path.read_text()
186
+
187
+ if path.suffix in (".yaml", ".yml"):
188
+ if not YAML_AVAILABLE:
189
+ raise ImportError("PyYAML required for YAML config. Install: pip install pyyaml")
190
+ data = yaml.safe_load(content)
191
+ else:
192
+ data = json.loads(content)
193
+
194
+ result: dict[str, Any] = {}
195
+
196
+ # Handle root-level provider from empathy.config.yml
197
+ if "provider" in data:
198
+ result["default_provider"] = data["provider"]
199
+
200
+ # Handle model_preferences as custom_models
201
+ if "model_preferences" in data:
202
+ provider = data.get("provider", "anthropic")
203
+ result["custom_models"] = {provider: data["model_preferences"]}
204
+
205
+ # Handle nested 'workflows' key from empathy.config.yaml
206
+ if "workflows" in data and isinstance(data["workflows"], dict):
207
+ result.update(data["workflows"])
208
+ elif "workflows" not in data and "provider" not in data:
209
+ # Legacy format: entire file is workflow config
210
+ result = dict(data)
211
+
212
+ return result
213
+
214
+ @staticmethod
215
+ def _apply_env_overrides(config: dict[str, Any]) -> dict[str, Any]:
216
+ """Apply environment variable overrides."""
217
+ # Ensure nested dicts exist (YAML may load them as None)
218
+ if config.get("workflow_providers") is None:
219
+ config["workflow_providers"] = {}
220
+ if config.get("custom_models") is None:
221
+ config["custom_models"] = {}
222
+ if config.get("pricing_overrides") is None:
223
+ config["pricing_overrides"] = {}
224
+
225
+ # EMPATHY_WORKFLOW_PROVIDER - default provider
226
+ env_provider = os.environ.get("EMPATHY_WORKFLOW_PROVIDER")
227
+ if env_provider:
228
+ config["default_provider"] = env_provider.lower()
229
+
230
+ # EMPATHY_WORKFLOW_<NAME>_PROVIDER - per-workflow provider
231
+ for key, value in os.environ.items():
232
+ if key.startswith("EMPATHY_WORKFLOW_") and key.endswith("_PROVIDER"):
233
+ workflow_name = key[17:-9].lower().replace("_", "-")
234
+ config["workflow_providers"][workflow_name] = value.lower()
235
+
236
+ # EMPATHY_MODEL_<TIER> - tier model overrides
237
+ for tier in ["CHEAP", "CAPABLE", "PREMIUM"]:
238
+ env_model = os.environ.get(f"EMPATHY_MODEL_{tier}")
239
+ if env_model:
240
+ if "env" not in config["custom_models"]:
241
+ config["custom_models"]["env"] = {}
242
+ config["custom_models"]["env"][tier.lower()] = env_model
243
+
244
+ return config
245
+
246
+ def get_provider_for_workflow(self, workflow_name: str) -> str:
247
+ """Get the provider for a specific workflow."""
248
+ return self.workflow_providers.get(workflow_name, self.default_provider)
249
+
250
+ def get_model_for_tier(self, provider: str, tier: str) -> str | None:
251
+ """Get custom model for a provider/tier, or None for default."""
252
+ # Check for env overrides first
253
+ if "env" in self.custom_models:
254
+ if tier in self.custom_models["env"]:
255
+ return self.custom_models["env"][tier]
256
+
257
+ # Check provider-specific overrides
258
+ if provider in self.custom_models:
259
+ if tier in self.custom_models[provider]:
260
+ return self.custom_models[provider][tier]
261
+
262
+ return None
263
+
264
+ def get_pricing(self, model: str) -> dict[str, float] | None:
265
+ """Get custom pricing for a model, or None for default."""
266
+ return self.pricing_overrides.get(model)
267
+
268
+ def get_xml_config_for_workflow(self, workflow_name: str) -> dict[str, Any]:
269
+ """Get XML prompt configuration for a specific workflow.
270
+
271
+ Merges global defaults with workflow-specific overrides.
272
+
273
+ Args:
274
+ workflow_name: The workflow name (e.g., "security-audit").
275
+
276
+ Returns:
277
+ Dictionary with XML prompt configuration.
278
+
279
+ """
280
+ # Start with defaults
281
+ config = dict(self.xml_prompt_defaults)
282
+
283
+ # Apply workflow-specific overrides
284
+ if workflow_name in self.workflow_xml_configs:
285
+ config.update(self.workflow_xml_configs[workflow_name])
286
+
287
+ return config
288
+
289
+ def is_xml_enabled_for_workflow(self, workflow_name: str) -> bool:
290
+ """Check if XML prompts are enabled for a workflow.
291
+
292
+ Args:
293
+ workflow_name: The workflow name.
294
+
295
+ Returns:
296
+ True if XML prompts are enabled.
297
+
298
+ """
299
+ config = self.get_xml_config_for_workflow(workflow_name)
300
+ return bool(config.get("enabled", False))
301
+
302
+ # ==========================================================================
303
+ # Compliance and Feature Flag Methods
304
+ # ==========================================================================
305
+
306
+ def is_hipaa_mode(self) -> bool:
307
+ """Check if HIPAA compliance mode is enabled."""
308
+ return self.compliance_mode.lower() == "hipaa"
309
+
310
+ def is_pii_scrubbing_enabled(self) -> bool:
311
+ """Check if PII scrubbing is enabled.
312
+
313
+ Returns True if:
314
+ - Explicitly enabled via pii_scrubbing_enabled=True
315
+ - OR compliance_mode is "hipaa" (and not explicitly disabled)
316
+
317
+ Returns:
318
+ True if PII scrubbing should be active
319
+
320
+ """
321
+ # Explicit setting takes precedence
322
+ if self.pii_scrubbing_enabled is not None:
323
+ return self.pii_scrubbing_enabled
324
+
325
+ # Default based on compliance mode
326
+ return self.is_hipaa_mode()
327
+
328
+ def is_workflow_enabled(self, workflow_name: str) -> bool | None:
329
+ """Check if a specific workflow is enabled.
330
+
331
+ Args:
332
+ workflow_name: Name of the workflow (e.g., "test-gen")
333
+
334
+ Returns:
335
+ True if workflow is enabled, False if disabled, None for default behavior
336
+
337
+ """
338
+ # Explicitly disabled takes precedence
339
+ if workflow_name in self.disabled_workflows:
340
+ return False
341
+
342
+ # Explicitly enabled
343
+ if workflow_name in self.enabled_workflows:
344
+ return True
345
+
346
+ # HIPAA mode enables healthcare-specific workflows
347
+ if self.is_hipaa_mode():
348
+ hipaa_workflows = {"test-gen"} # Workflows auto-enabled in HIPAA mode
349
+ if workflow_name in hipaa_workflows:
350
+ return True
351
+
352
+ # Default: workflow must be in standard registry (handled by __init__.py)
353
+ return None # None means "use default registry behavior"
354
+
355
+ def get_effective_audit_level(self) -> str:
356
+ """Get the effective audit level based on compliance mode.
357
+
358
+ Returns:
359
+ Audit level string: "standard", "enhanced", or "hipaa"
360
+
361
+ """
362
+ # Explicit setting takes precedence
363
+ if self.audit_level != "standard":
364
+ return self.audit_level
365
+
366
+ # HIPAA mode defaults to hipaa audit level
367
+ if self.is_hipaa_mode():
368
+ return "hipaa"
369
+
370
+ return "standard"
371
+
372
+ def save(self, path: str | Path) -> None:
373
+ """Save configuration to file."""
374
+ path = Path(path)
375
+ data = {
376
+ "default_provider": self.default_provider,
377
+ "workflow_providers": self.workflow_providers,
378
+ "custom_models": self.custom_models,
379
+ "pricing_overrides": self.pricing_overrides,
380
+ "xml_prompt_defaults": self.xml_prompt_defaults,
381
+ "workflow_xml_configs": self.workflow_xml_configs,
382
+ # Compliance and feature flags
383
+ "compliance_mode": self.compliance_mode,
384
+ "enabled_workflows": self.enabled_workflows,
385
+ "disabled_workflows": self.disabled_workflows,
386
+ "pii_scrubbing_enabled": self.pii_scrubbing_enabled,
387
+ "audit_level": self.audit_level,
388
+ }
389
+
390
+ path.parent.mkdir(parents=True, exist_ok=True)
391
+
392
+ if path.suffix in (".yaml", ".yml"):
393
+ if not YAML_AVAILABLE:
394
+ raise ImportError("PyYAML required for YAML config")
395
+ with open(path, "w") as f:
396
+ yaml.dump(data, f, default_flow_style=False)
397
+ else:
398
+ with open(path, "w") as f:
399
+ json.dump(data, f, indent=2)
400
+
401
+
402
+ # =============================================================================
403
+ # DEFAULT_MODELS - Built from unified registry
404
+ # =============================================================================
405
+ # This is now populated from empathy_os.models.MODEL_REGISTRY for consistency
406
+ # across the framework.
407
+
408
+
409
+ def _build_default_models() -> dict[str, dict[str, ModelConfig]]:
410
+ """Build DEFAULT_MODELS from the unified registry."""
411
+ result: dict[str, dict[str, ModelConfig]] = {}
412
+ for provider, tiers in MODEL_REGISTRY.items():
413
+ result[provider] = {}
414
+ for tier, info in tiers.items():
415
+ result[provider][tier] = ModelConfig.from_model_info(info)
416
+ return result
417
+
418
+
419
+ # Lazy initialization - built on first access
420
+ _default_models_cache: dict[str, dict[str, ModelConfig]] | None = None
421
+
422
+
423
+ def _get_default_models() -> dict[str, dict[str, ModelConfig]]:
424
+ """Get DEFAULT_MODELS, building from registry if needed."""
425
+ global _default_models_cache
426
+ if _default_models_cache is None:
427
+ _default_models_cache = _build_default_models()
428
+ return _default_models_cache
429
+
430
+
431
+ # For backward compatibility, DEFAULT_MODELS is now a property-like access
432
+ # Users should access via get_default_models() or directly use MODEL_REGISTRY
433
+ DEFAULT_MODELS: dict[str, dict[str, ModelConfig]] = {} # Populated below
434
+
435
+
436
+ def _ensure_default_models() -> None:
437
+ """Ensure DEFAULT_MODELS is populated."""
438
+ global DEFAULT_MODELS
439
+ if not DEFAULT_MODELS:
440
+ DEFAULT_MODELS.update(_get_default_models())
441
+
442
+
443
+ def get_model(provider: str, tier: str, config: WorkflowConfig | None = None) -> str:
444
+ """Get the model name for a provider/tier combination.
445
+
446
+ Args:
447
+ provider: Model provider (anthropic, openai, ollama, hybrid)
448
+ tier: Model tier (cheap, capable, premium)
449
+ config: Optional WorkflowConfig for custom overrides
450
+
451
+ Returns:
452
+ Model name string
453
+
454
+ """
455
+ # Ensure DEFAULT_MODELS is populated from registry
456
+ _ensure_default_models()
457
+
458
+ # Check config overrides first
459
+ if config:
460
+ custom = config.get_model_for_tier(provider, tier)
461
+ if custom:
462
+ return custom
463
+
464
+ # Fall back to defaults
465
+ if provider in DEFAULT_MODELS and tier in DEFAULT_MODELS[provider]:
466
+ return DEFAULT_MODELS[provider][tier].name
467
+
468
+ # Ultimate fallback
469
+ return DEFAULT_MODELS["anthropic"]["capable"].name
470
+
471
+
472
+ def create_example_config() -> str:
473
+ """Generate an example configuration file content."""
474
+ return """# Empathy Framework - Workflow Configuration
475
+ # Place this file at: .empathy/workflows.yaml
476
+
477
+ # =============================================================================
478
+ # PROVIDER SELECTION
479
+ # =============================================================================
480
+ # Choose from: anthropic, openai, ollama, hybrid
481
+ #
482
+ # - anthropic: All Claude models (Haiku → Sonnet → Opus 4.5)
483
+ # - openai: All OpenAI models (GPT-4o-mini → GPT-4o → GPT-5.2)
484
+ # - ollama: Local models (llama3.2:3b → llama3.1:8b → llama3.1:70b)
485
+ # - hybrid: Mix of best models from different providers:
486
+ # cheap: gpt-4o-mini (cheapest)
487
+ # capable: claude-sonnet-4 (best reasoning)
488
+ # premium: claude-opus-4.5 (best overall)
489
+
490
+ default_provider: anthropic
491
+
492
+ # =============================================================================
493
+ # PER-WORKFLOW PROVIDER OVERRIDES
494
+ # =============================================================================
495
+ # Use different providers for specific workflows
496
+ workflow_providers:
497
+ # research: hybrid # Use hybrid for research
498
+ # code-review: anthropic
499
+ # doc-gen: openai
500
+
501
+ # =============================================================================
502
+ # CUSTOM MODEL MAPPINGS
503
+ # =============================================================================
504
+ # Override default models for specific provider/tier combinations
505
+ custom_models:
506
+ anthropic:
507
+ cheap: claude-3-5-haiku-20241022
508
+ capable: claude-sonnet-4-20250514
509
+ premium: claude-opus-4-5-20251101
510
+ openai:
511
+ cheap: gpt-4o-mini
512
+ capable: gpt-4o
513
+ premium: gpt-5.2
514
+ ollama:
515
+ cheap: llama3.2:3b
516
+ capable: llama3.1:8b
517
+ premium: llama3.1:70b
518
+ # Create your own hybrid mix:
519
+ hybrid:
520
+ cheap: gpt-4o-mini # OpenAI - cheapest per token
521
+ capable: claude-sonnet-4-20250514 # Anthropic - best code/reasoning
522
+ premium: claude-opus-4-5-20251101 # Anthropic - best overall
523
+
524
+ # =============================================================================
525
+ # CUSTOM PRICING (per million tokens)
526
+ # =============================================================================
527
+ # Add pricing for models not in the default list
528
+ pricing_overrides:
529
+ mixtral:latest:
530
+ input: 0.0
531
+ output: 0.0
532
+ my-custom-model:
533
+ input: 1.00
534
+ output: 5.00
535
+
536
+ # =============================================================================
537
+ # XML PROMPT CONFIGURATION
538
+ # =============================================================================
539
+ # Enable structured XML prompts for consistent LLM interactions.
540
+ # XML prompts improve parsing reliability for dashboards and automation.
541
+
542
+ # Global defaults for all workflows
543
+ xml_prompt_defaults:
544
+ enabled: false # Set to true to enable XML prompts globally
545
+ schema_version: "1.0" # XML schema version
546
+ enforce_response_xml: false # Require XML in responses
547
+ fallback_on_parse_error: true # Fall back to raw text if XML fails
548
+
549
+ # Per-workflow XML configuration (overrides defaults)
550
+ workflow_xml_configs:
551
+ security-audit:
552
+ enabled: true
553
+ enforce_response_xml: true
554
+ template_name: "security-audit"
555
+ code-review:
556
+ enabled: true
557
+ enforce_response_xml: true
558
+ template_name: "code-review"
559
+ research:
560
+ enabled: true
561
+ enforce_response_xml: false # More flexible for research
562
+ template_name: "research"
563
+ bug-predict:
564
+ enabled: true
565
+ enforce_response_xml: true
566
+ template_name: "bug-analysis"
567
+ perf-audit:
568
+ enabled: true
569
+ enforce_response_xml: true
570
+ template_name: "perf-audit"
571
+ test-gen:
572
+ enabled: true
573
+ enforce_response_xml: true
574
+ template_name: "test-gen"
575
+ doc-gen:
576
+ enabled: true
577
+ enforce_response_xml: true
578
+ template_name: "doc-gen"
579
+ release-prep:
580
+ enabled: true
581
+ enforce_response_xml: true
582
+ template_name: "release-prep"
583
+ dependency-check:
584
+ enabled: true
585
+ enforce_response_xml: true
586
+ template_name: "dependency-check"
587
+ refactor-plan:
588
+ enabled: true
589
+ enforce_response_xml: true
590
+ template_name: "refactor-plan"
591
+
592
+ # =============================================================================
593
+ # ENVIRONMENT VARIABLE OVERRIDES
594
+ # =============================================================================
595
+ # EMPATHY_WORKFLOW_PROVIDER=hybrid # Default provider
596
+ # EMPATHY_WORKFLOW_RESEARCH_PROVIDER=anthropic # Per-workflow
597
+ # EMPATHY_MODEL_CHEAP=gpt-4o-mini # Tier model override
598
+ # EMPATHY_MODEL_CAPABLE=claude-sonnet-4-20250514
599
+ # EMPATHY_MODEL_PREMIUM=claude-opus-4-5-20251101
600
+ """