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.
- aiecs/__init__.py +72 -0
- aiecs/__main__.py +41 -0
- aiecs/aiecs_client.py +469 -0
- aiecs/application/__init__.py +10 -0
- aiecs/application/executors/__init__.py +10 -0
- aiecs/application/executors/operation_executor.py +363 -0
- aiecs/application/knowledge_graph/__init__.py +7 -0
- aiecs/application/knowledge_graph/builder/__init__.py +37 -0
- aiecs/application/knowledge_graph/builder/document_builder.py +375 -0
- aiecs/application/knowledge_graph/builder/graph_builder.py +356 -0
- aiecs/application/knowledge_graph/builder/schema_mapping.py +531 -0
- aiecs/application/knowledge_graph/builder/structured_pipeline.py +443 -0
- aiecs/application/knowledge_graph/builder/text_chunker.py +319 -0
- aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
- aiecs/application/knowledge_graph/extractors/base.py +100 -0
- aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +327 -0
- aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +349 -0
- aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +244 -0
- aiecs/application/knowledge_graph/fusion/__init__.py +23 -0
- aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +387 -0
- aiecs/application/knowledge_graph/fusion/entity_linker.py +343 -0
- aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +580 -0
- aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +189 -0
- aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
- aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +344 -0
- aiecs/application/knowledge_graph/pattern_matching/query_executor.py +378 -0
- aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
- aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +199 -0
- aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
- aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
- aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +347 -0
- aiecs/application/knowledge_graph/reasoning/inference_engine.py +504 -0
- aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +167 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +630 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +654 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +477 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +390 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +217 -0
- aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +169 -0
- aiecs/application/knowledge_graph/reasoning/query_planner.py +872 -0
- aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +554 -0
- aiecs/application/knowledge_graph/retrieval/__init__.py +19 -0
- aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +596 -0
- aiecs/application/knowledge_graph/search/__init__.py +59 -0
- aiecs/application/knowledge_graph/search/hybrid_search.py +423 -0
- aiecs/application/knowledge_graph/search/reranker.py +295 -0
- aiecs/application/knowledge_graph/search/reranker_strategies.py +553 -0
- aiecs/application/knowledge_graph/search/text_similarity.py +398 -0
- aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
- aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +329 -0
- aiecs/application/knowledge_graph/traversal/path_scorer.py +269 -0
- aiecs/application/knowledge_graph/validators/__init__.py +13 -0
- aiecs/application/knowledge_graph/validators/relation_validator.py +189 -0
- aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
- aiecs/application/knowledge_graph/visualization/graph_visualizer.py +321 -0
- aiecs/common/__init__.py +9 -0
- aiecs/common/knowledge_graph/__init__.py +17 -0
- aiecs/common/knowledge_graph/runnable.py +484 -0
- aiecs/config/__init__.py +16 -0
- aiecs/config/config.py +498 -0
- aiecs/config/graph_config.py +137 -0
- aiecs/config/registry.py +23 -0
- aiecs/core/__init__.py +46 -0
- aiecs/core/interface/__init__.py +34 -0
- aiecs/core/interface/execution_interface.py +152 -0
- aiecs/core/interface/storage_interface.py +171 -0
- aiecs/domain/__init__.py +289 -0
- aiecs/domain/agent/__init__.py +189 -0
- aiecs/domain/agent/base_agent.py +697 -0
- aiecs/domain/agent/exceptions.py +103 -0
- aiecs/domain/agent/graph_aware_mixin.py +559 -0
- aiecs/domain/agent/hybrid_agent.py +490 -0
- aiecs/domain/agent/integration/__init__.py +26 -0
- aiecs/domain/agent/integration/context_compressor.py +222 -0
- aiecs/domain/agent/integration/context_engine_adapter.py +252 -0
- aiecs/domain/agent/integration/retry_policy.py +219 -0
- aiecs/domain/agent/integration/role_config.py +213 -0
- aiecs/domain/agent/knowledge_aware_agent.py +646 -0
- aiecs/domain/agent/lifecycle.py +296 -0
- aiecs/domain/agent/llm_agent.py +300 -0
- aiecs/domain/agent/memory/__init__.py +12 -0
- aiecs/domain/agent/memory/conversation.py +197 -0
- aiecs/domain/agent/migration/__init__.py +14 -0
- aiecs/domain/agent/migration/conversion.py +160 -0
- aiecs/domain/agent/migration/legacy_wrapper.py +90 -0
- aiecs/domain/agent/models.py +317 -0
- aiecs/domain/agent/observability.py +407 -0
- aiecs/domain/agent/persistence.py +289 -0
- aiecs/domain/agent/prompts/__init__.py +29 -0
- aiecs/domain/agent/prompts/builder.py +161 -0
- aiecs/domain/agent/prompts/formatters.py +189 -0
- aiecs/domain/agent/prompts/template.py +255 -0
- aiecs/domain/agent/registry.py +260 -0
- aiecs/domain/agent/tool_agent.py +257 -0
- aiecs/domain/agent/tools/__init__.py +12 -0
- aiecs/domain/agent/tools/schema_generator.py +221 -0
- aiecs/domain/community/__init__.py +155 -0
- aiecs/domain/community/agent_adapter.py +477 -0
- aiecs/domain/community/analytics.py +481 -0
- aiecs/domain/community/collaborative_workflow.py +642 -0
- aiecs/domain/community/communication_hub.py +645 -0
- aiecs/domain/community/community_builder.py +320 -0
- aiecs/domain/community/community_integration.py +800 -0
- aiecs/domain/community/community_manager.py +813 -0
- aiecs/domain/community/decision_engine.py +879 -0
- aiecs/domain/community/exceptions.py +225 -0
- aiecs/domain/community/models/__init__.py +33 -0
- aiecs/domain/community/models/community_models.py +268 -0
- aiecs/domain/community/resource_manager.py +457 -0
- aiecs/domain/community/shared_context_manager.py +603 -0
- aiecs/domain/context/__init__.py +58 -0
- aiecs/domain/context/context_engine.py +989 -0
- aiecs/domain/context/conversation_models.py +354 -0
- aiecs/domain/context/graph_memory.py +467 -0
- aiecs/domain/execution/__init__.py +12 -0
- aiecs/domain/execution/model.py +57 -0
- aiecs/domain/knowledge_graph/__init__.py +19 -0
- aiecs/domain/knowledge_graph/models/__init__.py +52 -0
- aiecs/domain/knowledge_graph/models/entity.py +130 -0
- aiecs/domain/knowledge_graph/models/evidence.py +194 -0
- aiecs/domain/knowledge_graph/models/inference_rule.py +186 -0
- aiecs/domain/knowledge_graph/models/path.py +179 -0
- aiecs/domain/knowledge_graph/models/path_pattern.py +173 -0
- aiecs/domain/knowledge_graph/models/query.py +272 -0
- aiecs/domain/knowledge_graph/models/query_plan.py +187 -0
- aiecs/domain/knowledge_graph/models/relation.py +136 -0
- aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
- aiecs/domain/knowledge_graph/schema/entity_type.py +135 -0
- aiecs/domain/knowledge_graph/schema/graph_schema.py +271 -0
- aiecs/domain/knowledge_graph/schema/property_schema.py +155 -0
- aiecs/domain/knowledge_graph/schema/relation_type.py +171 -0
- aiecs/domain/knowledge_graph/schema/schema_manager.py +496 -0
- aiecs/domain/knowledge_graph/schema/type_enums.py +205 -0
- aiecs/domain/task/__init__.py +13 -0
- aiecs/domain/task/dsl_processor.py +613 -0
- aiecs/domain/task/model.py +62 -0
- aiecs/domain/task/task_context.py +268 -0
- aiecs/infrastructure/__init__.py +24 -0
- aiecs/infrastructure/graph_storage/__init__.py +11 -0
- aiecs/infrastructure/graph_storage/base.py +601 -0
- aiecs/infrastructure/graph_storage/batch_operations.py +449 -0
- aiecs/infrastructure/graph_storage/cache.py +429 -0
- aiecs/infrastructure/graph_storage/distributed.py +226 -0
- aiecs/infrastructure/graph_storage/error_handling.py +390 -0
- aiecs/infrastructure/graph_storage/graceful_degradation.py +306 -0
- aiecs/infrastructure/graph_storage/health_checks.py +378 -0
- aiecs/infrastructure/graph_storage/in_memory.py +514 -0
- aiecs/infrastructure/graph_storage/index_optimization.py +483 -0
- aiecs/infrastructure/graph_storage/lazy_loading.py +410 -0
- aiecs/infrastructure/graph_storage/metrics.py +357 -0
- aiecs/infrastructure/graph_storage/migration.py +413 -0
- aiecs/infrastructure/graph_storage/pagination.py +471 -0
- aiecs/infrastructure/graph_storage/performance_monitoring.py +466 -0
- aiecs/infrastructure/graph_storage/postgres.py +871 -0
- aiecs/infrastructure/graph_storage/query_optimizer.py +635 -0
- aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
- aiecs/infrastructure/graph_storage/sqlite.py +623 -0
- aiecs/infrastructure/graph_storage/streaming.py +495 -0
- aiecs/infrastructure/messaging/__init__.py +13 -0
- aiecs/infrastructure/messaging/celery_task_manager.py +383 -0
- aiecs/infrastructure/messaging/websocket_manager.py +298 -0
- aiecs/infrastructure/monitoring/__init__.py +34 -0
- aiecs/infrastructure/monitoring/executor_metrics.py +174 -0
- aiecs/infrastructure/monitoring/global_metrics_manager.py +213 -0
- aiecs/infrastructure/monitoring/structured_logger.py +48 -0
- aiecs/infrastructure/monitoring/tracing_manager.py +410 -0
- aiecs/infrastructure/persistence/__init__.py +24 -0
- aiecs/infrastructure/persistence/context_engine_client.py +187 -0
- aiecs/infrastructure/persistence/database_manager.py +333 -0
- aiecs/infrastructure/persistence/file_storage.py +754 -0
- aiecs/infrastructure/persistence/redis_client.py +220 -0
- aiecs/llm/__init__.py +86 -0
- aiecs/llm/callbacks/__init__.py +11 -0
- aiecs/llm/callbacks/custom_callbacks.py +264 -0
- aiecs/llm/client_factory.py +420 -0
- aiecs/llm/clients/__init__.py +33 -0
- aiecs/llm/clients/base_client.py +193 -0
- aiecs/llm/clients/googleai_client.py +181 -0
- aiecs/llm/clients/openai_client.py +131 -0
- aiecs/llm/clients/vertex_client.py +437 -0
- aiecs/llm/clients/xai_client.py +184 -0
- aiecs/llm/config/__init__.py +51 -0
- aiecs/llm/config/config_loader.py +275 -0
- aiecs/llm/config/config_validator.py +236 -0
- aiecs/llm/config/model_config.py +151 -0
- aiecs/llm/utils/__init__.py +10 -0
- aiecs/llm/utils/validate_config.py +91 -0
- aiecs/main.py +363 -0
- aiecs/scripts/__init__.py +3 -0
- aiecs/scripts/aid/VERSION_MANAGEMENT.md +97 -0
- aiecs/scripts/aid/__init__.py +19 -0
- aiecs/scripts/aid/version_manager.py +215 -0
- aiecs/scripts/dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md +242 -0
- aiecs/scripts/dependance_check/README_DEPENDENCY_CHECKER.md +310 -0
- aiecs/scripts/dependance_check/__init__.py +17 -0
- aiecs/scripts/dependance_check/dependency_checker.py +938 -0
- aiecs/scripts/dependance_check/dependency_fixer.py +391 -0
- aiecs/scripts/dependance_check/download_nlp_data.py +396 -0
- aiecs/scripts/dependance_check/quick_dependency_check.py +270 -0
- aiecs/scripts/dependance_check/setup_nlp_data.sh +217 -0
- aiecs/scripts/dependance_patch/__init__.py +7 -0
- aiecs/scripts/dependance_patch/fix_weasel/README_WEASEL_PATCH.md +126 -0
- aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
- aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.py +128 -0
- aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.sh +82 -0
- aiecs/scripts/dependance_patch/fix_weasel/patch_weasel_library.sh +188 -0
- aiecs/scripts/dependance_patch/fix_weasel/run_weasel_patch.sh +41 -0
- aiecs/scripts/tools_develop/README.md +449 -0
- aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
- aiecs/scripts/tools_develop/__init__.py +21 -0
- aiecs/scripts/tools_develop/check_type_annotations.py +259 -0
- aiecs/scripts/tools_develop/validate_tool_schemas.py +422 -0
- aiecs/scripts/tools_develop/verify_tools.py +356 -0
- aiecs/tasks/__init__.py +1 -0
- aiecs/tasks/worker.py +172 -0
- aiecs/tools/__init__.py +299 -0
- aiecs/tools/apisource/__init__.py +99 -0
- aiecs/tools/apisource/intelligence/__init__.py +19 -0
- aiecs/tools/apisource/intelligence/data_fusion.py +381 -0
- aiecs/tools/apisource/intelligence/query_analyzer.py +413 -0
- aiecs/tools/apisource/intelligence/search_enhancer.py +388 -0
- aiecs/tools/apisource/monitoring/__init__.py +9 -0
- aiecs/tools/apisource/monitoring/metrics.py +303 -0
- aiecs/tools/apisource/providers/__init__.py +115 -0
- aiecs/tools/apisource/providers/base.py +664 -0
- aiecs/tools/apisource/providers/census.py +401 -0
- aiecs/tools/apisource/providers/fred.py +564 -0
- aiecs/tools/apisource/providers/newsapi.py +412 -0
- aiecs/tools/apisource/providers/worldbank.py +357 -0
- aiecs/tools/apisource/reliability/__init__.py +12 -0
- aiecs/tools/apisource/reliability/error_handler.py +375 -0
- aiecs/tools/apisource/reliability/fallback_strategy.py +391 -0
- aiecs/tools/apisource/tool.py +850 -0
- aiecs/tools/apisource/utils/__init__.py +9 -0
- aiecs/tools/apisource/utils/validators.py +338 -0
- aiecs/tools/base_tool.py +201 -0
- aiecs/tools/docs/__init__.py +121 -0
- aiecs/tools/docs/ai_document_orchestrator.py +599 -0
- aiecs/tools/docs/ai_document_writer_orchestrator.py +2403 -0
- aiecs/tools/docs/content_insertion_tool.py +1333 -0
- aiecs/tools/docs/document_creator_tool.py +1317 -0
- aiecs/tools/docs/document_layout_tool.py +1166 -0
- aiecs/tools/docs/document_parser_tool.py +994 -0
- aiecs/tools/docs/document_writer_tool.py +1818 -0
- aiecs/tools/knowledge_graph/__init__.py +17 -0
- aiecs/tools/knowledge_graph/graph_reasoning_tool.py +734 -0
- aiecs/tools/knowledge_graph/graph_search_tool.py +923 -0
- aiecs/tools/knowledge_graph/kg_builder_tool.py +476 -0
- aiecs/tools/langchain_adapter.py +542 -0
- aiecs/tools/schema_generator.py +275 -0
- aiecs/tools/search_tool/__init__.py +100 -0
- aiecs/tools/search_tool/analyzers.py +589 -0
- aiecs/tools/search_tool/cache.py +260 -0
- aiecs/tools/search_tool/constants.py +128 -0
- aiecs/tools/search_tool/context.py +216 -0
- aiecs/tools/search_tool/core.py +749 -0
- aiecs/tools/search_tool/deduplicator.py +123 -0
- aiecs/tools/search_tool/error_handler.py +271 -0
- aiecs/tools/search_tool/metrics.py +371 -0
- aiecs/tools/search_tool/rate_limiter.py +178 -0
- aiecs/tools/search_tool/schemas.py +277 -0
- aiecs/tools/statistics/__init__.py +80 -0
- aiecs/tools/statistics/ai_data_analysis_orchestrator.py +643 -0
- aiecs/tools/statistics/ai_insight_generator_tool.py +505 -0
- aiecs/tools/statistics/ai_report_orchestrator_tool.py +694 -0
- aiecs/tools/statistics/data_loader_tool.py +564 -0
- aiecs/tools/statistics/data_profiler_tool.py +658 -0
- aiecs/tools/statistics/data_transformer_tool.py +573 -0
- aiecs/tools/statistics/data_visualizer_tool.py +495 -0
- aiecs/tools/statistics/model_trainer_tool.py +487 -0
- aiecs/tools/statistics/statistical_analyzer_tool.py +459 -0
- aiecs/tools/task_tools/__init__.py +86 -0
- aiecs/tools/task_tools/chart_tool.py +732 -0
- aiecs/tools/task_tools/classfire_tool.py +922 -0
- aiecs/tools/task_tools/image_tool.py +447 -0
- aiecs/tools/task_tools/office_tool.py +684 -0
- aiecs/tools/task_tools/pandas_tool.py +635 -0
- aiecs/tools/task_tools/report_tool.py +635 -0
- aiecs/tools/task_tools/research_tool.py +392 -0
- aiecs/tools/task_tools/scraper_tool.py +715 -0
- aiecs/tools/task_tools/stats_tool.py +688 -0
- aiecs/tools/temp_file_manager.py +130 -0
- aiecs/tools/tool_executor/__init__.py +37 -0
- aiecs/tools/tool_executor/tool_executor.py +881 -0
- aiecs/utils/LLM_output_structor.py +445 -0
- aiecs/utils/__init__.py +34 -0
- aiecs/utils/base_callback.py +47 -0
- aiecs/utils/cache_provider.py +695 -0
- aiecs/utils/execution_utils.py +184 -0
- aiecs/utils/logging.py +1 -0
- aiecs/utils/prompt_loader.py +14 -0
- aiecs/utils/token_usage_repository.py +323 -0
- aiecs/ws/__init__.py +0 -0
- aiecs/ws/socket_server.py +52 -0
- aiecs-1.5.1.dist-info/METADATA +608 -0
- aiecs-1.5.1.dist-info/RECORD +302 -0
- aiecs-1.5.1.dist-info/WHEEL +5 -0
- aiecs-1.5.1.dist-info/entry_points.txt +10 -0
- aiecs-1.5.1.dist-info/licenses/LICENSE +225 -0
- 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())
|