empathy-framework 2.4.0__py3-none-any.whl → 3.8.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- coach_wizards/__init__.py +13 -12
- coach_wizards/accessibility_wizard.py +12 -12
- coach_wizards/api_wizard.py +12 -12
- coach_wizards/base_wizard.py +26 -20
- coach_wizards/cicd_wizard.py +15 -13
- coach_wizards/code_reviewer_README.md +60 -0
- coach_wizards/code_reviewer_wizard.py +180 -0
- coach_wizards/compliance_wizard.py +12 -12
- coach_wizards/database_wizard.py +12 -12
- coach_wizards/debugging_wizard.py +12 -12
- coach_wizards/documentation_wizard.py +12 -12
- coach_wizards/generate_wizards.py +1 -2
- coach_wizards/localization_wizard.py +101 -19
- coach_wizards/migration_wizard.py +12 -12
- coach_wizards/monitoring_wizard.py +12 -12
- coach_wizards/observability_wizard.py +12 -12
- coach_wizards/performance_wizard.py +12 -12
- coach_wizards/prompt_engineering_wizard.py +661 -0
- coach_wizards/refactoring_wizard.py +12 -12
- coach_wizards/scaling_wizard.py +12 -12
- coach_wizards/security_wizard.py +12 -12
- coach_wizards/testing_wizard.py +12 -12
- empathy_framework-3.8.2.dist-info/METADATA +1176 -0
- empathy_framework-3.8.2.dist-info/RECORD +333 -0
- empathy_framework-3.8.2.dist-info/entry_points.txt +22 -0
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/top_level.txt +5 -1
- empathy_healthcare_plugin/__init__.py +1 -2
- empathy_healthcare_plugin/monitors/__init__.py +9 -0
- empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
- empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
- empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
- empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
- empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
- empathy_llm_toolkit/__init__.py +7 -7
- empathy_llm_toolkit/agent_factory/__init__.py +53 -0
- empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
- empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
- empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
- empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
- empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
- empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
- empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
- empathy_llm_toolkit/agent_factory/base.py +305 -0
- empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
- empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
- empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
- empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
- empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
- empathy_llm_toolkit/agent_factory/decorators.py +286 -0
- empathy_llm_toolkit/agent_factory/factory.py +558 -0
- empathy_llm_toolkit/agent_factory/framework.py +192 -0
- empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
- empathy_llm_toolkit/agent_factory/resilient.py +320 -0
- empathy_llm_toolkit/claude_memory.py +14 -15
- empathy_llm_toolkit/cli/__init__.py +8 -0
- empathy_llm_toolkit/cli/sync_claude.py +487 -0
- empathy_llm_toolkit/code_health.py +186 -28
- empathy_llm_toolkit/config/__init__.py +29 -0
- empathy_llm_toolkit/config/unified.py +295 -0
- empathy_llm_toolkit/contextual_patterns.py +11 -12
- empathy_llm_toolkit/core.py +168 -53
- empathy_llm_toolkit/git_pattern_extractor.py +17 -13
- empathy_llm_toolkit/levels.py +6 -13
- empathy_llm_toolkit/pattern_confidence.py +14 -18
- empathy_llm_toolkit/pattern_resolver.py +10 -12
- empathy_llm_toolkit/pattern_summary.py +16 -14
- empathy_llm_toolkit/providers.py +194 -28
- empathy_llm_toolkit/routing/__init__.py +32 -0
- empathy_llm_toolkit/routing/model_router.py +362 -0
- empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
- empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
- empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
- empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
- empathy_llm_toolkit/security/README.md +262 -0
- empathy_llm_toolkit/security/__init__.py +62 -0
- empathy_llm_toolkit/security/audit_logger.py +929 -0
- empathy_llm_toolkit/security/audit_logger_example.py +152 -0
- empathy_llm_toolkit/security/pii_scrubber.py +640 -0
- empathy_llm_toolkit/security/secrets_detector.py +678 -0
- empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
- empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
- empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
- empathy_llm_toolkit/session_status.py +20 -22
- empathy_llm_toolkit/state.py +28 -21
- empathy_llm_toolkit/wizards/__init__.py +38 -0
- empathy_llm_toolkit/wizards/base_wizard.py +364 -0
- empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
- empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
- empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
- empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
- empathy_os/__init__.py +125 -84
- empathy_os/adaptive/__init__.py +13 -0
- empathy_os/adaptive/task_complexity.py +127 -0
- empathy_os/{monitoring.py → agent_monitoring.py} +28 -28
- empathy_os/cache/__init__.py +117 -0
- empathy_os/cache/base.py +166 -0
- empathy_os/cache/dependency_manager.py +253 -0
- empathy_os/cache/hash_only.py +248 -0
- empathy_os/cache/hybrid.py +390 -0
- empathy_os/cache/storage.py +282 -0
- empathy_os/cli.py +1516 -70
- empathy_os/cli_unified.py +597 -0
- empathy_os/config/__init__.py +63 -0
- empathy_os/config/xml_config.py +239 -0
- empathy_os/config.py +95 -37
- empathy_os/coordination.py +72 -68
- empathy_os/core.py +94 -107
- empathy_os/cost_tracker.py +74 -55
- empathy_os/dashboard/__init__.py +15 -0
- empathy_os/dashboard/server.py +743 -0
- empathy_os/discovery.py +17 -14
- empathy_os/emergence.py +21 -22
- empathy_os/exceptions.py +18 -30
- empathy_os/feedback_loops.py +30 -33
- empathy_os/levels.py +32 -35
- empathy_os/leverage_points.py +31 -32
- empathy_os/logging_config.py +19 -16
- empathy_os/memory/__init__.py +195 -0
- empathy_os/memory/claude_memory.py +466 -0
- empathy_os/memory/config.py +224 -0
- empathy_os/memory/control_panel.py +1298 -0
- empathy_os/memory/edges.py +179 -0
- empathy_os/memory/graph.py +567 -0
- empathy_os/memory/long_term.py +1194 -0
- empathy_os/memory/nodes.py +179 -0
- empathy_os/memory/redis_bootstrap.py +540 -0
- empathy_os/memory/security/__init__.py +31 -0
- empathy_os/memory/security/audit_logger.py +930 -0
- empathy_os/memory/security/pii_scrubber.py +640 -0
- empathy_os/memory/security/secrets_detector.py +678 -0
- empathy_os/memory/short_term.py +2119 -0
- empathy_os/memory/storage/__init__.py +15 -0
- empathy_os/memory/summary_index.py +583 -0
- empathy_os/memory/unified.py +619 -0
- empathy_os/metrics/__init__.py +12 -0
- empathy_os/metrics/prompt_metrics.py +190 -0
- empathy_os/models/__init__.py +136 -0
- empathy_os/models/__main__.py +13 -0
- empathy_os/models/cli.py +655 -0
- empathy_os/models/empathy_executor.py +354 -0
- empathy_os/models/executor.py +252 -0
- empathy_os/models/fallback.py +671 -0
- empathy_os/models/provider_config.py +563 -0
- empathy_os/models/registry.py +382 -0
- empathy_os/models/tasks.py +302 -0
- empathy_os/models/telemetry.py +548 -0
- empathy_os/models/token_estimator.py +378 -0
- empathy_os/models/validation.py +274 -0
- empathy_os/monitoring/__init__.py +52 -0
- empathy_os/monitoring/alerts.py +23 -0
- empathy_os/monitoring/alerts_cli.py +268 -0
- empathy_os/monitoring/multi_backend.py +271 -0
- empathy_os/monitoring/otel_backend.py +363 -0
- empathy_os/optimization/__init__.py +19 -0
- empathy_os/optimization/context_optimizer.py +272 -0
- empathy_os/pattern_library.py +30 -29
- empathy_os/persistence.py +35 -37
- empathy_os/platform_utils.py +261 -0
- empathy_os/plugins/__init__.py +28 -0
- empathy_os/plugins/base.py +361 -0
- empathy_os/plugins/registry.py +268 -0
- empathy_os/project_index/__init__.py +30 -0
- empathy_os/project_index/cli.py +335 -0
- empathy_os/project_index/crew_integration.py +430 -0
- empathy_os/project_index/index.py +425 -0
- empathy_os/project_index/models.py +501 -0
- empathy_os/project_index/reports.py +473 -0
- empathy_os/project_index/scanner.py +538 -0
- empathy_os/prompts/__init__.py +61 -0
- empathy_os/prompts/config.py +77 -0
- empathy_os/prompts/context.py +177 -0
- empathy_os/prompts/parser.py +285 -0
- empathy_os/prompts/registry.py +313 -0
- empathy_os/prompts/templates.py +208 -0
- empathy_os/redis_config.py +144 -58
- empathy_os/redis_memory.py +79 -77
- empathy_os/resilience/__init__.py +56 -0
- empathy_os/resilience/circuit_breaker.py +256 -0
- empathy_os/resilience/fallback.py +179 -0
- empathy_os/resilience/health.py +300 -0
- empathy_os/resilience/retry.py +209 -0
- empathy_os/resilience/timeout.py +135 -0
- empathy_os/routing/__init__.py +43 -0
- empathy_os/routing/chain_executor.py +433 -0
- empathy_os/routing/classifier.py +217 -0
- empathy_os/routing/smart_router.py +234 -0
- empathy_os/routing/wizard_registry.py +307 -0
- empathy_os/templates.py +19 -14
- empathy_os/trust/__init__.py +28 -0
- empathy_os/trust/circuit_breaker.py +579 -0
- empathy_os/trust_building.py +67 -58
- empathy_os/validation/__init__.py +19 -0
- empathy_os/validation/xml_validator.py +281 -0
- empathy_os/wizard_factory_cli.py +170 -0
- empathy_os/{workflows.py → workflow_commands.py} +131 -37
- empathy_os/workflows/__init__.py +360 -0
- empathy_os/workflows/base.py +1660 -0
- empathy_os/workflows/bug_predict.py +962 -0
- empathy_os/workflows/code_review.py +960 -0
- empathy_os/workflows/code_review_adapters.py +310 -0
- empathy_os/workflows/code_review_pipeline.py +720 -0
- empathy_os/workflows/config.py +600 -0
- empathy_os/workflows/dependency_check.py +648 -0
- empathy_os/workflows/document_gen.py +1069 -0
- empathy_os/workflows/documentation_orchestrator.py +1205 -0
- empathy_os/workflows/health_check.py +679 -0
- empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
- empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
- empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
- empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
- empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
- empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
- empathy_os/workflows/manage_documentation.py +804 -0
- empathy_os/workflows/new_sample_workflow1.py +146 -0
- empathy_os/workflows/new_sample_workflow1_README.md +150 -0
- empathy_os/workflows/perf_audit.py +687 -0
- empathy_os/workflows/pr_review.py +748 -0
- empathy_os/workflows/progress.py +445 -0
- empathy_os/workflows/progress_server.py +322 -0
- empathy_os/workflows/refactor_plan.py +693 -0
- empathy_os/workflows/release_prep.py +808 -0
- empathy_os/workflows/research_synthesis.py +404 -0
- empathy_os/workflows/secure_release.py +585 -0
- empathy_os/workflows/security_adapters.py +297 -0
- empathy_os/workflows/security_audit.py +1046 -0
- empathy_os/workflows/step_config.py +234 -0
- empathy_os/workflows/test5.py +125 -0
- empathy_os/workflows/test5_README.md +158 -0
- empathy_os/workflows/test_gen.py +1855 -0
- empathy_os/workflows/test_lifecycle.py +526 -0
- empathy_os/workflows/test_maintenance.py +626 -0
- empathy_os/workflows/test_maintenance_cli.py +590 -0
- empathy_os/workflows/test_maintenance_crew.py +821 -0
- empathy_os/workflows/xml_enhanced_crew.py +285 -0
- empathy_software_plugin/__init__.py +1 -2
- empathy_software_plugin/cli/__init__.py +120 -0
- empathy_software_plugin/cli/inspect.py +362 -0
- empathy_software_plugin/cli.py +49 -27
- empathy_software_plugin/plugin.py +4 -8
- empathy_software_plugin/wizards/__init__.py +42 -0
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
- empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
- empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
- empathy_software_plugin/wizards/base_wizard.py +288 -0
- empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
- empathy_software_plugin/wizards/code_review_wizard.py +606 -0
- empathy_software_plugin/wizards/debugging/__init__.py +50 -0
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
- empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
- empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
- empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
- empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
- empathy_software_plugin/wizards/debugging/verification.py +369 -0
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
- empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
- empathy_software_plugin/wizards/performance/__init__.py +9 -0
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
- empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
- empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
- empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
- empathy_software_plugin/wizards/security/__init__.py +32 -0
- empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
- empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
- empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
- empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
- empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
- empathy_software_plugin/wizards/testing/__init__.py +27 -0
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
- empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
- empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
- empathy_software_plugin/wizards/testing_wizard.py +274 -0
- hot_reload/README.md +473 -0
- hot_reload/__init__.py +62 -0
- hot_reload/config.py +84 -0
- hot_reload/integration.py +228 -0
- hot_reload/reloader.py +298 -0
- hot_reload/watcher.py +179 -0
- hot_reload/websocket.py +176 -0
- scaffolding/README.md +589 -0
- scaffolding/__init__.py +35 -0
- scaffolding/__main__.py +14 -0
- scaffolding/cli.py +240 -0
- test_generator/__init__.py +38 -0
- test_generator/__main__.py +14 -0
- test_generator/cli.py +226 -0
- test_generator/generator.py +325 -0
- test_generator/risk_analyzer.py +216 -0
- workflow_patterns/__init__.py +33 -0
- workflow_patterns/behavior.py +249 -0
- workflow_patterns/core.py +76 -0
- workflow_patterns/output.py +99 -0
- workflow_patterns/registry.py +255 -0
- workflow_patterns/structural.py +288 -0
- workflow_scaffolding/__init__.py +11 -0
- workflow_scaffolding/__main__.py +12 -0
- workflow_scaffolding/cli.py +206 -0
- workflow_scaffolding/generator.py +265 -0
- agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
- agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
- agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
- agents/compliance_anticipation_agent.py +0 -1427
- agents/epic_integration_wizard.py +0 -541
- agents/trust_building_behaviors.py +0 -891
- empathy_framework-2.4.0.dist-info/METADATA +0 -485
- empathy_framework-2.4.0.dist-info/RECORD +0 -102
- empathy_framework-2.4.0.dist-info/entry_points.txt +0 -6
- empathy_llm_toolkit/htmlcov/status.json +0 -1
- empathy_llm_toolkit/security/htmlcov/status.json +0 -1
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/WHEEL +0 -0
- {empathy_framework-2.4.0.dist-info → empathy_framework-3.8.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
"""AutoGen Adapter
|
|
2
|
+
|
|
3
|
+
Creates conversational multi-agent systems using Microsoft's AutoGen.
|
|
4
|
+
Best for agent teams that converse to solve problems.
|
|
5
|
+
|
|
6
|
+
Requires: pip install pyautogen
|
|
7
|
+
|
|
8
|
+
Copyright 2025 Smart-AI-Memory
|
|
9
|
+
Licensed under Fair Source License 0.9
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import asyncio
|
|
13
|
+
import os
|
|
14
|
+
from collections.abc import Callable
|
|
15
|
+
|
|
16
|
+
from empathy_llm_toolkit.agent_factory.base import (
|
|
17
|
+
AgentConfig,
|
|
18
|
+
AgentRole,
|
|
19
|
+
BaseAdapter,
|
|
20
|
+
BaseAgent,
|
|
21
|
+
BaseWorkflow,
|
|
22
|
+
WorkflowConfig,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
# Lazy import
|
|
26
|
+
_autogen_available = None
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _check_autogen():
|
|
30
|
+
"""Check if AutoGen is available."""
|
|
31
|
+
global _autogen_available
|
|
32
|
+
if _autogen_available is None:
|
|
33
|
+
try:
|
|
34
|
+
import autogen # noqa: F401
|
|
35
|
+
|
|
36
|
+
_autogen_available = True
|
|
37
|
+
except ImportError:
|
|
38
|
+
_autogen_available = False
|
|
39
|
+
return _autogen_available
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class AutoGenAgent(BaseAgent):
|
|
43
|
+
"""Agent wrapping an AutoGen AssistantAgent or UserProxyAgent."""
|
|
44
|
+
|
|
45
|
+
def __init__(self, config: AgentConfig, autogen_agent=None):
|
|
46
|
+
super().__init__(config)
|
|
47
|
+
self._autogen_agent = autogen_agent
|
|
48
|
+
self._last_response = None
|
|
49
|
+
|
|
50
|
+
async def invoke(self, input_data: str | dict, context: dict | None = None) -> dict:
|
|
51
|
+
"""Invoke the AutoGen agent."""
|
|
52
|
+
if not self._autogen_agent:
|
|
53
|
+
return {"output": "No AutoGen agent configured", "metadata": {}}
|
|
54
|
+
|
|
55
|
+
# Format message
|
|
56
|
+
if isinstance(input_data, str):
|
|
57
|
+
message = input_data
|
|
58
|
+
else:
|
|
59
|
+
message = input_data.get("input", input_data.get("message", str(input_data)))
|
|
60
|
+
|
|
61
|
+
try:
|
|
62
|
+
# AutoGen uses synchronous chat, wrap in executor
|
|
63
|
+
loop = asyncio.get_event_loop()
|
|
64
|
+
|
|
65
|
+
def sync_chat():
|
|
66
|
+
# For single agent invocation, we use generate_reply
|
|
67
|
+
if hasattr(self._autogen_agent, "generate_reply"):
|
|
68
|
+
messages = [{"role": "user", "content": message}]
|
|
69
|
+
reply = self._autogen_agent.generate_reply(messages=messages)
|
|
70
|
+
return reply
|
|
71
|
+
return f"[{self.name}] Received: {message}"
|
|
72
|
+
|
|
73
|
+
reply = await loop.run_in_executor(None, sync_chat)
|
|
74
|
+
|
|
75
|
+
output = reply if isinstance(reply, str) else str(reply)
|
|
76
|
+
|
|
77
|
+
self._conversation_history.append({"role": "user", "content": message})
|
|
78
|
+
self._conversation_history.append({"role": "assistant", "content": output})
|
|
79
|
+
|
|
80
|
+
return {"output": output, "metadata": {"framework": "autogen", "model": self.model}}
|
|
81
|
+
|
|
82
|
+
except Exception as e:
|
|
83
|
+
return {"output": f"Error: {e}", "metadata": {"error": str(e)}}
|
|
84
|
+
|
|
85
|
+
async def stream(self, input_data: str | dict, context: dict | None = None):
|
|
86
|
+
"""AutoGen doesn't support streaming natively."""
|
|
87
|
+
result = await self.invoke(input_data, context)
|
|
88
|
+
yield result
|
|
89
|
+
|
|
90
|
+
def get_autogen_agent(self):
|
|
91
|
+
"""Get the underlying AutoGen agent for direct use."""
|
|
92
|
+
return self._autogen_agent
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class AutoGenWorkflow(BaseWorkflow):
|
|
96
|
+
"""Workflow using AutoGen's GroupChat."""
|
|
97
|
+
|
|
98
|
+
def __init__(
|
|
99
|
+
self,
|
|
100
|
+
config: WorkflowConfig,
|
|
101
|
+
agents: list[BaseAgent],
|
|
102
|
+
group_chat=None,
|
|
103
|
+
manager=None,
|
|
104
|
+
):
|
|
105
|
+
super().__init__(config, agents)
|
|
106
|
+
self._group_chat = group_chat
|
|
107
|
+
self._manager = manager
|
|
108
|
+
|
|
109
|
+
async def run(self, input_data: str | dict, initial_state: dict | None = None) -> dict:
|
|
110
|
+
"""Run the AutoGen group chat."""
|
|
111
|
+
if not self._manager:
|
|
112
|
+
return await self._run_sequential(input_data)
|
|
113
|
+
|
|
114
|
+
# Format message
|
|
115
|
+
if isinstance(input_data, str):
|
|
116
|
+
message = input_data
|
|
117
|
+
else:
|
|
118
|
+
message = input_data.get("input", str(input_data))
|
|
119
|
+
|
|
120
|
+
try:
|
|
121
|
+
loop = asyncio.get_event_loop()
|
|
122
|
+
|
|
123
|
+
def sync_chat():
|
|
124
|
+
# Get first agent to initiate
|
|
125
|
+
first_agent = list(self.agents.values())[0]
|
|
126
|
+
ag_agent = (
|
|
127
|
+
first_agent.get_autogen_agent()
|
|
128
|
+
if hasattr(first_agent, "get_autogen_agent")
|
|
129
|
+
else None
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
if ag_agent and self._manager:
|
|
133
|
+
# Initiate chat through manager
|
|
134
|
+
ag_agent.initiate_chat(self._manager, message=message)
|
|
135
|
+
# Get chat history from manager
|
|
136
|
+
return self._manager.chat_messages
|
|
137
|
+
|
|
138
|
+
return {"messages": []}
|
|
139
|
+
|
|
140
|
+
chat_history = await loop.run_in_executor(None, sync_chat)
|
|
141
|
+
|
|
142
|
+
# Extract final response
|
|
143
|
+
if chat_history:
|
|
144
|
+
messages = []
|
|
145
|
+
for _agent_name, msgs in (
|
|
146
|
+
chat_history.items() if isinstance(chat_history, dict) else []
|
|
147
|
+
):
|
|
148
|
+
messages.extend(msgs)
|
|
149
|
+
if messages:
|
|
150
|
+
output = messages[-1].get("content", "") if messages else ""
|
|
151
|
+
else:
|
|
152
|
+
output = "Chat completed"
|
|
153
|
+
else:
|
|
154
|
+
output = "No response"
|
|
155
|
+
|
|
156
|
+
return {
|
|
157
|
+
"output": output,
|
|
158
|
+
"state": {"chat_history": chat_history},
|
|
159
|
+
"metadata": {"framework": "autogen"},
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
except Exception as e:
|
|
163
|
+
return {"output": f"Error: {e}", "error": str(e)}
|
|
164
|
+
|
|
165
|
+
async def _run_sequential(self, input_data: str | dict) -> dict:
|
|
166
|
+
"""Fallback sequential execution."""
|
|
167
|
+
current = input_data
|
|
168
|
+
results = []
|
|
169
|
+
for agent in self.agents.values():
|
|
170
|
+
result = await agent.invoke(current)
|
|
171
|
+
results.append(result)
|
|
172
|
+
current = result.get("output", current)
|
|
173
|
+
return {"output": current if isinstance(current, str) else str(current), "results": results}
|
|
174
|
+
|
|
175
|
+
async def stream(self, input_data: str | dict, initial_state: dict | None = None):
|
|
176
|
+
"""AutoGen doesn't support streaming; yield final result."""
|
|
177
|
+
result = await self.run(input_data, initial_state)
|
|
178
|
+
yield result
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
class AutoGenAdapter(BaseAdapter):
|
|
182
|
+
"""Adapter for Microsoft AutoGen framework."""
|
|
183
|
+
|
|
184
|
+
def __init__(self, provider: str = "anthropic", api_key: str | None = None):
|
|
185
|
+
self.provider = provider
|
|
186
|
+
self.api_key = api_key or os.getenv(
|
|
187
|
+
"ANTHROPIC_API_KEY" if provider == "anthropic" else "OPENAI_API_KEY",
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
@property
|
|
191
|
+
def framework_name(self) -> str:
|
|
192
|
+
return "autogen"
|
|
193
|
+
|
|
194
|
+
def is_available(self) -> bool:
|
|
195
|
+
return bool(_check_autogen())
|
|
196
|
+
|
|
197
|
+
def _get_llm_config(self, config: AgentConfig) -> dict:
|
|
198
|
+
"""Build AutoGen LLM config."""
|
|
199
|
+
model_id = config.model_override or self.get_model_for_tier(
|
|
200
|
+
config.model_tier,
|
|
201
|
+
self.provider,
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
if self.provider == "anthropic":
|
|
205
|
+
return {
|
|
206
|
+
"config_list": [
|
|
207
|
+
{"model": model_id, "api_key": self.api_key, "api_type": "anthropic"},
|
|
208
|
+
],
|
|
209
|
+
"temperature": config.temperature,
|
|
210
|
+
"max_tokens": config.max_tokens,
|
|
211
|
+
}
|
|
212
|
+
# OpenAI (default for AutoGen)
|
|
213
|
+
return {
|
|
214
|
+
"config_list": [{"model": model_id, "api_key": self.api_key}],
|
|
215
|
+
"temperature": config.temperature,
|
|
216
|
+
"max_tokens": config.max_tokens,
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
def create_agent(self, config: AgentConfig) -> AutoGenAgent:
|
|
220
|
+
"""Create an AutoGen agent."""
|
|
221
|
+
if not self.is_available():
|
|
222
|
+
raise ImportError("AutoGen not installed. Run: pip install pyautogen")
|
|
223
|
+
|
|
224
|
+
import autogen
|
|
225
|
+
|
|
226
|
+
llm_config = self._get_llm_config(config)
|
|
227
|
+
system_message = config.system_prompt or self._default_system_message(config)
|
|
228
|
+
|
|
229
|
+
# Determine agent type based on role
|
|
230
|
+
if config.role == AgentRole.EXECUTOR:
|
|
231
|
+
# UserProxyAgent for code execution
|
|
232
|
+
ag_agent = autogen.UserProxyAgent(
|
|
233
|
+
name=config.name,
|
|
234
|
+
system_message=system_message,
|
|
235
|
+
human_input_mode="NEVER",
|
|
236
|
+
code_execution_config={"work_dir": "workspace", "use_docker": False},
|
|
237
|
+
)
|
|
238
|
+
else:
|
|
239
|
+
# AssistantAgent for general tasks
|
|
240
|
+
ag_agent = autogen.AssistantAgent(
|
|
241
|
+
name=config.name,
|
|
242
|
+
system_message=system_message,
|
|
243
|
+
llm_config=llm_config,
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
return AutoGenAgent(config, autogen_agent=ag_agent)
|
|
247
|
+
|
|
248
|
+
def create_workflow(self, config: WorkflowConfig, agents: list[BaseAgent]) -> AutoGenWorkflow:
|
|
249
|
+
"""Create an AutoGen GroupChat workflow."""
|
|
250
|
+
if not self.is_available():
|
|
251
|
+
raise ImportError("AutoGen not installed")
|
|
252
|
+
|
|
253
|
+
import autogen
|
|
254
|
+
|
|
255
|
+
# Extract underlying AutoGen agents
|
|
256
|
+
autogen_agents = []
|
|
257
|
+
for agent in agents:
|
|
258
|
+
if hasattr(agent, "get_autogen_agent"):
|
|
259
|
+
ag = agent.get_autogen_agent()
|
|
260
|
+
if ag:
|
|
261
|
+
autogen_agents.append(ag)
|
|
262
|
+
|
|
263
|
+
if not autogen_agents:
|
|
264
|
+
# Create default agents
|
|
265
|
+
return AutoGenWorkflow(config, agents)
|
|
266
|
+
|
|
267
|
+
# Create GroupChat
|
|
268
|
+
if config.mode == "conversation":
|
|
269
|
+
# Free-form conversation
|
|
270
|
+
group_chat = autogen.GroupChat(
|
|
271
|
+
agents=autogen_agents,
|
|
272
|
+
messages=[],
|
|
273
|
+
max_round=config.max_iterations,
|
|
274
|
+
)
|
|
275
|
+
else:
|
|
276
|
+
# Sequential (round-robin)
|
|
277
|
+
group_chat = autogen.GroupChat(
|
|
278
|
+
agents=autogen_agents,
|
|
279
|
+
messages=[],
|
|
280
|
+
max_round=config.max_iterations,
|
|
281
|
+
speaker_selection_method="round_robin",
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
# Create manager
|
|
285
|
+
llm_config = self._get_llm_config(AgentConfig(name="manager", model_tier="capable"))
|
|
286
|
+
manager = autogen.GroupChatManager(groupchat=group_chat, llm_config=llm_config)
|
|
287
|
+
|
|
288
|
+
return AutoGenWorkflow(config, agents, group_chat=group_chat, manager=manager)
|
|
289
|
+
|
|
290
|
+
def create_tool(
|
|
291
|
+
self,
|
|
292
|
+
name: str,
|
|
293
|
+
description: str,
|
|
294
|
+
func: Callable,
|
|
295
|
+
args_schema: dict | None = None,
|
|
296
|
+
) -> dict:
|
|
297
|
+
"""Create a function for AutoGen agents."""
|
|
298
|
+
# AutoGen uses function registration
|
|
299
|
+
return {"name": name, "description": description, "func": func, "args_schema": args_schema}
|
|
300
|
+
|
|
301
|
+
def _default_system_message(self, config: AgentConfig) -> str:
|
|
302
|
+
"""Generate default system message."""
|
|
303
|
+
role_messages = {
|
|
304
|
+
AgentRole.COORDINATOR: "You coordinate a team of agents to solve complex problems.",
|
|
305
|
+
AgentRole.RESEARCHER: "You research and gather information thoroughly.",
|
|
306
|
+
AgentRole.WRITER: "You write clear, well-structured content.",
|
|
307
|
+
AgentRole.REVIEWER: "You review work and provide constructive feedback.",
|
|
308
|
+
AgentRole.EXECUTOR: "You execute code and commands when needed.",
|
|
309
|
+
AgentRole.DEBUGGER: "You find and fix bugs in code.",
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
return role_messages.get(config.role, f"You are a helpful {config.role.value} agent.")
|