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,498 @@
1
+ """
2
+ Data Visualizer Tool - Smart data visualization and chart generation
3
+
4
+ This tool provides intelligent visualization capabilities with:
5
+ - Auto chart type recommendation
6
+ - Multiple chart types support
7
+ - Interactive and static visualizations
8
+ - Export in multiple formats
9
+ """
10
+
11
+ import os
12
+ import logging
13
+ import tempfile
14
+ from typing import Dict, Any, List, Optional, Union
15
+ from enum import Enum
16
+
17
+ import pandas as pd # type: ignore[import-untyped]
18
+ import numpy as np
19
+ from pydantic import BaseModel, Field
20
+ from pydantic_settings import BaseSettings, SettingsConfigDict
21
+
22
+ from aiecs.tools.base_tool import BaseTool
23
+ from aiecs.tools import register_tool
24
+
25
+
26
+ class ChartType(str, Enum):
27
+ """Supported chart types"""
28
+
29
+ # Basic charts
30
+ LINE = "line"
31
+ BAR = "bar"
32
+ SCATTER = "scatter"
33
+ HISTOGRAM = "histogram"
34
+ BOX = "box"
35
+ VIOLIN = "violin"
36
+
37
+ # Advanced charts
38
+ HEATMAP = "heatmap"
39
+ CORRELATION_MATRIX = "correlation_matrix"
40
+ PAIR_PLOT = "pair_plot"
41
+ PARALLEL_COORDINATES = "parallel_coordinates"
42
+
43
+ # Statistical charts
44
+ DISTRIBUTION = "distribution"
45
+ QQ_PLOT = "qq_plot"
46
+ RESIDUAL_PLOT = "residual_plot"
47
+
48
+ # Time series
49
+ TIME_SERIES = "time_series"
50
+
51
+ # Auto-detect
52
+ AUTO = "auto"
53
+
54
+
55
+ class VisualizationStyle(str, Enum):
56
+ """Visualization styles"""
57
+
58
+ STATIC = "static"
59
+ INTERACTIVE = "interactive"
60
+ ANIMATED = "animated"
61
+
62
+
63
+ class DataVisualizerError(Exception):
64
+ """Base exception for DataVisualizer errors"""
65
+
66
+
67
+ class VisualizationError(DataVisualizerError):
68
+ """Raised when visualization fails"""
69
+
70
+
71
+ @register_tool("data_visualizer")
72
+ class DataVisualizerTool(BaseTool):
73
+ """
74
+ Intelligent data visualization tool that can:
75
+ 1. Auto-recommend appropriate chart types
76
+ 2. Generate interactive visualizations
77
+ 3. Create multi-dimensional plots
78
+ 4. Export in multiple formats
79
+
80
+ Integrates with chart_tool for core visualization operations.
81
+ """
82
+
83
+ # Configuration schema
84
+ class Config(BaseSettings):
85
+ """Configuration for the data visualizer tool
86
+
87
+ Automatically reads from environment variables with DATA_VISUALIZER_ prefix.
88
+ Example: DATA_VISUALIZER_DEFAULT_STYLE -> default_style
89
+ """
90
+
91
+ model_config = SettingsConfigDict(env_prefix="DATA_VISUALIZER_")
92
+
93
+ default_style: str = Field(default="static", description="Default visualization style")
94
+ default_output_dir: str = Field(
95
+ default=tempfile.gettempdir(),
96
+ description="Default directory for output files",
97
+ )
98
+ default_dpi: int = Field(default=100, description="Default DPI for image exports")
99
+ default_figsize: List[int] = Field(
100
+ default=[10, 6],
101
+ description="Default figure size in inches (width, height)",
102
+ )
103
+ enable_auto_recommendation: bool = Field(
104
+ default=True,
105
+ description="Whether to enable automatic chart type recommendation",
106
+ )
107
+
108
+ def __init__(self, config: Optional[Dict[str, Any]] = None, **kwargs):
109
+ """
110
+ Initialize DataVisualizerTool with settings.
111
+
112
+ Configuration is automatically loaded by BaseTool from:
113
+ 1. Explicit config dict (highest priority)
114
+ 2. YAML config files (config/tools/data_visualizer.yaml)
115
+ 3. Environment variables (via dotenv from .env files)
116
+ 4. Tool defaults (lowest priority)
117
+
118
+ Args:
119
+ config: Optional configuration overrides
120
+ **kwargs: Additional arguments passed to BaseTool (e.g., tool_name)
121
+ """
122
+ super().__init__(config, **kwargs)
123
+
124
+ # Configuration is automatically loaded by BaseTool into self._config_obj
125
+ # Access config via self._config_obj (BaseSettings instance)
126
+ self.config = self._config_obj if self._config_obj else self.Config()
127
+
128
+ self.logger = logging.getLogger(__name__)
129
+ if not self.logger.handlers:
130
+ handler = logging.StreamHandler()
131
+ handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s"))
132
+ self.logger.addHandler(handler)
133
+ self.logger.setLevel(logging.INFO)
134
+
135
+ # Initialize external tools
136
+ self._init_external_tools()
137
+
138
+ def _init_external_tools(self):
139
+ """Initialize external task tools"""
140
+ self.external_tools = {}
141
+
142
+ # Initialize ChartTool for visualization operations
143
+ try:
144
+ from aiecs.tools.task_tools.chart_tool import ChartTool
145
+
146
+ self.external_tools["chart"] = ChartTool()
147
+ self.logger.info("ChartTool initialized successfully")
148
+ except ImportError:
149
+ self.logger.warning("ChartTool not available")
150
+ self.external_tools["chart"] = None
151
+
152
+ # Schema definitions
153
+ class VisualizeSchema(BaseModel):
154
+ """Schema for visualize operation"""
155
+
156
+ data: Union[Dict[str, Any], List[Dict[str, Any]]] = Field(description="Data to visualize")
157
+ chart_type: ChartType = Field(default=ChartType.AUTO, description="Type of chart")
158
+ x: Optional[str] = Field(default=None, description="X-axis column")
159
+ y: Optional[str] = Field(default=None, description="Y-axis column")
160
+ hue: Optional[str] = Field(default=None, description="Hue/color column")
161
+ style: VisualizationStyle = Field(
162
+ default=VisualizationStyle.STATIC,
163
+ description="Visualization style",
164
+ )
165
+ title: Optional[str] = Field(default=None, description="Chart title")
166
+ output_path: Optional[str] = Field(default=None, description="Output file path")
167
+
168
+ class AutoVisualizeDatasetSchema(BaseModel):
169
+ """Schema for auto_visualize_dataset operation"""
170
+
171
+ data: Union[Dict[str, Any], List[Dict[str, Any]]] = Field(description="Dataset to visualize")
172
+ max_charts: int = Field(default=10, description="Maximum number of charts to generate")
173
+ focus_areas: Optional[List[str]] = Field(default=None, description="Areas to focus on")
174
+
175
+ class RecommendChartTypeSchema(BaseModel):
176
+ """Schema for recommend_chart_type operation"""
177
+
178
+ data: Union[Dict[str, Any], List[Dict[str, Any]]] = Field(description="Data for recommendation")
179
+ x: Optional[str] = Field(default=None, description="X column")
180
+ y: Optional[str] = Field(default=None, description="Y column")
181
+
182
+ def visualize(
183
+ self,
184
+ data: Union[Dict[str, Any], List[Dict[str, Any]], pd.DataFrame],
185
+ chart_type: ChartType = ChartType.AUTO,
186
+ x: Optional[str] = None,
187
+ y: Optional[str] = None,
188
+ hue: Optional[str] = None,
189
+ style: VisualizationStyle = VisualizationStyle.STATIC,
190
+ title: Optional[str] = None,
191
+ output_path: Optional[str] = None,
192
+ ) -> Dict[str, Any]:
193
+ """
194
+ Create visualization with auto chart type recommendation.
195
+
196
+ Args:
197
+ data: Data to visualize
198
+ chart_type: Type of chart (auto-recommended if AUTO)
199
+ x: X-axis column name
200
+ y: Y-axis column name
201
+ hue: Column for color encoding
202
+ style: Visualization style
203
+ title: Chart title
204
+ output_path: Path to save the chart
205
+
206
+ Returns:
207
+ Dict containing:
208
+ - chart_info: Information about generated chart
209
+ - chart_type: Type of chart created
210
+ - recommendation_reason: Reason for chart type choice
211
+ - output_path: Path to saved chart (if saved)
212
+
213
+ Raises:
214
+ VisualizationError: If visualization fails
215
+ """
216
+ try:
217
+ df = self._to_dataframe(data)
218
+
219
+ # Auto-recommend chart type if needed
220
+ if chart_type == ChartType.AUTO:
221
+ chart_type, reason = self._recommend_chart_type(df, x, y)
222
+ self.logger.info(f"Auto-recommended chart type: {chart_type.value} - {reason}")
223
+ else:
224
+ reason = "User specified"
225
+
226
+ # Generate output path if not provided
227
+ if output_path is None:
228
+ output_path = os.path.join(
229
+ self.config.default_output_dir,
230
+ f"chart_{chart_type.value}_{pd.Timestamp.now().strftime('%Y%m%d_%H%M%S')}.png",
231
+ )
232
+
233
+ # Create visualization using chart_tool if available
234
+ if self.external_tools.get("chart"):
235
+ chart_result = self._create_chart_with_tool(df, chart_type, x, y, hue, title, output_path)
236
+ else:
237
+ chart_result = self._create_chart_matplotlib(df, chart_type, x, y, hue, title, output_path)
238
+
239
+ return {
240
+ "chart_info": chart_result,
241
+ "chart_type": chart_type.value,
242
+ "recommendation_reason": reason,
243
+ "output_path": output_path,
244
+ "style": style.value,
245
+ }
246
+
247
+ except Exception as e:
248
+ self.logger.error(f"Error creating visualization: {e}")
249
+ raise VisualizationError(f"Visualization failed: {e}")
250
+
251
+ def auto_visualize_dataset(
252
+ self,
253
+ data: Union[Dict[str, Any], List[Dict[str, Any]], pd.DataFrame],
254
+ max_charts: int = 10,
255
+ focus_areas: Optional[List[str]] = None,
256
+ ) -> Dict[str, Any]:
257
+ """
258
+ Automatically generate a comprehensive visualization suite.
259
+
260
+ Args:
261
+ data: Dataset to visualize
262
+ max_charts: Maximum number of charts to generate
263
+ focus_areas: Specific areas to focus on (distributions, correlations, outliers)
264
+
265
+ Returns:
266
+ Dict containing information about all generated charts
267
+ """
268
+ try:
269
+ df = self._to_dataframe(data)
270
+
271
+ generated_charts = []
272
+ chart_count = 0
273
+
274
+ # Default focus areas
275
+ if focus_areas is None:
276
+ focus_areas = ["distributions", "correlations", "outliers"]
277
+
278
+ # Generate distribution charts
279
+ if "distributions" in focus_areas and chart_count < max_charts:
280
+ numeric_cols = df.select_dtypes(include=[np.number]).columns[:5]
281
+ for col in numeric_cols:
282
+ if chart_count >= max_charts:
283
+ break
284
+ chart_info = self.visualize(
285
+ df,
286
+ ChartType.HISTOGRAM,
287
+ x=col,
288
+ title=f"Distribution of {col}",
289
+ )
290
+ generated_charts.append(chart_info)
291
+ chart_count += 1
292
+
293
+ # Generate correlation matrix
294
+ if "correlations" in focus_areas and chart_count < max_charts:
295
+ numeric_cols = df.select_dtypes(include=[np.number]).columns
296
+ if len(numeric_cols) >= 2:
297
+ chart_info = self.visualize(
298
+ df,
299
+ ChartType.CORRELATION_MATRIX,
300
+ title="Correlation Matrix",
301
+ )
302
+ generated_charts.append(chart_info)
303
+ chart_count += 1
304
+
305
+ # Generate box plots for outlier detection
306
+ if "outliers" in focus_areas and chart_count < max_charts:
307
+ numeric_cols = df.select_dtypes(include=[np.number]).columns[:3]
308
+ for col in numeric_cols:
309
+ if chart_count >= max_charts:
310
+ break
311
+ chart_info = self.visualize(df, ChartType.BOX, y=col, title=f"Box Plot of {col}")
312
+ generated_charts.append(chart_info)
313
+ chart_count += 1
314
+
315
+ return {
316
+ "generated_charts": generated_charts,
317
+ "total_charts": len(generated_charts),
318
+ "focus_areas": focus_areas,
319
+ }
320
+
321
+ except Exception as e:
322
+ self.logger.error(f"Error in auto visualization: {e}")
323
+ raise VisualizationError(f"Auto visualization failed: {e}")
324
+
325
+ def recommend_chart_type(
326
+ self,
327
+ data: Union[Dict[str, Any], List[Dict[str, Any]], pd.DataFrame],
328
+ x: Optional[str] = None,
329
+ y: Optional[str] = None,
330
+ ) -> Dict[str, Any]:
331
+ """
332
+ Recommend appropriate chart type based on data characteristics.
333
+
334
+ Args:
335
+ data: Data for analysis
336
+ x: X column name
337
+ y: Y column name
338
+
339
+ Returns:
340
+ Dict containing recommended chart type and reasoning
341
+ """
342
+ try:
343
+ df = self._to_dataframe(data)
344
+ chart_type, reason = self._recommend_chart_type(df, x, y)
345
+
346
+ return {
347
+ "recommended_chart": chart_type.value,
348
+ "reason": reason,
349
+ "confidence": "high",
350
+ }
351
+
352
+ except Exception as e:
353
+ self.logger.error(f"Error recommending chart type: {e}")
354
+ raise VisualizationError(f"Chart recommendation failed: {e}")
355
+
356
+ # Internal helper methods
357
+
358
+ def _to_dataframe(self, data: Union[Dict, List, pd.DataFrame]) -> pd.DataFrame:
359
+ """Convert data to DataFrame"""
360
+ if isinstance(data, pd.DataFrame):
361
+ return data
362
+ elif isinstance(data, list):
363
+ return pd.DataFrame(data)
364
+ elif isinstance(data, dict):
365
+ return pd.DataFrame([data])
366
+ else:
367
+ raise VisualizationError(f"Unsupported data type: {type(data)}")
368
+
369
+ def _recommend_chart_type(self, df: pd.DataFrame, x: Optional[str], y: Optional[str]) -> tuple:
370
+ """Recommend chart type based on data characteristics"""
371
+ # If no columns specified, recommend based on data structure
372
+ if x is None and y is None:
373
+ numeric_cols = df.select_dtypes(include=[np.number]).columns
374
+ if len(numeric_cols) >= 2:
375
+ return (
376
+ ChartType.CORRELATION_MATRIX,
377
+ "Multiple numeric columns detected",
378
+ )
379
+ elif len(numeric_cols) == 1:
380
+ return ChartType.HISTOGRAM, "Single numeric column detected"
381
+ else:
382
+ return ChartType.BAR, "Categorical data detected"
383
+
384
+ # Determine column types
385
+ x_is_numeric = x and df[x].dtype in ["int64", "float64"] if x in df.columns else False
386
+ y_is_numeric = y and df[y].dtype in ["int64", "float64"] if y in df.columns else False
387
+
388
+ # Both numeric: scatter or line
389
+ if x_is_numeric and y_is_numeric:
390
+ # Check if x looks like time series
391
+ if x and (("date" in x.lower()) or ("time" in x.lower())):
392
+ return ChartType.TIME_SERIES, "Time series data detected"
393
+ return ChartType.SCATTER, "Two numeric variables"
394
+
395
+ # One numeric, one categorical: bar or box
396
+ if (x_is_numeric and not y_is_numeric) or (not x_is_numeric and y_is_numeric):
397
+ return ChartType.BAR, "Mix of numeric and categorical"
398
+
399
+ # Both categorical: bar
400
+ if x and y and not x_is_numeric and not y_is_numeric:
401
+ return ChartType.BAR, "Two categorical variables"
402
+
403
+ # Single numeric: histogram
404
+ if (x_is_numeric and y is None) or (y_is_numeric and x is None):
405
+ return ChartType.HISTOGRAM, "Single numeric variable distribution"
406
+
407
+ # Default
408
+ return ChartType.BAR, "Default chart type"
409
+
410
+ def _create_chart_with_tool(
411
+ self,
412
+ df: pd.DataFrame,
413
+ chart_type: ChartType,
414
+ x: Optional[str],
415
+ y: Optional[str],
416
+ hue: Optional[str],
417
+ title: Optional[str],
418
+ output_path: str,
419
+ ) -> Dict[str, Any]:
420
+ """Create chart using chart_tool"""
421
+ chart_tool = self.external_tools["chart"]
422
+
423
+ # Convert chart type to chart_tool format
424
+ chart_config = {
425
+ "data": df.to_dict("records"),
426
+ "chart_type": chart_type.value,
427
+ "x": x,
428
+ "y": y,
429
+ "title": title or f"{chart_type.value.title()} Chart",
430
+ "output_path": output_path,
431
+ }
432
+
433
+ try:
434
+ result = chart_tool.run("create_chart", **chart_config)
435
+ return result
436
+ except Exception as e:
437
+ self.logger.warning(f"chart_tool failed, falling back to matplotlib: {e}")
438
+ return self._create_chart_matplotlib(df, chart_type, x, y, hue, title, output_path)
439
+
440
+ def _create_chart_matplotlib(
441
+ self,
442
+ df: pd.DataFrame,
443
+ chart_type: ChartType,
444
+ x: Optional[str],
445
+ y: Optional[str],
446
+ hue: Optional[str],
447
+ title: Optional[str],
448
+ output_path: str,
449
+ ) -> Dict[str, Any]:
450
+ """Create chart using matplotlib as fallback"""
451
+ import matplotlib.pyplot as plt
452
+
453
+ fig, ax = plt.subplots(figsize=self.config.default_figsize)
454
+
455
+ if chart_type == ChartType.HISTOGRAM and x:
456
+ ax.hist(df[x].dropna(), bins=30, edgecolor="black")
457
+ ax.set_xlabel(x)
458
+ ax.set_ylabel("Frequency")
459
+ elif chart_type == ChartType.SCATTER and x and y:
460
+ ax.scatter(df[x], df[y], alpha=0.6)
461
+ ax.set_xlabel(x)
462
+ ax.set_ylabel(y)
463
+ elif chart_type == ChartType.BAR and x and y:
464
+ df_grouped = df.groupby(x)[y].mean()
465
+ df_grouped.plot(kind="bar", ax=ax)
466
+ ax.set_xlabel(x)
467
+ ax.set_ylabel(y)
468
+ elif chart_type == ChartType.CORRELATION_MATRIX:
469
+ numeric_df = df.select_dtypes(include=[np.number])
470
+ if len(numeric_df.columns) >= 2:
471
+ corr = numeric_df.corr()
472
+ im = ax.imshow(corr, cmap="coolwarm", aspect="auto")
473
+ ax.set_xticks(range(len(corr.columns)))
474
+ ax.set_yticks(range(len(corr.columns)))
475
+ ax.set_xticklabels(corr.columns, rotation=45, ha="right")
476
+ ax.set_yticklabels(corr.columns)
477
+ plt.colorbar(im, ax=ax)
478
+ elif chart_type == ChartType.BOX and y:
479
+ df.boxplot(column=y, ax=ax)
480
+ else:
481
+ # Default: simple line plot
482
+ if x and y:
483
+ ax.plot(df[x], df[y])
484
+ elif x:
485
+ ax.plot(df[x])
486
+
487
+ if title:
488
+ ax.set_title(title)
489
+
490
+ plt.tight_layout()
491
+ plt.savefig(output_path, dpi=self.config.default_dpi, bbox_inches="tight")
492
+ plt.close()
493
+
494
+ return {
495
+ "status": "success",
496
+ "output_path": output_path,
497
+ "chart_type": chart_type.value,
498
+ }