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,431 @@
1
+ """
2
+ Lazy Loading Support for Graph Storage
3
+
4
+ Provides lazy loading of entities and relations to reduce memory usage
5
+ and improve performance when working with large graphs.
6
+ """
7
+
8
+ import logging
9
+ from typing import Optional, List, Dict, Any, AsyncIterator, TYPE_CHECKING
10
+ from dataclasses import dataclass, field
11
+
12
+ from aiecs.domain.knowledge_graph.models.entity import Entity
13
+ from aiecs.domain.knowledge_graph.models.relation import Relation
14
+
15
+ if TYPE_CHECKING:
16
+ from aiecs.infrastructure.graph_storage.protocols import LazyLoadingMixinProtocol
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ @dataclass
22
+ class LazyEntity:
23
+ """
24
+ Lazy-loaded entity wrapper
25
+
26
+ Only loads full entity data when accessed, reducing memory usage.
27
+
28
+ Example:
29
+ ```python
30
+ lazy_entity = LazyEntity(id="person_1", store=store)
31
+
32
+ # Entity not loaded yet
33
+ print(lazy_entity.id) # Just ID, no DB query
34
+
35
+ # Load full entity when needed
36
+ entity = await lazy_entity.load()
37
+ print(entity.properties["name"]) # DB query executed
38
+ ```
39
+ """
40
+
41
+ id: str
42
+ entity_type: Optional[str] = None
43
+ _store: Any = None
44
+ _loaded_entity: Optional[Entity] = field(default=None, init=False, repr=False)
45
+ _is_loaded: bool = field(default=False, init=False, repr=False)
46
+
47
+ async def load(self, force: bool = False) -> Optional[Entity]:
48
+ """
49
+ Load the full entity from storage
50
+
51
+ Args:
52
+ force: Force reload even if already loaded
53
+
54
+ Returns:
55
+ Full Entity object or None if not found
56
+ """
57
+ if not force and self._is_loaded:
58
+ return self._loaded_entity
59
+
60
+ if not self._store:
61
+ raise RuntimeError("No store provided for lazy loading")
62
+
63
+ self._loaded_entity = await self._store.get_entity(self.id)
64
+ self._is_loaded = True
65
+ return self._loaded_entity
66
+
67
+ async def get(self, property_name: str, default: Any = None) -> Any:
68
+ """
69
+ Get a specific property (loads entity if needed)
70
+
71
+ Args:
72
+ property_name: Property to retrieve
73
+ default: Default value if property not found
74
+
75
+ Returns:
76
+ Property value or default
77
+ """
78
+ entity = await self.load()
79
+ if not entity:
80
+ return default
81
+ return entity.properties.get(property_name, default)
82
+
83
+ def is_loaded(self) -> bool:
84
+ """Check if entity has been loaded"""
85
+ return self._is_loaded
86
+
87
+ def to_dict(self) -> Dict[str, Any]:
88
+ """Convert to dictionary (only includes loaded data)"""
89
+ result: Dict[str, Any] = {"id": self.id}
90
+ if self.entity_type:
91
+ result["entity_type"] = self.entity_type
92
+ if self._is_loaded and self._loaded_entity:
93
+ result["properties"] = self._loaded_entity.properties
94
+ return result
95
+
96
+
97
+ @dataclass
98
+ class LazyRelation:
99
+ """
100
+ Lazy-loaded relation wrapper
101
+
102
+ Only loads full relation data when accessed.
103
+ """
104
+
105
+ id: str
106
+ source_id: str
107
+ target_id: str
108
+ relation_type: Optional[str] = None
109
+ _store: Any = None
110
+ _loaded_relation: Optional[Relation] = field(default=None, init=False, repr=False)
111
+ _is_loaded: bool = field(default=False, init=False, repr=False)
112
+
113
+ async def load(self, force: bool = False) -> Optional[Relation]:
114
+ """Load the full relation from storage"""
115
+ if not force and self._is_loaded:
116
+ return self._loaded_relation
117
+
118
+ if not self._store:
119
+ raise RuntimeError("No store provided for lazy loading")
120
+
121
+ self._loaded_relation = await self._store.get_relation(self.id)
122
+ self._is_loaded = True
123
+ return self._loaded_relation
124
+
125
+ async def get_source(self) -> Optional[Entity]:
126
+ """Get source entity (lazy loaded)"""
127
+ if not self._store:
128
+ return None
129
+ return await self._store.get_entity(self.source_id)
130
+
131
+ async def get_target(self) -> Optional[Entity]:
132
+ """Get target entity (lazy loaded)"""
133
+ if not self._store:
134
+ return None
135
+ return await self._store.get_entity(self.target_id)
136
+
137
+ def is_loaded(self) -> bool:
138
+ """Check if relation has been loaded"""
139
+ return self._is_loaded
140
+
141
+
142
+ class LazyLoadingMixin:
143
+ """
144
+ Mixin providing lazy loading capabilities for graph stores
145
+
146
+ Enables deferred loading of entities and relations to reduce memory usage.
147
+
148
+ This mixin expects the class it's mixed into to implement `LazyLoadingMixinProtocol`,
149
+ specifically the `get_entity()`, `get_all_entities()`, and `get_neighbors()` methods.
150
+
151
+ Example:
152
+ ```python
153
+ class MyGraphStore(GraphStore, LazyLoadingMixin):
154
+ pass
155
+
156
+ store = MyGraphStore()
157
+
158
+ # Get lazy entities (no DB queries yet)
159
+ lazy_entities = await store.get_lazy_entities(entity_type="Person")
160
+
161
+ # Load specific entities as needed
162
+ for lazy_entity in lazy_entities[:10]:
163
+ entity = await lazy_entity.load()
164
+ print(entity.properties["name"])
165
+ ```
166
+ """
167
+
168
+ if TYPE_CHECKING:
169
+ # Type hints for mypy: this mixin expects LazyLoadingMixinProtocol
170
+ async def get_entity(self, entity_id: str) -> Optional[Entity]:
171
+ """Expected method from LazyLoadingMixinProtocol"""
172
+ ...
173
+
174
+ async def get_all_entities(
175
+ self, entity_type: Optional[str] = None, limit: Optional[int] = None
176
+ ) -> List[Entity]:
177
+ """Expected method from LazyLoadingMixinProtocol"""
178
+ ...
179
+
180
+ async def get_neighbors(
181
+ self,
182
+ entity_id: str,
183
+ relation_type: Optional[str] = None,
184
+ direction: str = "outgoing",
185
+ ) -> List[Entity]:
186
+ """Expected method from LazyLoadingMixinProtocol"""
187
+ ...
188
+
189
+ async def get_lazy_entity(self, entity_id: str) -> LazyEntity:
190
+ """
191
+ Get a lazy-loaded entity wrapper
192
+
193
+ Args:
194
+ entity_id: Entity ID
195
+
196
+ Returns:
197
+ LazyEntity wrapper (not yet loaded from DB)
198
+ """
199
+ return LazyEntity(id=entity_id, _store=self)
200
+
201
+ async def get_lazy_entities(self, entity_type: Optional[str] = None, limit: Optional[int] = None) -> List[LazyEntity]:
202
+ """
203
+ Get lazy-loaded entity wrappers
204
+
205
+ Only fetches IDs and types, not full entity data.
206
+
207
+ Args:
208
+ entity_type: Filter by entity type
209
+ limit: Maximum number of entities
210
+
211
+ Returns:
212
+ List of LazyEntity wrappers
213
+ """
214
+ # Get lightweight entity list (IDs only)
215
+ entities = await self._get_entity_ids(entity_type=entity_type, limit=limit)
216
+
217
+ return [LazyEntity(id=eid, entity_type=etype, _store=self) for eid, etype in entities]
218
+
219
+ async def _get_entity_ids(self, entity_type: Optional[str] = None, limit: Optional[int] = None) -> List[tuple[str, str]]:
220
+ """
221
+ Get entity IDs and types only (efficient query)
222
+
223
+ Backends should override this for better performance.
224
+
225
+ Returns:
226
+ List of (entity_id, entity_type) tuples
227
+ """
228
+ # Default implementation - load full entities (inefficient)
229
+ entities = await self.get_all_entities(entity_type=entity_type, limit=limit)
230
+ return [(e.id, e.entity_type) for e in entities]
231
+
232
+ async def get_lazy_neighbors(
233
+ self,
234
+ entity_id: str,
235
+ relation_type: Optional[str] = None,
236
+ direction: str = "outgoing",
237
+ ) -> List[LazyEntity]:
238
+ """
239
+ Get lazy-loaded neighbor entities
240
+
241
+ Args:
242
+ entity_id: Source entity ID
243
+ relation_type: Filter by relation type
244
+ direction: "outgoing", "incoming", or "both"
245
+
246
+ Returns:
247
+ List of LazyEntity wrappers for neighbors
248
+ """
249
+ # Get neighbor IDs without loading full entities
250
+ neighbor_ids = await self._get_neighbor_ids(
251
+ entity_id=entity_id,
252
+ relation_type=relation_type,
253
+ direction=direction,
254
+ )
255
+
256
+ return [LazyEntity(id=nid, _store=self) for nid in neighbor_ids]
257
+
258
+ async def _get_neighbor_ids(
259
+ self,
260
+ entity_id: str,
261
+ relation_type: Optional[str] = None,
262
+ direction: str = "outgoing",
263
+ ) -> List[str]:
264
+ """
265
+ Get neighbor entity IDs only (efficient query)
266
+
267
+ Backends should override this for better performance.
268
+ """
269
+ # Default implementation - load full neighbors
270
+ neighbors = await self.get_neighbors(
271
+ entity_id=entity_id,
272
+ relation_type=relation_type,
273
+ direction=direction,
274
+ )
275
+ return [n.id for n in neighbors]
276
+
277
+
278
+ class EntityBatchLoader:
279
+ """
280
+ Batch loader for efficient loading of multiple entities
281
+
282
+ Collects entity IDs and loads them in batches to reduce DB queries.
283
+ Implements the DataLoader pattern for GraphQL-like efficiency.
284
+
285
+ Example:
286
+ ```python
287
+ loader = EntityBatchLoader(store, batch_size=100)
288
+
289
+ # Queue entities for loading
290
+ e1_future = loader.load("entity_1")
291
+ e2_future = loader.load("entity_2")
292
+ # ... queue many more
293
+
294
+ # Load all queued entities in batch
295
+ await loader.dispatch()
296
+
297
+ # Get results
298
+ entity1 = await e1_future
299
+ entity2 = await e2_future
300
+ ```
301
+ """
302
+
303
+ def __init__(self, store: Any, batch_size: int = 100):
304
+ """
305
+ Initialize batch loader
306
+
307
+ Args:
308
+ store: Graph store instance
309
+ batch_size: Maximum batch size
310
+ """
311
+ self.store = store
312
+ self.batch_size = batch_size
313
+ self._queue: List[str] = []
314
+ self._cache: Dict[str, Optional[Entity]] = {}
315
+ self._futures: Dict[str, Any] = {}
316
+
317
+ async def load(self, entity_id: str) -> Optional[Entity]:
318
+ """
319
+ Load an entity (batched)
320
+
321
+ Args:
322
+ entity_id: Entity ID to load
323
+
324
+ Returns:
325
+ Entity or None if not found
326
+ """
327
+ # Check cache
328
+ if entity_id in self._cache:
329
+ return self._cache[entity_id]
330
+
331
+ # Queue for batch loading
332
+ if entity_id not in self._queue:
333
+ self._queue.append(entity_id)
334
+
335
+ # Dispatch if batch is full
336
+ if len(self._queue) >= self.batch_size:
337
+ await self.dispatch()
338
+
339
+ return self._cache.get(entity_id)
340
+
341
+ async def dispatch(self) -> None:
342
+ """
343
+ Dispatch all queued loads
344
+
345
+ Loads all queued entities in batch and updates cache.
346
+ """
347
+ if not self._queue:
348
+ return
349
+
350
+ # Get unique IDs
351
+ entity_ids = list(set(self._queue))
352
+ self._queue.clear()
353
+
354
+ # Batch load
355
+ entities = await self._batch_fetch_entities(entity_ids)
356
+
357
+ # Update cache
358
+ entity_map = {e.id: e for e in entities}
359
+ for eid in entity_ids:
360
+ self._cache[eid] = entity_map.get(eid)
361
+
362
+ async def _batch_fetch_entities(self, entity_ids: List[str]) -> List[Entity]:
363
+ """
364
+ Fetch multiple entities efficiently
365
+
366
+ Backends should optimize this for batch retrieval.
367
+ """
368
+ entities = []
369
+ for eid in entity_ids:
370
+ entity = await self.store.get_entity(eid)
371
+ if entity:
372
+ entities.append(entity)
373
+ return entities
374
+
375
+ def clear_cache(self) -> None:
376
+ """Clear the entity cache"""
377
+ self._cache.clear()
378
+
379
+
380
+ async def lazy_traverse(store: Any, start_entity_id: str, max_depth: int = 3, batch_size: int = 100) -> AsyncIterator[LazyEntity]:
381
+ """
382
+ Lazy graph traversal with batch loading
383
+
384
+ Traverses the graph lazily, yielding entities as they're discovered
385
+ without loading the entire subgraph into memory.
386
+
387
+ Args:
388
+ store: Graph store instance
389
+ start_entity_id: Starting entity ID
390
+ max_depth: Maximum traversal depth
391
+ batch_size: Batch size for loading
392
+
393
+ Yields:
394
+ LazyEntity instances as graph is traversed
395
+
396
+ Example:
397
+ ```python
398
+ async for lazy_entity in lazy_traverse(store, "person_1", max_depth=3):
399
+ entity = await lazy_entity.load()
400
+ print(f"Found: {entity.id}")
401
+ ```
402
+ """
403
+ visited = set()
404
+ # loader = EntityBatchLoader(store, batch_size=batch_size) # Reserved for
405
+ # future use
406
+
407
+ # BFS traversal
408
+ current_level = [start_entity_id]
409
+ depth = 0
410
+
411
+ while current_level and depth <= max_depth:
412
+ next_level = []
413
+
414
+ for entity_id in current_level:
415
+ if entity_id in visited:
416
+ continue
417
+
418
+ visited.add(entity_id)
419
+
420
+ # Yield lazy entity
421
+ lazy_entity = LazyEntity(id=entity_id, _store=store)
422
+ yield lazy_entity
423
+
424
+ # Get neighbors for next level
425
+ neighbors = await store.get_neighbors(entity_id, direction="outgoing")
426
+ for neighbor in neighbors:
427
+ if neighbor.id not in visited:
428
+ next_level.append(neighbor.id)
429
+
430
+ current_level = next_level
431
+ depth += 1