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
wizards/sbar_report.py
DELETED
|
@@ -1,324 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
A wizard for generating SBAR (Situation, Background, Assessment, Recommendation) reports.
|
|
3
|
-
|
|
4
|
-
This multi-step wizard guides users through creating a structured SBAR report,
|
|
5
|
-
which is a standard communication tool in healthcare settings.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from datetime import datetime
|
|
9
|
-
|
|
10
|
-
from fastapi import APIRouter, HTTPException, status
|
|
11
|
-
from pydantic import BaseModel, Field
|
|
12
|
-
from utils.api_responses import create_error_response, create_success_response
|
|
13
|
-
from utils.logging import get_logger
|
|
14
|
-
|
|
15
|
-
from services.openai_client import get_client
|
|
16
|
-
|
|
17
|
-
router = APIRouter(prefix="/wizards/sbar-report", tags=["wizards"])
|
|
18
|
-
logger = get_logger(__name__)
|
|
19
|
-
|
|
20
|
-
# In-memory storage for wizard state. In production, use Redis or a database.
|
|
21
|
-
wizard_sessions: dict[str, dict[str, str]] = {}
|
|
22
|
-
|
|
23
|
-
# --- Pydantic Models for Wizard Steps ---
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class StartSbarResponse(BaseModel):
|
|
27
|
-
wizard_id: str
|
|
28
|
-
message: str
|
|
29
|
-
next_step: str
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class SbarStepInput(BaseModel):
|
|
33
|
-
wizard_id: str = Field(..., description="The unique ID for this wizard session.")
|
|
34
|
-
text: str = Field(..., description="The text content for the current step.")
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
class SbarStepResponse(BaseModel):
|
|
38
|
-
wizard_id: str
|
|
39
|
-
next_step: str
|
|
40
|
-
message: str
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
class GenerateSbarInput(BaseModel):
|
|
44
|
-
wizard_id: str = Field(..., description="The unique ID for this wizard session.")
|
|
45
|
-
recommendation: str = Field(..., description="The 'Recommendation' text.")
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
class GenerateSbarResponse(BaseModel):
|
|
49
|
-
wizard_id: str
|
|
50
|
-
sbar_report: str
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
class DirectSbarInput(BaseModel):
|
|
54
|
-
patient_id: str = Field(..., description="Patient identifier")
|
|
55
|
-
situation: str = Field(..., description="The 'Situation' text")
|
|
56
|
-
background: str = Field(..., description="The 'Background' text")
|
|
57
|
-
assessment: str = Field(..., description="The 'Assessment' text")
|
|
58
|
-
recommendation: str = Field(..., description="The 'Recommendation' text")
|
|
59
|
-
care_setting: str = Field(default="med-surg", description="Care setting context")
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
class DirectSbarResponse(BaseModel):
|
|
63
|
-
sbar_report: str
|
|
64
|
-
care_setting: str
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
# --- Wizard Endpoints ---
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
@router.post("/start", response_model=StartSbarResponse, summary="Step 1: Start the SBAR wizard")
|
|
71
|
-
async def start_sbar_wizard():
|
|
72
|
-
"""
|
|
73
|
-
Initializes a new SBAR report wizard session and returns a unique `wizard_id`.
|
|
74
|
-
"""
|
|
75
|
-
import uuid
|
|
76
|
-
|
|
77
|
-
wizard_id = str(uuid.uuid4())
|
|
78
|
-
wizard_sessions[wizard_id] = {}
|
|
79
|
-
logger.info(f"Started SBAR wizard session: {wizard_id}")
|
|
80
|
-
|
|
81
|
-
return create_success_response(
|
|
82
|
-
{
|
|
83
|
-
"wizard_id": wizard_id,
|
|
84
|
-
"message": "SBAR wizard started. Please proceed to add the 'Situation'.",
|
|
85
|
-
"next_step": "situation",
|
|
86
|
-
}
|
|
87
|
-
)
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
def _update_step(wizard_id: str, step_name: str, text: str, next_step_name: str):
|
|
91
|
-
"""Helper function to update a step in the wizard session."""
|
|
92
|
-
if wizard_id not in wizard_sessions:
|
|
93
|
-
return create_error_response(
|
|
94
|
-
"Wizard session not found.", status.HTTP_404_NOT_FOUND, "wizard_not_found"
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
wizard_sessions[wizard_id][step_name] = text
|
|
98
|
-
logger.info(f"Updated SBAR session {wizard_id} with step: {step_name}")
|
|
99
|
-
|
|
100
|
-
return create_success_response(
|
|
101
|
-
{
|
|
102
|
-
"wizard_id": wizard_id,
|
|
103
|
-
"message": f"'{step_name.capitalize()}' received. Please proceed to add the '{next_step_name.capitalize()}'.",
|
|
104
|
-
"next_step": next_step_name,
|
|
105
|
-
}
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
@router.post("/situation", response_model=SbarStepResponse, summary="Step 2: Add Situation")
|
|
110
|
-
async def add_situation(step_input: SbarStepInput):
|
|
111
|
-
"""Adds the **Situation** component to the SBAR report."""
|
|
112
|
-
return _update_step(step_input.wizard_id, "situation", step_input.text, "background")
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
@router.post("/background", response_model=SbarStepResponse, summary="Step 3: Add Background")
|
|
116
|
-
async def add_background(step_input: SbarStepInput):
|
|
117
|
-
"""Adds the **Background** component to the SBAR report."""
|
|
118
|
-
return _update_step(step_input.wizard_id, "background", step_input.text, "assessment")
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
@router.post("/assessment", response_model=SbarStepResponse, summary="Step 4: Add Assessment")
|
|
122
|
-
async def add_assessment(step_input: SbarStepInput):
|
|
123
|
-
"""Adds the **Assessment** component to the SBAR report."""
|
|
124
|
-
return _update_step(step_input.wizard_id, "assessment", step_input.text, "recommendation")
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
@router.post(
|
|
128
|
-
"/generate",
|
|
129
|
-
response_model=DirectSbarResponse,
|
|
130
|
-
summary="Generate Complete SBAR Report (Direct)",
|
|
131
|
-
)
|
|
132
|
-
async def generate_sbar_report_direct(input_data: DirectSbarInput):
|
|
133
|
-
"""
|
|
134
|
-
Generate a complete SBAR report directly from all provided components.
|
|
135
|
-
This is a simplified endpoint that doesn't require wizard session management.
|
|
136
|
-
"""
|
|
137
|
-
# Validate that all required fields are present
|
|
138
|
-
if not all(
|
|
139
|
-
[
|
|
140
|
-
input_data.situation,
|
|
141
|
-
input_data.background,
|
|
142
|
-
input_data.assessment,
|
|
143
|
-
input_data.recommendation,
|
|
144
|
-
]
|
|
145
|
-
):
|
|
146
|
-
return create_error_response(
|
|
147
|
-
"All SBAR components (situation, background, assessment, recommendation) are required.",
|
|
148
|
-
status.HTTP_400_BAD_REQUEST,
|
|
149
|
-
"missing_required_fields",
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
# Build context-aware prompt based on care setting
|
|
153
|
-
care_setting_context = {
|
|
154
|
-
"icu": "critical care setting with focus on hemodynamic stability and ventilator management",
|
|
155
|
-
"emergency": "emergency department with focus on rapid assessment and triage",
|
|
156
|
-
"home-health": "home health setting with focus on patient/caregiver education and safety",
|
|
157
|
-
"med-surg": "medical-surgical unit with focus on routine monitoring and care coordination",
|
|
158
|
-
}.get(input_data.care_setting, "general clinical setting")
|
|
159
|
-
|
|
160
|
-
prompt = f"""
|
|
161
|
-
Format the following clinical information into a clear, professional SBAR report for a {care_setting_context}.
|
|
162
|
-
|
|
163
|
-
Use these exact headings:
|
|
164
|
-
- SITUATION
|
|
165
|
-
- BACKGROUND
|
|
166
|
-
- ASSESSMENT
|
|
167
|
-
- RECOMMENDATION
|
|
168
|
-
|
|
169
|
-
Format the report professionally with proper spacing and organization suitable for clinical handoff.
|
|
170
|
-
Patient ID: {input_data.patient_id}
|
|
171
|
-
|
|
172
|
-
Situation: {input_data.situation}
|
|
173
|
-
|
|
174
|
-
Background: {input_data.background}
|
|
175
|
-
|
|
176
|
-
Assessment: {input_data.assessment}
|
|
177
|
-
|
|
178
|
-
Recommendation: {input_data.recommendation}
|
|
179
|
-
"""
|
|
180
|
-
|
|
181
|
-
try:
|
|
182
|
-
client = get_client()
|
|
183
|
-
if not client:
|
|
184
|
-
# Fallback: Generate basic SBAR report without AI enhancement
|
|
185
|
-
logger.warning(
|
|
186
|
-
"OpenAI client not available - generating basic SBAR report without AI formatting"
|
|
187
|
-
)
|
|
188
|
-
sbar_report = f"""SBAR Report - Patient ID: {input_data.patient_id}
|
|
189
|
-
Care Setting: {care_setting_context.upper()}
|
|
190
|
-
|
|
191
|
-
SITUATION
|
|
192
|
-
{input_data.situation}
|
|
193
|
-
|
|
194
|
-
BACKGROUND
|
|
195
|
-
{input_data.background}
|
|
196
|
-
|
|
197
|
-
ASSESSMENT
|
|
198
|
-
{input_data.assessment}
|
|
199
|
-
|
|
200
|
-
RECOMMENDATION
|
|
201
|
-
{input_data.recommendation}
|
|
202
|
-
|
|
203
|
-
Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
|
|
204
|
-
Note: This report was generated without AI enhancement. Configure OPENAI_API_KEY for enhanced formatting.
|
|
205
|
-
"""
|
|
206
|
-
return {"sbar_report": sbar_report, "care_setting": input_data.care_setting}
|
|
207
|
-
|
|
208
|
-
response = client.chat.completions.create(
|
|
209
|
-
model="gpt-4o-mini",
|
|
210
|
-
messages=[
|
|
211
|
-
{
|
|
212
|
-
"role": "system",
|
|
213
|
-
"content": f"You are an expert nursing assistant specializing in clinical communication in a {care_setting_context}. Format SBAR reports clearly and professionally.",
|
|
214
|
-
},
|
|
215
|
-
{"role": "user", "content": prompt},
|
|
216
|
-
],
|
|
217
|
-
temperature=0.3, # Lower temperature for more consistent formatting
|
|
218
|
-
)
|
|
219
|
-
sbar_report = response.choices[0].message.content
|
|
220
|
-
logger.info(
|
|
221
|
-
f"Successfully generated SBAR report for patient {input_data.patient_id} in {input_data.care_setting} setting"
|
|
222
|
-
)
|
|
223
|
-
|
|
224
|
-
return {"sbar_report": sbar_report, "care_setting": input_data.care_setting}
|
|
225
|
-
except Exception as e:
|
|
226
|
-
logger.error(f"SBAR report generation failed: {e}", exc_info=True)
|
|
227
|
-
raise HTTPException(
|
|
228
|
-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
229
|
-
detail=f"Failed to generate SBAR report: {str(e)}",
|
|
230
|
-
)
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
@router.post(
|
|
234
|
-
"/generate-wizard",
|
|
235
|
-
response_model=GenerateSbarResponse,
|
|
236
|
-
summary="Step 5: Add Recommendation and Generate Report (Wizard)",
|
|
237
|
-
)
|
|
238
|
-
async def generate_sbar_report_wizard(step_input: GenerateSbarInput):
|
|
239
|
-
"""
|
|
240
|
-
Adds the final **Recommendation** component and generates the complete,
|
|
241
|
-
formatted SBAR report using an AI model. (Wizard session-based flow)
|
|
242
|
-
"""
|
|
243
|
-
wizard_id = step_input.wizard_id
|
|
244
|
-
if wizard_id not in wizard_sessions:
|
|
245
|
-
return create_error_response(
|
|
246
|
-
"Wizard session not found.", status.HTTP_404_NOT_FOUND, "wizard_not_found"
|
|
247
|
-
)
|
|
248
|
-
|
|
249
|
-
session_data = wizard_sessions[wizard_id]
|
|
250
|
-
session_data["recommendation"] = step_input.recommendation
|
|
251
|
-
|
|
252
|
-
# Verify all parts are present
|
|
253
|
-
required_parts = ["situation", "background", "assessment", "recommendation"]
|
|
254
|
-
if not all(part in session_data for part in required_parts):
|
|
255
|
-
missing = [part for part in required_parts if part not in session_data]
|
|
256
|
-
return create_error_response(
|
|
257
|
-
f"Cannot generate report. Missing parts: {', '.join(missing)}",
|
|
258
|
-
status.HTTP_400_BAD_REQUEST,
|
|
259
|
-
"missing_sbar_parts",
|
|
260
|
-
)
|
|
261
|
-
|
|
262
|
-
prompt = f"""
|
|
263
|
-
Format the following clinical information into a clear and concise SBAR report.
|
|
264
|
-
Use clear headings for each section (Situation, Background, Assessment, Recommendation).
|
|
265
|
-
Ensure the language is professional and suitable for a clinical handoff.
|
|
266
|
-
|
|
267
|
-
Situation: {session_data['situation']}
|
|
268
|
-
Background: {session_data['background']}
|
|
269
|
-
Assessment: {session_data['assessment']}
|
|
270
|
-
Recommendation: {session_data['recommendation']}
|
|
271
|
-
"""
|
|
272
|
-
|
|
273
|
-
try:
|
|
274
|
-
client = get_client()
|
|
275
|
-
if not client:
|
|
276
|
-
# Fallback: Generate basic SBAR report without AI enhancement
|
|
277
|
-
logger.warning(
|
|
278
|
-
f"OpenAI client not available for session {wizard_id} - generating basic SBAR report"
|
|
279
|
-
)
|
|
280
|
-
sbar_report = f"""SBAR Report
|
|
281
|
-
|
|
282
|
-
SITUATION
|
|
283
|
-
{session_data['situation']}
|
|
284
|
-
|
|
285
|
-
BACKGROUND
|
|
286
|
-
{session_data['background']}
|
|
287
|
-
|
|
288
|
-
ASSESSMENT
|
|
289
|
-
{session_data['assessment']}
|
|
290
|
-
|
|
291
|
-
RECOMMENDATION
|
|
292
|
-
{session_data['recommendation']}
|
|
293
|
-
|
|
294
|
-
Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
|
|
295
|
-
Note: This report was generated without AI enhancement. Configure OPENAI_API_KEY for enhanced formatting.
|
|
296
|
-
"""
|
|
297
|
-
# Clean up the session
|
|
298
|
-
del wizard_sessions[wizard_id]
|
|
299
|
-
|
|
300
|
-
return {"wizard_id": wizard_id, "sbar_report": sbar_report}
|
|
301
|
-
|
|
302
|
-
response = client.chat.completions.create(
|
|
303
|
-
model="gpt-4o-mini",
|
|
304
|
-
messages=[
|
|
305
|
-
{
|
|
306
|
-
"role": "system",
|
|
307
|
-
"content": "You are an expert nursing assistant specializing in clinical communication.",
|
|
308
|
-
},
|
|
309
|
-
{"role": "user", "content": prompt},
|
|
310
|
-
],
|
|
311
|
-
)
|
|
312
|
-
sbar_report = response.choices[0].message.content
|
|
313
|
-
logger.info(f"Successfully generated SBAR report for session {wizard_id}")
|
|
314
|
-
|
|
315
|
-
# Clean up the session
|
|
316
|
-
del wizard_sessions[wizard_id]
|
|
317
|
-
|
|
318
|
-
return {"wizard_id": wizard_id, "sbar_report": sbar_report}
|
|
319
|
-
except Exception as e:
|
|
320
|
-
logger.error(f"SBAR report generation failed for session {wizard_id}: {e}", exc_info=True)
|
|
321
|
-
raise HTTPException(
|
|
322
|
-
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
323
|
-
detail=f"Failed to generate SBAR report: {str(e)}",
|
|
324
|
-
)
|