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
empathy_os/socratic/feedback.py
CHANGED
|
@@ -64,7 +64,9 @@ class AgentPerformance:
|
|
|
64
64
|
return "insufficient_data"
|
|
65
65
|
|
|
66
66
|
recent_5 = [s for _, s in self.recent_scores[-5:]]
|
|
67
|
-
older_5 =
|
|
67
|
+
older_5 = (
|
|
68
|
+
[s for _, s in self.recent_scores[-10:-5]] if len(self.recent_scores) >= 10 else []
|
|
69
|
+
)
|
|
68
70
|
|
|
69
71
|
if not older_5:
|
|
70
72
|
return "stable"
|
|
@@ -343,12 +345,12 @@ class FeedbackCollector:
|
|
|
343
345
|
if success:
|
|
344
346
|
pattern.successes += 1
|
|
345
347
|
# Rolling average
|
|
346
|
-
pattern.average_score = (
|
|
347
|
-
(pattern.average_score * (pattern.uses - 1) + score) / pattern.uses
|
|
348
|
-
)
|
|
348
|
+
pattern.average_score = (pattern.average_score * (pattern.uses - 1) + score) / pattern.uses
|
|
349
349
|
|
|
350
350
|
self._save_data()
|
|
351
|
-
logger.info(
|
|
351
|
+
logger.info(
|
|
352
|
+
f"Recorded feedback for blueprint {blueprint.id[:8]}: success={success}, score={score:.2f}"
|
|
353
|
+
)
|
|
352
354
|
|
|
353
355
|
def _generate_pattern_id(self, blueprint: WorkflowBlueprint) -> str:
|
|
354
356
|
"""Generate a unique ID for a workflow pattern."""
|
|
@@ -444,8 +446,7 @@ class FeedbackCollector:
|
|
|
444
446
|
|
|
445
447
|
# Top performing agents
|
|
446
448
|
all_agents = [
|
|
447
|
-
(tid, perf) for tid, perf in self._agent_performance.items()
|
|
448
|
-
if perf.total_uses >= 5
|
|
449
|
+
(tid, perf) for tid, perf in self._agent_performance.items() if perf.total_uses >= 5
|
|
449
450
|
]
|
|
450
451
|
all_agents.sort(key=lambda x: x[1].average_score, reverse=True)
|
|
451
452
|
insights["top_performing_agents"] = [
|
|
@@ -456,11 +457,13 @@ class FeedbackCollector:
|
|
|
456
457
|
# Declining agents
|
|
457
458
|
for tid, perf in self._agent_performance.items():
|
|
458
459
|
if perf.trend == "declining" and perf.total_uses >= 5:
|
|
459
|
-
insights["declining_agents"].append(
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
460
|
+
insights["declining_agents"].append(
|
|
461
|
+
{
|
|
462
|
+
"template_id": tid,
|
|
463
|
+
"current_score": perf.average_score,
|
|
464
|
+
"uses": perf.total_uses,
|
|
465
|
+
}
|
|
466
|
+
)
|
|
464
467
|
|
|
465
468
|
# Domain insights
|
|
466
469
|
domains: dict[str, dict[str, Any]] = {}
|
|
@@ -602,7 +605,7 @@ class AdaptiveAgentGenerator:
|
|
|
602
605
|
customizations={
|
|
603
606
|
"languages": languages,
|
|
604
607
|
"quality_focus": quality_focus,
|
|
605
|
-
}
|
|
608
|
+
},
|
|
606
609
|
)
|
|
607
610
|
scored_base.append((new_agent, score))
|
|
608
611
|
logger.info(f"Added high-performing agent '{tid}' based on feedback")
|
|
@@ -649,8 +652,11 @@ class AdaptiveAgentGenerator:
|
|
|
649
652
|
{
|
|
650
653
|
"template_id": tid,
|
|
651
654
|
"score": score,
|
|
652
|
-
"performance":
|
|
653
|
-
|
|
655
|
+
"performance": (
|
|
656
|
+
self.feedback.get_agent_performance(tid).to_dict()
|
|
657
|
+
if self.feedback.get_agent_performance(tid)
|
|
658
|
+
else None
|
|
659
|
+
),
|
|
654
660
|
}
|
|
655
661
|
for tid, score in best_agents
|
|
656
662
|
],
|
|
@@ -659,10 +665,9 @@ class AdaptiveAgentGenerator:
|
|
|
659
665
|
"total_executions": sum(
|
|
660
666
|
p.total_uses for p in self.feedback.get_all_performance().values()
|
|
661
667
|
),
|
|
662
|
-
"agents_with_data": len(
|
|
663
|
-
p for p in self.feedback.get_all_performance().values()
|
|
664
|
-
|
|
665
|
-
]),
|
|
668
|
+
"agents_with_data": len(
|
|
669
|
+
[p for p in self.feedback.get_all_performance().values() if p.total_uses >= 5]
|
|
670
|
+
),
|
|
666
671
|
},
|
|
667
672
|
}
|
|
668
673
|
|
empathy_os/socratic/forms.py
CHANGED
|
@@ -200,6 +200,7 @@ class FormField:
|
|
|
200
200
|
# Check pattern
|
|
201
201
|
if v.pattern and isinstance(value, str):
|
|
202
202
|
import re
|
|
203
|
+
|
|
203
204
|
if not re.match(v.pattern, value):
|
|
204
205
|
return False, v.error_message
|
|
205
206
|
|
|
@@ -347,16 +348,20 @@ class Form:
|
|
|
347
348
|
"placeholder": f.placeholder,
|
|
348
349
|
"default": f.default,
|
|
349
350
|
"category": f.category,
|
|
350
|
-
"options":
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
351
|
+
"options": (
|
|
352
|
+
[
|
|
353
|
+
{
|
|
354
|
+
"value": o.value,
|
|
355
|
+
"label": o.label,
|
|
356
|
+
"description": o.description,
|
|
357
|
+
"icon": o.icon,
|
|
358
|
+
"recommended": o.recommended,
|
|
359
|
+
}
|
|
360
|
+
for o in f.options
|
|
361
|
+
]
|
|
362
|
+
if f.options
|
|
363
|
+
else []
|
|
364
|
+
),
|
|
360
365
|
"validation": {
|
|
361
366
|
"required": f.validation.required,
|
|
362
367
|
"min_length": f.validation.min_length,
|
empathy_os/socratic/generator.py
CHANGED
|
@@ -506,14 +506,16 @@ class AgentGenerator:
|
|
|
506
506
|
# Build stage configuration
|
|
507
507
|
stages_config = []
|
|
508
508
|
for stage in blueprint.stages:
|
|
509
|
-
stages_config.append(
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
509
|
+
stages_config.append(
|
|
510
|
+
{
|
|
511
|
+
"id": stage.id,
|
|
512
|
+
"name": stage.name,
|
|
513
|
+
"agents": stage.agent_ids,
|
|
514
|
+
"parallel": stage.parallel,
|
|
515
|
+
"depends_on": stage.depends_on,
|
|
516
|
+
"timeout": stage.timeout,
|
|
517
|
+
}
|
|
518
|
+
)
|
|
517
519
|
|
|
518
520
|
return GeneratedWorkflow(
|
|
519
521
|
blueprint=blueprint,
|
|
@@ -557,7 +559,11 @@ class AgentGenerator:
|
|
|
557
559
|
Complete WorkflowBlueprint
|
|
558
560
|
"""
|
|
559
561
|
# Group agents by role for staging
|
|
560
|
-
analyzers = [
|
|
562
|
+
analyzers = [
|
|
563
|
+
a
|
|
564
|
+
for a in agents
|
|
565
|
+
if a.spec.role in (AgentRole.ANALYZER, AgentRole.REVIEWER, AgentRole.AUDITOR)
|
|
566
|
+
]
|
|
561
567
|
generators = [a for a in agents if a.spec.role == AgentRole.GENERATOR]
|
|
562
568
|
reporters = [a for a in agents if a.spec.role == AgentRole.REPORTER]
|
|
563
569
|
|
|
@@ -565,25 +571,29 @@ class AgentGenerator:
|
|
|
565
571
|
|
|
566
572
|
# Stage 1: Analysis (parallel)
|
|
567
573
|
if analyzers:
|
|
568
|
-
stages.append(
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
574
|
+
stages.append(
|
|
575
|
+
StageSpec(
|
|
576
|
+
id="analysis",
|
|
577
|
+
name="Analysis",
|
|
578
|
+
description="Analyze code and identify issues",
|
|
579
|
+
agent_ids=[a.spec.id for a in analyzers],
|
|
580
|
+
parallel=True,
|
|
581
|
+
output_aggregation="merge",
|
|
582
|
+
)
|
|
583
|
+
)
|
|
576
584
|
|
|
577
585
|
# Stage 2: Generation (sequential, depends on analysis)
|
|
578
586
|
if generators:
|
|
579
|
-
stages.append(
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
+
stages.append(
|
|
588
|
+
StageSpec(
|
|
589
|
+
id="generation",
|
|
590
|
+
name="Generation",
|
|
591
|
+
description="Generate fixes and improvements",
|
|
592
|
+
agent_ids=[a.spec.id for a in generators],
|
|
593
|
+
parallel=False,
|
|
594
|
+
depends_on=["analysis"] if analyzers else [],
|
|
595
|
+
)
|
|
596
|
+
)
|
|
587
597
|
|
|
588
598
|
# Stage 3: Synthesis (always last)
|
|
589
599
|
if reporters:
|
|
@@ -593,14 +603,16 @@ class AgentGenerator:
|
|
|
593
603
|
if generators:
|
|
594
604
|
depends.append("generation")
|
|
595
605
|
|
|
596
|
-
stages.append(
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
606
|
+
stages.append(
|
|
607
|
+
StageSpec(
|
|
608
|
+
id="synthesis",
|
|
609
|
+
name="Synthesis",
|
|
610
|
+
description="Synthesize findings into report",
|
|
611
|
+
agent_ids=[a.spec.id for a in reporters],
|
|
612
|
+
parallel=False,
|
|
613
|
+
depends_on=depends,
|
|
614
|
+
)
|
|
615
|
+
)
|
|
604
616
|
|
|
605
617
|
return WorkflowBlueprint(
|
|
606
618
|
name=name,
|
|
@@ -667,8 +679,12 @@ class GeneratedWorkflow:
|
|
|
667
679
|
for agent_id in agent_ids:
|
|
668
680
|
# Find agent
|
|
669
681
|
agent = next(
|
|
670
|
-
(
|
|
671
|
-
|
|
682
|
+
(
|
|
683
|
+
a
|
|
684
|
+
for a in self.agents
|
|
685
|
+
if hasattr(a, "role") and self._match_agent(a, agent_id)
|
|
686
|
+
),
|
|
687
|
+
None,
|
|
672
688
|
)
|
|
673
689
|
if agent:
|
|
674
690
|
# Execute agent (simplified)
|
|
@@ -15,13 +15,7 @@ import re
|
|
|
15
15
|
from dataclasses import dataclass, field
|
|
16
16
|
from typing import Any
|
|
17
17
|
|
|
18
|
-
from .forms import
|
|
19
|
-
FieldOption,
|
|
20
|
-
FieldType,
|
|
21
|
-
FieldValidation,
|
|
22
|
-
Form,
|
|
23
|
-
FormField,
|
|
24
|
-
)
|
|
18
|
+
from .forms import FieldOption, FieldType, FieldValidation, Form, FormField
|
|
25
19
|
from .session import SocraticSession
|
|
26
20
|
|
|
27
21
|
logger = logging.getLogger(__name__)
|
|
@@ -245,6 +239,7 @@ class LLMGoalAnalyzer:
|
|
|
245
239
|
model_tier: Model tier (cheap, capable, premium)
|
|
246
240
|
"""
|
|
247
241
|
import os
|
|
242
|
+
|
|
248
243
|
self.api_key = api_key or os.environ.get("ANTHROPIC_API_KEY")
|
|
249
244
|
self.provider = provider
|
|
250
245
|
self.model_tier = model_tier
|
|
@@ -256,6 +251,7 @@ class LLMGoalAnalyzer:
|
|
|
256
251
|
if self._client is None and self.api_key:
|
|
257
252
|
try:
|
|
258
253
|
import anthropic
|
|
254
|
+
|
|
259
255
|
self._client = anthropic.Anthropic(api_key=self.api_key)
|
|
260
256
|
except ImportError:
|
|
261
257
|
logger.warning("anthropic package not installed")
|
|
@@ -266,6 +262,7 @@ class LLMGoalAnalyzer:
|
|
|
266
262
|
if self._executor is None:
|
|
267
263
|
try:
|
|
268
264
|
from ..models.empathy_executor import EmpathyLLMExecutor
|
|
265
|
+
|
|
269
266
|
self._executor = EmpathyLLMExecutor(provider=self.provider)
|
|
270
267
|
except ImportError:
|
|
271
268
|
logger.warning("EmpathyLLMExecutor not available, using mock")
|
|
@@ -310,7 +307,7 @@ class LLMGoalAnalyzer:
|
|
|
310
307
|
prompt=prompt,
|
|
311
308
|
system=system,
|
|
312
309
|
)
|
|
313
|
-
return response.content if hasattr(response,
|
|
310
|
+
return response.content if hasattr(response, "content") else str(response)
|
|
314
311
|
|
|
315
312
|
async def analyze_goal(self, goal: str) -> LLMAnalysisResult:
|
|
316
313
|
"""Analyze a goal using LLM.
|
|
@@ -559,6 +556,7 @@ class MockLLMExecutor:
|
|
|
559
556
|
|
|
560
557
|
async def run(self, **kwargs) -> Any:
|
|
561
558
|
"""Return mock response."""
|
|
559
|
+
|
|
562
560
|
@dataclass
|
|
563
561
|
class MockResponse:
|
|
564
562
|
content: str = "{}"
|
|
@@ -604,21 +602,25 @@ def llm_questions_to_form(
|
|
|
604
602
|
if isinstance(opt, str):
|
|
605
603
|
options.append(FieldOption(value=opt.lower().replace(" ", "_"), label=opt))
|
|
606
604
|
elif isinstance(opt, dict):
|
|
607
|
-
options.append(
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
605
|
+
options.append(
|
|
606
|
+
FieldOption(
|
|
607
|
+
value=opt.get("value", opt.get("label", "").lower().replace(" ", "_")),
|
|
608
|
+
label=opt.get("label", ""),
|
|
609
|
+
description=opt.get("description", ""),
|
|
610
|
+
)
|
|
611
|
+
)
|
|
612
|
+
|
|
613
|
+
fields.append(
|
|
614
|
+
FormField(
|
|
615
|
+
id=q_id,
|
|
616
|
+
field_type=field_type,
|
|
617
|
+
label=q.get("question", ""),
|
|
618
|
+
options=options,
|
|
619
|
+
validation=FieldValidation(required=q.get("required", False)),
|
|
620
|
+
category=q.get("category", "general"),
|
|
621
|
+
order=q.get("priority", 5),
|
|
622
|
+
)
|
|
623
|
+
)
|
|
622
624
|
|
|
623
625
|
# Sort by priority (higher priority = lower order number = appears first)
|
|
624
626
|
fields.sort(key=lambda f: f.order, reverse=True)
|