aiecs 1.0.1__py3-none-any.whl → 1.7.17__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.

Potentially problematic release.


This version of aiecs might be problematic. Click here for more details.

Files changed (340) hide show
  1. aiecs/__init__.py +13 -16
  2. aiecs/__main__.py +7 -7
  3. aiecs/aiecs_client.py +269 -75
  4. aiecs/application/executors/operation_executor.py +79 -54
  5. aiecs/application/knowledge_graph/__init__.py +7 -0
  6. aiecs/application/knowledge_graph/builder/__init__.py +37 -0
  7. aiecs/application/knowledge_graph/builder/data_quality.py +302 -0
  8. aiecs/application/knowledge_graph/builder/data_reshaping.py +293 -0
  9. aiecs/application/knowledge_graph/builder/document_builder.py +369 -0
  10. aiecs/application/knowledge_graph/builder/graph_builder.py +490 -0
  11. aiecs/application/knowledge_graph/builder/import_optimizer.py +396 -0
  12. aiecs/application/knowledge_graph/builder/schema_inference.py +462 -0
  13. aiecs/application/knowledge_graph/builder/schema_mapping.py +563 -0
  14. aiecs/application/knowledge_graph/builder/structured_pipeline.py +1384 -0
  15. aiecs/application/knowledge_graph/builder/text_chunker.py +317 -0
  16. aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
  17. aiecs/application/knowledge_graph/extractors/base.py +98 -0
  18. aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +422 -0
  19. aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +347 -0
  20. aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +241 -0
  21. aiecs/application/knowledge_graph/fusion/__init__.py +78 -0
  22. aiecs/application/knowledge_graph/fusion/ab_testing.py +395 -0
  23. aiecs/application/knowledge_graph/fusion/abbreviation_expander.py +327 -0
  24. aiecs/application/knowledge_graph/fusion/alias_index.py +597 -0
  25. aiecs/application/knowledge_graph/fusion/alias_matcher.py +384 -0
  26. aiecs/application/knowledge_graph/fusion/cache_coordinator.py +343 -0
  27. aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +433 -0
  28. aiecs/application/knowledge_graph/fusion/entity_linker.py +511 -0
  29. aiecs/application/knowledge_graph/fusion/evaluation_dataset.py +240 -0
  30. aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +632 -0
  31. aiecs/application/knowledge_graph/fusion/matching_config.py +489 -0
  32. aiecs/application/knowledge_graph/fusion/name_normalizer.py +352 -0
  33. aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +183 -0
  34. aiecs/application/knowledge_graph/fusion/semantic_name_matcher.py +464 -0
  35. aiecs/application/knowledge_graph/fusion/similarity_pipeline.py +534 -0
  36. aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
  37. aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +342 -0
  38. aiecs/application/knowledge_graph/pattern_matching/query_executor.py +366 -0
  39. aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
  40. aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +195 -0
  41. aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
  42. aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
  43. aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +341 -0
  44. aiecs/application/knowledge_graph/reasoning/inference_engine.py +500 -0
  45. aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +163 -0
  46. aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
  47. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
  48. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +913 -0
  49. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +866 -0
  50. aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +475 -0
  51. aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +396 -0
  52. aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +208 -0
  53. aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +170 -0
  54. aiecs/application/knowledge_graph/reasoning/query_planner.py +855 -0
  55. aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +518 -0
  56. aiecs/application/knowledge_graph/retrieval/__init__.py +27 -0
  57. aiecs/application/knowledge_graph/retrieval/query_intent_classifier.py +211 -0
  58. aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +592 -0
  59. aiecs/application/knowledge_graph/retrieval/strategy_types.py +23 -0
  60. aiecs/application/knowledge_graph/search/__init__.py +59 -0
  61. aiecs/application/knowledge_graph/search/hybrid_search.py +457 -0
  62. aiecs/application/knowledge_graph/search/reranker.py +293 -0
  63. aiecs/application/knowledge_graph/search/reranker_strategies.py +535 -0
  64. aiecs/application/knowledge_graph/search/text_similarity.py +392 -0
  65. aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
  66. aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +305 -0
  67. aiecs/application/knowledge_graph/traversal/path_scorer.py +271 -0
  68. aiecs/application/knowledge_graph/validators/__init__.py +13 -0
  69. aiecs/application/knowledge_graph/validators/relation_validator.py +239 -0
  70. aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
  71. aiecs/application/knowledge_graph/visualization/graph_visualizer.py +313 -0
  72. aiecs/common/__init__.py +9 -0
  73. aiecs/common/knowledge_graph/__init__.py +17 -0
  74. aiecs/common/knowledge_graph/runnable.py +471 -0
  75. aiecs/config/__init__.py +20 -5
  76. aiecs/config/config.py +762 -31
  77. aiecs/config/graph_config.py +131 -0
  78. aiecs/config/tool_config.py +435 -0
  79. aiecs/core/__init__.py +29 -13
  80. aiecs/core/interface/__init__.py +2 -2
  81. aiecs/core/interface/execution_interface.py +22 -22
  82. aiecs/core/interface/storage_interface.py +37 -88
  83. aiecs/core/registry/__init__.py +31 -0
  84. aiecs/core/registry/service_registry.py +92 -0
  85. aiecs/domain/__init__.py +270 -1
  86. aiecs/domain/agent/__init__.py +191 -0
  87. aiecs/domain/agent/base_agent.py +3949 -0
  88. aiecs/domain/agent/exceptions.py +99 -0
  89. aiecs/domain/agent/graph_aware_mixin.py +569 -0
  90. aiecs/domain/agent/hybrid_agent.py +1731 -0
  91. aiecs/domain/agent/integration/__init__.py +29 -0
  92. aiecs/domain/agent/integration/context_compressor.py +216 -0
  93. aiecs/domain/agent/integration/context_engine_adapter.py +587 -0
  94. aiecs/domain/agent/integration/protocols.py +281 -0
  95. aiecs/domain/agent/integration/retry_policy.py +218 -0
  96. aiecs/domain/agent/integration/role_config.py +213 -0
  97. aiecs/domain/agent/knowledge_aware_agent.py +1892 -0
  98. aiecs/domain/agent/lifecycle.py +291 -0
  99. aiecs/domain/agent/llm_agent.py +692 -0
  100. aiecs/domain/agent/memory/__init__.py +12 -0
  101. aiecs/domain/agent/memory/conversation.py +1124 -0
  102. aiecs/domain/agent/migration/__init__.py +14 -0
  103. aiecs/domain/agent/migration/conversion.py +163 -0
  104. aiecs/domain/agent/migration/legacy_wrapper.py +86 -0
  105. aiecs/domain/agent/models.py +894 -0
  106. aiecs/domain/agent/observability.py +479 -0
  107. aiecs/domain/agent/persistence.py +449 -0
  108. aiecs/domain/agent/prompts/__init__.py +29 -0
  109. aiecs/domain/agent/prompts/builder.py +159 -0
  110. aiecs/domain/agent/prompts/formatters.py +187 -0
  111. aiecs/domain/agent/prompts/template.py +255 -0
  112. aiecs/domain/agent/registry.py +253 -0
  113. aiecs/domain/agent/tool_agent.py +444 -0
  114. aiecs/domain/agent/tools/__init__.py +15 -0
  115. aiecs/domain/agent/tools/schema_generator.py +377 -0
  116. aiecs/domain/community/__init__.py +155 -0
  117. aiecs/domain/community/agent_adapter.py +469 -0
  118. aiecs/domain/community/analytics.py +432 -0
  119. aiecs/domain/community/collaborative_workflow.py +648 -0
  120. aiecs/domain/community/communication_hub.py +634 -0
  121. aiecs/domain/community/community_builder.py +320 -0
  122. aiecs/domain/community/community_integration.py +796 -0
  123. aiecs/domain/community/community_manager.py +803 -0
  124. aiecs/domain/community/decision_engine.py +849 -0
  125. aiecs/domain/community/exceptions.py +231 -0
  126. aiecs/domain/community/models/__init__.py +33 -0
  127. aiecs/domain/community/models/community_models.py +234 -0
  128. aiecs/domain/community/resource_manager.py +461 -0
  129. aiecs/domain/community/shared_context_manager.py +589 -0
  130. aiecs/domain/context/__init__.py +40 -10
  131. aiecs/domain/context/context_engine.py +1910 -0
  132. aiecs/domain/context/conversation_models.py +87 -53
  133. aiecs/domain/context/graph_memory.py +582 -0
  134. aiecs/domain/execution/model.py +12 -4
  135. aiecs/domain/knowledge_graph/__init__.py +19 -0
  136. aiecs/domain/knowledge_graph/models/__init__.py +52 -0
  137. aiecs/domain/knowledge_graph/models/entity.py +148 -0
  138. aiecs/domain/knowledge_graph/models/evidence.py +178 -0
  139. aiecs/domain/knowledge_graph/models/inference_rule.py +184 -0
  140. aiecs/domain/knowledge_graph/models/path.py +171 -0
  141. aiecs/domain/knowledge_graph/models/path_pattern.py +171 -0
  142. aiecs/domain/knowledge_graph/models/query.py +261 -0
  143. aiecs/domain/knowledge_graph/models/query_plan.py +181 -0
  144. aiecs/domain/knowledge_graph/models/relation.py +202 -0
  145. aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
  146. aiecs/domain/knowledge_graph/schema/entity_type.py +131 -0
  147. aiecs/domain/knowledge_graph/schema/graph_schema.py +253 -0
  148. aiecs/domain/knowledge_graph/schema/property_schema.py +143 -0
  149. aiecs/domain/knowledge_graph/schema/relation_type.py +163 -0
  150. aiecs/domain/knowledge_graph/schema/schema_manager.py +691 -0
  151. aiecs/domain/knowledge_graph/schema/type_enums.py +209 -0
  152. aiecs/domain/task/dsl_processor.py +172 -56
  153. aiecs/domain/task/model.py +20 -8
  154. aiecs/domain/task/task_context.py +27 -24
  155. aiecs/infrastructure/__init__.py +0 -2
  156. aiecs/infrastructure/graph_storage/__init__.py +11 -0
  157. aiecs/infrastructure/graph_storage/base.py +837 -0
  158. aiecs/infrastructure/graph_storage/batch_operations.py +458 -0
  159. aiecs/infrastructure/graph_storage/cache.py +424 -0
  160. aiecs/infrastructure/graph_storage/distributed.py +223 -0
  161. aiecs/infrastructure/graph_storage/error_handling.py +380 -0
  162. aiecs/infrastructure/graph_storage/graceful_degradation.py +294 -0
  163. aiecs/infrastructure/graph_storage/health_checks.py +378 -0
  164. aiecs/infrastructure/graph_storage/in_memory.py +1197 -0
  165. aiecs/infrastructure/graph_storage/index_optimization.py +446 -0
  166. aiecs/infrastructure/graph_storage/lazy_loading.py +431 -0
  167. aiecs/infrastructure/graph_storage/metrics.py +344 -0
  168. aiecs/infrastructure/graph_storage/migration.py +400 -0
  169. aiecs/infrastructure/graph_storage/pagination.py +483 -0
  170. aiecs/infrastructure/graph_storage/performance_monitoring.py +456 -0
  171. aiecs/infrastructure/graph_storage/postgres.py +1563 -0
  172. aiecs/infrastructure/graph_storage/property_storage.py +353 -0
  173. aiecs/infrastructure/graph_storage/protocols.py +76 -0
  174. aiecs/infrastructure/graph_storage/query_optimizer.py +642 -0
  175. aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
  176. aiecs/infrastructure/graph_storage/sqlite.py +1373 -0
  177. aiecs/infrastructure/graph_storage/streaming.py +487 -0
  178. aiecs/infrastructure/graph_storage/tenant.py +412 -0
  179. aiecs/infrastructure/messaging/celery_task_manager.py +92 -54
  180. aiecs/infrastructure/messaging/websocket_manager.py +51 -35
  181. aiecs/infrastructure/monitoring/__init__.py +22 -0
  182. aiecs/infrastructure/monitoring/executor_metrics.py +45 -11
  183. aiecs/infrastructure/monitoring/global_metrics_manager.py +212 -0
  184. aiecs/infrastructure/monitoring/structured_logger.py +3 -7
  185. aiecs/infrastructure/monitoring/tracing_manager.py +63 -35
  186. aiecs/infrastructure/persistence/__init__.py +14 -1
  187. aiecs/infrastructure/persistence/context_engine_client.py +184 -0
  188. aiecs/infrastructure/persistence/database_manager.py +67 -43
  189. aiecs/infrastructure/persistence/file_storage.py +180 -103
  190. aiecs/infrastructure/persistence/redis_client.py +74 -21
  191. aiecs/llm/__init__.py +73 -25
  192. aiecs/llm/callbacks/__init__.py +11 -0
  193. aiecs/llm/{custom_callbacks.py → callbacks/custom_callbacks.py} +26 -19
  194. aiecs/llm/client_factory.py +230 -37
  195. aiecs/llm/client_resolver.py +155 -0
  196. aiecs/llm/clients/__init__.py +38 -0
  197. aiecs/llm/clients/base_client.py +328 -0
  198. aiecs/llm/clients/google_function_calling_mixin.py +415 -0
  199. aiecs/llm/clients/googleai_client.py +314 -0
  200. aiecs/llm/clients/openai_client.py +158 -0
  201. aiecs/llm/clients/openai_compatible_mixin.py +367 -0
  202. aiecs/llm/clients/vertex_client.py +1186 -0
  203. aiecs/llm/clients/xai_client.py +201 -0
  204. aiecs/llm/config/__init__.py +51 -0
  205. aiecs/llm/config/config_loader.py +272 -0
  206. aiecs/llm/config/config_validator.py +206 -0
  207. aiecs/llm/config/model_config.py +143 -0
  208. aiecs/llm/protocols.py +149 -0
  209. aiecs/llm/utils/__init__.py +10 -0
  210. aiecs/llm/utils/validate_config.py +89 -0
  211. aiecs/main.py +140 -121
  212. aiecs/scripts/aid/VERSION_MANAGEMENT.md +138 -0
  213. aiecs/scripts/aid/__init__.py +19 -0
  214. aiecs/scripts/aid/module_checker.py +499 -0
  215. aiecs/scripts/aid/version_manager.py +235 -0
  216. aiecs/scripts/{DEPENDENCY_SYSTEM_SUMMARY.md → dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md} +1 -0
  217. aiecs/scripts/{README_DEPENDENCY_CHECKER.md → dependance_check/README_DEPENDENCY_CHECKER.md} +1 -0
  218. aiecs/scripts/dependance_check/__init__.py +15 -0
  219. aiecs/scripts/dependance_check/dependency_checker.py +1835 -0
  220. aiecs/scripts/{dependency_fixer.py → dependance_check/dependency_fixer.py} +192 -90
  221. aiecs/scripts/{download_nlp_data.py → dependance_check/download_nlp_data.py} +203 -71
  222. aiecs/scripts/dependance_patch/__init__.py +7 -0
  223. aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
  224. aiecs/scripts/{fix_weasel_validator.py → dependance_patch/fix_weasel/fix_weasel_validator.py} +21 -14
  225. aiecs/scripts/{patch_weasel_library.sh → dependance_patch/fix_weasel/patch_weasel_library.sh} +1 -1
  226. aiecs/scripts/knowledge_graph/__init__.py +3 -0
  227. aiecs/scripts/knowledge_graph/run_threshold_experiments.py +212 -0
  228. aiecs/scripts/migrations/multi_tenancy/README.md +142 -0
  229. aiecs/scripts/tools_develop/README.md +671 -0
  230. aiecs/scripts/tools_develop/README_CONFIG_CHECKER.md +273 -0
  231. aiecs/scripts/tools_develop/TOOLS_CONFIG_GUIDE.md +1287 -0
  232. aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
  233. aiecs/scripts/tools_develop/__init__.py +21 -0
  234. aiecs/scripts/tools_develop/check_all_tools_config.py +548 -0
  235. aiecs/scripts/tools_develop/check_type_annotations.py +257 -0
  236. aiecs/scripts/tools_develop/pre-commit-schema-coverage.sh +66 -0
  237. aiecs/scripts/tools_develop/schema_coverage.py +511 -0
  238. aiecs/scripts/tools_develop/validate_tool_schemas.py +475 -0
  239. aiecs/scripts/tools_develop/verify_executor_config_fix.py +98 -0
  240. aiecs/scripts/tools_develop/verify_tools.py +352 -0
  241. aiecs/tasks/__init__.py +0 -1
  242. aiecs/tasks/worker.py +115 -47
  243. aiecs/tools/__init__.py +194 -72
  244. aiecs/tools/apisource/__init__.py +99 -0
  245. aiecs/tools/apisource/intelligence/__init__.py +19 -0
  246. aiecs/tools/apisource/intelligence/data_fusion.py +632 -0
  247. aiecs/tools/apisource/intelligence/query_analyzer.py +417 -0
  248. aiecs/tools/apisource/intelligence/search_enhancer.py +385 -0
  249. aiecs/tools/apisource/monitoring/__init__.py +9 -0
  250. aiecs/tools/apisource/monitoring/metrics.py +330 -0
  251. aiecs/tools/apisource/providers/__init__.py +112 -0
  252. aiecs/tools/apisource/providers/base.py +671 -0
  253. aiecs/tools/apisource/providers/census.py +397 -0
  254. aiecs/tools/apisource/providers/fred.py +535 -0
  255. aiecs/tools/apisource/providers/newsapi.py +409 -0
  256. aiecs/tools/apisource/providers/worldbank.py +352 -0
  257. aiecs/tools/apisource/reliability/__init__.py +12 -0
  258. aiecs/tools/apisource/reliability/error_handler.py +363 -0
  259. aiecs/tools/apisource/reliability/fallback_strategy.py +376 -0
  260. aiecs/tools/apisource/tool.py +832 -0
  261. aiecs/tools/apisource/utils/__init__.py +9 -0
  262. aiecs/tools/apisource/utils/validators.py +334 -0
  263. aiecs/tools/base_tool.py +415 -21
  264. aiecs/tools/docs/__init__.py +121 -0
  265. aiecs/tools/docs/ai_document_orchestrator.py +607 -0
  266. aiecs/tools/docs/ai_document_writer_orchestrator.py +2350 -0
  267. aiecs/tools/docs/content_insertion_tool.py +1320 -0
  268. aiecs/tools/docs/document_creator_tool.py +1464 -0
  269. aiecs/tools/docs/document_layout_tool.py +1160 -0
  270. aiecs/tools/docs/document_parser_tool.py +1016 -0
  271. aiecs/tools/docs/document_writer_tool.py +2008 -0
  272. aiecs/tools/knowledge_graph/__init__.py +17 -0
  273. aiecs/tools/knowledge_graph/graph_reasoning_tool.py +807 -0
  274. aiecs/tools/knowledge_graph/graph_search_tool.py +944 -0
  275. aiecs/tools/knowledge_graph/kg_builder_tool.py +524 -0
  276. aiecs/tools/langchain_adapter.py +300 -138
  277. aiecs/tools/schema_generator.py +455 -0
  278. aiecs/tools/search_tool/__init__.py +100 -0
  279. aiecs/tools/search_tool/analyzers.py +581 -0
  280. aiecs/tools/search_tool/cache.py +264 -0
  281. aiecs/tools/search_tool/constants.py +128 -0
  282. aiecs/tools/search_tool/context.py +224 -0
  283. aiecs/tools/search_tool/core.py +778 -0
  284. aiecs/tools/search_tool/deduplicator.py +119 -0
  285. aiecs/tools/search_tool/error_handler.py +242 -0
  286. aiecs/tools/search_tool/metrics.py +343 -0
  287. aiecs/tools/search_tool/rate_limiter.py +172 -0
  288. aiecs/tools/search_tool/schemas.py +275 -0
  289. aiecs/tools/statistics/__init__.py +80 -0
  290. aiecs/tools/statistics/ai_data_analysis_orchestrator.py +646 -0
  291. aiecs/tools/statistics/ai_insight_generator_tool.py +508 -0
  292. aiecs/tools/statistics/ai_report_orchestrator_tool.py +684 -0
  293. aiecs/tools/statistics/data_loader_tool.py +555 -0
  294. aiecs/tools/statistics/data_profiler_tool.py +638 -0
  295. aiecs/tools/statistics/data_transformer_tool.py +580 -0
  296. aiecs/tools/statistics/data_visualizer_tool.py +498 -0
  297. aiecs/tools/statistics/model_trainer_tool.py +507 -0
  298. aiecs/tools/statistics/statistical_analyzer_tool.py +472 -0
  299. aiecs/tools/task_tools/__init__.py +49 -36
  300. aiecs/tools/task_tools/chart_tool.py +200 -184
  301. aiecs/tools/task_tools/classfire_tool.py +268 -267
  302. aiecs/tools/task_tools/image_tool.py +220 -141
  303. aiecs/tools/task_tools/office_tool.py +226 -146
  304. aiecs/tools/task_tools/pandas_tool.py +477 -121
  305. aiecs/tools/task_tools/report_tool.py +390 -142
  306. aiecs/tools/task_tools/research_tool.py +149 -79
  307. aiecs/tools/task_tools/scraper_tool.py +339 -145
  308. aiecs/tools/task_tools/stats_tool.py +448 -209
  309. aiecs/tools/temp_file_manager.py +26 -24
  310. aiecs/tools/tool_executor/__init__.py +18 -16
  311. aiecs/tools/tool_executor/tool_executor.py +364 -52
  312. aiecs/utils/LLM_output_structor.py +74 -48
  313. aiecs/utils/__init__.py +14 -3
  314. aiecs/utils/base_callback.py +0 -3
  315. aiecs/utils/cache_provider.py +696 -0
  316. aiecs/utils/execution_utils.py +50 -31
  317. aiecs/utils/prompt_loader.py +1 -0
  318. aiecs/utils/token_usage_repository.py +37 -11
  319. aiecs/ws/socket_server.py +14 -4
  320. {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/METADATA +52 -15
  321. aiecs-1.7.17.dist-info/RECORD +337 -0
  322. aiecs-1.7.17.dist-info/entry_points.txt +13 -0
  323. aiecs/config/registry.py +0 -19
  324. aiecs/domain/context/content_engine.py +0 -982
  325. aiecs/llm/base_client.py +0 -99
  326. aiecs/llm/openai_client.py +0 -125
  327. aiecs/llm/vertex_client.py +0 -186
  328. aiecs/llm/xai_client.py +0 -184
  329. aiecs/scripts/dependency_checker.py +0 -857
  330. aiecs/scripts/quick_dependency_check.py +0 -269
  331. aiecs/tools/task_tools/search_api.py +0 -7
  332. aiecs-1.0.1.dist-info/RECORD +0 -90
  333. aiecs-1.0.1.dist-info/entry_points.txt +0 -7
  334. /aiecs/scripts/{setup_nlp_data.sh → dependance_check/setup_nlp_data.sh} +0 -0
  335. /aiecs/scripts/{README_WEASEL_PATCH.md → dependance_patch/fix_weasel/README_WEASEL_PATCH.md} +0 -0
  336. /aiecs/scripts/{fix_weasel_validator.sh → dependance_patch/fix_weasel/fix_weasel_validator.sh} +0 -0
  337. /aiecs/scripts/{run_weasel_patch.sh → dependance_patch/fix_weasel/run_weasel_patch.sh} +0 -0
  338. {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/WHEEL +0 -0
  339. {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/licenses/LICENSE +0 -0
  340. {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,589 @@
1
+ """
2
+ Shared Context Manager
3
+
4
+ Manages shared memory and context for agents in a community,
5
+ with support for versioning, conflict resolution, and real-time streaming.
6
+ """
7
+
8
+ import logging
9
+ import asyncio
10
+ from datetime import datetime
11
+ from typing import Dict, List, Any, Optional, Set, Callable
12
+ from enum import Enum
13
+ from collections import defaultdict
14
+ import uuid
15
+ import copy
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+
20
+ class ContextScope(str, Enum):
21
+ """Scope levels for shared context."""
22
+
23
+ COMMUNITY = "community"
24
+ SESSION = "session"
25
+ TASK = "task"
26
+ AGENT = "agent"
27
+
28
+
29
+ class ConflictResolutionStrategy(str, Enum):
30
+ """Strategies for resolving context conflicts."""
31
+
32
+ LAST_WRITE_WINS = "last_write_wins"
33
+ FIRST_WRITE_WINS = "first_write_wins"
34
+ MERGE = "merge"
35
+ MANUAL = "manual"
36
+ TIMESTAMP_BASED = "timestamp_based"
37
+
38
+
39
+ class ContextVersion:
40
+ """Represents a version of context data."""
41
+
42
+ def __init__(
43
+ self,
44
+ context_id: str,
45
+ data: Dict[str, Any],
46
+ version_number: int,
47
+ author_id: str,
48
+ parent_version: Optional[int] = None,
49
+ ):
50
+ """
51
+ Initialize a context version.
52
+
53
+ Args:
54
+ context_id: ID of the context
55
+ data: Context data
56
+ version_number: Version number
57
+ author_id: ID of the author who created this version
58
+ parent_version: Optional parent version number
59
+ """
60
+ self.context_id = context_id
61
+ self.data = copy.deepcopy(data)
62
+ self.version_number = version_number
63
+ self.author_id = author_id
64
+ self.parent_version = parent_version
65
+ self.timestamp = datetime.utcnow()
66
+ self.metadata: Dict[str, Any] = {}
67
+
68
+
69
+ class SharedContext:
70
+ """Represents a shared context in the community."""
71
+
72
+ def __init__(
73
+ self,
74
+ context_id: str,
75
+ scope: ContextScope,
76
+ owner_id: str,
77
+ initial_data: Optional[Dict[str, Any]] = None,
78
+ ):
79
+ """
80
+ Initialize a shared context.
81
+
82
+ Args:
83
+ context_id: Unique context identifier
84
+ scope: Scope level of the context
85
+ owner_id: ID of the context owner
86
+ initial_data: Optional initial data
87
+ """
88
+ self.context_id = context_id
89
+ self.scope = scope
90
+ self.owner_id = owner_id
91
+ self.current_version = 0
92
+ self.versions: List[ContextVersion] = []
93
+ self.data = initial_data or {}
94
+ self.access_control: Set[str] = {owner_id} # IDs with access
95
+ self.subscribers: Set[str] = set() # IDs subscribed to updates
96
+ self.created_at = datetime.utcnow()
97
+ self.updated_at = datetime.utcnow()
98
+ self.metadata: Dict[str, Any] = {}
99
+
100
+ # Create initial version
101
+ if initial_data:
102
+ self._create_version(initial_data, owner_id)
103
+
104
+ def _create_version(self, data: Dict[str, Any], author_id: str) -> ContextVersion:
105
+ """Create a new version of the context."""
106
+ version = ContextVersion(
107
+ self.context_id,
108
+ data,
109
+ self.current_version + 1,
110
+ author_id,
111
+ self.current_version if self.current_version > 0 else None,
112
+ )
113
+ self.versions.append(version)
114
+ self.current_version = version.version_number
115
+ self.data = copy.deepcopy(data)
116
+ self.updated_at = datetime.utcnow()
117
+ return version
118
+
119
+
120
+ class SharedContextManager:
121
+ """
122
+ Manager for shared contexts in agent communities.
123
+ Provides versioning, conflict resolution, and streaming capabilities.
124
+ """
125
+
126
+ def __init__(
127
+ self,
128
+ default_conflict_strategy: ConflictResolutionStrategy = ConflictResolutionStrategy.LAST_WRITE_WINS,
129
+ ):
130
+ """
131
+ Initialize the shared context manager.
132
+
133
+ Args:
134
+ default_conflict_strategy: Default strategy for conflict resolution
135
+ """
136
+ self.contexts: Dict[str, SharedContext] = {}
137
+ self.default_conflict_strategy = default_conflict_strategy
138
+
139
+ # Scope-based indexes
140
+ self.community_contexts: Dict[str, Set[str]] = defaultdict(set)
141
+ self.session_contexts: Dict[str, Set[str]] = defaultdict(set)
142
+ self.task_contexts: Dict[str, Set[str]] = defaultdict(set)
143
+ self.agent_contexts: Dict[str, Set[str]] = defaultdict(set)
144
+
145
+ # Update callbacks for streaming
146
+ self.update_callbacks: Dict[str, List[Callable]] = defaultdict(list)
147
+
148
+ logger.info("Shared context manager initialized")
149
+
150
+ async def create_context(
151
+ self,
152
+ scope: ContextScope,
153
+ owner_id: str,
154
+ scope_id: str,
155
+ initial_data: Optional[Dict[str, Any]] = None,
156
+ access_control: Optional[Set[str]] = None,
157
+ ) -> str:
158
+ """
159
+ Create a new shared context.
160
+
161
+ Args:
162
+ scope: Scope level of the context
163
+ owner_id: ID of the context owner
164
+ scope_id: ID of the scope (community_id, session_id, task_id, or agent_id)
165
+ initial_data: Optional initial data
166
+ access_control: Optional set of agent IDs with access
167
+
168
+ Returns:
169
+ Context ID
170
+ """
171
+ context_id = str(uuid.uuid4())
172
+ context = SharedContext(context_id, scope, owner_id, initial_data)
173
+
174
+ if access_control:
175
+ context.access_control = access_control
176
+
177
+ self.contexts[context_id] = context
178
+
179
+ # Add to scope index
180
+ if scope == ContextScope.COMMUNITY:
181
+ self.community_contexts[scope_id].add(context_id)
182
+ elif scope == ContextScope.SESSION:
183
+ self.session_contexts[scope_id].add(context_id)
184
+ elif scope == ContextScope.TASK:
185
+ self.task_contexts[scope_id].add(context_id)
186
+ elif scope == ContextScope.AGENT:
187
+ self.agent_contexts[scope_id].add(context_id)
188
+
189
+ logger.info(f"Created {scope.value} context {context_id}")
190
+ return context_id
191
+
192
+ async def get_context(self, context_id: str, requester_id: str, version: Optional[int] = None) -> Optional[Dict[str, Any]]:
193
+ """
194
+ Get context data.
195
+
196
+ Args:
197
+ context_id: ID of the context
198
+ requester_id: ID of the requester
199
+ version: Optional specific version to retrieve
200
+
201
+ Returns:
202
+ Context data or None if not found/unauthorized
203
+ """
204
+ context = self.contexts.get(context_id)
205
+ if not context:
206
+ return None
207
+
208
+ # Check access control
209
+ if requester_id not in context.access_control:
210
+ logger.warning(f"Access denied for {requester_id} to context {context_id}")
211
+ return None
212
+
213
+ # Return specific version or current
214
+ if version is not None:
215
+ for v in context.versions:
216
+ if v.version_number == version:
217
+ return copy.deepcopy(v.data)
218
+ return None
219
+
220
+ return copy.deepcopy(context.data)
221
+
222
+ async def update_context(
223
+ self,
224
+ context_id: str,
225
+ updater_id: str,
226
+ updates: Dict[str, Any],
227
+ conflict_strategy: Optional[ConflictResolutionStrategy] = None,
228
+ create_version: bool = True,
229
+ ) -> bool:
230
+ """
231
+ Update context data with conflict resolution.
232
+
233
+ Args:
234
+ context_id: ID of the context
235
+ updater_id: ID of the updater
236
+ updates: Data updates
237
+ conflict_strategy: Optional conflict resolution strategy
238
+ create_version: Whether to create a new version
239
+
240
+ Returns:
241
+ True if update was successful
242
+ """
243
+ context = self.contexts.get(context_id)
244
+ if not context:
245
+ logger.error(f"Context {context_id} not found")
246
+ return False
247
+
248
+ # Check access control
249
+ if updater_id not in context.access_control:
250
+ logger.warning(f"Access denied for {updater_id} to update context {context_id}")
251
+ return False
252
+
253
+ # Apply updates with conflict resolution
254
+ strategy = conflict_strategy or self.default_conflict_strategy
255
+ merged_data = await self._resolve_conflicts(context.data, updates, strategy, context, updater_id)
256
+
257
+ # Create new version if requested
258
+ if create_version:
259
+ context._create_version(merged_data, updater_id)
260
+ else:
261
+ context.data = merged_data
262
+ context.updated_at = datetime.utcnow()
263
+
264
+ # Notify subscribers via streaming
265
+ await self._notify_subscribers(context_id, merged_data, updater_id)
266
+
267
+ logger.debug(f"Updated context {context_id} by {updater_id}")
268
+ return True
269
+
270
+ async def _resolve_conflicts(
271
+ self,
272
+ current_data: Dict[str, Any],
273
+ updates: Dict[str, Any],
274
+ strategy: ConflictResolutionStrategy,
275
+ context: SharedContext,
276
+ updater_id: str,
277
+ ) -> Dict[str, Any]:
278
+ """Resolve conflicts between current data and updates."""
279
+ if strategy == ConflictResolutionStrategy.LAST_WRITE_WINS:
280
+ # Simply apply updates over current data
281
+ merged = copy.deepcopy(current_data)
282
+ merged.update(updates)
283
+ return merged
284
+
285
+ elif strategy == ConflictResolutionStrategy.FIRST_WRITE_WINS:
286
+ # Only add new keys, don't override existing
287
+ merged = copy.deepcopy(current_data)
288
+ for key, value in updates.items():
289
+ if key not in merged:
290
+ merged[key] = value
291
+ return merged
292
+
293
+ elif strategy == ConflictResolutionStrategy.MERGE:
294
+ # Intelligent merge based on data types
295
+ merged = copy.deepcopy(current_data)
296
+ for key, new_value in updates.items():
297
+ if key in merged:
298
+ current_value = merged[key]
299
+ # Merge lists
300
+ if isinstance(current_value, list) and isinstance(new_value, list):
301
+ merged[key] = current_value + [item for item in new_value if item not in current_value]
302
+ # Merge dicts
303
+ elif isinstance(current_value, dict) and isinstance(new_value, dict):
304
+ merged[key] = {**current_value, **new_value}
305
+ # Otherwise, last write wins
306
+ else:
307
+ merged[key] = new_value
308
+ else:
309
+ merged[key] = new_value
310
+ return merged
311
+
312
+ elif strategy == ConflictResolutionStrategy.TIMESTAMP_BASED:
313
+ # Use timestamps to determine which update wins
314
+ merged = copy.deepcopy(current_data)
315
+ current_time = datetime.utcnow()
316
+ for key, value in updates.items():
317
+ if key not in merged or context.updated_at < current_time:
318
+ merged[key] = value
319
+ return merged
320
+
321
+ else: # MANUAL
322
+ # Return updates as-is and log conflict for manual resolution
323
+ logger.warning(f"Manual conflict resolution required for context {context.context_id}")
324
+ return copy.deepcopy(updates)
325
+
326
+ async def subscribe_to_context(
327
+ self,
328
+ context_id: str,
329
+ subscriber_id: str,
330
+ callback: Optional[Callable] = None,
331
+ ) -> bool:
332
+ """
333
+ Subscribe to context updates (streaming).
334
+
335
+ Args:
336
+ context_id: ID of the context
337
+ subscriber_id: ID of the subscriber
338
+ callback: Optional callback for updates
339
+
340
+ Returns:
341
+ True if subscription was successful
342
+ """
343
+ context = self.contexts.get(context_id)
344
+ if not context:
345
+ return False
346
+
347
+ # Check access control
348
+ if subscriber_id not in context.access_control:
349
+ logger.warning(f"Access denied for {subscriber_id} to subscribe to context {context_id}")
350
+ return False
351
+
352
+ context.subscribers.add(subscriber_id)
353
+
354
+ if callback:
355
+ self.update_callbacks[context_id].append(callback)
356
+
357
+ logger.debug(f"Agent {subscriber_id} subscribed to context {context_id}")
358
+ return True
359
+
360
+ async def unsubscribe_from_context(
361
+ self,
362
+ context_id: str,
363
+ subscriber_id: str,
364
+ callback: Optional[Callable] = None,
365
+ ) -> bool:
366
+ """
367
+ Unsubscribe from context updates.
368
+
369
+ Args:
370
+ context_id: ID of the context
371
+ subscriber_id: ID of the subscriber
372
+ callback: Optional callback to remove
373
+
374
+ Returns:
375
+ True if unsubscription was successful
376
+ """
377
+ context = self.contexts.get(context_id)
378
+ if not context:
379
+ return False
380
+
381
+ context.subscribers.discard(subscriber_id)
382
+
383
+ if callback and context_id in self.update_callbacks:
384
+ if callback in self.update_callbacks[context_id]:
385
+ self.update_callbacks[context_id].remove(callback)
386
+
387
+ logger.debug(f"Agent {subscriber_id} unsubscribed from context {context_id}")
388
+ return True
389
+
390
+ async def _notify_subscribers(self, context_id: str, updated_data: Dict[str, Any], updater_id: str) -> None:
391
+ """Notify subscribers of context updates."""
392
+ context = self.contexts.get(context_id)
393
+ if not context:
394
+ return
395
+
396
+ update_notification = {
397
+ "context_id": context_id,
398
+ "updater_id": updater_id,
399
+ "data": copy.deepcopy(updated_data),
400
+ "version": context.current_version,
401
+ "timestamp": datetime.utcnow().isoformat(),
402
+ }
403
+
404
+ # Execute callbacks
405
+ if context_id in self.update_callbacks:
406
+ for callback in self.update_callbacks[context_id]:
407
+ try:
408
+ if asyncio.iscoroutinefunction(callback):
409
+ await callback(update_notification)
410
+ else:
411
+ callback(update_notification)
412
+ except Exception as e:
413
+ logger.error(f"Error executing context update callback: {e}")
414
+
415
+ async def grant_access(self, context_id: str, granter_id: str, grantee_id: str) -> bool:
416
+ """
417
+ Grant access to a context.
418
+
419
+ Args:
420
+ context_id: ID of the context
421
+ granter_id: ID of the agent granting access (must be owner)
422
+ grantee_id: ID of the agent being granted access
423
+
424
+ Returns:
425
+ True if access was granted
426
+ """
427
+ context = self.contexts.get(context_id)
428
+ if not context:
429
+ return False
430
+
431
+ # Only owner can grant access
432
+ if granter_id != context.owner_id:
433
+ logger.warning(f"Only owner can grant access to context {context_id}")
434
+ return False
435
+
436
+ context.access_control.add(grantee_id)
437
+ logger.info(f"Granted access to {grantee_id} for context {context_id}")
438
+ return True
439
+
440
+ async def revoke_access(self, context_id: str, revoker_id: str, revokee_id: str) -> bool:
441
+ """
442
+ Revoke access to a context.
443
+
444
+ Args:
445
+ context_id: ID of the context
446
+ revoker_id: ID of the agent revoking access (must be owner)
447
+ revokee_id: ID of the agent losing access
448
+
449
+ Returns:
450
+ True if access was revoked
451
+ """
452
+ context = self.contexts.get(context_id)
453
+ if not context:
454
+ return False
455
+
456
+ # Only owner can revoke access
457
+ if revoker_id != context.owner_id:
458
+ logger.warning(f"Only owner can revoke access to context {context_id}")
459
+ return False
460
+
461
+ # Can't revoke owner's access
462
+ if revokee_id == context.owner_id:
463
+ logger.warning("Cannot revoke owner's access to context")
464
+ return False
465
+
466
+ context.access_control.discard(revokee_id)
467
+ context.subscribers.discard(revokee_id)
468
+ logger.info(f"Revoked access from {revokee_id} for context {context_id}")
469
+ return True
470
+
471
+ async def get_version_history(self, context_id: str, requester_id: str) -> Optional[List[Dict[str, Any]]]:
472
+ """
473
+ Get version history for a context.
474
+
475
+ Args:
476
+ context_id: ID of the context
477
+ requester_id: ID of the requester
478
+
479
+ Returns:
480
+ List of version information or None if unauthorized
481
+ """
482
+ context = self.contexts.get(context_id)
483
+ if not context:
484
+ return None
485
+
486
+ # Check access control
487
+ if requester_id not in context.access_control:
488
+ return None
489
+
490
+ history = []
491
+ for version in context.versions:
492
+ history.append(
493
+ {
494
+ "version_number": version.version_number,
495
+ "author_id": version.author_id,
496
+ "timestamp": version.timestamp.isoformat(),
497
+ "parent_version": version.parent_version,
498
+ "metadata": version.metadata,
499
+ }
500
+ )
501
+
502
+ return history
503
+
504
+ async def rollback_to_version(self, context_id: str, requester_id: str, target_version: int) -> bool:
505
+ """
506
+ Rollback context to a previous version.
507
+
508
+ Args:
509
+ context_id: ID of the context
510
+ requester_id: ID of the requester (must be owner)
511
+ target_version: Version number to rollback to
512
+
513
+ Returns:
514
+ True if rollback was successful
515
+ """
516
+ context = self.contexts.get(context_id)
517
+ if not context:
518
+ return False
519
+
520
+ # Only owner can rollback
521
+ if requester_id != context.owner_id:
522
+ logger.warning(f"Only owner can rollback context {context_id}")
523
+ return False
524
+
525
+ # Find target version
526
+ target = None
527
+ for version in context.versions:
528
+ if version.version_number == target_version:
529
+ target = version
530
+ break
531
+
532
+ if not target:
533
+ logger.error(f"Version {target_version} not found for context {context_id}")
534
+ return False
535
+
536
+ # Create new version based on target (rollback is a new version)
537
+ context._create_version(target.data, requester_id)
538
+ context.metadata["rollback"] = {
539
+ "from_version": context.current_version - 1,
540
+ "to_version": target_version,
541
+ "timestamp": datetime.utcnow().isoformat(),
542
+ }
543
+
544
+ # Notify subscribers
545
+ await self._notify_subscribers(context_id, context.data, requester_id)
546
+
547
+ logger.info(f"Rolled back context {context_id} to version {target_version}")
548
+ return True
549
+
550
+ def get_contexts_by_scope(self, scope: ContextScope, scope_id: str) -> List[str]:
551
+ """
552
+ Get all contexts for a specific scope.
553
+
554
+ Args:
555
+ scope: Scope level
556
+ scope_id: ID of the scope
557
+
558
+ Returns:
559
+ List of context IDs
560
+ """
561
+ if scope == ContextScope.COMMUNITY:
562
+ return list(self.community_contexts.get(scope_id, set()))
563
+ elif scope == ContextScope.SESSION:
564
+ return list(self.session_contexts.get(scope_id, set()))
565
+ elif scope == ContextScope.TASK:
566
+ return list(self.task_contexts.get(scope_id, set()))
567
+ elif scope == ContextScope.AGENT:
568
+ return list(self.agent_contexts.get(scope_id, set()))
569
+ return []
570
+
571
+ def get_statistics(self) -> Dict[str, Any]:
572
+ """
573
+ Get context manager statistics.
574
+
575
+ Returns:
576
+ Statistics dictionary
577
+ """
578
+ total_versions = sum(len(ctx.versions) for ctx in self.contexts.values())
579
+ total_subscribers = sum(len(ctx.subscribers) for ctx in self.contexts.values())
580
+
581
+ return {
582
+ "total_contexts": len(self.contexts),
583
+ "total_versions": total_versions,
584
+ "total_subscribers": total_subscribers,
585
+ "community_contexts": sum(len(s) for s in self.community_contexts.values()),
586
+ "session_contexts": sum(len(s) for s in self.session_contexts.values()),
587
+ "task_contexts": sum(len(s) for s in self.task_contexts.values()),
588
+ "agent_contexts": sum(len(s) for s in self.agent_contexts.values()),
589
+ }
@@ -8,21 +8,51 @@ Components:
8
8
  - ContextEngine: Advanced context and session management with Redis backend
9
9
  - Integration with TaskContext for enhanced functionality
10
10
  - Support for BaseServiceCheckpointer and LangGraph workflows
11
+
12
+ Usage:
13
+ # For creating ContextEngine instances directly:
14
+ from aiecs.domain.context import ContextEngine
15
+ engine = ContextEngine(use_existing_redis=True)
16
+ await engine.initialize()
17
+
18
+ # For using the global singleton instance (recommended):
19
+ from aiecs.infrastructure.persistence import (
20
+ get_context_engine,
21
+ initialize_context_engine,
22
+ close_context_engine
23
+ )
24
+
25
+ # The global instance is automatically initialized in main.py lifespan
26
+ context_engine = get_context_engine()
27
+ if context_engine:
28
+ await context_engine.add_conversation_message(...)
29
+
30
+ Architecture Note:
31
+ - This package contains DOMAIN layer classes (business logic)
32
+ - Global instance management is in INFRASTRUCTURE layer:
33
+ aiecs.infrastructure.persistence.context_engine_client
34
+ - This separation follows Clean Architecture / DDD principles
11
35
  """
12
36
 
13
37
  from .context_engine import ContextEngine, SessionMetrics, ConversationMessage
14
38
  from .conversation_models import (
15
- ConversationParticipant, ConversationSession, AgentCommunicationMessage,
16
- create_session_key, validate_conversation_isolation_pattern
39
+ ConversationParticipant,
40
+ ConversationSession,
41
+ AgentCommunicationMessage,
42
+ create_session_key,
43
+ validate_conversation_isolation_pattern,
17
44
  )
45
+ from .graph_memory import GraphMemoryMixin, ContextEngineWithGraph
18
46
 
19
47
  __all__ = [
20
- 'ContextEngine',
21
- 'SessionMetrics',
22
- 'ConversationMessage',
23
- 'ConversationParticipant',
24
- 'ConversationSession',
25
- 'AgentCommunicationMessage',
26
- 'create_session_key',
27
- 'validate_conversation_isolation_pattern'
48
+ "ContextEngine",
49
+ "SessionMetrics",
50
+ "ConversationMessage",
51
+ "ConversationParticipant",
52
+ "ConversationSession",
53
+ "AgentCommunicationMessage",
54
+ "create_session_key",
55
+ "validate_conversation_isolation_pattern",
56
+ "GraphMemoryMixin",
57
+ "ContextEngineWithGraph",
28
58
  ]