attune-ai 2.0.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.
- attune/__init__.py +358 -0
- attune/adaptive/__init__.py +13 -0
- attune/adaptive/task_complexity.py +127 -0
- attune/agent_monitoring.py +414 -0
- attune/cache/__init__.py +117 -0
- attune/cache/base.py +166 -0
- attune/cache/dependency_manager.py +256 -0
- attune/cache/hash_only.py +251 -0
- attune/cache/hybrid.py +457 -0
- attune/cache/storage.py +285 -0
- attune/cache_monitor.py +356 -0
- attune/cache_stats.py +298 -0
- attune/cli/__init__.py +152 -0
- attune/cli/__main__.py +12 -0
- attune/cli/commands/__init__.py +1 -0
- attune/cli/commands/batch.py +264 -0
- attune/cli/commands/cache.py +248 -0
- attune/cli/commands/help.py +331 -0
- attune/cli/commands/info.py +140 -0
- attune/cli/commands/inspect.py +436 -0
- attune/cli/commands/inspection.py +57 -0
- attune/cli/commands/memory.py +48 -0
- attune/cli/commands/metrics.py +92 -0
- attune/cli/commands/orchestrate.py +184 -0
- attune/cli/commands/patterns.py +207 -0
- attune/cli/commands/profiling.py +202 -0
- attune/cli/commands/provider.py +98 -0
- attune/cli/commands/routing.py +285 -0
- attune/cli/commands/setup.py +96 -0
- attune/cli/commands/status.py +235 -0
- attune/cli/commands/sync.py +166 -0
- attune/cli/commands/tier.py +121 -0
- attune/cli/commands/utilities.py +114 -0
- attune/cli/commands/workflow.py +579 -0
- attune/cli/core.py +32 -0
- attune/cli/parsers/__init__.py +68 -0
- attune/cli/parsers/batch.py +118 -0
- attune/cli/parsers/cache.py +65 -0
- attune/cli/parsers/help.py +41 -0
- attune/cli/parsers/info.py +26 -0
- attune/cli/parsers/inspect.py +66 -0
- attune/cli/parsers/metrics.py +42 -0
- attune/cli/parsers/orchestrate.py +61 -0
- attune/cli/parsers/patterns.py +54 -0
- attune/cli/parsers/provider.py +40 -0
- attune/cli/parsers/routing.py +110 -0
- attune/cli/parsers/setup.py +42 -0
- attune/cli/parsers/status.py +47 -0
- attune/cli/parsers/sync.py +31 -0
- attune/cli/parsers/tier.py +33 -0
- attune/cli/parsers/workflow.py +77 -0
- attune/cli/utils/__init__.py +1 -0
- attune/cli/utils/data.py +242 -0
- attune/cli/utils/helpers.py +68 -0
- attune/cli_legacy.py +3957 -0
- attune/cli_minimal.py +1159 -0
- attune/cli_router.py +437 -0
- attune/cli_unified.py +814 -0
- attune/config/__init__.py +66 -0
- attune/config/xml_config.py +286 -0
- attune/config.py +545 -0
- attune/coordination.py +870 -0
- attune/core.py +1511 -0
- attune/core_modules/__init__.py +15 -0
- attune/cost_tracker.py +626 -0
- attune/dashboard/__init__.py +41 -0
- attune/dashboard/app.py +512 -0
- attune/dashboard/simple_server.py +435 -0
- attune/dashboard/standalone_server.py +547 -0
- attune/discovery.py +306 -0
- attune/emergence.py +306 -0
- attune/exceptions.py +123 -0
- attune/feedback_loops.py +373 -0
- attune/hot_reload/README.md +473 -0
- attune/hot_reload/__init__.py +62 -0
- attune/hot_reload/config.py +83 -0
- attune/hot_reload/integration.py +229 -0
- attune/hot_reload/reloader.py +298 -0
- attune/hot_reload/watcher.py +183 -0
- attune/hot_reload/websocket.py +177 -0
- attune/levels.py +577 -0
- attune/leverage_points.py +441 -0
- attune/logging_config.py +261 -0
- attune/mcp/__init__.py +10 -0
- attune/mcp/server.py +506 -0
- attune/memory/__init__.py +237 -0
- attune/memory/claude_memory.py +469 -0
- attune/memory/config.py +224 -0
- attune/memory/control_panel.py +1290 -0
- attune/memory/control_panel_support.py +145 -0
- attune/memory/cross_session.py +845 -0
- attune/memory/edges.py +179 -0
- attune/memory/encryption.py +159 -0
- attune/memory/file_session.py +770 -0
- attune/memory/graph.py +570 -0
- attune/memory/long_term.py +913 -0
- attune/memory/long_term_types.py +99 -0
- attune/memory/mixins/__init__.py +25 -0
- attune/memory/mixins/backend_init_mixin.py +249 -0
- attune/memory/mixins/capabilities_mixin.py +208 -0
- attune/memory/mixins/handoff_mixin.py +208 -0
- attune/memory/mixins/lifecycle_mixin.py +49 -0
- attune/memory/mixins/long_term_mixin.py +352 -0
- attune/memory/mixins/promotion_mixin.py +109 -0
- attune/memory/mixins/short_term_mixin.py +182 -0
- attune/memory/nodes.py +179 -0
- attune/memory/redis_bootstrap.py +540 -0
- attune/memory/security/__init__.py +31 -0
- attune/memory/security/audit_logger.py +932 -0
- attune/memory/security/pii_scrubber.py +640 -0
- attune/memory/security/secrets_detector.py +678 -0
- attune/memory/short_term.py +2192 -0
- attune/memory/simple_storage.py +302 -0
- attune/memory/storage/__init__.py +15 -0
- attune/memory/storage_backend.py +167 -0
- attune/memory/summary_index.py +583 -0
- attune/memory/types.py +446 -0
- attune/memory/unified.py +182 -0
- attune/meta_workflows/__init__.py +74 -0
- attune/meta_workflows/agent_creator.py +248 -0
- attune/meta_workflows/builtin_templates.py +567 -0
- attune/meta_workflows/cli_commands/__init__.py +56 -0
- attune/meta_workflows/cli_commands/agent_commands.py +321 -0
- attune/meta_workflows/cli_commands/analytics_commands.py +442 -0
- attune/meta_workflows/cli_commands/config_commands.py +232 -0
- attune/meta_workflows/cli_commands/memory_commands.py +182 -0
- attune/meta_workflows/cli_commands/template_commands.py +354 -0
- attune/meta_workflows/cli_commands/workflow_commands.py +382 -0
- attune/meta_workflows/cli_meta_workflows.py +59 -0
- attune/meta_workflows/form_engine.py +292 -0
- attune/meta_workflows/intent_detector.py +409 -0
- attune/meta_workflows/models.py +569 -0
- attune/meta_workflows/pattern_learner.py +738 -0
- attune/meta_workflows/plan_generator.py +384 -0
- attune/meta_workflows/session_context.py +397 -0
- attune/meta_workflows/template_registry.py +229 -0
- attune/meta_workflows/workflow.py +984 -0
- attune/metrics/__init__.py +12 -0
- attune/metrics/collector.py +31 -0
- attune/metrics/prompt_metrics.py +194 -0
- attune/models/__init__.py +172 -0
- attune/models/__main__.py +13 -0
- attune/models/adaptive_routing.py +437 -0
- attune/models/auth_cli.py +444 -0
- attune/models/auth_strategy.py +450 -0
- attune/models/cli.py +655 -0
- attune/models/empathy_executor.py +354 -0
- attune/models/executor.py +257 -0
- attune/models/fallback.py +762 -0
- attune/models/provider_config.py +282 -0
- attune/models/registry.py +472 -0
- attune/models/tasks.py +359 -0
- attune/models/telemetry/__init__.py +71 -0
- attune/models/telemetry/analytics.py +594 -0
- attune/models/telemetry/backend.py +196 -0
- attune/models/telemetry/data_models.py +431 -0
- attune/models/telemetry/storage.py +489 -0
- attune/models/token_estimator.py +420 -0
- attune/models/validation.py +280 -0
- attune/monitoring/__init__.py +52 -0
- attune/monitoring/alerts.py +946 -0
- attune/monitoring/alerts_cli.py +448 -0
- attune/monitoring/multi_backend.py +271 -0
- attune/monitoring/otel_backend.py +362 -0
- attune/optimization/__init__.py +19 -0
- attune/optimization/context_optimizer.py +272 -0
- attune/orchestration/__init__.py +67 -0
- attune/orchestration/agent_templates.py +707 -0
- attune/orchestration/config_store.py +499 -0
- attune/orchestration/execution_strategies.py +2111 -0
- attune/orchestration/meta_orchestrator.py +1168 -0
- attune/orchestration/pattern_learner.py +696 -0
- attune/orchestration/real_tools.py +931 -0
- attune/pattern_cache.py +187 -0
- attune/pattern_library.py +542 -0
- attune/patterns/debugging/all_patterns.json +81 -0
- attune/patterns/debugging/workflow_20260107_1770825e.json +77 -0
- attune/patterns/refactoring_memory.json +89 -0
- attune/persistence.py +564 -0
- attune/platform_utils.py +265 -0
- attune/plugins/__init__.py +28 -0
- attune/plugins/base.py +361 -0
- attune/plugins/registry.py +268 -0
- attune/project_index/__init__.py +32 -0
- attune/project_index/cli.py +335 -0
- attune/project_index/index.py +667 -0
- attune/project_index/models.py +504 -0
- attune/project_index/reports.py +474 -0
- attune/project_index/scanner.py +777 -0
- attune/project_index/scanner_parallel.py +291 -0
- attune/prompts/__init__.py +61 -0
- attune/prompts/config.py +77 -0
- attune/prompts/context.py +177 -0
- attune/prompts/parser.py +285 -0
- attune/prompts/registry.py +313 -0
- attune/prompts/templates.py +208 -0
- attune/redis_config.py +302 -0
- attune/redis_memory.py +799 -0
- attune/resilience/__init__.py +56 -0
- attune/resilience/circuit_breaker.py +256 -0
- attune/resilience/fallback.py +179 -0
- attune/resilience/health.py +300 -0
- attune/resilience/retry.py +209 -0
- attune/resilience/timeout.py +135 -0
- attune/routing/__init__.py +43 -0
- attune/routing/chain_executor.py +433 -0
- attune/routing/classifier.py +217 -0
- attune/routing/smart_router.py +234 -0
- attune/routing/workflow_registry.py +343 -0
- attune/scaffolding/README.md +589 -0
- attune/scaffolding/__init__.py +35 -0
- attune/scaffolding/__main__.py +14 -0
- attune/scaffolding/cli.py +240 -0
- attune/scaffolding/templates/base_wizard.py.jinja2 +121 -0
- attune/scaffolding/templates/coach_wizard.py.jinja2 +321 -0
- attune/scaffolding/templates/domain_wizard.py.jinja2 +408 -0
- attune/scaffolding/templates/linear_flow_wizard.py.jinja2 +203 -0
- attune/socratic/__init__.py +256 -0
- attune/socratic/ab_testing.py +958 -0
- attune/socratic/blueprint.py +533 -0
- attune/socratic/cli.py +703 -0
- attune/socratic/collaboration.py +1114 -0
- attune/socratic/domain_templates.py +924 -0
- attune/socratic/embeddings.py +738 -0
- attune/socratic/engine.py +794 -0
- attune/socratic/explainer.py +682 -0
- attune/socratic/feedback.py +772 -0
- attune/socratic/forms.py +629 -0
- attune/socratic/generator.py +732 -0
- attune/socratic/llm_analyzer.py +637 -0
- attune/socratic/mcp_server.py +702 -0
- attune/socratic/session.py +312 -0
- attune/socratic/storage.py +667 -0
- attune/socratic/success.py +730 -0
- attune/socratic/visual_editor.py +860 -0
- attune/socratic/web_ui.py +958 -0
- attune/telemetry/__init__.py +39 -0
- attune/telemetry/agent_coordination.py +475 -0
- attune/telemetry/agent_tracking.py +367 -0
- attune/telemetry/approval_gates.py +545 -0
- attune/telemetry/cli.py +1231 -0
- attune/telemetry/commands/__init__.py +14 -0
- attune/telemetry/commands/dashboard_commands.py +696 -0
- attune/telemetry/event_streaming.py +409 -0
- attune/telemetry/feedback_loop.py +567 -0
- attune/telemetry/usage_tracker.py +591 -0
- attune/templates.py +754 -0
- attune/test_generator/__init__.py +38 -0
- attune/test_generator/__main__.py +14 -0
- attune/test_generator/cli.py +234 -0
- attune/test_generator/generator.py +355 -0
- attune/test_generator/risk_analyzer.py +216 -0
- attune/test_generator/templates/unit_test.py.jinja2 +272 -0
- attune/tier_recommender.py +384 -0
- attune/tools.py +183 -0
- attune/trust/__init__.py +28 -0
- attune/trust/circuit_breaker.py +579 -0
- attune/trust_building.py +527 -0
- attune/validation/__init__.py +19 -0
- attune/validation/xml_validator.py +281 -0
- attune/vscode_bridge.py +173 -0
- attune/workflow_commands.py +780 -0
- attune/workflow_patterns/__init__.py +33 -0
- attune/workflow_patterns/behavior.py +249 -0
- attune/workflow_patterns/core.py +76 -0
- attune/workflow_patterns/output.py +99 -0
- attune/workflow_patterns/registry.py +255 -0
- attune/workflow_patterns/structural.py +288 -0
- attune/workflows/__init__.py +539 -0
- attune/workflows/autonomous_test_gen.py +1268 -0
- attune/workflows/base.py +2667 -0
- attune/workflows/batch_processing.py +342 -0
- attune/workflows/bug_predict.py +1084 -0
- attune/workflows/builder.py +273 -0
- attune/workflows/caching.py +253 -0
- attune/workflows/code_review.py +1048 -0
- attune/workflows/code_review_adapters.py +312 -0
- attune/workflows/code_review_pipeline.py +722 -0
- attune/workflows/config.py +645 -0
- attune/workflows/dependency_check.py +644 -0
- attune/workflows/document_gen/__init__.py +25 -0
- attune/workflows/document_gen/config.py +30 -0
- attune/workflows/document_gen/report_formatter.py +162 -0
- attune/workflows/document_gen/workflow.py +1426 -0
- attune/workflows/document_manager.py +216 -0
- attune/workflows/document_manager_README.md +134 -0
- attune/workflows/documentation_orchestrator.py +1205 -0
- attune/workflows/history.py +510 -0
- attune/workflows/keyboard_shortcuts/__init__.py +39 -0
- attune/workflows/keyboard_shortcuts/generators.py +391 -0
- attune/workflows/keyboard_shortcuts/parsers.py +416 -0
- attune/workflows/keyboard_shortcuts/prompts.py +295 -0
- attune/workflows/keyboard_shortcuts/schema.py +193 -0
- attune/workflows/keyboard_shortcuts/workflow.py +509 -0
- attune/workflows/llm_base.py +363 -0
- attune/workflows/manage_docs.py +87 -0
- attune/workflows/manage_docs_README.md +134 -0
- attune/workflows/manage_documentation.py +821 -0
- attune/workflows/new_sample_workflow1.py +149 -0
- attune/workflows/new_sample_workflow1_README.md +150 -0
- attune/workflows/orchestrated_health_check.py +849 -0
- attune/workflows/orchestrated_release_prep.py +600 -0
- attune/workflows/output.py +413 -0
- attune/workflows/perf_audit.py +863 -0
- attune/workflows/pr_review.py +762 -0
- attune/workflows/progress.py +785 -0
- attune/workflows/progress_server.py +322 -0
- attune/workflows/progressive/README 2.md +454 -0
- attune/workflows/progressive/README.md +454 -0
- attune/workflows/progressive/__init__.py +82 -0
- attune/workflows/progressive/cli.py +219 -0
- attune/workflows/progressive/core.py +488 -0
- attune/workflows/progressive/orchestrator.py +723 -0
- attune/workflows/progressive/reports.py +520 -0
- attune/workflows/progressive/telemetry.py +274 -0
- attune/workflows/progressive/test_gen.py +495 -0
- attune/workflows/progressive/workflow.py +589 -0
- attune/workflows/refactor_plan.py +694 -0
- attune/workflows/release_prep.py +895 -0
- attune/workflows/release_prep_crew.py +969 -0
- attune/workflows/research_synthesis.py +404 -0
- attune/workflows/routing.py +168 -0
- attune/workflows/secure_release.py +593 -0
- attune/workflows/security_adapters.py +297 -0
- attune/workflows/security_audit.py +1329 -0
- attune/workflows/security_audit_phase3.py +355 -0
- attune/workflows/seo_optimization.py +633 -0
- attune/workflows/step_config.py +234 -0
- attune/workflows/telemetry_mixin.py +269 -0
- attune/workflows/test5.py +125 -0
- attune/workflows/test5_README.md +158 -0
- attune/workflows/test_coverage_boost_crew.py +849 -0
- attune/workflows/test_gen/__init__.py +52 -0
- attune/workflows/test_gen/ast_analyzer.py +249 -0
- attune/workflows/test_gen/config.py +88 -0
- attune/workflows/test_gen/data_models.py +38 -0
- attune/workflows/test_gen/report_formatter.py +289 -0
- attune/workflows/test_gen/test_templates.py +381 -0
- attune/workflows/test_gen/workflow.py +655 -0
- attune/workflows/test_gen.py +54 -0
- attune/workflows/test_gen_behavioral.py +477 -0
- attune/workflows/test_gen_parallel.py +341 -0
- attune/workflows/test_lifecycle.py +526 -0
- attune/workflows/test_maintenance.py +627 -0
- attune/workflows/test_maintenance_cli.py +590 -0
- attune/workflows/test_maintenance_crew.py +840 -0
- attune/workflows/test_runner.py +622 -0
- attune/workflows/tier_tracking.py +531 -0
- attune/workflows/xml_enhanced_crew.py +285 -0
- attune_ai-2.0.0.dist-info/METADATA +1026 -0
- attune_ai-2.0.0.dist-info/RECORD +457 -0
- attune_ai-2.0.0.dist-info/WHEEL +5 -0
- attune_ai-2.0.0.dist-info/entry_points.txt +26 -0
- attune_ai-2.0.0.dist-info/licenses/LICENSE +201 -0
- attune_ai-2.0.0.dist-info/licenses/LICENSE_CHANGE_ANNOUNCEMENT.md +101 -0
- attune_ai-2.0.0.dist-info/top_level.txt +5 -0
- attune_healthcare/__init__.py +13 -0
- attune_healthcare/monitors/__init__.py +9 -0
- attune_healthcare/monitors/clinical_protocol_monitor.py +315 -0
- attune_healthcare/monitors/monitoring/__init__.py +44 -0
- attune_healthcare/monitors/monitoring/protocol_checker.py +300 -0
- attune_healthcare/monitors/monitoring/protocol_loader.py +214 -0
- attune_healthcare/monitors/monitoring/sensor_parsers.py +306 -0
- attune_healthcare/monitors/monitoring/trajectory_analyzer.py +389 -0
- attune_llm/README.md +553 -0
- attune_llm/__init__.py +28 -0
- attune_llm/agent_factory/__init__.py +53 -0
- attune_llm/agent_factory/adapters/__init__.py +85 -0
- attune_llm/agent_factory/adapters/autogen_adapter.py +312 -0
- attune_llm/agent_factory/adapters/crewai_adapter.py +483 -0
- attune_llm/agent_factory/adapters/haystack_adapter.py +298 -0
- attune_llm/agent_factory/adapters/langchain_adapter.py +362 -0
- attune_llm/agent_factory/adapters/langgraph_adapter.py +333 -0
- attune_llm/agent_factory/adapters/native.py +228 -0
- attune_llm/agent_factory/adapters/wizard_adapter.py +423 -0
- attune_llm/agent_factory/base.py +305 -0
- attune_llm/agent_factory/crews/__init__.py +67 -0
- attune_llm/agent_factory/crews/code_review.py +1113 -0
- attune_llm/agent_factory/crews/health_check.py +1262 -0
- attune_llm/agent_factory/crews/refactoring.py +1128 -0
- attune_llm/agent_factory/crews/security_audit.py +1018 -0
- attune_llm/agent_factory/decorators.py +287 -0
- attune_llm/agent_factory/factory.py +558 -0
- attune_llm/agent_factory/framework.py +193 -0
- attune_llm/agent_factory/memory_integration.py +328 -0
- attune_llm/agent_factory/resilient.py +320 -0
- attune_llm/agents_md/__init__.py +22 -0
- attune_llm/agents_md/loader.py +218 -0
- attune_llm/agents_md/parser.py +271 -0
- attune_llm/agents_md/registry.py +307 -0
- attune_llm/claude_memory.py +466 -0
- attune_llm/cli/__init__.py +8 -0
- attune_llm/cli/sync_claude.py +487 -0
- attune_llm/code_health.py +1313 -0
- attune_llm/commands/__init__.py +51 -0
- attune_llm/commands/context.py +375 -0
- attune_llm/commands/loader.py +301 -0
- attune_llm/commands/models.py +231 -0
- attune_llm/commands/parser.py +371 -0
- attune_llm/commands/registry.py +429 -0
- attune_llm/config/__init__.py +29 -0
- attune_llm/config/unified.py +291 -0
- attune_llm/context/__init__.py +22 -0
- attune_llm/context/compaction.py +455 -0
- attune_llm/context/manager.py +434 -0
- attune_llm/contextual_patterns.py +361 -0
- attune_llm/core.py +907 -0
- attune_llm/git_pattern_extractor.py +435 -0
- attune_llm/hooks/__init__.py +24 -0
- attune_llm/hooks/config.py +306 -0
- attune_llm/hooks/executor.py +289 -0
- attune_llm/hooks/registry.py +302 -0
- attune_llm/hooks/scripts/__init__.py +39 -0
- attune_llm/hooks/scripts/evaluate_session.py +201 -0
- attune_llm/hooks/scripts/first_time_init.py +285 -0
- attune_llm/hooks/scripts/pre_compact.py +207 -0
- attune_llm/hooks/scripts/session_end.py +183 -0
- attune_llm/hooks/scripts/session_start.py +163 -0
- attune_llm/hooks/scripts/suggest_compact.py +225 -0
- attune_llm/learning/__init__.py +30 -0
- attune_llm/learning/evaluator.py +438 -0
- attune_llm/learning/extractor.py +514 -0
- attune_llm/learning/storage.py +560 -0
- attune_llm/levels.py +227 -0
- attune_llm/pattern_confidence.py +414 -0
- attune_llm/pattern_resolver.py +272 -0
- attune_llm/pattern_summary.py +350 -0
- attune_llm/providers.py +967 -0
- attune_llm/routing/__init__.py +32 -0
- attune_llm/routing/model_router.py +362 -0
- attune_llm/security/IMPLEMENTATION_SUMMARY.md +413 -0
- attune_llm/security/PHASE2_COMPLETE.md +384 -0
- attune_llm/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
- attune_llm/security/QUICK_REFERENCE.md +316 -0
- attune_llm/security/README.md +262 -0
- attune_llm/security/__init__.py +62 -0
- attune_llm/security/audit_logger.py +929 -0
- attune_llm/security/audit_logger_example.py +152 -0
- attune_llm/security/pii_scrubber.py +640 -0
- attune_llm/security/secrets_detector.py +678 -0
- attune_llm/security/secrets_detector_example.py +304 -0
- attune_llm/security/secure_memdocs.py +1192 -0
- attune_llm/security/secure_memdocs_example.py +278 -0
- attune_llm/session_status.py +745 -0
- attune_llm/state.py +246 -0
- attune_llm/utils/__init__.py +5 -0
- attune_llm/utils/tokens.py +349 -0
- attune_software/SOFTWARE_PLUGIN_README.md +57 -0
- attune_software/__init__.py +13 -0
- attune_software/cli/__init__.py +120 -0
- attune_software/cli/inspect.py +362 -0
- attune_software/cli.py +574 -0
- attune_software/plugin.py +188 -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
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"""Workflow Pattern Registry.
|
|
2
|
+
|
|
3
|
+
Manages workflow patterns and provides pattern recommendation.
|
|
4
|
+
|
|
5
|
+
Copyright 2025 Smart-AI-Memory
|
|
6
|
+
Licensed under Fair Source License 0.9
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from .behavior import CodeScannerPattern, ConditionalTierPattern, ConfigDrivenPattern
|
|
12
|
+
from .core import PatternCategory, WorkflowComplexity, WorkflowPattern
|
|
13
|
+
from .output import ResultDataclassPattern
|
|
14
|
+
from .structural import CrewBasedPattern, MultiStagePattern, SingleStagePattern
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class WorkflowPatternRegistry:
|
|
18
|
+
"""Registry for workflow patterns."""
|
|
19
|
+
|
|
20
|
+
def __init__(self):
|
|
21
|
+
"""Initialize pattern registry."""
|
|
22
|
+
self._patterns: dict[str, WorkflowPattern] = {}
|
|
23
|
+
self._register_default_patterns()
|
|
24
|
+
|
|
25
|
+
def _register_default_patterns(self) -> None:
|
|
26
|
+
"""Register all default patterns."""
|
|
27
|
+
patterns = [
|
|
28
|
+
# Structural
|
|
29
|
+
SingleStagePattern(),
|
|
30
|
+
MultiStagePattern(),
|
|
31
|
+
CrewBasedPattern(),
|
|
32
|
+
# Behavioral
|
|
33
|
+
ConditionalTierPattern(),
|
|
34
|
+
ConfigDrivenPattern(),
|
|
35
|
+
CodeScannerPattern(),
|
|
36
|
+
# Output
|
|
37
|
+
ResultDataclassPattern(),
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
for pattern in patterns:
|
|
41
|
+
self._patterns[pattern.id] = pattern
|
|
42
|
+
|
|
43
|
+
def register(self, pattern: WorkflowPattern) -> None:
|
|
44
|
+
"""Register a new pattern.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
pattern: Pattern to register
|
|
48
|
+
|
|
49
|
+
"""
|
|
50
|
+
self._patterns[pattern.id] = pattern
|
|
51
|
+
|
|
52
|
+
def get(self, pattern_id: str) -> WorkflowPattern | None:
|
|
53
|
+
"""Get pattern by ID.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
pattern_id: Pattern identifier
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
WorkflowPattern or None if not found
|
|
60
|
+
|
|
61
|
+
"""
|
|
62
|
+
return self._patterns.get(pattern_id)
|
|
63
|
+
|
|
64
|
+
def list_all(self) -> list[WorkflowPattern]:
|
|
65
|
+
"""List all registered patterns.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
List of all patterns
|
|
69
|
+
|
|
70
|
+
"""
|
|
71
|
+
return list(self._patterns.values())
|
|
72
|
+
|
|
73
|
+
def list_by_category(self, category: PatternCategory) -> list[WorkflowPattern]:
|
|
74
|
+
"""List patterns by category.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
category: Pattern category
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
List of patterns in category
|
|
81
|
+
|
|
82
|
+
"""
|
|
83
|
+
return [p for p in self._patterns.values() if p.category == category]
|
|
84
|
+
|
|
85
|
+
def list_by_complexity(self, complexity: WorkflowComplexity) -> list[WorkflowPattern]:
|
|
86
|
+
"""List patterns by complexity.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
complexity: Complexity level
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
List of patterns with specified complexity
|
|
93
|
+
|
|
94
|
+
"""
|
|
95
|
+
return [p for p in self._patterns.values() if p.complexity == complexity]
|
|
96
|
+
|
|
97
|
+
def search(self, query: str) -> list[WorkflowPattern]:
|
|
98
|
+
"""Search patterns by name or description.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
query: Search query
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
List of matching patterns
|
|
105
|
+
|
|
106
|
+
"""
|
|
107
|
+
query_lower = query.lower()
|
|
108
|
+
results = []
|
|
109
|
+
|
|
110
|
+
for pattern in self._patterns.values():
|
|
111
|
+
if (
|
|
112
|
+
query_lower in pattern.name.lower()
|
|
113
|
+
or query_lower in pattern.description.lower()
|
|
114
|
+
or any(query_lower in uc.lower() for uc in pattern.use_cases)
|
|
115
|
+
):
|
|
116
|
+
results.append(pattern)
|
|
117
|
+
|
|
118
|
+
return results
|
|
119
|
+
|
|
120
|
+
def recommend_for_workflow(
|
|
121
|
+
self,
|
|
122
|
+
workflow_type: str,
|
|
123
|
+
complexity: WorkflowComplexity | None = None,
|
|
124
|
+
) -> list[WorkflowPattern]:
|
|
125
|
+
"""Recommend patterns for a workflow type.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
workflow_type: Type of workflow (e.g., "code-analysis", "multi-agent")
|
|
129
|
+
complexity: Desired complexity level
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
List of recommended patterns
|
|
133
|
+
|
|
134
|
+
"""
|
|
135
|
+
recommendations = []
|
|
136
|
+
|
|
137
|
+
# Type-based recommendations
|
|
138
|
+
type_map = {
|
|
139
|
+
"code-analysis": ["multi-stage", "code-scanner", "conditional-tier"],
|
|
140
|
+
"simple": ["single-stage"],
|
|
141
|
+
"multi-agent": ["crew-based", "result-dataclass"],
|
|
142
|
+
"configurable": ["config-driven", "multi-stage"],
|
|
143
|
+
"cost-optimized": ["conditional-tier", "multi-stage"],
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
pattern_ids = type_map.get(workflow_type.lower(), [])
|
|
147
|
+
|
|
148
|
+
# Get patterns
|
|
149
|
+
for pattern_id in pattern_ids:
|
|
150
|
+
pattern = self.get(pattern_id)
|
|
151
|
+
if pattern:
|
|
152
|
+
if complexity is None or pattern.complexity == complexity:
|
|
153
|
+
recommendations.append(pattern)
|
|
154
|
+
|
|
155
|
+
# Always include progress tracking and telemetry (built-in)
|
|
156
|
+
# These are inherited from BaseWorkflow
|
|
157
|
+
|
|
158
|
+
return recommendations
|
|
159
|
+
|
|
160
|
+
def validate_pattern_combination(self, pattern_ids: list[str]) -> tuple[bool, str | None]:
|
|
161
|
+
"""Validate that pattern IDs can be used together.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
pattern_ids: List of pattern IDs to validate
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
Tuple of (is_valid, error_message)
|
|
168
|
+
|
|
169
|
+
"""
|
|
170
|
+
patterns = []
|
|
171
|
+
for pattern_id in pattern_ids:
|
|
172
|
+
pattern = self.get(pattern_id)
|
|
173
|
+
if not pattern:
|
|
174
|
+
return False, f"Unknown pattern: {pattern_id}"
|
|
175
|
+
patterns.append(pattern)
|
|
176
|
+
|
|
177
|
+
# Check for conflicts
|
|
178
|
+
for pattern in patterns:
|
|
179
|
+
for other_pattern in patterns:
|
|
180
|
+
if other_pattern.id in pattern.conflicts_with:
|
|
181
|
+
return False, f"Conflict: {pattern.id} conflicts with {other_pattern.id}"
|
|
182
|
+
|
|
183
|
+
# Check for missing requirements
|
|
184
|
+
for pattern in patterns:
|
|
185
|
+
for required_id in pattern.requires:
|
|
186
|
+
if required_id not in pattern_ids:
|
|
187
|
+
return False, f"{pattern.id} requires {required_id}"
|
|
188
|
+
|
|
189
|
+
return True, None
|
|
190
|
+
|
|
191
|
+
def get_total_risk_weight(self, pattern_ids: list[str]) -> float:
|
|
192
|
+
"""Calculate total risk weight for pattern combination.
|
|
193
|
+
|
|
194
|
+
Args:
|
|
195
|
+
pattern_ids: List of pattern IDs
|
|
196
|
+
|
|
197
|
+
Returns:
|
|
198
|
+
Total risk weight
|
|
199
|
+
|
|
200
|
+
"""
|
|
201
|
+
total = 0.0
|
|
202
|
+
for pattern_id in pattern_ids:
|
|
203
|
+
pattern = self.get(pattern_id)
|
|
204
|
+
if pattern:
|
|
205
|
+
total += pattern.risk_weight
|
|
206
|
+
return total
|
|
207
|
+
|
|
208
|
+
def generate_code_sections(
|
|
209
|
+
self,
|
|
210
|
+
pattern_ids: list[str],
|
|
211
|
+
context: dict[str, Any],
|
|
212
|
+
) -> dict[str, list[Any]]:
|
|
213
|
+
"""Generate all code sections from patterns.
|
|
214
|
+
|
|
215
|
+
Args:
|
|
216
|
+
pattern_ids: List of pattern IDs to use
|
|
217
|
+
context: Context dictionary for code generation
|
|
218
|
+
|
|
219
|
+
Returns:
|
|
220
|
+
Dict mapping location to list of CodeSection objects
|
|
221
|
+
|
|
222
|
+
"""
|
|
223
|
+
from collections import defaultdict
|
|
224
|
+
|
|
225
|
+
sections_by_location = defaultdict(list)
|
|
226
|
+
|
|
227
|
+
for pattern_id in pattern_ids:
|
|
228
|
+
pattern = self.get(pattern_id)
|
|
229
|
+
if pattern:
|
|
230
|
+
sections = pattern.generate_code_sections(context)
|
|
231
|
+
for section in sections:
|
|
232
|
+
sections_by_location[section.location].append(section)
|
|
233
|
+
|
|
234
|
+
# Sort sections by priority within each location
|
|
235
|
+
for location in sections_by_location:
|
|
236
|
+
sections_by_location[location].sort(key=lambda s: -s.priority)
|
|
237
|
+
|
|
238
|
+
return dict(sections_by_location)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
# Global registry instance
|
|
242
|
+
_registry: WorkflowPatternRegistry | None = None
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def get_workflow_pattern_registry() -> WorkflowPatternRegistry:
|
|
246
|
+
"""Get the global workflow pattern registry.
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
WorkflowPatternRegistry instance
|
|
250
|
+
|
|
251
|
+
"""
|
|
252
|
+
global _registry
|
|
253
|
+
if _registry is None:
|
|
254
|
+
_registry = WorkflowPatternRegistry()
|
|
255
|
+
return _registry
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"""Structural workflow patterns.
|
|
2
|
+
|
|
3
|
+
How workflows are organized and structured.
|
|
4
|
+
|
|
5
|
+
Copyright 2025 Smart-AI-Memory
|
|
6
|
+
Licensed under Fair Source License 0.9
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from .core import CodeSection, PatternCategory, WorkflowComplexity, WorkflowPattern
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class SingleStagePattern(WorkflowPattern):
|
|
15
|
+
"""Single-stage workflow - simplest pattern.
|
|
16
|
+
|
|
17
|
+
Use for: Quick tasks that don't need multiple steps.
|
|
18
|
+
Examples: Simple text analysis, single API call, basic validation.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
id: str = "single-stage"
|
|
22
|
+
name: str = "Single Stage Workflow"
|
|
23
|
+
category: PatternCategory = PatternCategory.STRUCTURAL
|
|
24
|
+
description: str = "Simple one-stage workflow with single tier"
|
|
25
|
+
complexity: WorkflowComplexity = WorkflowComplexity.SIMPLE
|
|
26
|
+
use_cases: list[str] = [
|
|
27
|
+
"Quick analysis tasks",
|
|
28
|
+
"Single API calls",
|
|
29
|
+
"Basic validation or formatting",
|
|
30
|
+
]
|
|
31
|
+
examples: list[str] = []
|
|
32
|
+
risk_weight: float = 1.0
|
|
33
|
+
|
|
34
|
+
def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
|
|
35
|
+
"""Generate code for single-stage workflow."""
|
|
36
|
+
workflow_name = context.get("workflow_name", "MyWorkflow")
|
|
37
|
+
context.get("class_name", "MyWorkflow")
|
|
38
|
+
description = context.get("description", "Single-stage workflow")
|
|
39
|
+
tier = context.get("tier", "CAPABLE")
|
|
40
|
+
|
|
41
|
+
return [
|
|
42
|
+
CodeSection(
|
|
43
|
+
location="class_attributes",
|
|
44
|
+
code=f""" name = "{workflow_name}"
|
|
45
|
+
description = "{description}"
|
|
46
|
+
stages = ["process"]
|
|
47
|
+
tier_map = {{
|
|
48
|
+
"process": ModelTier.{tier},
|
|
49
|
+
}}""",
|
|
50
|
+
priority=1,
|
|
51
|
+
),
|
|
52
|
+
CodeSection(
|
|
53
|
+
location="methods",
|
|
54
|
+
code=''' async def run_stage(
|
|
55
|
+
self,
|
|
56
|
+
stage_name: str,
|
|
57
|
+
tier: ModelTier,
|
|
58
|
+
input_data: Any,
|
|
59
|
+
) -> tuple[Any, int, int]:
|
|
60
|
+
"""Execute the single processing stage."""
|
|
61
|
+
if stage_name == "process":
|
|
62
|
+
return await self._process(input_data, tier)
|
|
63
|
+
raise ValueError(f"Unknown stage: {stage_name}")
|
|
64
|
+
|
|
65
|
+
async def _process(
|
|
66
|
+
self,
|
|
67
|
+
input_data: Any,
|
|
68
|
+
tier: ModelTier,
|
|
69
|
+
) -> tuple[Any, int, int]:
|
|
70
|
+
"""Process the input data.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
input_data: Input data to process
|
|
74
|
+
tier: Model tier to use
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
Tuple of (result, input_tokens, output_tokens)
|
|
78
|
+
|
|
79
|
+
"""
|
|
80
|
+
# TODO: Implement processing logic
|
|
81
|
+
prompt = f"Process this input: {input_data}"
|
|
82
|
+
|
|
83
|
+
# Use LLM executor if available
|
|
84
|
+
if self.executor:
|
|
85
|
+
result = await self.executor.execute(
|
|
86
|
+
prompt=prompt,
|
|
87
|
+
tier=tier.to_unified() if hasattr(tier, "to_unified") else tier,
|
|
88
|
+
)
|
|
89
|
+
return result.content, result.input_tokens, result.output_tokens
|
|
90
|
+
|
|
91
|
+
# Fallback to basic processing
|
|
92
|
+
return {"result": "Processed", "input": input_data}, 0, 0''',
|
|
93
|
+
priority=2,
|
|
94
|
+
),
|
|
95
|
+
]
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class MultiStagePattern(WorkflowPattern):
|
|
99
|
+
"""Multi-stage workflow with sequential execution.
|
|
100
|
+
|
|
101
|
+
Use for: Complex tasks requiring multiple processing steps.
|
|
102
|
+
Examples: Code review (classify → scan → recommend), bug prediction.
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
id: str = "multi-stage"
|
|
106
|
+
name: str = "Multi-Stage Workflow"
|
|
107
|
+
category: PatternCategory = PatternCategory.STRUCTURAL
|
|
108
|
+
description: str = "Multiple sequential stages with different tiers"
|
|
109
|
+
complexity: WorkflowComplexity = WorkflowComplexity.MODERATE
|
|
110
|
+
use_cases: list[str] = [
|
|
111
|
+
"Code analysis pipelines",
|
|
112
|
+
"Multi-step processing",
|
|
113
|
+
"Tiered cost optimization",
|
|
114
|
+
]
|
|
115
|
+
examples: list[str] = ["bug-predict", "code-review", "pr-review"]
|
|
116
|
+
risk_weight: float = 2.5
|
|
117
|
+
|
|
118
|
+
def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
|
|
119
|
+
"""Generate code for multi-stage workflow."""
|
|
120
|
+
workflow_name = context.get("workflow_name", "my-workflow")
|
|
121
|
+
context.get("class_name", "MyWorkflow")
|
|
122
|
+
description = context.get("description", "Multi-stage workflow")
|
|
123
|
+
stages = context.get("stages", ["analyze", "process", "report"])
|
|
124
|
+
tier_map = context.get(
|
|
125
|
+
"tier_map",
|
|
126
|
+
{
|
|
127
|
+
"analyze": "CHEAP",
|
|
128
|
+
"process": "CAPABLE",
|
|
129
|
+
"report": "PREMIUM",
|
|
130
|
+
},
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
# Generate tier map code
|
|
134
|
+
tier_map_code = " tier_map = {\n"
|
|
135
|
+
for stage, tier in tier_map.items():
|
|
136
|
+
tier_map_code += f' "{stage}": ModelTier.{tier},\n'
|
|
137
|
+
tier_map_code += " }"
|
|
138
|
+
|
|
139
|
+
# Generate stage routing
|
|
140
|
+
stage_routing = []
|
|
141
|
+
for _i, stage in enumerate(stages):
|
|
142
|
+
stage_routing.append(
|
|
143
|
+
f""" if stage_name == "{stage}":
|
|
144
|
+
return await self._{stage}(input_data, tier)"""
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
stage_routing_code = "\n".join(stage_routing)
|
|
148
|
+
|
|
149
|
+
# Generate stage method templates
|
|
150
|
+
stage_methods = []
|
|
151
|
+
for stage in stages:
|
|
152
|
+
stage_methods.append(
|
|
153
|
+
f''' async def _{stage}(
|
|
154
|
+
self,
|
|
155
|
+
input_data: Any,
|
|
156
|
+
tier: ModelTier,
|
|
157
|
+
) -> tuple[Any, int, int]:
|
|
158
|
+
"""{stage.replace("_", " ").title()} stage.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
input_data: Input from previous stage
|
|
162
|
+
tier: Model tier to use
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
Tuple of (result, input_tokens, output_tokens)
|
|
166
|
+
|
|
167
|
+
"""
|
|
168
|
+
# TODO: Implement {stage} logic
|
|
169
|
+
prompt = f"{{stage}} stage: {{input_data}}"
|
|
170
|
+
|
|
171
|
+
if self.executor:
|
|
172
|
+
result = await self.executor.execute(
|
|
173
|
+
prompt=prompt,
|
|
174
|
+
tier=tier.to_unified() if hasattr(tier, "to_unified") else tier,
|
|
175
|
+
)
|
|
176
|
+
return result.content, result.input_tokens, result.output_tokens
|
|
177
|
+
|
|
178
|
+
return {{"stage": "{stage}", "input": input_data}}, 0, 0'''
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
return [
|
|
182
|
+
CodeSection(
|
|
183
|
+
location="class_attributes",
|
|
184
|
+
code=f""" name = "{workflow_name}"
|
|
185
|
+
description = "{description}"
|
|
186
|
+
stages = {stages}
|
|
187
|
+
{tier_map_code}""",
|
|
188
|
+
priority=1,
|
|
189
|
+
),
|
|
190
|
+
CodeSection(
|
|
191
|
+
location="methods",
|
|
192
|
+
code=f''' async def run_stage(
|
|
193
|
+
self,
|
|
194
|
+
stage_name: str,
|
|
195
|
+
tier: ModelTier,
|
|
196
|
+
input_data: Any,
|
|
197
|
+
) -> tuple[Any, int, int]:
|
|
198
|
+
"""Route to specific stage implementation."""
|
|
199
|
+
{stage_routing_code}
|
|
200
|
+
raise ValueError(f"Unknown stage: {{stage_name}}")
|
|
201
|
+
|
|
202
|
+
{chr(10).join(stage_methods)}''',
|
|
203
|
+
priority=2,
|
|
204
|
+
),
|
|
205
|
+
]
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
class CrewBasedPattern(WorkflowPattern):
|
|
209
|
+
"""Workflow that wraps a CrewAI crew.
|
|
210
|
+
|
|
211
|
+
Use for: Multi-agent collaboration tasks.
|
|
212
|
+
Examples: Health check, security audit, code review.
|
|
213
|
+
"""
|
|
214
|
+
|
|
215
|
+
id: str = "crew-based"
|
|
216
|
+
name: str = "Crew-Based Workflow"
|
|
217
|
+
category: PatternCategory = PatternCategory.INTEGRATION
|
|
218
|
+
description: str = "Wraps CrewAI crew for multi-agent collaboration"
|
|
219
|
+
complexity: WorkflowComplexity = WorkflowComplexity.COMPLEX
|
|
220
|
+
use_cases: list[str] = [
|
|
221
|
+
"Multi-agent tasks",
|
|
222
|
+
"Complex analysis requiring specialized roles",
|
|
223
|
+
"Collaborative problem solving",
|
|
224
|
+
]
|
|
225
|
+
examples: list[str] = ["health-check", "security-audit"]
|
|
226
|
+
conflicts_with: list[str] = ["single-stage"]
|
|
227
|
+
risk_weight: float = 3.5
|
|
228
|
+
|
|
229
|
+
def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
|
|
230
|
+
"""Generate code for crew-based workflow."""
|
|
231
|
+
workflow_name = context.get("workflow_name", "my-crew-workflow")
|
|
232
|
+
context.get("class_name", "MyCrewWorkflow")
|
|
233
|
+
description = context.get("description", "Crew-based workflow")
|
|
234
|
+
crew_name = context.get("crew_name", "MyCrew")
|
|
235
|
+
|
|
236
|
+
return [
|
|
237
|
+
CodeSection(
|
|
238
|
+
location="class_attributes",
|
|
239
|
+
code=f""" name = "{workflow_name}"
|
|
240
|
+
description = "{description}"
|
|
241
|
+
stages = ["analyze", "fix"]
|
|
242
|
+
tier_map = {{
|
|
243
|
+
"analyze": ModelTier.CAPABLE,
|
|
244
|
+
"fix": ModelTier.CAPABLE,
|
|
245
|
+
}}""",
|
|
246
|
+
priority=1,
|
|
247
|
+
),
|
|
248
|
+
CodeSection(
|
|
249
|
+
location="init_method",
|
|
250
|
+
code=""" self._crew: Any = None
|
|
251
|
+
self._crew_available = False""",
|
|
252
|
+
priority=1,
|
|
253
|
+
),
|
|
254
|
+
CodeSection(
|
|
255
|
+
location="methods",
|
|
256
|
+
code=f''' async def _initialize_crew(self) -> None:
|
|
257
|
+
"""Initialize the {crew_name}."""
|
|
258
|
+
if self._crew is not None:
|
|
259
|
+
return
|
|
260
|
+
|
|
261
|
+
try:
|
|
262
|
+
from attune_llm.agent_factory.crews import {crew_name}
|
|
263
|
+
|
|
264
|
+
self._crew = {crew_name}()
|
|
265
|
+
self._crew_available = True
|
|
266
|
+
logger.info("{crew_name} initialized successfully")
|
|
267
|
+
except ImportError as e:
|
|
268
|
+
logger.warning(f"{crew_name} not available: {{e}}")
|
|
269
|
+
self._crew_available = False
|
|
270
|
+
|
|
271
|
+
async def run_stage(
|
|
272
|
+
self,
|
|
273
|
+
stage_name: str,
|
|
274
|
+
tier: ModelTier,
|
|
275
|
+
input_data: Any,
|
|
276
|
+
) -> tuple[Any, int, int]:
|
|
277
|
+
"""Route to crew for execution."""
|
|
278
|
+
await self._initialize_crew()
|
|
279
|
+
|
|
280
|
+
if not self._crew_available:
|
|
281
|
+
return {{"error": "Crew not available"}}, 0, 0
|
|
282
|
+
|
|
283
|
+
# Execute crew task
|
|
284
|
+
result = await self._crew.execute(stage_name, input_data)
|
|
285
|
+
return result, 0, 0 # Crew handles token counting internally''',
|
|
286
|
+
priority=2,
|
|
287
|
+
),
|
|
288
|
+
]
|