empathy-framework 4.6.6__py3-none-any.whl → 4.7.1__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.
- empathy_framework-4.7.1.dist-info/METADATA +690 -0
- empathy_framework-4.7.1.dist-info/RECORD +379 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/top_level.txt +1 -2
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +9 -9
- empathy_llm_toolkit/agent_factory/__init__.py +6 -6
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +7 -10
- empathy_llm_toolkit/agents_md/__init__.py +22 -0
- empathy_llm_toolkit/agents_md/loader.py +218 -0
- empathy_llm_toolkit/agents_md/parser.py +271 -0
- empathy_llm_toolkit/agents_md/registry.py +307 -0
- empathy_llm_toolkit/commands/__init__.py +51 -0
- empathy_llm_toolkit/commands/context.py +375 -0
- empathy_llm_toolkit/commands/loader.py +301 -0
- empathy_llm_toolkit/commands/models.py +231 -0
- empathy_llm_toolkit/commands/parser.py +371 -0
- empathy_llm_toolkit/commands/registry.py +429 -0
- empathy_llm_toolkit/config/__init__.py +8 -8
- empathy_llm_toolkit/config/unified.py +3 -7
- empathy_llm_toolkit/context/__init__.py +22 -0
- empathy_llm_toolkit/context/compaction.py +455 -0
- empathy_llm_toolkit/context/manager.py +434 -0
- empathy_llm_toolkit/hooks/__init__.py +24 -0
- empathy_llm_toolkit/hooks/config.py +306 -0
- empathy_llm_toolkit/hooks/executor.py +289 -0
- empathy_llm_toolkit/hooks/registry.py +302 -0
- empathy_llm_toolkit/hooks/scripts/__init__.py +39 -0
- empathy_llm_toolkit/hooks/scripts/evaluate_session.py +201 -0
- empathy_llm_toolkit/hooks/scripts/first_time_init.py +285 -0
- empathy_llm_toolkit/hooks/scripts/pre_compact.py +207 -0
- empathy_llm_toolkit/hooks/scripts/session_end.py +183 -0
- empathy_llm_toolkit/hooks/scripts/session_start.py +163 -0
- empathy_llm_toolkit/hooks/scripts/suggest_compact.py +225 -0
- empathy_llm_toolkit/learning/__init__.py +30 -0
- empathy_llm_toolkit/learning/evaluator.py +438 -0
- empathy_llm_toolkit/learning/extractor.py +514 -0
- empathy_llm_toolkit/learning/storage.py +560 -0
- empathy_llm_toolkit/providers.py +4 -11
- empathy_llm_toolkit/security/__init__.py +17 -17
- empathy_llm_toolkit/utils/tokens.py +2 -5
- empathy_os/__init__.py +202 -70
- empathy_os/cache_monitor.py +5 -3
- empathy_os/cli/__init__.py +11 -55
- empathy_os/cli/__main__.py +29 -15
- empathy_os/cli/commands/inspection.py +21 -12
- empathy_os/cli/commands/memory.py +4 -12
- empathy_os/cli/commands/profiling.py +198 -0
- empathy_os/cli/commands/utilities.py +27 -7
- empathy_os/cli.py +28 -57
- empathy_os/cli_unified.py +525 -1164
- empathy_os/cost_tracker.py +9 -3
- empathy_os/dashboard/server.py +200 -2
- empathy_os/hot_reload/__init__.py +7 -7
- empathy_os/hot_reload/config.py +6 -7
- empathy_os/hot_reload/integration.py +35 -35
- empathy_os/hot_reload/reloader.py +57 -57
- empathy_os/hot_reload/watcher.py +28 -28
- empathy_os/hot_reload/websocket.py +2 -2
- empathy_os/memory/__init__.py +11 -4
- empathy_os/memory/claude_memory.py +1 -1
- empathy_os/memory/cross_session.py +8 -12
- empathy_os/memory/edges.py +6 -6
- empathy_os/memory/file_session.py +770 -0
- empathy_os/memory/graph.py +30 -30
- empathy_os/memory/nodes.py +6 -6
- empathy_os/memory/short_term.py +15 -9
- empathy_os/memory/unified.py +606 -140
- empathy_os/meta_workflows/agent_creator.py +3 -9
- empathy_os/meta_workflows/cli_meta_workflows.py +113 -53
- empathy_os/meta_workflows/form_engine.py +6 -18
- empathy_os/meta_workflows/intent_detector.py +64 -24
- empathy_os/meta_workflows/models.py +3 -1
- empathy_os/meta_workflows/pattern_learner.py +13 -31
- empathy_os/meta_workflows/plan_generator.py +55 -47
- empathy_os/meta_workflows/session_context.py +2 -3
- empathy_os/meta_workflows/workflow.py +20 -51
- empathy_os/models/cli.py +2 -2
- empathy_os/models/tasks.py +1 -2
- empathy_os/models/telemetry.py +4 -1
- empathy_os/models/token_estimator.py +3 -1
- empathy_os/monitoring/alerts.py +938 -9
- empathy_os/monitoring/alerts_cli.py +346 -183
- empathy_os/orchestration/execution_strategies.py +12 -29
- empathy_os/orchestration/pattern_learner.py +20 -26
- empathy_os/orchestration/real_tools.py +6 -15
- empathy_os/platform_utils.py +2 -1
- empathy_os/plugins/__init__.py +2 -2
- empathy_os/plugins/base.py +64 -64
- empathy_os/plugins/registry.py +32 -32
- empathy_os/project_index/index.py +49 -15
- empathy_os/project_index/models.py +1 -2
- empathy_os/project_index/reports.py +1 -1
- empathy_os/project_index/scanner.py +1 -0
- empathy_os/redis_memory.py +10 -7
- empathy_os/resilience/__init__.py +1 -1
- empathy_os/resilience/health.py +10 -10
- empathy_os/routing/__init__.py +7 -7
- empathy_os/routing/chain_executor.py +37 -37
- empathy_os/routing/classifier.py +36 -36
- empathy_os/routing/smart_router.py +40 -40
- empathy_os/routing/{wizard_registry.py → workflow_registry.py} +47 -47
- empathy_os/scaffolding/__init__.py +8 -8
- empathy_os/scaffolding/__main__.py +1 -1
- empathy_os/scaffolding/cli.py +28 -28
- empathy_os/socratic/__init__.py +3 -19
- empathy_os/socratic/ab_testing.py +25 -36
- empathy_os/socratic/blueprint.py +38 -38
- empathy_os/socratic/cli.py +34 -20
- empathy_os/socratic/collaboration.py +30 -28
- empathy_os/socratic/domain_templates.py +9 -1
- empathy_os/socratic/embeddings.py +17 -13
- empathy_os/socratic/engine.py +135 -70
- empathy_os/socratic/explainer.py +70 -60
- empathy_os/socratic/feedback.py +24 -19
- empathy_os/socratic/forms.py +15 -10
- empathy_os/socratic/generator.py +51 -35
- empathy_os/socratic/llm_analyzer.py +25 -23
- empathy_os/socratic/mcp_server.py +99 -159
- empathy_os/socratic/session.py +19 -13
- empathy_os/socratic/storage.py +98 -67
- empathy_os/socratic/success.py +38 -27
- empathy_os/socratic/visual_editor.py +51 -39
- empathy_os/socratic/web_ui.py +99 -66
- empathy_os/telemetry/cli.py +3 -1
- empathy_os/telemetry/usage_tracker.py +1 -3
- empathy_os/test_generator/__init__.py +3 -3
- empathy_os/test_generator/cli.py +28 -28
- empathy_os/test_generator/generator.py +64 -66
- empathy_os/test_generator/risk_analyzer.py +11 -11
- empathy_os/vscode_bridge 2.py +173 -0
- empathy_os/vscode_bridge.py +173 -0
- empathy_os/workflows/__init__.py +212 -120
- empathy_os/workflows/batch_processing.py +8 -24
- empathy_os/workflows/bug_predict.py +1 -1
- empathy_os/workflows/code_review.py +20 -5
- empathy_os/workflows/code_review_pipeline.py +13 -8
- empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
- empathy_os/workflows/manage_documentation.py +1 -0
- empathy_os/workflows/orchestrated_health_check.py +6 -11
- empathy_os/workflows/orchestrated_release_prep.py +3 -3
- empathy_os/workflows/pr_review.py +18 -10
- empathy_os/workflows/progressive/README 2.md +454 -0
- empathy_os/workflows/progressive/__init__ 2.py +92 -0
- empathy_os/workflows/progressive/__init__.py +2 -12
- empathy_os/workflows/progressive/cli 2.py +242 -0
- empathy_os/workflows/progressive/cli.py +14 -37
- empathy_os/workflows/progressive/core 2.py +488 -0
- empathy_os/workflows/progressive/core.py +12 -12
- empathy_os/workflows/progressive/orchestrator 2.py +701 -0
- empathy_os/workflows/progressive/orchestrator.py +166 -144
- empathy_os/workflows/progressive/reports 2.py +528 -0
- empathy_os/workflows/progressive/reports.py +22 -31
- empathy_os/workflows/progressive/telemetry 2.py +280 -0
- empathy_os/workflows/progressive/telemetry.py +8 -14
- empathy_os/workflows/progressive/test_gen 2.py +514 -0
- empathy_os/workflows/progressive/test_gen.py +29 -48
- empathy_os/workflows/progressive/workflow 2.py +628 -0
- empathy_os/workflows/progressive/workflow.py +31 -70
- empathy_os/workflows/release_prep.py +21 -6
- empathy_os/workflows/release_prep_crew.py +1 -0
- empathy_os/workflows/secure_release.py +13 -6
- empathy_os/workflows/security_audit.py +8 -3
- empathy_os/workflows/test_coverage_boost_crew.py +3 -2
- empathy_os/workflows/test_maintenance_crew.py +1 -0
- empathy_os/workflows/test_runner.py +16 -12
- empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
- empathy_software_plugin/cli.py +0 -122
- patterns/README.md +119 -0
- patterns/__init__.py +95 -0
- patterns/behavior.py +298 -0
- patterns/code_review_memory.json +441 -0
- patterns/core.py +97 -0
- patterns/debugging.json +3763 -0
- patterns/empathy.py +268 -0
- patterns/health_check_memory.json +505 -0
- patterns/input.py +161 -0
- patterns/memory_graph.json +8 -0
- patterns/refactoring_memory.json +1113 -0
- patterns/registry.py +663 -0
- patterns/security_memory.json +8 -0
- patterns/structural.py +415 -0
- patterns/validation.py +194 -0
- coach_wizards/__init__.py +0 -45
- coach_wizards/accessibility_wizard.py +0 -91
- coach_wizards/api_wizard.py +0 -91
- coach_wizards/base_wizard.py +0 -209
- coach_wizards/cicd_wizard.py +0 -91
- coach_wizards/code_reviewer_README.md +0 -60
- coach_wizards/code_reviewer_wizard.py +0 -180
- coach_wizards/compliance_wizard.py +0 -91
- coach_wizards/database_wizard.py +0 -91
- coach_wizards/debugging_wizard.py +0 -91
- coach_wizards/documentation_wizard.py +0 -91
- coach_wizards/generate_wizards.py +0 -347
- coach_wizards/localization_wizard.py +0 -173
- coach_wizards/migration_wizard.py +0 -91
- coach_wizards/monitoring_wizard.py +0 -91
- coach_wizards/observability_wizard.py +0 -91
- coach_wizards/performance_wizard.py +0 -91
- coach_wizards/prompt_engineering_wizard.py +0 -661
- coach_wizards/refactoring_wizard.py +0 -91
- coach_wizards/scaling_wizard.py +0 -90
- coach_wizards/security_wizard.py +0 -92
- coach_wizards/testing_wizard.py +0 -91
- empathy_framework-4.6.6.dist-info/METADATA +0 -1597
- empathy_framework-4.6.6.dist-info/RECORD +0 -410
- empathy_llm_toolkit/wizards/__init__.py +0 -43
- empathy_llm_toolkit/wizards/base_wizard.py +0 -364
- empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
- empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
- empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
- empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
- empathy_os/wizard_factory_cli.py +0 -170
- empathy_software_plugin/wizards/__init__.py +0 -42
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
- empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
- empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
- empathy_software_plugin/wizards/base_wizard.py +0 -288
- empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
- empathy_software_plugin/wizards/code_review_wizard.py +0 -604
- empathy_software_plugin/wizards/debugging/__init__.py +0 -50
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
- empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
- empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
- empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
- empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
- empathy_software_plugin/wizards/debugging/verification.py +0 -369
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
- empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
- empathy_software_plugin/wizards/performance/__init__.py +0 -9
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
- empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
- empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
- empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
- empathy_software_plugin/wizards/security/__init__.py +0 -32
- empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
- empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
- empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
- empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
- empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
- empathy_software_plugin/wizards/testing/__init__.py +0 -27
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
- empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
- empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
- empathy_software_plugin/wizards/testing_wizard.py +0 -274
- wizards/__init__.py +0 -82
- wizards/admission_assessment_wizard.py +0 -644
- wizards/care_plan.py +0 -321
- wizards/clinical_assessment.py +0 -769
- wizards/discharge_planning.py +0 -77
- wizards/discharge_summary_wizard.py +0 -468
- wizards/dosage_calculation.py +0 -497
- wizards/incident_report_wizard.py +0 -454
- wizards/medication_reconciliation.py +0 -85
- wizards/nursing_assessment.py +0 -171
- wizards/patient_education.py +0 -654
- wizards/quality_improvement.py +0 -705
- wizards/sbar_report.py +0 -324
- wizards/sbar_wizard.py +0 -608
- wizards/shift_handoff_wizard.py +0 -535
- wizards/soap_note_wizard.py +0 -679
- wizards/treatment_plan.py +0 -15
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/WHEEL +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/entry_points.txt +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,378 +0,0 @@
|
|
|
1
|
-
"""Healthcare Wizard - HIPAA-Compliant AI Assistant
|
|
2
|
-
|
|
3
|
-
⚠️ DEPRECATED: This wizard is a basic example and is no longer actively maintained.
|
|
4
|
-
For production healthcare applications, use the specialized healthcare plugin:
|
|
5
|
-
pip install empathy-healthcare-wizards
|
|
6
|
-
|
|
7
|
-
Or visit: https://healthcare.smartaimemory.com/
|
|
8
|
-
|
|
9
|
-
Specialized wizard for healthcare applications with enhanced PHI protection,
|
|
10
|
-
mandatory encryption, comprehensive audit logging, and HIPAA compliance features.
|
|
11
|
-
|
|
12
|
-
Key Features:
|
|
13
|
-
- Enhanced PHI/PII detection (10+ medical patterns)
|
|
14
|
-
- Automatic de-identification before LLM processing
|
|
15
|
-
- Mandatory AES-256-GCM encryption for all data
|
|
16
|
-
- 90-day minimum retention (HIPAA §164.528)
|
|
17
|
-
- Comprehensive audit trail (HIPAA §164.312(b))
|
|
18
|
-
- Access control and permission enforcement
|
|
19
|
-
- Automatic classification as SENSITIVE
|
|
20
|
-
|
|
21
|
-
Reference:
|
|
22
|
-
- HIPAA Security Rule (45 CFR §164.312)
|
|
23
|
-
- HIPAA Privacy Rule (45 CFR §164.514)
|
|
24
|
-
- HITECH Act requirements
|
|
25
|
-
|
|
26
|
-
Copyright 2025 Smart AI Memory, LLC
|
|
27
|
-
Licensed under Fair Source 0.9
|
|
28
|
-
"""
|
|
29
|
-
|
|
30
|
-
import logging
|
|
31
|
-
import warnings
|
|
32
|
-
from typing import Any
|
|
33
|
-
|
|
34
|
-
from empathy_llm_toolkit import EmpathyLLM
|
|
35
|
-
|
|
36
|
-
from .base_wizard import BaseWizard, WizardConfig
|
|
37
|
-
|
|
38
|
-
logger = logging.getLogger(__name__)
|
|
39
|
-
|
|
40
|
-
# Deprecation warning
|
|
41
|
-
warnings.warn(
|
|
42
|
-
"HealthcareWizard is deprecated and will be removed in v5.0. "
|
|
43
|
-
"Use the specialized healthcare plugin instead: "
|
|
44
|
-
"pip install empathy-healthcare-wizards",
|
|
45
|
-
DeprecationWarning,
|
|
46
|
-
stacklevel=2,
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
# Enhanced PHI patterns for healthcare (beyond standard PII)
|
|
51
|
-
HEALTHCARE_PHI_PATTERNS = [
|
|
52
|
-
# Standard PII (enabled by default)
|
|
53
|
-
"email",
|
|
54
|
-
"phone",
|
|
55
|
-
"ssn",
|
|
56
|
-
"address",
|
|
57
|
-
"credit_card",
|
|
58
|
-
"ip_address",
|
|
59
|
-
# Healthcare-specific PHI
|
|
60
|
-
"mrn", # Medical Record Number
|
|
61
|
-
"patient_id", # Patient identifier
|
|
62
|
-
"dob", # Date of birth
|
|
63
|
-
"insurance_id", # Insurance/policy numbers
|
|
64
|
-
"provider_npi", # National Provider Identifier
|
|
65
|
-
"cpt_code", # Medical procedure codes
|
|
66
|
-
"icd_code", # Diagnosis codes
|
|
67
|
-
"medication_name", # Medication names (optional, configurable)
|
|
68
|
-
]
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
class HealthcareWizard(BaseWizard):
|
|
72
|
-
"""HIPAA-compliant healthcare AI assistant
|
|
73
|
-
|
|
74
|
-
Implements defense-in-depth security for Protected Health Information (PHI):
|
|
75
|
-
1. Enhanced PHI detection and scrubbing
|
|
76
|
-
2. Secrets detection (API keys, passwords in medical software configs)
|
|
77
|
-
3. Mandatory encryption (AES-256-GCM)
|
|
78
|
-
4. Comprehensive audit logging
|
|
79
|
-
5. 90-day minimum retention
|
|
80
|
-
6. Access control enforcement
|
|
81
|
-
|
|
82
|
-
Example:
|
|
83
|
-
>>> from empathy_llm_toolkit import EmpathyLLM
|
|
84
|
-
>>> from empathy_llm_toolkit.wizards import HealthcareWizard
|
|
85
|
-
>>>
|
|
86
|
-
>>> llm = EmpathyLLM(
|
|
87
|
-
... provider="anthropic",
|
|
88
|
-
... api_key=os.getenv("ANTHROPIC_API_KEY"),
|
|
89
|
-
... enable_security=True,
|
|
90
|
-
... )
|
|
91
|
-
>>>
|
|
92
|
-
>>> wizard = HealthcareWizard(llm)
|
|
93
|
-
>>>
|
|
94
|
-
>>> result = await wizard.process(
|
|
95
|
-
... user_input="Patient John Doe (MRN 123456) needs follow-up",
|
|
96
|
-
... user_id="doctor@hospital.com"
|
|
97
|
-
... )
|
|
98
|
-
>>>
|
|
99
|
-
>>> print(result['security_report']['phi_removed']) # PHI was scrubbed
|
|
100
|
-
|
|
101
|
-
"""
|
|
102
|
-
|
|
103
|
-
def __init__(
|
|
104
|
-
self,
|
|
105
|
-
llm: EmpathyLLM,
|
|
106
|
-
enable_medication_scrubbing: bool = False,
|
|
107
|
-
enable_diagnosis_scrubbing: bool = False,
|
|
108
|
-
custom_phi_patterns: list[str] | None = None,
|
|
109
|
-
):
|
|
110
|
-
"""Initialize HIPAA-compliant healthcare wizard
|
|
111
|
-
|
|
112
|
-
Args:
|
|
113
|
-
llm: EmpathyLLM instance (security should be enabled)
|
|
114
|
-
enable_medication_scrubbing: Scrub medication names (may reduce context)
|
|
115
|
-
enable_diagnosis_scrubbing: Scrub diagnosis codes (may reduce context)
|
|
116
|
-
custom_phi_patterns: Additional facility-specific PHI patterns
|
|
117
|
-
|
|
118
|
-
Note:
|
|
119
|
-
For maximum HIPAA compliance, llm should be initialized with
|
|
120
|
-
enable_security=True. This wizard enforces SENSITIVE classification
|
|
121
|
-
and 90-day retention regardless of LLM security settings.
|
|
122
|
-
|
|
123
|
-
"""
|
|
124
|
-
# Build PHI pattern list
|
|
125
|
-
phi_patterns = HEALTHCARE_PHI_PATTERNS.copy()
|
|
126
|
-
|
|
127
|
-
if not enable_medication_scrubbing:
|
|
128
|
-
phi_patterns.remove("medication_name")
|
|
129
|
-
if not enable_diagnosis_scrubbing:
|
|
130
|
-
if "cpt_code" in phi_patterns:
|
|
131
|
-
phi_patterns.remove("cpt_code")
|
|
132
|
-
if "icd_code" in phi_patterns:
|
|
133
|
-
phi_patterns.remove("icd_code")
|
|
134
|
-
|
|
135
|
-
if custom_phi_patterns:
|
|
136
|
-
phi_patterns.extend(custom_phi_patterns)
|
|
137
|
-
|
|
138
|
-
# HIPAA-compliant configuration
|
|
139
|
-
config = WizardConfig(
|
|
140
|
-
name="Healthcare Assistant",
|
|
141
|
-
description="HIPAA-compliant AI assistant for healthcare professionals",
|
|
142
|
-
domain="healthcare",
|
|
143
|
-
# Empathy configuration
|
|
144
|
-
default_empathy_level=3, # Proactive - anticipates needs
|
|
145
|
-
# Security configuration (HIPAA requirements)
|
|
146
|
-
enable_security=True,
|
|
147
|
-
pii_patterns=phi_patterns,
|
|
148
|
-
enable_secrets_detection=True,
|
|
149
|
-
block_on_secrets=True, # CRITICAL: Block if secrets detected
|
|
150
|
-
# Audit configuration (HIPAA §164.312(b))
|
|
151
|
-
audit_all_access=True, # Log every interaction
|
|
152
|
-
retention_days=90, # HIPAA minimum for audit logs
|
|
153
|
-
# Classification (HIPAA §164.514)
|
|
154
|
-
default_classification="SENSITIVE", # PHI is always SENSITIVE
|
|
155
|
-
auto_classify=True,
|
|
156
|
-
)
|
|
157
|
-
|
|
158
|
-
super().__init__(llm, config)
|
|
159
|
-
|
|
160
|
-
# Verify security is enabled
|
|
161
|
-
if not llm.enable_security:
|
|
162
|
-
logger.warning(
|
|
163
|
-
"HealthcareWizard initialized with security DISABLED. "
|
|
164
|
-
"HIPAA compliance requires enable_security=True in EmpathyLLM.",
|
|
165
|
-
)
|
|
166
|
-
|
|
167
|
-
logger.info(
|
|
168
|
-
f"HealthcareWizard initialized: {len(phi_patterns)} PHI patterns, "
|
|
169
|
-
f"empathy level={config.default_empathy_level}, security={llm.enable_security}",
|
|
170
|
-
)
|
|
171
|
-
|
|
172
|
-
async def process(
|
|
173
|
-
self,
|
|
174
|
-
user_input: str,
|
|
175
|
-
user_id: str,
|
|
176
|
-
empathy_level: int | None = None,
|
|
177
|
-
session_context: dict[str, Any] | None = None,
|
|
178
|
-
patient_id: str | None = None,
|
|
179
|
-
) -> dict[str, Any]:
|
|
180
|
-
"""Process healthcare request with HIPAA compliance
|
|
181
|
-
|
|
182
|
-
Args:
|
|
183
|
-
user_input: Healthcare professional's message (may contain PHI)
|
|
184
|
-
user_id: Healthcare provider identifier (email, NPI, etc.)
|
|
185
|
-
empathy_level: Override default empathy level
|
|
186
|
-
session_context: Session metadata (encounter ID, facility, etc.)
|
|
187
|
-
patient_id: Patient identifier for audit trail (optional)
|
|
188
|
-
|
|
189
|
-
Returns:
|
|
190
|
-
Dict containing:
|
|
191
|
-
- response: De-identified AI response
|
|
192
|
-
- security_report: PHI scrubbing and security scan results
|
|
193
|
-
- empathy_level: Level used
|
|
194
|
-
- hipaa_compliance: Compliance status
|
|
195
|
-
- audit_event_id: Audit trail event ID
|
|
196
|
-
|
|
197
|
-
Raises:
|
|
198
|
-
SecurityError: If secrets detected in input
|
|
199
|
-
ValueError: If invalid user_id or parameters
|
|
200
|
-
|
|
201
|
-
"""
|
|
202
|
-
# Enhance session context with patient ID for audit trail
|
|
203
|
-
if patient_id:
|
|
204
|
-
if session_context is None:
|
|
205
|
-
session_context = {}
|
|
206
|
-
session_context["patient_id"] = patient_id
|
|
207
|
-
|
|
208
|
-
# Log PHI access
|
|
209
|
-
self.logger.info(
|
|
210
|
-
f"PHI access: user={user_id}, wizard={self.config.name}, "
|
|
211
|
-
f"patient={patient_id}, audit=True",
|
|
212
|
-
)
|
|
213
|
-
|
|
214
|
-
# Process through base wizard (handles security pipeline)
|
|
215
|
-
result = await super().process(
|
|
216
|
-
user_input=user_input,
|
|
217
|
-
user_id=user_id,
|
|
218
|
-
empathy_level=empathy_level,
|
|
219
|
-
session_context=session_context,
|
|
220
|
-
)
|
|
221
|
-
|
|
222
|
-
# Add HIPAA compliance metadata
|
|
223
|
-
result["hipaa_compliance"] = {
|
|
224
|
-
"phi_detected": result.get("security_report", {}).get("pii_count", 0) > 0,
|
|
225
|
-
"phi_scrubbed": True if self.llm.enable_security else False,
|
|
226
|
-
"encrypted": result.get("security_report", {}).get("encrypted", False),
|
|
227
|
-
"audit_logged": True,
|
|
228
|
-
"retention_days": self.config.retention_days,
|
|
229
|
-
"classification": "SENSITIVE",
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
# Log completion
|
|
233
|
-
self.logger.info(
|
|
234
|
-
f"PHI processing complete: user={user_id}, "
|
|
235
|
-
f"detected={result['hipaa_compliance']['phi_detected']}, "
|
|
236
|
-
f"scrubbed={result['hipaa_compliance']['phi_scrubbed']}",
|
|
237
|
-
)
|
|
238
|
-
|
|
239
|
-
return result
|
|
240
|
-
|
|
241
|
-
def _build_system_prompt(self, user_input: str = "") -> str:
|
|
242
|
-
"""Build HIPAA-aware system prompt for healthcare domain
|
|
243
|
-
|
|
244
|
-
Includes:
|
|
245
|
-
- Healthcare domain knowledge
|
|
246
|
-
- HIPAA compliance reminders
|
|
247
|
-
- Clinical communication best practices
|
|
248
|
-
- Patient privacy emphasis
|
|
249
|
-
|
|
250
|
-
Uses XML-enhanced prompts if enabled for improved reliability
|
|
251
|
-
and reduced hallucinations (critical for HIPAA compliance).
|
|
252
|
-
"""
|
|
253
|
-
# Check if XML prompts are enabled
|
|
254
|
-
if self._is_xml_enabled():
|
|
255
|
-
# Use XML-enhanced prompt for better structure and HIPAA compliance
|
|
256
|
-
return self._render_xml_prompt(
|
|
257
|
-
role="HIPAA-compliant AI healthcare assistant for clinical decision support",
|
|
258
|
-
goal="Assist healthcare professionals with evidence-based clinical guidance while maintaining strict HIPAA compliance and patient safety",
|
|
259
|
-
instructions=[
|
|
260
|
-
"Provide clinical decision support based on current evidence-based guidelines",
|
|
261
|
-
"Support clinical documentation following standardized formats (SBAR, SOAP, etc.)",
|
|
262
|
-
"Help with care coordination and patient management workflows",
|
|
263
|
-
"Use standardized medical terminology (ICD-10, CPT, SNOMED) where appropriate",
|
|
264
|
-
"Acknowledge limitations and suggest specialist consultation when needed",
|
|
265
|
-
"Maintain professional, empathetic communication",
|
|
266
|
-
],
|
|
267
|
-
constraints=[
|
|
268
|
-
"CRITICAL: All PHI is automatically de-identified - never request or display patient identifiers",
|
|
269
|
-
"You are a decision support tool, NOT a replacement for professional clinical judgment",
|
|
270
|
-
"NEVER diagnose or prescribe - support licensed healthcare providers who do",
|
|
271
|
-
"In emergencies, direct to appropriate emergency services immediately",
|
|
272
|
-
"Focus on clinical reasoning and evidence-based medicine",
|
|
273
|
-
"Patient safety and privacy are paramount - all interactions logged for HIPAA compliance",
|
|
274
|
-
],
|
|
275
|
-
input_type="clinical_query",
|
|
276
|
-
input_payload=user_input if user_input else "[Healthcare professional query]",
|
|
277
|
-
extra={
|
|
278
|
-
"domain": "Healthcare / Clinical Medicine",
|
|
279
|
-
"compliance": "HIPAA §164.312 (Security Rule), §164.514 (Privacy Rule)",
|
|
280
|
-
"empathy_level": self.config.default_empathy_level,
|
|
281
|
-
"phi_detection_enabled": len(self.config.pii_patterns),
|
|
282
|
-
},
|
|
283
|
-
)
|
|
284
|
-
else:
|
|
285
|
-
# Fallback to legacy plain text prompt
|
|
286
|
-
return """You are a HIPAA-compliant AI healthcare assistant.
|
|
287
|
-
|
|
288
|
-
**Domain**: Healthcare / Clinical Medicine
|
|
289
|
-
|
|
290
|
-
**Your Role**:
|
|
291
|
-
- Assist healthcare professionals with clinical decision support
|
|
292
|
-
- Provide evidence-based medical information
|
|
293
|
-
- Support clinical documentation and communication
|
|
294
|
-
- Help with care coordination and patient management
|
|
295
|
-
|
|
296
|
-
**HIPAA Compliance**:
|
|
297
|
-
- All patient data (PHI) is automatically de-identified before you see it
|
|
298
|
-
- Never request or display patient identifiers in your responses
|
|
299
|
-
- Focus on clinical reasoning and medical knowledge
|
|
300
|
-
- Maintain patient confidentiality at all times
|
|
301
|
-
|
|
302
|
-
**Clinical Guidelines**:
|
|
303
|
-
- Base recommendations on current evidence-based guidelines
|
|
304
|
-
- Acknowledge limitations and suggest consulting specialists when appropriate
|
|
305
|
-
- Use standardized medical terminology (ICD-10, CPT, SNOMED)
|
|
306
|
-
- Follow clinical communication best practices (SBAR, SOAP, etc.)
|
|
307
|
-
|
|
308
|
-
**Communication Style**:
|
|
309
|
-
- Professional and empathetic
|
|
310
|
-
- Clear and concise
|
|
311
|
-
- Evidence-based
|
|
312
|
-
- Action-oriented when appropriate
|
|
313
|
-
|
|
314
|
-
**Important Disclaimers**:
|
|
315
|
-
- You are a clinical decision support tool, not a replacement for professional judgment
|
|
316
|
-
- Always defer to licensed healthcare providers for final decisions
|
|
317
|
-
- In emergencies, direct users to appropriate emergency services
|
|
318
|
-
- Do not diagnose or prescribe - support healthcare professionals who do
|
|
319
|
-
|
|
320
|
-
Remember: Patient safety and privacy are paramount. Interactions are logged for HIPAA compliance.
|
|
321
|
-
"""
|
|
322
|
-
|
|
323
|
-
def get_phi_patterns(self) -> list[str]:
|
|
324
|
-
"""Get list of PHI patterns being detected"""
|
|
325
|
-
return self.config.pii_patterns.copy()
|
|
326
|
-
|
|
327
|
-
def get_hipaa_compliance_status(self) -> dict[str, Any]:
|
|
328
|
-
"""Get HIPAA compliance status for this wizard
|
|
329
|
-
|
|
330
|
-
Returns:
|
|
331
|
-
Dict with compliance checks and recommendations
|
|
332
|
-
|
|
333
|
-
"""
|
|
334
|
-
status: dict[str, Any] = {
|
|
335
|
-
"compliant": True,
|
|
336
|
-
"checks": {},
|
|
337
|
-
"recommendations": [],
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
# Check 1: Security enabled
|
|
341
|
-
status["checks"]["security_enabled"] = self.llm.enable_security
|
|
342
|
-
if not self.llm.enable_security:
|
|
343
|
-
status["compliant"] = False
|
|
344
|
-
status["recommendations"].append(
|
|
345
|
-
"Enable security in EmpathyLLM (enable_security=True) for HIPAA compliance",
|
|
346
|
-
)
|
|
347
|
-
|
|
348
|
-
# Check 2: Encryption for SENSITIVE data
|
|
349
|
-
# Note: Encryption is handled by SecureMemDocsIntegration, not directly by EmpathyLLM
|
|
350
|
-
status["checks"]["encryption_enabled"] = self.llm.enable_security
|
|
351
|
-
if not status["checks"]["encryption_enabled"]:
|
|
352
|
-
status["recommendations"].append(
|
|
353
|
-
"Enable encryption for SENSITIVE data (HIPAA §164.312(a)(2)(iv))",
|
|
354
|
-
)
|
|
355
|
-
|
|
356
|
-
# Check 3: Audit logging
|
|
357
|
-
status["checks"]["audit_logging"] = (
|
|
358
|
-
self.llm.enable_security and self.config.audit_all_access
|
|
359
|
-
)
|
|
360
|
-
if not status["checks"]["audit_logging"]:
|
|
361
|
-
status["compliant"] = False
|
|
362
|
-
status["recommendations"].append(
|
|
363
|
-
"Enable comprehensive audit logging (HIPAA §164.312(b))",
|
|
364
|
-
)
|
|
365
|
-
|
|
366
|
-
# Check 4: PHI detection
|
|
367
|
-
status["checks"]["phi_detection"] = len(self.config.pii_patterns) >= 10
|
|
368
|
-
if not status["checks"]["phi_detection"]:
|
|
369
|
-
status["recommendations"].append("Enable comprehensive PHI detection patterns")
|
|
370
|
-
|
|
371
|
-
# Check 5: Minimum retention
|
|
372
|
-
status["checks"]["retention_policy"] = self.config.retention_days >= 90
|
|
373
|
-
if not status["checks"]["retention_policy"]:
|
|
374
|
-
status["recommendations"].append(
|
|
375
|
-
"Set minimum 90-day retention for audit logs (HIPAA §164.528)",
|
|
376
|
-
)
|
|
377
|
-
|
|
378
|
-
return status
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
# Patient Assessment Wizard
|
|
2
|
-
|
|
3
|
-
**Domain:** healthcare
|
|
4
|
-
**Type:** Wizard
|
|
5
|
-
**Generated:** Pattern-Compose Methodology
|
|
6
|
-
|
|
7
|
-
## Overview
|
|
8
|
-
|
|
9
|
-
Auto-generated wizard using proven patterns from the Empathy Framework.
|
|
10
|
-
|
|
11
|
-
## Patterns Used
|
|
12
|
-
|
|
13
|
-
- **Empathy Level**: 0-4 empathy level configuration
|
|
14
|
-
- **User Guidance**: Help text, examples, and prompts
|
|
15
|
-
- **Linear Flow**: Step-by-step wizard with review and approval
|
|
16
|
-
- **Structured Fields**: Predefined fields per step with validation
|
|
17
|
-
- **Step Validation**: Ensure steps are completed in order
|
|
18
|
-
- **User Approval**: Preview → Explicit Approval → Finalize
|
|
19
|
-
- **Educational Banner**: Safety notices and educational content
|
|
20
|
-
- **AI Enhancement**: Improve user input with AI
|
|
21
|
-
- **Config Validation**: Validate wizard configuration on initialization
|
|
22
|
-
- **Session-Based**: State management with session storage
|
|
23
|
-
|
|
24
|
-
## Usage
|
|
25
|
-
|
|
26
|
-
```python
|
|
27
|
-
from wizards.patient_assessment_wizard import PatientAssessmentWizard
|
|
28
|
-
|
|
29
|
-
wizard = PatientAssessmentWizard()
|
|
30
|
-
result = await wizard.process(user_input="...")
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## API Endpoints
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
# Process with wizard
|
|
37
|
-
POST /api/wizard/patient_assessment/process
|
|
38
|
-
{
|
|
39
|
-
"input": "your input here",
|
|
40
|
-
"context": {}
|
|
41
|
-
}
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
## Testing
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
# Run unit tests
|
|
48
|
-
pytest tests/unit/wizards/test_patient_assessment_wizard.py
|
|
49
|
-
|
|
50
|
-
# Run with coverage
|
|
51
|
-
pytest tests/unit/wizards/test_patient_assessment_wizard.py --cov
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Next Steps
|
|
55
|
-
|
|
56
|
-
1. Customize wizard logic as needed
|
|
57
|
-
2. Add domain-specific validation
|
|
58
|
-
3. Extend with additional features
|
|
59
|
-
4. Update tests for custom logic
|
|
60
|
-
|
|
61
|
-
---
|
|
62
|
-
|
|
63
|
-
**Generated by:** Empathy Framework - Wizard Factory
|
|
64
|
-
**Methodology:** Pattern-Compose
|
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
"""PatientAssessmentWizard - Generated by Pattern-Compose
|
|
2
|
-
|
|
3
|
-
Domain: healthcare
|
|
4
|
-
Patterns: empathy_level, user_guidance, linear_flow, structured_fields, step_validation, approval, educational_banner, ai_enhancement, config_validation, session_based
|
|
5
|
-
Generated: Auto-generated by Empathy Framework
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from datetime import datetime
|
|
9
|
-
from typing import Any
|
|
10
|
-
from uuid import uuid4
|
|
11
|
-
|
|
12
|
-
from fastapi import APIRouter, HTTPException
|
|
13
|
-
from pydantic import BaseModel
|
|
14
|
-
|
|
15
|
-
router = APIRouter(
|
|
16
|
-
prefix="/wizards/patient_assessment",
|
|
17
|
-
tags=["wizards"],
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
# Request/Response Models
|
|
22
|
-
class WizardRequest(BaseModel):
|
|
23
|
-
"""Request model for wizard."""
|
|
24
|
-
|
|
25
|
-
input: str
|
|
26
|
-
context: dict[str, Any] | None = None
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class WizardResponse(BaseModel):
|
|
30
|
-
"""Response model for wizard."""
|
|
31
|
-
|
|
32
|
-
success: bool
|
|
33
|
-
output: str
|
|
34
|
-
wizard_id: str | None = None
|
|
35
|
-
error: str | None = None
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
# Session storage (Redis in production, memory for development)
|
|
39
|
-
_wizard_sessions: dict[str, dict[str, Any]] = {}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
@router.post("/start")
|
|
43
|
-
async def start_wizard():
|
|
44
|
-
"""Start patient_assessment wizard session.
|
|
45
|
-
|
|
46
|
-
Returns wizard_id and first step configuration.
|
|
47
|
-
"""
|
|
48
|
-
wizard_id = str(uuid4())
|
|
49
|
-
|
|
50
|
-
session_data = {
|
|
51
|
-
"wizard_id": wizard_id,
|
|
52
|
-
"wizard_type": "patient_assessment",
|
|
53
|
-
"current_step": 1,
|
|
54
|
-
"total_steps": 5, # TODO: Adjust based on your wizard
|
|
55
|
-
"collected_data": {},
|
|
56
|
-
"created_at": datetime.now().isoformat(),
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
_wizard_sessions[wizard_id] = session_data
|
|
60
|
-
|
|
61
|
-
return {
|
|
62
|
-
"wizard_id": wizard_id,
|
|
63
|
-
"current_step": 1,
|
|
64
|
-
"total_steps": 5,
|
|
65
|
-
"message": "Wizard started successfully",
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
@router.post("/{wizard_id}/step")
|
|
70
|
-
async def submit_step(wizard_id: str, step_data: dict[str, Any]):
|
|
71
|
-
"""Submit data for current step.
|
|
72
|
-
|
|
73
|
-
Validates step sequence and stores data.
|
|
74
|
-
"""
|
|
75
|
-
if wizard_id not in _wizard_sessions:
|
|
76
|
-
raise HTTPException(404, "Wizard session not found")
|
|
77
|
-
|
|
78
|
-
session = _wizard_sessions[wizard_id]
|
|
79
|
-
current_step = session["current_step"]
|
|
80
|
-
total_steps = session["total_steps"]
|
|
81
|
-
|
|
82
|
-
# Validate step number
|
|
83
|
-
submitted_step = step_data.get("step", current_step)
|
|
84
|
-
if submitted_step != current_step:
|
|
85
|
-
raise HTTPException(422, f"Expected step {current_step}, got step {submitted_step}")
|
|
86
|
-
|
|
87
|
-
# Store data
|
|
88
|
-
session["collected_data"].update(step_data.get("data", {}))
|
|
89
|
-
session["updated_at"] = datetime.now().isoformat()
|
|
90
|
-
|
|
91
|
-
# Advance to next step
|
|
92
|
-
if current_step < total_steps:
|
|
93
|
-
session["current_step"] = current_step + 1
|
|
94
|
-
|
|
95
|
-
return {
|
|
96
|
-
"wizard_id": wizard_id,
|
|
97
|
-
"current_step": session["current_step"],
|
|
98
|
-
"total_steps": total_steps,
|
|
99
|
-
"message": f"Step {current_step} completed",
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
@router.post("/{wizard_id}/preview")
|
|
104
|
-
async def preview_report(wizard_id: str):
|
|
105
|
-
"""Generate preview without finalizing.
|
|
106
|
-
|
|
107
|
-
Allows user to review before explicit approval.
|
|
108
|
-
"""
|
|
109
|
-
if wizard_id not in _wizard_sessions:
|
|
110
|
-
raise HTTPException(404, "Wizard session not found")
|
|
111
|
-
|
|
112
|
-
session = _wizard_sessions[wizard_id]
|
|
113
|
-
|
|
114
|
-
if session["current_step"] != session["total_steps"]:
|
|
115
|
-
raise HTTPException(400, "Complete all steps before preview")
|
|
116
|
-
|
|
117
|
-
# Generate preview
|
|
118
|
-
preview = _generate_report(session["collected_data"])
|
|
119
|
-
session["preview_report"] = preview
|
|
120
|
-
session["preview_generated_at"] = datetime.now().isoformat()
|
|
121
|
-
|
|
122
|
-
return {
|
|
123
|
-
"preview": preview,
|
|
124
|
-
"message": "Preview generated. Review and approve to finalize.",
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
@router.post("/{wizard_id}/save")
|
|
129
|
-
async def save_report(wizard_id: str, approval: dict[str, Any]):
|
|
130
|
-
"""Finalize report with user approval.
|
|
131
|
-
|
|
132
|
-
Requires preview generated and explicit user approval.
|
|
133
|
-
"""
|
|
134
|
-
if wizard_id not in _wizard_sessions:
|
|
135
|
-
raise HTTPException(404, "Wizard session not found")
|
|
136
|
-
|
|
137
|
-
session = _wizard_sessions[wizard_id]
|
|
138
|
-
|
|
139
|
-
# Verify preview generated
|
|
140
|
-
if "preview_report" not in session:
|
|
141
|
-
raise HTTPException(400, "Must generate preview before saving. Call /preview first.")
|
|
142
|
-
|
|
143
|
-
# Verify user approval
|
|
144
|
-
if not approval.get("user_approved", False):
|
|
145
|
-
raise HTTPException(400, "User approval required. Set 'user_approved': true")
|
|
146
|
-
|
|
147
|
-
# Mark as complete
|
|
148
|
-
session["completed"] = True
|
|
149
|
-
session["completed_at"] = datetime.now().isoformat()
|
|
150
|
-
session["final_report"] = session["preview_report"]
|
|
151
|
-
|
|
152
|
-
return {
|
|
153
|
-
"wizard_id": wizard_id,
|
|
154
|
-
"completed": True,
|
|
155
|
-
"report": session["final_report"],
|
|
156
|
-
"message": "Report finalized successfully",
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
@router.get("/{wizard_id}/report")
|
|
161
|
-
async def get_report(wizard_id: str):
|
|
162
|
-
"""Retrieve completed report.
|
|
163
|
-
|
|
164
|
-
Only available after wizard is completed.
|
|
165
|
-
"""
|
|
166
|
-
if wizard_id not in _wizard_sessions:
|
|
167
|
-
raise HTTPException(404, "Wizard session not found")
|
|
168
|
-
|
|
169
|
-
session = _wizard_sessions[wizard_id]
|
|
170
|
-
|
|
171
|
-
if not session.get("completed", False):
|
|
172
|
-
raise HTTPException(422, "Wizard not yet completed")
|
|
173
|
-
|
|
174
|
-
return {
|
|
175
|
-
"wizard_id": wizard_id,
|
|
176
|
-
"report": _generate_report(session["collected_data"]),
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
def _generate_report(collected_data: dict[str, Any]) -> dict[str, Any]:
|
|
181
|
-
"""Generate report from collected data.
|
|
182
|
-
|
|
183
|
-
TODO: Customize report generation for your wizard.
|
|
184
|
-
"""
|
|
185
|
-
return {
|
|
186
|
-
"data": collected_data,
|
|
187
|
-
"generated_at": datetime.now().isoformat(),
|
|
188
|
-
"wizard_type": "patient_assessment",
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
# Export router
|
|
193
|
-
__all__ = ["router"]
|