aiecs 1.0.1__py3-none-any.whl → 1.7.17__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of aiecs might be problematic. Click here for more details.

Files changed (340) hide show
  1. aiecs/__init__.py +13 -16
  2. aiecs/__main__.py +7 -7
  3. aiecs/aiecs_client.py +269 -75
  4. aiecs/application/executors/operation_executor.py +79 -54
  5. aiecs/application/knowledge_graph/__init__.py +7 -0
  6. aiecs/application/knowledge_graph/builder/__init__.py +37 -0
  7. aiecs/application/knowledge_graph/builder/data_quality.py +302 -0
  8. aiecs/application/knowledge_graph/builder/data_reshaping.py +293 -0
  9. aiecs/application/knowledge_graph/builder/document_builder.py +369 -0
  10. aiecs/application/knowledge_graph/builder/graph_builder.py +490 -0
  11. aiecs/application/knowledge_graph/builder/import_optimizer.py +396 -0
  12. aiecs/application/knowledge_graph/builder/schema_inference.py +462 -0
  13. aiecs/application/knowledge_graph/builder/schema_mapping.py +563 -0
  14. aiecs/application/knowledge_graph/builder/structured_pipeline.py +1384 -0
  15. aiecs/application/knowledge_graph/builder/text_chunker.py +317 -0
  16. aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
  17. aiecs/application/knowledge_graph/extractors/base.py +98 -0
  18. aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +422 -0
  19. aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +347 -0
  20. aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +241 -0
  21. aiecs/application/knowledge_graph/fusion/__init__.py +78 -0
  22. aiecs/application/knowledge_graph/fusion/ab_testing.py +395 -0
  23. aiecs/application/knowledge_graph/fusion/abbreviation_expander.py +327 -0
  24. aiecs/application/knowledge_graph/fusion/alias_index.py +597 -0
  25. aiecs/application/knowledge_graph/fusion/alias_matcher.py +384 -0
  26. aiecs/application/knowledge_graph/fusion/cache_coordinator.py +343 -0
  27. aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +433 -0
  28. aiecs/application/knowledge_graph/fusion/entity_linker.py +511 -0
  29. aiecs/application/knowledge_graph/fusion/evaluation_dataset.py +240 -0
  30. aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +632 -0
  31. aiecs/application/knowledge_graph/fusion/matching_config.py +489 -0
  32. aiecs/application/knowledge_graph/fusion/name_normalizer.py +352 -0
  33. aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +183 -0
  34. aiecs/application/knowledge_graph/fusion/semantic_name_matcher.py +464 -0
  35. aiecs/application/knowledge_graph/fusion/similarity_pipeline.py +534 -0
  36. aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
  37. aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +342 -0
  38. aiecs/application/knowledge_graph/pattern_matching/query_executor.py +366 -0
  39. aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
  40. aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +195 -0
  41. aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
  42. aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
  43. aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +341 -0
  44. aiecs/application/knowledge_graph/reasoning/inference_engine.py +500 -0
  45. aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +163 -0
  46. aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
  47. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
  48. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +913 -0
  49. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +866 -0
  50. aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +475 -0
  51. aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +396 -0
  52. aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +208 -0
  53. aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +170 -0
  54. aiecs/application/knowledge_graph/reasoning/query_planner.py +855 -0
  55. aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +518 -0
  56. aiecs/application/knowledge_graph/retrieval/__init__.py +27 -0
  57. aiecs/application/knowledge_graph/retrieval/query_intent_classifier.py +211 -0
  58. aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +592 -0
  59. aiecs/application/knowledge_graph/retrieval/strategy_types.py +23 -0
  60. aiecs/application/knowledge_graph/search/__init__.py +59 -0
  61. aiecs/application/knowledge_graph/search/hybrid_search.py +457 -0
  62. aiecs/application/knowledge_graph/search/reranker.py +293 -0
  63. aiecs/application/knowledge_graph/search/reranker_strategies.py +535 -0
  64. aiecs/application/knowledge_graph/search/text_similarity.py +392 -0
  65. aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
  66. aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +305 -0
  67. aiecs/application/knowledge_graph/traversal/path_scorer.py +271 -0
  68. aiecs/application/knowledge_graph/validators/__init__.py +13 -0
  69. aiecs/application/knowledge_graph/validators/relation_validator.py +239 -0
  70. aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
  71. aiecs/application/knowledge_graph/visualization/graph_visualizer.py +313 -0
  72. aiecs/common/__init__.py +9 -0
  73. aiecs/common/knowledge_graph/__init__.py +17 -0
  74. aiecs/common/knowledge_graph/runnable.py +471 -0
  75. aiecs/config/__init__.py +20 -5
  76. aiecs/config/config.py +762 -31
  77. aiecs/config/graph_config.py +131 -0
  78. aiecs/config/tool_config.py +435 -0
  79. aiecs/core/__init__.py +29 -13
  80. aiecs/core/interface/__init__.py +2 -2
  81. aiecs/core/interface/execution_interface.py +22 -22
  82. aiecs/core/interface/storage_interface.py +37 -88
  83. aiecs/core/registry/__init__.py +31 -0
  84. aiecs/core/registry/service_registry.py +92 -0
  85. aiecs/domain/__init__.py +270 -1
  86. aiecs/domain/agent/__init__.py +191 -0
  87. aiecs/domain/agent/base_agent.py +3949 -0
  88. aiecs/domain/agent/exceptions.py +99 -0
  89. aiecs/domain/agent/graph_aware_mixin.py +569 -0
  90. aiecs/domain/agent/hybrid_agent.py +1731 -0
  91. aiecs/domain/agent/integration/__init__.py +29 -0
  92. aiecs/domain/agent/integration/context_compressor.py +216 -0
  93. aiecs/domain/agent/integration/context_engine_adapter.py +587 -0
  94. aiecs/domain/agent/integration/protocols.py +281 -0
  95. aiecs/domain/agent/integration/retry_policy.py +218 -0
  96. aiecs/domain/agent/integration/role_config.py +213 -0
  97. aiecs/domain/agent/knowledge_aware_agent.py +1892 -0
  98. aiecs/domain/agent/lifecycle.py +291 -0
  99. aiecs/domain/agent/llm_agent.py +692 -0
  100. aiecs/domain/agent/memory/__init__.py +12 -0
  101. aiecs/domain/agent/memory/conversation.py +1124 -0
  102. aiecs/domain/agent/migration/__init__.py +14 -0
  103. aiecs/domain/agent/migration/conversion.py +163 -0
  104. aiecs/domain/agent/migration/legacy_wrapper.py +86 -0
  105. aiecs/domain/agent/models.py +894 -0
  106. aiecs/domain/agent/observability.py +479 -0
  107. aiecs/domain/agent/persistence.py +449 -0
  108. aiecs/domain/agent/prompts/__init__.py +29 -0
  109. aiecs/domain/agent/prompts/builder.py +159 -0
  110. aiecs/domain/agent/prompts/formatters.py +187 -0
  111. aiecs/domain/agent/prompts/template.py +255 -0
  112. aiecs/domain/agent/registry.py +253 -0
  113. aiecs/domain/agent/tool_agent.py +444 -0
  114. aiecs/domain/agent/tools/__init__.py +15 -0
  115. aiecs/domain/agent/tools/schema_generator.py +377 -0
  116. aiecs/domain/community/__init__.py +155 -0
  117. aiecs/domain/community/agent_adapter.py +469 -0
  118. aiecs/domain/community/analytics.py +432 -0
  119. aiecs/domain/community/collaborative_workflow.py +648 -0
  120. aiecs/domain/community/communication_hub.py +634 -0
  121. aiecs/domain/community/community_builder.py +320 -0
  122. aiecs/domain/community/community_integration.py +796 -0
  123. aiecs/domain/community/community_manager.py +803 -0
  124. aiecs/domain/community/decision_engine.py +849 -0
  125. aiecs/domain/community/exceptions.py +231 -0
  126. aiecs/domain/community/models/__init__.py +33 -0
  127. aiecs/domain/community/models/community_models.py +234 -0
  128. aiecs/domain/community/resource_manager.py +461 -0
  129. aiecs/domain/community/shared_context_manager.py +589 -0
  130. aiecs/domain/context/__init__.py +40 -10
  131. aiecs/domain/context/context_engine.py +1910 -0
  132. aiecs/domain/context/conversation_models.py +87 -53
  133. aiecs/domain/context/graph_memory.py +582 -0
  134. aiecs/domain/execution/model.py +12 -4
  135. aiecs/domain/knowledge_graph/__init__.py +19 -0
  136. aiecs/domain/knowledge_graph/models/__init__.py +52 -0
  137. aiecs/domain/knowledge_graph/models/entity.py +148 -0
  138. aiecs/domain/knowledge_graph/models/evidence.py +178 -0
  139. aiecs/domain/knowledge_graph/models/inference_rule.py +184 -0
  140. aiecs/domain/knowledge_graph/models/path.py +171 -0
  141. aiecs/domain/knowledge_graph/models/path_pattern.py +171 -0
  142. aiecs/domain/knowledge_graph/models/query.py +261 -0
  143. aiecs/domain/knowledge_graph/models/query_plan.py +181 -0
  144. aiecs/domain/knowledge_graph/models/relation.py +202 -0
  145. aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
  146. aiecs/domain/knowledge_graph/schema/entity_type.py +131 -0
  147. aiecs/domain/knowledge_graph/schema/graph_schema.py +253 -0
  148. aiecs/domain/knowledge_graph/schema/property_schema.py +143 -0
  149. aiecs/domain/knowledge_graph/schema/relation_type.py +163 -0
  150. aiecs/domain/knowledge_graph/schema/schema_manager.py +691 -0
  151. aiecs/domain/knowledge_graph/schema/type_enums.py +209 -0
  152. aiecs/domain/task/dsl_processor.py +172 -56
  153. aiecs/domain/task/model.py +20 -8
  154. aiecs/domain/task/task_context.py +27 -24
  155. aiecs/infrastructure/__init__.py +0 -2
  156. aiecs/infrastructure/graph_storage/__init__.py +11 -0
  157. aiecs/infrastructure/graph_storage/base.py +837 -0
  158. aiecs/infrastructure/graph_storage/batch_operations.py +458 -0
  159. aiecs/infrastructure/graph_storage/cache.py +424 -0
  160. aiecs/infrastructure/graph_storage/distributed.py +223 -0
  161. aiecs/infrastructure/graph_storage/error_handling.py +380 -0
  162. aiecs/infrastructure/graph_storage/graceful_degradation.py +294 -0
  163. aiecs/infrastructure/graph_storage/health_checks.py +378 -0
  164. aiecs/infrastructure/graph_storage/in_memory.py +1197 -0
  165. aiecs/infrastructure/graph_storage/index_optimization.py +446 -0
  166. aiecs/infrastructure/graph_storage/lazy_loading.py +431 -0
  167. aiecs/infrastructure/graph_storage/metrics.py +344 -0
  168. aiecs/infrastructure/graph_storage/migration.py +400 -0
  169. aiecs/infrastructure/graph_storage/pagination.py +483 -0
  170. aiecs/infrastructure/graph_storage/performance_monitoring.py +456 -0
  171. aiecs/infrastructure/graph_storage/postgres.py +1563 -0
  172. aiecs/infrastructure/graph_storage/property_storage.py +353 -0
  173. aiecs/infrastructure/graph_storage/protocols.py +76 -0
  174. aiecs/infrastructure/graph_storage/query_optimizer.py +642 -0
  175. aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
  176. aiecs/infrastructure/graph_storage/sqlite.py +1373 -0
  177. aiecs/infrastructure/graph_storage/streaming.py +487 -0
  178. aiecs/infrastructure/graph_storage/tenant.py +412 -0
  179. aiecs/infrastructure/messaging/celery_task_manager.py +92 -54
  180. aiecs/infrastructure/messaging/websocket_manager.py +51 -35
  181. aiecs/infrastructure/monitoring/__init__.py +22 -0
  182. aiecs/infrastructure/monitoring/executor_metrics.py +45 -11
  183. aiecs/infrastructure/monitoring/global_metrics_manager.py +212 -0
  184. aiecs/infrastructure/monitoring/structured_logger.py +3 -7
  185. aiecs/infrastructure/monitoring/tracing_manager.py +63 -35
  186. aiecs/infrastructure/persistence/__init__.py +14 -1
  187. aiecs/infrastructure/persistence/context_engine_client.py +184 -0
  188. aiecs/infrastructure/persistence/database_manager.py +67 -43
  189. aiecs/infrastructure/persistence/file_storage.py +180 -103
  190. aiecs/infrastructure/persistence/redis_client.py +74 -21
  191. aiecs/llm/__init__.py +73 -25
  192. aiecs/llm/callbacks/__init__.py +11 -0
  193. aiecs/llm/{custom_callbacks.py → callbacks/custom_callbacks.py} +26 -19
  194. aiecs/llm/client_factory.py +230 -37
  195. aiecs/llm/client_resolver.py +155 -0
  196. aiecs/llm/clients/__init__.py +38 -0
  197. aiecs/llm/clients/base_client.py +328 -0
  198. aiecs/llm/clients/google_function_calling_mixin.py +415 -0
  199. aiecs/llm/clients/googleai_client.py +314 -0
  200. aiecs/llm/clients/openai_client.py +158 -0
  201. aiecs/llm/clients/openai_compatible_mixin.py +367 -0
  202. aiecs/llm/clients/vertex_client.py +1186 -0
  203. aiecs/llm/clients/xai_client.py +201 -0
  204. aiecs/llm/config/__init__.py +51 -0
  205. aiecs/llm/config/config_loader.py +272 -0
  206. aiecs/llm/config/config_validator.py +206 -0
  207. aiecs/llm/config/model_config.py +143 -0
  208. aiecs/llm/protocols.py +149 -0
  209. aiecs/llm/utils/__init__.py +10 -0
  210. aiecs/llm/utils/validate_config.py +89 -0
  211. aiecs/main.py +140 -121
  212. aiecs/scripts/aid/VERSION_MANAGEMENT.md +138 -0
  213. aiecs/scripts/aid/__init__.py +19 -0
  214. aiecs/scripts/aid/module_checker.py +499 -0
  215. aiecs/scripts/aid/version_manager.py +235 -0
  216. aiecs/scripts/{DEPENDENCY_SYSTEM_SUMMARY.md → dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md} +1 -0
  217. aiecs/scripts/{README_DEPENDENCY_CHECKER.md → dependance_check/README_DEPENDENCY_CHECKER.md} +1 -0
  218. aiecs/scripts/dependance_check/__init__.py +15 -0
  219. aiecs/scripts/dependance_check/dependency_checker.py +1835 -0
  220. aiecs/scripts/{dependency_fixer.py → dependance_check/dependency_fixer.py} +192 -90
  221. aiecs/scripts/{download_nlp_data.py → dependance_check/download_nlp_data.py} +203 -71
  222. aiecs/scripts/dependance_patch/__init__.py +7 -0
  223. aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
  224. aiecs/scripts/{fix_weasel_validator.py → dependance_patch/fix_weasel/fix_weasel_validator.py} +21 -14
  225. aiecs/scripts/{patch_weasel_library.sh → dependance_patch/fix_weasel/patch_weasel_library.sh} +1 -1
  226. aiecs/scripts/knowledge_graph/__init__.py +3 -0
  227. aiecs/scripts/knowledge_graph/run_threshold_experiments.py +212 -0
  228. aiecs/scripts/migrations/multi_tenancy/README.md +142 -0
  229. aiecs/scripts/tools_develop/README.md +671 -0
  230. aiecs/scripts/tools_develop/README_CONFIG_CHECKER.md +273 -0
  231. aiecs/scripts/tools_develop/TOOLS_CONFIG_GUIDE.md +1287 -0
  232. aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
  233. aiecs/scripts/tools_develop/__init__.py +21 -0
  234. aiecs/scripts/tools_develop/check_all_tools_config.py +548 -0
  235. aiecs/scripts/tools_develop/check_type_annotations.py +257 -0
  236. aiecs/scripts/tools_develop/pre-commit-schema-coverage.sh +66 -0
  237. aiecs/scripts/tools_develop/schema_coverage.py +511 -0
  238. aiecs/scripts/tools_develop/validate_tool_schemas.py +475 -0
  239. aiecs/scripts/tools_develop/verify_executor_config_fix.py +98 -0
  240. aiecs/scripts/tools_develop/verify_tools.py +352 -0
  241. aiecs/tasks/__init__.py +0 -1
  242. aiecs/tasks/worker.py +115 -47
  243. aiecs/tools/__init__.py +194 -72
  244. aiecs/tools/apisource/__init__.py +99 -0
  245. aiecs/tools/apisource/intelligence/__init__.py +19 -0
  246. aiecs/tools/apisource/intelligence/data_fusion.py +632 -0
  247. aiecs/tools/apisource/intelligence/query_analyzer.py +417 -0
  248. aiecs/tools/apisource/intelligence/search_enhancer.py +385 -0
  249. aiecs/tools/apisource/monitoring/__init__.py +9 -0
  250. aiecs/tools/apisource/monitoring/metrics.py +330 -0
  251. aiecs/tools/apisource/providers/__init__.py +112 -0
  252. aiecs/tools/apisource/providers/base.py +671 -0
  253. aiecs/tools/apisource/providers/census.py +397 -0
  254. aiecs/tools/apisource/providers/fred.py +535 -0
  255. aiecs/tools/apisource/providers/newsapi.py +409 -0
  256. aiecs/tools/apisource/providers/worldbank.py +352 -0
  257. aiecs/tools/apisource/reliability/__init__.py +12 -0
  258. aiecs/tools/apisource/reliability/error_handler.py +363 -0
  259. aiecs/tools/apisource/reliability/fallback_strategy.py +376 -0
  260. aiecs/tools/apisource/tool.py +832 -0
  261. aiecs/tools/apisource/utils/__init__.py +9 -0
  262. aiecs/tools/apisource/utils/validators.py +334 -0
  263. aiecs/tools/base_tool.py +415 -21
  264. aiecs/tools/docs/__init__.py +121 -0
  265. aiecs/tools/docs/ai_document_orchestrator.py +607 -0
  266. aiecs/tools/docs/ai_document_writer_orchestrator.py +2350 -0
  267. aiecs/tools/docs/content_insertion_tool.py +1320 -0
  268. aiecs/tools/docs/document_creator_tool.py +1464 -0
  269. aiecs/tools/docs/document_layout_tool.py +1160 -0
  270. aiecs/tools/docs/document_parser_tool.py +1016 -0
  271. aiecs/tools/docs/document_writer_tool.py +2008 -0
  272. aiecs/tools/knowledge_graph/__init__.py +17 -0
  273. aiecs/tools/knowledge_graph/graph_reasoning_tool.py +807 -0
  274. aiecs/tools/knowledge_graph/graph_search_tool.py +944 -0
  275. aiecs/tools/knowledge_graph/kg_builder_tool.py +524 -0
  276. aiecs/tools/langchain_adapter.py +300 -138
  277. aiecs/tools/schema_generator.py +455 -0
  278. aiecs/tools/search_tool/__init__.py +100 -0
  279. aiecs/tools/search_tool/analyzers.py +581 -0
  280. aiecs/tools/search_tool/cache.py +264 -0
  281. aiecs/tools/search_tool/constants.py +128 -0
  282. aiecs/tools/search_tool/context.py +224 -0
  283. aiecs/tools/search_tool/core.py +778 -0
  284. aiecs/tools/search_tool/deduplicator.py +119 -0
  285. aiecs/tools/search_tool/error_handler.py +242 -0
  286. aiecs/tools/search_tool/metrics.py +343 -0
  287. aiecs/tools/search_tool/rate_limiter.py +172 -0
  288. aiecs/tools/search_tool/schemas.py +275 -0
  289. aiecs/tools/statistics/__init__.py +80 -0
  290. aiecs/tools/statistics/ai_data_analysis_orchestrator.py +646 -0
  291. aiecs/tools/statistics/ai_insight_generator_tool.py +508 -0
  292. aiecs/tools/statistics/ai_report_orchestrator_tool.py +684 -0
  293. aiecs/tools/statistics/data_loader_tool.py +555 -0
  294. aiecs/tools/statistics/data_profiler_tool.py +638 -0
  295. aiecs/tools/statistics/data_transformer_tool.py +580 -0
  296. aiecs/tools/statistics/data_visualizer_tool.py +498 -0
  297. aiecs/tools/statistics/model_trainer_tool.py +507 -0
  298. aiecs/tools/statistics/statistical_analyzer_tool.py +472 -0
  299. aiecs/tools/task_tools/__init__.py +49 -36
  300. aiecs/tools/task_tools/chart_tool.py +200 -184
  301. aiecs/tools/task_tools/classfire_tool.py +268 -267
  302. aiecs/tools/task_tools/image_tool.py +220 -141
  303. aiecs/tools/task_tools/office_tool.py +226 -146
  304. aiecs/tools/task_tools/pandas_tool.py +477 -121
  305. aiecs/tools/task_tools/report_tool.py +390 -142
  306. aiecs/tools/task_tools/research_tool.py +149 -79
  307. aiecs/tools/task_tools/scraper_tool.py +339 -145
  308. aiecs/tools/task_tools/stats_tool.py +448 -209
  309. aiecs/tools/temp_file_manager.py +26 -24
  310. aiecs/tools/tool_executor/__init__.py +18 -16
  311. aiecs/tools/tool_executor/tool_executor.py +364 -52
  312. aiecs/utils/LLM_output_structor.py +74 -48
  313. aiecs/utils/__init__.py +14 -3
  314. aiecs/utils/base_callback.py +0 -3
  315. aiecs/utils/cache_provider.py +696 -0
  316. aiecs/utils/execution_utils.py +50 -31
  317. aiecs/utils/prompt_loader.py +1 -0
  318. aiecs/utils/token_usage_repository.py +37 -11
  319. aiecs/ws/socket_server.py +14 -4
  320. {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/METADATA +52 -15
  321. aiecs-1.7.17.dist-info/RECORD +337 -0
  322. aiecs-1.7.17.dist-info/entry_points.txt +13 -0
  323. aiecs/config/registry.py +0 -19
  324. aiecs/domain/context/content_engine.py +0 -982
  325. aiecs/llm/base_client.py +0 -99
  326. aiecs/llm/openai_client.py +0 -125
  327. aiecs/llm/vertex_client.py +0 -186
  328. aiecs/llm/xai_client.py +0 -184
  329. aiecs/scripts/dependency_checker.py +0 -857
  330. aiecs/scripts/quick_dependency_check.py +0 -269
  331. aiecs/tools/task_tools/search_api.py +0 -7
  332. aiecs-1.0.1.dist-info/RECORD +0 -90
  333. aiecs-1.0.1.dist-info/entry_points.txt +0 -7
  334. /aiecs/scripts/{setup_nlp_data.sh → dependance_check/setup_nlp_data.sh} +0 -0
  335. /aiecs/scripts/{README_WEASEL_PATCH.md → dependance_patch/fix_weasel/README_WEASEL_PATCH.md} +0 -0
  336. /aiecs/scripts/{fix_weasel_validator.sh → dependance_patch/fix_weasel/fix_weasel_validator.sh} +0 -0
  337. /aiecs/scripts/{run_weasel_patch.sh → dependance_patch/fix_weasel/run_weasel_patch.sh} +0 -0
  338. {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/WHEEL +0 -0
  339. {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/licenses/LICENSE +0 -0
  340. {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,508 @@
1
+ """
2
+ AI Insight Generator Tool - AI-driven insight discovery and pattern detection
3
+
4
+ This tool provides advanced insight generation with:
5
+ - Pattern discovery and anomaly detection
6
+ - Trend analysis and forecasting
7
+ - Actionable insight generation
8
+ - Integration with research_tool reasoning methods
9
+ - AI-powered analysis (placeholder for future enhancement)
10
+ """
11
+
12
+ import logging
13
+ from typing import Dict, Any, List, Optional, Union
14
+ from enum import Enum
15
+ from datetime import datetime
16
+
17
+ import pandas as pd # type: ignore[import-untyped]
18
+ import numpy as np
19
+ from scipy import stats as scipy_stats # type: ignore[import-untyped]
20
+ from pydantic import BaseModel, Field
21
+ from pydantic_settings import BaseSettings, SettingsConfigDict
22
+
23
+ from aiecs.tools.base_tool import BaseTool
24
+ from aiecs.tools import register_tool
25
+
26
+
27
+ class InsightType(str, Enum):
28
+ """Types of insights to generate"""
29
+
30
+ PATTERN = "pattern"
31
+ ANOMALY = "anomaly"
32
+ TREND = "trend"
33
+ CORRELATION = "correlation"
34
+ SEGMENTATION = "segmentation"
35
+ CAUSATION = "causation"
36
+
37
+
38
+ class InsightGeneratorError(Exception):
39
+ """Base exception for Insight Generator errors"""
40
+
41
+
42
+ class InsightGenerationError(InsightGeneratorError):
43
+ """Raised when insight generation fails"""
44
+
45
+
46
+ @register_tool("ai_insight_generator")
47
+ class AIInsightGeneratorTool(BaseTool):
48
+ """
49
+ AI-powered insight generation tool that can:
50
+ 1. Discover hidden patterns in data
51
+ 2. Generate actionable insights
52
+ 3. Detect anomalies and outliers
53
+ 4. Predict trends and forecast
54
+ 5. Apply reasoning methods (Mill's methods, induction, deduction)
55
+
56
+ Integrates with research_tool for reasoning capabilities.
57
+ """
58
+
59
+ # Configuration schema
60
+ class Config(BaseSettings):
61
+ """Configuration for the AI insight generator tool
62
+
63
+ Automatically reads from environment variables with AI_INSIGHT_GENERATOR_ prefix.
64
+ Example: AI_INSIGHT_GENERATOR_MIN_CONFIDENCE -> min_confidence
65
+ """
66
+
67
+ model_config = SettingsConfigDict(env_prefix="AI_INSIGHT_GENERATOR_")
68
+
69
+ min_confidence: float = Field(
70
+ default=0.7,
71
+ description="Minimum confidence threshold for insights",
72
+ )
73
+ anomaly_std_threshold: float = Field(
74
+ default=3.0,
75
+ description="Standard deviation threshold for anomaly detection",
76
+ )
77
+ correlation_threshold: float = Field(
78
+ default=0.5,
79
+ description="Correlation threshold for significant relationships",
80
+ )
81
+ enable_reasoning: bool = Field(
82
+ default=True,
83
+ description="Whether to enable reasoning methods integration",
84
+ )
85
+
86
+ def __init__(self, config: Optional[Dict[str, Any]] = None, **kwargs):
87
+ """Initialize AI Insight Generator Tool
88
+
89
+ Configuration is automatically loaded by BaseTool from:
90
+ 1. Explicit config dict (highest priority)
91
+ 2. YAML config files (config/tools/ai_insight_generator.yaml)
92
+ 3. Environment variables (via dotenv from .env files)
93
+ 4. Tool defaults (lowest priority)
94
+
95
+ Args:
96
+ config: Optional configuration overrides
97
+ **kwargs: Additional arguments passed to BaseTool (e.g., tool_name)
98
+ """
99
+ super().__init__(config, **kwargs)
100
+
101
+ # Configuration is automatically loaded by BaseTool into self._config_obj
102
+ # Access config via self._config_obj (BaseSettings instance)
103
+ self.config = self._config_obj if self._config_obj else self.Config()
104
+
105
+ self.logger = logging.getLogger(__name__)
106
+ if not self.logger.handlers:
107
+ handler = logging.StreamHandler()
108
+ handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s"))
109
+ self.logger.addHandler(handler)
110
+ self.logger.setLevel(logging.INFO)
111
+
112
+ self._init_external_tools()
113
+
114
+ def _init_external_tools(self):
115
+ """Initialize external task tools"""
116
+ self.external_tools = {}
117
+
118
+ # Initialize ResearchTool for reasoning methods
119
+ try:
120
+ from aiecs.tools.task_tools.research_tool import ResearchTool
121
+
122
+ self.external_tools["research"] = ResearchTool()
123
+ self.logger.info("ResearchTool initialized successfully")
124
+ except ImportError:
125
+ self.logger.warning("ResearchTool not available")
126
+ self.external_tools["research"] = None
127
+
128
+ # Initialize StatisticalAnalyzerTool
129
+ try:
130
+ from aiecs.tools.statistics.statistical_analyzer_tool import (
131
+ StatisticalAnalyzerTool,
132
+ )
133
+
134
+ self.external_tools["stats_analyzer"] = StatisticalAnalyzerTool()
135
+ self.logger.info("StatisticalAnalyzerTool initialized successfully")
136
+ except ImportError:
137
+ self.logger.warning("StatisticalAnalyzerTool not available")
138
+ self.external_tools["stats_analyzer"] = None
139
+
140
+ # Schema definitions
141
+ class GenerateInsightsSchema(BaseModel):
142
+ """Schema for generate_insights operation"""
143
+
144
+ data: Union[Dict[str, Any], List[Dict[str, Any]]] = Field(description="Data to analyze")
145
+ analysis_results: Optional[Dict[str, Any]] = Field(default=None, description="Previous analysis results")
146
+ insight_types: Optional[List[InsightType]] = Field(default=None, description="Types of insights to generate")
147
+ min_confidence: float = Field(default=0.7, description="Minimum confidence threshold")
148
+
149
+ class DiscoverPatternsSchema(BaseModel):
150
+ """Schema for discover_patterns operation"""
151
+
152
+ data: Union[Dict[str, Any], List[Dict[str, Any]]] = Field(description="Data for pattern discovery")
153
+ pattern_types: Optional[List[str]] = Field(default=None, description="Specific pattern types")
154
+
155
+ class DetectAnomaliesSchema(BaseModel):
156
+ """Schema for detect_anomalies operation"""
157
+
158
+ data: Union[Dict[str, Any], List[Dict[str, Any]]] = Field(description="Data for anomaly detection")
159
+ columns: Optional[List[str]] = Field(default=None, description="Columns to check")
160
+ threshold: float = Field(default=3.0, description="Standard deviation threshold")
161
+
162
+ def generate_insights(
163
+ self,
164
+ data: Union[Dict[str, Any], List[Dict[str, Any]], pd.DataFrame],
165
+ analysis_results: Optional[Dict[str, Any]] = None,
166
+ insight_types: Optional[List[InsightType]] = None,
167
+ min_confidence: float = 0.7,
168
+ ) -> Dict[str, Any]:
169
+ """
170
+ Generate AI-powered insights from data and analysis results.
171
+
172
+ Args:
173
+ data: Data to analyze
174
+ analysis_results: Previous analysis results to incorporate
175
+ insight_types: Specific types of insights to generate (all if None)
176
+ min_confidence: Minimum confidence threshold for insights
177
+
178
+ Returns:
179
+ Dict containing:
180
+ - insights: List of generated insights
181
+ - summary: Overall summary
182
+ - priority_insights: Top priority insights
183
+ """
184
+ try:
185
+ df = self._to_dataframe(data)
186
+
187
+ self.logger.info(f"Generating insights from data with {len(df)} rows")
188
+
189
+ # Default to all insight types
190
+ if insight_types is None:
191
+ insight_types = list(InsightType)
192
+
193
+ insights = []
194
+
195
+ # Generate different types of insights
196
+ if InsightType.PATTERN in insight_types:
197
+ pattern_insights = self._discover_patterns_internal(df)
198
+ insights.extend(pattern_insights)
199
+
200
+ if InsightType.ANOMALY in insight_types:
201
+ anomaly_insights = self._detect_anomalies_internal(df)
202
+ insights.extend(anomaly_insights)
203
+
204
+ if InsightType.TREND in insight_types:
205
+ trend_insights = self._analyze_trends_internal(df)
206
+ insights.extend(trend_insights)
207
+
208
+ if InsightType.CORRELATION in insight_types:
209
+ correlation_insights = self._analyze_correlations_internal(df)
210
+ insights.extend(correlation_insights)
211
+
212
+ if InsightType.CAUSATION in insight_types and self.config.enable_reasoning:
213
+ causation_insights = self._analyze_causation_internal(df)
214
+ insights.extend(causation_insights)
215
+
216
+ # Filter by confidence
217
+ filtered_insights = [i for i in insights if i.get("confidence", 0) >= min_confidence]
218
+
219
+ # Prioritize insights
220
+ priority_insights = self._prioritize_insights(filtered_insights)
221
+
222
+ # Generate summary
223
+ summary = self._generate_insight_summary(filtered_insights)
224
+
225
+ return {
226
+ "insights": filtered_insights,
227
+ "summary": summary,
228
+ "priority_insights": priority_insights[:5],
229
+ "total_insights": len(filtered_insights),
230
+ "timestamp": datetime.now().isoformat(),
231
+ }
232
+
233
+ except Exception as e:
234
+ self.logger.error(f"Error generating insights: {e}")
235
+ raise InsightGenerationError(f"Insight generation failed: {e}")
236
+
237
+ def discover_patterns(
238
+ self,
239
+ data: Union[Dict[str, Any], List[Dict[str, Any]], pd.DataFrame],
240
+ pattern_types: Optional[List[str]] = None,
241
+ ) -> Dict[str, Any]:
242
+ """
243
+ Discover patterns in data.
244
+
245
+ Args:
246
+ data: Data for pattern discovery
247
+ pattern_types: Specific pattern types to look for
248
+
249
+ Returns:
250
+ Dict containing discovered patterns
251
+ """
252
+ try:
253
+ df = self._to_dataframe(data)
254
+ patterns = self._discover_patterns_internal(df)
255
+
256
+ return {"patterns": patterns, "total_patterns": len(patterns)}
257
+
258
+ except Exception as e:
259
+ self.logger.error(f"Error discovering patterns: {e}")
260
+ raise InsightGenerationError(f"Pattern discovery failed: {e}")
261
+
262
+ def detect_anomalies(
263
+ self,
264
+ data: Union[Dict[str, Any], List[Dict[str, Any]], pd.DataFrame],
265
+ columns: Optional[List[str]] = None,
266
+ threshold: float = 3.0,
267
+ ) -> Dict[str, Any]:
268
+ """
269
+ Detect anomalies in data.
270
+
271
+ Args:
272
+ data: Data for anomaly detection
273
+ columns: Columns to check (all numeric if None)
274
+ threshold: Standard deviation threshold
275
+
276
+ Returns:
277
+ Dict containing detected anomalies
278
+ """
279
+ try:
280
+ df = self._to_dataframe(data)
281
+ anomalies = self._detect_anomalies_internal(df, columns, threshold)
282
+
283
+ return {"anomalies": anomalies, "total_anomalies": len(anomalies)}
284
+
285
+ except Exception as e:
286
+ self.logger.error(f"Error detecting anomalies: {e}")
287
+ raise InsightGenerationError(f"Anomaly detection failed: {e}")
288
+
289
+ # Internal insight generation methods
290
+
291
+ def _to_dataframe(self, data: Union[Dict, List, pd.DataFrame]) -> pd.DataFrame:
292
+ """Convert data to DataFrame"""
293
+ if isinstance(data, pd.DataFrame):
294
+ return data
295
+ elif isinstance(data, list):
296
+ return pd.DataFrame(data)
297
+ elif isinstance(data, dict):
298
+ return pd.DataFrame([data])
299
+ else:
300
+ raise InsightGenerationError(f"Unsupported data type: {type(data)}")
301
+
302
+ def _discover_patterns_internal(self, df: pd.DataFrame) -> List[Dict[str, Any]]:
303
+ """Discover patterns in data"""
304
+ patterns = []
305
+
306
+ # Distribution patterns
307
+ numeric_cols = df.select_dtypes(include=[np.number]).columns
308
+ for col in numeric_cols:
309
+ series = df[col].dropna()
310
+ if len(series) > 0:
311
+ skewness = series.skew()
312
+ if abs(skewness) > 1:
313
+ patterns.append(
314
+ {
315
+ "type": InsightType.PATTERN.value,
316
+ "title": f"Skewed Distribution in {col}",
317
+ "description": f"Column {col} shows {'positive' if skewness > 0 else 'negative'} skew ({skewness:.2f})",
318
+ "confidence": 0.85,
319
+ "impact": "medium",
320
+ "evidence": {
321
+ "skewness": float(skewness),
322
+ "column": col,
323
+ },
324
+ }
325
+ )
326
+
327
+ # Categorical patterns
328
+ categorical_cols = df.select_dtypes(include=["object", "category"]).columns
329
+ for col in categorical_cols:
330
+ value_counts = df[col].value_counts()
331
+ if len(value_counts) > 0:
332
+ top_percentage = value_counts.iloc[0] / len(df) * 100
333
+ if top_percentage > 50:
334
+ patterns.append(
335
+ {
336
+ "type": InsightType.PATTERN.value,
337
+ "title": f"Dominant Category in {col}",
338
+ "description": f"'{value_counts.index[0]}' accounts for {top_percentage:.1f}% of {col}",
339
+ "confidence": 0.9,
340
+ "impact": "high",
341
+ "evidence": {
342
+ "dominant_value": str(value_counts.index[0]),
343
+ "percentage": float(top_percentage),
344
+ },
345
+ }
346
+ )
347
+
348
+ return patterns
349
+
350
+ def _detect_anomalies_internal(
351
+ self,
352
+ df: pd.DataFrame,
353
+ columns: Optional[List[str]] = None,
354
+ threshold: float = 3.0,
355
+ ) -> List[Dict[str, Any]]:
356
+ """Detect anomalies using statistical methods"""
357
+ anomalies = []
358
+
359
+ numeric_cols = columns if columns else df.select_dtypes(include=[np.number]).columns.tolist()
360
+
361
+ for col in numeric_cols:
362
+ if col not in df.columns:
363
+ continue
364
+
365
+ series = df[col].dropna()
366
+ if len(series) == 0 or series.std() == 0:
367
+ continue
368
+
369
+ # Z-score method
370
+ z_scores = np.abs((series - series.mean()) / series.std())
371
+ anomaly_count = (z_scores > threshold).sum()
372
+
373
+ if anomaly_count > 0:
374
+ anomaly_percentage = anomaly_count / len(series) * 100
375
+ anomalies.append(
376
+ {
377
+ "type": InsightType.ANOMALY.value,
378
+ "title": f"Anomalies Detected in {col}",
379
+ "description": f"Found {anomaly_count} anomalous values ({anomaly_percentage:.2f}%) in {col}",
380
+ "confidence": 0.8,
381
+ "impact": ("high" if anomaly_percentage > 5 else "medium"),
382
+ "evidence": {
383
+ "column": col,
384
+ "anomaly_count": int(anomaly_count),
385
+ "percentage": float(anomaly_percentage),
386
+ "threshold": threshold,
387
+ },
388
+ "recommendation": "Investigate and consider handling these outliers",
389
+ }
390
+ )
391
+
392
+ return anomalies
393
+
394
+ def _analyze_trends_internal(self, df: pd.DataFrame) -> List[Dict[str, Any]]:
395
+ """Analyze trends in data"""
396
+ trends = []
397
+
398
+ numeric_cols = df.select_dtypes(include=[np.number]).columns
399
+
400
+ for col in numeric_cols:
401
+ series = df[col].dropna()
402
+ if len(series) < 3:
403
+ continue
404
+
405
+ # Calculate trend using linear regression
406
+ x = np.arange(len(series))
407
+ y = series.values
408
+
409
+ if len(x) > 0 and len(y) > 0:
410
+ slope, intercept, r_value, p_value, std_err = scipy_stats.linregress(x, y)
411
+
412
+ if abs(r_value) > 0.5 and p_value < 0.05:
413
+ trend_direction = "increasing" if slope > 0 else "decreasing"
414
+ trends.append(
415
+ {
416
+ "type": InsightType.TREND.value,
417
+ "title": f"{trend_direction.capitalize()} Trend in {col}",
418
+ "description": f"Column {col} shows a {trend_direction} trend (R²={r_value**2:.3f})",
419
+ "confidence": float(abs(r_value)),
420
+ "impact": ("high" if abs(r_value) > 0.7 else "medium"),
421
+ "evidence": {
422
+ "column": col,
423
+ "slope": float(slope),
424
+ "r_squared": float(r_value**2),
425
+ "p_value": float(p_value),
426
+ },
427
+ }
428
+ )
429
+
430
+ return trends
431
+
432
+ def _analyze_correlations_internal(self, df: pd.DataFrame) -> List[Dict[str, Any]]:
433
+ """Analyze correlations between variables"""
434
+ correlations: List[Dict[str, Any]] = []
435
+
436
+ numeric_df = df.select_dtypes(include=[np.number])
437
+ if numeric_df.shape[1] < 2:
438
+ return correlations
439
+
440
+ corr_matrix = numeric_df.corr()
441
+
442
+ for i in range(len(corr_matrix.columns)):
443
+ for j in range(i + 1, len(corr_matrix.columns)):
444
+ corr_value = corr_matrix.iloc[i, j]
445
+
446
+ if abs(corr_value) > self.config.correlation_threshold:
447
+ col1 = corr_matrix.columns[i]
448
+ col2 = corr_matrix.columns[j]
449
+
450
+ strength = "strong" if abs(corr_value) > 0.7 else "moderate"
451
+ direction = "positive" if corr_value > 0 else "negative"
452
+
453
+ correlations.append(
454
+ {
455
+ "type": InsightType.CORRELATION.value,
456
+ "title": f"{strength.capitalize()} {direction} correlation",
457
+ "description": f"{col1} and {col2} show {strength} {direction} correlation ({corr_value:.3f})",
458
+ "confidence": float(abs(corr_value)),
459
+ "impact": ("high" if abs(corr_value) > 0.7 else "medium"),
460
+ "evidence": {
461
+ "variable1": col1,
462
+ "variable2": col2,
463
+ "correlation": float(corr_value),
464
+ },
465
+ "recommendation": "Consider investigating causal relationship",
466
+ }
467
+ )
468
+
469
+ return correlations
470
+
471
+ def _analyze_causation_internal(self, df: pd.DataFrame) -> List[Dict[str, Any]]:
472
+ """Analyze potential causal relationships using reasoning methods"""
473
+ causations: List[Dict[str, Any]] = []
474
+
475
+ # Use research tool for Mill's methods if available
476
+ if self.external_tools.get("research"):
477
+ # Placeholder for causal analysis using Mill's methods
478
+ # This would require domain knowledge and proper case structures
479
+ self.logger.info("Causal analysis with reasoning methods available but requires domain-specific setup")
480
+
481
+ return causations
482
+
483
+ def _prioritize_insights(self, insights: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
484
+ """Prioritize insights by confidence and impact"""
485
+ impact_scores = {"high": 3, "medium": 2, "low": 1}
486
+
487
+ def priority_score(insight):
488
+ confidence = insight.get("confidence", 0.5)
489
+ impact = impact_scores.get(insight.get("impact", "low"), 1)
490
+ return confidence * impact
491
+
492
+ return sorted(insights, key=priority_score, reverse=True)
493
+
494
+ def _generate_insight_summary(self, insights: List[Dict[str, Any]]) -> str:
495
+ """Generate summary of insights"""
496
+ if not insights:
497
+ return "No significant insights found in the data."
498
+
499
+ type_counts: Dict[str, int] = {}
500
+ for insight in insights:
501
+ insight_type = insight.get("type", "unknown")
502
+ type_counts[insight_type] = type_counts.get(insight_type, 0) + 1
503
+
504
+ summary_parts = [f"Generated {len(insights)} insights:"]
505
+ for itype, count in type_counts.items():
506
+ summary_parts.append(f"{count} {itype} insights")
507
+
508
+ return "; ".join(summary_parts)