empathy-framework 3.7.0__py3-none-any.whl → 3.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.
- coach_wizards/code_reviewer_README.md +60 -0
- coach_wizards/code_reviewer_wizard.py +180 -0
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/METADATA +20 -2
- empathy_framework-3.7.1.dist-info/RECORD +327 -0
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/top_level.txt +5 -1
- empathy_healthcare_plugin/monitors/__init__.py +9 -0
- empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
- empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
- empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
- empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
- empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
- empathy_llm_toolkit/agent_factory/__init__.py +53 -0
- empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
- empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
- empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
- empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
- empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
- empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
- empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
- empathy_llm_toolkit/agent_factory/base.py +305 -0
- empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
- empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
- empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
- empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
- empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
- empathy_llm_toolkit/agent_factory/decorators.py +286 -0
- empathy_llm_toolkit/agent_factory/factory.py +558 -0
- empathy_llm_toolkit/agent_factory/framework.py +192 -0
- empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
- empathy_llm_toolkit/agent_factory/resilient.py +320 -0
- empathy_llm_toolkit/cli/__init__.py +8 -0
- empathy_llm_toolkit/cli/sync_claude.py +487 -0
- empathy_llm_toolkit/code_health.py +150 -3
- empathy_llm_toolkit/config/__init__.py +29 -0
- empathy_llm_toolkit/config/unified.py +295 -0
- empathy_llm_toolkit/routing/__init__.py +32 -0
- empathy_llm_toolkit/routing/model_router.py +362 -0
- empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
- empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
- empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
- empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
- empathy_llm_toolkit/security/README.md +262 -0
- empathy_llm_toolkit/security/__init__.py +62 -0
- empathy_llm_toolkit/security/audit_logger.py +929 -0
- empathy_llm_toolkit/security/audit_logger_example.py +152 -0
- empathy_llm_toolkit/security/pii_scrubber.py +640 -0
- empathy_llm_toolkit/security/secrets_detector.py +678 -0
- empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
- empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
- empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
- empathy_llm_toolkit/wizards/__init__.py +38 -0
- empathy_llm_toolkit/wizards/base_wizard.py +364 -0
- empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
- empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
- empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
- empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
- empathy_os/__init__.py +52 -52
- empathy_os/adaptive/__init__.py +13 -0
- empathy_os/adaptive/task_complexity.py +127 -0
- empathy_os/cli.py +118 -8
- empathy_os/cli_unified.py +121 -1
- empathy_os/config/__init__.py +63 -0
- empathy_os/config/xml_config.py +239 -0
- empathy_os/dashboard/__init__.py +15 -0
- empathy_os/dashboard/server.py +743 -0
- empathy_os/memory/__init__.py +195 -0
- empathy_os/memory/claude_memory.py +466 -0
- empathy_os/memory/config.py +224 -0
- empathy_os/memory/control_panel.py +1298 -0
- empathy_os/memory/edges.py +179 -0
- empathy_os/memory/graph.py +567 -0
- empathy_os/memory/long_term.py +1193 -0
- empathy_os/memory/nodes.py +179 -0
- empathy_os/memory/redis_bootstrap.py +540 -0
- empathy_os/memory/security/__init__.py +31 -0
- empathy_os/memory/security/audit_logger.py +930 -0
- empathy_os/memory/security/pii_scrubber.py +640 -0
- empathy_os/memory/security/secrets_detector.py +678 -0
- empathy_os/memory/short_term.py +2119 -0
- empathy_os/memory/storage/__init__.py +15 -0
- empathy_os/memory/summary_index.py +583 -0
- empathy_os/memory/unified.py +619 -0
- empathy_os/metrics/__init__.py +12 -0
- empathy_os/metrics/prompt_metrics.py +190 -0
- empathy_os/models/__init__.py +136 -0
- empathy_os/models/__main__.py +13 -0
- empathy_os/models/cli.py +655 -0
- empathy_os/models/empathy_executor.py +354 -0
- empathy_os/models/executor.py +252 -0
- empathy_os/models/fallback.py +671 -0
- empathy_os/models/provider_config.py +563 -0
- empathy_os/models/registry.py +382 -0
- empathy_os/models/tasks.py +302 -0
- empathy_os/models/telemetry.py +548 -0
- empathy_os/models/token_estimator.py +378 -0
- empathy_os/models/validation.py +274 -0
- empathy_os/monitoring/__init__.py +52 -0
- empathy_os/monitoring/alerts.py +23 -0
- empathy_os/monitoring/alerts_cli.py +268 -0
- empathy_os/monitoring/multi_backend.py +271 -0
- empathy_os/monitoring/otel_backend.py +363 -0
- empathy_os/optimization/__init__.py +19 -0
- empathy_os/optimization/context_optimizer.py +272 -0
- empathy_os/plugins/__init__.py +28 -0
- empathy_os/plugins/base.py +361 -0
- empathy_os/plugins/registry.py +268 -0
- empathy_os/project_index/__init__.py +30 -0
- empathy_os/project_index/cli.py +335 -0
- empathy_os/project_index/crew_integration.py +430 -0
- empathy_os/project_index/index.py +425 -0
- empathy_os/project_index/models.py +501 -0
- empathy_os/project_index/reports.py +473 -0
- empathy_os/project_index/scanner.py +538 -0
- empathy_os/prompts/__init__.py +61 -0
- empathy_os/prompts/config.py +77 -0
- empathy_os/prompts/context.py +177 -0
- empathy_os/prompts/parser.py +285 -0
- empathy_os/prompts/registry.py +313 -0
- empathy_os/prompts/templates.py +208 -0
- empathy_os/resilience/__init__.py +56 -0
- empathy_os/resilience/circuit_breaker.py +256 -0
- empathy_os/resilience/fallback.py +179 -0
- empathy_os/resilience/health.py +300 -0
- empathy_os/resilience/retry.py +209 -0
- empathy_os/resilience/timeout.py +135 -0
- empathy_os/routing/__init__.py +43 -0
- empathy_os/routing/chain_executor.py +433 -0
- empathy_os/routing/classifier.py +217 -0
- empathy_os/routing/smart_router.py +234 -0
- empathy_os/routing/wizard_registry.py +307 -0
- empathy_os/trust/__init__.py +28 -0
- empathy_os/trust/circuit_breaker.py +579 -0
- empathy_os/validation/__init__.py +19 -0
- empathy_os/validation/xml_validator.py +281 -0
- empathy_os/wizard_factory_cli.py +170 -0
- empathy_os/workflows/__init__.py +360 -0
- empathy_os/workflows/base.py +1530 -0
- empathy_os/workflows/bug_predict.py +962 -0
- empathy_os/workflows/code_review.py +960 -0
- empathy_os/workflows/code_review_adapters.py +310 -0
- empathy_os/workflows/code_review_pipeline.py +720 -0
- empathy_os/workflows/config.py +600 -0
- empathy_os/workflows/dependency_check.py +648 -0
- empathy_os/workflows/document_gen.py +1069 -0
- empathy_os/workflows/documentation_orchestrator.py +1205 -0
- empathy_os/workflows/health_check.py +679 -0
- empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
- empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
- empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
- empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
- empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
- empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
- empathy_os/workflows/manage_documentation.py +804 -0
- empathy_os/workflows/new_sample_workflow1.py +146 -0
- empathy_os/workflows/new_sample_workflow1_README.md +150 -0
- empathy_os/workflows/perf_audit.py +687 -0
- empathy_os/workflows/pr_review.py +748 -0
- empathy_os/workflows/progress.py +445 -0
- empathy_os/workflows/progress_server.py +322 -0
- empathy_os/workflows/refactor_plan.py +691 -0
- empathy_os/workflows/release_prep.py +808 -0
- empathy_os/workflows/research_synthesis.py +404 -0
- empathy_os/workflows/secure_release.py +585 -0
- empathy_os/workflows/security_adapters.py +297 -0
- empathy_os/workflows/security_audit.py +1050 -0
- empathy_os/workflows/step_config.py +234 -0
- empathy_os/workflows/test5.py +125 -0
- empathy_os/workflows/test5_README.md +158 -0
- empathy_os/workflows/test_gen.py +1855 -0
- empathy_os/workflows/test_lifecycle.py +526 -0
- empathy_os/workflows/test_maintenance.py +626 -0
- empathy_os/workflows/test_maintenance_cli.py +590 -0
- empathy_os/workflows/test_maintenance_crew.py +821 -0
- empathy_os/workflows/xml_enhanced_crew.py +285 -0
- empathy_software_plugin/cli/__init__.py +120 -0
- empathy_software_plugin/cli/inspect.py +362 -0
- empathy_software_plugin/cli.py +3 -1
- empathy_software_plugin/wizards/__init__.py +42 -0
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
- empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
- empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
- empathy_software_plugin/wizards/base_wizard.py +288 -0
- empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
- empathy_software_plugin/wizards/code_review_wizard.py +606 -0
- empathy_software_plugin/wizards/debugging/__init__.py +50 -0
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
- empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
- empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
- empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
- empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
- empathy_software_plugin/wizards/debugging/verification.py +369 -0
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
- empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
- empathy_software_plugin/wizards/performance/__init__.py +9 -0
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
- empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
- empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
- empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
- empathy_software_plugin/wizards/security/__init__.py +32 -0
- empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
- empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
- empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
- empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
- empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
- empathy_software_plugin/wizards/testing/__init__.py +27 -0
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
- empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
- empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
- empathy_software_plugin/wizards/testing_wizard.py +274 -0
- hot_reload/README.md +473 -0
- hot_reload/__init__.py +62 -0
- hot_reload/config.py +84 -0
- hot_reload/integration.py +228 -0
- hot_reload/reloader.py +298 -0
- hot_reload/watcher.py +179 -0
- hot_reload/websocket.py +176 -0
- scaffolding/README.md +589 -0
- scaffolding/__init__.py +35 -0
- scaffolding/__main__.py +14 -0
- scaffolding/cli.py +240 -0
- test_generator/__init__.py +38 -0
- test_generator/__main__.py +14 -0
- test_generator/cli.py +226 -0
- test_generator/generator.py +325 -0
- test_generator/risk_analyzer.py +216 -0
- workflow_patterns/__init__.py +33 -0
- workflow_patterns/behavior.py +249 -0
- workflow_patterns/core.py +76 -0
- workflow_patterns/output.py +99 -0
- workflow_patterns/registry.py +255 -0
- workflow_patterns/structural.py +288 -0
- workflow_scaffolding/__init__.py +11 -0
- workflow_scaffolding/__main__.py +12 -0
- workflow_scaffolding/cli.py +206 -0
- workflow_scaffolding/generator.py +265 -0
- agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
- agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
- agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
- agents/compliance_anticipation_agent.py +0 -1422
- agents/compliance_db.py +0 -339
- agents/epic_integration_wizard.py +0 -530
- agents/notifications.py +0 -291
- agents/trust_building_behaviors.py +0 -872
- empathy_framework-3.7.0.dist-info/RECORD +0 -105
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/WHEEL +0 -0
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/entry_points.txt +0 -0
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.7.1.dist-info}/licenses/LICENSE +0 -0
- /empathy_os/{monitoring.py → agent_monitoring.py} +0 -0
|
@@ -0,0 +1,193 @@
|
|
|
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"]
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"""Technology/IT Wizard - System Security Compliant AI Assistant
|
|
2
|
+
|
|
3
|
+
Specialized wizard for IT and technology operations with system security,
|
|
4
|
+
infrastructure data protection, and comprehensive audit logging.
|
|
5
|
+
|
|
6
|
+
Key Features:
|
|
7
|
+
- System and infrastructure data protection
|
|
8
|
+
- Secrets detection (API keys, credentials, tokens)
|
|
9
|
+
- Security log analysis
|
|
10
|
+
- Comprehensive audit trail
|
|
11
|
+
- DevOps and infrastructure security
|
|
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
|
+
# Technology/IT PII patterns
|
|
28
|
+
TECHNOLOGY_PII_PATTERNS = [
|
|
29
|
+
# Standard PII
|
|
30
|
+
"email",
|
|
31
|
+
"phone",
|
|
32
|
+
"ip_address",
|
|
33
|
+
# Technology-specific
|
|
34
|
+
"api_key",
|
|
35
|
+
"access_token",
|
|
36
|
+
"ssh_key",
|
|
37
|
+
"database_credential",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class TechnologyWizard(BaseWizard):
|
|
42
|
+
"""System security compliant technology and IT AI assistant
|
|
43
|
+
|
|
44
|
+
Implements data protection for IT operations:
|
|
45
|
+
1. Infrastructure data detection and protection
|
|
46
|
+
2. Enhanced secrets detection (API keys, credentials)
|
|
47
|
+
3. Encryption for sensitive system data
|
|
48
|
+
4. Comprehensive audit logging
|
|
49
|
+
5. 1-year retention
|
|
50
|
+
6. Access control enforcement
|
|
51
|
+
|
|
52
|
+
Example:
|
|
53
|
+
>>> from empathy_llm_toolkit import EmpathyLLM
|
|
54
|
+
>>> from empathy_llm_toolkit.wizards import TechnologyWizard
|
|
55
|
+
>>>
|
|
56
|
+
>>> llm = EmpathyLLM(
|
|
57
|
+
... provider="anthropic",
|
|
58
|
+
... api_key=os.getenv("ANTHROPIC_API_KEY"),
|
|
59
|
+
... enable_security=True,
|
|
60
|
+
... )
|
|
61
|
+
>>>
|
|
62
|
+
>>> wizard = TechnologyWizard(llm)
|
|
63
|
+
>>>
|
|
64
|
+
>>> result = await wizard.process(
|
|
65
|
+
... user_input="Help me troubleshoot this infrastructure issue",
|
|
66
|
+
... user_id="sysadmin@company.com"
|
|
67
|
+
... )
|
|
68
|
+
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
def __init__(
|
|
72
|
+
self,
|
|
73
|
+
llm: EmpathyLLM,
|
|
74
|
+
custom_pii_patterns: list[str] | None = None,
|
|
75
|
+
):
|
|
76
|
+
"""Initialize technology/IT wizard
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
llm: EmpathyLLM instance (security should be enabled)
|
|
80
|
+
custom_pii_patterns: Additional organization-specific patterns
|
|
81
|
+
|
|
82
|
+
"""
|
|
83
|
+
pii_patterns = TECHNOLOGY_PII_PATTERNS.copy()
|
|
84
|
+
|
|
85
|
+
if custom_pii_patterns:
|
|
86
|
+
pii_patterns.extend(custom_pii_patterns)
|
|
87
|
+
|
|
88
|
+
config = WizardConfig(
|
|
89
|
+
name="Technology & IT Assistant",
|
|
90
|
+
description="System security compliant AI assistant for IT operations",
|
|
91
|
+
domain="technology",
|
|
92
|
+
default_empathy_level=3, # Proactive
|
|
93
|
+
enable_security=True,
|
|
94
|
+
pii_patterns=pii_patterns,
|
|
95
|
+
enable_secrets_detection=True,
|
|
96
|
+
block_on_secrets=True, # CRITICAL for IT security
|
|
97
|
+
audit_all_access=True,
|
|
98
|
+
retention_days=365, # 1 year for system logs
|
|
99
|
+
default_classification="INTERNAL",
|
|
100
|
+
auto_classify=True,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
super().__init__(llm, config)
|
|
104
|
+
|
|
105
|
+
if not llm.enable_security:
|
|
106
|
+
logger.warning(
|
|
107
|
+
"TechnologyWizard initialized with security DISABLED. "
|
|
108
|
+
"IT security requires enable_security=True in EmpathyLLM.",
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
logger.info(
|
|
112
|
+
f"TechnologyWizard initialized: {len(pii_patterns)} PII patterns, "
|
|
113
|
+
f"empathy level={config.default_empathy_level}, security={llm.enable_security}",
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
def _build_system_prompt(self, user_input: str = "") -> str:
|
|
117
|
+
"""Build technology/IT system prompt
|
|
118
|
+
|
|
119
|
+
Uses XML-enhanced prompts if enabled for improved precision
|
|
120
|
+
and reduced errors in critical IT operations.
|
|
121
|
+
"""
|
|
122
|
+
# Check if XML prompts are enabled
|
|
123
|
+
if self._is_xml_enabled():
|
|
124
|
+
# Use XML-enhanced prompt for better structure
|
|
125
|
+
return self._render_xml_prompt(
|
|
126
|
+
role="system security compliant AI technology and IT assistant for infrastructure operations",
|
|
127
|
+
goal="Assist IT professionals with secure, reliable system administration, infrastructure design, and DevOps automation",
|
|
128
|
+
instructions=[
|
|
129
|
+
"Assist IT professionals with system administration, troubleshooting, and operations",
|
|
130
|
+
"Support infrastructure design, optimization, and scalability planning",
|
|
131
|
+
"Provide security analysis, incident response guidance, and threat mitigation",
|
|
132
|
+
"Help with DevOps automation, CI/CD pipelines, and deployment strategies",
|
|
133
|
+
"Base recommendations on industry best practices (NIST, CIS, OWASP)",
|
|
134
|
+
"Acknowledge compliance requirements (SOC2, ISO 27001, PCI-DSS, GDPR)",
|
|
135
|
+
],
|
|
136
|
+
constraints=[
|
|
137
|
+
"CRITICAL: System data automatically protected - never request or display API keys, credentials, passwords, tokens",
|
|
138
|
+
"You are an IT support tool, NOT a replacement for sysadmin or security expert judgment",
|
|
139
|
+
"CANNOT make production deployment, security policy, or infrastructure decisions autonomously",
|
|
140
|
+
"Always defer to IT leadership for critical infrastructure changes",
|
|
141
|
+
"Maintain strict confidentiality of infrastructure data",
|
|
142
|
+
"System security and data protection paramount - all interactions logged for audit",
|
|
143
|
+
],
|
|
144
|
+
input_type="it_query",
|
|
145
|
+
input_payload=user_input if user_input else "[IT professional query]",
|
|
146
|
+
extra={
|
|
147
|
+
"domain": "Technology / IT Operations / DevOps / Infrastructure",
|
|
148
|
+
"empathy_level": self.config.default_empathy_level,
|
|
149
|
+
"secrets_detection_enabled": self.config.enable_secrets_detection,
|
|
150
|
+
"retention_days": self.config.retention_days,
|
|
151
|
+
},
|
|
152
|
+
)
|
|
153
|
+
else:
|
|
154
|
+
# Fallback to legacy plain text prompt
|
|
155
|
+
return """You are a system security compliant AI technology and IT assistant.
|
|
156
|
+
|
|
157
|
+
**Domain**: Technology / IT Operations / DevOps / Infrastructure
|
|
158
|
+
|
|
159
|
+
**Your Role**:
|
|
160
|
+
- Assist IT professionals with system administration and troubleshooting
|
|
161
|
+
- Support infrastructure design and optimization
|
|
162
|
+
- Help with security analysis and incident response
|
|
163
|
+
- Provide guidance on DevOps and automation
|
|
164
|
+
|
|
165
|
+
**Security**:
|
|
166
|
+
- All system information is automatically protected before you see it
|
|
167
|
+
- Never request or display API keys, credentials, passwords, or tokens
|
|
168
|
+
- Maintain strict confidentiality of infrastructure data
|
|
169
|
+
- All interactions comply with IT security policies
|
|
170
|
+
|
|
171
|
+
**Technology Guidelines**:
|
|
172
|
+
- Base recommendations on industry best practices and security standards
|
|
173
|
+
- Acknowledge compliance requirements (SOC2, ISO 27001, etc.)
|
|
174
|
+
- Provide practical technical guidance
|
|
175
|
+
- Follow DevOps and SRE principles
|
|
176
|
+
|
|
177
|
+
**Communication Style**:
|
|
178
|
+
- Technical and precise
|
|
179
|
+
- Clear and actionable
|
|
180
|
+
- Security-focused
|
|
181
|
+
- Problem-solving oriented
|
|
182
|
+
|
|
183
|
+
**Important Disclaimers**:
|
|
184
|
+
- You are an IT support tool, not a replacement for sysadmin judgment
|
|
185
|
+
- Cannot make production deployment or security policy decisions
|
|
186
|
+
- Not a substitute for qualified IT professionals and security experts
|
|
187
|
+
- Always defer to IT leadership for critical infrastructure decisions
|
|
188
|
+
|
|
189
|
+
Remember: System security and data protection are paramount. Interactions are logged.
|
|
190
|
+
"""
|
|
191
|
+
|
|
192
|
+
def get_pii_patterns(self) -> list[str]:
|
|
193
|
+
"""Get list of technology PII patterns being detected"""
|
|
194
|
+
return self.config.pii_patterns.copy()
|
empathy_os/__init__.py
CHANGED
|
@@ -59,28 +59,29 @@ __version__ = "1.0.0-beta"
|
|
|
59
59
|
__author__ = "Patrick Roebuck"
|
|
60
60
|
__email__ = "hello@deepstudy.ai"
|
|
61
61
|
|
|
62
|
+
from .agent_monitoring import AgentMetrics, AgentMonitor, TeamMetrics
|
|
62
63
|
from .config import EmpathyConfig, load_config
|
|
63
64
|
from .coordination import (
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
65
|
+
AgentCoordinator,
|
|
66
|
+
AgentTask,
|
|
67
|
+
ConflictResolver,
|
|
68
|
+
ResolutionResult,
|
|
69
|
+
ResolutionStrategy,
|
|
70
|
+
TeamPriorities,
|
|
71
|
+
TeamSession,
|
|
71
72
|
)
|
|
72
73
|
from .core import EmpathyOS
|
|
73
74
|
from .emergence import EmergenceDetector
|
|
74
75
|
from .exceptions import (
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
76
|
+
CollaborationStateError,
|
|
77
|
+
ConfidenceThresholdError,
|
|
78
|
+
EmpathyFrameworkError,
|
|
79
|
+
EmpathyLevelError,
|
|
80
|
+
FeedbackLoopError,
|
|
81
|
+
LeveragePointError,
|
|
82
|
+
PatternNotFoundError,
|
|
83
|
+
TrustThresholdError,
|
|
84
|
+
ValidationError,
|
|
84
85
|
)
|
|
85
86
|
from .feedback_loops import FeedbackLoopDetector
|
|
86
87
|
from .levels import Level1Reactive, Level2Guided, Level3Proactive, Level4Anticipatory, Level5Systems
|
|
@@ -89,43 +90,42 @@ from .logging_config import LoggingConfig, get_logger
|
|
|
89
90
|
|
|
90
91
|
# Memory module (unified short-term + long-term + security)
|
|
91
92
|
from .memory import (
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
93
|
+
AccessTier,
|
|
94
|
+
AgentCredentials, # Memory module imports
|
|
95
|
+
AuditEvent,
|
|
96
|
+
AuditLogger,
|
|
97
|
+
Classification,
|
|
98
|
+
ClassificationRules,
|
|
99
|
+
ClaudeMemoryConfig,
|
|
100
|
+
ClaudeMemoryLoader,
|
|
101
|
+
ConflictContext,
|
|
102
|
+
EncryptionManager,
|
|
103
|
+
Environment,
|
|
104
|
+
MemDocsStorage,
|
|
105
|
+
MemoryConfig,
|
|
106
|
+
MemoryPermissionError,
|
|
107
|
+
PatternMetadata,
|
|
108
|
+
PIIDetection,
|
|
109
|
+
PIIPattern,
|
|
110
|
+
PIIScrubber,
|
|
111
|
+
RedisShortTermMemory,
|
|
112
|
+
SecretDetection,
|
|
113
|
+
SecretsDetector,
|
|
114
|
+
SecretType,
|
|
115
|
+
SecureMemDocsIntegration,
|
|
116
|
+
SecurePattern,
|
|
117
|
+
SecurityError,
|
|
118
|
+
SecurityViolation,
|
|
119
|
+
Severity,
|
|
120
|
+
StagedPattern,
|
|
121
|
+
TTLStrategy,
|
|
122
|
+
UnifiedMemory,
|
|
123
|
+
check_redis_connection,
|
|
124
|
+
detect_secrets,
|
|
125
|
+
get_railway_redis,
|
|
126
|
+
get_redis_config,
|
|
127
|
+
get_redis_memory,
|
|
127
128
|
)
|
|
128
|
-
from .monitoring import AgentMetrics, AgentMonitor, TeamMetrics
|
|
129
129
|
from .pattern_library import Pattern, PatternLibrary, PatternMatch
|
|
130
130
|
from .persistence import MetricsCollector, PatternPersistence, StateManager
|
|
131
131
|
from .trust_building import TrustBuildingBehaviors
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""Adaptive prompting system for dynamic model and compression selection.
|
|
2
|
+
|
|
3
|
+
Copyright 2026 Smart-AI-Memory
|
|
4
|
+
Licensed under Fair Source License 0.9
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from empathy_os.adaptive.task_complexity import (
|
|
8
|
+
ComplexityScore,
|
|
9
|
+
TaskComplexity,
|
|
10
|
+
TaskComplexityScorer,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
__all__ = ["TaskComplexity", "ComplexityScore", "TaskComplexityScorer"]
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"""Task complexity scoring for adaptive prompt selection.
|
|
2
|
+
|
|
3
|
+
Uses simple heuristics (token count, LOC) to classify tasks as
|
|
4
|
+
simple, moderate, complex, or very complex, enabling dynamic
|
|
5
|
+
model tier and compression level selection.
|
|
6
|
+
|
|
7
|
+
Copyright 2026 Smart-AI-Memory
|
|
8
|
+
Licensed under Fair Source License 0.9
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from enum import Enum
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
import tiktoken
|
|
16
|
+
except ImportError:
|
|
17
|
+
tiktoken = None # type: ignore[assignment]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class TaskComplexity(Enum):
|
|
21
|
+
"""Task complexity levels for adaptive prompting."""
|
|
22
|
+
|
|
23
|
+
SIMPLE = "simple" # <100 tokens, <50 LOC
|
|
24
|
+
MODERATE = "moderate" # 100-500 tokens, 50-200 LOC
|
|
25
|
+
COMPLEX = "complex" # 500-2000 tokens, 200-1000 LOC
|
|
26
|
+
VERY_COMPLEX = "very_complex" # >2000 tokens, >1000 LOC
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class ComplexityScore:
|
|
31
|
+
"""Task complexity scoring result.
|
|
32
|
+
|
|
33
|
+
Attributes:
|
|
34
|
+
token_count: Estimated input tokens
|
|
35
|
+
line_count: Lines of code in context
|
|
36
|
+
file_count: Number of files involved
|
|
37
|
+
complexity_level: Classified complexity
|
|
38
|
+
confidence: Confidence in classification (0-1)
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
token_count: int
|
|
42
|
+
line_count: int
|
|
43
|
+
file_count: int
|
|
44
|
+
complexity_level: TaskComplexity
|
|
45
|
+
confidence: float
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class TaskComplexityScorer:
|
|
49
|
+
"""Scores task complexity using simple heuristics.
|
|
50
|
+
|
|
51
|
+
Uses token counting (via tiktoken if available) and line counting
|
|
52
|
+
to estimate task complexity for adaptive prompt selection.
|
|
53
|
+
|
|
54
|
+
Usage:
|
|
55
|
+
scorer = TaskComplexityScorer()
|
|
56
|
+
score = scorer.score_task(
|
|
57
|
+
description="Refactor authentication module",
|
|
58
|
+
context=source_code,
|
|
59
|
+
files=["auth.py", "session.py"]
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
if score.complexity_level == TaskComplexity.VERY_COMPLEX:
|
|
63
|
+
use_premium_model()
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
def __init__(self):
|
|
67
|
+
"""Initialize complexity scorer."""
|
|
68
|
+
if tiktoken:
|
|
69
|
+
self.tokenizer = tiktoken.get_encoding("cl100k_base")
|
|
70
|
+
else:
|
|
71
|
+
self.tokenizer = None
|
|
72
|
+
|
|
73
|
+
def score_task(
|
|
74
|
+
self,
|
|
75
|
+
description: str,
|
|
76
|
+
context: str | None = None,
|
|
77
|
+
files: list[str] | None = None,
|
|
78
|
+
) -> ComplexityScore:
|
|
79
|
+
"""Score task complexity.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
description: Task description
|
|
83
|
+
context: Optional context (code, docs, etc.)
|
|
84
|
+
files: Optional list of file paths
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
ComplexityScore with classification and metrics
|
|
88
|
+
"""
|
|
89
|
+
# Count tokens
|
|
90
|
+
if self.tokenizer:
|
|
91
|
+
token_count = len(self.tokenizer.encode(description))
|
|
92
|
+
if context:
|
|
93
|
+
token_count += len(self.tokenizer.encode(context))
|
|
94
|
+
else:
|
|
95
|
+
# Fallback: rough estimate (4 chars per token)
|
|
96
|
+
token_count = len(description) // 4
|
|
97
|
+
if context:
|
|
98
|
+
token_count += len(context) // 4
|
|
99
|
+
|
|
100
|
+
# Count lines of code
|
|
101
|
+
line_count = 0
|
|
102
|
+
if context:
|
|
103
|
+
line_count = len(context.split("\n"))
|
|
104
|
+
|
|
105
|
+
# Count files
|
|
106
|
+
file_count = len(files) if files else 0
|
|
107
|
+
|
|
108
|
+
# Determine complexity level using thresholds
|
|
109
|
+
if token_count < 100 and line_count < 50:
|
|
110
|
+
complexity = TaskComplexity.SIMPLE
|
|
111
|
+
elif token_count < 500 and line_count < 200:
|
|
112
|
+
complexity = TaskComplexity.MODERATE
|
|
113
|
+
elif token_count < 2000 and line_count < 1000:
|
|
114
|
+
complexity = TaskComplexity.COMPLEX
|
|
115
|
+
else:
|
|
116
|
+
complexity = TaskComplexity.VERY_COMPLEX
|
|
117
|
+
|
|
118
|
+
# Confidence is moderate for simple heuristics
|
|
119
|
+
confidence = 0.8 if self.tokenizer else 0.6
|
|
120
|
+
|
|
121
|
+
return ComplexityScore(
|
|
122
|
+
token_count=token_count,
|
|
123
|
+
line_count=line_count,
|
|
124
|
+
file_count=file_count,
|
|
125
|
+
complexity_level=complexity,
|
|
126
|
+
confidence=confidence,
|
|
127
|
+
)
|