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,395 @@
1
+ """
2
+ A/B Testing Framework for Knowledge Fusion Threshold Validation.
3
+
4
+ Provides tools for comparing different threshold configurations and
5
+ evaluating matching performance across different parameter sets.
6
+ """
7
+
8
+ import asyncio
9
+ import logging
10
+ from dataclasses import dataclass, field
11
+ from typing import Any, Dict, List, Optional, Tuple
12
+
13
+ from aiecs.application.knowledge_graph.fusion.evaluation_dataset import (
14
+ EntityPair,
15
+ EvaluationDataset,
16
+ )
17
+ from aiecs.application.knowledge_graph.fusion.matching_config import (
18
+ FusionMatchingConfig,
19
+ )
20
+ from aiecs.application.knowledge_graph.fusion.similarity_pipeline import (
21
+ MatchStage,
22
+ PipelineResult,
23
+ SimilarityPipeline,
24
+ )
25
+
26
+ logger = logging.getLogger(__name__)
27
+
28
+
29
+ @dataclass
30
+ class EvaluationMetrics:
31
+ """
32
+ Metrics for evaluating matching performance.
33
+
34
+ Attributes:
35
+ true_positives: Number of correct matches
36
+ false_positives: Number of incorrect matches
37
+ false_negatives: Number of missed matches
38
+ true_negatives: Number of correct non-matches
39
+ precision: Precision score (TP / (TP + FP))
40
+ recall: Recall score (TP / (TP + FN))
41
+ f1_score: F1 score (harmonic mean of precision and recall)
42
+ accuracy: Overall accuracy ((TP + TN) / Total)
43
+ """
44
+
45
+ true_positives: int = 0
46
+ false_positives: int = 0
47
+ false_negatives: int = 0
48
+ true_negatives: int = 0
49
+
50
+ @property
51
+ def precision(self) -> float:
52
+ """Calculate precision."""
53
+ total_positive = self.true_positives + self.false_positives
54
+ if total_positive == 0:
55
+ return 0.0
56
+ return self.true_positives / total_positive
57
+
58
+ @property
59
+ def recall(self) -> float:
60
+ """Calculate recall."""
61
+ total_should_match = self.true_positives + self.false_negatives
62
+ if total_should_match == 0:
63
+ return 0.0
64
+ return self.true_positives / total_should_match
65
+
66
+ @property
67
+ def f1_score(self) -> float:
68
+ """Calculate F1 score."""
69
+ p = self.precision
70
+ r = self.recall
71
+ if p + r == 0:
72
+ return 0.0
73
+ return 2 * (p * r) / (p + r)
74
+
75
+ @property
76
+ def accuracy(self) -> float:
77
+ """Calculate overall accuracy."""
78
+ total = (
79
+ self.true_positives
80
+ + self.false_positives
81
+ + self.false_negatives
82
+ + self.true_negatives
83
+ )
84
+ if total == 0:
85
+ return 0.0
86
+ return (self.true_positives + self.true_negatives) / total
87
+
88
+ def to_dict(self) -> Dict[str, Any]:
89
+ """Convert metrics to dictionary."""
90
+ return {
91
+ "true_positives": self.true_positives,
92
+ "false_positives": self.false_positives,
93
+ "false_negatives": self.false_negatives,
94
+ "true_negatives": self.true_negatives,
95
+ "precision": self.precision,
96
+ "recall": self.recall,
97
+ "f1_score": self.f1_score,
98
+ "accuracy": self.accuracy,
99
+ }
100
+
101
+
102
+ @dataclass
103
+ class ExperimentResult:
104
+ """
105
+ Result from a single threshold configuration experiment.
106
+
107
+ Attributes:
108
+ config_name: Name/identifier for this configuration
109
+ config: The FusionMatchingConfig used
110
+ metrics: Evaluation metrics
111
+ stage_breakdown: Breakdown of matches by stage
112
+ errors: List of errors encountered during evaluation
113
+ """
114
+
115
+ config_name: str
116
+ config: FusionMatchingConfig
117
+ metrics: EvaluationMetrics
118
+ stage_breakdown: Dict[str, int] = field(default_factory=dict)
119
+ errors: List[str] = field(default_factory=list)
120
+
121
+
122
+ class ABTestingFramework:
123
+ """
124
+ A/B Testing framework for comparing threshold configurations.
125
+
126
+ Example:
127
+ ```python
128
+ framework = ABTestingFramework(
129
+ pipeline=pipeline,
130
+ dataset=evaluation_dataset
131
+ )
132
+
133
+ # Test default config
134
+ default_result = await framework.evaluate_config(
135
+ "default",
136
+ FusionMatchingConfig()
137
+ )
138
+
139
+ # Test custom config
140
+ custom_config = FusionMatchingConfig(
141
+ semantic_threshold=0.80,
142
+ alias_match_score=0.95
143
+ )
144
+ custom_result = await framework.evaluate_config(
145
+ "custom",
146
+ custom_config
147
+ )
148
+
149
+ # Compare results
150
+ comparison = framework.compare_results([default_result, custom_result])
151
+ ```
152
+ """
153
+
154
+ def __init__(
155
+ self,
156
+ pipeline: SimilarityPipeline,
157
+ dataset: EvaluationDataset,
158
+ ):
159
+ """
160
+ Initialize A/B testing framework.
161
+
162
+ Args:
163
+ pipeline: SimilarityPipeline instance for matching
164
+ dataset: EvaluationDataset with test cases
165
+ """
166
+ self._pipeline = pipeline
167
+ self._dataset = dataset
168
+
169
+ async def evaluate_config(
170
+ self,
171
+ config_name: str,
172
+ config: FusionMatchingConfig,
173
+ entity_type: Optional[str] = None,
174
+ ) -> ExperimentResult:
175
+ """
176
+ Evaluate a threshold configuration against the dataset.
177
+
178
+ Args:
179
+ config_name: Name/identifier for this configuration
180
+ config: FusionMatchingConfig to evaluate
181
+ entity_type: Optional entity type filter
182
+
183
+ Returns:
184
+ ExperimentResult with metrics and breakdown
185
+ """
186
+ logger.info(f"Evaluating configuration: {config_name}")
187
+
188
+ # Update pipeline config
189
+ self._pipeline.set_config(config)
190
+
191
+ # Filter dataset if entity type specified
192
+ test_dataset = self._dataset
193
+ if entity_type:
194
+ test_dataset = self._dataset.get_by_type(entity_type)
195
+
196
+ # Initialize metrics
197
+ metrics = EvaluationMetrics()
198
+ stage_breakdown: Dict[str, int] = {}
199
+ errors: List[str] = []
200
+
201
+ # Evaluate each pair
202
+ for pair in test_dataset.pairs:
203
+ try:
204
+ result = await self._pipeline.compute_similarity(
205
+ name1=pair.name1,
206
+ name2=pair.name2,
207
+ entity_type=pair.entity_type or entity_type,
208
+ )
209
+
210
+ # Track which stage matched
211
+ if result.is_match and result.matched_stage:
212
+ stage_name = result.matched_stage.value
213
+ stage_breakdown[stage_name] = (
214
+ stage_breakdown.get(stage_name, 0) + 1
215
+ )
216
+
217
+ # Update metrics
218
+ if pair.should_match:
219
+ if result.is_match:
220
+ metrics.true_positives += 1
221
+ else:
222
+ metrics.false_negatives += 1
223
+ else:
224
+ if result.is_match:
225
+ metrics.false_positives += 1
226
+ else:
227
+ metrics.true_negatives += 1
228
+
229
+ except Exception as e:
230
+ error_msg = f"Error evaluating pair ({pair.name1}, {pair.name2}): {e}"
231
+ logger.warning(error_msg)
232
+ errors.append(error_msg)
233
+ # Count errors as false negatives if should match, false positives if shouldn't
234
+ if pair.should_match:
235
+ metrics.false_negatives += 1
236
+ else:
237
+ metrics.false_positives += 1
238
+
239
+ return ExperimentResult(
240
+ config_name=config_name,
241
+ config=config,
242
+ metrics=metrics,
243
+ stage_breakdown=stage_breakdown,
244
+ errors=errors,
245
+ )
246
+
247
+ async def threshold_sweep(
248
+ self,
249
+ threshold_name: str,
250
+ threshold_range: List[float],
251
+ base_config: Optional[FusionMatchingConfig] = None,
252
+ entity_type: Optional[str] = None,
253
+ ) -> List[ExperimentResult]:
254
+ """
255
+ Perform threshold sweep for a specific threshold parameter.
256
+
257
+ Tests multiple values of a threshold to find optimal value.
258
+
259
+ Args:
260
+ threshold_name: Name of threshold to sweep (e.g., "semantic_threshold")
261
+ threshold_range: List of threshold values to test
262
+ base_config: Base configuration (uses default if not provided)
263
+ entity_type: Optional entity type filter
264
+
265
+ Returns:
266
+ List of ExperimentResult for each threshold value
267
+ """
268
+ if base_config is None:
269
+ base_config = FusionMatchingConfig()
270
+
271
+ results: List[ExperimentResult] = []
272
+
273
+ for threshold_value in threshold_range:
274
+ # Create config with modified threshold
275
+ config = FusionMatchingConfig(
276
+ alias_match_score=base_config.alias_match_score,
277
+ abbreviation_match_score=base_config.abbreviation_match_score,
278
+ normalization_match_score=base_config.normalization_match_score,
279
+ semantic_threshold=base_config.semantic_threshold,
280
+ string_similarity_threshold=base_config.string_similarity_threshold,
281
+ enabled_stages=base_config.enabled_stages.copy(),
282
+ semantic_enabled=base_config.semantic_enabled,
283
+ entity_type_configs=base_config.entity_type_configs.copy(),
284
+ )
285
+
286
+ # Set the threshold being swept
287
+ if threshold_name == "alias_match_score":
288
+ config.alias_match_score = threshold_value
289
+ elif threshold_name == "abbreviation_match_score":
290
+ config.abbreviation_match_score = threshold_value
291
+ elif threshold_name == "normalization_match_score":
292
+ config.normalization_match_score = threshold_value
293
+ elif threshold_name == "semantic_threshold":
294
+ config.semantic_threshold = threshold_value
295
+ elif threshold_name == "string_similarity_threshold":
296
+ config.string_similarity_threshold = threshold_value
297
+ else:
298
+ raise ValueError(f"Unknown threshold name: {threshold_name}")
299
+
300
+ config_name = f"{threshold_name}_{threshold_value:.3f}"
301
+ result = await self.evaluate_config(config_name, config, entity_type)
302
+ results.append(result)
303
+
304
+ return results
305
+
306
+ def compare_results(
307
+ self, results: List[ExperimentResult]
308
+ ) -> Dict[str, Any]:
309
+ """
310
+ Compare multiple experiment results.
311
+
312
+ Args:
313
+ results: List of ExperimentResult to compare
314
+
315
+ Returns:
316
+ Dictionary with comparison metrics
317
+ """
318
+ if not results:
319
+ return {}
320
+
321
+ comparison = {
322
+ "configs": [],
323
+ "best_precision": None,
324
+ "best_recall": None,
325
+ "best_f1": None,
326
+ "best_accuracy": None,
327
+ }
328
+
329
+ best_precision_score = -1
330
+ best_recall_score = -1
331
+ best_f1_score = -1
332
+ best_accuracy_score = -1
333
+
334
+ for result in results:
335
+ config_info = {
336
+ "name": result.config_name,
337
+ "metrics": result.metrics.to_dict(),
338
+ "stage_breakdown": result.stage_breakdown,
339
+ "errors": len(result.errors),
340
+ }
341
+ comparison["configs"].append(config_info)
342
+
343
+ # Track best scores
344
+ if result.metrics.precision > best_precision_score:
345
+ best_precision_score = result.metrics.precision
346
+ comparison["best_precision"] = result.config_name
347
+
348
+ if result.metrics.recall > best_recall_score:
349
+ best_recall_score = result.metrics.recall
350
+ comparison["best_recall"] = result.config_name
351
+
352
+ if result.metrics.f1_score > best_f1_score:
353
+ best_f1_score = result.metrics.f1_score
354
+ comparison["best_f1"] = result.config_name
355
+
356
+ if result.metrics.accuracy > best_accuracy_score:
357
+ best_accuracy_score = result.metrics.accuracy
358
+ comparison["best_accuracy"] = result.config_name
359
+
360
+ return comparison
361
+
362
+ def validate_thresholds(
363
+ self,
364
+ result: ExperimentResult,
365
+ min_recall: float = 0.90,
366
+ min_precision: float = 0.75,
367
+ ) -> Tuple[bool, Dict[str, Any]]:
368
+ """
369
+ Validate that thresholds meet minimum performance requirements.
370
+
371
+ Args:
372
+ result: ExperimentResult to validate
373
+ min_recall: Minimum recall requirement (default: 0.90)
374
+ min_precision: Minimum precision requirement (default: 0.75)
375
+
376
+ Returns:
377
+ Tuple of (is_valid, validation_details)
378
+ """
379
+ metrics = result.metrics
380
+ is_valid = (
381
+ metrics.recall >= min_recall and metrics.precision >= min_precision
382
+ )
383
+
384
+ validation_details = {
385
+ "is_valid": is_valid,
386
+ "recall": metrics.recall,
387
+ "precision": metrics.precision,
388
+ "f1_score": metrics.f1_score,
389
+ "min_recall": min_recall,
390
+ "min_precision": min_precision,
391
+ "recall_met": metrics.recall >= min_recall,
392
+ "precision_met": metrics.precision >= min_precision,
393
+ }
394
+
395
+ return is_valid, validation_details