empathy-framework 4.6.6__py3-none-any.whl → 4.7.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.
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/METADATA +7 -6
- empathy_framework-4.7.0.dist-info/RECORD +354 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/top_level.txt +0 -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.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/__init__.py +2 -12
- empathy_os/workflows/progressive/cli.py +14 -37
- empathy_os/workflows/progressive/core.py +12 -12
- empathy_os/workflows/progressive/orchestrator.py +166 -144
- empathy_os/workflows/progressive/reports.py +22 -31
- empathy_os/workflows/progressive/telemetry.py +8 -14
- empathy_os/workflows/progressive/test_gen.py +29 -48
- 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
- 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/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.0.dist-info}/WHEEL +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/entry_points.txt +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
"""Base Wizard - Foundation for all EmpathyLLM wizards
|
|
2
|
-
|
|
3
|
-
Provides common functionality for security-aware AI assistants with domain-specific
|
|
4
|
-
configurations and integrated privacy controls.
|
|
5
|
-
|
|
6
|
-
Copyright 2025 Smart AI Memory, LLC
|
|
7
|
-
Licensed under Fair Source 0.9
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
import logging
|
|
11
|
-
from dataclasses import dataclass, field
|
|
12
|
-
from typing import Any
|
|
13
|
-
|
|
14
|
-
from empathy_llm_toolkit import EmpathyLLM
|
|
15
|
-
from empathy_llm_toolkit.claude_memory import ClaudeMemoryConfig
|
|
16
|
-
|
|
17
|
-
logger = logging.getLogger(__name__)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
@dataclass
|
|
21
|
-
class WizardConfig:
|
|
22
|
-
"""Configuration for an Empathy wizard"""
|
|
23
|
-
|
|
24
|
-
# Wizard identity
|
|
25
|
-
name: str
|
|
26
|
-
description: str
|
|
27
|
-
domain: str # healthcare, finance, legal, general, etc.
|
|
28
|
-
|
|
29
|
-
# Empathy level (0-4)
|
|
30
|
-
default_empathy_level: int = 2
|
|
31
|
-
|
|
32
|
-
# Security configuration
|
|
33
|
-
enable_security: bool = False
|
|
34
|
-
pii_patterns: list[str] = field(default_factory=list)
|
|
35
|
-
enable_secrets_detection: bool = False
|
|
36
|
-
block_on_secrets: bool = True
|
|
37
|
-
|
|
38
|
-
# Audit configuration
|
|
39
|
-
audit_all_access: bool = False
|
|
40
|
-
retention_days: int = 180
|
|
41
|
-
|
|
42
|
-
# Classification
|
|
43
|
-
default_classification: str = "INTERNAL" # PUBLIC, INTERNAL, SENSITIVE
|
|
44
|
-
auto_classify: bool = True
|
|
45
|
-
|
|
46
|
-
# Memory configuration
|
|
47
|
-
enable_memory: bool = False
|
|
48
|
-
memory_config: ClaudeMemoryConfig | None = None
|
|
49
|
-
|
|
50
|
-
# XML-enhanced prompts (Phase 4)
|
|
51
|
-
xml_prompts_enabled: bool = True # Enable by default for better Claude API performance
|
|
52
|
-
xml_schema_version: str = "1.0"
|
|
53
|
-
enforce_xml_response: bool = False # Require XML-structured responses
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
class BaseWizard:
|
|
57
|
-
"""Base class for all Empathy LLM wizards
|
|
58
|
-
|
|
59
|
-
Provides:
|
|
60
|
-
- Integration with EmpathyLLM
|
|
61
|
-
- Security pipeline configuration
|
|
62
|
-
- Domain-specific prompting
|
|
63
|
-
- Audit logging
|
|
64
|
-
- Session management
|
|
65
|
-
"""
|
|
66
|
-
|
|
67
|
-
def __init__(
|
|
68
|
-
self,
|
|
69
|
-
llm: EmpathyLLM,
|
|
70
|
-
config: WizardConfig,
|
|
71
|
-
):
|
|
72
|
-
"""Initialize wizard with LLM and configuration
|
|
73
|
-
|
|
74
|
-
Args:
|
|
75
|
-
llm: EmpathyLLM instance (with or without security enabled)
|
|
76
|
-
config: Wizard configuration
|
|
77
|
-
|
|
78
|
-
"""
|
|
79
|
-
self.llm = llm
|
|
80
|
-
self.config = config
|
|
81
|
-
self.logger = logging.getLogger(f"wizard.{config.name}")
|
|
82
|
-
|
|
83
|
-
# Validate configuration
|
|
84
|
-
self._validate_config()
|
|
85
|
-
|
|
86
|
-
def _validate_config(self):
|
|
87
|
-
"""Validate wizard configuration"""
|
|
88
|
-
if not 0 <= self.config.default_empathy_level <= 4:
|
|
89
|
-
raise ValueError(f"Empathy level must be 0-4, got {self.config.default_empathy_level}")
|
|
90
|
-
|
|
91
|
-
if self.config.default_classification not in ["PUBLIC", "INTERNAL", "SENSITIVE"]:
|
|
92
|
-
raise ValueError(f"Invalid classification: {self.config.default_classification}")
|
|
93
|
-
|
|
94
|
-
async def process(
|
|
95
|
-
self,
|
|
96
|
-
user_input: str,
|
|
97
|
-
user_id: str,
|
|
98
|
-
empathy_level: int | None = None,
|
|
99
|
-
session_context: dict[str, Any] | None = None,
|
|
100
|
-
) -> dict[str, Any]:
|
|
101
|
-
"""Process user input through the wizard
|
|
102
|
-
|
|
103
|
-
Args:
|
|
104
|
-
user_input: User's message or request
|
|
105
|
-
user_id: Identifier for the user
|
|
106
|
-
empathy_level: Override default empathy level (optional)
|
|
107
|
-
session_context: Additional context for the conversation
|
|
108
|
-
|
|
109
|
-
Returns:
|
|
110
|
-
Dictionary containing:
|
|
111
|
-
- response: AI response
|
|
112
|
-
- empathy_level: Level used
|
|
113
|
-
- security_report: Security scan results (if enabled)
|
|
114
|
-
- metadata: Additional wizard metadata
|
|
115
|
-
|
|
116
|
-
"""
|
|
117
|
-
level = empathy_level if empathy_level is not None else self.config.default_empathy_level
|
|
118
|
-
|
|
119
|
-
self.logger.info(
|
|
120
|
-
"processing_request: wizard=%s user_id=%s empathy_level=%s",
|
|
121
|
-
self.config.name,
|
|
122
|
-
user_id,
|
|
123
|
-
level,
|
|
124
|
-
)
|
|
125
|
-
|
|
126
|
-
# Build system prompt with domain knowledge
|
|
127
|
-
system_prompt = self._build_system_prompt()
|
|
128
|
-
|
|
129
|
-
# Add session context if provided
|
|
130
|
-
if session_context:
|
|
131
|
-
context_str = self._format_context(session_context)
|
|
132
|
-
user_input = f"{context_str}\n\n{user_input}"
|
|
133
|
-
|
|
134
|
-
# Process through EmpathyLLM (with security if enabled)
|
|
135
|
-
# Note: EmpathyLLM uses 'force_level' and 'context' parameters
|
|
136
|
-
context_dict = session_context.copy() if session_context else {}
|
|
137
|
-
context_dict["system_prompt"] = system_prompt
|
|
138
|
-
|
|
139
|
-
result = await self.llm.interact(
|
|
140
|
-
user_id=user_id,
|
|
141
|
-
user_input=user_input,
|
|
142
|
-
force_level=level,
|
|
143
|
-
context=context_dict,
|
|
144
|
-
)
|
|
145
|
-
|
|
146
|
-
# Enhance result with wizard metadata
|
|
147
|
-
result["wizard"] = {
|
|
148
|
-
"name": self.config.name,
|
|
149
|
-
"domain": self.config.domain,
|
|
150
|
-
"empathy_level": level,
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
return result
|
|
154
|
-
|
|
155
|
-
def _build_system_prompt(self) -> str:
|
|
156
|
-
"""Build domain-specific system prompt
|
|
157
|
-
|
|
158
|
-
Override in subclasses to add domain knowledge
|
|
159
|
-
"""
|
|
160
|
-
return f"""You are an AI assistant specialized in {self.config.domain}.
|
|
161
|
-
|
|
162
|
-
Description: {self.config.description}
|
|
163
|
-
|
|
164
|
-
Guidelines:
|
|
165
|
-
- Provide accurate, helpful responses
|
|
166
|
-
- Be empathetic and understanding
|
|
167
|
-
- Follow domain best practices
|
|
168
|
-
- Maintain user privacy and confidentiality
|
|
169
|
-
"""
|
|
170
|
-
|
|
171
|
-
def _format_context(self, context: dict[str, Any]) -> str:
|
|
172
|
-
"""Format session context for inclusion in prompt"""
|
|
173
|
-
lines = ["Context:"]
|
|
174
|
-
for key, value in context.items():
|
|
175
|
-
lines.append(f"- {key}: {value}")
|
|
176
|
-
return "\n".join(lines)
|
|
177
|
-
|
|
178
|
-
# =========================================================================
|
|
179
|
-
# XML-Enhanced Prompt Support (Phase 4)
|
|
180
|
-
# =========================================================================
|
|
181
|
-
|
|
182
|
-
def _is_xml_enabled(self) -> bool:
|
|
183
|
-
"""Check if XML prompts are enabled for this wizard."""
|
|
184
|
-
return self.config.xml_prompts_enabled
|
|
185
|
-
|
|
186
|
-
def _render_xml_prompt(
|
|
187
|
-
self,
|
|
188
|
-
role: str,
|
|
189
|
-
goal: str,
|
|
190
|
-
instructions: list[str],
|
|
191
|
-
constraints: list[str],
|
|
192
|
-
input_type: str,
|
|
193
|
-
input_payload: str,
|
|
194
|
-
extra: dict[str, Any] | None = None,
|
|
195
|
-
) -> str:
|
|
196
|
-
"""Render a wizard prompt using XML structure.
|
|
197
|
-
|
|
198
|
-
This method follows Claude API best practices for XML-enhanced prompts,
|
|
199
|
-
providing clearer structure and better performance.
|
|
200
|
-
|
|
201
|
-
Args:
|
|
202
|
-
role: The role/expertise for the AI (e.g., "registered nurse")
|
|
203
|
-
goal: The primary objective of the task
|
|
204
|
-
instructions: Step-by-step instructions list
|
|
205
|
-
constraints: Guidelines and boundaries list
|
|
206
|
-
input_type: Type of input data (e.g., "patient_data", "code", "document")
|
|
207
|
-
input_payload: The actual input content
|
|
208
|
-
extra: Additional context fields (optional)
|
|
209
|
-
|
|
210
|
-
Returns:
|
|
211
|
-
XML-formatted prompt string
|
|
212
|
-
|
|
213
|
-
Example:
|
|
214
|
-
prompt = self._render_xml_prompt(
|
|
215
|
-
role="HIPAA compliance specialist",
|
|
216
|
-
goal="Review patient handoff for completeness",
|
|
217
|
-
instructions=[
|
|
218
|
-
"Check for required SBAR elements",
|
|
219
|
-
"Verify patient identifiers present",
|
|
220
|
-
"Confirm allergies documented",
|
|
221
|
-
],
|
|
222
|
-
constraints=[
|
|
223
|
-
"Follow Joint Commission standards",
|
|
224
|
-
"Maintain professional medical terminology",
|
|
225
|
-
],
|
|
226
|
-
input_type="shift_handoff",
|
|
227
|
-
input_payload=json.dumps(handoff_data),
|
|
228
|
-
)
|
|
229
|
-
|
|
230
|
-
"""
|
|
231
|
-
if not self._is_xml_enabled():
|
|
232
|
-
# Fallback to plain text if XML disabled
|
|
233
|
-
return self._render_plain_prompt(
|
|
234
|
-
role,
|
|
235
|
-
goal,
|
|
236
|
-
instructions,
|
|
237
|
-
constraints,
|
|
238
|
-
input_payload,
|
|
239
|
-
)
|
|
240
|
-
|
|
241
|
-
parts = [f'<task role="{role}" version="{self.config.xml_schema_version}">']
|
|
242
|
-
parts.append(f" <goal>{goal}</goal>")
|
|
243
|
-
parts.append("")
|
|
244
|
-
|
|
245
|
-
if instructions:
|
|
246
|
-
parts.append(" <instructions>")
|
|
247
|
-
for i, inst in enumerate(instructions, 1):
|
|
248
|
-
parts.append(f" {i}. {inst}")
|
|
249
|
-
parts.append(" </instructions>")
|
|
250
|
-
parts.append("")
|
|
251
|
-
|
|
252
|
-
if constraints:
|
|
253
|
-
parts.append(" <constraints>")
|
|
254
|
-
for constraint in constraints:
|
|
255
|
-
parts.append(f" - {constraint}")
|
|
256
|
-
parts.append(" </constraints>")
|
|
257
|
-
parts.append("")
|
|
258
|
-
|
|
259
|
-
# Add extra context if provided
|
|
260
|
-
if extra:
|
|
261
|
-
parts.append(" <context>")
|
|
262
|
-
for key, value in extra.items():
|
|
263
|
-
parts.append(f" <{key}>{value}</{key}>")
|
|
264
|
-
parts.append(" </context>")
|
|
265
|
-
parts.append("")
|
|
266
|
-
|
|
267
|
-
parts.append(f' <input type="{input_type}">')
|
|
268
|
-
parts.append(f" {input_payload}")
|
|
269
|
-
parts.append(" </input>")
|
|
270
|
-
parts.append("</task>")
|
|
271
|
-
|
|
272
|
-
return "\n".join(parts)
|
|
273
|
-
|
|
274
|
-
def _render_plain_prompt(
|
|
275
|
-
self,
|
|
276
|
-
role: str,
|
|
277
|
-
goal: str,
|
|
278
|
-
instructions: list[str],
|
|
279
|
-
constraints: list[str],
|
|
280
|
-
input_payload: str,
|
|
281
|
-
) -> str:
|
|
282
|
-
"""Render plain text prompt (fallback for non-XML mode).
|
|
283
|
-
|
|
284
|
-
Args:
|
|
285
|
-
role: The role/expertise for the AI
|
|
286
|
-
goal: The primary objective
|
|
287
|
-
instructions: Step-by-step instructions
|
|
288
|
-
constraints: Guidelines and boundaries
|
|
289
|
-
input_payload: The input content
|
|
290
|
-
|
|
291
|
-
Returns:
|
|
292
|
-
Plain text formatted prompt
|
|
293
|
-
|
|
294
|
-
"""
|
|
295
|
-
parts = [f"Role: {role}"]
|
|
296
|
-
parts.append(f"Goal: {goal}")
|
|
297
|
-
parts.append("")
|
|
298
|
-
|
|
299
|
-
if instructions:
|
|
300
|
-
parts.append("Instructions:")
|
|
301
|
-
for i, inst in enumerate(instructions, 1):
|
|
302
|
-
parts.append(f"{i}. {inst}")
|
|
303
|
-
parts.append("")
|
|
304
|
-
|
|
305
|
-
if constraints:
|
|
306
|
-
parts.append("Guidelines:")
|
|
307
|
-
for constraint in constraints:
|
|
308
|
-
parts.append(f"- {constraint}")
|
|
309
|
-
parts.append("")
|
|
310
|
-
|
|
311
|
-
parts.append("Input:")
|
|
312
|
-
parts.append(input_payload)
|
|
313
|
-
|
|
314
|
-
return "\n".join(parts)
|
|
315
|
-
|
|
316
|
-
def _parse_xml_response(self, response: str) -> dict[str, Any]:
|
|
317
|
-
"""Parse XML-structured response if enforcement is enabled.
|
|
318
|
-
|
|
319
|
-
Args:
|
|
320
|
-
response: The LLM response text
|
|
321
|
-
|
|
322
|
-
Returns:
|
|
323
|
-
Dictionary with parsed fields or raw response
|
|
324
|
-
|
|
325
|
-
Note:
|
|
326
|
-
This is a basic parser. For production use, consider
|
|
327
|
-
using the full XmlResponseParser from empathy_os.prompts.
|
|
328
|
-
|
|
329
|
-
"""
|
|
330
|
-
if not self.config.enforce_xml_response:
|
|
331
|
-
return {"xml_parsed": False, "content": response}
|
|
332
|
-
|
|
333
|
-
# Basic XML parsing - extract common tags
|
|
334
|
-
import re
|
|
335
|
-
|
|
336
|
-
result: dict[str, Any] = {"xml_parsed": True}
|
|
337
|
-
|
|
338
|
-
# Extract <summary> tag
|
|
339
|
-
summary_match = re.search(r"<summary>(.*?)</summary>", response, re.DOTALL)
|
|
340
|
-
if summary_match:
|
|
341
|
-
result["summary"] = summary_match.group(1).strip()
|
|
342
|
-
|
|
343
|
-
# Extract <recommendation> tags
|
|
344
|
-
recommendations = re.findall(r"<recommendation>(.*?)</recommendation>", response, re.DOTALL)
|
|
345
|
-
if recommendations:
|
|
346
|
-
result["recommendations"] = [r.strip() for r in recommendations]
|
|
347
|
-
|
|
348
|
-
# Extract <finding> tags
|
|
349
|
-
findings = re.findall(r"<finding>(.*?)</finding>", response, re.DOTALL)
|
|
350
|
-
if findings:
|
|
351
|
-
result["findings"] = [f.strip() for f in findings]
|
|
352
|
-
|
|
353
|
-
# Always include raw content
|
|
354
|
-
result["content"] = response
|
|
355
|
-
|
|
356
|
-
return result
|
|
357
|
-
|
|
358
|
-
def get_config(self) -> WizardConfig:
|
|
359
|
-
"""Get wizard configuration"""
|
|
360
|
-
return self.config
|
|
361
|
-
|
|
362
|
-
def get_name(self) -> str:
|
|
363
|
-
"""Get wizard name"""
|
|
364
|
-
return self.config.name
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
"""Customer Support Wizard - Privacy-Compliant AI Assistant
|
|
2
|
-
|
|
3
|
-
Specialized wizard for customer support with PII protection, ticket management,
|
|
4
|
-
and comprehensive audit logging.
|
|
5
|
-
|
|
6
|
-
Key Features:
|
|
7
|
-
- Customer PII detection and protection
|
|
8
|
-
- Automatic de-identification before LLM processing
|
|
9
|
-
- Ticket and case number tracking
|
|
10
|
-
- Comprehensive audit trail
|
|
11
|
-
- Support escalation handling
|
|
12
|
-
- Automatic classification as INTERNAL
|
|
13
|
-
|
|
14
|
-
Copyright 2025 Smart AI Memory, LLC
|
|
15
|
-
Licensed under Fair Source 0.9
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
import logging
|
|
19
|
-
|
|
20
|
-
from empathy_llm_toolkit import EmpathyLLM
|
|
21
|
-
|
|
22
|
-
from .base_wizard import BaseWizard, WizardConfig
|
|
23
|
-
|
|
24
|
-
logger = logging.getLogger(__name__)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
# Customer support PII patterns
|
|
28
|
-
SUPPORT_PII_PATTERNS = [
|
|
29
|
-
# Standard PII
|
|
30
|
-
"email",
|
|
31
|
-
"phone",
|
|
32
|
-
"address",
|
|
33
|
-
"credit_card",
|
|
34
|
-
"ip_address",
|
|
35
|
-
# Support-specific
|
|
36
|
-
"customer_id",
|
|
37
|
-
"ticket_number",
|
|
38
|
-
"order_number",
|
|
39
|
-
"account_number",
|
|
40
|
-
]
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
class CustomerSupportWizard(BaseWizard):
|
|
44
|
-
"""Privacy-compliant customer support AI assistant
|
|
45
|
-
|
|
46
|
-
Implements customer PII protection for support operations:
|
|
47
|
-
1. Customer PII detection and scrubbing
|
|
48
|
-
2. Ticket tracking and management
|
|
49
|
-
3. Encryption for sensitive customer data
|
|
50
|
-
4. Comprehensive audit logging
|
|
51
|
-
5. 2-year retention
|
|
52
|
-
6. Access control enforcement
|
|
53
|
-
|
|
54
|
-
Example:
|
|
55
|
-
>>> from empathy_llm_toolkit import EmpathyLLM
|
|
56
|
-
>>> from empathy_llm_toolkit.wizards import CustomerSupportWizard
|
|
57
|
-
>>>
|
|
58
|
-
>>> llm = EmpathyLLM(
|
|
59
|
-
... provider="anthropic",
|
|
60
|
-
... api_key=os.getenv("ANTHROPIC_API_KEY"),
|
|
61
|
-
... enable_security=True,
|
|
62
|
-
... )
|
|
63
|
-
>>>
|
|
64
|
-
>>> wizard = CustomerSupportWizard(llm)
|
|
65
|
-
>>>
|
|
66
|
-
>>> result = await wizard.process(
|
|
67
|
-
... user_input="Help resolve customer issue with order #12345",
|
|
68
|
-
... user_id="agent@company.com"
|
|
69
|
-
... )
|
|
70
|
-
|
|
71
|
-
"""
|
|
72
|
-
|
|
73
|
-
def __init__(
|
|
74
|
-
self,
|
|
75
|
-
llm: EmpathyLLM,
|
|
76
|
-
custom_pii_patterns: list[str] | None = None,
|
|
77
|
-
):
|
|
78
|
-
"""Initialize customer support wizard
|
|
79
|
-
|
|
80
|
-
Args:
|
|
81
|
-
llm: EmpathyLLM instance (security recommended)
|
|
82
|
-
custom_pii_patterns: Additional company-specific PII patterns
|
|
83
|
-
|
|
84
|
-
"""
|
|
85
|
-
pii_patterns = SUPPORT_PII_PATTERNS.copy()
|
|
86
|
-
|
|
87
|
-
if custom_pii_patterns:
|
|
88
|
-
pii_patterns.extend(custom_pii_patterns)
|
|
89
|
-
|
|
90
|
-
config = WizardConfig(
|
|
91
|
-
name="Customer Support Assistant",
|
|
92
|
-
description="Privacy-compliant AI assistant for customer support teams",
|
|
93
|
-
domain="customer_support",
|
|
94
|
-
default_empathy_level=4, # Anticipatory - predicts customer needs
|
|
95
|
-
enable_security=True,
|
|
96
|
-
pii_patterns=pii_patterns,
|
|
97
|
-
enable_secrets_detection=True,
|
|
98
|
-
block_on_secrets=True,
|
|
99
|
-
audit_all_access=True,
|
|
100
|
-
retention_days=730, # 2 years
|
|
101
|
-
default_classification="INTERNAL",
|
|
102
|
-
auto_classify=True,
|
|
103
|
-
)
|
|
104
|
-
|
|
105
|
-
super().__init__(llm, config)
|
|
106
|
-
|
|
107
|
-
logger.info(
|
|
108
|
-
f"CustomerSupportWizard initialized: {len(pii_patterns)} PII patterns, "
|
|
109
|
-
f"empathy level={config.default_empathy_level}, security={llm.enable_security}",
|
|
110
|
-
)
|
|
111
|
-
|
|
112
|
-
def _build_system_prompt(self, user_input: str = "") -> str:
|
|
113
|
-
"""Build customer support system prompt
|
|
114
|
-
|
|
115
|
-
Uses XML-enhanced prompts if enabled for improved consistency
|
|
116
|
-
and reduced hallucinations in customer-facing scenarios.
|
|
117
|
-
"""
|
|
118
|
-
# Check if XML prompts are enabled
|
|
119
|
-
if self._is_xml_enabled():
|
|
120
|
-
# Use XML-enhanced prompt for better structure
|
|
121
|
-
return self._render_xml_prompt(
|
|
122
|
-
role="privacy-compliant AI customer support assistant for help desk operations",
|
|
123
|
-
goal="Assist support agents with customer inquiries, issue resolution, and excellent service delivery",
|
|
124
|
-
instructions=[
|
|
125
|
-
"Assist support agents with customer inquiries and technical issues",
|
|
126
|
-
"Provide product knowledge, troubleshooting steps, and resolution guidance",
|
|
127
|
-
"Help draft clear, empathetic customer communications",
|
|
128
|
-
"Support ticket management, resolution tracking, and escalation decisions",
|
|
129
|
-
"Recommend solutions based on company policies and best practices",
|
|
130
|
-
"Maintain professional yet friendly communication style",
|
|
131
|
-
],
|
|
132
|
-
constraints=[
|
|
133
|
-
"CRITICAL: All customer PII automatically de-identified - never request or display customer names, emails, accounts",
|
|
134
|
-
"You are a support tool assisting agents, NOT a replacement for human judgment",
|
|
135
|
-
"CANNOT make refund, replacement, or policy exception decisions autonomously",
|
|
136
|
-
"Always defer to supervisors for complex, sensitive, or high-value cases",
|
|
137
|
-
"Prioritize customer satisfaction while following company policies",
|
|
138
|
-
"Customer privacy paramount - all interactions logged for audit",
|
|
139
|
-
],
|
|
140
|
-
input_type="support_query",
|
|
141
|
-
input_payload=user_input if user_input else "[Support agent query]",
|
|
142
|
-
extra={
|
|
143
|
-
"domain": "Customer Support / Help Desk",
|
|
144
|
-
"empathy_level": self.config.default_empathy_level,
|
|
145
|
-
"pii_patterns_enabled": len(self.config.pii_patterns),
|
|
146
|
-
"retention_days": self.config.retention_days,
|
|
147
|
-
},
|
|
148
|
-
)
|
|
149
|
-
else:
|
|
150
|
-
# Fallback to legacy plain text prompt
|
|
151
|
-
return """You are a privacy-compliant AI customer support assistant.
|
|
152
|
-
|
|
153
|
-
**Domain**: Customer Support / Help Desk
|
|
154
|
-
|
|
155
|
-
**Your Role**:
|
|
156
|
-
- Assist support agents with customer inquiries and issues
|
|
157
|
-
- Provide product knowledge and troubleshooting guidance
|
|
158
|
-
- Help draft customer communications
|
|
159
|
-
- Support ticket resolution and escalation
|
|
160
|
-
|
|
161
|
-
**Customer Privacy**:
|
|
162
|
-
- All customer PII is automatically de-identified before you see it
|
|
163
|
-
- Never request or display customer names, emails, or account numbers
|
|
164
|
-
- Maintain customer confidentiality at all times
|
|
165
|
-
- Focus on issue resolution and service excellence
|
|
166
|
-
|
|
167
|
-
**Support Guidelines**:
|
|
168
|
-
- Prioritize customer satisfaction and issue resolution
|
|
169
|
-
- Provide clear, actionable solutions
|
|
170
|
-
- Escalate complex issues appropriately
|
|
171
|
-
- Follow company policies and procedures
|
|
172
|
-
|
|
173
|
-
**Communication Style**:
|
|
174
|
-
- Empathetic and patient
|
|
175
|
-
- Clear and helpful
|
|
176
|
-
- Solution-oriented
|
|
177
|
-
- Professional yet friendly
|
|
178
|
-
|
|
179
|
-
**Important Disclaimers**:
|
|
180
|
-
- You are a support tool to assist agents, not a replacement for human judgment
|
|
181
|
-
- Cannot make refund, replacement, or policy exception decisions
|
|
182
|
-
- Always defer to supervisors for complex or sensitive cases
|
|
183
|
-
- Recommendations should be reviewed by support agents
|
|
184
|
-
|
|
185
|
-
Remember: Customer satisfaction and privacy are paramount. Interactions are logged.
|
|
186
|
-
"""
|
|
187
|
-
|
|
188
|
-
def get_pii_patterns(self) -> list[str]:
|
|
189
|
-
"""Get list of customer support PII patterns being detected"""
|
|
190
|
-
return self.config.pii_patterns.copy()
|