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,535 @@
1
+ """
2
+ Reranking Strategy Implementations
3
+
4
+ Concrete implementations of reranking strategies for different signals:
5
+ - Text similarity (BM25, Jaccard)
6
+ - Semantic similarity (vector embeddings)
7
+ - Structural importance (PageRank, centrality)
8
+ - Hybrid combination
9
+ """
10
+
11
+ from typing import List, Optional, Dict
12
+ import numpy as np
13
+
14
+ from aiecs.application.knowledge_graph.search.reranker import RerankerStrategy
15
+ from aiecs.application.knowledge_graph.search.text_similarity import (
16
+ BM25Scorer,
17
+ jaccard_similarity_text,
18
+ cosine_similarity_text,
19
+ )
20
+ from aiecs.domain.knowledge_graph.models.entity import Entity
21
+ from aiecs.infrastructure.graph_storage.base import GraphStore
22
+
23
+
24
+ class TextSimilarityReranker(RerankerStrategy):
25
+ """
26
+ Text similarity reranker using BM25 and Jaccard similarity
27
+
28
+ Combines BM25 (term-based relevance) and Jaccard (set overlap) scores
29
+ to rerank entities based on text similarity to query.
30
+
31
+ Example::
32
+
33
+ reranker = TextSimilarityReranker(
34
+ bm25_weight=0.7,
35
+ jaccard_weight=0.3
36
+ )
37
+ scores = await reranker.score("machine learning", entities)
38
+ """
39
+
40
+ def __init__(
41
+ self,
42
+ bm25_weight: float = 0.7,
43
+ jaccard_weight: float = 0.3,
44
+ property_keys: Optional[List[str]] = None,
45
+ ):
46
+ """
47
+ Initialize TextSimilarityReranker
48
+
49
+ Args:
50
+ bm25_weight: Weight for BM25 scores (0.0-1.0)
51
+ jaccard_weight: Weight for Jaccard scores (0.0-1.0)
52
+ property_keys: Optional list of property keys to search
53
+ (default: all string properties)
54
+ """
55
+ if abs(bm25_weight + jaccard_weight - 1.0) > 1e-6:
56
+ raise ValueError("bm25_weight + jaccard_weight must equal 1.0")
57
+
58
+ self.bm25_weight = bm25_weight
59
+ self.jaccard_weight = jaccard_weight
60
+ self.property_keys = property_keys
61
+
62
+ @property
63
+ def name(self) -> str:
64
+ return "text_similarity"
65
+
66
+ def _extract_text(self, entity: Entity) -> str:
67
+ """Extract searchable text from entity properties"""
68
+ text_parts = []
69
+
70
+ if self.property_keys:
71
+ # Use specified properties only
72
+ for key in self.property_keys:
73
+ value = entity.properties.get(key)
74
+ if isinstance(value, str):
75
+ text_parts.append(value)
76
+ elif isinstance(value, (list, tuple)):
77
+ text_parts.extend(str(v) for v in value if isinstance(v, str))
78
+ else:
79
+ # Use all string properties
80
+ for key, value in entity.properties.items():
81
+ if isinstance(value, str):
82
+ text_parts.append(value)
83
+ elif isinstance(value, (list, tuple)):
84
+ text_parts.extend(str(v) for v in value if isinstance(v, str))
85
+
86
+ return " ".join(text_parts)
87
+
88
+ async def score(self, query: str, entities: List[Entity], **kwargs) -> List[float]:
89
+ """
90
+ Compute text similarity scores
91
+
92
+ Args:
93
+ query: Query text
94
+ entities: Entities to score
95
+ **kwargs: Additional parameters (ignored)
96
+
97
+ Returns:
98
+ List of scores (0.0-1.0)
99
+ """
100
+ if not entities:
101
+ return []
102
+
103
+ if not query:
104
+ return [0.0] * len(entities)
105
+
106
+ # Extract text from entities
107
+ entity_texts = [self._extract_text(entity) for entity in entities]
108
+
109
+ # Compute BM25 scores
110
+ corpus = entity_texts
111
+ scorer = BM25Scorer(corpus)
112
+ bm25_scores = scorer.score(query)
113
+
114
+ # Normalize BM25 scores to [0, 1]
115
+ if bm25_scores:
116
+ min_bm25 = min(bm25_scores)
117
+ max_bm25 = max(bm25_scores)
118
+ if max_bm25 > min_bm25:
119
+ bm25_normalized = [(s - min_bm25) / (max_bm25 - min_bm25) for s in bm25_scores]
120
+ else:
121
+ bm25_normalized = [1.0] * len(bm25_scores)
122
+ else:
123
+ bm25_normalized = [0.0] * len(entities)
124
+
125
+ # Compute Jaccard scores
126
+ jaccard_scores = [jaccard_similarity_text(query, text) for text in entity_texts]
127
+
128
+ # Combine scores
129
+ combined_scores = [self.bm25_weight * bm25 + self.jaccard_weight * jaccard for bm25, jaccard in zip(bm25_normalized, jaccard_scores)]
130
+
131
+ return combined_scores
132
+
133
+
134
+ class SemanticReranker(RerankerStrategy):
135
+ """
136
+ Semantic reranker using vector cosine similarity
137
+
138
+ Uses entity embeddings to compute semantic similarity to query embedding.
139
+
140
+ Example::
141
+
142
+ reranker = SemanticReranker()
143
+ scores = await reranker.score(
144
+ query="machine learning",
145
+ entities=entities,
146
+ query_embedding=[0.1, 0.2, ...]
147
+ )
148
+ """
149
+
150
+ def __init__(self):
151
+ """Initialize SemanticReranker"""
152
+
153
+ @property
154
+ def name(self) -> str:
155
+ return "semantic"
156
+
157
+ async def score(
158
+ self,
159
+ query: str,
160
+ entities: List[Entity],
161
+ query_embedding: Optional[List[float]] = None,
162
+ **kwargs,
163
+ ) -> List[float]:
164
+ """
165
+ Compute semantic similarity scores
166
+
167
+ Args:
168
+ query: Query text (used for fallback if no embedding)
169
+ entities: Entities to score
170
+ query_embedding: Optional query embedding vector
171
+ **kwargs: Additional parameters
172
+
173
+ Returns:
174
+ List of scores (0.0-1.0)
175
+ """
176
+ if not entities:
177
+ return []
178
+
179
+ if query_embedding is None:
180
+ # No embedding provided, return zero scores
181
+ return [0.0] * len(entities)
182
+
183
+ query_vec = np.array(query_embedding, dtype=np.float32)
184
+ query_norm = np.linalg.norm(query_vec)
185
+
186
+ if query_norm == 0:
187
+ return [0.0] * len(entities)
188
+
189
+ scores = []
190
+
191
+ for entity in entities:
192
+ if not entity.embedding:
193
+ scores.append(0.0)
194
+ continue
195
+
196
+ entity_vec = np.array(entity.embedding, dtype=np.float32)
197
+
198
+ # Check dimension compatibility
199
+ if len(query_vec) != len(entity_vec):
200
+ # Dimension mismatch - return zero score
201
+ scores.append(0.0)
202
+ continue
203
+
204
+ entity_norm = np.linalg.norm(entity_vec)
205
+
206
+ if entity_norm == 0:
207
+ scores.append(0.0)
208
+ continue
209
+
210
+ # Cosine similarity
211
+ similarity = np.dot(query_vec, entity_vec) / (query_norm * entity_norm)
212
+ # Normalize to [0, 1] range
213
+ normalized = (similarity + 1) / 2
214
+ scores.append(float(normalized))
215
+
216
+ return scores
217
+
218
+
219
+ class StructuralReranker(RerankerStrategy):
220
+ """
221
+ Structural reranker using graph centrality and PageRank
222
+
223
+ Scores entities based on their structural importance in the graph.
224
+ Uses PageRank scores and degree centrality.
225
+
226
+ Example::
227
+
228
+ reranker = StructuralReranker(graph_store)
229
+ scores = await reranker.score("query", entities)
230
+ """
231
+
232
+ def __init__(
233
+ self,
234
+ graph_store: GraphStore,
235
+ pagerank_weight: float = 0.7,
236
+ degree_weight: float = 0.3,
237
+ use_cached_scores: bool = True,
238
+ ):
239
+ """
240
+ Initialize StructuralReranker
241
+
242
+ Args:
243
+ graph_store: Graph storage backend
244
+ pagerank_weight: Weight for PageRank scores (0.0-1.0)
245
+ degree_weight: Weight for degree centrality (0.0-1.0)
246
+ use_cached_scores: Whether to cache PageRank scores
247
+ """
248
+ if abs(pagerank_weight + degree_weight - 1.0) > 1e-6:
249
+ raise ValueError("pagerank_weight + degree_weight must equal 1.0")
250
+
251
+ self.graph_store = graph_store
252
+ self.pagerank_weight = pagerank_weight
253
+ self.degree_weight = degree_weight
254
+ self.use_cached_scores = use_cached_scores
255
+ self._pagerank_cache: Dict[str, float] = {}
256
+ self._degree_cache: Dict[str, int] = {}
257
+
258
+ @property
259
+ def name(self) -> str:
260
+ return "structural"
261
+
262
+ async def _compute_pagerank_scores(self, entity_ids: List[str]) -> Dict[str, float]:
263
+ """Compute or retrieve cached PageRank scores"""
264
+ # Check cache first
265
+ if self.use_cached_scores:
266
+ cached = {eid: self._pagerank_cache.get(eid, 0.0) for eid in entity_ids}
267
+ if all(score > 0 for score in cached.values()):
268
+ return cached
269
+
270
+ # Compute PageRank using PersonalizedPageRank
271
+ from aiecs.application.knowledge_graph.retrieval.retrieval_strategies import (
272
+ PersonalizedPageRank,
273
+ )
274
+
275
+ ppr = PersonalizedPageRank(self.graph_store)
276
+
277
+ # Use all entities as seeds for global PageRank
278
+ # In practice, you might want to use seed entities from query context
279
+ # get_all_entities is available via PaginationMixinProtocol
280
+ all_entities = await self.graph_store.get_all_entities() # type: ignore[attr-defined]
281
+ seed_ids = [e.id for e in all_entities[: min(10, len(all_entities))]]
282
+
283
+ if not seed_ids:
284
+ return {eid: 0.0 for eid in entity_ids}
285
+
286
+ ppr_results = await ppr.retrieve(
287
+ seed_entity_ids=seed_ids,
288
+ max_results=len(entity_ids) * 2,
289
+ alpha=0.15,
290
+ )
291
+
292
+ # Create score dictionary
293
+ pagerank_scores = {entity.id: score for entity, score in ppr_results}
294
+
295
+ # Normalize to [0, 1]
296
+ if pagerank_scores:
297
+ max_score = max(pagerank_scores.values())
298
+ if max_score > 0:
299
+ pagerank_scores = {eid: score / max_score for eid, score in pagerank_scores.items()}
300
+
301
+ # Update cache
302
+ if self.use_cached_scores:
303
+ self._pagerank_cache.update(pagerank_scores)
304
+
305
+ return {eid: pagerank_scores.get(eid, 0.0) for eid in entity_ids}
306
+
307
+ async def _compute_degree_scores(self, entity_ids: List[str]) -> Dict[str, float]:
308
+ """Compute degree centrality scores"""
309
+ # Check cache
310
+ if self.use_cached_scores:
311
+ cached = {eid: self._degree_cache.get(eid, 0) for eid in entity_ids}
312
+ if all(deg >= 0 for deg in cached.values()):
313
+ degrees = cached
314
+ else:
315
+ degrees = {}
316
+ else:
317
+ degrees = {}
318
+
319
+ # Compute missing degrees
320
+ for entity_id in entity_ids:
321
+ if entity_id not in degrees:
322
+ neighbors_out = await self.graph_store.get_neighbors(entity_id, direction="outgoing")
323
+ neighbors_in = await self.graph_store.get_neighbors(entity_id, direction="incoming")
324
+ degree = len(neighbors_out) + len(neighbors_in)
325
+ degrees[entity_id] = degree
326
+ if self.use_cached_scores:
327
+ self._degree_cache[entity_id] = degree
328
+
329
+ # Normalize to [0, 1]
330
+ if degrees:
331
+ max_degree = max(degrees.values())
332
+ if max_degree > 0:
333
+ return {eid: deg / max_degree for eid, deg in degrees.items()}
334
+
335
+ return {eid: 0.0 for eid in entity_ids}
336
+
337
+ async def score(self, query: str, entities: List[Entity], **kwargs) -> List[float]:
338
+ """
339
+ Compute structural importance scores
340
+
341
+ Args:
342
+ query: Query text (not used, but required by interface)
343
+ entities: Entities to score
344
+ **kwargs: Additional parameters
345
+
346
+ Returns:
347
+ List of scores (0.0-1.0)
348
+ """
349
+ if not entities:
350
+ return []
351
+
352
+ entity_ids = [entity.id for entity in entities]
353
+
354
+ # Compute PageRank scores
355
+ pagerank_scores = await self._compute_pagerank_scores(entity_ids)
356
+
357
+ # Compute degree centrality scores
358
+ degree_scores = await self._compute_degree_scores(entity_ids)
359
+
360
+ # Combine scores
361
+ combined_scores = [self.pagerank_weight * pagerank_scores.get(entity.id, 0.0) + self.degree_weight * degree_scores.get(entity.id, 0.0) for entity in entities]
362
+
363
+ return combined_scores
364
+
365
+
366
+ class HybridReranker(RerankerStrategy):
367
+ """
368
+ Hybrid reranker combining multiple signals
369
+
370
+ Combines text similarity, semantic similarity, and structural importance
371
+ into a single score.
372
+
373
+ Example::
374
+
375
+ reranker = HybridReranker(
376
+ graph_store=store,
377
+ text_weight=0.4,
378
+ semantic_weight=0.4,
379
+ structural_weight=0.2
380
+ )
381
+ scores = await reranker.score(
382
+ query="machine learning",
383
+ entities=entities,
384
+ query_embedding=[0.1, 0.2, ...]
385
+ )
386
+ """
387
+
388
+ def __init__(
389
+ self,
390
+ graph_store: GraphStore,
391
+ text_weight: float = 0.4,
392
+ semantic_weight: float = 0.4,
393
+ structural_weight: float = 0.2,
394
+ ):
395
+ """
396
+ Initialize HybridReranker
397
+
398
+ Args:
399
+ graph_store: Graph storage backend
400
+ text_weight: Weight for text similarity (0.0-1.0)
401
+ semantic_weight: Weight for semantic similarity (0.0-1.0)
402
+ structural_weight: Weight for structural importance (0.0-1.0)
403
+ """
404
+ if abs(text_weight + semantic_weight + structural_weight - 1.0) > 1e-6:
405
+ raise ValueError("Weights must sum to 1.0")
406
+
407
+ self.graph_store = graph_store
408
+ self.text_weight = text_weight
409
+ self.semantic_weight = semantic_weight
410
+ self.structural_weight = structural_weight
411
+
412
+ # Initialize sub-strategies
413
+ self.text_reranker = TextSimilarityReranker()
414
+ self.semantic_reranker = SemanticReranker()
415
+ self.structural_reranker = StructuralReranker(graph_store)
416
+
417
+ @property
418
+ def name(self) -> str:
419
+ return "hybrid"
420
+
421
+ async def score(
422
+ self,
423
+ query: str,
424
+ entities: List[Entity],
425
+ query_embedding: Optional[List[float]] = None,
426
+ **kwargs,
427
+ ) -> List[float]:
428
+ """
429
+ Compute hybrid scores combining all signals
430
+
431
+ Args:
432
+ query: Query text
433
+ entities: Entities to score
434
+ query_embedding: Optional query embedding vector
435
+ **kwargs: Additional parameters
436
+
437
+ Returns:
438
+ List of scores (0.0-1.0)
439
+ """
440
+ if not entities:
441
+ return []
442
+
443
+ # Get scores from each strategy
444
+ text_scores = await self.text_reranker.score(query, entities, **kwargs)
445
+ semantic_scores = await self.semantic_reranker.score(query, entities, query_embedding=query_embedding, **kwargs)
446
+ structural_scores = await self.structural_reranker.score(query, entities, **kwargs)
447
+
448
+ # Combine scores
449
+ combined_scores = [
450
+ self.text_weight * text + self.semantic_weight * semantic + self.structural_weight * structural for text, semantic, structural in zip(text_scores, semantic_scores, structural_scores)
451
+ ]
452
+
453
+ return combined_scores
454
+
455
+
456
+ class CrossEncoderReranker(RerankerStrategy):
457
+ """
458
+ Cross-encoder reranker using transformer models (optional)
459
+
460
+ Uses a cross-encoder model to compute semantic relevance between
461
+ query and entity text. More accurate but slower than bi-encoder.
462
+
463
+ Note: This is a placeholder implementation. For production use,
464
+ integrate with a cross-encoder model library (e.g., sentence-transformers).
465
+
466
+ Example::
467
+
468
+ reranker = CrossEncoderReranker(model_name="cross-encoder/ms-marco-MiniLM-L-6-v2")
469
+ scores = await reranker.score("machine learning", entities)
470
+ """
471
+
472
+ def __init__(self, model_name: Optional[str] = None, use_gpu: bool = False):
473
+ """
474
+ Initialize CrossEncoderReranker
475
+
476
+ Args:
477
+ model_name: Optional model name (default: None, uses placeholder)
478
+ use_gpu: Whether to use GPU (if available)
479
+ """
480
+ self.model_name = model_name
481
+ self.use_gpu = use_gpu
482
+ self._model = None
483
+
484
+ @property
485
+ def name(self) -> str:
486
+ return "cross_encoder"
487
+
488
+ def _extract_text(self, entity: Entity) -> str:
489
+ """Extract text from entity for encoding"""
490
+ text_parts = []
491
+ for key, value in entity.properties.items():
492
+ if isinstance(value, str):
493
+ text_parts.append(value)
494
+ elif isinstance(value, (list, tuple)):
495
+ text_parts.extend(str(v) for v in value if isinstance(v, str))
496
+ return " ".join(text_parts)
497
+
498
+ async def score(self, query: str, entities: List[Entity], **kwargs) -> List[float]:
499
+ """
500
+ Compute cross-encoder scores
501
+
502
+ Args:
503
+ query: Query text
504
+ entities: Entities to score
505
+ **kwargs: Additional parameters
506
+
507
+ Returns:
508
+ List of scores (0.0-1.0)
509
+ """
510
+ if not entities:
511
+ return []
512
+
513
+ if not query:
514
+ return [0.0] * len(entities)
515
+
516
+ # Placeholder implementation
517
+ # In production, this would use a cross-encoder model:
518
+ #
519
+ # if self._model is None:
520
+ # from sentence_transformers import CrossEncoder
521
+ # self._model = CrossEncoder(self.model_name or "cross-encoder/ms-marco-MiniLM-L-6-v2")
522
+ #
523
+ # entity_texts = [self._extract_text(entity) for entity in entities]
524
+ # pairs = [[query, text] for text in entity_texts]
525
+ # scores = self._model.predict(pairs)
526
+ #
527
+ # # Normalize to [0, 1]
528
+ # scores = (scores - scores.min()) / (scores.max() - scores.min() + 1e-10)
529
+ # return scores.tolist()
530
+
531
+ # Fallback: Use cosine similarity as placeholder
532
+ entity_texts = [self._extract_text(entity) for entity in entities]
533
+ scores = [cosine_similarity_text(query, text) for text in entity_texts]
534
+
535
+ return scores