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,487 @@
1
+ """
2
+ Streaming Support for Graph Storage
3
+
4
+ Provides streaming export and import capabilities for large graphs,
5
+ enabling efficient handling of millions of entities and relations.
6
+ """
7
+
8
+ import json
9
+ import logging
10
+ from typing import AsyncIterator, Optional, Dict, Any, List
11
+ from enum import Enum
12
+ import gzip
13
+ from pathlib import Path
14
+ from datetime import datetime
15
+
16
+ from aiecs.domain.knowledge_graph.models.entity import Entity
17
+ from aiecs.domain.knowledge_graph.models.relation import Relation
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ class DateTimeEncoder(json.JSONEncoder):
23
+ """Custom JSON encoder for datetime objects"""
24
+
25
+ def default(self, obj):
26
+ if isinstance(obj, datetime):
27
+ return obj.isoformat()
28
+ return super().default(obj)
29
+
30
+
31
+ class StreamFormat(str, Enum):
32
+ """Streaming export format"""
33
+
34
+ JSONL = "jsonl" # JSON Lines (one JSON object per line)
35
+ JSON = "json" # Standard JSON array
36
+ CSV = "csv" # CSV format
37
+
38
+
39
+ class GraphStreamExporter:
40
+ """
41
+ Stream large graphs to files
42
+
43
+ Exports entities and relations in chunks to avoid loading
44
+ everything into memory at once.
45
+
46
+ Example:
47
+ ```python
48
+ exporter = GraphStreamExporter(store)
49
+
50
+ # Export to JSONL (recommended for large graphs)
51
+ await exporter.export_to_file(
52
+ "graph_export.jsonl",
53
+ format=StreamFormat.JSONL,
54
+ compress=True
55
+ )
56
+
57
+ # Export with filtering
58
+ await exporter.export_entities(
59
+ "persons.jsonl",
60
+ entity_type="Person",
61
+ batch_size=1000
62
+ )
63
+ ```
64
+ """
65
+
66
+ def __init__(self, store: Any):
67
+ """
68
+ Initialize exporter
69
+
70
+ Args:
71
+ store: Graph store instance
72
+ """
73
+ self.store = store
74
+
75
+ async def export_to_file(
76
+ self,
77
+ filepath: str,
78
+ format: StreamFormat = StreamFormat.JSONL,
79
+ compress: bool = False,
80
+ batch_size: int = 1000,
81
+ entity_type: Optional[str] = None,
82
+ include_relations: bool = True,
83
+ ) -> Dict[str, Any]:
84
+ """
85
+ Export entire graph to file
86
+
87
+ Args:
88
+ filepath: Output file path
89
+ format: Export format
90
+ compress: Enable gzip compression
91
+ batch_size: Streaming batch size
92
+ entity_type: Filter entities by type
93
+ include_relations: Include relations in export
94
+
95
+ Returns:
96
+ Dictionary with export statistics
97
+
98
+ Example:
99
+ ```python
100
+ stats = await exporter.export_to_file(
101
+ "graph.jsonl.gz",
102
+ format=StreamFormat.JSONL,
103
+ compress=True,
104
+ batch_size=5000
105
+ )
106
+ print(f"Exported {stats['entity_count']} entities")
107
+ ```
108
+ """
109
+ Path(filepath)
110
+
111
+ # Add .gz extension if compressing
112
+ if compress and not filepath.endswith(".gz"):
113
+ filepath = f"{filepath}.gz"
114
+
115
+ entity_count = 0
116
+ relation_count = 0
117
+
118
+ # Open file (with compression if requested)
119
+ if compress:
120
+ import gzip
121
+
122
+ file = gzip.open(filepath, "wt", encoding="utf-8")
123
+ else:
124
+ file = open(filepath, "w", encoding="utf-8")
125
+
126
+ try:
127
+ # Write header for JSON format
128
+ if format == StreamFormat.JSON:
129
+ file.write('{"entities": [')
130
+
131
+ # Stream entities
132
+ first = True
133
+ async for entity in self.stream_entities(entity_type=entity_type, batch_size=batch_size):
134
+ if format == StreamFormat.JSONL:
135
+ json.dump(
136
+ {"type": "entity", "data": entity.model_dump()},
137
+ file,
138
+ cls=DateTimeEncoder,
139
+ )
140
+ file.write("\n")
141
+ elif format == StreamFormat.JSON:
142
+ if not first:
143
+ file.write(",")
144
+ json.dump(entity.model_dump(), file, cls=DateTimeEncoder)
145
+ first = False
146
+
147
+ entity_count += 1
148
+
149
+ # Log progress
150
+ if entity_count % 10000 == 0:
151
+ logger.info(f"Exported {entity_count} entities...")
152
+
153
+ # Stream relations if requested
154
+ if include_relations:
155
+ if format == StreamFormat.JSON:
156
+ file.write('], "relations": [')
157
+ first = True
158
+
159
+ async for relation in self.stream_relations(batch_size=batch_size):
160
+ if format == StreamFormat.JSONL:
161
+ json.dump(
162
+ {
163
+ "type": "relation",
164
+ "data": relation.model_dump(),
165
+ },
166
+ file,
167
+ cls=DateTimeEncoder,
168
+ )
169
+ file.write("\n")
170
+ elif format == StreamFormat.JSON:
171
+ if not first:
172
+ file.write(",")
173
+ json.dump(relation.model_dump(), file, cls=DateTimeEncoder)
174
+ first = False
175
+
176
+ relation_count += 1
177
+
178
+ if relation_count % 10000 == 0:
179
+ logger.info(f"Exported {relation_count} relations...")
180
+
181
+ # Write footer for JSON format
182
+ if format == StreamFormat.JSON:
183
+ file.write("]}")
184
+
185
+ finally:
186
+ file.close()
187
+
188
+ logger.info(f"Export complete: {entity_count} entities, {relation_count} relations")
189
+
190
+ return {
191
+ "entity_count": entity_count,
192
+ "relation_count": relation_count,
193
+ "filepath": filepath,
194
+ "compressed": compress,
195
+ }
196
+
197
+ async def stream_entities(self, entity_type: Optional[str] = None, batch_size: int = 1000) -> AsyncIterator[Entity]:
198
+ """
199
+ Stream entities in batches
200
+
201
+ Args:
202
+ entity_type: Filter by entity type
203
+ batch_size: Batch size for streaming
204
+
205
+ Yields:
206
+ Entity instances
207
+ """
208
+ # Use pagination to stream efficiently
209
+ if hasattr(self.store, "paginate_entities"):
210
+ cursor = None
211
+ while True:
212
+ page = await self.store.paginate_entities(
213
+ entity_type=entity_type,
214
+ page_size=batch_size,
215
+ cursor=cursor,
216
+ )
217
+
218
+ for entity in page.items:
219
+ yield entity
220
+
221
+ if not page.page_info.has_next_page:
222
+ break
223
+
224
+ cursor = page.page_info.end_cursor
225
+ else:
226
+ # Fallback: load all and yield
227
+ entities = await self.store.get_all_entities(entity_type=entity_type)
228
+ for entity in entities:
229
+ yield entity
230
+
231
+ async def stream_relations(self, relation_type: Optional[str] = None, batch_size: int = 1000) -> AsyncIterator[Relation]:
232
+ """
233
+ Stream relations in batches
234
+
235
+ Args:
236
+ relation_type: Filter by relation type
237
+ batch_size: Batch size for streaming
238
+
239
+ Yields:
240
+ Relation instances
241
+ """
242
+ # Use pagination if available
243
+ if hasattr(self.store, "paginate_relations"):
244
+ cursor = None
245
+ while True:
246
+ page = await self.store.paginate_relations(
247
+ relation_type=relation_type,
248
+ page_size=batch_size,
249
+ cursor=cursor,
250
+ )
251
+
252
+ for relation in page.items:
253
+ yield relation
254
+
255
+ if not page.page_info.has_next_page:
256
+ break
257
+
258
+ cursor = page.page_info.end_cursor
259
+ else:
260
+ # Fallback: get all relations (this may be memory intensive)
261
+ # Backends should implement paginate_relations
262
+ logger.warning("Pagination not available, loading all relations")
263
+ # For now, yield nothing - backends must implement pagination
264
+ return
265
+
266
+ async def export_entities(
267
+ self,
268
+ filepath: str,
269
+ entity_type: Optional[str] = None,
270
+ batch_size: int = 1000,
271
+ compress: bool = False,
272
+ ) -> int:
273
+ """
274
+ Export only entities to file
275
+
276
+ Args:
277
+ filepath: Output file path
278
+ entity_type: Filter by entity type
279
+ batch_size: Streaming batch size
280
+ compress: Enable gzip compression
281
+
282
+ Returns:
283
+ Number of entities exported
284
+ """
285
+ if compress:
286
+ file = gzip.open(filepath, "wt", encoding="utf-8")
287
+ else:
288
+ file = open(filepath, "w", encoding="utf-8")
289
+
290
+ count = 0
291
+ try:
292
+ async for entity in self.stream_entities(entity_type=entity_type, batch_size=batch_size):
293
+ json.dump(entity.model_dump(), file, cls=DateTimeEncoder)
294
+ file.write("\n")
295
+ count += 1
296
+ finally:
297
+ file.close()
298
+
299
+ return count
300
+
301
+
302
+ class GraphStreamImporter:
303
+ """
304
+ Stream large graphs from files
305
+
306
+ Imports entities and relations in chunks to avoid memory issues.
307
+
308
+ Example:
309
+ ```python
310
+ importer = GraphStreamImporter(store)
311
+
312
+ # Import from JSONL file
313
+ stats = await importer.import_from_file(
314
+ "graph_export.jsonl.gz",
315
+ batch_size=1000
316
+ )
317
+ print(f"Imported {stats['entity_count']} entities")
318
+ ```
319
+ """
320
+
321
+ def __init__(self, store: Any):
322
+ """
323
+ Initialize importer
324
+
325
+ Args:
326
+ store: Graph store instance
327
+ """
328
+ self.store = store
329
+
330
+ async def import_from_file(
331
+ self,
332
+ filepath: str,
333
+ batch_size: int = 1000,
334
+ format: StreamFormat = StreamFormat.JSONL,
335
+ ) -> Dict[str, int]:
336
+ """
337
+ Import graph from file
338
+
339
+ Args:
340
+ filepath: Input file path
341
+ batch_size: Batch size for bulk operations
342
+ format: File format
343
+
344
+ Returns:
345
+ Dictionary with import statistics
346
+ """
347
+ # Detect compression
348
+ compressed = filepath.endswith(".gz")
349
+
350
+ # Open file
351
+ if compressed:
352
+ file = gzip.open(filepath, "rt", encoding="utf-8")
353
+ else:
354
+ file = open(filepath, "r", encoding="utf-8")
355
+
356
+ entity_count = 0
357
+ relation_count = 0
358
+
359
+ entity_batch = []
360
+ relation_batch = []
361
+
362
+ try:
363
+ if format == StreamFormat.JSONL:
364
+ for line in file:
365
+ if not line.strip():
366
+ continue
367
+
368
+ data = json.loads(line)
369
+
370
+ if data.get("type") == "entity":
371
+ entity_batch.append(Entity(**data["data"]))
372
+ elif data.get("type") == "relation":
373
+ relation_batch.append(Relation(**data["data"]))
374
+ else:
375
+ # Assume entity if no type specified
376
+ entity_batch.append(Entity(**data))
377
+
378
+ # Flush batches
379
+ if len(entity_batch) >= batch_size:
380
+ await self._import_entity_batch(entity_batch)
381
+ entity_count += len(entity_batch)
382
+ entity_batch.clear()
383
+ logger.info(f"Imported {entity_count} entities...")
384
+
385
+ if len(relation_batch) >= batch_size:
386
+ await self._import_relation_batch(relation_batch)
387
+ relation_count += len(relation_batch)
388
+ relation_batch.clear()
389
+ logger.info(f"Imported {relation_count} relations...")
390
+
391
+ # Flush remaining batches
392
+ if entity_batch:
393
+ await self._import_entity_batch(entity_batch)
394
+ entity_count += len(entity_batch)
395
+
396
+ if relation_batch:
397
+ await self._import_relation_batch(relation_batch)
398
+ relation_count += len(relation_batch)
399
+
400
+ finally:
401
+ file.close()
402
+
403
+ logger.info(f"Import complete: {entity_count} entities, {relation_count} relations")
404
+
405
+ return {"entity_count": entity_count, "relation_count": relation_count}
406
+
407
+ async def _import_entity_batch(self, entities: list[Entity]) -> None:
408
+ """Import a batch of entities"""
409
+ if hasattr(self.store, "batch_add_entities"):
410
+ await self.store.batch_add_entities(entities)
411
+ else:
412
+ for entity in entities:
413
+ await self.store.add_entity(entity)
414
+
415
+ async def _import_relation_batch(self, relations: list[Relation]) -> None:
416
+ """Import a batch of relations"""
417
+ if hasattr(self.store, "batch_add_relations"):
418
+ await self.store.batch_add_relations(relations)
419
+ else:
420
+ for relation in relations:
421
+ await self.store.add_relation(relation)
422
+
423
+
424
+ async def stream_subgraph(
425
+ store: Any,
426
+ entity_ids: list[str],
427
+ max_depth: int = 2,
428
+ batch_size: int = 100,
429
+ ) -> AsyncIterator[tuple[Entity, list[Relation]]]:
430
+ """
431
+ Stream a subgraph around specific entities
432
+
433
+ Yields entities with their relations in manageable chunks.
434
+
435
+ Args:
436
+ store: Graph store instance
437
+ entity_ids: Starting entity IDs
438
+ max_depth: Maximum depth to traverse
439
+ batch_size: Batch size for processing
440
+
441
+ Yields:
442
+ Tuples of (entity, relations) for each entity in subgraph
443
+
444
+ Example:
445
+ ```python
446
+ async for entity, relations in stream_subgraph(store, ["person_1"], max_depth=2):
447
+ print(f"Entity: {entity.id}, Relations: {len(relations)}")
448
+ ```
449
+ """
450
+ visited = set()
451
+ current_level = entity_ids
452
+ depth = 0
453
+
454
+ while current_level and depth <= max_depth:
455
+ # Process current level in batches
456
+ for i in range(0, len(current_level), batch_size):
457
+ batch = current_level[i : i + batch_size]
458
+ next_level_batch = []
459
+
460
+ for entity_id in batch:
461
+ if entity_id in visited:
462
+ continue
463
+
464
+ visited.add(entity_id)
465
+
466
+ # Get entity
467
+ entity = await store.get_entity(entity_id)
468
+ if not entity:
469
+ continue
470
+
471
+ # Get relations
472
+ neighbors = await store.get_neighbors(entity_id, direction="both")
473
+ # For now, return empty relations list - would need to fetch
474
+ # actual relations
475
+ relations: List[Any] = []
476
+
477
+ # Collect next level
478
+ for neighbor in neighbors:
479
+ if neighbor.id not in visited:
480
+ next_level_batch.append(neighbor.id)
481
+
482
+ yield (entity, relations)
483
+
484
+ # Add to next level
485
+ current_level.extend(next_level_batch)
486
+
487
+ depth += 1