aiecs 1.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aiecs/__init__.py +72 -0
- aiecs/__main__.py +41 -0
- aiecs/aiecs_client.py +469 -0
- aiecs/application/__init__.py +10 -0
- aiecs/application/executors/__init__.py +10 -0
- aiecs/application/executors/operation_executor.py +363 -0
- aiecs/application/knowledge_graph/__init__.py +7 -0
- aiecs/application/knowledge_graph/builder/__init__.py +37 -0
- aiecs/application/knowledge_graph/builder/document_builder.py +375 -0
- aiecs/application/knowledge_graph/builder/graph_builder.py +356 -0
- aiecs/application/knowledge_graph/builder/schema_mapping.py +531 -0
- aiecs/application/knowledge_graph/builder/structured_pipeline.py +443 -0
- aiecs/application/knowledge_graph/builder/text_chunker.py +319 -0
- aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
- aiecs/application/knowledge_graph/extractors/base.py +100 -0
- aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +327 -0
- aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +349 -0
- aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +244 -0
- aiecs/application/knowledge_graph/fusion/__init__.py +23 -0
- aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +387 -0
- aiecs/application/knowledge_graph/fusion/entity_linker.py +343 -0
- aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +580 -0
- aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +189 -0
- aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
- aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +344 -0
- aiecs/application/knowledge_graph/pattern_matching/query_executor.py +378 -0
- aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
- aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +199 -0
- aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
- aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
- aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +347 -0
- aiecs/application/knowledge_graph/reasoning/inference_engine.py +504 -0
- aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +167 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +630 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +654 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +477 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +390 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +217 -0
- aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +169 -0
- aiecs/application/knowledge_graph/reasoning/query_planner.py +872 -0
- aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +554 -0
- aiecs/application/knowledge_graph/retrieval/__init__.py +19 -0
- aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +596 -0
- aiecs/application/knowledge_graph/search/__init__.py +59 -0
- aiecs/application/knowledge_graph/search/hybrid_search.py +423 -0
- aiecs/application/knowledge_graph/search/reranker.py +295 -0
- aiecs/application/knowledge_graph/search/reranker_strategies.py +553 -0
- aiecs/application/knowledge_graph/search/text_similarity.py +398 -0
- aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
- aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +329 -0
- aiecs/application/knowledge_graph/traversal/path_scorer.py +269 -0
- aiecs/application/knowledge_graph/validators/__init__.py +13 -0
- aiecs/application/knowledge_graph/validators/relation_validator.py +189 -0
- aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
- aiecs/application/knowledge_graph/visualization/graph_visualizer.py +321 -0
- aiecs/common/__init__.py +9 -0
- aiecs/common/knowledge_graph/__init__.py +17 -0
- aiecs/common/knowledge_graph/runnable.py +484 -0
- aiecs/config/__init__.py +16 -0
- aiecs/config/config.py +498 -0
- aiecs/config/graph_config.py +137 -0
- aiecs/config/registry.py +23 -0
- aiecs/core/__init__.py +46 -0
- aiecs/core/interface/__init__.py +34 -0
- aiecs/core/interface/execution_interface.py +152 -0
- aiecs/core/interface/storage_interface.py +171 -0
- aiecs/domain/__init__.py +289 -0
- aiecs/domain/agent/__init__.py +189 -0
- aiecs/domain/agent/base_agent.py +697 -0
- aiecs/domain/agent/exceptions.py +103 -0
- aiecs/domain/agent/graph_aware_mixin.py +559 -0
- aiecs/domain/agent/hybrid_agent.py +490 -0
- aiecs/domain/agent/integration/__init__.py +26 -0
- aiecs/domain/agent/integration/context_compressor.py +222 -0
- aiecs/domain/agent/integration/context_engine_adapter.py +252 -0
- aiecs/domain/agent/integration/retry_policy.py +219 -0
- aiecs/domain/agent/integration/role_config.py +213 -0
- aiecs/domain/agent/knowledge_aware_agent.py +646 -0
- aiecs/domain/agent/lifecycle.py +296 -0
- aiecs/domain/agent/llm_agent.py +300 -0
- aiecs/domain/agent/memory/__init__.py +12 -0
- aiecs/domain/agent/memory/conversation.py +197 -0
- aiecs/domain/agent/migration/__init__.py +14 -0
- aiecs/domain/agent/migration/conversion.py +160 -0
- aiecs/domain/agent/migration/legacy_wrapper.py +90 -0
- aiecs/domain/agent/models.py +317 -0
- aiecs/domain/agent/observability.py +407 -0
- aiecs/domain/agent/persistence.py +289 -0
- aiecs/domain/agent/prompts/__init__.py +29 -0
- aiecs/domain/agent/prompts/builder.py +161 -0
- aiecs/domain/agent/prompts/formatters.py +189 -0
- aiecs/domain/agent/prompts/template.py +255 -0
- aiecs/domain/agent/registry.py +260 -0
- aiecs/domain/agent/tool_agent.py +257 -0
- aiecs/domain/agent/tools/__init__.py +12 -0
- aiecs/domain/agent/tools/schema_generator.py +221 -0
- aiecs/domain/community/__init__.py +155 -0
- aiecs/domain/community/agent_adapter.py +477 -0
- aiecs/domain/community/analytics.py +481 -0
- aiecs/domain/community/collaborative_workflow.py +642 -0
- aiecs/domain/community/communication_hub.py +645 -0
- aiecs/domain/community/community_builder.py +320 -0
- aiecs/domain/community/community_integration.py +800 -0
- aiecs/domain/community/community_manager.py +813 -0
- aiecs/domain/community/decision_engine.py +879 -0
- aiecs/domain/community/exceptions.py +225 -0
- aiecs/domain/community/models/__init__.py +33 -0
- aiecs/domain/community/models/community_models.py +268 -0
- aiecs/domain/community/resource_manager.py +457 -0
- aiecs/domain/community/shared_context_manager.py +603 -0
- aiecs/domain/context/__init__.py +58 -0
- aiecs/domain/context/context_engine.py +989 -0
- aiecs/domain/context/conversation_models.py +354 -0
- aiecs/domain/context/graph_memory.py +467 -0
- aiecs/domain/execution/__init__.py +12 -0
- aiecs/domain/execution/model.py +57 -0
- aiecs/domain/knowledge_graph/__init__.py +19 -0
- aiecs/domain/knowledge_graph/models/__init__.py +52 -0
- aiecs/domain/knowledge_graph/models/entity.py +130 -0
- aiecs/domain/knowledge_graph/models/evidence.py +194 -0
- aiecs/domain/knowledge_graph/models/inference_rule.py +186 -0
- aiecs/domain/knowledge_graph/models/path.py +179 -0
- aiecs/domain/knowledge_graph/models/path_pattern.py +173 -0
- aiecs/domain/knowledge_graph/models/query.py +272 -0
- aiecs/domain/knowledge_graph/models/query_plan.py +187 -0
- aiecs/domain/knowledge_graph/models/relation.py +136 -0
- aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
- aiecs/domain/knowledge_graph/schema/entity_type.py +135 -0
- aiecs/domain/knowledge_graph/schema/graph_schema.py +271 -0
- aiecs/domain/knowledge_graph/schema/property_schema.py +155 -0
- aiecs/domain/knowledge_graph/schema/relation_type.py +171 -0
- aiecs/domain/knowledge_graph/schema/schema_manager.py +496 -0
- aiecs/domain/knowledge_graph/schema/type_enums.py +205 -0
- aiecs/domain/task/__init__.py +13 -0
- aiecs/domain/task/dsl_processor.py +613 -0
- aiecs/domain/task/model.py +62 -0
- aiecs/domain/task/task_context.py +268 -0
- aiecs/infrastructure/__init__.py +24 -0
- aiecs/infrastructure/graph_storage/__init__.py +11 -0
- aiecs/infrastructure/graph_storage/base.py +601 -0
- aiecs/infrastructure/graph_storage/batch_operations.py +449 -0
- aiecs/infrastructure/graph_storage/cache.py +429 -0
- aiecs/infrastructure/graph_storage/distributed.py +226 -0
- aiecs/infrastructure/graph_storage/error_handling.py +390 -0
- aiecs/infrastructure/graph_storage/graceful_degradation.py +306 -0
- aiecs/infrastructure/graph_storage/health_checks.py +378 -0
- aiecs/infrastructure/graph_storage/in_memory.py +514 -0
- aiecs/infrastructure/graph_storage/index_optimization.py +483 -0
- aiecs/infrastructure/graph_storage/lazy_loading.py +410 -0
- aiecs/infrastructure/graph_storage/metrics.py +357 -0
- aiecs/infrastructure/graph_storage/migration.py +413 -0
- aiecs/infrastructure/graph_storage/pagination.py +471 -0
- aiecs/infrastructure/graph_storage/performance_monitoring.py +466 -0
- aiecs/infrastructure/graph_storage/postgres.py +871 -0
- aiecs/infrastructure/graph_storage/query_optimizer.py +635 -0
- aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
- aiecs/infrastructure/graph_storage/sqlite.py +623 -0
- aiecs/infrastructure/graph_storage/streaming.py +495 -0
- aiecs/infrastructure/messaging/__init__.py +13 -0
- aiecs/infrastructure/messaging/celery_task_manager.py +383 -0
- aiecs/infrastructure/messaging/websocket_manager.py +298 -0
- aiecs/infrastructure/monitoring/__init__.py +34 -0
- aiecs/infrastructure/monitoring/executor_metrics.py +174 -0
- aiecs/infrastructure/monitoring/global_metrics_manager.py +213 -0
- aiecs/infrastructure/monitoring/structured_logger.py +48 -0
- aiecs/infrastructure/monitoring/tracing_manager.py +410 -0
- aiecs/infrastructure/persistence/__init__.py +24 -0
- aiecs/infrastructure/persistence/context_engine_client.py +187 -0
- aiecs/infrastructure/persistence/database_manager.py +333 -0
- aiecs/infrastructure/persistence/file_storage.py +754 -0
- aiecs/infrastructure/persistence/redis_client.py +220 -0
- aiecs/llm/__init__.py +86 -0
- aiecs/llm/callbacks/__init__.py +11 -0
- aiecs/llm/callbacks/custom_callbacks.py +264 -0
- aiecs/llm/client_factory.py +420 -0
- aiecs/llm/clients/__init__.py +33 -0
- aiecs/llm/clients/base_client.py +193 -0
- aiecs/llm/clients/googleai_client.py +181 -0
- aiecs/llm/clients/openai_client.py +131 -0
- aiecs/llm/clients/vertex_client.py +437 -0
- aiecs/llm/clients/xai_client.py +184 -0
- aiecs/llm/config/__init__.py +51 -0
- aiecs/llm/config/config_loader.py +275 -0
- aiecs/llm/config/config_validator.py +236 -0
- aiecs/llm/config/model_config.py +151 -0
- aiecs/llm/utils/__init__.py +10 -0
- aiecs/llm/utils/validate_config.py +91 -0
- aiecs/main.py +363 -0
- aiecs/scripts/__init__.py +3 -0
- aiecs/scripts/aid/VERSION_MANAGEMENT.md +97 -0
- aiecs/scripts/aid/__init__.py +19 -0
- aiecs/scripts/aid/version_manager.py +215 -0
- aiecs/scripts/dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md +242 -0
- aiecs/scripts/dependance_check/README_DEPENDENCY_CHECKER.md +310 -0
- aiecs/scripts/dependance_check/__init__.py +17 -0
- aiecs/scripts/dependance_check/dependency_checker.py +938 -0
- aiecs/scripts/dependance_check/dependency_fixer.py +391 -0
- aiecs/scripts/dependance_check/download_nlp_data.py +396 -0
- aiecs/scripts/dependance_check/quick_dependency_check.py +270 -0
- aiecs/scripts/dependance_check/setup_nlp_data.sh +217 -0
- aiecs/scripts/dependance_patch/__init__.py +7 -0
- aiecs/scripts/dependance_patch/fix_weasel/README_WEASEL_PATCH.md +126 -0
- aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
- aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.py +128 -0
- aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.sh +82 -0
- aiecs/scripts/dependance_patch/fix_weasel/patch_weasel_library.sh +188 -0
- aiecs/scripts/dependance_patch/fix_weasel/run_weasel_patch.sh +41 -0
- aiecs/scripts/tools_develop/README.md +449 -0
- aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
- aiecs/scripts/tools_develop/__init__.py +21 -0
- aiecs/scripts/tools_develop/check_type_annotations.py +259 -0
- aiecs/scripts/tools_develop/validate_tool_schemas.py +422 -0
- aiecs/scripts/tools_develop/verify_tools.py +356 -0
- aiecs/tasks/__init__.py +1 -0
- aiecs/tasks/worker.py +172 -0
- aiecs/tools/__init__.py +299 -0
- aiecs/tools/apisource/__init__.py +99 -0
- aiecs/tools/apisource/intelligence/__init__.py +19 -0
- aiecs/tools/apisource/intelligence/data_fusion.py +381 -0
- aiecs/tools/apisource/intelligence/query_analyzer.py +413 -0
- aiecs/tools/apisource/intelligence/search_enhancer.py +388 -0
- aiecs/tools/apisource/monitoring/__init__.py +9 -0
- aiecs/tools/apisource/monitoring/metrics.py +303 -0
- aiecs/tools/apisource/providers/__init__.py +115 -0
- aiecs/tools/apisource/providers/base.py +664 -0
- aiecs/tools/apisource/providers/census.py +401 -0
- aiecs/tools/apisource/providers/fred.py +564 -0
- aiecs/tools/apisource/providers/newsapi.py +412 -0
- aiecs/tools/apisource/providers/worldbank.py +357 -0
- aiecs/tools/apisource/reliability/__init__.py +12 -0
- aiecs/tools/apisource/reliability/error_handler.py +375 -0
- aiecs/tools/apisource/reliability/fallback_strategy.py +391 -0
- aiecs/tools/apisource/tool.py +850 -0
- aiecs/tools/apisource/utils/__init__.py +9 -0
- aiecs/tools/apisource/utils/validators.py +338 -0
- aiecs/tools/base_tool.py +201 -0
- aiecs/tools/docs/__init__.py +121 -0
- aiecs/tools/docs/ai_document_orchestrator.py +599 -0
- aiecs/tools/docs/ai_document_writer_orchestrator.py +2403 -0
- aiecs/tools/docs/content_insertion_tool.py +1333 -0
- aiecs/tools/docs/document_creator_tool.py +1317 -0
- aiecs/tools/docs/document_layout_tool.py +1166 -0
- aiecs/tools/docs/document_parser_tool.py +994 -0
- aiecs/tools/docs/document_writer_tool.py +1818 -0
- aiecs/tools/knowledge_graph/__init__.py +17 -0
- aiecs/tools/knowledge_graph/graph_reasoning_tool.py +734 -0
- aiecs/tools/knowledge_graph/graph_search_tool.py +923 -0
- aiecs/tools/knowledge_graph/kg_builder_tool.py +476 -0
- aiecs/tools/langchain_adapter.py +542 -0
- aiecs/tools/schema_generator.py +275 -0
- aiecs/tools/search_tool/__init__.py +100 -0
- aiecs/tools/search_tool/analyzers.py +589 -0
- aiecs/tools/search_tool/cache.py +260 -0
- aiecs/tools/search_tool/constants.py +128 -0
- aiecs/tools/search_tool/context.py +216 -0
- aiecs/tools/search_tool/core.py +749 -0
- aiecs/tools/search_tool/deduplicator.py +123 -0
- aiecs/tools/search_tool/error_handler.py +271 -0
- aiecs/tools/search_tool/metrics.py +371 -0
- aiecs/tools/search_tool/rate_limiter.py +178 -0
- aiecs/tools/search_tool/schemas.py +277 -0
- aiecs/tools/statistics/__init__.py +80 -0
- aiecs/tools/statistics/ai_data_analysis_orchestrator.py +643 -0
- aiecs/tools/statistics/ai_insight_generator_tool.py +505 -0
- aiecs/tools/statistics/ai_report_orchestrator_tool.py +694 -0
- aiecs/tools/statistics/data_loader_tool.py +564 -0
- aiecs/tools/statistics/data_profiler_tool.py +658 -0
- aiecs/tools/statistics/data_transformer_tool.py +573 -0
- aiecs/tools/statistics/data_visualizer_tool.py +495 -0
- aiecs/tools/statistics/model_trainer_tool.py +487 -0
- aiecs/tools/statistics/statistical_analyzer_tool.py +459 -0
- aiecs/tools/task_tools/__init__.py +86 -0
- aiecs/tools/task_tools/chart_tool.py +732 -0
- aiecs/tools/task_tools/classfire_tool.py +922 -0
- aiecs/tools/task_tools/image_tool.py +447 -0
- aiecs/tools/task_tools/office_tool.py +684 -0
- aiecs/tools/task_tools/pandas_tool.py +635 -0
- aiecs/tools/task_tools/report_tool.py +635 -0
- aiecs/tools/task_tools/research_tool.py +392 -0
- aiecs/tools/task_tools/scraper_tool.py +715 -0
- aiecs/tools/task_tools/stats_tool.py +688 -0
- aiecs/tools/temp_file_manager.py +130 -0
- aiecs/tools/tool_executor/__init__.py +37 -0
- aiecs/tools/tool_executor/tool_executor.py +881 -0
- aiecs/utils/LLM_output_structor.py +445 -0
- aiecs/utils/__init__.py +34 -0
- aiecs/utils/base_callback.py +47 -0
- aiecs/utils/cache_provider.py +695 -0
- aiecs/utils/execution_utils.py +184 -0
- aiecs/utils/logging.py +1 -0
- aiecs/utils/prompt_loader.py +14 -0
- aiecs/utils/token_usage_repository.py +323 -0
- aiecs/ws/__init__.py +0 -0
- aiecs/ws/socket_server.py +52 -0
- aiecs-1.5.1.dist-info/METADATA +608 -0
- aiecs-1.5.1.dist-info/RECORD +302 -0
- aiecs-1.5.1.dist-info/WHEEL +5 -0
- aiecs-1.5.1.dist-info/entry_points.txt +10 -0
- aiecs-1.5.1.dist-info/licenses/LICENSE +225 -0
- aiecs-1.5.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Agent Adapter System
|
|
3
|
+
|
|
4
|
+
Provides an adapter architecture for integrating custom agents and LLM clients
|
|
5
|
+
into the community system. Supports heterogeneous agent types and extensibility.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import asyncio
|
|
9
|
+
import logging
|
|
10
|
+
from abc import ABC, abstractmethod
|
|
11
|
+
from typing import Dict, List, Any, Optional, Type
|
|
12
|
+
from enum import Enum
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class AgentCapability(str, Enum):
|
|
18
|
+
"""Standard agent capabilities."""
|
|
19
|
+
|
|
20
|
+
TEXT_GENERATION = "text_generation"
|
|
21
|
+
CODE_GENERATION = "code_generation"
|
|
22
|
+
DATA_ANALYSIS = "data_analysis"
|
|
23
|
+
DECISION_MAKING = "decision_making"
|
|
24
|
+
KNOWLEDGE_RETRIEVAL = "knowledge_retrieval"
|
|
25
|
+
TASK_PLANNING = "task_planning"
|
|
26
|
+
IMAGE_PROCESSING = "image_processing"
|
|
27
|
+
AUDIO_PROCESSING = "audio_processing"
|
|
28
|
+
MULTIMODAL = "multimodal"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class AgentAdapter(ABC):
|
|
32
|
+
"""
|
|
33
|
+
Abstract base class for agent adapters.
|
|
34
|
+
|
|
35
|
+
Implement this class to integrate custom agent types or LLM clients
|
|
36
|
+
into the community system.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def __init__(self, agent_id: str, config: Optional[Dict[str, Any]] = None):
|
|
40
|
+
"""
|
|
41
|
+
Initialize the agent adapter.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
agent_id: Unique identifier for the agent
|
|
45
|
+
config: Optional configuration for the agent
|
|
46
|
+
"""
|
|
47
|
+
self.agent_id = agent_id
|
|
48
|
+
self.config = config or {}
|
|
49
|
+
self.capabilities: List[AgentCapability] = []
|
|
50
|
+
self.metadata: Dict[str, Any] = {}
|
|
51
|
+
self._initialized = False
|
|
52
|
+
|
|
53
|
+
@abstractmethod
|
|
54
|
+
async def initialize(self) -> bool:
|
|
55
|
+
"""
|
|
56
|
+
Initialize the agent adapter.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
True if initialization was successful
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
@abstractmethod
|
|
63
|
+
async def execute(
|
|
64
|
+
self, task: str, context: Optional[Dict[str, Any]] = None, **kwargs
|
|
65
|
+
) -> Dict[str, Any]:
|
|
66
|
+
"""
|
|
67
|
+
Execute a task with the agent.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
task: Task description or instruction
|
|
71
|
+
context: Optional context for the task
|
|
72
|
+
**kwargs: Additional parameters
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
Execution result with status and output
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
@abstractmethod
|
|
79
|
+
async def communicate(
|
|
80
|
+
self,
|
|
81
|
+
message: str,
|
|
82
|
+
recipient_id: Optional[str] = None,
|
|
83
|
+
message_type: str = "request",
|
|
84
|
+
**kwargs,
|
|
85
|
+
) -> Dict[str, Any]:
|
|
86
|
+
"""
|
|
87
|
+
Send a message to another agent or broadcast.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
message: Message content
|
|
91
|
+
recipient_id: Optional recipient agent ID (None = broadcast)
|
|
92
|
+
message_type: Type of message (request, response, notification, share)
|
|
93
|
+
**kwargs: Additional message parameters
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
Message delivery status and response
|
|
97
|
+
"""
|
|
98
|
+
|
|
99
|
+
@abstractmethod
|
|
100
|
+
async def get_capabilities(self) -> List[AgentCapability]:
|
|
101
|
+
"""
|
|
102
|
+
Get the capabilities of this agent.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
List of agent capabilities
|
|
106
|
+
"""
|
|
107
|
+
|
|
108
|
+
@abstractmethod
|
|
109
|
+
async def health_check(self) -> Dict[str, Any]:
|
|
110
|
+
"""
|
|
111
|
+
Check the health status of the agent.
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
Health status information
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
async def shutdown(self) -> bool:
|
|
118
|
+
"""
|
|
119
|
+
Shutdown the agent adapter gracefully.
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
True if shutdown was successful
|
|
123
|
+
"""
|
|
124
|
+
self._initialized = False
|
|
125
|
+
logger.info(f"Agent adapter {self.agent_id} shutdown")
|
|
126
|
+
return True
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class StandardLLMAdapter(AgentAdapter):
|
|
130
|
+
"""
|
|
131
|
+
Adapter for standard LLM clients (OpenAI, Anthropic, etc.).
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
def __init__(
|
|
135
|
+
self,
|
|
136
|
+
agent_id: str,
|
|
137
|
+
llm_client: Any,
|
|
138
|
+
model_name: str,
|
|
139
|
+
config: Optional[Dict[str, Any]] = None,
|
|
140
|
+
):
|
|
141
|
+
"""
|
|
142
|
+
Initialize standard LLM adapter.
|
|
143
|
+
|
|
144
|
+
Args:
|
|
145
|
+
agent_id: Unique identifier for the agent
|
|
146
|
+
llm_client: The LLM client instance
|
|
147
|
+
model_name: Name of the model
|
|
148
|
+
config: Optional configuration
|
|
149
|
+
"""
|
|
150
|
+
super().__init__(agent_id, config)
|
|
151
|
+
self.llm_client = llm_client
|
|
152
|
+
self.model_name = model_name
|
|
153
|
+
self.capabilities = [
|
|
154
|
+
AgentCapability.TEXT_GENERATION,
|
|
155
|
+
AgentCapability.DECISION_MAKING,
|
|
156
|
+
AgentCapability.KNOWLEDGE_RETRIEVAL,
|
|
157
|
+
]
|
|
158
|
+
|
|
159
|
+
async def initialize(self) -> bool:
|
|
160
|
+
"""Initialize the LLM adapter."""
|
|
161
|
+
try:
|
|
162
|
+
# Test connection with simple prompt
|
|
163
|
+
if hasattr(self.llm_client, "health_check"):
|
|
164
|
+
await self.llm_client.health_check()
|
|
165
|
+
self._initialized = True
|
|
166
|
+
logger.info(f"Initialized LLM adapter for {self.model_name}")
|
|
167
|
+
return True
|
|
168
|
+
except Exception as e:
|
|
169
|
+
logger.error(f"Failed to initialize LLM adapter: {e}")
|
|
170
|
+
return False
|
|
171
|
+
|
|
172
|
+
async def execute(
|
|
173
|
+
self, task: str, context: Optional[Dict[str, Any]] = None, **kwargs
|
|
174
|
+
) -> Dict[str, Any]:
|
|
175
|
+
"""Execute a task with the LLM."""
|
|
176
|
+
if not self._initialized:
|
|
177
|
+
return {"status": "error", "error": "Adapter not initialized"}
|
|
178
|
+
|
|
179
|
+
try:
|
|
180
|
+
# Build prompt from task and context
|
|
181
|
+
prompt = self._build_prompt(task, context)
|
|
182
|
+
|
|
183
|
+
# Call LLM client
|
|
184
|
+
if hasattr(self.llm_client, "generate"):
|
|
185
|
+
response = await self.llm_client.generate(
|
|
186
|
+
prompt=prompt, model=self.model_name, **kwargs
|
|
187
|
+
)
|
|
188
|
+
elif hasattr(self.llm_client, "complete"):
|
|
189
|
+
response = await self.llm_client.complete(prompt, **kwargs)
|
|
190
|
+
else:
|
|
191
|
+
response = str(self.llm_client) # Fallback
|
|
192
|
+
|
|
193
|
+
return {
|
|
194
|
+
"status": "success",
|
|
195
|
+
"output": response,
|
|
196
|
+
"agent_id": self.agent_id,
|
|
197
|
+
"model": self.model_name,
|
|
198
|
+
}
|
|
199
|
+
except Exception as e:
|
|
200
|
+
logger.error(f"Error executing task with LLM: {e}")
|
|
201
|
+
return {"status": "error", "error": str(e)}
|
|
202
|
+
|
|
203
|
+
async def communicate(
|
|
204
|
+
self,
|
|
205
|
+
message: str,
|
|
206
|
+
recipient_id: Optional[str] = None,
|
|
207
|
+
message_type: str = "request",
|
|
208
|
+
**kwargs,
|
|
209
|
+
) -> Dict[str, Any]:
|
|
210
|
+
"""Send a message through the LLM."""
|
|
211
|
+
# LLMs typically don't directly communicate, but can format messages
|
|
212
|
+
formatted_message = {
|
|
213
|
+
"from": self.agent_id,
|
|
214
|
+
"to": recipient_id or "broadcast",
|
|
215
|
+
"type": message_type,
|
|
216
|
+
"content": message,
|
|
217
|
+
"model": self.model_name,
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return {"status": "formatted", "message": formatted_message}
|
|
221
|
+
|
|
222
|
+
async def get_capabilities(self) -> List[AgentCapability]:
|
|
223
|
+
"""Get LLM capabilities."""
|
|
224
|
+
return self.capabilities
|
|
225
|
+
|
|
226
|
+
async def health_check(self) -> Dict[str, Any]:
|
|
227
|
+
"""Check LLM health."""
|
|
228
|
+
return {
|
|
229
|
+
"status": "healthy" if self._initialized else "not_initialized",
|
|
230
|
+
"agent_id": self.agent_id,
|
|
231
|
+
"model": self.model_name,
|
|
232
|
+
"capabilities": [cap.value for cap in self.capabilities],
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
def _build_prompt(self, task: str, context: Optional[Dict[str, Any]]) -> str:
|
|
236
|
+
"""Build prompt from task and context."""
|
|
237
|
+
prompt_parts = []
|
|
238
|
+
|
|
239
|
+
if context:
|
|
240
|
+
if "system" in context:
|
|
241
|
+
prompt_parts.append(f"System: {context['system']}")
|
|
242
|
+
if "history" in context:
|
|
243
|
+
prompt_parts.append(f"History: {context['history']}")
|
|
244
|
+
|
|
245
|
+
prompt_parts.append(f"Task: {task}")
|
|
246
|
+
|
|
247
|
+
return "\n\n".join(prompt_parts)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
class CustomAgentAdapter(AgentAdapter):
|
|
251
|
+
"""
|
|
252
|
+
Adapter for custom agent implementations.
|
|
253
|
+
Allows developers to wrap any agent implementation.
|
|
254
|
+
"""
|
|
255
|
+
|
|
256
|
+
def __init__(
|
|
257
|
+
self,
|
|
258
|
+
agent_id: str,
|
|
259
|
+
agent_instance: Any,
|
|
260
|
+
execute_method: str = "execute",
|
|
261
|
+
capabilities: Optional[List[AgentCapability]] = None,
|
|
262
|
+
config: Optional[Dict[str, Any]] = None,
|
|
263
|
+
):
|
|
264
|
+
"""
|
|
265
|
+
Initialize custom agent adapter.
|
|
266
|
+
|
|
267
|
+
Args:
|
|
268
|
+
agent_id: Unique identifier for the agent
|
|
269
|
+
agent_instance: The custom agent instance
|
|
270
|
+
execute_method: Name of the execute method on the agent
|
|
271
|
+
capabilities: List of agent capabilities
|
|
272
|
+
config: Optional configuration
|
|
273
|
+
"""
|
|
274
|
+
super().__init__(agent_id, config)
|
|
275
|
+
self.agent_instance = agent_instance
|
|
276
|
+
self.execute_method = execute_method
|
|
277
|
+
self.capabilities = capabilities or [AgentCapability.TEXT_GENERATION]
|
|
278
|
+
|
|
279
|
+
async def initialize(self) -> bool:
|
|
280
|
+
"""Initialize the custom agent."""
|
|
281
|
+
try:
|
|
282
|
+
if hasattr(self.agent_instance, "initialize"):
|
|
283
|
+
if asyncio.iscoroutinefunction(self.agent_instance.initialize):
|
|
284
|
+
await self.agent_instance.initialize()
|
|
285
|
+
else:
|
|
286
|
+
self.agent_instance.initialize()
|
|
287
|
+
self._initialized = True
|
|
288
|
+
logger.info(f"Initialized custom agent adapter for {self.agent_id}")
|
|
289
|
+
return True
|
|
290
|
+
except Exception as e:
|
|
291
|
+
logger.error(f"Failed to initialize custom agent: {e}")
|
|
292
|
+
return False
|
|
293
|
+
|
|
294
|
+
async def execute(
|
|
295
|
+
self, task: str, context: Optional[Dict[str, Any]] = None, **kwargs
|
|
296
|
+
) -> Dict[str, Any]:
|
|
297
|
+
"""Execute a task with the custom agent."""
|
|
298
|
+
if not self._initialized:
|
|
299
|
+
return {"status": "error", "error": "Adapter not initialized"}
|
|
300
|
+
|
|
301
|
+
try:
|
|
302
|
+
execute_func = getattr(self.agent_instance, self.execute_method, None)
|
|
303
|
+
if not execute_func:
|
|
304
|
+
return {
|
|
305
|
+
"status": "error",
|
|
306
|
+
"error": f"Method {self.execute_method} not found on agent",
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
# Try to call the execute method
|
|
310
|
+
if asyncio.iscoroutinefunction(execute_func):
|
|
311
|
+
result = await execute_func(task, context=context, **kwargs)
|
|
312
|
+
else:
|
|
313
|
+
result = execute_func(task, context=context, **kwargs)
|
|
314
|
+
|
|
315
|
+
return {
|
|
316
|
+
"status": "success",
|
|
317
|
+
"output": result,
|
|
318
|
+
"agent_id": self.agent_id,
|
|
319
|
+
}
|
|
320
|
+
except Exception as e:
|
|
321
|
+
logger.error(f"Error executing task with custom agent: {e}")
|
|
322
|
+
return {"status": "error", "error": str(e)}
|
|
323
|
+
|
|
324
|
+
async def communicate(
|
|
325
|
+
self,
|
|
326
|
+
message: str,
|
|
327
|
+
recipient_id: Optional[str] = None,
|
|
328
|
+
message_type: str = "request",
|
|
329
|
+
**kwargs,
|
|
330
|
+
) -> Dict[str, Any]:
|
|
331
|
+
"""Send a message through the custom agent."""
|
|
332
|
+
if hasattr(self.agent_instance, "send_message"):
|
|
333
|
+
send_func = self.agent_instance.send_message
|
|
334
|
+
if asyncio.iscoroutinefunction(send_func):
|
|
335
|
+
return await send_func(message, recipient_id, message_type, **kwargs)
|
|
336
|
+
else:
|
|
337
|
+
return send_func(message, recipient_id, message_type, **kwargs)
|
|
338
|
+
|
|
339
|
+
# Default message formatting
|
|
340
|
+
return {
|
|
341
|
+
"status": "formatted",
|
|
342
|
+
"message": {
|
|
343
|
+
"from": self.agent_id,
|
|
344
|
+
"to": recipient_id or "broadcast",
|
|
345
|
+
"type": message_type,
|
|
346
|
+
"content": message,
|
|
347
|
+
},
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
async def get_capabilities(self) -> List[AgentCapability]:
|
|
351
|
+
"""Get custom agent capabilities."""
|
|
352
|
+
return self.capabilities
|
|
353
|
+
|
|
354
|
+
async def health_check(self) -> Dict[str, Any]:
|
|
355
|
+
"""Check custom agent health."""
|
|
356
|
+
if hasattr(self.agent_instance, "health_check"):
|
|
357
|
+
health_func = self.agent_instance.health_check
|
|
358
|
+
if asyncio.iscoroutinefunction(health_func):
|
|
359
|
+
return await health_func()
|
|
360
|
+
else:
|
|
361
|
+
return health_func()
|
|
362
|
+
|
|
363
|
+
return {
|
|
364
|
+
"status": "healthy" if self._initialized else "not_initialized",
|
|
365
|
+
"agent_id": self.agent_id,
|
|
366
|
+
"capabilities": [cap.value for cap in self.capabilities],
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
class AgentAdapterRegistry:
|
|
371
|
+
"""
|
|
372
|
+
Registry for managing agent adapters.
|
|
373
|
+
Allows registration, lookup, and management of agent adapters.
|
|
374
|
+
"""
|
|
375
|
+
|
|
376
|
+
def __init__(self):
|
|
377
|
+
"""Initialize the adapter registry."""
|
|
378
|
+
self.adapters: Dict[str, AgentAdapter] = {}
|
|
379
|
+
self.adapter_types: Dict[str, Type[AgentAdapter]] = {
|
|
380
|
+
"standard_llm": StandardLLMAdapter,
|
|
381
|
+
"custom": CustomAgentAdapter,
|
|
382
|
+
}
|
|
383
|
+
logger.info("Agent adapter registry initialized")
|
|
384
|
+
|
|
385
|
+
def register_adapter_type(self, type_name: str, adapter_class: Type[AgentAdapter]) -> None:
|
|
386
|
+
"""
|
|
387
|
+
Register a new adapter type.
|
|
388
|
+
|
|
389
|
+
Args:
|
|
390
|
+
type_name: Name for the adapter type
|
|
391
|
+
adapter_class: Adapter class
|
|
392
|
+
"""
|
|
393
|
+
self.adapter_types[type_name] = adapter_class
|
|
394
|
+
logger.info(f"Registered adapter type: {type_name}")
|
|
395
|
+
|
|
396
|
+
async def register_adapter(self, adapter: AgentAdapter, auto_initialize: bool = True) -> bool:
|
|
397
|
+
"""
|
|
398
|
+
Register an agent adapter.
|
|
399
|
+
|
|
400
|
+
Args:
|
|
401
|
+
adapter: Agent adapter to register
|
|
402
|
+
auto_initialize: Whether to initialize the adapter automatically
|
|
403
|
+
|
|
404
|
+
Returns:
|
|
405
|
+
True if registration was successful
|
|
406
|
+
"""
|
|
407
|
+
if adapter.agent_id in self.adapters:
|
|
408
|
+
logger.warning(f"Adapter {adapter.agent_id} already registered, replacing")
|
|
409
|
+
|
|
410
|
+
if auto_initialize and not adapter._initialized:
|
|
411
|
+
success = await adapter.initialize()
|
|
412
|
+
if not success:
|
|
413
|
+
logger.error(f"Failed to initialize adapter {adapter.agent_id}")
|
|
414
|
+
return False
|
|
415
|
+
|
|
416
|
+
self.adapters[adapter.agent_id] = adapter
|
|
417
|
+
logger.info(f"Registered adapter: {adapter.agent_id}")
|
|
418
|
+
return True
|
|
419
|
+
|
|
420
|
+
def get_adapter(self, agent_id: str) -> Optional[AgentAdapter]:
|
|
421
|
+
"""
|
|
422
|
+
Get an adapter by agent ID.
|
|
423
|
+
|
|
424
|
+
Args:
|
|
425
|
+
agent_id: ID of the agent
|
|
426
|
+
|
|
427
|
+
Returns:
|
|
428
|
+
Agent adapter or None if not found
|
|
429
|
+
"""
|
|
430
|
+
return self.adapters.get(agent_id)
|
|
431
|
+
|
|
432
|
+
def unregister_adapter(self, agent_id: str) -> bool:
|
|
433
|
+
"""
|
|
434
|
+
Unregister an adapter.
|
|
435
|
+
|
|
436
|
+
Args:
|
|
437
|
+
agent_id: ID of the agent to unregister
|
|
438
|
+
|
|
439
|
+
Returns:
|
|
440
|
+
True if adapter was unregistered
|
|
441
|
+
"""
|
|
442
|
+
if agent_id in self.adapters:
|
|
443
|
+
del self.adapters[agent_id]
|
|
444
|
+
logger.info(f"Unregistered adapter: {agent_id}")
|
|
445
|
+
return True
|
|
446
|
+
return False
|
|
447
|
+
|
|
448
|
+
def list_adapters(self) -> List[str]:
|
|
449
|
+
"""
|
|
450
|
+
List all registered adapter IDs.
|
|
451
|
+
|
|
452
|
+
Returns:
|
|
453
|
+
List of adapter IDs
|
|
454
|
+
"""
|
|
455
|
+
return list(self.adapters.keys())
|
|
456
|
+
|
|
457
|
+
async def health_check_all(self) -> Dict[str, Dict[str, Any]]:
|
|
458
|
+
"""
|
|
459
|
+
Perform health check on all adapters.
|
|
460
|
+
|
|
461
|
+
Returns:
|
|
462
|
+
Dictionary mapping agent IDs to health status
|
|
463
|
+
"""
|
|
464
|
+
health_statuses = {}
|
|
465
|
+
for agent_id, adapter in self.adapters.items():
|
|
466
|
+
try:
|
|
467
|
+
status = await adapter.health_check()
|
|
468
|
+
health_statuses[agent_id] = status
|
|
469
|
+
except Exception as e:
|
|
470
|
+
health_statuses[agent_id] = {
|
|
471
|
+
"status": "error",
|
|
472
|
+
"error": str(e),
|
|
473
|
+
}
|
|
474
|
+
return health_statuses
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
# Import asyncio for async checks
|