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
@@ -1,857 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Comprehensive dependency checker for AIECS tools.
4
-
5
- This script checks all system dependencies, Python packages, and model files
6
- required by various AIECS tools and provides detailed status reports and
7
- installation instructions.
8
- """
9
-
10
- import os
11
- import sys
12
- import subprocess
13
- import platform
14
- import shutil
15
- import logging
16
- from pathlib import Path
17
- from typing import Dict, List, Tuple, Optional, Any
18
- from dataclasses import dataclass
19
- from enum import Enum
20
-
21
-
22
- class DependencyStatus(Enum):
23
- """Status of a dependency check."""
24
- AVAILABLE = "available"
25
- MISSING = "missing"
26
- PARTIAL = "partial"
27
- ERROR = "error"
28
-
29
-
30
- @dataclass
31
- class DependencyInfo:
32
- """Information about a dependency."""
33
- name: str
34
- status: DependencyStatus
35
- description: str
36
- install_command: Optional[str] = None
37
- install_url: Optional[str] = None
38
- impact: str = ""
39
- is_critical: bool = True
40
-
41
-
42
- @dataclass
43
- class ToolDependencies:
44
- """Dependencies for a specific tool."""
45
- tool_name: str
46
- system_deps: List[DependencyInfo]
47
- python_deps: List[DependencyInfo]
48
- model_deps: List[DependencyInfo]
49
- optional_deps: List[DependencyInfo]
50
-
51
-
52
- class DependencyChecker:
53
- """Main dependency checker class."""
54
-
55
- def __init__(self):
56
- self.logger = self._setup_logging()
57
- self.system = platform.system().lower()
58
- self.architecture = platform.machine().lower()
59
- self.python_version = f"{sys.version_info.major}.{sys.version_info.minor}"
60
-
61
- def _setup_logging(self) -> logging.Logger:
62
- """Setup logging configuration."""
63
- logging.basicConfig(
64
- level=logging.INFO,
65
- format='%(asctime)s - %(levelname)s - %(message)s',
66
- handlers=[
67
- logging.StreamHandler(sys.stdout),
68
- logging.FileHandler('dependency_check.log')
69
- ]
70
- )
71
- return logging.getLogger(__name__)
72
-
73
- def check_system_command(self, command: str, version_flag: str = "--version") -> DependencyStatus:
74
- """Check if a system command is available."""
75
- try:
76
- result = subprocess.run(
77
- [command, version_flag],
78
- capture_output=True,
79
- text=True,
80
- timeout=10
81
- )
82
- if result.returncode == 0:
83
- return DependencyStatus.AVAILABLE
84
- else:
85
- return DependencyStatus.MISSING
86
- except (subprocess.TimeoutExpired, FileNotFoundError, subprocess.CalledProcessError):
87
- return DependencyStatus.MISSING
88
-
89
- def check_python_package(self, package_name: str) -> DependencyStatus:
90
- """Check if a Python package is installed."""
91
- try:
92
- __import__(package_name)
93
- return DependencyStatus.AVAILABLE
94
- except ImportError:
95
- return DependencyStatus.MISSING
96
-
97
- def check_file_exists(self, file_path: str) -> DependencyStatus:
98
- """Check if a file exists."""
99
- if os.path.exists(file_path):
100
- return DependencyStatus.AVAILABLE
101
- else:
102
- return DependencyStatus.MISSING
103
-
104
- def check_directory_exists(self, dir_path: str) -> DependencyStatus:
105
- """Check if a directory exists."""
106
- if os.path.isdir(dir_path):
107
- return DependencyStatus.AVAILABLE
108
- else:
109
- return DependencyStatus.MISSING
110
-
111
- def get_system_package_manager(self) -> str:
112
- """Get the appropriate package manager for the system."""
113
- if self.system == "linux":
114
- if shutil.which("apt-get"):
115
- return "apt-get"
116
- elif shutil.which("yum"):
117
- return "yum"
118
- elif shutil.which("dnf"):
119
- return "dnf"
120
- elif shutil.which("pacman"):
121
- return "pacman"
122
- elif self.system == "darwin":
123
- if shutil.which("brew"):
124
- return "brew"
125
- elif self.system == "windows":
126
- return "chocolatey"
127
- return "unknown"
128
-
129
- def check_image_tool_dependencies(self) -> ToolDependencies:
130
- """Check dependencies for Image Tool."""
131
- system_deps = []
132
- python_deps = []
133
- model_deps = []
134
- optional_deps = []
135
-
136
- # Tesseract OCR
137
- tesseract_status = self.check_system_command("tesseract")
138
- system_deps.append(DependencyInfo(
139
- name="Tesseract OCR",
140
- status=tesseract_status,
141
- description="OCR engine for text extraction from images",
142
- install_command=self._get_tesseract_install_command(),
143
- impact="OCR functionality will be unavailable",
144
- is_critical=True
145
- ))
146
-
147
- # Pillow system dependencies
148
- pillow_status = self._check_pillow_system_deps()
149
- system_deps.append(DependencyInfo(
150
- name="Pillow System Libraries",
151
- status=pillow_status,
152
- description="Image processing system libraries (libjpeg, libpng, etc.)",
153
- install_command=self._get_pillow_system_deps_command(),
154
- impact="Image processing may fail or be limited",
155
- is_critical=True
156
- ))
157
-
158
- # Python packages
159
- python_packages = ["PIL", "pytesseract"]
160
- for pkg in python_packages:
161
- status = self.check_python_package(pkg)
162
- python_deps.append(DependencyInfo(
163
- name=pkg,
164
- status=status,
165
- description=f"Python package: {pkg}",
166
- install_command=f"pip install {pkg}",
167
- impact=f"{pkg} functionality will be unavailable",
168
- is_critical=True
169
- ))
170
-
171
- # Tesseract language packs
172
- lang_packs = ["eng", "chi_sim", "chi_tra", "fra", "deu", "jpn", "kor", "rus", "spa"]
173
- for lang in lang_packs:
174
- status = self._check_tesseract_lang_pack(lang)
175
- model_deps.append(DependencyInfo(
176
- name=f"Tesseract {lang}",
177
- status=status,
178
- description=f"Tesseract language pack for {lang}",
179
- install_command=self._get_tesseract_lang_install_command(lang),
180
- impact=f"OCR in {lang} language will be unavailable",
181
- is_critical=False
182
- ))
183
-
184
- return ToolDependencies(
185
- tool_name="Image Tool",
186
- system_deps=system_deps,
187
- python_deps=python_deps,
188
- model_deps=model_deps,
189
- optional_deps=optional_deps
190
- )
191
-
192
- def check_classfire_tool_dependencies(self) -> ToolDependencies:
193
- """Check dependencies for ClassFire Tool."""
194
- system_deps = []
195
- python_deps = []
196
- model_deps = []
197
- optional_deps = []
198
-
199
- # Python packages
200
- python_packages = ["spacy", "transformers", "nltk", "rake_nltk", "spacy_pkuseg"]
201
- for pkg in python_packages:
202
- status = self.check_python_package(pkg)
203
- is_critical = pkg != "spacy_pkuseg" # spacy_pkuseg is optional
204
- python_deps.append(DependencyInfo(
205
- name=pkg,
206
- status=status,
207
- description=f"Python package: {pkg}",
208
- install_command=f"pip install {pkg}",
209
- impact=f"{pkg} functionality will be unavailable",
210
- is_critical=is_critical
211
- ))
212
-
213
- # spaCy models
214
- spacy_models = ["en_core_web_sm", "zh_core_web_sm"]
215
- for model in spacy_models:
216
- status = self._check_spacy_model(model)
217
- is_critical = model == "en_core_web_sm" # Only English model is critical
218
- model_deps.append(DependencyInfo(
219
- name=f"spaCy {model}",
220
- status=status,
221
- description=f"spaCy model: {model}",
222
- install_command=f"python -m spacy download {model}",
223
- impact=f"Text processing in {model.split('_')[0]} language will be unavailable",
224
- is_critical=is_critical
225
- ))
226
-
227
- # spaCy PKUSeg model (optional Chinese segmentation)
228
- pkuseg_status = self._check_spacy_pkuseg_model()
229
- model_deps.append(DependencyInfo(
230
- name="spaCy PKUSeg",
231
- status=pkuseg_status,
232
- description="Chinese text segmentation model for spaCy",
233
- install_command="pip install spacy_pkuseg",
234
- impact="Advanced Chinese text segmentation will be unavailable",
235
- is_critical=False
236
- ))
237
-
238
- # Transformers models
239
- transformers_models = ["facebook/bart-large-cnn", "t5-base"]
240
- for model in transformers_models:
241
- status = self._check_transformers_model(model)
242
- model_deps.append(DependencyInfo(
243
- name=f"Transformers {model}",
244
- status=status,
245
- description=f"Transformers model: {model}",
246
- install_command="Models download automatically on first use",
247
- impact=f"Text summarization with {model} will be unavailable",
248
- is_critical=False
249
- ))
250
-
251
- # NLTK data
252
- nltk_data = ["stopwords", "punkt", "wordnet", "averaged_perceptron_tagger"]
253
- for data in nltk_data:
254
- status = self._check_nltk_data(data)
255
- model_deps.append(DependencyInfo(
256
- name=f"NLTK {data}",
257
- status=status,
258
- description=f"NLTK data: {data}",
259
- install_command=f"python -c \"import nltk; nltk.download('{data}')\"",
260
- impact=f"NLTK {data} functionality will be unavailable",
261
- is_critical=True
262
- ))
263
-
264
- return ToolDependencies(
265
- tool_name="ClassFire Tool",
266
- system_deps=system_deps,
267
- python_deps=python_deps,
268
- model_deps=model_deps,
269
- optional_deps=optional_deps
270
- )
271
-
272
- def check_office_tool_dependencies(self) -> ToolDependencies:
273
- """Check dependencies for Office Tool."""
274
- system_deps = []
275
- python_deps = []
276
- model_deps = []
277
- optional_deps = []
278
-
279
- # Java Runtime Environment
280
- java_status = self.check_system_command("java", "-version")
281
- system_deps.append(DependencyInfo(
282
- name="Java Runtime Environment",
283
- status=java_status,
284
- description="Java runtime for Apache Tika document parsing",
285
- install_command=self._get_java_install_command(),
286
- impact="Document parsing with Tika will be unavailable",
287
- is_critical=True
288
- ))
289
-
290
- # Tesseract OCR
291
- tesseract_status = self.check_system_command("tesseract")
292
- system_deps.append(DependencyInfo(
293
- name="Tesseract OCR",
294
- status=tesseract_status,
295
- description="OCR engine for image text extraction",
296
- install_command=self._get_tesseract_install_command(),
297
- impact="OCR functionality will be unavailable",
298
- is_critical=False
299
- ))
300
-
301
- # Python packages (package_name: import_name)
302
- python_packages = {
303
- "tika": "tika",
304
- "python-docx": "docx", # Package name vs import name
305
- "python-pptx": "pptx", # Package name vs import name
306
- "openpyxl": "openpyxl",
307
- "pdfplumber": "pdfplumber",
308
- "pytesseract": "pytesseract",
309
- "PIL": "PIL"
310
- }
311
- for pkg_name, import_name in python_packages.items():
312
- status = self.check_python_package(import_name)
313
- python_deps.append(DependencyInfo(
314
- name=pkg_name,
315
- status=status,
316
- description=f"Python package: {pkg_name}",
317
- install_command=f"pip install {pkg_name}",
318
- impact=f"{pkg_name} functionality will be unavailable",
319
- is_critical=True
320
- ))
321
-
322
- return ToolDependencies(
323
- tool_name="Office Tool",
324
- system_deps=system_deps,
325
- python_deps=python_deps,
326
- model_deps=model_deps,
327
- optional_deps=optional_deps
328
- )
329
-
330
- def check_stats_tool_dependencies(self) -> ToolDependencies:
331
- """Check dependencies for Stats Tool."""
332
- system_deps = []
333
- python_deps = []
334
- model_deps = []
335
- optional_deps = []
336
-
337
- # pyreadstat system dependencies
338
- pyreadstat_status = self._check_pyreadstat_system_deps()
339
- system_deps.append(DependencyInfo(
340
- name="libreadstat",
341
- status=pyreadstat_status,
342
- description="System library for reading SAS, SPSS, Stata files",
343
- install_command=self._get_pyreadstat_install_command(),
344
- impact="SAS, SPSS, Stata file reading will be unavailable",
345
- is_critical=False
346
- ))
347
-
348
- # Excel system dependencies
349
- excel_status = self._check_excel_system_deps()
350
- system_deps.append(DependencyInfo(
351
- name="Excel System Libraries",
352
- status=excel_status,
353
- description="System libraries for Excel file processing",
354
- install_command=self._get_excel_system_deps_command(),
355
- impact="Excel file processing may be limited",
356
- is_critical=False
357
- ))
358
-
359
- # Python packages (package_name: import_name)
360
- python_packages = {
361
- "pandas": "pandas",
362
- "numpy": "numpy",
363
- "scipy": "scipy",
364
- "scikit-learn": "sklearn", # Package name vs import name
365
- "statsmodels": "statsmodels",
366
- "pyreadstat": "pyreadstat",
367
- "openpyxl": "openpyxl"
368
- }
369
- for pkg_name, import_name in python_packages.items():
370
- status = self.check_python_package(import_name)
371
- python_deps.append(DependencyInfo(
372
- name=pkg_name,
373
- status=status,
374
- description=f"Python package: {pkg_name}",
375
- install_command=f"pip install {pkg_name}",
376
- impact=f"{pkg_name} functionality will be unavailable",
377
- is_critical=True
378
- ))
379
-
380
- return ToolDependencies(
381
- tool_name="Stats Tool",
382
- system_deps=system_deps,
383
- python_deps=python_deps,
384
- model_deps=model_deps,
385
- optional_deps=optional_deps
386
- )
387
-
388
- def check_report_tool_dependencies(self) -> ToolDependencies:
389
- """Check dependencies for Report Tool."""
390
- system_deps = []
391
- python_deps = []
392
- model_deps = []
393
- optional_deps = []
394
-
395
- # WeasyPrint system dependencies
396
- weasyprint_status = self._check_weasyprint_system_deps()
397
- system_deps.append(DependencyInfo(
398
- name="WeasyPrint System Libraries",
399
- status=weasyprint_status,
400
- description="System libraries for PDF generation (cairo, pango, etc.)",
401
- install_command=self._get_weasyprint_install_command(),
402
- impact="PDF generation will be unavailable",
403
- is_critical=False
404
- ))
405
-
406
- # Matplotlib system dependencies
407
- matplotlib_status = self._check_matplotlib_system_deps()
408
- system_deps.append(DependencyInfo(
409
- name="Matplotlib System Libraries",
410
- status=matplotlib_status,
411
- description="System libraries for chart generation",
412
- install_command=self._get_matplotlib_system_deps_command(),
413
- impact="Chart generation may be limited",
414
- is_critical=False
415
- ))
416
-
417
- # Python packages (package_name: import_name)
418
- python_packages = {
419
- "jinja2": "jinja2",
420
- "matplotlib": "matplotlib",
421
- "weasyprint": "weasyprint",
422
- "bleach": "bleach",
423
- "markdown": "markdown",
424
- "pandas": "pandas",
425
- "openpyxl": "openpyxl",
426
- "python-docx": "docx", # Package name vs import name
427
- "python-pptx": "pptx" # Package name vs import name
428
- }
429
- for pkg_name, import_name in python_packages.items():
430
- status = self.check_python_package(import_name)
431
- python_deps.append(DependencyInfo(
432
- name=pkg_name,
433
- status=status,
434
- description=f"Python package: {pkg_name}",
435
- install_command=f"pip install {pkg_name}",
436
- impact=f"{pkg_name} functionality will be unavailable",
437
- is_critical=True
438
- ))
439
-
440
- return ToolDependencies(
441
- tool_name="Report Tool",
442
- system_deps=system_deps,
443
- python_deps=python_deps,
444
- model_deps=model_deps,
445
- optional_deps=optional_deps
446
- )
447
-
448
- def check_scraper_tool_dependencies(self) -> ToolDependencies:
449
- """Check dependencies for Scraper Tool."""
450
- system_deps = []
451
- python_deps = []
452
- model_deps = []
453
- optional_deps = []
454
-
455
- # Playwright browsers
456
- playwright_status = self._check_playwright_browsers()
457
- system_deps.append(DependencyInfo(
458
- name="Playwright Browsers",
459
- status=playwright_status,
460
- description="Browser binaries for JavaScript rendering",
461
- install_command="playwright install",
462
- impact="JavaScript rendering will be unavailable",
463
- is_critical=False
464
- ))
465
-
466
- # Playwright system dependencies
467
- playwright_deps_status = self._check_playwright_system_deps()
468
- system_deps.append(DependencyInfo(
469
- name="Playwright System Dependencies",
470
- status=playwright_deps_status,
471
- description="System libraries for browser automation",
472
- install_command="playwright install-deps",
473
- impact="Browser automation may fail",
474
- is_critical=False
475
- ))
476
-
477
- # Python packages (package_name: import_name)
478
- python_packages = {
479
- "playwright": "playwright",
480
- "scrapy": "scrapy",
481
- "httpx": "httpx",
482
- "beautifulsoup4": "bs4", # Package name vs import name
483
- "lxml": "lxml"
484
- }
485
- for pkg_name, import_name in python_packages.items():
486
- status = self.check_python_package(import_name)
487
- python_deps.append(DependencyInfo(
488
- name=pkg_name,
489
- status=status,
490
- description=f"Python package: {pkg_name}",
491
- install_command=f"pip install {pkg_name}",
492
- impact=f"{pkg_name} functionality will be unavailable",
493
- is_critical=True
494
- ))
495
-
496
- return ToolDependencies(
497
- tool_name="Scraper Tool",
498
- system_deps=system_deps,
499
- python_deps=python_deps,
500
- model_deps=model_deps,
501
- optional_deps=optional_deps
502
- )
503
-
504
- def _check_pillow_system_deps(self) -> DependencyStatus:
505
- """Check Pillow system dependencies."""
506
- try:
507
- from PIL import Image
508
- # Try to create a simple image to test system libraries
509
- img = Image.new('RGB', (10, 10), color='red')
510
- img.save('/tmp/test_pillow.png')
511
- os.remove('/tmp/test_pillow.png')
512
- return DependencyStatus.AVAILABLE
513
- except Exception:
514
- return DependencyStatus.MISSING
515
-
516
- def _check_tesseract_lang_pack(self, lang: str) -> DependencyStatus:
517
- """Check if a Tesseract language pack is installed."""
518
- try:
519
- result = subprocess.run(
520
- ["tesseract", "--list-langs"],
521
- capture_output=True,
522
- text=True,
523
- timeout=10
524
- )
525
- if result.returncode == 0 and lang in result.stdout:
526
- return DependencyStatus.AVAILABLE
527
- else:
528
- return DependencyStatus.MISSING
529
- except Exception:
530
- return DependencyStatus.MISSING
531
-
532
- def _check_spacy_model(self, model: str) -> DependencyStatus:
533
- """Check if a spaCy model is installed."""
534
- try:
535
- import spacy
536
- spacy.load(model)
537
- return DependencyStatus.AVAILABLE
538
- except OSError:
539
- return DependencyStatus.MISSING
540
- except Exception:
541
- return DependencyStatus.ERROR
542
-
543
- def _check_transformers_model(self, model: str) -> DependencyStatus:
544
- """Check if a Transformers model is available."""
545
- try:
546
- from transformers import pipeline
547
- # Try to load the model (this will download if not present)
548
- pipe = pipeline("summarization", model=model)
549
- return DependencyStatus.AVAILABLE
550
- except Exception:
551
- return DependencyStatus.MISSING
552
-
553
- def _check_nltk_data(self, data: str) -> DependencyStatus:
554
- """Check if NLTK data is available."""
555
- try:
556
- import nltk
557
- nltk.data.find(f'corpora/{data}')
558
- return DependencyStatus.AVAILABLE
559
- except LookupError:
560
- return DependencyStatus.MISSING
561
- except Exception:
562
- return DependencyStatus.ERROR
563
-
564
- def _check_spacy_pkuseg_model(self) -> DependencyStatus:
565
- """Check if spaCy PKUSeg model is available."""
566
- try:
567
- import spacy_pkuseg
568
- # Test basic functionality
569
- seg = spacy_pkuseg.pkuseg()
570
- test_result = list(seg.cut("测试"))
571
- return DependencyStatus.AVAILABLE
572
- except ImportError:
573
- return DependencyStatus.MISSING
574
- except Exception:
575
- return DependencyStatus.ERROR
576
-
577
- def _check_pyreadstat_system_deps(self) -> DependencyStatus:
578
- """Check pyreadstat system dependencies."""
579
- try:
580
- import pyreadstat
581
- return DependencyStatus.AVAILABLE
582
- except ImportError:
583
- return DependencyStatus.MISSING
584
- except Exception:
585
- return DependencyStatus.ERROR
586
-
587
- def _check_excel_system_deps(self) -> DependencyStatus:
588
- """Check Excel system dependencies."""
589
- try:
590
- import openpyxl
591
- return DependencyStatus.AVAILABLE
592
- except ImportError:
593
- return DependencyStatus.MISSING
594
- except Exception:
595
- return DependencyStatus.ERROR
596
-
597
- def _check_weasyprint_system_deps(self) -> DependencyStatus:
598
- """Check WeasyPrint system dependencies."""
599
- try:
600
- import weasyprint
601
- return DependencyStatus.AVAILABLE
602
- except ImportError:
603
- return DependencyStatus.MISSING
604
- except Exception:
605
- return DependencyStatus.ERROR
606
-
607
- def _check_matplotlib_system_deps(self) -> DependencyStatus:
608
- """Check Matplotlib system dependencies."""
609
- try:
610
- import matplotlib.pyplot as plt
611
- plt.figure()
612
- return DependencyStatus.AVAILABLE
613
- except Exception:
614
- return DependencyStatus.MISSING
615
-
616
- def _check_playwright_browsers(self) -> DependencyStatus:
617
- """Check if Playwright browsers are installed."""
618
- browsers_dir = Path.home() / ".cache" / "ms-playwright"
619
- if browsers_dir.exists() and any(browsers_dir.iterdir()):
620
- return DependencyStatus.AVAILABLE
621
- else:
622
- return DependencyStatus.MISSING
623
-
624
- def _check_playwright_system_deps(self) -> DependencyStatus:
625
- """Check Playwright system dependencies."""
626
- try:
627
- from playwright.sync_api import sync_playwright
628
- with sync_playwright() as p:
629
- browser = p.chromium.launch(headless=True)
630
- browser.close()
631
- return DependencyStatus.AVAILABLE
632
- except Exception:
633
- return DependencyStatus.MISSING
634
-
635
- def _get_tesseract_install_command(self) -> str:
636
- """Get Tesseract installation command for current system."""
637
- if self.system == "linux":
638
- return "sudo apt-get install tesseract-ocr tesseract-ocr-eng"
639
- elif self.system == "darwin":
640
- return "brew install tesseract"
641
- elif self.system == "windows":
642
- return "choco install tesseract"
643
- return "Please install Tesseract OCR manually"
644
-
645
- def _get_pillow_system_deps_command(self) -> str:
646
- """Get Pillow system dependencies installation command."""
647
- if self.system == "linux":
648
- return "sudo apt-get install libjpeg-dev zlib1g-dev libpng-dev libtiff-dev libwebp-dev libopenjp2-7-dev"
649
- elif self.system == "darwin":
650
- return "brew install libjpeg zlib libpng libtiff webp openjpeg"
651
- return "Please install image processing libraries manually"
652
-
653
- def _get_tesseract_lang_install_command(self, lang: str) -> str:
654
- """Get Tesseract language pack installation command."""
655
- if self.system == "linux":
656
- return f"sudo apt-get install tesseract-ocr-{lang}"
657
- elif self.system == "darwin":
658
- return f"brew install tesseract-lang-{lang}"
659
- return f"Please install Tesseract {lang} language pack manually"
660
-
661
- def _get_java_install_command(self) -> str:
662
- """Get Java installation command."""
663
- if self.system == "linux":
664
- return "sudo apt-get install openjdk-11-jdk"
665
- elif self.system == "darwin":
666
- return "brew install openjdk@11"
667
- elif self.system == "windows":
668
- return "choco install openjdk11"
669
- return "Please install Java 11 or later manually"
670
-
671
- def _get_pyreadstat_install_command(self) -> str:
672
- """Get pyreadstat installation command."""
673
- if self.system == "linux":
674
- return "sudo apt-get install libreadstat-dev && pip install pyreadstat"
675
- elif self.system == "darwin":
676
- return "brew install readstat && pip install pyreadstat"
677
- return "Please install libreadstat and pyreadstat manually"
678
-
679
- def _get_excel_system_deps_command(self) -> str:
680
- """Get Excel system dependencies installation command."""
681
- if self.system == "linux":
682
- return "sudo apt-get install libxml2-dev libxslt1-dev"
683
- elif self.system == "darwin":
684
- return "brew install libxml2 libxslt"
685
- return "Please install XML processing libraries manually"
686
-
687
- def _get_weasyprint_install_command(self) -> str:
688
- """Get WeasyPrint installation command."""
689
- if self.system == "linux":
690
- return "sudo apt-get install libcairo2-dev libpango1.0-dev libgdk-pixbuf2.0-dev libffi-dev shared-mime-info"
691
- elif self.system == "darwin":
692
- return "brew install cairo pango gdk-pixbuf libffi"
693
- return "Please install WeasyPrint dependencies manually"
694
-
695
- def _get_matplotlib_system_deps_command(self) -> str:
696
- """Get Matplotlib system dependencies installation command."""
697
- if self.system == "linux":
698
- return "sudo apt-get install libfreetype6-dev libpng-dev libjpeg-dev libtiff-dev libwebp-dev"
699
- elif self.system == "darwin":
700
- return "brew install freetype libpng libjpeg libtiff webp"
701
- return "Please install image processing libraries manually"
702
-
703
- def check_all_dependencies(self) -> Dict[str, ToolDependencies]:
704
- """Check all tool dependencies."""
705
- self.logger.info("Starting comprehensive dependency check...")
706
-
707
- tools = {
708
- "image": self.check_image_tool_dependencies(),
709
- "classfire": self.check_classfire_tool_dependencies(),
710
- "office": self.check_office_tool_dependencies(),
711
- "stats": self.check_stats_tool_dependencies(),
712
- "report": self.check_report_tool_dependencies(),
713
- "scraper": self.check_scraper_tool_dependencies(),
714
- }
715
-
716
- return tools
717
-
718
- def generate_report(self, tools: Dict[str, ToolDependencies]) -> str:
719
- """Generate a comprehensive dependency report."""
720
- report = []
721
- report.append("=" * 80)
722
- report.append("AIECS DEPENDENCY CHECK REPORT")
723
- report.append("=" * 80)
724
- report.append(f"System: {self.system.title()} {self.architecture}")
725
- report.append(f"Python: {self.python_version}")
726
- report.append(f"Package Manager: {self.get_system_package_manager()}")
727
- report.append("")
728
-
729
- total_issues = 0
730
- critical_issues = 0
731
-
732
- for tool_name, tool_deps in tools.items():
733
- report.append(f"šŸ”§ {tool_deps.tool_name.upper()}")
734
- report.append("-" * 40)
735
-
736
- # System dependencies
737
- if tool_deps.system_deps:
738
- report.append("šŸ“¦ System Dependencies:")
739
- for dep in tool_deps.system_deps:
740
- status_icon = "āœ…" if dep.status == DependencyStatus.AVAILABLE else "āŒ" if dep.is_critical else "āš ļø"
741
- report.append(f" {status_icon} {dep.name}: {dep.status.value}")
742
- if dep.status != DependencyStatus.AVAILABLE:
743
- total_issues += 1
744
- if dep.is_critical:
745
- critical_issues += 1
746
- if dep.install_command:
747
- report.append(f" Install: {dep.install_command}")
748
- if dep.impact:
749
- report.append(f" Impact: {dep.impact}")
750
- report.append("")
751
-
752
- # Python dependencies
753
- if tool_deps.python_deps:
754
- report.append("šŸ Python Dependencies:")
755
- for dep in tool_deps.python_deps:
756
- status_icon = "āœ…" if dep.status == DependencyStatus.AVAILABLE else "āŒ"
757
- report.append(f" {status_icon} {dep.name}: {dep.status.value}")
758
- if dep.status != DependencyStatus.AVAILABLE:
759
- total_issues += 1
760
- critical_issues += 1
761
- if dep.install_command:
762
- report.append(f" Install: {dep.install_command}")
763
- if dep.impact:
764
- report.append(f" Impact: {dep.impact}")
765
- report.append("")
766
-
767
- # Model dependencies
768
- if tool_deps.model_deps:
769
- report.append("šŸ¤– Model Dependencies:")
770
- for dep in tool_deps.model_deps:
771
- status_icon = "āœ…" if dep.status == DependencyStatus.AVAILABLE else "āŒ" if dep.is_critical else "āš ļø"
772
- report.append(f" {status_icon} {dep.name}: {dep.status.value}")
773
- if dep.status != DependencyStatus.AVAILABLE:
774
- total_issues += 1
775
- if dep.is_critical:
776
- critical_issues += 1
777
- if dep.install_command:
778
- report.append(f" Install: {dep.install_command}")
779
- if dep.impact:
780
- report.append(f" Impact: {dep.impact}")
781
- report.append("")
782
-
783
- # Optional dependencies
784
- if tool_deps.optional_deps:
785
- report.append("šŸ”§ Optional Dependencies:")
786
- for dep in tool_deps.optional_deps:
787
- status_icon = "āœ…" if dep.status == DependencyStatus.AVAILABLE else "āš ļø"
788
- report.append(f" {status_icon} {dep.name}: {dep.status.value}")
789
- if dep.status != DependencyStatus.AVAILABLE and dep.install_command:
790
- report.append(f" Install: {dep.install_command}")
791
- report.append("")
792
-
793
- # Summary
794
- report.append("=" * 80)
795
- report.append("SUMMARY")
796
- report.append("=" * 80)
797
- report.append(f"Total Issues: {total_issues}")
798
- report.append(f"Critical Issues: {critical_issues}")
799
- report.append(f"Optional Issues: {total_issues - critical_issues}")
800
-
801
- if critical_issues == 0:
802
- report.append("")
803
- report.append("šŸŽ‰ All critical dependencies are available!")
804
- report.append("AIECS is ready to use with full functionality.")
805
- else:
806
- report.append("")
807
- report.append("āš ļø Some critical dependencies are missing.")
808
- report.append("Please install the missing dependencies to enable full functionality.")
809
-
810
- return "\n".join(report)
811
-
812
- def save_report(self, report: str, filename: str = "dependency_report.txt"):
813
- """Save the report to a file."""
814
- with open(filename, 'w', encoding='utf-8') as f:
815
- f.write(report)
816
- self.logger.info(f"Report saved to {filename}")
817
-
818
-
819
- def main():
820
- """Main function."""
821
- checker = DependencyChecker()
822
-
823
- print("šŸ” Checking AIECS dependencies...")
824
- print("This may take a few minutes for model checks...")
825
- print()
826
-
827
- # Check all dependencies
828
- tools = checker.check_all_dependencies()
829
-
830
- # Generate and display report
831
- report = checker.generate_report(tools)
832
- print(report)
833
-
834
- # Save report
835
- checker.save_report(report)
836
-
837
- # Return exit code based on critical issues
838
- critical_issues = sum(
839
- 1 for tool_deps in tools.values()
840
- for dep in tool_deps.system_deps + tool_deps.python_deps + tool_deps.model_deps
841
- if dep.status != DependencyStatus.AVAILABLE and dep.is_critical
842
- )
843
-
844
- if critical_issues == 0:
845
- print("\nāœ… All critical dependencies are available!")
846
- return 0
847
- else:
848
- print(f"\nāŒ {critical_issues} critical dependencies are missing.")
849
- return 1
850
-
851
-
852
- if __name__ == "__main__":
853
- sys.exit(main())
854
-
855
-
856
-
857
-