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,697 @@
1
+ """
2
+ Base AI Agent
3
+
4
+ Abstract base class for all AI agents in the AIECS system.
5
+ """
6
+
7
+ from abc import ABC, abstractmethod
8
+ from datetime import datetime
9
+ from typing import Dict, List, Any, Optional, Callable
10
+ import logging
11
+
12
+ from .models import (
13
+ AgentState,
14
+ AgentType,
15
+ AgentConfiguration,
16
+ AgentGoal,
17
+ AgentMetrics,
18
+ AgentCapabilityDeclaration,
19
+ GoalStatus,
20
+ GoalPriority,
21
+ MemoryType,
22
+ )
23
+ from .exceptions import (
24
+ InvalidStateTransitionError,
25
+ ConfigurationError,
26
+ AgentInitializationError,
27
+ SerializationError,
28
+ )
29
+
30
+ logger = logging.getLogger(__name__)
31
+
32
+
33
+ class BaseAIAgent(ABC):
34
+ """
35
+ Abstract base class for AI agents.
36
+
37
+ Provides common functionality for agent lifecycle management,
38
+ state management, memory, goals, and metrics tracking.
39
+ """
40
+
41
+ def __init__(
42
+ self,
43
+ agent_id: str,
44
+ name: str,
45
+ agent_type: AgentType,
46
+ config: AgentConfiguration,
47
+ description: Optional[str] = None,
48
+ version: str = "1.0.0",
49
+ ):
50
+ """
51
+ Initialize the base agent.
52
+
53
+ Args:
54
+ agent_id: Unique identifier for the agent
55
+ name: Agent name
56
+ agent_type: Type of agent
57
+ config: Agent configuration
58
+ description: Optional agent description
59
+ version: Agent version
60
+ """
61
+ # Identity
62
+ self.agent_id = agent_id
63
+ self.name = name
64
+ self.agent_type = agent_type
65
+ self.description = description or f"{agent_type.value} agent"
66
+ self.version = version
67
+
68
+ # Configuration
69
+ self._config = config
70
+
71
+ # State
72
+ self._state = AgentState.CREATED
73
+ self._previous_state: Optional[AgentState] = None
74
+
75
+ # Memory storage (in-memory dict, can be replaced with sophisticated
76
+ # storage)
77
+ self._memory: Dict[str, Any] = {}
78
+ self._memory_metadata: Dict[str, Dict[str, Any]] = {}
79
+
80
+ # Goals
81
+ self._goals: Dict[str, AgentGoal] = {}
82
+
83
+ # Capabilities
84
+ self._capabilities: Dict[str, AgentCapabilityDeclaration] = {}
85
+
86
+ # Metrics
87
+ self._metrics = AgentMetrics()
88
+
89
+ # Timestamps
90
+ self.created_at = datetime.utcnow()
91
+ self.updated_at = datetime.utcnow()
92
+ self.last_active_at: Optional[datetime] = None
93
+
94
+ # Current task tracking
95
+ self._current_task_id: Optional[str] = None
96
+
97
+ logger.info(f"Agent initialized: {self.agent_id} ({self.name}, {self.agent_type.value})")
98
+
99
+ # ==================== State Management ====================
100
+
101
+ @property
102
+ def state(self) -> AgentState:
103
+ """Get current agent state."""
104
+ return self._state
105
+
106
+ def get_state(self) -> AgentState:
107
+ """Get current agent state."""
108
+ return self._state
109
+
110
+ def _transition_state(self, new_state: AgentState) -> None:
111
+ """
112
+ Transition to a new state with validation.
113
+
114
+ Args:
115
+ new_state: Target state
116
+
117
+ Raises:
118
+ InvalidStateTransitionError: If transition is invalid
119
+ """
120
+ # Define valid transitions
121
+ valid_transitions = {
122
+ AgentState.CREATED: {AgentState.INITIALIZING},
123
+ AgentState.INITIALIZING: {AgentState.ACTIVE, AgentState.ERROR},
124
+ AgentState.ACTIVE: {
125
+ AgentState.BUSY,
126
+ AgentState.IDLE,
127
+ AgentState.STOPPED,
128
+ AgentState.ERROR,
129
+ },
130
+ AgentState.BUSY: {AgentState.ACTIVE, AgentState.ERROR},
131
+ AgentState.IDLE: {AgentState.ACTIVE, AgentState.STOPPED},
132
+ AgentState.ERROR: {AgentState.ACTIVE, AgentState.STOPPED},
133
+ AgentState.STOPPED: set(), # Terminal state
134
+ }
135
+
136
+ if new_state not in valid_transitions.get(self._state, set()):
137
+ raise InvalidStateTransitionError(
138
+ agent_id=self.agent_id,
139
+ current_state=self._state.value,
140
+ attempted_state=new_state.value,
141
+ )
142
+
143
+ self._previous_state = self._state
144
+ self._state = new_state
145
+ self.updated_at = datetime.utcnow()
146
+
147
+ logger.info(
148
+ f"Agent {self.agent_id} state: {self._previous_state.value} → {new_state.value}"
149
+ )
150
+
151
+ # ==================== Lifecycle Methods ====================
152
+
153
+ async def initialize(self) -> None:
154
+ """
155
+ Initialize the agent.
156
+
157
+ This method should be called before the agent can be used.
158
+ Override in subclasses to add initialization logic.
159
+
160
+ Raises:
161
+ AgentInitializationError: If initialization fails
162
+ """
163
+ try:
164
+ self._transition_state(AgentState.INITIALIZING)
165
+ logger.info(f"Initializing agent {self.agent_id}...")
166
+
167
+ # Subclass initialization
168
+ await self._initialize()
169
+
170
+ self._transition_state(AgentState.ACTIVE)
171
+ self.last_active_at = datetime.utcnow()
172
+ logger.info(f"Agent {self.agent_id} initialized successfully")
173
+
174
+ except Exception as e:
175
+ self._transition_state(AgentState.ERROR)
176
+ logger.error(f"Agent {self.agent_id} initialization failed: {e}")
177
+ raise AgentInitializationError(
178
+ f"Failed to initialize agent {self.agent_id}: {str(e)}",
179
+ agent_id=self.agent_id,
180
+ )
181
+
182
+ @abstractmethod
183
+ async def _initialize(self) -> None:
184
+ """
185
+ Subclass-specific initialization logic.
186
+
187
+ Override this method in subclasses to implement
188
+ custom initialization.
189
+ """
190
+
191
+ async def activate(self) -> None:
192
+ """Activate the agent."""
193
+ if self._state == AgentState.IDLE:
194
+ self._transition_state(AgentState.ACTIVE)
195
+ self.last_active_at = datetime.utcnow()
196
+ logger.info(f"Agent {self.agent_id} activated")
197
+ else:
198
+ logger.warning(
199
+ f"Agent {self.agent_id} cannot be activated from state {self._state.value}"
200
+ )
201
+
202
+ async def deactivate(self) -> None:
203
+ """Deactivate the agent (enter idle state)."""
204
+ if self._state == AgentState.ACTIVE:
205
+ self._transition_state(AgentState.IDLE)
206
+ logger.info(f"Agent {self.agent_id} deactivated")
207
+ else:
208
+ logger.warning(
209
+ f"Agent {self.agent_id} cannot be deactivated from state {self._state.value}"
210
+ )
211
+
212
+ async def shutdown(self) -> None:
213
+ """
214
+ Shutdown the agent.
215
+
216
+ Override in subclasses to add cleanup logic.
217
+ """
218
+ logger.info(f"Shutting down agent {self.agent_id}...")
219
+ await self._shutdown()
220
+ self._transition_state(AgentState.STOPPED)
221
+ logger.info(f"Agent {self.agent_id} shut down")
222
+
223
+ @abstractmethod
224
+ async def _shutdown(self) -> None:
225
+ """
226
+ Subclass-specific shutdown logic.
227
+
228
+ Override this method in subclasses to implement
229
+ custom cleanup.
230
+ """
231
+
232
+ # ==================== Abstract Execution Methods ====================
233
+
234
+ @abstractmethod
235
+ async def execute_task(self, task: Dict[str, Any], context: Dict[str, Any]) -> Dict[str, Any]:
236
+ """
237
+ Execute a task.
238
+
239
+ Args:
240
+ task: Task specification
241
+ context: Execution context
242
+
243
+ Returns:
244
+ Task execution result
245
+
246
+ Raises:
247
+ TaskExecutionError: If task execution fails
248
+
249
+ Note:
250
+ Subclasses can use `_execute_with_retry()` to wrap task execution
251
+ with automatic retry logic based on agent configuration.
252
+ """
253
+
254
+ @abstractmethod
255
+ async def process_message(
256
+ self, message: str, sender_id: Optional[str] = None
257
+ ) -> Dict[str, Any]:
258
+ """
259
+ Process an incoming message.
260
+
261
+ Args:
262
+ message: Message content
263
+ sender_id: Optional sender identifier
264
+
265
+ Returns:
266
+ Response dictionary
267
+
268
+ Note:
269
+ Subclasses can use `_execute_with_retry()` to wrap message processing
270
+ with automatic retry logic based on agent configuration.
271
+ """
272
+
273
+ # ==================== Retry Logic Integration ====================
274
+
275
+ async def _execute_with_retry(self, func: Callable, *args, **kwargs) -> Any:
276
+ """
277
+ Execute a function with retry logic using agent's retry policy.
278
+
279
+ This helper method wraps function execution with automatic retry based on
280
+ the agent's configuration. It uses EnhancedRetryPolicy for sophisticated
281
+ error handling with exponential backoff and error classification.
282
+
283
+ Args:
284
+ func: Async function to execute
285
+ *args: Function positional arguments
286
+ **kwargs: Function keyword arguments
287
+
288
+ Returns:
289
+ Function result
290
+
291
+ Raises:
292
+ Exception: If all retries are exhausted
293
+
294
+ Example:
295
+ ```python
296
+ async def _execute_task_internal(self, task, context):
297
+ # Actual task execution logic
298
+ return result
299
+
300
+ async def execute_task(self, task, context):
301
+ return await self._execute_with_retry(
302
+ self._execute_task_internal,
303
+ task,
304
+ context
305
+ )
306
+ ```
307
+ """
308
+ from .integration.retry_policy import EnhancedRetryPolicy
309
+
310
+ # Get retry policy from configuration
311
+ retry_config = self._config.retry_policy
312
+
313
+ # Create retry policy instance
314
+ retry_policy = EnhancedRetryPolicy(
315
+ max_retries=retry_config.max_retries,
316
+ base_delay=retry_config.base_delay,
317
+ max_delay=retry_config.max_delay,
318
+ exponential_base=retry_config.exponential_factor,
319
+ jitter=retry_config.jitter_factor > 0,
320
+ )
321
+
322
+ # Execute with retry
323
+ return await retry_policy.execute_with_retry(func, *args, **kwargs)
324
+
325
+ # ==================== Memory Management ====================
326
+
327
+ async def add_to_memory(
328
+ self,
329
+ key: str,
330
+ value: Any,
331
+ memory_type: MemoryType = MemoryType.SHORT_TERM,
332
+ metadata: Optional[Dict[str, Any]] = None,
333
+ ) -> None:
334
+ """
335
+ Add an item to agent memory.
336
+
337
+ Args:
338
+ key: Memory key
339
+ value: Memory value
340
+ memory_type: Type of memory (short_term or long_term)
341
+ metadata: Optional metadata
342
+ """
343
+ self._memory[key] = value
344
+ self._memory_metadata[key] = {
345
+ "type": memory_type.value,
346
+ "timestamp": datetime.utcnow(),
347
+ "metadata": metadata or {},
348
+ }
349
+ logger.debug(f"Agent {self.agent_id} added memory: {key} ({memory_type.value})")
350
+
351
+ async def retrieve_memory(self, key: str, default: Any = None) -> Any:
352
+ """
353
+ Retrieve an item from memory.
354
+
355
+ Args:
356
+ key: Memory key
357
+ default: Default value if key not found
358
+
359
+ Returns:
360
+ Memory value or default
361
+ """
362
+ return self._memory.get(key, default)
363
+
364
+ async def clear_memory(self, memory_type: Optional[MemoryType] = None) -> None:
365
+ """
366
+ Clear agent memory.
367
+
368
+ Args:
369
+ memory_type: If specified, clear only this type of memory
370
+ """
371
+ if memory_type is None:
372
+ self._memory.clear()
373
+ self._memory_metadata.clear()
374
+ logger.info(f"Agent {self.agent_id} cleared all memory")
375
+ else:
376
+ keys_to_remove = [
377
+ k for k, v in self._memory_metadata.items() if v.get("type") == memory_type.value
378
+ ]
379
+ for key in keys_to_remove:
380
+ del self._memory[key]
381
+ del self._memory_metadata[key]
382
+ logger.info(f"Agent {self.agent_id} cleared {memory_type.value} memory")
383
+
384
+ def get_memory_summary(self) -> Dict[str, Any]:
385
+ """Get a summary of agent memory."""
386
+ return {
387
+ "total_items": len(self._memory),
388
+ "short_term_count": sum(
389
+ 1
390
+ for v in self._memory_metadata.values()
391
+ if v.get("type") == MemoryType.SHORT_TERM.value
392
+ ),
393
+ "long_term_count": sum(
394
+ 1
395
+ for v in self._memory_metadata.values()
396
+ if v.get("type") == MemoryType.LONG_TERM.value
397
+ ),
398
+ }
399
+
400
+ # ==================== Goal Management ====================
401
+
402
+ def set_goal(
403
+ self,
404
+ description: str,
405
+ priority: GoalPriority = GoalPriority.MEDIUM,
406
+ success_criteria: Optional[str] = None,
407
+ deadline: Optional[datetime] = None,
408
+ ) -> str:
409
+ """
410
+ Set a new goal for the agent.
411
+
412
+ Args:
413
+ description: Goal description
414
+ priority: Goal priority
415
+ success_criteria: Success criteria
416
+ deadline: Goal deadline
417
+
418
+ Returns:
419
+ Goal ID
420
+ """
421
+ goal = AgentGoal(
422
+ description=description,
423
+ priority=priority,
424
+ success_criteria=success_criteria,
425
+ deadline=deadline,
426
+ )
427
+ self._goals[goal.goal_id] = goal
428
+ logger.info(f"Agent {self.agent_id} set goal: {goal.goal_id} ({priority.value})")
429
+ return goal.goal_id
430
+
431
+ def get_goals(self, status: Optional[GoalStatus] = None) -> List[AgentGoal]:
432
+ """
433
+ Get agent goals.
434
+
435
+ Args:
436
+ status: Filter by status (optional)
437
+
438
+ Returns:
439
+ List of goals
440
+ """
441
+ if status is None:
442
+ return list(self._goals.values())
443
+ return [g for g in self._goals.values() if g.status == status]
444
+
445
+ def get_goal(self, goal_id: str) -> Optional[AgentGoal]:
446
+ """Get a specific goal by ID."""
447
+ return self._goals.get(goal_id)
448
+
449
+ def update_goal_status(
450
+ self,
451
+ goal_id: str,
452
+ status: GoalStatus,
453
+ progress: Optional[float] = None,
454
+ ) -> None:
455
+ """
456
+ Update goal status.
457
+
458
+ Args:
459
+ goal_id: Goal ID
460
+ status: New status
461
+ progress: Optional progress percentage
462
+ """
463
+ if goal_id not in self._goals:
464
+ logger.warning(f"Goal {goal_id} not found for agent {self.agent_id}")
465
+ return
466
+
467
+ goal = self._goals[goal_id]
468
+ goal.status = status
469
+
470
+ if progress is not None:
471
+ goal.progress = progress
472
+
473
+ if status == GoalStatus.IN_PROGRESS and goal.started_at is None:
474
+ goal.started_at = datetime.utcnow()
475
+ elif status == GoalStatus.ACHIEVED:
476
+ goal.achieved_at = datetime.utcnow()
477
+
478
+ logger.info(f"Agent {self.agent_id} updated goal {goal_id}: {status.value}")
479
+
480
+ # ==================== Configuration Management ====================
481
+
482
+ def get_config(self) -> AgentConfiguration:
483
+ """Get agent configuration."""
484
+ return self._config
485
+
486
+ def update_config(self, updates: Dict[str, Any]) -> None:
487
+ """
488
+ Update agent configuration.
489
+
490
+ Args:
491
+ updates: Configuration updates
492
+
493
+ Raises:
494
+ ConfigurationError: If configuration is invalid
495
+ """
496
+ try:
497
+ # Update configuration
498
+ for key, value in updates.items():
499
+ if hasattr(self._config, key):
500
+ setattr(self._config, key, value)
501
+ else:
502
+ logger.warning(f"Unknown config key: {key}")
503
+
504
+ self.updated_at = datetime.utcnow()
505
+ logger.info(f"Agent {self.agent_id} configuration updated")
506
+
507
+ except Exception as e:
508
+ raise ConfigurationError(
509
+ f"Failed to update configuration: {str(e)}",
510
+ agent_id=self.agent_id,
511
+ )
512
+
513
+ # ==================== Capability Management ====================
514
+
515
+ def declare_capability(
516
+ self,
517
+ capability_type: str,
518
+ level: str,
519
+ description: Optional[str] = None,
520
+ constraints: Optional[Dict[str, Any]] = None,
521
+ ) -> None:
522
+ """
523
+ Declare an agent capability.
524
+
525
+ Args:
526
+ capability_type: Type of capability
527
+ level: Proficiency level
528
+ description: Capability description
529
+ constraints: Capability constraints
530
+ """
531
+ from .models import CapabilityLevel
532
+
533
+ capability = AgentCapabilityDeclaration(
534
+ capability_type=capability_type,
535
+ level=CapabilityLevel(level),
536
+ description=description,
537
+ constraints=constraints or {},
538
+ )
539
+ self._capabilities[capability_type] = capability
540
+ logger.info(f"Agent {self.agent_id} declared capability: {capability_type} ({level})")
541
+
542
+ def has_capability(self, capability_type: str) -> bool:
543
+ """Check if agent has a capability."""
544
+ return capability_type in self._capabilities
545
+
546
+ def get_capabilities(self) -> List[AgentCapabilityDeclaration]:
547
+ """Get all agent capabilities."""
548
+ return list(self._capabilities.values())
549
+
550
+ # ==================== Metrics Tracking ====================
551
+
552
+ def get_metrics(self) -> AgentMetrics:
553
+ """Get agent metrics."""
554
+ return self._metrics
555
+
556
+ def update_metrics(
557
+ self,
558
+ execution_time: Optional[float] = None,
559
+ success: bool = True,
560
+ quality_score: Optional[float] = None,
561
+ tokens_used: Optional[int] = None,
562
+ tool_calls: Optional[int] = None,
563
+ ) -> None:
564
+ """
565
+ Update agent metrics.
566
+
567
+ Args:
568
+ execution_time: Task execution time
569
+ success: Whether task succeeded
570
+ quality_score: Quality score (0-1)
571
+ tokens_used: Tokens used
572
+ tool_calls: Number of tool calls
573
+ """
574
+ self._metrics.total_tasks_executed += 1
575
+
576
+ if success:
577
+ self._metrics.successful_tasks += 1
578
+ else:
579
+ self._metrics.failed_tasks += 1
580
+
581
+ # Update success rate
582
+ self._metrics.success_rate = (
583
+ self._metrics.successful_tasks / self._metrics.total_tasks_executed * 100
584
+ )
585
+
586
+ # Update execution time
587
+ if execution_time is not None:
588
+ self._metrics.total_execution_time += execution_time
589
+ self._metrics.average_execution_time = (
590
+ self._metrics.total_execution_time / self._metrics.total_tasks_executed
591
+ )
592
+
593
+ if (
594
+ self._metrics.min_execution_time is None
595
+ or execution_time < self._metrics.min_execution_time
596
+ ):
597
+ self._metrics.min_execution_time = execution_time
598
+ if (
599
+ self._metrics.max_execution_time is None
600
+ or execution_time > self._metrics.max_execution_time
601
+ ):
602
+ self._metrics.max_execution_time = execution_time
603
+
604
+ # Update quality score
605
+ if quality_score is not None:
606
+ if self._metrics.average_quality_score is None:
607
+ self._metrics.average_quality_score = quality_score
608
+ else:
609
+ # Running average
610
+ total_quality = self._metrics.average_quality_score * (
611
+ self._metrics.total_tasks_executed - 1
612
+ )
613
+ self._metrics.average_quality_score = (
614
+ total_quality + quality_score
615
+ ) / self._metrics.total_tasks_executed
616
+
617
+ # Update resource usage
618
+ if tokens_used is not None:
619
+ self._metrics.total_tokens_used += tokens_used
620
+ if tool_calls is not None:
621
+ self._metrics.total_tool_calls += tool_calls
622
+
623
+ self._metrics.updated_at = datetime.utcnow()
624
+
625
+ # ==================== Serialization ====================
626
+
627
+ def to_dict(self) -> Dict[str, Any]:
628
+ """
629
+ Serialize agent to dictionary.
630
+
631
+ Returns:
632
+ Dictionary representation
633
+
634
+ Raises:
635
+ SerializationError: If serialization fails
636
+ """
637
+ try:
638
+ return {
639
+ "agent_id": self.agent_id,
640
+ "name": self.name,
641
+ "agent_type": self.agent_type.value,
642
+ "description": self.description,
643
+ "version": self.version,
644
+ "state": self._state.value,
645
+ "config": self._config.model_dump(),
646
+ "goals": [g.model_dump() for g in self._goals.values()],
647
+ "capabilities": [c.model_dump() for c in self._capabilities.values()],
648
+ "metrics": self._metrics.model_dump(),
649
+ "memory_summary": self.get_memory_summary(),
650
+ "created_at": self.created_at.isoformat(),
651
+ "updated_at": self.updated_at.isoformat(),
652
+ "last_active_at": (
653
+ self.last_active_at.isoformat() if self.last_active_at else None
654
+ ),
655
+ }
656
+ except Exception as e:
657
+ raise SerializationError(
658
+ f"Failed to serialize agent: {str(e)}",
659
+ agent_id=self.agent_id,
660
+ )
661
+
662
+ @classmethod
663
+ def from_dict(cls, data: Dict[str, Any]) -> "BaseAIAgent":
664
+ """
665
+ Deserialize agent from dictionary.
666
+
667
+ Args:
668
+ data: Dictionary representation
669
+
670
+ Returns:
671
+ Agent instance
672
+
673
+ Raises:
674
+ SerializationError: If deserialization fails
675
+ """
676
+ raise NotImplementedError("from_dict must be implemented by subclasses")
677
+
678
+ # ==================== Utility Methods ====================
679
+
680
+ def is_available(self) -> bool:
681
+ """Check if agent is available for tasks."""
682
+ return self._state == AgentState.ACTIVE
683
+
684
+ def is_busy(self) -> bool:
685
+ """Check if agent is currently busy."""
686
+ return self._state == AgentState.BUSY
687
+
688
+ def __str__(self) -> str:
689
+ """String representation."""
690
+ return f"Agent({self.agent_id}, {self.name}, {self.agent_type.value}, {self._state.value})"
691
+
692
+ def __repr__(self) -> str:
693
+ """Detailed representation."""
694
+ return (
695
+ f"BaseAIAgent(agent_id='{self.agent_id}', name='{self.name}', "
696
+ f"type='{self.agent_type.value}', state='{self._state.value}')"
697
+ )