aiecs 1.0.1__py3-none-any.whl → 1.7.6__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 +399 -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 +3870 -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 +1435 -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 +884 -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 +364 -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 +224 -36
  195. aiecs/llm/client_resolver.py +155 -0
  196. aiecs/llm/clients/__init__.py +38 -0
  197. aiecs/llm/clients/base_client.py +324 -0
  198. aiecs/llm/clients/google_function_calling_mixin.py +457 -0
  199. aiecs/llm/clients/googleai_client.py +241 -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 +897 -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 +1323 -0
  269. aiecs/tools/docs/document_layout_tool.py +1160 -0
  270. aiecs/tools/docs/document_parser_tool.py +1011 -0
  271. aiecs/tools/docs/document_writer_tool.py +1829 -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 +175 -131
  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.6.dist-info}/METADATA +52 -15
  321. aiecs-1.7.6.dist-info/RECORD +337 -0
  322. aiecs-1.7.6.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.6.dist-info}/WHEEL +0 -0
  339. {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/licenses/LICENSE +0 -0
  340. {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,424 @@
1
+ """
2
+ Graph Store Caching Layer
3
+
4
+ Provides caching capabilities for graph storage backends using Redis.
5
+ Supports TTL-based expiration, invalidation, and cache warming.
6
+ """
7
+
8
+ import json
9
+ import hashlib
10
+ import logging
11
+ from typing import Any, Dict, Optional, Callable
12
+ from functools import wraps
13
+ import asyncio
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class GraphStoreCacheConfig:
19
+ """Configuration for graph store caching"""
20
+
21
+ def __init__(
22
+ self,
23
+ enabled: bool = True,
24
+ ttl: int = 300, # 5 minutes default
25
+ max_cache_size_mb: int = 100,
26
+ redis_url: Optional[str] = None,
27
+ key_prefix: str = "graph:",
28
+ ):
29
+ """
30
+ Initialize cache configuration
31
+
32
+ Args:
33
+ enabled: Enable/disable caching
34
+ ttl: Time-to-live for cache entries in seconds
35
+ max_cache_size_mb: Maximum cache size in MB (for in-memory fallback)
36
+ redis_url: Redis connection URL (e.g., "redis://localhost:6379/0")
37
+ key_prefix: Prefix for all cache keys
38
+ """
39
+ self.enabled = enabled
40
+ self.ttl = ttl
41
+ self.max_cache_size_mb = max_cache_size_mb
42
+ self.redis_url = redis_url
43
+ self.key_prefix = key_prefix
44
+
45
+
46
+ class CacheBackend:
47
+ """Abstract cache backend interface"""
48
+
49
+ async def get(self, key: str) -> Optional[str]:
50
+ """Get value from cache"""
51
+ raise NotImplementedError
52
+
53
+ async def set(self, key: str, value: str, ttl: int) -> None:
54
+ """Set value in cache with TTL"""
55
+ raise NotImplementedError
56
+
57
+ async def delete(self, key: str) -> None:
58
+ """Delete key from cache"""
59
+ raise NotImplementedError
60
+
61
+ async def delete_pattern(self, pattern: str) -> None:
62
+ """Delete all keys matching pattern"""
63
+ raise NotImplementedError
64
+
65
+ async def clear(self) -> None:
66
+ """Clear all cache entries"""
67
+ raise NotImplementedError
68
+
69
+ async def close(self) -> None:
70
+ """Close cache connection"""
71
+
72
+
73
+ class InMemoryCacheBackend(CacheBackend):
74
+ """In-memory LRU cache backend (fallback when Redis unavailable)"""
75
+
76
+ def __init__(self, max_size_mb: int = 100):
77
+ """
78
+ Initialize in-memory cache
79
+
80
+ Args:
81
+ max_size_mb: Maximum cache size in MB
82
+ """
83
+ self.cache: Dict[str, tuple[str, float]] = {} # key -> (value, expiry_time)
84
+ self.max_size_bytes = max_size_mb * 1024 * 1024
85
+ self.current_size = 0
86
+ self._lock = asyncio.Lock()
87
+
88
+ async def get(self, key: str) -> Optional[str]:
89
+ """Get value from cache if not expired"""
90
+ async with self._lock:
91
+ if key in self.cache:
92
+ value, expiry = self.cache[key]
93
+ if expiry > asyncio.get_event_loop().time():
94
+ return value
95
+ else:
96
+ # Expired, remove
97
+ del self.cache[key]
98
+ self.current_size -= len(value)
99
+ return None
100
+
101
+ async def set(self, key: str, value: str, ttl: int) -> None:
102
+ """Set value in cache with TTL"""
103
+ async with self._lock:
104
+ # Check if we need to evict
105
+ value_size = len(value)
106
+ while self.current_size + value_size > self.max_size_bytes and self.cache:
107
+ # Evict oldest entry (simplified LRU)
108
+ oldest_key = next(iter(self.cache))
109
+ oldest_value, _ = self.cache[oldest_key]
110
+ del self.cache[oldest_key]
111
+ self.current_size -= len(oldest_value)
112
+
113
+ # Add/update entry
114
+ expiry_time = asyncio.get_event_loop().time() + ttl
115
+ if key in self.cache:
116
+ old_value, _ = self.cache[key]
117
+ self.current_size -= len(old_value)
118
+
119
+ self.cache[key] = (value, expiry_time)
120
+ self.current_size += value_size
121
+
122
+ async def delete(self, key: str) -> None:
123
+ """Delete key from cache"""
124
+ async with self._lock:
125
+ if key in self.cache:
126
+ value, _ = self.cache[key]
127
+ del self.cache[key]
128
+ self.current_size -= len(value)
129
+
130
+ async def delete_pattern(self, pattern: str) -> None:
131
+ """Delete all keys matching pattern (simple prefix match)"""
132
+ async with self._lock:
133
+ keys_to_delete = [k for k in self.cache.keys() if k.startswith(pattern.replace("*", ""))]
134
+ for key in keys_to_delete:
135
+ value, _ = self.cache[key]
136
+ del self.cache[key]
137
+ self.current_size -= len(value)
138
+
139
+ async def clear(self) -> None:
140
+ """Clear all cache entries"""
141
+ async with self._lock:
142
+ self.cache.clear()
143
+ self.current_size = 0
144
+
145
+
146
+ class RedisCacheBackend(CacheBackend):
147
+ """Redis cache backend"""
148
+
149
+ def __init__(self, redis_url: str):
150
+ """
151
+ Initialize Redis cache
152
+
153
+ Args:
154
+ redis_url: Redis connection URL
155
+ """
156
+ self.redis_url = redis_url
157
+ self.redis = None
158
+ self._initialized = False
159
+
160
+ async def initialize(self) -> bool:
161
+ """Initialize Redis connection"""
162
+ try:
163
+ import redis.asyncio as aioredis
164
+
165
+ redis_client = await aioredis.from_url(self.redis_url, encoding="utf-8", decode_responses=True)
166
+ # Test connection
167
+ await redis_client.ping()
168
+ self.redis = redis_client
169
+ self._initialized = True
170
+ logger.info(f"Redis cache initialized: {self.redis_url}")
171
+ return True
172
+ except Exception as e:
173
+ logger.warning(f"Failed to initialize Redis cache: {e}")
174
+ self.redis = None
175
+ self._initialized = False
176
+ return False
177
+
178
+ async def get(self, key: str) -> Optional[str]:
179
+ """Get value from Redis"""
180
+ if not self._initialized or not self.redis:
181
+ return None
182
+
183
+ try:
184
+ return await self.redis.get(key)
185
+ except Exception as e:
186
+ logger.warning(f"Redis get error: {e}")
187
+ return None
188
+
189
+ async def set(self, key: str, value: str, ttl: int) -> None:
190
+ """Set value in Redis with TTL"""
191
+ if not self._initialized or not self.redis:
192
+ return
193
+
194
+ try:
195
+ await self.redis.setex(key, ttl, value)
196
+ except Exception as e:
197
+ logger.warning(f"Redis set error: {e}")
198
+
199
+ async def delete(self, key: str) -> None:
200
+ """Delete key from Redis"""
201
+ if not self._initialized or not self.redis:
202
+ return
203
+
204
+ try:
205
+ await self.redis.delete(key)
206
+ except Exception as e:
207
+ logger.warning(f"Redis delete error: {e}")
208
+
209
+ async def delete_pattern(self, pattern: str) -> None:
210
+ """Delete all keys matching pattern"""
211
+ if not self._initialized or not self.redis:
212
+ return
213
+
214
+ try:
215
+ cursor = 0
216
+ while True:
217
+ cursor, keys = await self.redis.scan(cursor, match=pattern, count=100)
218
+ if keys:
219
+ await self.redis.delete(*keys)
220
+ if cursor == 0:
221
+ break
222
+ except Exception as e:
223
+ logger.warning(f"Redis delete_pattern error: {e}")
224
+
225
+ async def clear(self) -> None:
226
+ """Clear all cache entries (dangerous in production!)"""
227
+ if not self._initialized or not self.redis:
228
+ return
229
+
230
+ try:
231
+ await self.redis.flushdb()
232
+ except Exception as e:
233
+ logger.warning(f"Redis clear error: {e}")
234
+
235
+ async def close(self) -> None:
236
+ """Close Redis connection"""
237
+ if self.redis:
238
+ await self.redis.close()
239
+ self._initialized = False
240
+
241
+
242
+ class GraphStoreCache:
243
+ """
244
+ Cache layer for graph store operations
245
+
246
+ Provides transparent caching with automatic invalidation.
247
+ Falls back to in-memory cache if Redis is unavailable.
248
+
249
+ Example:
250
+ ```python
251
+ cache = GraphStoreCache(GraphStoreCacheConfig(
252
+ redis_url="redis://localhost:6379/0"
253
+ ))
254
+ await cache.initialize()
255
+
256
+ # Cache a query result
257
+ result = await cache.get_or_set(
258
+ "entity:person_1",
259
+ lambda: store.get_entity("person_1"),
260
+ ttl=300
261
+ )
262
+
263
+ # Invalidate cache
264
+ await cache.invalidate_entity("person_1")
265
+ ```
266
+ """
267
+
268
+ def __init__(self, config: GraphStoreCacheConfig):
269
+ """
270
+ Initialize cache
271
+
272
+ Args:
273
+ config: Cache configuration
274
+ """
275
+ self.config = config
276
+ self.backend: Optional[CacheBackend] = None
277
+ self._initialized = False
278
+
279
+ async def initialize(self) -> None:
280
+ """Initialize cache backend (Redis or in-memory fallback)"""
281
+ if not self.config.enabled:
282
+ logger.info("Graph store cache disabled")
283
+ return
284
+
285
+ # Try Redis first
286
+ if self.config.redis_url:
287
+ redis_backend = RedisCacheBackend(self.config.redis_url)
288
+ if await redis_backend.initialize():
289
+ self.backend = redis_backend
290
+ self._initialized = True
291
+ logger.info("Using Redis cache backend")
292
+ return
293
+
294
+ # Fallback to in-memory
295
+ self.backend = InMemoryCacheBackend(self.config.max_cache_size_mb)
296
+ self._initialized = True
297
+ logger.info("Using in-memory cache backend (fallback)")
298
+
299
+ async def close(self) -> None:
300
+ """Close cache backend"""
301
+ if self.backend:
302
+ await self.backend.close()
303
+ self._initialized = False
304
+
305
+ def _make_key(self, operation: str, *args) -> str:
306
+ """
307
+ Create cache key from operation and arguments
308
+
309
+ Args:
310
+ operation: Operation name (e.g., "entity", "relation", "neighbors")
311
+ *args: Operation arguments
312
+
313
+ Returns:
314
+ Cache key string
315
+ """
316
+ # Create deterministic key from args
317
+ args_str = json.dumps(args, sort_keys=True)
318
+ args_hash = hashlib.md5(args_str.encode()).hexdigest()[:8]
319
+ return f"{self.config.key_prefix}{operation}:{args_hash}"
320
+
321
+ async def get_or_set(self, key: str, fetch_func: Callable, ttl: Optional[int] = None) -> Any:
322
+ """
323
+ Get value from cache or fetch and cache it
324
+
325
+ Args:
326
+ key: Cache key
327
+ fetch_func: Async function to fetch value if not cached
328
+ ttl: TTL override (uses config.ttl if None)
329
+
330
+ Returns:
331
+ Cached or fetched value
332
+ """
333
+ if not self._initialized or not self.backend:
334
+ return await fetch_func()
335
+
336
+ # Try to get from cache
337
+ cached = await self.backend.get(key)
338
+ if cached is not None:
339
+ try:
340
+ return json.loads(cached)
341
+ except json.JSONDecodeError:
342
+ logger.warning(f"Failed to decode cached value for key: {key}")
343
+
344
+ # Fetch and cache
345
+ value = await fetch_func()
346
+ if value is not None:
347
+ try:
348
+ cached_value = json.dumps(value)
349
+ await self.backend.set(key, cached_value, ttl or self.config.ttl)
350
+ except (TypeError, ValueError) as e:
351
+ logger.warning(f"Failed to cache value for key {key}: {e}")
352
+
353
+ return value
354
+
355
+ async def invalidate_entity(self, entity_id: str) -> None:
356
+ """
357
+ Invalidate all cache entries related to an entity
358
+
359
+ Args:
360
+ entity_id: Entity ID to invalidate
361
+ """
362
+ if not self._initialized or not self.backend:
363
+ return
364
+
365
+ # Invalidate entity and related queries
366
+ await self.backend.delete(f"{self.config.key_prefix}entity:{entity_id}")
367
+ await self.backend.delete_pattern(f"{self.config.key_prefix}neighbors:{entity_id}:*")
368
+ await self.backend.delete_pattern(f"{self.config.key_prefix}paths:*:{entity_id}:*")
369
+ await self.backend.delete_pattern(f"{self.config.key_prefix}traverse:{entity_id}:*")
370
+
371
+ async def invalidate_relation(self, relation_id: str) -> None:
372
+ """
373
+ Invalidate all cache entries related to a relation
374
+
375
+ Args:
376
+ relation_id: Relation ID to invalidate
377
+ """
378
+ if not self._initialized or not self.backend:
379
+ return
380
+
381
+ await self.backend.delete(f"{self.config.key_prefix}relation:{relation_id}")
382
+ # Relations affect neighbors and paths, so invalidate broadly
383
+ await self.backend.delete_pattern(f"{self.config.key_prefix}neighbors:*")
384
+ await self.backend.delete_pattern(f"{self.config.key_prefix}paths:*")
385
+
386
+ async def clear(self) -> None:
387
+ """Clear all cache entries"""
388
+ if self._initialized and self.backend:
389
+ await self.backend.clear()
390
+
391
+
392
+ def cached_method(cache_key_func: Callable[..., str], ttl: Optional[int] = None):
393
+ """
394
+ Decorator for caching graph store methods
395
+
396
+ Args:
397
+ cache_key_func: Function to generate cache key from method args
398
+ ttl: Cache TTL (uses cache config if None)
399
+
400
+ Example:
401
+ ```python
402
+ @cached_method(lambda self, entity_id: f"entity:{entity_id}")
403
+ async def get_entity(self, entity_id: str) -> Optional[Entity]:
404
+ # Implementation
405
+ pass
406
+ ```
407
+ """
408
+
409
+ def decorator(func: Callable) -> Callable:
410
+ @wraps(func)
411
+ async def wrapper(self, *args, **kwargs):
412
+ # Check if caching is available
413
+ if not hasattr(self, "cache") or not self.cache or not self.cache._initialized:
414
+ return await func(self, *args, **kwargs)
415
+
416
+ # Generate cache key
417
+ cache_key = cache_key_func(self, *args, **kwargs)
418
+
419
+ # Try to get from cache or fetch
420
+ return await self.cache.get_or_set(cache_key, lambda: func(self, *args, **kwargs), ttl=ttl)
421
+
422
+ return wrapper
423
+
424
+ return decorator
@@ -0,0 +1,223 @@
1
+ """
2
+ Distributed Graph Operations (Optional/Future)
3
+
4
+ Provides foundation for distributed graph processing across multiple nodes.
5
+ This module defines interfaces and utilities for future distributed implementations.
6
+
7
+ Note: Current implementation focuses on single-node optimizations.
8
+ Distributed features are placeholders for future scaling needs.
9
+ """
10
+
11
+ import logging
12
+ from typing import Optional, List, Dict, Any
13
+ from enum import Enum
14
+ from dataclasses import dataclass
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ class PartitionStrategy(str, Enum):
20
+ """Graph partitioning strategy"""
21
+
22
+ HASH = "hash" # Hash-based partitioning
23
+ RANGE = "range" # Range-based partitioning
24
+ COMMUNITY = "community" # Community detection-based
25
+ CUSTOM = "custom" # Custom partitioning function
26
+
27
+
28
+ @dataclass
29
+ class GraphPartition:
30
+ """
31
+ Graph partition metadata
32
+
33
+ Describes a partition of the graph for distributed processing.
34
+ """
35
+
36
+ partition_id: int
37
+ node_count: int
38
+ edge_count: int
39
+ node_ids: Optional[List[str]] = None
40
+
41
+ def to_dict(self) -> Dict[str, Any]:
42
+ """Convert to dictionary"""
43
+ return {
44
+ "partition_id": self.partition_id,
45
+ "node_count": self.node_count,
46
+ "edge_count": self.edge_count,
47
+ "has_node_list": self.node_ids is not None,
48
+ }
49
+
50
+
51
+ class DistributedGraphMixin:
52
+ """
53
+ Mixin for distributed graph operations (Future Enhancement)
54
+
55
+ Provides interfaces for partitioning and distributed query execution.
56
+ Current implementation is a placeholder for future distributed features.
57
+
58
+ Example (Future Use):
59
+ ```python
60
+ class DistributedGraphStore(PostgresGraphStore, DistributedGraphMixin):
61
+ pass
62
+
63
+ store = DistributedGraphStore()
64
+
65
+ # Partition graph for distributed processing
66
+ partitions = await store.partition_graph(num_partitions=4)
67
+
68
+ # Execute distributed query
69
+ result = await store.distributed_query(query, partitions)
70
+ ```
71
+ """
72
+
73
+ async def partition_graph(
74
+ self,
75
+ num_partitions: int,
76
+ strategy: PartitionStrategy = PartitionStrategy.HASH,
77
+ ) -> List[GraphPartition]:
78
+ """
79
+ Partition graph for distributed processing
80
+
81
+ Args:
82
+ num_partitions: Number of partitions to create
83
+ strategy: Partitioning strategy
84
+
85
+ Returns:
86
+ List of partition metadata
87
+
88
+ Note:
89
+ This is a placeholder for future implementation.
90
+ Current version returns conceptual partitions.
91
+ """
92
+ logger.info("Graph partitioning requested but not yet implemented")
93
+ logger.info("For production distributed graphs, consider:")
94
+ logger.info(" - Neo4j Fabric for distributed queries")
95
+ logger.info(" - TigerGraph for native distributed processing")
96
+ logger.info(" - Amazon Neptune with read replicas")
97
+
98
+ # Placeholder: Return empty partitions
99
+ return [GraphPartition(partition_id=i, node_count=0, edge_count=0) for i in range(num_partitions)]
100
+
101
+ async def get_partition_info(self, partition_id: int) -> Optional[GraphPartition]:
102
+ """
103
+ Get information about a specific partition
104
+
105
+ Args:
106
+ partition_id: Partition ID
107
+
108
+ Returns:
109
+ Partition metadata or None
110
+ """
111
+ # Placeholder
112
+ logger.warning("Partition info not available in current implementation")
113
+ return None
114
+
115
+ async def distributed_query(self, query: str, partitions: Optional[List[int]] = None) -> Any:
116
+ """
117
+ Execute query across distributed partitions
118
+
119
+ Args:
120
+ query: Query to execute
121
+ partitions: Specific partitions to query (None for all)
122
+
123
+ Returns:
124
+ Aggregated query results
125
+
126
+ Note:
127
+ This is a placeholder. Current implementation executes locally.
128
+ """
129
+ logger.warning("Distributed query not implemented, executing locally")
130
+ # Fall back to local execution
131
+ return None
132
+
133
+
134
+ # Utility functions for future distributed implementations
135
+
136
+
137
+ def hash_partition_key(entity_id: str, num_partitions: int) -> int:
138
+ """
139
+ Compute partition ID using hash function
140
+
141
+ Args:
142
+ entity_id: Entity ID to partition
143
+ num_partitions: Total number of partitions
144
+
145
+ Returns:
146
+ Partition ID (0 to num_partitions-1)
147
+ """
148
+ return hash(entity_id) % num_partitions
149
+
150
+
151
+ def range_partition_key(entity_id: str, ranges: List[tuple[str, str]]) -> int:
152
+ """
153
+ Compute partition ID using range-based partitioning
154
+
155
+ Args:
156
+ entity_id: Entity ID to partition
157
+ ranges: List of (start, end) ranges for each partition
158
+
159
+ Returns:
160
+ Partition ID
161
+ """
162
+ for i, (start, end) in enumerate(ranges):
163
+ if start <= entity_id < end:
164
+ return i
165
+ return len(ranges) - 1 # Default to last partition
166
+
167
+
168
+ # Documentation for distributed graph deployment
169
+
170
+ DISTRIBUTED_DEPLOYMENT_NOTES = """
171
+ ## Distributed Graph Deployment Options
172
+
173
+ For large-scale distributed graphs (>100M nodes), consider:
174
+
175
+ ### 1. Neo4j Fabric
176
+ - Federated queries across multiple Neo4j databases
177
+ - Sharding support
178
+ - CYPHER-based distributed queries
179
+
180
+ ### 2. TigerGraph
181
+ - Native distributed graph database
182
+ - Horizontal scaling
183
+ - GSQL for distributed queries
184
+
185
+ ### 3. Amazon Neptune
186
+ - Managed graph database service
187
+ - Read replicas for scale-out reads
188
+ - Integration with AWS ecosystem
189
+
190
+ ### 4. JanusGraph
191
+ - Distributed graph database
192
+ - Backend-agnostic (Cassandra, HBase, etc.)
193
+ - Gremlin query language
194
+
195
+ ### 5. PostgreSQL with Citus
196
+ - Distributed PostgreSQL
197
+ - Can be used with current PostgresGraphStore
198
+ - Horizontal sharding of graph tables
199
+
200
+ ### Current AIECS Architecture
201
+
202
+ For most use cases (< 100M nodes), single-node PostgreSQL is sufficient:
203
+ - Vertical scaling up to 1TB RAM
204
+ - Connection pooling for concurrent access
205
+ - Read replicas for read scaling
206
+ - Batch operations for bulk loading
207
+
208
+ When to consider distributed:
209
+ - > 100M nodes
210
+ - > 1B edges
211
+ - Multiple geographic regions
212
+ - Extreme write throughput requirements (>100K writes/sec)
213
+
214
+ ### Migration Path
215
+
216
+ 1. Start with single-node PostgreSQL (current)
217
+ 2. Add read replicas for read scaling
218
+ 3. Implement connection routing for replicas
219
+ 4. If needed, migrate to distributed backend:
220
+ - Implement custom GraphStore for chosen backend
221
+ - Use GraphStorageMigrator for data migration
222
+ - Test with compatibility suite
223
+ """