empathy-framework 3.7.0__py3-none-any.whl → 3.8.0__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 (274) hide show
  1. coach_wizards/code_reviewer_README.md +60 -0
  2. coach_wizards/code_reviewer_wizard.py +180 -0
  3. {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/METADATA +148 -11
  4. empathy_framework-3.8.0.dist-info/RECORD +333 -0
  5. {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/top_level.txt +5 -1
  6. empathy_healthcare_plugin/monitors/__init__.py +9 -0
  7. empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
  8. empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
  9. empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
  10. empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
  11. empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
  12. empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
  13. empathy_llm_toolkit/agent_factory/__init__.py +53 -0
  14. empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
  15. empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
  16. empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
  17. empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
  18. empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
  19. empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
  20. empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
  21. empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
  22. empathy_llm_toolkit/agent_factory/base.py +305 -0
  23. empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
  24. empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
  25. empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
  26. empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
  27. empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
  28. empathy_llm_toolkit/agent_factory/decorators.py +286 -0
  29. empathy_llm_toolkit/agent_factory/factory.py +558 -0
  30. empathy_llm_toolkit/agent_factory/framework.py +192 -0
  31. empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
  32. empathy_llm_toolkit/agent_factory/resilient.py +320 -0
  33. empathy_llm_toolkit/cli/__init__.py +8 -0
  34. empathy_llm_toolkit/cli/sync_claude.py +487 -0
  35. empathy_llm_toolkit/code_health.py +150 -3
  36. empathy_llm_toolkit/config/__init__.py +29 -0
  37. empathy_llm_toolkit/config/unified.py +295 -0
  38. empathy_llm_toolkit/routing/__init__.py +32 -0
  39. empathy_llm_toolkit/routing/model_router.py +362 -0
  40. empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
  41. empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
  42. empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
  43. empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
  44. empathy_llm_toolkit/security/README.md +262 -0
  45. empathy_llm_toolkit/security/__init__.py +62 -0
  46. empathy_llm_toolkit/security/audit_logger.py +929 -0
  47. empathy_llm_toolkit/security/audit_logger_example.py +152 -0
  48. empathy_llm_toolkit/security/pii_scrubber.py +640 -0
  49. empathy_llm_toolkit/security/secrets_detector.py +678 -0
  50. empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
  51. empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
  52. empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
  53. empathy_llm_toolkit/wizards/__init__.py +38 -0
  54. empathy_llm_toolkit/wizards/base_wizard.py +364 -0
  55. empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
  56. empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
  57. empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
  58. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
  59. empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
  60. empathy_os/__init__.py +52 -52
  61. empathy_os/adaptive/__init__.py +13 -0
  62. empathy_os/adaptive/task_complexity.py +127 -0
  63. empathy_os/cache/__init__.py +117 -0
  64. empathy_os/cache/base.py +166 -0
  65. empathy_os/cache/dependency_manager.py +253 -0
  66. empathy_os/cache/hash_only.py +248 -0
  67. empathy_os/cache/hybrid.py +390 -0
  68. empathy_os/cache/storage.py +282 -0
  69. empathy_os/cli.py +118 -8
  70. empathy_os/cli_unified.py +121 -1
  71. empathy_os/config/__init__.py +63 -0
  72. empathy_os/config/xml_config.py +239 -0
  73. empathy_os/config.py +2 -1
  74. empathy_os/dashboard/__init__.py +15 -0
  75. empathy_os/dashboard/server.py +743 -0
  76. empathy_os/memory/__init__.py +195 -0
  77. empathy_os/memory/claude_memory.py +466 -0
  78. empathy_os/memory/config.py +224 -0
  79. empathy_os/memory/control_panel.py +1298 -0
  80. empathy_os/memory/edges.py +179 -0
  81. empathy_os/memory/graph.py +567 -0
  82. empathy_os/memory/long_term.py +1194 -0
  83. empathy_os/memory/nodes.py +179 -0
  84. empathy_os/memory/redis_bootstrap.py +540 -0
  85. empathy_os/memory/security/__init__.py +31 -0
  86. empathy_os/memory/security/audit_logger.py +930 -0
  87. empathy_os/memory/security/pii_scrubber.py +640 -0
  88. empathy_os/memory/security/secrets_detector.py +678 -0
  89. empathy_os/memory/short_term.py +2119 -0
  90. empathy_os/memory/storage/__init__.py +15 -0
  91. empathy_os/memory/summary_index.py +583 -0
  92. empathy_os/memory/unified.py +619 -0
  93. empathy_os/metrics/__init__.py +12 -0
  94. empathy_os/metrics/prompt_metrics.py +190 -0
  95. empathy_os/models/__init__.py +136 -0
  96. empathy_os/models/__main__.py +13 -0
  97. empathy_os/models/cli.py +655 -0
  98. empathy_os/models/empathy_executor.py +354 -0
  99. empathy_os/models/executor.py +252 -0
  100. empathy_os/models/fallback.py +671 -0
  101. empathy_os/models/provider_config.py +563 -0
  102. empathy_os/models/registry.py +382 -0
  103. empathy_os/models/tasks.py +302 -0
  104. empathy_os/models/telemetry.py +548 -0
  105. empathy_os/models/token_estimator.py +378 -0
  106. empathy_os/models/validation.py +274 -0
  107. empathy_os/monitoring/__init__.py +52 -0
  108. empathy_os/monitoring/alerts.py +23 -0
  109. empathy_os/monitoring/alerts_cli.py +268 -0
  110. empathy_os/monitoring/multi_backend.py +271 -0
  111. empathy_os/monitoring/otel_backend.py +363 -0
  112. empathy_os/optimization/__init__.py +19 -0
  113. empathy_os/optimization/context_optimizer.py +272 -0
  114. empathy_os/plugins/__init__.py +28 -0
  115. empathy_os/plugins/base.py +361 -0
  116. empathy_os/plugins/registry.py +268 -0
  117. empathy_os/project_index/__init__.py +30 -0
  118. empathy_os/project_index/cli.py +335 -0
  119. empathy_os/project_index/crew_integration.py +430 -0
  120. empathy_os/project_index/index.py +425 -0
  121. empathy_os/project_index/models.py +501 -0
  122. empathy_os/project_index/reports.py +473 -0
  123. empathy_os/project_index/scanner.py +538 -0
  124. empathy_os/prompts/__init__.py +61 -0
  125. empathy_os/prompts/config.py +77 -0
  126. empathy_os/prompts/context.py +177 -0
  127. empathy_os/prompts/parser.py +285 -0
  128. empathy_os/prompts/registry.py +313 -0
  129. empathy_os/prompts/templates.py +208 -0
  130. empathy_os/resilience/__init__.py +56 -0
  131. empathy_os/resilience/circuit_breaker.py +256 -0
  132. empathy_os/resilience/fallback.py +179 -0
  133. empathy_os/resilience/health.py +300 -0
  134. empathy_os/resilience/retry.py +209 -0
  135. empathy_os/resilience/timeout.py +135 -0
  136. empathy_os/routing/__init__.py +43 -0
  137. empathy_os/routing/chain_executor.py +433 -0
  138. empathy_os/routing/classifier.py +217 -0
  139. empathy_os/routing/smart_router.py +234 -0
  140. empathy_os/routing/wizard_registry.py +307 -0
  141. empathy_os/trust/__init__.py +28 -0
  142. empathy_os/trust/circuit_breaker.py +579 -0
  143. empathy_os/validation/__init__.py +19 -0
  144. empathy_os/validation/xml_validator.py +281 -0
  145. empathy_os/wizard_factory_cli.py +170 -0
  146. empathy_os/workflows/__init__.py +360 -0
  147. empathy_os/workflows/base.py +1660 -0
  148. empathy_os/workflows/bug_predict.py +962 -0
  149. empathy_os/workflows/code_review.py +960 -0
  150. empathy_os/workflows/code_review_adapters.py +310 -0
  151. empathy_os/workflows/code_review_pipeline.py +720 -0
  152. empathy_os/workflows/config.py +600 -0
  153. empathy_os/workflows/dependency_check.py +648 -0
  154. empathy_os/workflows/document_gen.py +1069 -0
  155. empathy_os/workflows/documentation_orchestrator.py +1205 -0
  156. empathy_os/workflows/health_check.py +679 -0
  157. empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
  158. empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
  159. empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
  160. empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
  161. empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
  162. empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
  163. empathy_os/workflows/manage_documentation.py +804 -0
  164. empathy_os/workflows/new_sample_workflow1.py +146 -0
  165. empathy_os/workflows/new_sample_workflow1_README.md +150 -0
  166. empathy_os/workflows/perf_audit.py +687 -0
  167. empathy_os/workflows/pr_review.py +748 -0
  168. empathy_os/workflows/progress.py +445 -0
  169. empathy_os/workflows/progress_server.py +322 -0
  170. empathy_os/workflows/refactor_plan.py +693 -0
  171. empathy_os/workflows/release_prep.py +808 -0
  172. empathy_os/workflows/research_synthesis.py +404 -0
  173. empathy_os/workflows/secure_release.py +585 -0
  174. empathy_os/workflows/security_adapters.py +297 -0
  175. empathy_os/workflows/security_audit.py +1046 -0
  176. empathy_os/workflows/step_config.py +234 -0
  177. empathy_os/workflows/test5.py +125 -0
  178. empathy_os/workflows/test5_README.md +158 -0
  179. empathy_os/workflows/test_gen.py +1855 -0
  180. empathy_os/workflows/test_lifecycle.py +526 -0
  181. empathy_os/workflows/test_maintenance.py +626 -0
  182. empathy_os/workflows/test_maintenance_cli.py +590 -0
  183. empathy_os/workflows/test_maintenance_crew.py +821 -0
  184. empathy_os/workflows/xml_enhanced_crew.py +285 -0
  185. empathy_software_plugin/cli/__init__.py +120 -0
  186. empathy_software_plugin/cli/inspect.py +362 -0
  187. empathy_software_plugin/cli.py +3 -1
  188. empathy_software_plugin/wizards/__init__.py +42 -0
  189. empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
  190. empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
  191. empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
  192. empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
  193. empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
  194. empathy_software_plugin/wizards/base_wizard.py +288 -0
  195. empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
  196. empathy_software_plugin/wizards/code_review_wizard.py +606 -0
  197. empathy_software_plugin/wizards/debugging/__init__.py +50 -0
  198. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
  199. empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
  200. empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
  201. empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
  202. empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
  203. empathy_software_plugin/wizards/debugging/verification.py +369 -0
  204. empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
  205. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
  206. empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
  207. empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
  208. empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
  209. empathy_software_plugin/wizards/performance/__init__.py +9 -0
  210. empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
  211. empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
  212. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
  213. empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
  214. empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
  215. empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
  216. empathy_software_plugin/wizards/security/__init__.py +32 -0
  217. empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
  218. empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
  219. empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
  220. empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
  221. empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
  222. empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
  223. empathy_software_plugin/wizards/testing/__init__.py +27 -0
  224. empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
  225. empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
  226. empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
  227. empathy_software_plugin/wizards/testing_wizard.py +274 -0
  228. hot_reload/README.md +473 -0
  229. hot_reload/__init__.py +62 -0
  230. hot_reload/config.py +84 -0
  231. hot_reload/integration.py +228 -0
  232. hot_reload/reloader.py +298 -0
  233. hot_reload/watcher.py +179 -0
  234. hot_reload/websocket.py +176 -0
  235. scaffolding/README.md +589 -0
  236. scaffolding/__init__.py +35 -0
  237. scaffolding/__main__.py +14 -0
  238. scaffolding/cli.py +240 -0
  239. test_generator/__init__.py +38 -0
  240. test_generator/__main__.py +14 -0
  241. test_generator/cli.py +226 -0
  242. test_generator/generator.py +325 -0
  243. test_generator/risk_analyzer.py +216 -0
  244. workflow_patterns/__init__.py +33 -0
  245. workflow_patterns/behavior.py +249 -0
  246. workflow_patterns/core.py +76 -0
  247. workflow_patterns/output.py +99 -0
  248. workflow_patterns/registry.py +255 -0
  249. workflow_patterns/structural.py +288 -0
  250. workflow_scaffolding/__init__.py +11 -0
  251. workflow_scaffolding/__main__.py +12 -0
  252. workflow_scaffolding/cli.py +206 -0
  253. workflow_scaffolding/generator.py +265 -0
  254. agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
  255. agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
  256. agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
  257. agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
  258. agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
  259. agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
  260. agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
  261. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
  262. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
  263. agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
  264. agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
  265. agents/compliance_anticipation_agent.py +0 -1422
  266. agents/compliance_db.py +0 -339
  267. agents/epic_integration_wizard.py +0 -530
  268. agents/notifications.py +0 -291
  269. agents/trust_building_behaviors.py +0 -872
  270. empathy_framework-3.7.0.dist-info/RECORD +0 -105
  271. {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/WHEEL +0 -0
  272. {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/entry_points.txt +0 -0
  273. {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/licenses/LICENSE +0 -0
  274. /empathy_os/{monitoring.py → agent_monitoring.py} +0 -0
@@ -0,0 +1,389 @@
1
+ """Trajectory Analyzer (Level 4)
2
+
3
+ Analyzes vital sign trends to predict patient deterioration BEFORE critical.
4
+
5
+ This is Level 4 Anticipatory Empathy - alerting before the patient meets full crisis criteria.
6
+
7
+ Copyright 2025 Smart AI Memory, LLC
8
+ Licensed under Fair Source 0.9
9
+ """
10
+
11
+ from dataclasses import dataclass
12
+ from typing import Any
13
+
14
+
15
+ @dataclass
16
+ class VitalTrend:
17
+ """Trend analysis for a single vital sign"""
18
+
19
+ parameter: str
20
+ current_value: float
21
+ previous_value: float
22
+ change: float
23
+ change_percent: float
24
+ direction: str # "increasing", "decreasing", "stable"
25
+ rate_of_change: float # units per hour
26
+ concerning: bool
27
+ reasoning: str
28
+
29
+
30
+ @dataclass
31
+ class TrajectoryPrediction:
32
+ """Prediction of patient trajectory.
33
+
34
+ This is Level 4 - predicting BEFORE criteria met.
35
+ """
36
+
37
+ trajectory_state: str # "stable", "improving", "concerning", "critical"
38
+ estimated_time_to_critical: str | None
39
+ vital_trends: list[VitalTrend]
40
+ overall_assessment: str
41
+ confidence: float
42
+ recommendations: list[str]
43
+
44
+
45
+ class TrajectoryAnalyzer:
46
+ """Analyzes vital sign trajectory to predict deterioration.
47
+
48
+ This implements Level 4 Anticipatory Empathy.
49
+ """
50
+
51
+ def __init__(self):
52
+ # Define normal ranges
53
+ self.normal_ranges = {
54
+ "hr": (60, 100),
55
+ "systolic_bp": (90, 140),
56
+ "diastolic_bp": (60, 90),
57
+ "respiratory_rate": (12, 20),
58
+ "temp_f": (97.0, 99.5),
59
+ "o2_sat": (95, 100),
60
+ }
61
+
62
+ # Define concerning rates of change
63
+ self.concerning_rates = {
64
+ "hr": 15, # bpm increase over 2 hours
65
+ "systolic_bp": 20, # mmHg decrease
66
+ "respiratory_rate": 5, # breaths/min increase
67
+ "temp_f": 2.0, # degrees increase
68
+ }
69
+
70
+ def analyze_trajectory(
71
+ self,
72
+ current_data: dict[str, float],
73
+ historical_data: list[dict[str, Any]],
74
+ ) -> TrajectoryPrediction:
75
+ """Analyze patient trajectory from historical vitals.
76
+
77
+ Args:
78
+ current_data: Current vital signs
79
+ historical_data: List of previous readings (last 6-12 hours)
80
+
81
+ Returns:
82
+ TrajectoryPrediction with assessment
83
+
84
+ Example:
85
+ >>> history = [
86
+ ... {"timestamp": "12:00", "hr": 95, "systolic_bp": 120},
87
+ ... {"timestamp": "13:00", "hr": 105, "systolic_bp": 110},
88
+ ... {"timestamp": "14:00", "hr": 112, "systolic_bp": 95}
89
+ ... ]
90
+ >>> prediction = analyzer.analyze_trajectory(current_vitals, history)
91
+ >>> if prediction.trajectory_state == "concerning":
92
+ ... print(f"ALERT: {prediction.overall_assessment}")
93
+
94
+ """
95
+ if not historical_data:
96
+ return TrajectoryPrediction(
97
+ trajectory_state="stable",
98
+ estimated_time_to_critical=None,
99
+ vital_trends=[],
100
+ overall_assessment="Insufficient historical data for trajectory analysis",
101
+ confidence=0.3,
102
+ recommendations=["Continue monitoring"],
103
+ )
104
+
105
+ # Analyze trends for each vital sign
106
+ vital_trends = []
107
+
108
+ for parameter, current_value in current_data.items():
109
+ if parameter in ["mental_status"]: # Skip non-numeric
110
+ continue
111
+
112
+ trend = self._analyze_parameter_trend(parameter, current_value, historical_data)
113
+
114
+ if trend:
115
+ vital_trends.append(trend)
116
+
117
+ # Determine overall trajectory state
118
+ trajectory_state = self._determine_trajectory_state(vital_trends)
119
+
120
+ # Estimate time to critical (if concerning)
121
+ time_to_critical = None
122
+ if trajectory_state in ["concerning", "critical"]:
123
+ time_to_critical = self._estimate_time_to_critical(vital_trends, current_data)
124
+
125
+ # Generate overall assessment
126
+ assessment = self._generate_assessment(trajectory_state, vital_trends, time_to_critical)
127
+
128
+ # Generate recommendations
129
+ recommendations = self._generate_recommendations(trajectory_state, vital_trends)
130
+
131
+ # Calculate confidence
132
+ confidence = self._calculate_confidence(historical_data, vital_trends)
133
+
134
+ return TrajectoryPrediction(
135
+ trajectory_state=trajectory_state,
136
+ estimated_time_to_critical=time_to_critical,
137
+ vital_trends=vital_trends,
138
+ overall_assessment=assessment,
139
+ confidence=confidence,
140
+ recommendations=recommendations,
141
+ )
142
+
143
+ def _analyze_parameter_trend(
144
+ self,
145
+ parameter: str,
146
+ current_value: float,
147
+ historical_data: list[dict[str, Any]],
148
+ ) -> VitalTrend | None:
149
+ """Analyze trend for single parameter"""
150
+ # Extract historical values
151
+ historical_values = []
152
+ for entry in historical_data:
153
+ if parameter in entry and entry[parameter] is not None:
154
+ historical_values.append(entry[parameter])
155
+
156
+ if not historical_values:
157
+ return None
158
+
159
+ # Calculate change from most recent
160
+ previous_value = historical_values[-1]
161
+ change = current_value - previous_value
162
+ change_percent = (change / previous_value * 100) if previous_value != 0 else 0
163
+
164
+ # Determine direction
165
+ if abs(change_percent) < 5:
166
+ direction = "stable"
167
+ elif change > 0:
168
+ direction = "increasing"
169
+ else:
170
+ direction = "decreasing"
171
+
172
+ # Calculate rate of change (per hour)
173
+ # Assuming historical data spans 2-6 hours
174
+ hours_elapsed = len(historical_values) / 2 # Rough estimate
175
+ rate_of_change = abs(change) / hours_elapsed if hours_elapsed > 0 else 0
176
+
177
+ # Determine if concerning
178
+ concerning, reasoning = self._is_trend_concerning(
179
+ parameter,
180
+ current_value,
181
+ change,
182
+ rate_of_change,
183
+ direction,
184
+ )
185
+
186
+ return VitalTrend(
187
+ parameter=parameter,
188
+ current_value=current_value,
189
+ previous_value=previous_value,
190
+ change=change,
191
+ change_percent=change_percent,
192
+ direction=direction,
193
+ rate_of_change=rate_of_change,
194
+ concerning=concerning,
195
+ reasoning=reasoning,
196
+ )
197
+
198
+ def _is_trend_concerning(
199
+ self,
200
+ parameter: str,
201
+ current_value: float,
202
+ change: float,
203
+ rate_of_change: float,
204
+ direction: str,
205
+ ) -> tuple[bool, str]:
206
+ """Determine if trend is concerning"""
207
+ # Check if currently out of normal range
208
+ if parameter in self.normal_ranges:
209
+ min_val, max_val = self.normal_ranges[parameter]
210
+
211
+ if current_value < min_val:
212
+ return True, f"{parameter} below normal range ({min_val}-{max_val})"
213
+ if current_value > max_val:
214
+ return True, f"{parameter} above normal range ({min_val}-{max_val})"
215
+
216
+ # Check rate of change
217
+ if parameter in self.concerning_rates:
218
+ threshold = self.concerning_rates[parameter]
219
+
220
+ if parameter == "hr" and direction == "increasing" and rate_of_change > threshold:
221
+ return True, f"HR increasing rapidly (+{change:.0f} bpm)"
222
+
223
+ if (
224
+ parameter == "systolic_bp"
225
+ and direction == "decreasing"
226
+ and rate_of_change > threshold
227
+ ):
228
+ return True, f"BP decreasing rapidly (-{abs(change):.0f} mmHg)"
229
+
230
+ if (
231
+ parameter == "respiratory_rate"
232
+ and direction == "increasing"
233
+ and rate_of_change > threshold
234
+ ):
235
+ return True, f"RR increasing rapidly (+{change:.0f} /min)"
236
+
237
+ if parameter == "temp_f" and direction == "increasing" and rate_of_change > threshold:
238
+ return True, f"Temp increasing rapidly (+{change:.1f}°F)"
239
+
240
+ return False, "Within normal trajectory"
241
+
242
+ def _determine_trajectory_state(self, vital_trends: list[VitalTrend]) -> str:
243
+ """Determine overall trajectory state"""
244
+ concerning_trends = [t for t in vital_trends if t.concerning]
245
+
246
+ if not concerning_trends:
247
+ return "stable"
248
+
249
+ # Count concerning trends by severity
250
+ critical_parameters = ["systolic_bp", "o2_sat"]
251
+ critical_concerning = sum(
252
+ 1 for t in concerning_trends if t.parameter in critical_parameters
253
+ )
254
+
255
+ if critical_concerning >= 1:
256
+ return "critical"
257
+
258
+ if len(concerning_trends) >= 2:
259
+ return "concerning"
260
+
261
+ if len(concerning_trends) == 1:
262
+ return "concerning"
263
+
264
+ return "stable"
265
+
266
+ def _estimate_time_to_critical(
267
+ self,
268
+ vital_trends: list[VitalTrend],
269
+ current_data: dict[str, float],
270
+ ) -> str | None:
271
+ """Estimate time until patient meets critical criteria.
272
+
273
+ This is core Level 4 - predicting the future.
274
+ """
275
+ # Example: If BP dropping at 10 mmHg/hour, currently 95, critical is 85
276
+ # Time to critical = (95 - 85) / 10 = 1 hour
277
+
278
+ for trend in vital_trends:
279
+ if not trend.concerning:
280
+ continue
281
+
282
+ if trend.parameter == "systolic_bp" and trend.direction == "decreasing":
283
+ critical_threshold = 90
284
+ current = trend.current_value
285
+ rate = trend.rate_of_change
286
+
287
+ if rate > 0:
288
+ hours_to_critical = (current - critical_threshold) / rate
289
+ if 0 < hours_to_critical < 24:
290
+ return f"~{int(hours_to_critical)} hours"
291
+
292
+ if trend.parameter == "o2_sat" and trend.direction == "decreasing":
293
+ critical_threshold = 90
294
+ current = trend.current_value
295
+ rate = trend.rate_of_change
296
+
297
+ if rate > 0:
298
+ hours_to_critical = (current - critical_threshold) / rate
299
+ if 0 < hours_to_critical < 24:
300
+ return f"~{int(hours_to_critical)} hours"
301
+
302
+ return None
303
+
304
+ def _generate_assessment(
305
+ self,
306
+ trajectory_state: str,
307
+ vital_trends: list[VitalTrend],
308
+ time_to_critical: str | None,
309
+ ) -> str:
310
+ """Generate overall assessment"""
311
+ if trajectory_state == "stable":
312
+ return "Patient vitals stable. Continue routine monitoring."
313
+
314
+ concerning = [t for t in vital_trends if t.concerning]
315
+
316
+ if trajectory_state == "critical":
317
+ trends_desc = ", ".join(f"{t.parameter} {t.direction}" for t in concerning[:3])
318
+ return (
319
+ f"CRITICAL trajectory detected: {trends_desc}. Immediate intervention recommended."
320
+ )
321
+
322
+ if trajectory_state == "concerning":
323
+ trends_desc = ", ".join(f"{t.parameter} {t.direction}" for t in concerning[:3])
324
+
325
+ if time_to_critical:
326
+ return (
327
+ f"Concerning trajectory: {trends_desc}. "
328
+ f"In our experience, this pattern suggests deterioration. "
329
+ f"Estimated time to critical: {time_to_critical}. "
330
+ "Early intervention may prevent escalation."
331
+ )
332
+
333
+ return (
334
+ f"Concerning trajectory: {trends_desc}. "
335
+ "In our experience, this pattern warrants closer monitoring."
336
+ )
337
+
338
+ return "Patient trajectory under assessment."
339
+
340
+ def _generate_recommendations(
341
+ self,
342
+ trajectory_state: str,
343
+ vital_trends: list[VitalTrend],
344
+ ) -> list[str]:
345
+ """Generate actionable recommendations"""
346
+ if trajectory_state == "stable":
347
+ return ["Continue routine monitoring"]
348
+
349
+ recommendations = []
350
+
351
+ if trajectory_state in ["concerning", "critical"]:
352
+ recommendations.append("Notify physician of trajectory")
353
+ recommendations.append("Increase monitoring frequency")
354
+
355
+ concerning = [t for t in vital_trends if t.concerning]
356
+
357
+ for trend in concerning:
358
+ if trend.parameter == "systolic_bp":
359
+ recommendations.append("Assess volume status and perfusion")
360
+ elif trend.parameter == "hr":
361
+ recommendations.append("Assess for infection or pain")
362
+ elif trend.parameter == "respiratory_rate":
363
+ recommendations.append("Assess respiratory status and oxygenation")
364
+ elif trend.parameter == "temp_f":
365
+ recommendations.append("Assess for infection")
366
+
367
+ if trajectory_state == "critical":
368
+ recommendations.append("Consider rapid response team activation")
369
+
370
+ return recommendations
371
+
372
+ def _calculate_confidence(
373
+ self,
374
+ historical_data: list[dict[str, Any]],
375
+ vital_trends: list[VitalTrend],
376
+ ) -> float:
377
+ """Calculate confidence in prediction"""
378
+ # More data = higher confidence
379
+ data_points = len(historical_data)
380
+ data_confidence = min(data_points / 10, 1.0)
381
+
382
+ # More consistent trends = higher confidence
383
+ if vital_trends:
384
+ concerning_count = sum(1 for t in vital_trends if t.concerning)
385
+ trend_confidence = concerning_count / len(vital_trends)
386
+ else:
387
+ trend_confidence = 0.5
388
+
389
+ return (data_confidence + trend_confidence) / 2
@@ -0,0 +1,53 @@
1
+ """Empathy Framework - Universal Agent Factory
2
+
3
+ Create agents using your preferred framework while retaining Empathy's
4
+ cost optimization, pattern learning, and memory features.
5
+
6
+ Supported Frameworks:
7
+ - LangChain: Chains, tools, and retrieval
8
+ - LangGraph: Stateful multi-agent graphs
9
+ - AutoGen: Conversational multi-agent systems
10
+ - Haystack: RAG and document pipelines
11
+ - Native: Empathy's built-in agent system
12
+
13
+ Usage:
14
+ from empathy_llm_toolkit.agent_factory import AgentFactory, Framework
15
+
16
+ # Create factory with preferred framework
17
+ factory = AgentFactory(framework=Framework.LANGGRAPH)
18
+
19
+ # Create agents
20
+ researcher = factory.create_agent("researcher", tools=[...])
21
+ writer = factory.create_agent("writer", model_tier="premium")
22
+
23
+ # Create workflows
24
+ pipeline = factory.create_workflow([researcher, writer])
25
+
26
+ # Create wizards with framework backing
27
+ debug_wizard = factory.create_wizard("debugging")
28
+
29
+ Copyright 2025 Smart-AI-Memory
30
+ Licensed under Fair Source License 0.9
31
+ """
32
+
33
+ from empathy_llm_toolkit.agent_factory.base import (
34
+ AgentCapability,
35
+ AgentConfig,
36
+ AgentRole,
37
+ BaseAdapter,
38
+ BaseAgent,
39
+ WorkflowConfig,
40
+ )
41
+ from empathy_llm_toolkit.agent_factory.factory import AgentFactory
42
+ from empathy_llm_toolkit.agent_factory.framework import Framework
43
+
44
+ __all__ = [
45
+ "AgentCapability",
46
+ "AgentConfig",
47
+ "AgentFactory",
48
+ "AgentRole",
49
+ "BaseAdapter",
50
+ "BaseAgent",
51
+ "Framework",
52
+ "WorkflowConfig",
53
+ ]
@@ -0,0 +1,85 @@
1
+ """Framework Adapters for Agent Factory
2
+
3
+ Each adapter implements the BaseAdapter interface for a specific
4
+ agent framework, allowing seamless switching between frameworks.
5
+
6
+ Copyright 2025 Smart-AI-Memory
7
+ Licensed under Fair Source License 0.9
8
+ """
9
+
10
+ from empathy_llm_toolkit.agent_factory.adapters.native import NativeAdapter
11
+ from empathy_llm_toolkit.agent_factory.adapters.wizard_adapter import (
12
+ WizardAdapter,
13
+ WizardAgent,
14
+ wrap_wizard,
15
+ )
16
+
17
+ # Lazy imports for optional frameworks
18
+ _langchain_adapter = None
19
+ _langgraph_adapter = None
20
+ _autogen_adapter = None
21
+ _haystack_adapter = None
22
+ _crewai_adapter = None
23
+
24
+
25
+ def get_langchain_adapter():
26
+ """Get LangChain adapter (lazy import)."""
27
+ global _langchain_adapter
28
+ if _langchain_adapter is None:
29
+ from empathy_llm_toolkit.agent_factory.adapters.langchain_adapter import LangChainAdapter
30
+
31
+ _langchain_adapter = LangChainAdapter
32
+ return _langchain_adapter
33
+
34
+
35
+ def get_langgraph_adapter():
36
+ """Get LangGraph adapter (lazy import)."""
37
+ global _langgraph_adapter
38
+ if _langgraph_adapter is None:
39
+ from empathy_llm_toolkit.agent_factory.adapters.langgraph_adapter import LangGraphAdapter
40
+
41
+ _langgraph_adapter = LangGraphAdapter
42
+ return _langgraph_adapter
43
+
44
+
45
+ def get_autogen_adapter():
46
+ """Get AutoGen adapter (lazy import)."""
47
+ global _autogen_adapter
48
+ if _autogen_adapter is None:
49
+ from empathy_llm_toolkit.agent_factory.adapters.autogen_adapter import AutoGenAdapter
50
+
51
+ _autogen_adapter = AutoGenAdapter
52
+ return _autogen_adapter
53
+
54
+
55
+ def get_haystack_adapter():
56
+ """Get Haystack adapter (lazy import)."""
57
+ global _haystack_adapter
58
+ if _haystack_adapter is None:
59
+ from empathy_llm_toolkit.agent_factory.adapters.haystack_adapter import HaystackAdapter
60
+
61
+ _haystack_adapter = HaystackAdapter
62
+ return _haystack_adapter
63
+
64
+
65
+ def get_crewai_adapter():
66
+ """Get CrewAI adapter (lazy import)."""
67
+ global _crewai_adapter
68
+ if _crewai_adapter is None:
69
+ from empathy_llm_toolkit.agent_factory.adapters.crewai_adapter import CrewAIAdapter
70
+
71
+ _crewai_adapter = CrewAIAdapter
72
+ return _crewai_adapter
73
+
74
+
75
+ __all__ = [
76
+ "NativeAdapter",
77
+ "WizardAdapter",
78
+ "WizardAgent",
79
+ "get_autogen_adapter",
80
+ "get_crewai_adapter",
81
+ "get_haystack_adapter",
82
+ "get_langchain_adapter",
83
+ "get_langgraph_adapter",
84
+ "wrap_wizard",
85
+ ]