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,467 @@
1
+ """
2
+ Graph Memory Integration for ContextEngine
3
+
4
+ Extends ContextEngine with knowledge graph memory capabilities,
5
+ allowing agents to store and retrieve knowledge from the graph
6
+ during conversations.
7
+ """
8
+
9
+ import logging
10
+ from typing import Dict, Any, Optional, List
11
+ from datetime import datetime
12
+
13
+ from aiecs.infrastructure.graph_storage.base import GraphStore
14
+ from aiecs.domain.knowledge_graph.models.entity import Entity
15
+ from aiecs.domain.knowledge_graph.models.relation import Relation
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+
20
+ class GraphMemoryMixin:
21
+ """
22
+ Mixin to add graph memory capabilities to ContextEngine.
23
+
24
+ This mixin extends ContextEngine with methods to:
25
+ - Store knowledge entities and relations
26
+ - Retrieve knowledge based on context
27
+ - Link conversation to knowledge graph
28
+ - Maintain graph-based conversation context
29
+
30
+ Usage:
31
+ class ContextEngineWithGraph(ContextEngine, GraphMemoryMixin):
32
+ def __init__(self, graph_store: GraphStore, ...):
33
+ super().__init__(...)
34
+ self.graph_store = graph_store
35
+ """
36
+
37
+ # Note: This assumes the class has self.graph_store: Optional[GraphStore]
38
+
39
+ async def store_knowledge(
40
+ self,
41
+ session_id: str,
42
+ entity: Entity,
43
+ relations: Optional[List[Relation]] = None,
44
+ link_to_session: bool = True,
45
+ ) -> bool:
46
+ """
47
+ Store knowledge entity (and optional relations) to the graph.
48
+
49
+ Args:
50
+ session_id: Session identifier
51
+ entity: Entity to store
52
+ relations: Optional list of relations involving this entity
53
+ link_to_session: Whether to create a relation linking entity to session
54
+
55
+ Returns:
56
+ True if stored successfully, False otherwise
57
+
58
+ Example:
59
+ # Store a new person entity from conversation
60
+ person = Entity(
61
+ id="person_123",
62
+ entity_type="Person",
63
+ properties={"name": "Alice", "role": "Engineer"}
64
+ )
65
+
66
+ await context_engine.store_knowledge(
67
+ session_id="session_1",
68
+ entity=person,
69
+ link_to_session=True
70
+ )
71
+ """
72
+ if not hasattr(self, "graph_store") or self.graph_store is None:
73
+ logger.warning("GraphStore not available, cannot store knowledge")
74
+ return False
75
+
76
+ try:
77
+ # Store entity
78
+ await self.graph_store.add_entity(entity)
79
+ logger.debug(f"Stored entity {entity.id} to graph")
80
+
81
+ # Store relations if provided
82
+ if relations:
83
+ for relation in relations:
84
+ await self.graph_store.add_relation(relation)
85
+ logger.debug(f"Stored {len(relations)} relations to graph")
86
+
87
+ # Link entity to session if requested
88
+ if link_to_session:
89
+ session_entity_id = f"session_{session_id}"
90
+
91
+ # Create session entity if it doesn't exist
92
+ session_entity = await self.graph_store.get_entity(session_entity_id)
93
+ if not session_entity:
94
+ session_entity = Entity(
95
+ id=session_entity_id,
96
+ entity_type="Session",
97
+ properties={
98
+ "session_id": session_id,
99
+ "created_at": datetime.utcnow().isoformat(),
100
+ },
101
+ )
102
+ await self.graph_store.add_entity(session_entity)
103
+
104
+ # Create MENTIONED_IN relation
105
+ relation = Relation(
106
+ id=f"mention_{entity.id}_{session_id}_{datetime.utcnow().timestamp()}",
107
+ source_id=entity.id,
108
+ target_id=session_entity_id,
109
+ relation_type="MENTIONED_IN",
110
+ properties={"timestamp": datetime.utcnow().isoformat()},
111
+ )
112
+ await self.graph_store.add_relation(relation)
113
+ logger.debug(f"Linked entity {entity.id} to session {session_id}")
114
+
115
+ return True
116
+
117
+ except Exception as e:
118
+ logger.error(f"Failed to store knowledge: {e}")
119
+ return False
120
+
121
+ async def retrieve_knowledge(
122
+ self,
123
+ session_id: str,
124
+ query: Optional[str] = None,
125
+ entity_types: Optional[List[str]] = None,
126
+ limit: int = 10,
127
+ include_session_context: bool = True,
128
+ ) -> List[Entity]:
129
+ """
130
+ Retrieve knowledge entities relevant to the session and/or query.
131
+
132
+ Args:
133
+ session_id: Session identifier
134
+ query: Optional search query (uses embedding if available)
135
+ entity_types: Optional filter by entity types
136
+ limit: Maximum number of entities to retrieve
137
+ include_session_context: Whether to include entities mentioned in this session
138
+
139
+ Returns:
140
+ List of relevant entities
141
+
142
+ Example:
143
+ # Retrieve people mentioned in this session
144
+ people = await context_engine.retrieve_knowledge(
145
+ session_id="session_1",
146
+ entity_types=["Person"],
147
+ limit=5
148
+ )
149
+ """
150
+ if not hasattr(self, "graph_store") or self.graph_store is None:
151
+ logger.warning("GraphStore not available, cannot retrieve knowledge")
152
+ return []
153
+
154
+ try:
155
+ entities = []
156
+
157
+ # 1. Get session-specific entities if requested
158
+ if include_session_context:
159
+ session_entities = await self._get_session_entities(session_id)
160
+ entities.extend(session_entities[:limit])
161
+
162
+ # 2. If query provided, use vector search (if available)
163
+ if query and len(entities) < limit:
164
+ # Note: This assumes entities have embeddings
165
+ # In a real implementation, you'd generate query embedding
166
+ try:
167
+ from aiecs.infrastructure.graph_storage.in_memory import (
168
+ InMemoryGraphStore,
169
+ )
170
+
171
+ if isinstance(self.graph_store, InMemoryGraphStore):
172
+ # For now, just use basic search
173
+ # TODO: Implement embedding-based search
174
+ pass
175
+ except ImportError:
176
+ pass
177
+
178
+ # 3. Filter by entity types if specified
179
+ if entity_types:
180
+ entities = [e for e in entities if e.entity_type in entity_types]
181
+
182
+ # Remove duplicates
183
+ seen = set()
184
+ unique_entities = []
185
+ for entity in entities:
186
+ if entity.id not in seen:
187
+ seen.add(entity.id)
188
+ unique_entities.append(entity)
189
+
190
+ return unique_entities[:limit]
191
+
192
+ except Exception as e:
193
+ logger.error(f"Failed to retrieve knowledge: {e}")
194
+ return []
195
+
196
+ async def _get_session_entities(self, session_id: str) -> List[Entity]:
197
+ """Get all entities mentioned in this session."""
198
+ try:
199
+ session_entity_id = f"session_{session_id}"
200
+
201
+ # Get session entity
202
+ session_entity = await self.graph_store.get_entity(session_entity_id)
203
+ if not session_entity:
204
+ return []
205
+
206
+ # Get all entities with MENTIONED_IN relation to this session
207
+ # Note: We need to traverse backwards from session to entities
208
+ # get_neighbors only accepts single relation_type, not a list
209
+ # neighbors = await self.graph_store.get_neighbors(
210
+ # session_entity_id,
211
+ # relation_type="MENTIONED_IN",
212
+ # direction="incoming" # Get entities that point TO the session
213
+ # ) # Reserved for future use
214
+
215
+ # Neighbors are entities that have MENTIONED_IN relation to session
216
+ # We need to get entities that point TO the session
217
+ # This requires iterating through all entities (not ideal, but
218
+ # functional)
219
+
220
+ # For now, return empty - proper implementation would require
221
+ # inverse index or traversal from session
222
+ # This is a simplified implementation
223
+ return []
224
+
225
+ except Exception as e:
226
+ logger.error(f"Failed to get session entities: {e}")
227
+ return []
228
+
229
+ async def add_graph_conversation_context(
230
+ self,
231
+ session_id: str,
232
+ entity_ids: List[str],
233
+ metadata: Optional[Dict[str, Any]] = None,
234
+ ) -> bool:
235
+ """
236
+ Add graph-based context to conversation.
237
+
238
+ Links specific entities to the current conversation session,
239
+ providing additional context for the agent.
240
+
241
+ Args:
242
+ session_id: Session identifier
243
+ entity_ids: List of entity IDs to link to session
244
+ metadata: Optional metadata about the context
245
+
246
+ Returns:
247
+ True if successful, False otherwise
248
+
249
+ Example:
250
+ # Add context entities to conversation
251
+ await context_engine.add_graph_conversation_context(
252
+ session_id="session_1",
253
+ entity_ids=["person_alice", "company_techcorp"],
254
+ metadata={"context_type": "background_knowledge"}
255
+ )
256
+ """
257
+ if not hasattr(self, "graph_store") or self.graph_store is None:
258
+ logger.warning("GraphStore not available, cannot add graph context")
259
+ return False
260
+
261
+ try:
262
+ session_entity_id = f"session_{session_id}"
263
+
264
+ # Ensure session entity exists
265
+ session_entity = await self.graph_store.get_entity(session_entity_id)
266
+ if not session_entity:
267
+ session_entity = Entity(
268
+ id=session_entity_id,
269
+ entity_type="Session",
270
+ properties={
271
+ "session_id": session_id,
272
+ "created_at": datetime.utcnow().isoformat(),
273
+ },
274
+ )
275
+ await self.graph_store.add_entity(session_entity)
276
+
277
+ # Link each entity to session
278
+ for entity_id in entity_ids:
279
+ # Verify entity exists
280
+ entity = await self.graph_store.get_entity(entity_id)
281
+ if not entity:
282
+ logger.warning(f"Entity {entity_id} not found, skipping")
283
+ continue
284
+
285
+ # Create CONTEXT_FOR relation
286
+ relation = Relation(
287
+ id=f"context_{entity_id}_{session_id}_{datetime.utcnow().timestamp()}",
288
+ source_id=entity_id,
289
+ target_id=session_entity_id,
290
+ relation_type="CONTEXT_FOR",
291
+ properties={
292
+ "timestamp": datetime.utcnow().isoformat(),
293
+ "metadata": metadata or {},
294
+ },
295
+ )
296
+ await self.graph_store.add_relation(relation)
297
+
298
+ logger.info(f"Added {len(entity_ids)} entities as context for session {session_id}")
299
+ return True
300
+
301
+ except Exception as e:
302
+ logger.error(f"Failed to add graph conversation context: {e}")
303
+ return False
304
+
305
+ async def get_session_knowledge_graph(
306
+ self, session_id: str, max_depth: int = 2
307
+ ) -> Dict[str, Any]:
308
+ """
309
+ Get a subgraph of knowledge relevant to this session.
310
+
311
+ Returns entities and relations mentioned or used as context
312
+ in this session, up to a specified depth.
313
+
314
+ Args:
315
+ session_id: Session identifier
316
+ max_depth: Maximum depth for graph traversal
317
+
318
+ Returns:
319
+ Dictionary with 'entities' and 'relations' lists
320
+
321
+ Example:
322
+ # Get knowledge graph for session
323
+ subgraph = await context_engine.get_session_knowledge_graph(
324
+ session_id="session_1",
325
+ max_depth=2
326
+ )
327
+ print(f"Entities: {len(subgraph['entities'])}")
328
+ print(f"Relations: {len(subgraph['relations'])}")
329
+ """
330
+ if not hasattr(self, "graph_store") or self.graph_store is None:
331
+ logger.warning("GraphStore not available")
332
+ return {"entities": [], "relations": []}
333
+
334
+ try:
335
+ session_entity_id = f"session_{session_id}"
336
+
337
+ # Get session entity
338
+ session_entity = await self.graph_store.get_entity(session_entity_id)
339
+ if not session_entity:
340
+ return {"entities": [], "relations": []}
341
+
342
+ entities = [session_entity]
343
+ relations = []
344
+ visited = {session_entity_id}
345
+
346
+ # Traverse from session entity
347
+ current_level = [session_entity_id]
348
+
349
+ for depth in range(max_depth):
350
+ next_level = []
351
+
352
+ for entity_id in current_level:
353
+ # Get neighbors (check both relation types separately)
354
+ neighbors_mentioned = await self.graph_store.get_neighbors(
355
+ entity_id,
356
+ relation_type="MENTIONED_IN",
357
+ direction="both",
358
+ )
359
+ neighbors_context = await self.graph_store.get_neighbors(
360
+ entity_id,
361
+ relation_type="CONTEXT_FOR",
362
+ direction="both",
363
+ )
364
+ # Combine and deduplicate
365
+ neighbors = list(
366
+ {n.id: n for n in neighbors_mentioned + neighbors_context}.values()
367
+ )
368
+
369
+ for neighbor in neighbors:
370
+ if neighbor.id not in visited:
371
+ visited.add(neighbor.id)
372
+ entities.append(neighbor)
373
+ next_level.append(neighbor.id)
374
+
375
+ # Note: In a complete implementation, we'd also collect
376
+ # the relations between entities here
377
+
378
+ current_level = next_level
379
+ if not current_level:
380
+ break
381
+
382
+ return {
383
+ "entities": [e.model_dump() for e in entities],
384
+ "relations": relations, # Would be populated in full implementation
385
+ }
386
+
387
+ except Exception as e:
388
+ logger.error(f"Failed to get session knowledge graph: {e}")
389
+ return {"entities": [], "relations": []}
390
+
391
+ async def clear_session_knowledge(self, session_id: str, remove_entities: bool = False) -> bool:
392
+ """
393
+ Clear knowledge graph associations for a session.
394
+
395
+ Args:
396
+ session_id: Session identifier
397
+ remove_entities: If True, also remove the session entity itself
398
+
399
+ Returns:
400
+ True if successful, False otherwise
401
+ """
402
+ if not hasattr(self, "graph_store") or self.graph_store is None:
403
+ logger.warning("GraphStore not available")
404
+ return False
405
+
406
+ try:
407
+ session_entity_id = f"session_{session_id}"
408
+
409
+ if remove_entities:
410
+ # Check if delete_entity method exists (SQLite has it, InMemory
411
+ # might not)
412
+ if hasattr(self.graph_store, "delete_entity"):
413
+ await self.graph_store.delete_entity(session_entity_id)
414
+ logger.info(f"Removed session entity {session_entity_id}")
415
+ else:
416
+ # For InMemoryGraphStore, we can't easily delete entities
417
+ # Just log a warning
418
+ logger.warning(
419
+ f"delete_entity not available for {type(self.graph_store).__name__}, "
420
+ f"session entity {session_entity_id} not removed"
421
+ )
422
+
423
+ return True
424
+
425
+ except Exception as e:
426
+ logger.error(f"Failed to clear session knowledge: {e}")
427
+ return False
428
+
429
+
430
+ class ContextEngineWithGraph(GraphMemoryMixin):
431
+ """
432
+ ContextEngine extended with graph memory capabilities.
433
+
434
+ This class can be used as a standalone context engine with graph support,
435
+ or as a mixin to extend existing ContextEngine instances.
436
+
437
+ Example:
438
+ from aiecs.domain.context import ContextEngine
439
+ from aiecs.domain.context.graph_memory import ContextEngineWithGraph
440
+ from aiecs.infrastructure.graph_storage import InMemoryGraphStore
441
+
442
+ # Create graph store
443
+ graph_store = InMemoryGraphStore()
444
+ await graph_store.initialize()
445
+
446
+ # Create context engine with graph support
447
+ # Note: Actual usage would involve proper inheritance or composition
448
+ context_engine = ContextEngine()
449
+ context_engine.graph_store = graph_store
450
+ await context_engine.initialize()
451
+
452
+ # Now you can use graph memory methods
453
+ await context_engine.store_knowledge(session_id, entity)
454
+ """
455
+
456
+ def __init__(self, graph_store: Optional[GraphStore] = None):
457
+ """
458
+ Initialize with optional graph store.
459
+
460
+ Args:
461
+ graph_store: Optional knowledge graph store
462
+ """
463
+ self.graph_store = graph_store
464
+ logger.info(
465
+ f"ContextEngineWithGraph initialized with graph_store="
466
+ f"{'enabled' if graph_store else 'disabled'}"
467
+ )
@@ -0,0 +1,12 @@
1
+ """Execution domain module
2
+
3
+ Contains execution-related business logic and models.
4
+ """
5
+
6
+ from .model import TaskStepResult, TaskStatus, ErrorCode
7
+
8
+ __all__ = [
9
+ "TaskStepResult",
10
+ "TaskStatus",
11
+ "ErrorCode",
12
+ ]
@@ -0,0 +1,57 @@
1
+ from enum import Enum
2
+ from typing import Any, Dict, Optional
3
+
4
+
5
+ class TaskStatus(Enum):
6
+ PENDING = "pending"
7
+ RUNNING = "running"
8
+ COMPLETED = "completed"
9
+ CANCELLED = "cancelled"
10
+ TIMED_OUT = "timed_out"
11
+ FAILED = "failed"
12
+
13
+
14
+ class ErrorCode(Enum):
15
+ VALIDATION_ERROR = "E001"
16
+ TIMEOUT_ERROR = "E002"
17
+ EXECUTION_ERROR = "E003"
18
+ CANCELLED_ERROR = "E004"
19
+ RETRY_EXHAUSTED = "E005"
20
+ DATABASE_ERROR = "E006"
21
+ DSL_EVALUATION_ERROR = "E007"
22
+
23
+
24
+ class TaskStepResult:
25
+ """Task step result model"""
26
+
27
+ def __init__(
28
+ self,
29
+ step: str,
30
+ result: Any,
31
+ completed: bool = False,
32
+ message: str = "",
33
+ status: str = "pending",
34
+ error_code: Optional[str] = None,
35
+ error_message: Optional[str] = None,
36
+ ):
37
+ self.step = step
38
+ self.result = result
39
+ self.completed = completed
40
+ self.message = message
41
+ self.status = status
42
+ self.error_code = error_code
43
+ self.error_message = error_message
44
+
45
+ def dict(self) -> Dict[str, Any]:
46
+ return {
47
+ "step": self.step,
48
+ "result": self.result,
49
+ "completed": self.completed,
50
+ "message": self.message,
51
+ "status": self.status,
52
+ "error_code": self.error_code,
53
+ "error_message": self.error_message,
54
+ }
55
+
56
+ def __repr__(self) -> str:
57
+ return f"TaskStepResult(step='{self.step}', status='{self.status}', completed={self.completed})"
@@ -0,0 +1,19 @@
1
+ """
2
+ Knowledge Graph Domain Layer
3
+
4
+ This module contains the domain models and business logic for the knowledge graph capability.
5
+ It provides entity models, relation models, schema definitions, and graph query abstractions.
6
+ """
7
+
8
+ from aiecs.domain.knowledge_graph.models.entity import Entity
9
+ from aiecs.domain.knowledge_graph.models.relation import Relation
10
+ from aiecs.domain.knowledge_graph.models.path import Path
11
+ from aiecs.domain.knowledge_graph.models.query import GraphQuery, GraphResult
12
+
13
+ __all__ = [
14
+ "Entity",
15
+ "Relation",
16
+ "Path",
17
+ "GraphQuery",
18
+ "GraphResult",
19
+ ]
@@ -0,0 +1,52 @@
1
+ """
2
+ Knowledge Graph Domain Models
3
+
4
+ Core domain models for knowledge graph entities, relations, and queries.
5
+ """
6
+
7
+ from aiecs.domain.knowledge_graph.models.entity import Entity
8
+ from aiecs.domain.knowledge_graph.models.relation import Relation
9
+ from aiecs.domain.knowledge_graph.models.path import Path
10
+ from aiecs.domain.knowledge_graph.models.path_pattern import (
11
+ PathPattern,
12
+ TraversalDirection,
13
+ )
14
+ from aiecs.domain.knowledge_graph.models.query import GraphQuery, GraphResult
15
+ from aiecs.domain.knowledge_graph.models.query_plan import (
16
+ QueryPlan,
17
+ QueryStep,
18
+ QueryOperation,
19
+ OptimizationStrategy,
20
+ )
21
+ from aiecs.domain.knowledge_graph.models.evidence import (
22
+ Evidence,
23
+ EvidenceType,
24
+ ReasoningResult,
25
+ )
26
+ from aiecs.domain.knowledge_graph.models.inference_rule import (
27
+ InferenceRule,
28
+ InferenceStep,
29
+ InferenceResult,
30
+ RuleType,
31
+ )
32
+
33
+ __all__ = [
34
+ "Entity",
35
+ "Relation",
36
+ "Path",
37
+ "PathPattern",
38
+ "TraversalDirection",
39
+ "GraphQuery",
40
+ "GraphResult",
41
+ "QueryPlan",
42
+ "QueryStep",
43
+ "QueryOperation",
44
+ "OptimizationStrategy",
45
+ "Evidence",
46
+ "EvidenceType",
47
+ "ReasoningResult",
48
+ "InferenceRule",
49
+ "InferenceStep",
50
+ "InferenceResult",
51
+ "RuleType",
52
+ ]