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,558 @@
|
|
|
1
|
+
"""Universal Agent Factory
|
|
2
|
+
|
|
3
|
+
The main entry point for creating agents and workflows across any
|
|
4
|
+
supported framework while retaining Empathy's core features.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
from attune_llm.agent_factory import AgentFactory, Framework
|
|
8
|
+
|
|
9
|
+
# Create factory
|
|
10
|
+
factory = AgentFactory(framework=Framework.LANGGRAPH)
|
|
11
|
+
|
|
12
|
+
# Create agents
|
|
13
|
+
researcher = factory.create_agent(
|
|
14
|
+
name="researcher",
|
|
15
|
+
role="researcher",
|
|
16
|
+
model_tier="capable"
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
writer = factory.create_agent(
|
|
20
|
+
name="writer",
|
|
21
|
+
role="writer",
|
|
22
|
+
model_tier="premium"
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
# Create workflow
|
|
26
|
+
pipeline = factory.create_workflow(
|
|
27
|
+
name="research_pipeline",
|
|
28
|
+
agents=[researcher, writer],
|
|
29
|
+
mode="sequential"
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# Run
|
|
33
|
+
result = await pipeline.run("Research AI trends")
|
|
34
|
+
|
|
35
|
+
Copyright 2025 Smart-AI-Memory
|
|
36
|
+
Licensed under Fair Source License 0.9
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
import os
|
|
40
|
+
from collections.abc import Callable
|
|
41
|
+
from typing import Any
|
|
42
|
+
|
|
43
|
+
from attune_llm.agent_factory.base import (
|
|
44
|
+
AgentCapability,
|
|
45
|
+
AgentConfig,
|
|
46
|
+
AgentRole,
|
|
47
|
+
BaseAdapter,
|
|
48
|
+
BaseAgent,
|
|
49
|
+
BaseWorkflow,
|
|
50
|
+
WorkflowConfig,
|
|
51
|
+
)
|
|
52
|
+
from attune_llm.agent_factory.framework import (
|
|
53
|
+
Framework,
|
|
54
|
+
detect_installed_frameworks,
|
|
55
|
+
get_framework_info,
|
|
56
|
+
get_recommended_framework,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class AgentFactory:
|
|
61
|
+
"""Universal factory for creating agents and workflows.
|
|
62
|
+
|
|
63
|
+
Supports multiple frameworks (LangChain, LangGraph, AutoGen, Haystack, Native)
|
|
64
|
+
while providing a unified interface and integrating with Empathy's
|
|
65
|
+
cost optimization, pattern learning, and memory features.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
def __init__(
|
|
69
|
+
self,
|
|
70
|
+
framework: Framework | str | None = None,
|
|
71
|
+
provider: str = "anthropic",
|
|
72
|
+
api_key: str | None = None,
|
|
73
|
+
use_case: str = "general",
|
|
74
|
+
):
|
|
75
|
+
"""Initialize the Agent Factory.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
framework: Framework to use (auto-detected if not specified)
|
|
79
|
+
provider: LLM provider (anthropic, openai, local)
|
|
80
|
+
api_key: API key (uses env var if not provided)
|
|
81
|
+
use_case: Use case for framework recommendation (general, rag, multi_agent, etc.)
|
|
82
|
+
|
|
83
|
+
"""
|
|
84
|
+
self.provider = provider
|
|
85
|
+
self.api_key = api_key or os.getenv(
|
|
86
|
+
"ANTHROPIC_API_KEY" if provider == "anthropic" else "OPENAI_API_KEY",
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
# Resolve framework
|
|
90
|
+
if framework is None:
|
|
91
|
+
self.framework = get_recommended_framework(use_case)
|
|
92
|
+
elif isinstance(framework, str):
|
|
93
|
+
self.framework = Framework.from_string(framework)
|
|
94
|
+
else:
|
|
95
|
+
self.framework = framework
|
|
96
|
+
|
|
97
|
+
# Get adapter
|
|
98
|
+
self._adapter = self._get_adapter()
|
|
99
|
+
|
|
100
|
+
# Track created agents for reuse
|
|
101
|
+
self._agents: dict[str, BaseAgent] = {}
|
|
102
|
+
|
|
103
|
+
def _get_adapter(self) -> BaseAdapter:
|
|
104
|
+
"""Get the appropriate adapter for the selected framework."""
|
|
105
|
+
from attune_llm.agent_factory.adapters import (
|
|
106
|
+
NativeAdapter,
|
|
107
|
+
get_autogen_adapter,
|
|
108
|
+
get_crewai_adapter,
|
|
109
|
+
get_haystack_adapter,
|
|
110
|
+
get_langchain_adapter,
|
|
111
|
+
get_langgraph_adapter,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
if self.framework == Framework.NATIVE:
|
|
115
|
+
return NativeAdapter(self.provider, self.api_key)
|
|
116
|
+
|
|
117
|
+
if self.framework == Framework.LANGCHAIN:
|
|
118
|
+
adapter_class = get_langchain_adapter()
|
|
119
|
+
return adapter_class(self.provider, self.api_key) # type: ignore[no-any-return]
|
|
120
|
+
|
|
121
|
+
if self.framework == Framework.LANGGRAPH:
|
|
122
|
+
adapter_class = get_langgraph_adapter()
|
|
123
|
+
return adapter_class(self.provider, self.api_key) # type: ignore[no-any-return]
|
|
124
|
+
|
|
125
|
+
if self.framework == Framework.AUTOGEN:
|
|
126
|
+
adapter_class = get_autogen_adapter()
|
|
127
|
+
return adapter_class(self.provider, self.api_key) # type: ignore[no-any-return]
|
|
128
|
+
|
|
129
|
+
if self.framework == Framework.HAYSTACK:
|
|
130
|
+
adapter_class = get_haystack_adapter()
|
|
131
|
+
return adapter_class(self.provider, self.api_key) # type: ignore[no-any-return]
|
|
132
|
+
|
|
133
|
+
if self.framework == Framework.CREWAI:
|
|
134
|
+
adapter_class = get_crewai_adapter()
|
|
135
|
+
return adapter_class(self.provider, self.api_key) # type: ignore[no-any-return]
|
|
136
|
+
|
|
137
|
+
# Fallback to native
|
|
138
|
+
return NativeAdapter(self.provider, self.api_key)
|
|
139
|
+
|
|
140
|
+
@property
|
|
141
|
+
def adapter(self) -> BaseAdapter:
|
|
142
|
+
"""Get the current adapter."""
|
|
143
|
+
return self._adapter
|
|
144
|
+
|
|
145
|
+
def create_agent(
|
|
146
|
+
self,
|
|
147
|
+
name: str,
|
|
148
|
+
role: AgentRole | str = AgentRole.CUSTOM,
|
|
149
|
+
description: str = "",
|
|
150
|
+
model_tier: str = "capable",
|
|
151
|
+
model_override: str | None = None,
|
|
152
|
+
capabilities: list[AgentCapability] | None = None,
|
|
153
|
+
tools: list[Any] | None = None,
|
|
154
|
+
system_prompt: str | None = None,
|
|
155
|
+
temperature: float = 0.7,
|
|
156
|
+
max_tokens: int = 4096,
|
|
157
|
+
empathy_level: int = 4,
|
|
158
|
+
use_patterns: bool = True,
|
|
159
|
+
track_costs: bool = True,
|
|
160
|
+
memory_enabled: bool = True,
|
|
161
|
+
memory_type: str = "conversation",
|
|
162
|
+
framework_options: dict | None = None,
|
|
163
|
+
# Resilience options
|
|
164
|
+
resilience_enabled: bool = False,
|
|
165
|
+
circuit_breaker_threshold: int = 3,
|
|
166
|
+
retry_max_attempts: int = 2,
|
|
167
|
+
timeout_seconds: float = 30.0,
|
|
168
|
+
# Memory Graph options
|
|
169
|
+
memory_graph_enabled: bool = False,
|
|
170
|
+
memory_graph_path: str = "patterns/memory_graph.json",
|
|
171
|
+
store_findings: bool = True,
|
|
172
|
+
query_similar: bool = True,
|
|
173
|
+
) -> BaseAgent:
|
|
174
|
+
"""Create an agent using the configured framework.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
name: Unique agent name
|
|
178
|
+
role: Agent role (researcher, writer, debugger, etc.)
|
|
179
|
+
description: Agent description
|
|
180
|
+
model_tier: Model tier (cheap, capable, premium)
|
|
181
|
+
model_override: Specific model ID to use
|
|
182
|
+
capabilities: Agent capabilities (tool_use, code_execution, etc.)
|
|
183
|
+
tools: Tools for the agent
|
|
184
|
+
system_prompt: Custom system prompt
|
|
185
|
+
temperature: LLM temperature
|
|
186
|
+
max_tokens: Max tokens for response
|
|
187
|
+
empathy_level: Empathy level (1-5)
|
|
188
|
+
use_patterns: Use learned patterns from Empathy
|
|
189
|
+
track_costs: Track API costs
|
|
190
|
+
memory_enabled: Enable conversation memory
|
|
191
|
+
memory_type: Type of memory (conversation, summary, vector)
|
|
192
|
+
framework_options: Framework-specific options
|
|
193
|
+
resilience_enabled: Enable resilience patterns (circuit breaker, retry, timeout)
|
|
194
|
+
circuit_breaker_threshold: Number of failures before circuit opens
|
|
195
|
+
retry_max_attempts: Maximum retry attempts
|
|
196
|
+
timeout_seconds: Timeout for agent invocations
|
|
197
|
+
memory_graph_enabled: Enable Memory Graph integration
|
|
198
|
+
memory_graph_path: Path to memory graph JSON file
|
|
199
|
+
store_findings: Store agent findings in memory graph
|
|
200
|
+
query_similar: Query similar findings before invocation
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
Agent implementing BaseAgent interface
|
|
204
|
+
|
|
205
|
+
"""
|
|
206
|
+
# Parse role
|
|
207
|
+
if isinstance(role, str):
|
|
208
|
+
try:
|
|
209
|
+
role = AgentRole(role.lower())
|
|
210
|
+
except ValueError:
|
|
211
|
+
role = AgentRole.CUSTOM
|
|
212
|
+
|
|
213
|
+
# Build config
|
|
214
|
+
config = AgentConfig(
|
|
215
|
+
name=name,
|
|
216
|
+
role=role,
|
|
217
|
+
description=description,
|
|
218
|
+
model_tier=model_tier,
|
|
219
|
+
model_override=model_override,
|
|
220
|
+
capabilities=capabilities or [],
|
|
221
|
+
tools=tools or [],
|
|
222
|
+
system_prompt=system_prompt,
|
|
223
|
+
temperature=temperature,
|
|
224
|
+
max_tokens=max_tokens,
|
|
225
|
+
empathy_level=empathy_level,
|
|
226
|
+
use_patterns=use_patterns,
|
|
227
|
+
track_costs=track_costs,
|
|
228
|
+
memory_enabled=memory_enabled,
|
|
229
|
+
memory_type=memory_type,
|
|
230
|
+
framework_options=framework_options or {},
|
|
231
|
+
# Resilience
|
|
232
|
+
resilience_enabled=resilience_enabled,
|
|
233
|
+
circuit_breaker_threshold=circuit_breaker_threshold,
|
|
234
|
+
retry_max_attempts=retry_max_attempts,
|
|
235
|
+
timeout_seconds=timeout_seconds,
|
|
236
|
+
# Memory Graph
|
|
237
|
+
memory_graph_enabled=memory_graph_enabled,
|
|
238
|
+
memory_graph_path=memory_graph_path,
|
|
239
|
+
store_findings=store_findings,
|
|
240
|
+
query_similar=query_similar,
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
# Create agent
|
|
244
|
+
agent = self._adapter.create_agent(config)
|
|
245
|
+
|
|
246
|
+
# Apply Memory Graph wrapper (if enabled)
|
|
247
|
+
if memory_graph_enabled:
|
|
248
|
+
try:
|
|
249
|
+
from attune_llm.agent_factory.memory_integration import MemoryAwareAgent
|
|
250
|
+
|
|
251
|
+
agent = MemoryAwareAgent(
|
|
252
|
+
agent,
|
|
253
|
+
graph_path=memory_graph_path,
|
|
254
|
+
store_findings=store_findings,
|
|
255
|
+
query_similar=query_similar,
|
|
256
|
+
)
|
|
257
|
+
except ImportError:
|
|
258
|
+
import logging
|
|
259
|
+
|
|
260
|
+
logging.getLogger(__name__).warning(
|
|
261
|
+
"Memory integration not available, memory_graph_enabled ignored",
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
# Apply Resilience wrapper (if enabled) - outermost wrapper
|
|
265
|
+
if resilience_enabled:
|
|
266
|
+
try:
|
|
267
|
+
from attune_llm.agent_factory.resilient import (
|
|
268
|
+
ResilienceConfig,
|
|
269
|
+
ResilientAgent,
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
resilience_config = ResilienceConfig(
|
|
273
|
+
enable_circuit_breaker=True,
|
|
274
|
+
failure_threshold=circuit_breaker_threshold,
|
|
275
|
+
enable_retry=True,
|
|
276
|
+
max_attempts=retry_max_attempts,
|
|
277
|
+
enable_timeout=True,
|
|
278
|
+
timeout_seconds=timeout_seconds,
|
|
279
|
+
)
|
|
280
|
+
agent = ResilientAgent(agent, resilience_config)
|
|
281
|
+
except ImportError:
|
|
282
|
+
import logging
|
|
283
|
+
|
|
284
|
+
logging.getLogger(__name__).warning(
|
|
285
|
+
"Resilience module not available, resilience_enabled ignored",
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
# Track for reuse
|
|
289
|
+
self._agents[name] = agent
|
|
290
|
+
|
|
291
|
+
return agent
|
|
292
|
+
|
|
293
|
+
def create_workflow(
|
|
294
|
+
self,
|
|
295
|
+
name: str,
|
|
296
|
+
agents: list[BaseAgent],
|
|
297
|
+
description: str = "",
|
|
298
|
+
mode: str = "sequential",
|
|
299
|
+
max_iterations: int = 10,
|
|
300
|
+
timeout_seconds: int = 300,
|
|
301
|
+
state_schema: dict | None = None,
|
|
302
|
+
checkpointing: bool = True,
|
|
303
|
+
retry_on_error: bool = True,
|
|
304
|
+
max_retries: int = 3,
|
|
305
|
+
framework_options: dict | None = None,
|
|
306
|
+
) -> BaseWorkflow:
|
|
307
|
+
"""Create a workflow/pipeline from agents.
|
|
308
|
+
|
|
309
|
+
Args:
|
|
310
|
+
name: Workflow name
|
|
311
|
+
agents: List of agents to include
|
|
312
|
+
description: Workflow description
|
|
313
|
+
mode: Execution mode (sequential, parallel, graph, conversation)
|
|
314
|
+
max_iterations: Max iterations for loops
|
|
315
|
+
timeout_seconds: Timeout in seconds
|
|
316
|
+
state_schema: Schema for workflow state
|
|
317
|
+
checkpointing: Enable state checkpointing
|
|
318
|
+
retry_on_error: Retry failed steps
|
|
319
|
+
max_retries: Max retry attempts
|
|
320
|
+
framework_options: Framework-specific options
|
|
321
|
+
|
|
322
|
+
Returns:
|
|
323
|
+
Workflow implementing BaseWorkflow interface
|
|
324
|
+
|
|
325
|
+
"""
|
|
326
|
+
config = WorkflowConfig(
|
|
327
|
+
name=name,
|
|
328
|
+
description=description,
|
|
329
|
+
mode=mode,
|
|
330
|
+
max_iterations=max_iterations,
|
|
331
|
+
timeout_seconds=timeout_seconds,
|
|
332
|
+
state_schema=state_schema,
|
|
333
|
+
checkpointing=checkpointing,
|
|
334
|
+
retry_on_error=retry_on_error,
|
|
335
|
+
max_retries=max_retries,
|
|
336
|
+
framework_options=framework_options or {},
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
return self._adapter.create_workflow(config, agents)
|
|
340
|
+
|
|
341
|
+
def create_tool(
|
|
342
|
+
self,
|
|
343
|
+
name: str,
|
|
344
|
+
description: str,
|
|
345
|
+
func: Callable,
|
|
346
|
+
args_schema: dict | None = None,
|
|
347
|
+
) -> Any:
|
|
348
|
+
"""Create a tool in the framework's format.
|
|
349
|
+
|
|
350
|
+
Args:
|
|
351
|
+
name: Tool name
|
|
352
|
+
description: Tool description
|
|
353
|
+
func: Function to execute
|
|
354
|
+
args_schema: Optional JSON schema for arguments
|
|
355
|
+
|
|
356
|
+
Returns:
|
|
357
|
+
Tool in the framework's native format
|
|
358
|
+
|
|
359
|
+
"""
|
|
360
|
+
return self._adapter.create_tool(name, description, func, args_schema)
|
|
361
|
+
|
|
362
|
+
def get_agent(self, name: str) -> BaseAgent | None:
|
|
363
|
+
"""Get a previously created agent by name."""
|
|
364
|
+
return self._agents.get(name)
|
|
365
|
+
|
|
366
|
+
def list_agents(self) -> list[str]:
|
|
367
|
+
"""List all created agent names."""
|
|
368
|
+
return list(self._agents.keys())
|
|
369
|
+
|
|
370
|
+
@classmethod
|
|
371
|
+
def list_frameworks(cls, installed_only: bool = True) -> list[dict]:
|
|
372
|
+
"""List available frameworks.
|
|
373
|
+
|
|
374
|
+
Args:
|
|
375
|
+
installed_only: Only show installed frameworks
|
|
376
|
+
|
|
377
|
+
Returns:
|
|
378
|
+
List of framework info dicts
|
|
379
|
+
|
|
380
|
+
"""
|
|
381
|
+
all_frameworks = [
|
|
382
|
+
Framework.NATIVE,
|
|
383
|
+
Framework.LANGCHAIN,
|
|
384
|
+
Framework.LANGGRAPH,
|
|
385
|
+
Framework.AUTOGEN,
|
|
386
|
+
Framework.HAYSTACK,
|
|
387
|
+
Framework.CREWAI,
|
|
388
|
+
]
|
|
389
|
+
|
|
390
|
+
if installed_only:
|
|
391
|
+
installed = detect_installed_frameworks()
|
|
392
|
+
frameworks = [f for f in all_frameworks if f in installed]
|
|
393
|
+
else:
|
|
394
|
+
frameworks = all_frameworks
|
|
395
|
+
|
|
396
|
+
return [
|
|
397
|
+
{
|
|
398
|
+
"framework": f,
|
|
399
|
+
"installed": f in detect_installed_frameworks(),
|
|
400
|
+
**get_framework_info(f),
|
|
401
|
+
}
|
|
402
|
+
for f in frameworks
|
|
403
|
+
]
|
|
404
|
+
|
|
405
|
+
@classmethod
|
|
406
|
+
def recommend_framework(cls, use_case: str = "general") -> Framework:
|
|
407
|
+
"""Get recommended framework for a use case.
|
|
408
|
+
|
|
409
|
+
Args:
|
|
410
|
+
use_case: general, rag, multi_agent, code_analysis, workflow, conversational
|
|
411
|
+
|
|
412
|
+
Returns:
|
|
413
|
+
Recommended framework
|
|
414
|
+
|
|
415
|
+
"""
|
|
416
|
+
return get_recommended_framework(use_case)
|
|
417
|
+
|
|
418
|
+
def switch_framework(self, framework: Framework | str) -> None:
|
|
419
|
+
"""Switch to a different framework.
|
|
420
|
+
|
|
421
|
+
Note: Existing agents won't be migrated.
|
|
422
|
+
|
|
423
|
+
Args:
|
|
424
|
+
framework: New framework to use
|
|
425
|
+
|
|
426
|
+
"""
|
|
427
|
+
if isinstance(framework, str):
|
|
428
|
+
framework = Framework.from_string(framework)
|
|
429
|
+
|
|
430
|
+
self.framework = framework
|
|
431
|
+
self._adapter = self._get_adapter()
|
|
432
|
+
self._agents.clear()
|
|
433
|
+
|
|
434
|
+
# =========================================================================
|
|
435
|
+
# Convenience methods for common agent patterns
|
|
436
|
+
# =========================================================================
|
|
437
|
+
|
|
438
|
+
def create_researcher(
|
|
439
|
+
self,
|
|
440
|
+
name: str = "researcher",
|
|
441
|
+
model_tier: str = "capable",
|
|
442
|
+
**kwargs,
|
|
443
|
+
) -> BaseAgent:
|
|
444
|
+
"""Create a researcher agent."""
|
|
445
|
+
return self.create_agent(
|
|
446
|
+
name=name,
|
|
447
|
+
role=AgentRole.RESEARCHER,
|
|
448
|
+
description="Researches and gathers information thoroughly.",
|
|
449
|
+
model_tier=model_tier,
|
|
450
|
+
**kwargs,
|
|
451
|
+
)
|
|
452
|
+
|
|
453
|
+
def create_writer(
|
|
454
|
+
self,
|
|
455
|
+
name: str = "writer",
|
|
456
|
+
model_tier: str = "premium",
|
|
457
|
+
**kwargs,
|
|
458
|
+
) -> BaseAgent:
|
|
459
|
+
"""Create a writer agent."""
|
|
460
|
+
return self.create_agent(
|
|
461
|
+
name=name,
|
|
462
|
+
role=AgentRole.WRITER,
|
|
463
|
+
description="Creates clear, engaging content.",
|
|
464
|
+
model_tier=model_tier,
|
|
465
|
+
**kwargs,
|
|
466
|
+
)
|
|
467
|
+
|
|
468
|
+
def create_reviewer(
|
|
469
|
+
self,
|
|
470
|
+
name: str = "reviewer",
|
|
471
|
+
model_tier: str = "capable",
|
|
472
|
+
**kwargs,
|
|
473
|
+
) -> BaseAgent:
|
|
474
|
+
"""Create a reviewer agent."""
|
|
475
|
+
return self.create_agent(
|
|
476
|
+
name=name,
|
|
477
|
+
role=AgentRole.REVIEWER,
|
|
478
|
+
description="Reviews work and provides constructive feedback.",
|
|
479
|
+
model_tier=model_tier,
|
|
480
|
+
**kwargs,
|
|
481
|
+
)
|
|
482
|
+
|
|
483
|
+
def create_debugger(
|
|
484
|
+
self,
|
|
485
|
+
name: str = "debugger",
|
|
486
|
+
model_tier: str = "capable",
|
|
487
|
+
**kwargs,
|
|
488
|
+
) -> BaseAgent:
|
|
489
|
+
"""Create a debugger agent."""
|
|
490
|
+
return self.create_agent(
|
|
491
|
+
name=name,
|
|
492
|
+
role=AgentRole.DEBUGGER,
|
|
493
|
+
description="Analyzes code issues and finds bugs.",
|
|
494
|
+
model_tier=model_tier,
|
|
495
|
+
capabilities=[AgentCapability.CODE_EXECUTION],
|
|
496
|
+
**kwargs,
|
|
497
|
+
)
|
|
498
|
+
|
|
499
|
+
def create_coordinator(
|
|
500
|
+
self,
|
|
501
|
+
name: str = "coordinator",
|
|
502
|
+
model_tier: str = "premium",
|
|
503
|
+
**kwargs,
|
|
504
|
+
) -> BaseAgent:
|
|
505
|
+
"""Create a coordinator agent."""
|
|
506
|
+
return self.create_agent(
|
|
507
|
+
name=name,
|
|
508
|
+
role=AgentRole.COORDINATOR,
|
|
509
|
+
description="Coordinates other agents and synthesizes results.",
|
|
510
|
+
model_tier=model_tier,
|
|
511
|
+
**kwargs,
|
|
512
|
+
)
|
|
513
|
+
|
|
514
|
+
# =========================================================================
|
|
515
|
+
# Pipeline creation helpers
|
|
516
|
+
# =========================================================================
|
|
517
|
+
|
|
518
|
+
def create_research_pipeline(
|
|
519
|
+
self,
|
|
520
|
+
topic: str = "",
|
|
521
|
+
include_reviewer: bool = True,
|
|
522
|
+
) -> BaseWorkflow:
|
|
523
|
+
"""Create a research → write → review pipeline.
|
|
524
|
+
|
|
525
|
+
Args:
|
|
526
|
+
topic: Research topic (used in prompts)
|
|
527
|
+
include_reviewer: Include a reviewer agent
|
|
528
|
+
|
|
529
|
+
Returns:
|
|
530
|
+
Workflow ready to run
|
|
531
|
+
|
|
532
|
+
"""
|
|
533
|
+
agents = [
|
|
534
|
+
self.create_researcher(
|
|
535
|
+
system_prompt=f"Research thoroughly about: {topic}" if topic else None,
|
|
536
|
+
),
|
|
537
|
+
self.create_writer(),
|
|
538
|
+
]
|
|
539
|
+
|
|
540
|
+
if include_reviewer:
|
|
541
|
+
agents.append(self.create_reviewer())
|
|
542
|
+
|
|
543
|
+
return self.create_workflow(name="research_pipeline", agents=agents, mode="sequential")
|
|
544
|
+
|
|
545
|
+
def create_code_review_pipeline(self) -> BaseWorkflow:
|
|
546
|
+
"""Create a code review pipeline."""
|
|
547
|
+
agents = [
|
|
548
|
+
self.create_agent(
|
|
549
|
+
name="analyzer",
|
|
550
|
+
role=AgentRole.SECURITY,
|
|
551
|
+
model_tier="capable",
|
|
552
|
+
system_prompt="Analyze code for security issues.",
|
|
553
|
+
),
|
|
554
|
+
self.create_debugger(system_prompt="Look for potential bugs and issues."),
|
|
555
|
+
self.create_reviewer(system_prompt="Review code quality and suggest improvements."),
|
|
556
|
+
]
|
|
557
|
+
|
|
558
|
+
return self.create_workflow(name="code_review_pipeline", agents=agents, mode="sequential")
|