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,239 @@
1
+ """Configuration system for XML-enhanced prompting features.
2
+
3
+ Provides feature flags and settings for all 6 XML enhancement options:
4
+ 1. Workflow migration settings
5
+ 2. XML schema validation
6
+ 3. Prompt metrics tracking
7
+ 4. Context window optimization
8
+ 5. Dynamic prompt adaptation
9
+ 6. Multi-language support
10
+
11
+ Copyright 2026 Smart-AI-Memory
12
+ Licensed under Fair Source License 0.9
13
+ """
14
+
15
+ import json
16
+ import os
17
+ from dataclasses import asdict, dataclass, field
18
+ from pathlib import Path
19
+
20
+
21
+ @dataclass
22
+ class XMLConfig:
23
+ """XML prompting configuration.
24
+
25
+ Controls XML-enhanced prompt behavior and validation.
26
+ """
27
+
28
+ use_xml_structure: bool = True # Default to XML prompts
29
+ validate_schemas: bool = False # Feature flag for validation
30
+ schema_dir: str = ".empathy/schemas"
31
+ strict_validation: bool = False # Fail on validation errors
32
+
33
+
34
+ @dataclass
35
+ class OptimizationConfig:
36
+ """Context window optimization configuration.
37
+
38
+ Controls prompt compression and token reduction strategies.
39
+ """
40
+
41
+ compression_level: str = "moderate" # none, light, moderate, aggressive
42
+ use_short_tags: bool = True
43
+ strip_whitespace: bool = True
44
+ cache_system_prompts: bool = True
45
+ max_context_tokens: int = 8000
46
+
47
+
48
+ @dataclass
49
+ class AdaptiveConfig:
50
+ """Adaptive prompting configuration.
51
+
52
+ Controls dynamic model tier and compression selection based on task complexity.
53
+ """
54
+
55
+ enable_adaptation: bool = True
56
+ model_tier_mapping: dict[str, str] = field(
57
+ default_factory=lambda: {
58
+ "simple": "gpt-3.5-turbo",
59
+ "moderate": "gpt-4",
60
+ "complex": "gpt-4",
61
+ "very_complex": "gpt-4-turbo-preview",
62
+ }
63
+ )
64
+ complexity_thresholds: dict[str, int] = field(
65
+ default_factory=lambda: {
66
+ "simple_tokens": 100,
67
+ "moderate_tokens": 500,
68
+ "complex_tokens": 2000,
69
+ }
70
+ )
71
+
72
+
73
+ @dataclass
74
+ class I18nConfig:
75
+ """Internationalization configuration.
76
+
77
+ Controls multi-language support for XML prompts.
78
+ """
79
+
80
+ default_language: str = "en"
81
+ translate_tags: bool = False # Keep tags in English by default
82
+ translate_content: bool = True
83
+ fallback_to_english: bool = True
84
+ translation_dir: str = ".empathy/translations"
85
+
86
+
87
+ @dataclass
88
+ class MetricsConfig:
89
+ """Metrics tracking configuration.
90
+
91
+ Controls prompt performance metrics collection and storage.
92
+ """
93
+
94
+ enable_tracking: bool = True
95
+ metrics_file: str = ".empathy/prompt_metrics.json"
96
+ track_token_usage: bool = True
97
+ track_latency: bool = True
98
+ track_retries: bool = True
99
+ track_parsing_success: bool = True
100
+
101
+
102
+ @dataclass
103
+ class EmpathyXMLConfig:
104
+ """Main Empathy XML enhancement configuration.
105
+
106
+ Combines all feature configurations with centralized management.
107
+
108
+ Usage:
109
+ config = EmpathyXMLConfig.load_from_file()
110
+ if config.xml.use_xml_structure:
111
+ use_xml_prompts()
112
+
113
+ # Or create custom config
114
+ config = EmpathyXMLConfig(
115
+ xml=XMLConfig(validate_schemas=True),
116
+ metrics=MetricsConfig(enable_tracking=True)
117
+ )
118
+ config.save_to_file()
119
+ """
120
+
121
+ xml: XMLConfig = field(default_factory=XMLConfig)
122
+ optimization: OptimizationConfig = field(default_factory=OptimizationConfig)
123
+ adaptive: AdaptiveConfig = field(default_factory=AdaptiveConfig)
124
+ i18n: I18nConfig = field(default_factory=I18nConfig)
125
+ metrics: MetricsConfig = field(default_factory=MetricsConfig)
126
+
127
+ @classmethod
128
+ def load_from_file(cls, config_file: str = ".empathy/config.json") -> "EmpathyXMLConfig":
129
+ """Load configuration from JSON file.
130
+
131
+ Args:
132
+ config_file: Path to config file (default: .empathy/config.json)
133
+
134
+ Returns:
135
+ EmpathyXMLConfig instance loaded from file, or default config if file doesn't exist
136
+ """
137
+ path = Path(config_file)
138
+
139
+ if not path.exists():
140
+ # Return default config if file doesn't exist
141
+ return cls()
142
+
143
+ try:
144
+ with open(path) as f:
145
+ data = json.load(f)
146
+
147
+ # Reconstruct nested dataclasses
148
+ return cls(
149
+ xml=XMLConfig(**data.get("xml", {})),
150
+ optimization=OptimizationConfig(**data.get("optimization", {})),
151
+ adaptive=AdaptiveConfig(**data.get("adaptive", {})),
152
+ i18n=I18nConfig(**data.get("i18n", {})),
153
+ metrics=MetricsConfig(**data.get("metrics", {})),
154
+ )
155
+ except Exception as e:
156
+ # Return default config on error
157
+ print(f"Warning: Failed to load config from {config_file}: {e}")
158
+ return cls()
159
+
160
+ def save_to_file(self, config_file: str = ".empathy/config.json") -> None:
161
+ """Save configuration to JSON file.
162
+
163
+ Args:
164
+ config_file: Path to save config (default: .empathy/config.json)
165
+ """
166
+ path = Path(config_file)
167
+ path.parent.mkdir(parents=True, exist_ok=True)
168
+
169
+ data = {
170
+ "xml": asdict(self.xml),
171
+ "optimization": asdict(self.optimization),
172
+ "adaptive": asdict(self.adaptive),
173
+ "i18n": asdict(self.i18n),
174
+ "metrics": asdict(self.metrics),
175
+ }
176
+
177
+ with open(path, "w") as f:
178
+ json.dump(data, f, indent=2)
179
+
180
+ @classmethod
181
+ def from_env(cls) -> "EmpathyXMLConfig":
182
+ """Load configuration from environment variables.
183
+
184
+ Environment variables:
185
+ EMPATHY_XML_ENABLED: Enable XML prompts (default: true)
186
+ EMPATHY_VALIDATION_ENABLED: Enable schema validation (default: false)
187
+ EMPATHY_METRICS_ENABLED: Enable metrics tracking (default: true)
188
+ EMPATHY_OPTIMIZATION_LEVEL: Compression level (default: moderate)
189
+ EMPATHY_ADAPTIVE_ENABLED: Enable adaptive prompts (default: true)
190
+
191
+ Returns:
192
+ EmpathyXMLConfig with settings from environment variables
193
+ """
194
+ return cls(
195
+ xml=XMLConfig(
196
+ use_xml_structure=os.getenv("EMPATHY_XML_ENABLED", "true").lower() == "true",
197
+ validate_schemas=os.getenv("EMPATHY_VALIDATION_ENABLED", "false").lower() == "true",
198
+ ),
199
+ optimization=OptimizationConfig(
200
+ compression_level=os.getenv("EMPATHY_OPTIMIZATION_LEVEL", "moderate"),
201
+ ),
202
+ adaptive=AdaptiveConfig(
203
+ enable_adaptation=os.getenv("EMPATHY_ADAPTIVE_ENABLED", "true").lower() == "true",
204
+ ),
205
+ metrics=MetricsConfig(
206
+ enable_tracking=os.getenv("EMPATHY_METRICS_ENABLED", "true").lower() == "true",
207
+ ),
208
+ )
209
+
210
+
211
+ # Global default configuration instance
212
+ _global_config: EmpathyXMLConfig | None = None
213
+
214
+
215
+ def get_config() -> EmpathyXMLConfig:
216
+ """Get global configuration instance.
217
+
218
+ Returns cached config or loads from file if not yet loaded.
219
+
220
+ Returns:
221
+ Global EmpathyXMLConfig instance
222
+ """
223
+ global _global_config
224
+
225
+ if _global_config is None:
226
+ # Try to load from file, fall back to defaults
227
+ _global_config = EmpathyXMLConfig.load_from_file()
228
+
229
+ return _global_config
230
+
231
+
232
+ def set_config(config: EmpathyXMLConfig) -> None:
233
+ """Set global configuration instance.
234
+
235
+ Args:
236
+ config: EmpathyXMLConfig to use globally
237
+ """
238
+ global _global_config
239
+ _global_config = config
empathy_os/config.py CHANGED
@@ -1,5 +1,4 @@
1
- """
2
- Configuration Management for Empathy Framework
1
+ """Configuration Management for Empathy Framework
3
2
 
4
3
  Supports:
5
4
  - YAML configuration files
@@ -24,11 +23,12 @@ try:
24
23
  except ImportError:
25
24
  YAML_AVAILABLE = False
26
25
 
26
+ from empathy_os.workflows.config import ModelConfig
27
+
27
28
 
28
29
  @dataclass
29
30
  class EmpathyConfig:
30
- """
31
- Configuration for EmpathyOS instance
31
+ """Configuration for EmpathyOS instance
32
32
 
33
33
  Can be loaded from:
34
34
  - YAML file (.empathy.yml, empathy.config.yml)
@@ -77,10 +77,21 @@ class EmpathyConfig:
77
77
  # Custom metadata
78
78
  metadata: dict[str, Any] = field(default_factory=dict)
79
79
 
80
+ # Model settings
81
+ models: list[ModelConfig] = field(default_factory=list)
82
+ default_model: str | None = None
83
+ log_path: str | None = None
84
+ max_threads: int = 4
85
+ model_router: dict[str, Any] | None = None
86
+
87
+ def __post_init__(self):
88
+ """Post-initialization validation."""
89
+ if self.default_model and not any(m.name == self.default_model for m in self.models):
90
+ raise ValueError(f"Default model '{self.default_model}' not in models.")
91
+
80
92
  @classmethod
81
93
  def from_yaml(cls, filepath: str) -> "EmpathyConfig":
82
- """
83
- Load configuration from YAML file
94
+ """Load configuration from YAML file
84
95
 
85
96
  Args:
86
97
  filepath: Path to YAML configuration file
@@ -95,21 +106,46 @@ class EmpathyConfig:
95
106
  Example:
96
107
  >>> config = EmpathyConfig.from_yaml("empathy.config.yml")
97
108
  >>> empathy = EmpathyOS(config=config)
109
+
110
+ Note:
111
+ Unknown fields in the YAML file are silently ignored.
112
+ This allows config files to contain settings for other
113
+ components (e.g., model_preferences, workflows) without
114
+ breaking EmpathyConfig loading.
115
+
98
116
  """
99
117
  if not YAML_AVAILABLE:
100
118
  raise ImportError(
101
- "PyYAML is required for YAML configuration. Install with: pip install pyyaml"
119
+ "PyYAML is required for YAML configuration. Install with: pip install pyyaml",
102
120
  )
103
121
 
104
122
  with open(filepath) as f:
105
123
  data = yaml.safe_load(f)
106
124
 
107
- return cls(**data)
125
+ # Filter to only known fields (gracefully ignore unknown fields like
126
+ # 'provider', 'model_preferences', 'workflows', etc.)
127
+ from dataclasses import fields as dataclass_fields
128
+
129
+ valid_fields = {f.name for f in dataclass_fields(cls)}
130
+ filtered_data = {k: v for k, v in data.items() if k in valid_fields}
131
+
132
+ return cls.from_dict(filtered_data)
133
+
134
+ @classmethod
135
+ def from_dict(cls, data: dict[str, Any]) -> "EmpathyConfig":
136
+ """Create an EmpathyConfig from a dictionary, ignoring unknown fields."""
137
+ known_fields = {f.name for f in cls.__dataclass_fields__.values()}
138
+ filtered_data = {k: v for k, v in data.items() if k in known_fields}
139
+
140
+ # Handle nested ModelConfig objects
141
+ if filtered_data.get("models"):
142
+ filtered_data["models"] = [ModelConfig(**m) for m in filtered_data["models"]]
143
+
144
+ return cls(**filtered_data)
108
145
 
109
146
  @classmethod
110
147
  def from_json(cls, filepath: str) -> "EmpathyConfig":
111
- """
112
- Load configuration from JSON file
148
+ """Load configuration from JSON file
113
149
 
114
150
  Args:
115
151
  filepath: Path to JSON configuration file
@@ -120,16 +156,25 @@ class EmpathyConfig:
120
156
  Example:
121
157
  >>> config = EmpathyConfig.from_json("empathy.config.json")
122
158
  >>> empathy = EmpathyOS(config=config)
159
+
160
+ Note:
161
+ Unknown fields in the JSON file are silently ignored.
162
+
123
163
  """
124
164
  with open(filepath) as f:
125
165
  data = json.load(f)
126
166
 
127
- return cls(**data)
167
+ # Filter to only known fields (gracefully ignore unknown fields)
168
+ from dataclasses import fields as dataclass_fields
169
+
170
+ valid_fields = {f.name for f in dataclass_fields(cls)}
171
+ filtered_data = {k: v for k, v in data.items() if k in valid_fields}
172
+
173
+ return cls(**filtered_data)
128
174
 
129
175
  @classmethod
130
176
  def from_env(cls, prefix: str = "EMPATHY_") -> "EmpathyConfig":
131
- """
132
- Load configuration from environment variables
177
+ """Load configuration from environment variables
133
178
 
134
179
  Environment variables should be prefixed with EMPATHY_
135
180
  and match config field names in uppercase.
@@ -149,6 +194,7 @@ class EmpathyConfig:
149
194
  >>> os.environ["EMPATHY_USER_ID"] = "alice"
150
195
  >>> config = EmpathyConfig.from_env()
151
196
  >>> print(config.user_id) # "alice"
197
+
152
198
  """
153
199
  from dataclasses import fields as dataclass_fields
154
200
 
@@ -196,8 +242,7 @@ class EmpathyConfig:
196
242
 
197
243
  @classmethod
198
244
  def from_file(cls, filepath: str | None = None) -> "EmpathyConfig":
199
- """
200
- Automatically detect and load configuration from file
245
+ """Automatically detect and load configuration from file
201
246
 
202
247
  Looks for configuration files in this order:
203
248
  1. Provided filepath
@@ -217,6 +262,7 @@ class EmpathyConfig:
217
262
  Example:
218
263
  >>> config = EmpathyConfig.from_file() # Auto-detect
219
264
  >>> config = EmpathyConfig.from_file("my-config.yml")
265
+
220
266
  """
221
267
  search_paths = [
222
268
  filepath,
@@ -232,15 +278,14 @@ class EmpathyConfig:
232
278
  if path and Path(path).exists():
233
279
  if path.endswith((".yml", ".yaml")):
234
280
  return cls.from_yaml(path)
235
- elif path.endswith(".json"):
281
+ if path.endswith(".json"):
236
282
  return cls.from_json(path)
237
283
 
238
284
  # No config file found - return default
239
285
  return cls()
240
286
 
241
287
  def to_yaml(self, filepath: str):
242
- """
243
- Save configuration to YAML file
288
+ """Save configuration to YAML file
244
289
 
245
290
  Args:
246
291
  filepath: Path to save YAML file
@@ -248,10 +293,11 @@ class EmpathyConfig:
248
293
  Example:
249
294
  >>> config = EmpathyConfig(user_id="alice", target_level=4)
250
295
  >>> config.to_yaml("my-config.yml")
296
+
251
297
  """
252
298
  if not YAML_AVAILABLE:
253
299
  raise ImportError(
254
- "PyYAML is required for YAML export. Install with: pip install pyyaml"
300
+ "PyYAML is required for YAML export. Install with: pip install pyyaml",
255
301
  )
256
302
 
257
303
  data = asdict(self)
@@ -260,8 +306,7 @@ class EmpathyConfig:
260
306
  yaml.dump(data, f, default_flow_style=False, sort_keys=False)
261
307
 
262
308
  def to_json(self, filepath: str, indent: int = 2):
263
- """
264
- Save configuration to JSON file
309
+ """Save configuration to JSON file
265
310
 
266
311
  Args:
267
312
  filepath: Path to save JSON file
@@ -270,6 +315,7 @@ class EmpathyConfig:
270
315
  Example:
271
316
  >>> config = EmpathyConfig(user_id="alice", target_level=4)
272
317
  >>> config.to_json("my-config.json")
318
+
273
319
  """
274
320
  data = asdict(self)
275
321
 
@@ -281,8 +327,7 @@ class EmpathyConfig:
281
327
  return asdict(self)
282
328
 
283
329
  def update(self, **kwargs):
284
- """
285
- Update configuration fields
330
+ """Update configuration fields
286
331
 
287
332
  Args:
288
333
  **kwargs: Fields to update
@@ -290,14 +335,14 @@ class EmpathyConfig:
290
335
  Example:
291
336
  >>> config = EmpathyConfig()
292
337
  >>> config.update(user_id="bob", target_level=5)
338
+
293
339
  """
294
340
  for key, value in kwargs.items():
295
341
  if hasattr(self, key):
296
342
  setattr(self, key, value)
297
343
 
298
344
  def merge(self, other: "EmpathyConfig") -> "EmpathyConfig":
299
- """
300
- Merge with another configuration (other takes precedence)
345
+ """Merge with another configuration (other takes precedence)
301
346
 
302
347
  Args:
303
348
  other: Configuration to merge
@@ -309,6 +354,7 @@ class EmpathyConfig:
309
354
  >>> base = EmpathyConfig(user_id="alice")
310
355
  >>> override = EmpathyConfig(target_level=5)
311
356
  >>> merged = base.merge(override)
357
+
312
358
  """
313
359
  # Start with base values
314
360
  base_dict = self.to_dict()
@@ -325,30 +371,32 @@ class EmpathyConfig:
325
371
  return EmpathyConfig(**base_dict)
326
372
 
327
373
  def validate(self) -> bool:
328
- """
329
- Validate configuration values
374
+ """Validate configuration values
330
375
 
331
376
  Returns:
332
377
  True if valid, raises ValueError if invalid
333
378
 
334
379
  Raises:
335
380
  ValueError: If configuration is invalid
381
+
336
382
  """
337
383
  if self.target_level not in range(1, 6):
338
384
  raise ValueError(f"target_level must be 1-5, got {self.target_level}")
339
385
 
340
386
  if not 0.0 <= self.confidence_threshold <= 1.0:
341
387
  raise ValueError(
342
- f"confidence_threshold must be 0.0-1.0, got {self.confidence_threshold}"
388
+ f"confidence_threshold must be 0.0-1.0, got {self.confidence_threshold}",
343
389
  )
344
390
 
345
391
  if not 0.0 <= self.pattern_confidence_threshold <= 1.0:
346
- val = self.pattern_confidence_threshold
347
- raise ValueError(f"pattern_confidence_threshold must be 0.0-1.0, got {val}")
392
+ threshold_val = self.pattern_confidence_threshold
393
+ raise ValueError(f"pattern_confidence_threshold must be 0.0-1.0, got {threshold_val}")
348
394
 
349
395
  if self.persistence_backend not in ("sqlite", "json", "none"):
350
- val = self.persistence_backend
351
- raise ValueError(f"persistence_backend must be 'sqlite', 'json', or 'none', got {val}")
396
+ backend_val = self.persistence_backend
397
+ raise ValueError(
398
+ f"persistence_backend must be 'sqlite', 'json', or 'none', got {backend_val}",
399
+ )
352
400
 
353
401
  return True
354
402
 
@@ -361,10 +409,11 @@ class EmpathyConfig:
361
409
 
362
410
 
363
411
  def load_config(
364
- filepath: str | None = None, use_env: bool = True, defaults: dict[str, Any] | None = None
412
+ filepath: str | None = None,
413
+ use_env: bool = True,
414
+ defaults: dict[str, Any] | None = None,
365
415
  ) -> EmpathyConfig:
366
- """
367
- Load configuration with flexible precedence
416
+ """Load configuration with flexible precedence
368
417
 
369
418
  Precedence (highest to lowest):
370
419
  1. Environment variables (if use_env=True)
@@ -386,6 +435,7 @@ def load_config(
386
435
 
387
436
  >>> # Load with custom defaults
388
437
  >>> config = load_config(defaults={"target_level": 4})
438
+
389
439
  """
390
440
  # Start with built-in defaults
391
441
  config = EmpathyConfig()
@@ -425,7 +475,8 @@ def load_config(
425
475
  try:
426
476
  env_config = EmpathyConfig.from_env()
427
477
  config = config.merge(env_config)
428
- except Exception:
478
+ except (ValueError, TypeError):
479
+ # Graceful fallback: invalid env var type conversion
429
480
  pass # Use current config if environment parsing fails
430
481
 
431
482
  # Validate final configuration