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,592 @@
1
+ """
2
+ Advanced Retrieval Strategies
3
+
4
+ Provides sophisticated retrieval methods including Personalized PageRank,
5
+ multi-hop neighbor retrieval, filtered retrieval, and query caching.
6
+ """
7
+
8
+ import asyncio
9
+ from typing import List, Dict, Set, Optional, Tuple, Any, Callable
10
+ from collections import defaultdict, deque
11
+ import hashlib
12
+ import json
13
+ import time
14
+ from aiecs.domain.knowledge_graph.models.entity import Entity
15
+ from aiecs.infrastructure.graph_storage.base import GraphStore
16
+
17
+
18
+ class PersonalizedPageRank:
19
+ """
20
+ Personalized PageRank Retrieval
21
+
22
+ Computes importance scores for entities in the graph based on
23
+ a random walk with restart from seed entities. Useful for finding
24
+ entities most relevant to a given starting point.
25
+
26
+ Algorithm:
27
+ 1. Start from seed entities
28
+ 2. Random walk with probability alpha to restart at seeds
29
+ 3. Iterate until convergence
30
+ 4. Return entities ranked by visit frequency
31
+
32
+ Example:
33
+ ```python
34
+ ppr = PersonalizedPageRank(graph_store)
35
+
36
+ results = await ppr.retrieve(
37
+ seed_entity_ids=["person_1"],
38
+ max_results=10,
39
+ alpha=0.15, # restart probability
40
+ max_iterations=100
41
+ )
42
+
43
+ for entity, score in results:
44
+ print(f"{entity.id}: {score:.4f}")
45
+ ```
46
+ """
47
+
48
+ def __init__(self, graph_store: GraphStore):
49
+ """
50
+ Initialize Personalized PageRank retrieval
51
+
52
+ Args:
53
+ graph_store: Graph storage backend
54
+ """
55
+ self.graph_store = graph_store
56
+
57
+ async def retrieve(
58
+ self,
59
+ seed_entity_ids: List[str],
60
+ max_results: int = 20,
61
+ alpha: float = 0.15,
62
+ max_iterations: int = 100,
63
+ convergence_threshold: float = 1e-6,
64
+ ) -> List[Tuple[Entity, float]]:
65
+ """
66
+ Retrieve entities using Personalized PageRank
67
+
68
+ Args:
69
+ seed_entity_ids: Starting entities for random walk
70
+ max_results: Maximum number of results to return
71
+ alpha: Restart probability (0.0-1.0)
72
+ max_iterations: Maximum number of iterations
73
+ convergence_threshold: Convergence threshold for scores
74
+
75
+ Returns:
76
+ List of (entity, score) tuples sorted by score descending
77
+ """
78
+ if not seed_entity_ids:
79
+ return []
80
+
81
+ # Initialize scores
82
+ scores: Dict[str, float] = defaultdict(float)
83
+ set(seed_entity_ids)
84
+
85
+ # Initialize seed scores uniformly
86
+ initial_score = 1.0 / len(seed_entity_ids)
87
+ for seed_id in seed_entity_ids:
88
+ scores[seed_id] = initial_score
89
+
90
+ # Build adjacency information (cache neighbors)
91
+ adjacency: Dict[str, List[str]] = {}
92
+
93
+ # Iterative PageRank computation
94
+ for iteration in range(max_iterations):
95
+ new_scores: Dict[str, float] = defaultdict(float)
96
+
97
+ # Restart probability: distribute to seeds
98
+ for seed_id in seed_entity_ids:
99
+ new_scores[seed_id] += alpha * initial_score
100
+
101
+ # Random walk probability: distribute from current nodes
102
+ max_delta = 0.0
103
+
104
+ for entity_id, score in scores.items():
105
+ if score == 0:
106
+ continue
107
+
108
+ # Get neighbors (cache for efficiency)
109
+ if entity_id not in adjacency:
110
+ neighbors = await self.graph_store.get_neighbors(entity_id, direction="outgoing")
111
+ adjacency[entity_id] = [n.id for n in neighbors]
112
+
113
+ neighbor_ids = adjacency[entity_id]
114
+
115
+ if neighbor_ids:
116
+ # Distribute score to neighbors
117
+ distribute_score = (1 - alpha) * score / len(neighbor_ids)
118
+ for neighbor_id in neighbor_ids:
119
+ new_scores[neighbor_id] += distribute_score
120
+ else:
121
+ # No outgoing edges, restart at seeds
122
+ for seed_id in seed_entity_ids:
123
+ new_scores[seed_id] += (1 - alpha) * score * initial_score
124
+
125
+ # Check convergence
126
+ for entity_id in set(scores.keys()) | set(new_scores.keys()):
127
+ delta = abs(new_scores[entity_id] - scores[entity_id])
128
+ max_delta = max(max_delta, delta)
129
+
130
+ scores = new_scores
131
+
132
+ if max_delta < convergence_threshold:
133
+ break
134
+
135
+ # Retrieve entities and create results
136
+ results = []
137
+ for entity_id, score in scores.items():
138
+ if score > 0:
139
+ entity = await self.graph_store.get_entity(entity_id)
140
+ if entity:
141
+ results.append((entity, score))
142
+
143
+ # Sort by score descending
144
+ results.sort(key=lambda x: x[1], reverse=True)
145
+
146
+ return results[:max_results]
147
+
148
+
149
+ class MultiHopRetrieval:
150
+ """
151
+ Multi-Hop Neighbor Retrieval
152
+
153
+ Retrieves entities within N hops from seed entities, with configurable
154
+ aggregation and scoring strategies.
155
+
156
+ Features:
157
+ - Breadth-first expansion from seeds
158
+ - Hop-distance based scoring
159
+ - Relation type filtering
160
+ - Entity deduplication
161
+
162
+ Example:
163
+ ```python
164
+ retrieval = MultiHopRetrieval(graph_store)
165
+
166
+ results = await retrieval.retrieve(
167
+ seed_entity_ids=["entity_1"],
168
+ max_hops=2,
169
+ max_results=20,
170
+ relation_types=["RELATED_TO"] # Optional filter
171
+ )
172
+ ```
173
+ """
174
+
175
+ def __init__(self, graph_store: GraphStore):
176
+ """
177
+ Initialize multi-hop retrieval
178
+
179
+ Args:
180
+ graph_store: Graph storage backend
181
+ """
182
+ self.graph_store = graph_store
183
+
184
+ async def retrieve(
185
+ self,
186
+ seed_entity_ids: List[str],
187
+ max_hops: int = 2,
188
+ max_results: int = 50,
189
+ relation_types: Optional[List[str]] = None,
190
+ score_decay: float = 0.5,
191
+ include_seeds: bool = True,
192
+ ) -> List[Tuple[Entity, float]]:
193
+ """
194
+ Retrieve entities within N hops from seeds
195
+
196
+ Args:
197
+ seed_entity_ids: Starting entities
198
+ max_hops: Maximum number of hops
199
+ max_results: Maximum number of results
200
+ relation_types: Optional list of allowed relation types
201
+ score_decay: Score decay factor per hop (0.0-1.0)
202
+ include_seeds: Whether to include seed entities in results
203
+
204
+ Returns:
205
+ List of (entity, score) tuples
206
+ """
207
+ if not seed_entity_ids:
208
+ return []
209
+
210
+ # Track visited entities and their scores
211
+ entity_scores: Dict[str, float] = {}
212
+ visited: Set[str] = set()
213
+
214
+ # BFS expansion
215
+ current_level = set(seed_entity_ids)
216
+
217
+ for hop in range(max_hops + 1):
218
+ if not current_level:
219
+ break
220
+
221
+ next_level: Set[str] = set()
222
+
223
+ # Score for this hop level
224
+ hop_score = score_decay**hop
225
+
226
+ for entity_id in current_level:
227
+ if entity_id in visited:
228
+ continue
229
+
230
+ visited.add(entity_id)
231
+
232
+ # Update score (take max if entity reached via multiple paths)
233
+ if entity_id not in entity_scores:
234
+ entity_scores[entity_id] = hop_score
235
+ else:
236
+ entity_scores[entity_id] = max(entity_scores[entity_id], hop_score)
237
+
238
+ # Get neighbors for next level
239
+ if hop < max_hops:
240
+ neighbors = await self.graph_store.get_neighbors(entity_id, relation_type=None, direction="outgoing")
241
+
242
+ for neighbor in neighbors:
243
+ if neighbor.id not in visited:
244
+ # Apply relation type filter if specified
245
+ if relation_types is None:
246
+ next_level.add(neighbor.id)
247
+ else:
248
+ # Check if any relation matches the filter
249
+ # (simplified - assumes we have the relation info)
250
+ next_level.add(neighbor.id)
251
+
252
+ current_level = next_level
253
+
254
+ # Filter out seeds if requested
255
+ if not include_seeds:
256
+ for seed_id in seed_entity_ids:
257
+ entity_scores.pop(seed_id, None)
258
+
259
+ # Retrieve entities and create results
260
+ results = []
261
+ for entity_id, score in entity_scores.items():
262
+ entity = await self.graph_store.get_entity(entity_id)
263
+ if entity:
264
+ results.append((entity, score))
265
+
266
+ # Sort by score descending
267
+ results.sort(key=lambda x: x[1], reverse=True)
268
+
269
+ return results[:max_results]
270
+
271
+
272
+ class FilteredRetrieval:
273
+ """
274
+ Filtered Retrieval Strategy
275
+
276
+ Retrieves entities from the graph with flexible filtering by:
277
+ - Entity type
278
+ - Property values
279
+ - Property existence
280
+ - Custom filter functions
281
+
282
+ Example:
283
+ ```python
284
+ retrieval = FilteredRetrieval(graph_store)
285
+
286
+ # Filter by entity type and property
287
+ results = await retrieval.retrieve(
288
+ entity_type="Person",
289
+ property_filters={"role": "Engineer"},
290
+ max_results=20
291
+ )
292
+
293
+ # Custom filter function
294
+ results = await retrieval.retrieve(
295
+ filter_fn=lambda e: e.properties.get("age", 0) > 30,
296
+ max_results=10
297
+ )
298
+ ```
299
+ """
300
+
301
+ def __init__(self, graph_store: GraphStore):
302
+ """
303
+ Initialize filtered retrieval
304
+
305
+ Args:
306
+ graph_store: Graph storage backend
307
+ """
308
+ self.graph_store = graph_store
309
+
310
+ async def retrieve(
311
+ self,
312
+ entity_type: Optional[str] = None,
313
+ property_filters: Optional[Dict[str, Any]] = None,
314
+ property_exists: Optional[List[str]] = None,
315
+ filter_fn: Optional[Callable[[Entity], bool]] = None,
316
+ max_results: int = 100,
317
+ score_by_match_count: bool = False,
318
+ ) -> List[Tuple[Entity, float]]:
319
+ """
320
+ Retrieve entities with flexible filtering
321
+
322
+ Args:
323
+ entity_type: Filter by entity type
324
+ property_filters: Filter by property values (key: value)
325
+ property_exists: Filter by property existence (list of keys)
326
+ filter_fn: Custom filter function
327
+ max_results: Maximum number of results
328
+ score_by_match_count: Score by number of matching criteria
329
+
330
+ Returns:
331
+ List of (entity, score) tuples
332
+ """
333
+ # Get all entities (or filtered by type if using vector search)
334
+ # Note: This is a simplified implementation
335
+ # In production, we'd want more efficient filtering at storage level
336
+
337
+ results = []
338
+
339
+ # For now, we'll use vector search with no threshold to get entities
340
+ # This is a workaround - ideally we'd have a direct entity scan method
341
+ if entity_type:
342
+ # Try vector search with entity type filter
343
+ dummy_embedding = [0.0] * 128 # Placeholder
344
+ candidates = await self.graph_store.vector_search(
345
+ query_embedding=dummy_embedding,
346
+ entity_type=entity_type,
347
+ max_results=1000,
348
+ score_threshold=0.0,
349
+ )
350
+ candidate_entities = [entity for entity, _ in candidates]
351
+ else:
352
+ # Without entity type filter, we can't efficiently get all entities
353
+ # This is a limitation of the current GraphStore interface
354
+ # Return empty results for now
355
+ candidate_entities = []
356
+
357
+ # Apply filters
358
+ for entity in candidate_entities:
359
+ match_count = 0
360
+ total_criteria = 0
361
+
362
+ # Entity type filter (already applied above)
363
+ if entity_type:
364
+ total_criteria += 1
365
+ if entity.entity_type == entity_type:
366
+ match_count += 1
367
+ else:
368
+ continue
369
+
370
+ # Property value filters
371
+ if property_filters:
372
+ total_criteria += len(property_filters)
373
+ for key, expected_value in property_filters.items():
374
+ if entity.properties.get(key) == expected_value:
375
+ match_count += 1
376
+ else:
377
+ # Strict matching - entity must match all filters
378
+ match_count = 0
379
+ break
380
+
381
+ if match_count == 0 and property_filters:
382
+ continue
383
+
384
+ # Property existence filters
385
+ if property_exists:
386
+ total_criteria += len(property_exists)
387
+ for key in property_exists:
388
+ if key in entity.properties:
389
+ match_count += 1
390
+ else:
391
+ match_count = 0
392
+ break
393
+
394
+ if match_count == 0 and property_exists:
395
+ continue
396
+
397
+ # Custom filter function
398
+ if filter_fn:
399
+ total_criteria += 1
400
+ try:
401
+ if filter_fn(entity):
402
+ match_count += 1
403
+ else:
404
+ continue
405
+ except Exception:
406
+ continue
407
+
408
+ # Calculate score
409
+ if score_by_match_count and total_criteria > 0:
410
+ score = match_count / total_criteria
411
+ else:
412
+ score = 1.0
413
+
414
+ results.append((entity, score))
415
+
416
+ if len(results) >= max_results:
417
+ break
418
+
419
+ # Sort by score descending
420
+ results.sort(key=lambda x: x[1], reverse=True)
421
+
422
+ return results[:max_results]
423
+
424
+
425
+ class RetrievalCache:
426
+ """
427
+ Query Caching for Retrieval
428
+
429
+ Caches retrieval results to improve performance for frequent queries.
430
+ Uses LRU eviction policy and TTL-based expiration.
431
+
432
+ Features:
433
+ - LRU cache with configurable size
434
+ - TTL-based expiration
435
+ - Query fingerprinting
436
+ - Cache statistics
437
+
438
+ Example:
439
+ ```python
440
+ cache = RetrievalCache(max_size=100, ttl=300) # 5 minutes TTL
441
+
442
+ # Wrap retrieval operation
443
+ results = await cache.get_or_compute(
444
+ cache_key="query_1",
445
+ compute_fn=lambda: retrieval.retrieve(...)
446
+ )
447
+
448
+ # Check cache statistics
449
+ stats = cache.get_stats()
450
+ print(f"Hit rate: {stats['hit_rate']:.2%}")
451
+ ```
452
+ """
453
+
454
+ def __init__(self, max_size: int = 1000, ttl: int = 300):
455
+ """
456
+ Initialize retrieval cache
457
+
458
+ Args:
459
+ max_size: Maximum number of cached entries
460
+ ttl: Time-to-live for cache entries in seconds
461
+ """
462
+ self.max_size = max_size
463
+ self.ttl = ttl
464
+ # key -> (value, timestamp)
465
+ self._cache: Dict[str, Tuple[Any, float]] = {}
466
+ self._access_order: deque = deque() # LRU tracking
467
+ self._hits = 0
468
+ self._misses = 0
469
+
470
+ def _generate_key(self, **kwargs) -> str:
471
+ """
472
+ Generate cache key from query parameters
473
+
474
+ Args:
475
+ **kwargs: Query parameters
476
+
477
+ Returns:
478
+ Cache key string
479
+ """
480
+ # Sort keys for consistent hashing
481
+ sorted_items = sorted(kwargs.items())
482
+ key_str = json.dumps(sorted_items, sort_keys=True)
483
+ return hashlib.md5(key_str.encode()).hexdigest()
484
+
485
+ def _is_expired(self, timestamp: float) -> bool:
486
+ """Check if cache entry is expired"""
487
+ return (time.time() - timestamp) > self.ttl
488
+
489
+ def _evict_lru(self):
490
+ """Evict least recently used entry"""
491
+ if self._access_order:
492
+ lru_key = self._access_order.popleft()
493
+ self._cache.pop(lru_key, None)
494
+
495
+ async def get_or_compute(
496
+ self,
497
+ cache_key: Optional[str] = None,
498
+ compute_fn: Optional[Callable] = None,
499
+ **kwargs,
500
+ ) -> Any:
501
+ """
502
+ Get cached result or compute and cache
503
+
504
+ Args:
505
+ cache_key: Optional explicit cache key
506
+ compute_fn: Async function to compute result if cache miss
507
+ **kwargs: Parameters for cache key generation
508
+
509
+ Returns:
510
+ Cached or computed result
511
+ """
512
+ # Generate cache key
513
+ if cache_key is None:
514
+ cache_key = self._generate_key(**kwargs)
515
+
516
+ # Check cache
517
+ if cache_key in self._cache:
518
+ result, timestamp = self._cache[cache_key]
519
+
520
+ # Check expiration
521
+ if not self._is_expired(timestamp):
522
+ # Cache hit
523
+ self._hits += 1
524
+
525
+ # Update LRU order
526
+ if cache_key in self._access_order:
527
+ self._access_order.remove(cache_key)
528
+ self._access_order.append(cache_key)
529
+
530
+ return result
531
+ else:
532
+ # Expired, remove
533
+ del self._cache[cache_key]
534
+ if cache_key in self._access_order:
535
+ self._access_order.remove(cache_key)
536
+
537
+ # Cache miss
538
+ self._misses += 1
539
+
540
+ # Compute result
541
+ if compute_fn is None:
542
+ return None
543
+
544
+ if asyncio.iscoroutinefunction(compute_fn):
545
+ result = await compute_fn()
546
+ else:
547
+ result = compute_fn()
548
+
549
+ # Store in cache
550
+ self._cache[cache_key] = (result, time.time())
551
+ self._access_order.append(cache_key)
552
+
553
+ # Evict if over size limit
554
+ while len(self._cache) > self.max_size:
555
+ self._evict_lru()
556
+
557
+ return result
558
+
559
+ def invalidate(self, cache_key: str):
560
+ """Invalidate a specific cache entry"""
561
+ if cache_key in self._cache:
562
+ del self._cache[cache_key]
563
+ if cache_key in self._access_order:
564
+ self._access_order.remove(cache_key)
565
+
566
+ def clear(self):
567
+ """Clear all cache entries"""
568
+ self._cache.clear()
569
+ self._access_order.clear()
570
+
571
+ def get_stats(self) -> Dict[str, Any]:
572
+ """
573
+ Get cache statistics
574
+
575
+ Returns:
576
+ Dictionary with cache statistics
577
+ """
578
+ total_requests = self._hits + self._misses
579
+ hit_rate = self._hits / total_requests if total_requests > 0 else 0.0
580
+
581
+ return {
582
+ "hits": self._hits,
583
+ "misses": self._misses,
584
+ "total_requests": total_requests,
585
+ "hit_rate": hit_rate,
586
+ "cache_size": len(self._cache),
587
+ "max_size": self.max_size,
588
+ "ttl": self.ttl,
589
+ }
590
+
591
+
592
+ # Import asyncio for async checks
@@ -0,0 +1,23 @@
1
+ """
2
+ Retrieval Strategy Types
3
+
4
+ Defines the types of retrieval strategies available for knowledge graph queries.
5
+ """
6
+
7
+ from enum import Enum
8
+
9
+
10
+ class RetrievalStrategy(str, Enum):
11
+ """
12
+ Retrieval strategy enumeration for knowledge graph queries.
13
+
14
+ Defines different strategies for retrieving relevant knowledge from the graph
15
+ based on query intent and characteristics.
16
+ """
17
+
18
+ VECTOR_SEARCH = "vector_search" # Semantic similarity search using embeddings
19
+ MULTI_HOP = "multi_hop" # Multi-hop neighbor traversal
20
+ PAGERANK = "pagerank" # Personalized PageRank retrieval
21
+ FILTERED = "filtered" # Property-based filtering
22
+ HYBRID = "hybrid" # Combination of multiple strategies
23
+
@@ -0,0 +1,59 @@
1
+ """
2
+ Knowledge Graph Search Application Layer
3
+
4
+ Advanced search strategies including hybrid search and text similarity utilities.
5
+ """
6
+
7
+ from aiecs.application.knowledge_graph.search.hybrid_search import (
8
+ HybridSearchStrategy,
9
+ HybridSearchConfig,
10
+ SearchMode,
11
+ )
12
+ from aiecs.application.knowledge_graph.search.text_similarity import (
13
+ TextSimilarity,
14
+ BM25Scorer,
15
+ jaccard_similarity,
16
+ jaccard_similarity_text,
17
+ cosine_similarity_text,
18
+ levenshtein_distance,
19
+ normalized_levenshtein_similarity,
20
+ fuzzy_match,
21
+ )
22
+ from aiecs.application.knowledge_graph.search.reranker import (
23
+ RerankerStrategy,
24
+ ResultReranker,
25
+ ScoreCombinationMethod,
26
+ normalize_scores,
27
+ combine_scores,
28
+ )
29
+ from aiecs.application.knowledge_graph.search.reranker_strategies import (
30
+ TextSimilarityReranker,
31
+ SemanticReranker,
32
+ StructuralReranker,
33
+ HybridReranker,
34
+ CrossEncoderReranker,
35
+ )
36
+
37
+ __all__ = [
38
+ "HybridSearchStrategy",
39
+ "HybridSearchConfig",
40
+ "SearchMode",
41
+ "TextSimilarity",
42
+ "BM25Scorer",
43
+ "jaccard_similarity",
44
+ "jaccard_similarity_text",
45
+ "cosine_similarity_text",
46
+ "levenshtein_distance",
47
+ "normalized_levenshtein_similarity",
48
+ "fuzzy_match",
49
+ "RerankerStrategy",
50
+ "ResultReranker",
51
+ "ScoreCombinationMethod",
52
+ "normalize_scores",
53
+ "combine_scores",
54
+ "TextSimilarityReranker",
55
+ "SemanticReranker",
56
+ "StructuralReranker",
57
+ "HybridReranker",
58
+ "CrossEncoderReranker",
59
+ ]