aiecs 1.5.1__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.
Files changed (302) hide show
  1. aiecs/__init__.py +72 -0
  2. aiecs/__main__.py +41 -0
  3. aiecs/aiecs_client.py +469 -0
  4. aiecs/application/__init__.py +10 -0
  5. aiecs/application/executors/__init__.py +10 -0
  6. aiecs/application/executors/operation_executor.py +363 -0
  7. aiecs/application/knowledge_graph/__init__.py +7 -0
  8. aiecs/application/knowledge_graph/builder/__init__.py +37 -0
  9. aiecs/application/knowledge_graph/builder/document_builder.py +375 -0
  10. aiecs/application/knowledge_graph/builder/graph_builder.py +356 -0
  11. aiecs/application/knowledge_graph/builder/schema_mapping.py +531 -0
  12. aiecs/application/knowledge_graph/builder/structured_pipeline.py +443 -0
  13. aiecs/application/knowledge_graph/builder/text_chunker.py +319 -0
  14. aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
  15. aiecs/application/knowledge_graph/extractors/base.py +100 -0
  16. aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +327 -0
  17. aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +349 -0
  18. aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +244 -0
  19. aiecs/application/knowledge_graph/fusion/__init__.py +23 -0
  20. aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +387 -0
  21. aiecs/application/knowledge_graph/fusion/entity_linker.py +343 -0
  22. aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +580 -0
  23. aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +189 -0
  24. aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
  25. aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +344 -0
  26. aiecs/application/knowledge_graph/pattern_matching/query_executor.py +378 -0
  27. aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
  28. aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +199 -0
  29. aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
  30. aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
  31. aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +347 -0
  32. aiecs/application/knowledge_graph/reasoning/inference_engine.py +504 -0
  33. aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +167 -0
  34. aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
  35. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
  36. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +630 -0
  37. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +654 -0
  38. aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +477 -0
  39. aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +390 -0
  40. aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +217 -0
  41. aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +169 -0
  42. aiecs/application/knowledge_graph/reasoning/query_planner.py +872 -0
  43. aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +554 -0
  44. aiecs/application/knowledge_graph/retrieval/__init__.py +19 -0
  45. aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +596 -0
  46. aiecs/application/knowledge_graph/search/__init__.py +59 -0
  47. aiecs/application/knowledge_graph/search/hybrid_search.py +423 -0
  48. aiecs/application/knowledge_graph/search/reranker.py +295 -0
  49. aiecs/application/knowledge_graph/search/reranker_strategies.py +553 -0
  50. aiecs/application/knowledge_graph/search/text_similarity.py +398 -0
  51. aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
  52. aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +329 -0
  53. aiecs/application/knowledge_graph/traversal/path_scorer.py +269 -0
  54. aiecs/application/knowledge_graph/validators/__init__.py +13 -0
  55. aiecs/application/knowledge_graph/validators/relation_validator.py +189 -0
  56. aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
  57. aiecs/application/knowledge_graph/visualization/graph_visualizer.py +321 -0
  58. aiecs/common/__init__.py +9 -0
  59. aiecs/common/knowledge_graph/__init__.py +17 -0
  60. aiecs/common/knowledge_graph/runnable.py +484 -0
  61. aiecs/config/__init__.py +16 -0
  62. aiecs/config/config.py +498 -0
  63. aiecs/config/graph_config.py +137 -0
  64. aiecs/config/registry.py +23 -0
  65. aiecs/core/__init__.py +46 -0
  66. aiecs/core/interface/__init__.py +34 -0
  67. aiecs/core/interface/execution_interface.py +152 -0
  68. aiecs/core/interface/storage_interface.py +171 -0
  69. aiecs/domain/__init__.py +289 -0
  70. aiecs/domain/agent/__init__.py +189 -0
  71. aiecs/domain/agent/base_agent.py +697 -0
  72. aiecs/domain/agent/exceptions.py +103 -0
  73. aiecs/domain/agent/graph_aware_mixin.py +559 -0
  74. aiecs/domain/agent/hybrid_agent.py +490 -0
  75. aiecs/domain/agent/integration/__init__.py +26 -0
  76. aiecs/domain/agent/integration/context_compressor.py +222 -0
  77. aiecs/domain/agent/integration/context_engine_adapter.py +252 -0
  78. aiecs/domain/agent/integration/retry_policy.py +219 -0
  79. aiecs/domain/agent/integration/role_config.py +213 -0
  80. aiecs/domain/agent/knowledge_aware_agent.py +646 -0
  81. aiecs/domain/agent/lifecycle.py +296 -0
  82. aiecs/domain/agent/llm_agent.py +300 -0
  83. aiecs/domain/agent/memory/__init__.py +12 -0
  84. aiecs/domain/agent/memory/conversation.py +197 -0
  85. aiecs/domain/agent/migration/__init__.py +14 -0
  86. aiecs/domain/agent/migration/conversion.py +160 -0
  87. aiecs/domain/agent/migration/legacy_wrapper.py +90 -0
  88. aiecs/domain/agent/models.py +317 -0
  89. aiecs/domain/agent/observability.py +407 -0
  90. aiecs/domain/agent/persistence.py +289 -0
  91. aiecs/domain/agent/prompts/__init__.py +29 -0
  92. aiecs/domain/agent/prompts/builder.py +161 -0
  93. aiecs/domain/agent/prompts/formatters.py +189 -0
  94. aiecs/domain/agent/prompts/template.py +255 -0
  95. aiecs/domain/agent/registry.py +260 -0
  96. aiecs/domain/agent/tool_agent.py +257 -0
  97. aiecs/domain/agent/tools/__init__.py +12 -0
  98. aiecs/domain/agent/tools/schema_generator.py +221 -0
  99. aiecs/domain/community/__init__.py +155 -0
  100. aiecs/domain/community/agent_adapter.py +477 -0
  101. aiecs/domain/community/analytics.py +481 -0
  102. aiecs/domain/community/collaborative_workflow.py +642 -0
  103. aiecs/domain/community/communication_hub.py +645 -0
  104. aiecs/domain/community/community_builder.py +320 -0
  105. aiecs/domain/community/community_integration.py +800 -0
  106. aiecs/domain/community/community_manager.py +813 -0
  107. aiecs/domain/community/decision_engine.py +879 -0
  108. aiecs/domain/community/exceptions.py +225 -0
  109. aiecs/domain/community/models/__init__.py +33 -0
  110. aiecs/domain/community/models/community_models.py +268 -0
  111. aiecs/domain/community/resource_manager.py +457 -0
  112. aiecs/domain/community/shared_context_manager.py +603 -0
  113. aiecs/domain/context/__init__.py +58 -0
  114. aiecs/domain/context/context_engine.py +989 -0
  115. aiecs/domain/context/conversation_models.py +354 -0
  116. aiecs/domain/context/graph_memory.py +467 -0
  117. aiecs/domain/execution/__init__.py +12 -0
  118. aiecs/domain/execution/model.py +57 -0
  119. aiecs/domain/knowledge_graph/__init__.py +19 -0
  120. aiecs/domain/knowledge_graph/models/__init__.py +52 -0
  121. aiecs/domain/knowledge_graph/models/entity.py +130 -0
  122. aiecs/domain/knowledge_graph/models/evidence.py +194 -0
  123. aiecs/domain/knowledge_graph/models/inference_rule.py +186 -0
  124. aiecs/domain/knowledge_graph/models/path.py +179 -0
  125. aiecs/domain/knowledge_graph/models/path_pattern.py +173 -0
  126. aiecs/domain/knowledge_graph/models/query.py +272 -0
  127. aiecs/domain/knowledge_graph/models/query_plan.py +187 -0
  128. aiecs/domain/knowledge_graph/models/relation.py +136 -0
  129. aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
  130. aiecs/domain/knowledge_graph/schema/entity_type.py +135 -0
  131. aiecs/domain/knowledge_graph/schema/graph_schema.py +271 -0
  132. aiecs/domain/knowledge_graph/schema/property_schema.py +155 -0
  133. aiecs/domain/knowledge_graph/schema/relation_type.py +171 -0
  134. aiecs/domain/knowledge_graph/schema/schema_manager.py +496 -0
  135. aiecs/domain/knowledge_graph/schema/type_enums.py +205 -0
  136. aiecs/domain/task/__init__.py +13 -0
  137. aiecs/domain/task/dsl_processor.py +613 -0
  138. aiecs/domain/task/model.py +62 -0
  139. aiecs/domain/task/task_context.py +268 -0
  140. aiecs/infrastructure/__init__.py +24 -0
  141. aiecs/infrastructure/graph_storage/__init__.py +11 -0
  142. aiecs/infrastructure/graph_storage/base.py +601 -0
  143. aiecs/infrastructure/graph_storage/batch_operations.py +449 -0
  144. aiecs/infrastructure/graph_storage/cache.py +429 -0
  145. aiecs/infrastructure/graph_storage/distributed.py +226 -0
  146. aiecs/infrastructure/graph_storage/error_handling.py +390 -0
  147. aiecs/infrastructure/graph_storage/graceful_degradation.py +306 -0
  148. aiecs/infrastructure/graph_storage/health_checks.py +378 -0
  149. aiecs/infrastructure/graph_storage/in_memory.py +514 -0
  150. aiecs/infrastructure/graph_storage/index_optimization.py +483 -0
  151. aiecs/infrastructure/graph_storage/lazy_loading.py +410 -0
  152. aiecs/infrastructure/graph_storage/metrics.py +357 -0
  153. aiecs/infrastructure/graph_storage/migration.py +413 -0
  154. aiecs/infrastructure/graph_storage/pagination.py +471 -0
  155. aiecs/infrastructure/graph_storage/performance_monitoring.py +466 -0
  156. aiecs/infrastructure/graph_storage/postgres.py +871 -0
  157. aiecs/infrastructure/graph_storage/query_optimizer.py +635 -0
  158. aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
  159. aiecs/infrastructure/graph_storage/sqlite.py +623 -0
  160. aiecs/infrastructure/graph_storage/streaming.py +495 -0
  161. aiecs/infrastructure/messaging/__init__.py +13 -0
  162. aiecs/infrastructure/messaging/celery_task_manager.py +383 -0
  163. aiecs/infrastructure/messaging/websocket_manager.py +298 -0
  164. aiecs/infrastructure/monitoring/__init__.py +34 -0
  165. aiecs/infrastructure/monitoring/executor_metrics.py +174 -0
  166. aiecs/infrastructure/monitoring/global_metrics_manager.py +213 -0
  167. aiecs/infrastructure/monitoring/structured_logger.py +48 -0
  168. aiecs/infrastructure/monitoring/tracing_manager.py +410 -0
  169. aiecs/infrastructure/persistence/__init__.py +24 -0
  170. aiecs/infrastructure/persistence/context_engine_client.py +187 -0
  171. aiecs/infrastructure/persistence/database_manager.py +333 -0
  172. aiecs/infrastructure/persistence/file_storage.py +754 -0
  173. aiecs/infrastructure/persistence/redis_client.py +220 -0
  174. aiecs/llm/__init__.py +86 -0
  175. aiecs/llm/callbacks/__init__.py +11 -0
  176. aiecs/llm/callbacks/custom_callbacks.py +264 -0
  177. aiecs/llm/client_factory.py +420 -0
  178. aiecs/llm/clients/__init__.py +33 -0
  179. aiecs/llm/clients/base_client.py +193 -0
  180. aiecs/llm/clients/googleai_client.py +181 -0
  181. aiecs/llm/clients/openai_client.py +131 -0
  182. aiecs/llm/clients/vertex_client.py +437 -0
  183. aiecs/llm/clients/xai_client.py +184 -0
  184. aiecs/llm/config/__init__.py +51 -0
  185. aiecs/llm/config/config_loader.py +275 -0
  186. aiecs/llm/config/config_validator.py +236 -0
  187. aiecs/llm/config/model_config.py +151 -0
  188. aiecs/llm/utils/__init__.py +10 -0
  189. aiecs/llm/utils/validate_config.py +91 -0
  190. aiecs/main.py +363 -0
  191. aiecs/scripts/__init__.py +3 -0
  192. aiecs/scripts/aid/VERSION_MANAGEMENT.md +97 -0
  193. aiecs/scripts/aid/__init__.py +19 -0
  194. aiecs/scripts/aid/version_manager.py +215 -0
  195. aiecs/scripts/dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md +242 -0
  196. aiecs/scripts/dependance_check/README_DEPENDENCY_CHECKER.md +310 -0
  197. aiecs/scripts/dependance_check/__init__.py +17 -0
  198. aiecs/scripts/dependance_check/dependency_checker.py +938 -0
  199. aiecs/scripts/dependance_check/dependency_fixer.py +391 -0
  200. aiecs/scripts/dependance_check/download_nlp_data.py +396 -0
  201. aiecs/scripts/dependance_check/quick_dependency_check.py +270 -0
  202. aiecs/scripts/dependance_check/setup_nlp_data.sh +217 -0
  203. aiecs/scripts/dependance_patch/__init__.py +7 -0
  204. aiecs/scripts/dependance_patch/fix_weasel/README_WEASEL_PATCH.md +126 -0
  205. aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
  206. aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.py +128 -0
  207. aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.sh +82 -0
  208. aiecs/scripts/dependance_patch/fix_weasel/patch_weasel_library.sh +188 -0
  209. aiecs/scripts/dependance_patch/fix_weasel/run_weasel_patch.sh +41 -0
  210. aiecs/scripts/tools_develop/README.md +449 -0
  211. aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
  212. aiecs/scripts/tools_develop/__init__.py +21 -0
  213. aiecs/scripts/tools_develop/check_type_annotations.py +259 -0
  214. aiecs/scripts/tools_develop/validate_tool_schemas.py +422 -0
  215. aiecs/scripts/tools_develop/verify_tools.py +356 -0
  216. aiecs/tasks/__init__.py +1 -0
  217. aiecs/tasks/worker.py +172 -0
  218. aiecs/tools/__init__.py +299 -0
  219. aiecs/tools/apisource/__init__.py +99 -0
  220. aiecs/tools/apisource/intelligence/__init__.py +19 -0
  221. aiecs/tools/apisource/intelligence/data_fusion.py +381 -0
  222. aiecs/tools/apisource/intelligence/query_analyzer.py +413 -0
  223. aiecs/tools/apisource/intelligence/search_enhancer.py +388 -0
  224. aiecs/tools/apisource/monitoring/__init__.py +9 -0
  225. aiecs/tools/apisource/monitoring/metrics.py +303 -0
  226. aiecs/tools/apisource/providers/__init__.py +115 -0
  227. aiecs/tools/apisource/providers/base.py +664 -0
  228. aiecs/tools/apisource/providers/census.py +401 -0
  229. aiecs/tools/apisource/providers/fred.py +564 -0
  230. aiecs/tools/apisource/providers/newsapi.py +412 -0
  231. aiecs/tools/apisource/providers/worldbank.py +357 -0
  232. aiecs/tools/apisource/reliability/__init__.py +12 -0
  233. aiecs/tools/apisource/reliability/error_handler.py +375 -0
  234. aiecs/tools/apisource/reliability/fallback_strategy.py +391 -0
  235. aiecs/tools/apisource/tool.py +850 -0
  236. aiecs/tools/apisource/utils/__init__.py +9 -0
  237. aiecs/tools/apisource/utils/validators.py +338 -0
  238. aiecs/tools/base_tool.py +201 -0
  239. aiecs/tools/docs/__init__.py +121 -0
  240. aiecs/tools/docs/ai_document_orchestrator.py +599 -0
  241. aiecs/tools/docs/ai_document_writer_orchestrator.py +2403 -0
  242. aiecs/tools/docs/content_insertion_tool.py +1333 -0
  243. aiecs/tools/docs/document_creator_tool.py +1317 -0
  244. aiecs/tools/docs/document_layout_tool.py +1166 -0
  245. aiecs/tools/docs/document_parser_tool.py +994 -0
  246. aiecs/tools/docs/document_writer_tool.py +1818 -0
  247. aiecs/tools/knowledge_graph/__init__.py +17 -0
  248. aiecs/tools/knowledge_graph/graph_reasoning_tool.py +734 -0
  249. aiecs/tools/knowledge_graph/graph_search_tool.py +923 -0
  250. aiecs/tools/knowledge_graph/kg_builder_tool.py +476 -0
  251. aiecs/tools/langchain_adapter.py +542 -0
  252. aiecs/tools/schema_generator.py +275 -0
  253. aiecs/tools/search_tool/__init__.py +100 -0
  254. aiecs/tools/search_tool/analyzers.py +589 -0
  255. aiecs/tools/search_tool/cache.py +260 -0
  256. aiecs/tools/search_tool/constants.py +128 -0
  257. aiecs/tools/search_tool/context.py +216 -0
  258. aiecs/tools/search_tool/core.py +749 -0
  259. aiecs/tools/search_tool/deduplicator.py +123 -0
  260. aiecs/tools/search_tool/error_handler.py +271 -0
  261. aiecs/tools/search_tool/metrics.py +371 -0
  262. aiecs/tools/search_tool/rate_limiter.py +178 -0
  263. aiecs/tools/search_tool/schemas.py +277 -0
  264. aiecs/tools/statistics/__init__.py +80 -0
  265. aiecs/tools/statistics/ai_data_analysis_orchestrator.py +643 -0
  266. aiecs/tools/statistics/ai_insight_generator_tool.py +505 -0
  267. aiecs/tools/statistics/ai_report_orchestrator_tool.py +694 -0
  268. aiecs/tools/statistics/data_loader_tool.py +564 -0
  269. aiecs/tools/statistics/data_profiler_tool.py +658 -0
  270. aiecs/tools/statistics/data_transformer_tool.py +573 -0
  271. aiecs/tools/statistics/data_visualizer_tool.py +495 -0
  272. aiecs/tools/statistics/model_trainer_tool.py +487 -0
  273. aiecs/tools/statistics/statistical_analyzer_tool.py +459 -0
  274. aiecs/tools/task_tools/__init__.py +86 -0
  275. aiecs/tools/task_tools/chart_tool.py +732 -0
  276. aiecs/tools/task_tools/classfire_tool.py +922 -0
  277. aiecs/tools/task_tools/image_tool.py +447 -0
  278. aiecs/tools/task_tools/office_tool.py +684 -0
  279. aiecs/tools/task_tools/pandas_tool.py +635 -0
  280. aiecs/tools/task_tools/report_tool.py +635 -0
  281. aiecs/tools/task_tools/research_tool.py +392 -0
  282. aiecs/tools/task_tools/scraper_tool.py +715 -0
  283. aiecs/tools/task_tools/stats_tool.py +688 -0
  284. aiecs/tools/temp_file_manager.py +130 -0
  285. aiecs/tools/tool_executor/__init__.py +37 -0
  286. aiecs/tools/tool_executor/tool_executor.py +881 -0
  287. aiecs/utils/LLM_output_structor.py +445 -0
  288. aiecs/utils/__init__.py +34 -0
  289. aiecs/utils/base_callback.py +47 -0
  290. aiecs/utils/cache_provider.py +695 -0
  291. aiecs/utils/execution_utils.py +184 -0
  292. aiecs/utils/logging.py +1 -0
  293. aiecs/utils/prompt_loader.py +14 -0
  294. aiecs/utils/token_usage_repository.py +323 -0
  295. aiecs/ws/__init__.py +0 -0
  296. aiecs/ws/socket_server.py +52 -0
  297. aiecs-1.5.1.dist-info/METADATA +608 -0
  298. aiecs-1.5.1.dist-info/RECORD +302 -0
  299. aiecs-1.5.1.dist-info/WHEEL +5 -0
  300. aiecs-1.5.1.dist-info/entry_points.txt +10 -0
  301. aiecs-1.5.1.dist-info/licenses/LICENSE +225 -0
  302. aiecs-1.5.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,391 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Dependency fixer for AIECS tools.
4
+
5
+ This script automatically installs missing dependencies based on the
6
+ dependency checker results.
7
+ """
8
+
9
+ import sys
10
+ import subprocess
11
+ import platform
12
+ import logging
13
+ from typing import Dict, List
14
+
15
+
16
+ class DependencyFixer:
17
+ """Automatic dependency fixer for AIECS."""
18
+
19
+ def __init__(self, interactive: bool = True):
20
+ self.logger = self._setup_logging()
21
+ self.system = platform.system().lower()
22
+ self.interactive = interactive
23
+ self.fixes_applied = []
24
+ self.fixes_failed = []
25
+
26
+ def _setup_logging(self) -> logging.Logger:
27
+ """Setup logging configuration."""
28
+ logging.basicConfig(
29
+ level=logging.INFO,
30
+ format="%(asctime)s - %(levelname)s - %(message)s",
31
+ handlers=[
32
+ logging.StreamHandler(sys.stdout),
33
+ logging.FileHandler("dependency_fix.log"),
34
+ ],
35
+ )
36
+ return logging.getLogger(__name__)
37
+
38
+ def _run_command(self, cmd: List[str], description: str) -> bool:
39
+ """Run a command and return success status."""
40
+ try:
41
+ self.logger.info(f"Running: {description}")
42
+ self.logger.info(f"Command: {' '.join(cmd)}")
43
+
44
+ result = subprocess.run(
45
+ cmd,
46
+ capture_output=True,
47
+ text=True,
48
+ check=True,
49
+ timeout=300, # 5 minutes timeout
50
+ )
51
+
52
+ self.logger.info(f"Success: {description}")
53
+ if result.stdout:
54
+ self.logger.info(f"Output: {result.stdout}")
55
+
56
+ return True
57
+
58
+ except subprocess.CalledProcessError as e:
59
+ self.logger.error(f"Failed: {description}")
60
+ self.logger.error(f"Error: {e.stderr}")
61
+ return False
62
+ except subprocess.TimeoutExpired:
63
+ self.logger.error(f"Timeout: {description}")
64
+ return False
65
+ except Exception as e:
66
+ self.logger.error(f"Error: {description} - {e}")
67
+ return False
68
+
69
+ def _ask_confirmation(self, message: str) -> bool:
70
+ """Ask for user confirmation if in interactive mode."""
71
+ if not self.interactive:
72
+ return True
73
+
74
+ while True:
75
+ response = input(f"{message} (y/n): ").lower().strip()
76
+ if response in ["y", "yes"]:
77
+ return True
78
+ elif response in ["n", "no"]:
79
+ return False
80
+ else:
81
+ print("Please enter 'y' or 'n'")
82
+
83
+ def fix_system_dependencies(self, missing_deps: List[str]) -> bool:
84
+ """Fix missing system dependencies."""
85
+ if not missing_deps:
86
+ return True
87
+
88
+ self.logger.info("Fixing system dependencies...")
89
+
90
+ # Group dependencies by package manager
91
+ apt_packages = []
92
+ brew_packages = []
93
+
94
+ for dep in missing_deps:
95
+ if dep == "java":
96
+ if self.system == "linux":
97
+ apt_packages.append("openjdk-11-jdk")
98
+ elif self.system == "darwin":
99
+ brew_packages.append("openjdk@11")
100
+ elif dep == "tesseract":
101
+ if self.system == "linux":
102
+ apt_packages.extend(["tesseract-ocr", "tesseract-ocr-eng"])
103
+ elif self.system == "darwin":
104
+ brew_packages.append("tesseract")
105
+ elif dep == "tesseract_lang_packs":
106
+ if self.system == "linux":
107
+ apt_packages.extend(
108
+ [
109
+ "tesseract-ocr-chi-sim",
110
+ "tesseract-ocr-chi-tra",
111
+ "tesseract-ocr-fra",
112
+ "tesseract-ocr-deu",
113
+ "tesseract-ocr-jpn",
114
+ "tesseract-ocr-kor",
115
+ "tesseract-ocr-rus",
116
+ "tesseract-ocr-spa",
117
+ ]
118
+ )
119
+ elif dep == "pillow_system_deps":
120
+ if self.system == "linux":
121
+ apt_packages.extend(
122
+ [
123
+ "libjpeg-dev",
124
+ "zlib1g-dev",
125
+ "libpng-dev",
126
+ "libtiff-dev",
127
+ "libwebp-dev",
128
+ "libopenjp2-7-dev",
129
+ ]
130
+ )
131
+ elif self.system == "darwin":
132
+ brew_packages.extend(
133
+ [
134
+ "libjpeg",
135
+ "zlib",
136
+ "libpng",
137
+ "libtiff",
138
+ "webp",
139
+ "openjpeg",
140
+ ]
141
+ )
142
+ elif dep == "pyreadstat_deps":
143
+ if self.system == "linux":
144
+ apt_packages.append("libreadstat-dev")
145
+ elif self.system == "darwin":
146
+ brew_packages.append("readstat")
147
+ elif dep == "weasyprint_deps":
148
+ if self.system == "linux":
149
+ apt_packages.extend(
150
+ [
151
+ "libcairo2-dev",
152
+ "libpango1.0-dev",
153
+ "libgdk-pixbuf2.0-dev",
154
+ "libffi-dev",
155
+ "shared-mime-info",
156
+ ]
157
+ )
158
+ elif self.system == "darwin":
159
+ brew_packages.extend(["cairo", "pango", "gdk-pixbuf", "libffi"])
160
+ elif dep == "matplotlib_deps":
161
+ if self.system == "linux":
162
+ apt_packages.extend(
163
+ [
164
+ "libfreetype6-dev",
165
+ "libpng-dev",
166
+ "libjpeg-dev",
167
+ "libtiff-dev",
168
+ "libwebp-dev",
169
+ ]
170
+ )
171
+ elif self.system == "darwin":
172
+ brew_packages.extend(["freetype", "libpng", "libjpeg", "libtiff", "webp"])
173
+
174
+ # Install apt packages
175
+ if apt_packages and self.system == "linux":
176
+ if self._ask_confirmation(f"Install system packages: {', '.join(apt_packages)}?"):
177
+ cmd = ["sudo", "apt-get", "update"]
178
+ if self._run_command(cmd, "Update package list"):
179
+ cmd = ["sudo", "apt-get", "install", "-y"] + apt_packages
180
+ if self._run_command(cmd, f"Install packages: {', '.join(apt_packages)}"):
181
+ self.fixes_applied.append(f"System packages: {', '.join(apt_packages)}")
182
+ else:
183
+ self.fixes_failed.append(f"System packages: {', '.join(apt_packages)}")
184
+ return False
185
+
186
+ # Install brew packages
187
+ if brew_packages and self.system == "darwin":
188
+ if self._ask_confirmation(f"Install Homebrew packages: {', '.join(brew_packages)}?"):
189
+ for package in brew_packages:
190
+ cmd = ["brew", "install", package]
191
+ if self._run_command(cmd, f"Install {package}"):
192
+ self.fixes_applied.append(f"Homebrew package: {package}")
193
+ else:
194
+ self.fixes_failed.append(f"Homebrew package: {package}")
195
+ return False
196
+
197
+ return True
198
+
199
+ def fix_python_dependencies(self, missing_packages: List[str]) -> bool:
200
+ """Fix missing Python packages."""
201
+ if not missing_packages:
202
+ return True
203
+
204
+ self.logger.info("Fixing Python dependencies...")
205
+
206
+ if self._ask_confirmation(f"Install Python packages: {', '.join(missing_packages)}?"):
207
+ cmd = [sys.executable, "-m", "pip", "install"] + missing_packages
208
+ if self._run_command(cmd, f"Install Python packages: {', '.join(missing_packages)}"):
209
+ self.fixes_applied.append(f"Python packages: {', '.join(missing_packages)}")
210
+ return True
211
+ else:
212
+ self.fixes_failed.append(f"Python packages: {', '.join(missing_packages)}")
213
+ return False
214
+
215
+ return True
216
+
217
+ def fix_model_dependencies(self, missing_models: List[str]) -> bool:
218
+ """Fix missing model dependencies."""
219
+ if not missing_models:
220
+ return True
221
+
222
+ self.logger.info("Fixing model dependencies...")
223
+
224
+ # spaCy models
225
+ spacy_models = [m for m in missing_models if m.startswith("spacy_")]
226
+ if spacy_models:
227
+ if self._ask_confirmation(f"Download spaCy models: {', '.join(spacy_models)}?"):
228
+ for model in spacy_models:
229
+ model_name = model.replace("spacy_", "")
230
+ cmd = [
231
+ sys.executable,
232
+ "-m",
233
+ "spacy",
234
+ "download",
235
+ model_name,
236
+ ]
237
+ if self._run_command(cmd, f"Download spaCy model: {model_name}"):
238
+ self.fixes_applied.append(f"spaCy model: {model_name}")
239
+ else:
240
+ self.fixes_failed.append(f"spaCy model: {model_name}")
241
+
242
+ # NLTK data
243
+ nltk_data = [m for m in missing_models if m.startswith("nltk_")]
244
+ if nltk_data:
245
+ if self._ask_confirmation(f"Download NLTK data: {', '.join(nltk_data)}?"):
246
+ for data in nltk_data:
247
+ data_name = data.replace("nltk_", "")
248
+ cmd = [
249
+ sys.executable,
250
+ "-c",
251
+ f"import nltk; nltk.download('{data_name}')",
252
+ ]
253
+ if self._run_command(cmd, f"Download NLTK data: {data_name}"):
254
+ self.fixes_applied.append(f"NLTK data: {data_name}")
255
+ else:
256
+ self.fixes_failed.append(f"NLTK data: {data_name}")
257
+
258
+ # Playwright browsers
259
+ if "playwright_browsers" in missing_models:
260
+ if self._ask_confirmation("Install Playwright browsers?"):
261
+ cmd = [sys.executable, "-m", "playwright", "install"]
262
+ if self._run_command(cmd, "Install Playwright browsers"):
263
+ self.fixes_applied.append("Playwright browsers")
264
+ else:
265
+ self.fixes_failed.append("Playwright browsers")
266
+
267
+ return True
268
+
269
+ def fix_dependencies_from_checker(self, checker_results: Dict) -> bool:
270
+ """Fix dependencies based on checker results."""
271
+ self.logger.info("Starting dependency fixing process...")
272
+
273
+ # Extract missing dependencies
274
+ missing_system = []
275
+ missing_python = []
276
+ missing_models = []
277
+
278
+ for tool_name, tool_deps in checker_results.items():
279
+ if isinstance(tool_deps, dict):
280
+ # Handle tool-specific dependencies
281
+ for dep_type, deps in tool_deps.items():
282
+ if dep_type == "system_deps":
283
+ for dep in deps:
284
+ if dep.status.value == "missing":
285
+ missing_system.append(dep.name.lower().replace(" ", "_"))
286
+ elif dep_type == "python_deps":
287
+ for dep in deps:
288
+ if dep.status.value == "missing":
289
+ missing_python.append(dep.name)
290
+ elif dep_type == "model_deps":
291
+ for dep in deps:
292
+ if dep.status.value == "missing":
293
+ missing_models.append(f"{dep.name.lower().replace(' ', '_')}")
294
+
295
+ # Apply fixes
296
+ success = True
297
+
298
+ if missing_system:
299
+ if not self.fix_system_dependencies(missing_system):
300
+ success = False
301
+
302
+ if missing_python:
303
+ if not self.fix_python_dependencies(missing_python):
304
+ success = False
305
+
306
+ if missing_models:
307
+ if not self.fix_model_dependencies(missing_models):
308
+ success = False
309
+
310
+ return success
311
+
312
+ def generate_fix_report(self) -> str:
313
+ """Generate a report of fixes applied."""
314
+ report = []
315
+ report.append("=" * 60)
316
+ report.append("AIECS DEPENDENCY FIX REPORT")
317
+ report.append("=" * 60)
318
+
319
+ if self.fixes_applied:
320
+ report.append("\n✅ Successfully Applied Fixes:")
321
+ for fix in self.fixes_applied:
322
+ report.append(f" • {fix}")
323
+
324
+ if self.fixes_failed:
325
+ report.append("\n❌ Failed Fixes:")
326
+ for fix in self.fixes_failed:
327
+ report.append(f" • {fix}")
328
+
329
+ if not self.fixes_applied and not self.fixes_failed:
330
+ report.append("\nℹ️ No fixes were applied.")
331
+
332
+ report.append(f"\nTotal fixes applied: {len(self.fixes_applied)}")
333
+ report.append(f"Total fixes failed: {len(self.fixes_failed)}")
334
+
335
+ if self.fixes_failed:
336
+ report.append(
337
+ "\n⚠️ Some fixes failed. Please check the logs and try manual installation."
338
+ )
339
+ else:
340
+ report.append("\n🎉 All fixes applied successfully!")
341
+
342
+ return "\n".join(report)
343
+
344
+
345
+ def main():
346
+ """Main function."""
347
+ import argparse
348
+
349
+ parser = argparse.ArgumentParser(description="Fix AIECS dependencies")
350
+ parser.add_argument(
351
+ "--non-interactive",
352
+ action="store_true",
353
+ help="Run in non-interactive mode (auto-approve all fixes)",
354
+ )
355
+ parser.add_argument(
356
+ "--check-only",
357
+ action="store_true",
358
+ help="Only check dependencies, don't fix them",
359
+ )
360
+
361
+ args = parser.parse_args()
362
+
363
+ # Import and run dependency checker first
364
+ try:
365
+ from aiecs.scripts.dependency_checker import DependencyChecker
366
+
367
+ checker = DependencyChecker()
368
+ tools = checker.check_all_dependencies()
369
+
370
+ if args.check_only:
371
+ report = checker.generate_report(tools)
372
+ print(report)
373
+ return 0
374
+
375
+ # Run fixer
376
+ fixer = DependencyFixer(interactive=not args.non_interactive)
377
+ success = fixer.fix_dependencies_from_checker(tools)
378
+
379
+ # Generate and display report
380
+ report = fixer.generate_fix_report()
381
+ print(report)
382
+
383
+ return 0 if success else 1
384
+
385
+ except Exception as e:
386
+ print(f"Error: {e}")
387
+ return 1
388
+
389
+
390
+ if __name__ == "__main__":
391
+ sys.exit(main())