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.
Files changed (302) hide show
  1. aiecs/__init__.py +72 -0
  2. aiecs/__main__.py +41 -0
  3. aiecs/aiecs_client.py +469 -0
  4. aiecs/application/__init__.py +10 -0
  5. aiecs/application/executors/__init__.py +10 -0
  6. aiecs/application/executors/operation_executor.py +363 -0
  7. aiecs/application/knowledge_graph/__init__.py +7 -0
  8. aiecs/application/knowledge_graph/builder/__init__.py +37 -0
  9. aiecs/application/knowledge_graph/builder/document_builder.py +375 -0
  10. aiecs/application/knowledge_graph/builder/graph_builder.py +356 -0
  11. aiecs/application/knowledge_graph/builder/schema_mapping.py +531 -0
  12. aiecs/application/knowledge_graph/builder/structured_pipeline.py +443 -0
  13. aiecs/application/knowledge_graph/builder/text_chunker.py +319 -0
  14. aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
  15. aiecs/application/knowledge_graph/extractors/base.py +100 -0
  16. aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +327 -0
  17. aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +349 -0
  18. aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +244 -0
  19. aiecs/application/knowledge_graph/fusion/__init__.py +23 -0
  20. aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +387 -0
  21. aiecs/application/knowledge_graph/fusion/entity_linker.py +343 -0
  22. aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +580 -0
  23. aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +189 -0
  24. aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
  25. aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +344 -0
  26. aiecs/application/knowledge_graph/pattern_matching/query_executor.py +378 -0
  27. aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
  28. aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +199 -0
  29. aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
  30. aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
  31. aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +347 -0
  32. aiecs/application/knowledge_graph/reasoning/inference_engine.py +504 -0
  33. aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +167 -0
  34. aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
  35. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
  36. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +630 -0
  37. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +654 -0
  38. aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +477 -0
  39. aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +390 -0
  40. aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +217 -0
  41. aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +169 -0
  42. aiecs/application/knowledge_graph/reasoning/query_planner.py +872 -0
  43. aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +554 -0
  44. aiecs/application/knowledge_graph/retrieval/__init__.py +19 -0
  45. aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +596 -0
  46. aiecs/application/knowledge_graph/search/__init__.py +59 -0
  47. aiecs/application/knowledge_graph/search/hybrid_search.py +423 -0
  48. aiecs/application/knowledge_graph/search/reranker.py +295 -0
  49. aiecs/application/knowledge_graph/search/reranker_strategies.py +553 -0
  50. aiecs/application/knowledge_graph/search/text_similarity.py +398 -0
  51. aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
  52. aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +329 -0
  53. aiecs/application/knowledge_graph/traversal/path_scorer.py +269 -0
  54. aiecs/application/knowledge_graph/validators/__init__.py +13 -0
  55. aiecs/application/knowledge_graph/validators/relation_validator.py +189 -0
  56. aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
  57. aiecs/application/knowledge_graph/visualization/graph_visualizer.py +321 -0
  58. aiecs/common/__init__.py +9 -0
  59. aiecs/common/knowledge_graph/__init__.py +17 -0
  60. aiecs/common/knowledge_graph/runnable.py +484 -0
  61. aiecs/config/__init__.py +16 -0
  62. aiecs/config/config.py +498 -0
  63. aiecs/config/graph_config.py +137 -0
  64. aiecs/config/registry.py +23 -0
  65. aiecs/core/__init__.py +46 -0
  66. aiecs/core/interface/__init__.py +34 -0
  67. aiecs/core/interface/execution_interface.py +152 -0
  68. aiecs/core/interface/storage_interface.py +171 -0
  69. aiecs/domain/__init__.py +289 -0
  70. aiecs/domain/agent/__init__.py +189 -0
  71. aiecs/domain/agent/base_agent.py +697 -0
  72. aiecs/domain/agent/exceptions.py +103 -0
  73. aiecs/domain/agent/graph_aware_mixin.py +559 -0
  74. aiecs/domain/agent/hybrid_agent.py +490 -0
  75. aiecs/domain/agent/integration/__init__.py +26 -0
  76. aiecs/domain/agent/integration/context_compressor.py +222 -0
  77. aiecs/domain/agent/integration/context_engine_adapter.py +252 -0
  78. aiecs/domain/agent/integration/retry_policy.py +219 -0
  79. aiecs/domain/agent/integration/role_config.py +213 -0
  80. aiecs/domain/agent/knowledge_aware_agent.py +646 -0
  81. aiecs/domain/agent/lifecycle.py +296 -0
  82. aiecs/domain/agent/llm_agent.py +300 -0
  83. aiecs/domain/agent/memory/__init__.py +12 -0
  84. aiecs/domain/agent/memory/conversation.py +197 -0
  85. aiecs/domain/agent/migration/__init__.py +14 -0
  86. aiecs/domain/agent/migration/conversion.py +160 -0
  87. aiecs/domain/agent/migration/legacy_wrapper.py +90 -0
  88. aiecs/domain/agent/models.py +317 -0
  89. aiecs/domain/agent/observability.py +407 -0
  90. aiecs/domain/agent/persistence.py +289 -0
  91. aiecs/domain/agent/prompts/__init__.py +29 -0
  92. aiecs/domain/agent/prompts/builder.py +161 -0
  93. aiecs/domain/agent/prompts/formatters.py +189 -0
  94. aiecs/domain/agent/prompts/template.py +255 -0
  95. aiecs/domain/agent/registry.py +260 -0
  96. aiecs/domain/agent/tool_agent.py +257 -0
  97. aiecs/domain/agent/tools/__init__.py +12 -0
  98. aiecs/domain/agent/tools/schema_generator.py +221 -0
  99. aiecs/domain/community/__init__.py +155 -0
  100. aiecs/domain/community/agent_adapter.py +477 -0
  101. aiecs/domain/community/analytics.py +481 -0
  102. aiecs/domain/community/collaborative_workflow.py +642 -0
  103. aiecs/domain/community/communication_hub.py +645 -0
  104. aiecs/domain/community/community_builder.py +320 -0
  105. aiecs/domain/community/community_integration.py +800 -0
  106. aiecs/domain/community/community_manager.py +813 -0
  107. aiecs/domain/community/decision_engine.py +879 -0
  108. aiecs/domain/community/exceptions.py +225 -0
  109. aiecs/domain/community/models/__init__.py +33 -0
  110. aiecs/domain/community/models/community_models.py +268 -0
  111. aiecs/domain/community/resource_manager.py +457 -0
  112. aiecs/domain/community/shared_context_manager.py +603 -0
  113. aiecs/domain/context/__init__.py +58 -0
  114. aiecs/domain/context/context_engine.py +989 -0
  115. aiecs/domain/context/conversation_models.py +354 -0
  116. aiecs/domain/context/graph_memory.py +467 -0
  117. aiecs/domain/execution/__init__.py +12 -0
  118. aiecs/domain/execution/model.py +57 -0
  119. aiecs/domain/knowledge_graph/__init__.py +19 -0
  120. aiecs/domain/knowledge_graph/models/__init__.py +52 -0
  121. aiecs/domain/knowledge_graph/models/entity.py +130 -0
  122. aiecs/domain/knowledge_graph/models/evidence.py +194 -0
  123. aiecs/domain/knowledge_graph/models/inference_rule.py +186 -0
  124. aiecs/domain/knowledge_graph/models/path.py +179 -0
  125. aiecs/domain/knowledge_graph/models/path_pattern.py +173 -0
  126. aiecs/domain/knowledge_graph/models/query.py +272 -0
  127. aiecs/domain/knowledge_graph/models/query_plan.py +187 -0
  128. aiecs/domain/knowledge_graph/models/relation.py +136 -0
  129. aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
  130. aiecs/domain/knowledge_graph/schema/entity_type.py +135 -0
  131. aiecs/domain/knowledge_graph/schema/graph_schema.py +271 -0
  132. aiecs/domain/knowledge_graph/schema/property_schema.py +155 -0
  133. aiecs/domain/knowledge_graph/schema/relation_type.py +171 -0
  134. aiecs/domain/knowledge_graph/schema/schema_manager.py +496 -0
  135. aiecs/domain/knowledge_graph/schema/type_enums.py +205 -0
  136. aiecs/domain/task/__init__.py +13 -0
  137. aiecs/domain/task/dsl_processor.py +613 -0
  138. aiecs/domain/task/model.py +62 -0
  139. aiecs/domain/task/task_context.py +268 -0
  140. aiecs/infrastructure/__init__.py +24 -0
  141. aiecs/infrastructure/graph_storage/__init__.py +11 -0
  142. aiecs/infrastructure/graph_storage/base.py +601 -0
  143. aiecs/infrastructure/graph_storage/batch_operations.py +449 -0
  144. aiecs/infrastructure/graph_storage/cache.py +429 -0
  145. aiecs/infrastructure/graph_storage/distributed.py +226 -0
  146. aiecs/infrastructure/graph_storage/error_handling.py +390 -0
  147. aiecs/infrastructure/graph_storage/graceful_degradation.py +306 -0
  148. aiecs/infrastructure/graph_storage/health_checks.py +378 -0
  149. aiecs/infrastructure/graph_storage/in_memory.py +514 -0
  150. aiecs/infrastructure/graph_storage/index_optimization.py +483 -0
  151. aiecs/infrastructure/graph_storage/lazy_loading.py +410 -0
  152. aiecs/infrastructure/graph_storage/metrics.py +357 -0
  153. aiecs/infrastructure/graph_storage/migration.py +413 -0
  154. aiecs/infrastructure/graph_storage/pagination.py +471 -0
  155. aiecs/infrastructure/graph_storage/performance_monitoring.py +466 -0
  156. aiecs/infrastructure/graph_storage/postgres.py +871 -0
  157. aiecs/infrastructure/graph_storage/query_optimizer.py +635 -0
  158. aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
  159. aiecs/infrastructure/graph_storage/sqlite.py +623 -0
  160. aiecs/infrastructure/graph_storage/streaming.py +495 -0
  161. aiecs/infrastructure/messaging/__init__.py +13 -0
  162. aiecs/infrastructure/messaging/celery_task_manager.py +383 -0
  163. aiecs/infrastructure/messaging/websocket_manager.py +298 -0
  164. aiecs/infrastructure/monitoring/__init__.py +34 -0
  165. aiecs/infrastructure/monitoring/executor_metrics.py +174 -0
  166. aiecs/infrastructure/monitoring/global_metrics_manager.py +213 -0
  167. aiecs/infrastructure/monitoring/structured_logger.py +48 -0
  168. aiecs/infrastructure/monitoring/tracing_manager.py +410 -0
  169. aiecs/infrastructure/persistence/__init__.py +24 -0
  170. aiecs/infrastructure/persistence/context_engine_client.py +187 -0
  171. aiecs/infrastructure/persistence/database_manager.py +333 -0
  172. aiecs/infrastructure/persistence/file_storage.py +754 -0
  173. aiecs/infrastructure/persistence/redis_client.py +220 -0
  174. aiecs/llm/__init__.py +86 -0
  175. aiecs/llm/callbacks/__init__.py +11 -0
  176. aiecs/llm/callbacks/custom_callbacks.py +264 -0
  177. aiecs/llm/client_factory.py +420 -0
  178. aiecs/llm/clients/__init__.py +33 -0
  179. aiecs/llm/clients/base_client.py +193 -0
  180. aiecs/llm/clients/googleai_client.py +181 -0
  181. aiecs/llm/clients/openai_client.py +131 -0
  182. aiecs/llm/clients/vertex_client.py +437 -0
  183. aiecs/llm/clients/xai_client.py +184 -0
  184. aiecs/llm/config/__init__.py +51 -0
  185. aiecs/llm/config/config_loader.py +275 -0
  186. aiecs/llm/config/config_validator.py +236 -0
  187. aiecs/llm/config/model_config.py +151 -0
  188. aiecs/llm/utils/__init__.py +10 -0
  189. aiecs/llm/utils/validate_config.py +91 -0
  190. aiecs/main.py +363 -0
  191. aiecs/scripts/__init__.py +3 -0
  192. aiecs/scripts/aid/VERSION_MANAGEMENT.md +97 -0
  193. aiecs/scripts/aid/__init__.py +19 -0
  194. aiecs/scripts/aid/version_manager.py +215 -0
  195. aiecs/scripts/dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md +242 -0
  196. aiecs/scripts/dependance_check/README_DEPENDENCY_CHECKER.md +310 -0
  197. aiecs/scripts/dependance_check/__init__.py +17 -0
  198. aiecs/scripts/dependance_check/dependency_checker.py +938 -0
  199. aiecs/scripts/dependance_check/dependency_fixer.py +391 -0
  200. aiecs/scripts/dependance_check/download_nlp_data.py +396 -0
  201. aiecs/scripts/dependance_check/quick_dependency_check.py +270 -0
  202. aiecs/scripts/dependance_check/setup_nlp_data.sh +217 -0
  203. aiecs/scripts/dependance_patch/__init__.py +7 -0
  204. aiecs/scripts/dependance_patch/fix_weasel/README_WEASEL_PATCH.md +126 -0
  205. aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
  206. aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.py +128 -0
  207. aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.sh +82 -0
  208. aiecs/scripts/dependance_patch/fix_weasel/patch_weasel_library.sh +188 -0
  209. aiecs/scripts/dependance_patch/fix_weasel/run_weasel_patch.sh +41 -0
  210. aiecs/scripts/tools_develop/README.md +449 -0
  211. aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
  212. aiecs/scripts/tools_develop/__init__.py +21 -0
  213. aiecs/scripts/tools_develop/check_type_annotations.py +259 -0
  214. aiecs/scripts/tools_develop/validate_tool_schemas.py +422 -0
  215. aiecs/scripts/tools_develop/verify_tools.py +356 -0
  216. aiecs/tasks/__init__.py +1 -0
  217. aiecs/tasks/worker.py +172 -0
  218. aiecs/tools/__init__.py +299 -0
  219. aiecs/tools/apisource/__init__.py +99 -0
  220. aiecs/tools/apisource/intelligence/__init__.py +19 -0
  221. aiecs/tools/apisource/intelligence/data_fusion.py +381 -0
  222. aiecs/tools/apisource/intelligence/query_analyzer.py +413 -0
  223. aiecs/tools/apisource/intelligence/search_enhancer.py +388 -0
  224. aiecs/tools/apisource/monitoring/__init__.py +9 -0
  225. aiecs/tools/apisource/monitoring/metrics.py +303 -0
  226. aiecs/tools/apisource/providers/__init__.py +115 -0
  227. aiecs/tools/apisource/providers/base.py +664 -0
  228. aiecs/tools/apisource/providers/census.py +401 -0
  229. aiecs/tools/apisource/providers/fred.py +564 -0
  230. aiecs/tools/apisource/providers/newsapi.py +412 -0
  231. aiecs/tools/apisource/providers/worldbank.py +357 -0
  232. aiecs/tools/apisource/reliability/__init__.py +12 -0
  233. aiecs/tools/apisource/reliability/error_handler.py +375 -0
  234. aiecs/tools/apisource/reliability/fallback_strategy.py +391 -0
  235. aiecs/tools/apisource/tool.py +850 -0
  236. aiecs/tools/apisource/utils/__init__.py +9 -0
  237. aiecs/tools/apisource/utils/validators.py +338 -0
  238. aiecs/tools/base_tool.py +201 -0
  239. aiecs/tools/docs/__init__.py +121 -0
  240. aiecs/tools/docs/ai_document_orchestrator.py +599 -0
  241. aiecs/tools/docs/ai_document_writer_orchestrator.py +2403 -0
  242. aiecs/tools/docs/content_insertion_tool.py +1333 -0
  243. aiecs/tools/docs/document_creator_tool.py +1317 -0
  244. aiecs/tools/docs/document_layout_tool.py +1166 -0
  245. aiecs/tools/docs/document_parser_tool.py +994 -0
  246. aiecs/tools/docs/document_writer_tool.py +1818 -0
  247. aiecs/tools/knowledge_graph/__init__.py +17 -0
  248. aiecs/tools/knowledge_graph/graph_reasoning_tool.py +734 -0
  249. aiecs/tools/knowledge_graph/graph_search_tool.py +923 -0
  250. aiecs/tools/knowledge_graph/kg_builder_tool.py +476 -0
  251. aiecs/tools/langchain_adapter.py +542 -0
  252. aiecs/tools/schema_generator.py +275 -0
  253. aiecs/tools/search_tool/__init__.py +100 -0
  254. aiecs/tools/search_tool/analyzers.py +589 -0
  255. aiecs/tools/search_tool/cache.py +260 -0
  256. aiecs/tools/search_tool/constants.py +128 -0
  257. aiecs/tools/search_tool/context.py +216 -0
  258. aiecs/tools/search_tool/core.py +749 -0
  259. aiecs/tools/search_tool/deduplicator.py +123 -0
  260. aiecs/tools/search_tool/error_handler.py +271 -0
  261. aiecs/tools/search_tool/metrics.py +371 -0
  262. aiecs/tools/search_tool/rate_limiter.py +178 -0
  263. aiecs/tools/search_tool/schemas.py +277 -0
  264. aiecs/tools/statistics/__init__.py +80 -0
  265. aiecs/tools/statistics/ai_data_analysis_orchestrator.py +643 -0
  266. aiecs/tools/statistics/ai_insight_generator_tool.py +505 -0
  267. aiecs/tools/statistics/ai_report_orchestrator_tool.py +694 -0
  268. aiecs/tools/statistics/data_loader_tool.py +564 -0
  269. aiecs/tools/statistics/data_profiler_tool.py +658 -0
  270. aiecs/tools/statistics/data_transformer_tool.py +573 -0
  271. aiecs/tools/statistics/data_visualizer_tool.py +495 -0
  272. aiecs/tools/statistics/model_trainer_tool.py +487 -0
  273. aiecs/tools/statistics/statistical_analyzer_tool.py +459 -0
  274. aiecs/tools/task_tools/__init__.py +86 -0
  275. aiecs/tools/task_tools/chart_tool.py +732 -0
  276. aiecs/tools/task_tools/classfire_tool.py +922 -0
  277. aiecs/tools/task_tools/image_tool.py +447 -0
  278. aiecs/tools/task_tools/office_tool.py +684 -0
  279. aiecs/tools/task_tools/pandas_tool.py +635 -0
  280. aiecs/tools/task_tools/report_tool.py +635 -0
  281. aiecs/tools/task_tools/research_tool.py +392 -0
  282. aiecs/tools/task_tools/scraper_tool.py +715 -0
  283. aiecs/tools/task_tools/stats_tool.py +688 -0
  284. aiecs/tools/temp_file_manager.py +130 -0
  285. aiecs/tools/tool_executor/__init__.py +37 -0
  286. aiecs/tools/tool_executor/tool_executor.py +881 -0
  287. aiecs/utils/LLM_output_structor.py +445 -0
  288. aiecs/utils/__init__.py +34 -0
  289. aiecs/utils/base_callback.py +47 -0
  290. aiecs/utils/cache_provider.py +695 -0
  291. aiecs/utils/execution_utils.py +184 -0
  292. aiecs/utils/logging.py +1 -0
  293. aiecs/utils/prompt_loader.py +14 -0
  294. aiecs/utils/token_usage_repository.py +323 -0
  295. aiecs/ws/__init__.py +0 -0
  296. aiecs/ws/socket_server.py +52 -0
  297. aiecs-1.5.1.dist-info/METADATA +608 -0
  298. aiecs-1.5.1.dist-info/RECORD +302 -0
  299. aiecs-1.5.1.dist-info/WHEEL +5 -0
  300. aiecs-1.5.1.dist-info/entry_points.txt +10 -0
  301. aiecs-1.5.1.dist-info/licenses/LICENSE +225 -0
  302. 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