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.
- aiecs/__init__.py +13 -16
- aiecs/__main__.py +7 -7
- aiecs/aiecs_client.py +269 -75
- aiecs/application/executors/operation_executor.py +79 -54
- aiecs/application/knowledge_graph/__init__.py +7 -0
- aiecs/application/knowledge_graph/builder/__init__.py +37 -0
- aiecs/application/knowledge_graph/builder/data_quality.py +302 -0
- aiecs/application/knowledge_graph/builder/data_reshaping.py +293 -0
- aiecs/application/knowledge_graph/builder/document_builder.py +369 -0
- aiecs/application/knowledge_graph/builder/graph_builder.py +490 -0
- aiecs/application/knowledge_graph/builder/import_optimizer.py +396 -0
- aiecs/application/knowledge_graph/builder/schema_inference.py +462 -0
- aiecs/application/knowledge_graph/builder/schema_mapping.py +563 -0
- aiecs/application/knowledge_graph/builder/structured_pipeline.py +1384 -0
- aiecs/application/knowledge_graph/builder/text_chunker.py +317 -0
- aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
- aiecs/application/knowledge_graph/extractors/base.py +98 -0
- aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +422 -0
- aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +347 -0
- aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +241 -0
- aiecs/application/knowledge_graph/fusion/__init__.py +78 -0
- aiecs/application/knowledge_graph/fusion/ab_testing.py +395 -0
- aiecs/application/knowledge_graph/fusion/abbreviation_expander.py +327 -0
- aiecs/application/knowledge_graph/fusion/alias_index.py +597 -0
- aiecs/application/knowledge_graph/fusion/alias_matcher.py +384 -0
- aiecs/application/knowledge_graph/fusion/cache_coordinator.py +343 -0
- aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +433 -0
- aiecs/application/knowledge_graph/fusion/entity_linker.py +511 -0
- aiecs/application/knowledge_graph/fusion/evaluation_dataset.py +240 -0
- aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +632 -0
- aiecs/application/knowledge_graph/fusion/matching_config.py +489 -0
- aiecs/application/knowledge_graph/fusion/name_normalizer.py +352 -0
- aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +183 -0
- aiecs/application/knowledge_graph/fusion/semantic_name_matcher.py +464 -0
- aiecs/application/knowledge_graph/fusion/similarity_pipeline.py +534 -0
- aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
- aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +342 -0
- aiecs/application/knowledge_graph/pattern_matching/query_executor.py +366 -0
- aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
- aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +195 -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 +341 -0
- aiecs/application/knowledge_graph/reasoning/inference_engine.py +500 -0
- aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +163 -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 +913 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +866 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +475 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +396 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +208 -0
- aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +170 -0
- aiecs/application/knowledge_graph/reasoning/query_planner.py +855 -0
- aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +518 -0
- aiecs/application/knowledge_graph/retrieval/__init__.py +27 -0
- aiecs/application/knowledge_graph/retrieval/query_intent_classifier.py +211 -0
- aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +592 -0
- aiecs/application/knowledge_graph/retrieval/strategy_types.py +23 -0
- aiecs/application/knowledge_graph/search/__init__.py +59 -0
- aiecs/application/knowledge_graph/search/hybrid_search.py +457 -0
- aiecs/application/knowledge_graph/search/reranker.py +293 -0
- aiecs/application/knowledge_graph/search/reranker_strategies.py +535 -0
- aiecs/application/knowledge_graph/search/text_similarity.py +392 -0
- aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
- aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +305 -0
- aiecs/application/knowledge_graph/traversal/path_scorer.py +271 -0
- aiecs/application/knowledge_graph/validators/__init__.py +13 -0
- aiecs/application/knowledge_graph/validators/relation_validator.py +239 -0
- aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
- aiecs/application/knowledge_graph/visualization/graph_visualizer.py +313 -0
- aiecs/common/__init__.py +9 -0
- aiecs/common/knowledge_graph/__init__.py +17 -0
- aiecs/common/knowledge_graph/runnable.py +471 -0
- aiecs/config/__init__.py +20 -5
- aiecs/config/config.py +762 -31
- aiecs/config/graph_config.py +131 -0
- aiecs/config/tool_config.py +399 -0
- aiecs/core/__init__.py +29 -13
- aiecs/core/interface/__init__.py +2 -2
- aiecs/core/interface/execution_interface.py +22 -22
- aiecs/core/interface/storage_interface.py +37 -88
- aiecs/core/registry/__init__.py +31 -0
- aiecs/core/registry/service_registry.py +92 -0
- aiecs/domain/__init__.py +270 -1
- aiecs/domain/agent/__init__.py +191 -0
- aiecs/domain/agent/base_agent.py +3870 -0
- aiecs/domain/agent/exceptions.py +99 -0
- aiecs/domain/agent/graph_aware_mixin.py +569 -0
- aiecs/domain/agent/hybrid_agent.py +1435 -0
- aiecs/domain/agent/integration/__init__.py +29 -0
- aiecs/domain/agent/integration/context_compressor.py +216 -0
- aiecs/domain/agent/integration/context_engine_adapter.py +587 -0
- aiecs/domain/agent/integration/protocols.py +281 -0
- aiecs/domain/agent/integration/retry_policy.py +218 -0
- aiecs/domain/agent/integration/role_config.py +213 -0
- aiecs/domain/agent/knowledge_aware_agent.py +1892 -0
- aiecs/domain/agent/lifecycle.py +291 -0
- aiecs/domain/agent/llm_agent.py +692 -0
- aiecs/domain/agent/memory/__init__.py +12 -0
- aiecs/domain/agent/memory/conversation.py +1124 -0
- aiecs/domain/agent/migration/__init__.py +14 -0
- aiecs/domain/agent/migration/conversion.py +163 -0
- aiecs/domain/agent/migration/legacy_wrapper.py +86 -0
- aiecs/domain/agent/models.py +884 -0
- aiecs/domain/agent/observability.py +479 -0
- aiecs/domain/agent/persistence.py +449 -0
- aiecs/domain/agent/prompts/__init__.py +29 -0
- aiecs/domain/agent/prompts/builder.py +159 -0
- aiecs/domain/agent/prompts/formatters.py +187 -0
- aiecs/domain/agent/prompts/template.py +255 -0
- aiecs/domain/agent/registry.py +253 -0
- aiecs/domain/agent/tool_agent.py +444 -0
- aiecs/domain/agent/tools/__init__.py +15 -0
- aiecs/domain/agent/tools/schema_generator.py +364 -0
- aiecs/domain/community/__init__.py +155 -0
- aiecs/domain/community/agent_adapter.py +469 -0
- aiecs/domain/community/analytics.py +432 -0
- aiecs/domain/community/collaborative_workflow.py +648 -0
- aiecs/domain/community/communication_hub.py +634 -0
- aiecs/domain/community/community_builder.py +320 -0
- aiecs/domain/community/community_integration.py +796 -0
- aiecs/domain/community/community_manager.py +803 -0
- aiecs/domain/community/decision_engine.py +849 -0
- aiecs/domain/community/exceptions.py +231 -0
- aiecs/domain/community/models/__init__.py +33 -0
- aiecs/domain/community/models/community_models.py +234 -0
- aiecs/domain/community/resource_manager.py +461 -0
- aiecs/domain/community/shared_context_manager.py +589 -0
- aiecs/domain/context/__init__.py +40 -10
- aiecs/domain/context/context_engine.py +1910 -0
- aiecs/domain/context/conversation_models.py +87 -53
- aiecs/domain/context/graph_memory.py +582 -0
- aiecs/domain/execution/model.py +12 -4
- aiecs/domain/knowledge_graph/__init__.py +19 -0
- aiecs/domain/knowledge_graph/models/__init__.py +52 -0
- aiecs/domain/knowledge_graph/models/entity.py +148 -0
- aiecs/domain/knowledge_graph/models/evidence.py +178 -0
- aiecs/domain/knowledge_graph/models/inference_rule.py +184 -0
- aiecs/domain/knowledge_graph/models/path.py +171 -0
- aiecs/domain/knowledge_graph/models/path_pattern.py +171 -0
- aiecs/domain/knowledge_graph/models/query.py +261 -0
- aiecs/domain/knowledge_graph/models/query_plan.py +181 -0
- aiecs/domain/knowledge_graph/models/relation.py +202 -0
- aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
- aiecs/domain/knowledge_graph/schema/entity_type.py +131 -0
- aiecs/domain/knowledge_graph/schema/graph_schema.py +253 -0
- aiecs/domain/knowledge_graph/schema/property_schema.py +143 -0
- aiecs/domain/knowledge_graph/schema/relation_type.py +163 -0
- aiecs/domain/knowledge_graph/schema/schema_manager.py +691 -0
- aiecs/domain/knowledge_graph/schema/type_enums.py +209 -0
- aiecs/domain/task/dsl_processor.py +172 -56
- aiecs/domain/task/model.py +20 -8
- aiecs/domain/task/task_context.py +27 -24
- aiecs/infrastructure/__init__.py +0 -2
- aiecs/infrastructure/graph_storage/__init__.py +11 -0
- aiecs/infrastructure/graph_storage/base.py +837 -0
- aiecs/infrastructure/graph_storage/batch_operations.py +458 -0
- aiecs/infrastructure/graph_storage/cache.py +424 -0
- aiecs/infrastructure/graph_storage/distributed.py +223 -0
- aiecs/infrastructure/graph_storage/error_handling.py +380 -0
- aiecs/infrastructure/graph_storage/graceful_degradation.py +294 -0
- aiecs/infrastructure/graph_storage/health_checks.py +378 -0
- aiecs/infrastructure/graph_storage/in_memory.py +1197 -0
- aiecs/infrastructure/graph_storage/index_optimization.py +446 -0
- aiecs/infrastructure/graph_storage/lazy_loading.py +431 -0
- aiecs/infrastructure/graph_storage/metrics.py +344 -0
- aiecs/infrastructure/graph_storage/migration.py +400 -0
- aiecs/infrastructure/graph_storage/pagination.py +483 -0
- aiecs/infrastructure/graph_storage/performance_monitoring.py +456 -0
- aiecs/infrastructure/graph_storage/postgres.py +1563 -0
- aiecs/infrastructure/graph_storage/property_storage.py +353 -0
- aiecs/infrastructure/graph_storage/protocols.py +76 -0
- aiecs/infrastructure/graph_storage/query_optimizer.py +642 -0
- aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
- aiecs/infrastructure/graph_storage/sqlite.py +1373 -0
- aiecs/infrastructure/graph_storage/streaming.py +487 -0
- aiecs/infrastructure/graph_storage/tenant.py +412 -0
- aiecs/infrastructure/messaging/celery_task_manager.py +92 -54
- aiecs/infrastructure/messaging/websocket_manager.py +51 -35
- aiecs/infrastructure/monitoring/__init__.py +22 -0
- aiecs/infrastructure/monitoring/executor_metrics.py +45 -11
- aiecs/infrastructure/monitoring/global_metrics_manager.py +212 -0
- aiecs/infrastructure/monitoring/structured_logger.py +3 -7
- aiecs/infrastructure/monitoring/tracing_manager.py +63 -35
- aiecs/infrastructure/persistence/__init__.py +14 -1
- aiecs/infrastructure/persistence/context_engine_client.py +184 -0
- aiecs/infrastructure/persistence/database_manager.py +67 -43
- aiecs/infrastructure/persistence/file_storage.py +180 -103
- aiecs/infrastructure/persistence/redis_client.py +74 -21
- aiecs/llm/__init__.py +73 -25
- aiecs/llm/callbacks/__init__.py +11 -0
- aiecs/llm/{custom_callbacks.py → callbacks/custom_callbacks.py} +26 -19
- aiecs/llm/client_factory.py +224 -36
- aiecs/llm/client_resolver.py +155 -0
- aiecs/llm/clients/__init__.py +38 -0
- aiecs/llm/clients/base_client.py +324 -0
- aiecs/llm/clients/google_function_calling_mixin.py +457 -0
- aiecs/llm/clients/googleai_client.py +241 -0
- aiecs/llm/clients/openai_client.py +158 -0
- aiecs/llm/clients/openai_compatible_mixin.py +367 -0
- aiecs/llm/clients/vertex_client.py +897 -0
- aiecs/llm/clients/xai_client.py +201 -0
- aiecs/llm/config/__init__.py +51 -0
- aiecs/llm/config/config_loader.py +272 -0
- aiecs/llm/config/config_validator.py +206 -0
- aiecs/llm/config/model_config.py +143 -0
- aiecs/llm/protocols.py +149 -0
- aiecs/llm/utils/__init__.py +10 -0
- aiecs/llm/utils/validate_config.py +89 -0
- aiecs/main.py +140 -121
- aiecs/scripts/aid/VERSION_MANAGEMENT.md +138 -0
- aiecs/scripts/aid/__init__.py +19 -0
- aiecs/scripts/aid/module_checker.py +499 -0
- aiecs/scripts/aid/version_manager.py +235 -0
- aiecs/scripts/{DEPENDENCY_SYSTEM_SUMMARY.md → dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md} +1 -0
- aiecs/scripts/{README_DEPENDENCY_CHECKER.md → dependance_check/README_DEPENDENCY_CHECKER.md} +1 -0
- aiecs/scripts/dependance_check/__init__.py +15 -0
- aiecs/scripts/dependance_check/dependency_checker.py +1835 -0
- aiecs/scripts/{dependency_fixer.py → dependance_check/dependency_fixer.py} +192 -90
- aiecs/scripts/{download_nlp_data.py → dependance_check/download_nlp_data.py} +203 -71
- aiecs/scripts/dependance_patch/__init__.py +7 -0
- aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
- aiecs/scripts/{fix_weasel_validator.py → dependance_patch/fix_weasel/fix_weasel_validator.py} +21 -14
- aiecs/scripts/{patch_weasel_library.sh → dependance_patch/fix_weasel/patch_weasel_library.sh} +1 -1
- aiecs/scripts/knowledge_graph/__init__.py +3 -0
- aiecs/scripts/knowledge_graph/run_threshold_experiments.py +212 -0
- aiecs/scripts/migrations/multi_tenancy/README.md +142 -0
- aiecs/scripts/tools_develop/README.md +671 -0
- aiecs/scripts/tools_develop/README_CONFIG_CHECKER.md +273 -0
- aiecs/scripts/tools_develop/TOOLS_CONFIG_GUIDE.md +1287 -0
- aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
- aiecs/scripts/tools_develop/__init__.py +21 -0
- aiecs/scripts/tools_develop/check_all_tools_config.py +548 -0
- aiecs/scripts/tools_develop/check_type_annotations.py +257 -0
- aiecs/scripts/tools_develop/pre-commit-schema-coverage.sh +66 -0
- aiecs/scripts/tools_develop/schema_coverage.py +511 -0
- aiecs/scripts/tools_develop/validate_tool_schemas.py +475 -0
- aiecs/scripts/tools_develop/verify_executor_config_fix.py +98 -0
- aiecs/scripts/tools_develop/verify_tools.py +352 -0
- aiecs/tasks/__init__.py +0 -1
- aiecs/tasks/worker.py +115 -47
- aiecs/tools/__init__.py +194 -72
- aiecs/tools/apisource/__init__.py +99 -0
- aiecs/tools/apisource/intelligence/__init__.py +19 -0
- aiecs/tools/apisource/intelligence/data_fusion.py +632 -0
- aiecs/tools/apisource/intelligence/query_analyzer.py +417 -0
- aiecs/tools/apisource/intelligence/search_enhancer.py +385 -0
- aiecs/tools/apisource/monitoring/__init__.py +9 -0
- aiecs/tools/apisource/monitoring/metrics.py +330 -0
- aiecs/tools/apisource/providers/__init__.py +112 -0
- aiecs/tools/apisource/providers/base.py +671 -0
- aiecs/tools/apisource/providers/census.py +397 -0
- aiecs/tools/apisource/providers/fred.py +535 -0
- aiecs/tools/apisource/providers/newsapi.py +409 -0
- aiecs/tools/apisource/providers/worldbank.py +352 -0
- aiecs/tools/apisource/reliability/__init__.py +12 -0
- aiecs/tools/apisource/reliability/error_handler.py +363 -0
- aiecs/tools/apisource/reliability/fallback_strategy.py +376 -0
- aiecs/tools/apisource/tool.py +832 -0
- aiecs/tools/apisource/utils/__init__.py +9 -0
- aiecs/tools/apisource/utils/validators.py +334 -0
- aiecs/tools/base_tool.py +415 -21
- aiecs/tools/docs/__init__.py +121 -0
- aiecs/tools/docs/ai_document_orchestrator.py +607 -0
- aiecs/tools/docs/ai_document_writer_orchestrator.py +2350 -0
- aiecs/tools/docs/content_insertion_tool.py +1320 -0
- aiecs/tools/docs/document_creator_tool.py +1323 -0
- aiecs/tools/docs/document_layout_tool.py +1160 -0
- aiecs/tools/docs/document_parser_tool.py +1011 -0
- aiecs/tools/docs/document_writer_tool.py +1829 -0
- aiecs/tools/knowledge_graph/__init__.py +17 -0
- aiecs/tools/knowledge_graph/graph_reasoning_tool.py +807 -0
- aiecs/tools/knowledge_graph/graph_search_tool.py +944 -0
- aiecs/tools/knowledge_graph/kg_builder_tool.py +524 -0
- aiecs/tools/langchain_adapter.py +300 -138
- aiecs/tools/schema_generator.py +455 -0
- aiecs/tools/search_tool/__init__.py +100 -0
- aiecs/tools/search_tool/analyzers.py +581 -0
- aiecs/tools/search_tool/cache.py +264 -0
- aiecs/tools/search_tool/constants.py +128 -0
- aiecs/tools/search_tool/context.py +224 -0
- aiecs/tools/search_tool/core.py +778 -0
- aiecs/tools/search_tool/deduplicator.py +119 -0
- aiecs/tools/search_tool/error_handler.py +242 -0
- aiecs/tools/search_tool/metrics.py +343 -0
- aiecs/tools/search_tool/rate_limiter.py +172 -0
- aiecs/tools/search_tool/schemas.py +275 -0
- aiecs/tools/statistics/__init__.py +80 -0
- aiecs/tools/statistics/ai_data_analysis_orchestrator.py +646 -0
- aiecs/tools/statistics/ai_insight_generator_tool.py +508 -0
- aiecs/tools/statistics/ai_report_orchestrator_tool.py +684 -0
- aiecs/tools/statistics/data_loader_tool.py +555 -0
- aiecs/tools/statistics/data_profiler_tool.py +638 -0
- aiecs/tools/statistics/data_transformer_tool.py +580 -0
- aiecs/tools/statistics/data_visualizer_tool.py +498 -0
- aiecs/tools/statistics/model_trainer_tool.py +507 -0
- aiecs/tools/statistics/statistical_analyzer_tool.py +472 -0
- aiecs/tools/task_tools/__init__.py +49 -36
- aiecs/tools/task_tools/chart_tool.py +200 -184
- aiecs/tools/task_tools/classfire_tool.py +268 -267
- aiecs/tools/task_tools/image_tool.py +175 -131
- aiecs/tools/task_tools/office_tool.py +226 -146
- aiecs/tools/task_tools/pandas_tool.py +477 -121
- aiecs/tools/task_tools/report_tool.py +390 -142
- aiecs/tools/task_tools/research_tool.py +149 -79
- aiecs/tools/task_tools/scraper_tool.py +339 -145
- aiecs/tools/task_tools/stats_tool.py +448 -209
- aiecs/tools/temp_file_manager.py +26 -24
- aiecs/tools/tool_executor/__init__.py +18 -16
- aiecs/tools/tool_executor/tool_executor.py +364 -52
- aiecs/utils/LLM_output_structor.py +74 -48
- aiecs/utils/__init__.py +14 -3
- aiecs/utils/base_callback.py +0 -3
- aiecs/utils/cache_provider.py +696 -0
- aiecs/utils/execution_utils.py +50 -31
- aiecs/utils/prompt_loader.py +1 -0
- aiecs/utils/token_usage_repository.py +37 -11
- aiecs/ws/socket_server.py +14 -4
- {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/METADATA +52 -15
- aiecs-1.7.6.dist-info/RECORD +337 -0
- aiecs-1.7.6.dist-info/entry_points.txt +13 -0
- aiecs/config/registry.py +0 -19
- aiecs/domain/context/content_engine.py +0 -982
- aiecs/llm/base_client.py +0 -99
- aiecs/llm/openai_client.py +0 -125
- aiecs/llm/vertex_client.py +0 -186
- aiecs/llm/xai_client.py +0 -184
- aiecs/scripts/dependency_checker.py +0 -857
- aiecs/scripts/quick_dependency_check.py +0 -269
- aiecs/tools/task_tools/search_api.py +0 -7
- aiecs-1.0.1.dist-info/RECORD +0 -90
- aiecs-1.0.1.dist-info/entry_points.txt +0 -7
- /aiecs/scripts/{setup_nlp_data.sh → dependance_check/setup_nlp_data.sh} +0 -0
- /aiecs/scripts/{README_WEASEL_PATCH.md → dependance_patch/fix_weasel/README_WEASEL_PATCH.md} +0 -0
- /aiecs/scripts/{fix_weasel_validator.sh → dependance_patch/fix_weasel/fix_weasel_validator.sh} +0 -0
- /aiecs/scripts/{run_weasel_patch.sh → dependance_patch/fix_weasel/run_weasel_patch.sh} +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/WHEEL +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/licenses/LICENSE +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/top_level.txt +0 -0
|
@@ -6,57 +6,93 @@ This script automatically installs missing dependencies based on the
|
|
|
6
6
|
dependency checker results.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
import os
|
|
10
9
|
import sys
|
|
10
|
+
import os
|
|
11
11
|
import subprocess
|
|
12
12
|
import platform
|
|
13
13
|
import logging
|
|
14
|
-
from typing import Dict, List, Tuple, Optional
|
|
15
14
|
from pathlib import Path
|
|
15
|
+
from typing import Dict, List, Optional
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
class DependencyFixer:
|
|
19
19
|
"""Automatic dependency fixer for AIECS."""
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
def __init__(self, interactive: bool = True):
|
|
22
22
|
self.logger = self._setup_logging()
|
|
23
23
|
self.system = platform.system().lower()
|
|
24
24
|
self.interactive = interactive
|
|
25
|
-
self.fixes_applied = []
|
|
26
|
-
self.fixes_failed = []
|
|
27
|
-
|
|
25
|
+
self.fixes_applied: List[str] = []
|
|
26
|
+
self.fixes_failed: List[str] = []
|
|
27
|
+
|
|
28
28
|
def _setup_logging(self) -> logging.Logger:
|
|
29
29
|
"""Setup logging configuration."""
|
|
30
30
|
logging.basicConfig(
|
|
31
31
|
level=logging.INFO,
|
|
32
|
-
format=
|
|
32
|
+
format="%(asctime)s - %(levelname)s - %(message)s",
|
|
33
33
|
handlers=[
|
|
34
34
|
logging.StreamHandler(sys.stdout),
|
|
35
|
-
logging.FileHandler(
|
|
36
|
-
]
|
|
35
|
+
logging.FileHandler("dependency_fix.log"),
|
|
36
|
+
],
|
|
37
37
|
)
|
|
38
38
|
return logging.getLogger(__name__)
|
|
39
|
-
|
|
39
|
+
|
|
40
|
+
def _get_environment_path(self) -> Optional[Path]:
|
|
41
|
+
"""
|
|
42
|
+
Get the path to the current Python environment (virtual environment or Poetry environment).
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
Path to the environment if found, None otherwise
|
|
46
|
+
"""
|
|
47
|
+
# Check VIRTUAL_ENV environment variable first (common for venv/virtualenv)
|
|
48
|
+
venv_path = os.environ.get("VIRTUAL_ENV")
|
|
49
|
+
if venv_path:
|
|
50
|
+
env_path = Path(venv_path)
|
|
51
|
+
if env_path.exists():
|
|
52
|
+
self.logger.info(f"Found virtual environment via VIRTUAL_ENV: {env_path}")
|
|
53
|
+
return env_path
|
|
54
|
+
|
|
55
|
+
# Check sys.prefix - this points to the virtual environment if we're in one
|
|
56
|
+
# In a virtual environment, sys.prefix != sys.base_prefix
|
|
57
|
+
if sys.prefix != sys.base_prefix:
|
|
58
|
+
env_path = Path(sys.prefix)
|
|
59
|
+
if env_path.exists():
|
|
60
|
+
self.logger.info(f"Found virtual environment via sys.prefix: {env_path}")
|
|
61
|
+
return env_path
|
|
62
|
+
|
|
63
|
+
# Check if we're in a Poetry environment by checking sys.executable path
|
|
64
|
+
# Poetry environments are typically in ~/.cache/pypoetry/virtualenvs/ or similar
|
|
65
|
+
exec_path = Path(sys.executable)
|
|
66
|
+
if "pypoetry" in str(exec_path) or exec_path.parts[-3:-1] == ("bin", "python"):
|
|
67
|
+
# Try to find the environment root (go up from bin/python)
|
|
68
|
+
potential_env = exec_path.parent.parent
|
|
69
|
+
if potential_env.exists() and (potential_env / "pyvenv.cfg").exists():
|
|
70
|
+
self.logger.info(f"Found Poetry/virtual environment: {potential_env}")
|
|
71
|
+
return potential_env
|
|
72
|
+
|
|
73
|
+
self.logger.warning("No virtual environment detected. NLTK data will be downloaded to user directory.")
|
|
74
|
+
return None
|
|
75
|
+
|
|
40
76
|
def _run_command(self, cmd: List[str], description: str) -> bool:
|
|
41
77
|
"""Run a command and return success status."""
|
|
42
78
|
try:
|
|
43
79
|
self.logger.info(f"Running: {description}")
|
|
44
80
|
self.logger.info(f"Command: {' '.join(cmd)}")
|
|
45
|
-
|
|
81
|
+
|
|
46
82
|
result = subprocess.run(
|
|
47
83
|
cmd,
|
|
48
84
|
capture_output=True,
|
|
49
85
|
text=True,
|
|
50
86
|
check=True,
|
|
51
|
-
timeout=300 # 5 minutes timeout
|
|
87
|
+
timeout=300, # 5 minutes timeout
|
|
52
88
|
)
|
|
53
|
-
|
|
89
|
+
|
|
54
90
|
self.logger.info(f"Success: {description}")
|
|
55
91
|
if result.stdout:
|
|
56
92
|
self.logger.info(f"Output: {result.stdout}")
|
|
57
|
-
|
|
93
|
+
|
|
58
94
|
return True
|
|
59
|
-
|
|
95
|
+
|
|
60
96
|
except subprocess.CalledProcessError as e:
|
|
61
97
|
self.logger.error(f"Failed: {description}")
|
|
62
98
|
self.logger.error(f"Error: {e.stderr}")
|
|
@@ -67,33 +103,32 @@ class DependencyFixer:
|
|
|
67
103
|
except Exception as e:
|
|
68
104
|
self.logger.error(f"Error: {description} - {e}")
|
|
69
105
|
return False
|
|
70
|
-
|
|
106
|
+
|
|
71
107
|
def _ask_confirmation(self, message: str) -> bool:
|
|
72
108
|
"""Ask for user confirmation if in interactive mode."""
|
|
73
109
|
if not self.interactive:
|
|
74
110
|
return True
|
|
75
|
-
|
|
111
|
+
|
|
76
112
|
while True:
|
|
77
113
|
response = input(f"{message} (y/n): ").lower().strip()
|
|
78
|
-
if response in [
|
|
114
|
+
if response in ["y", "yes"]:
|
|
79
115
|
return True
|
|
80
|
-
elif response in [
|
|
116
|
+
elif response in ["n", "no"]:
|
|
81
117
|
return False
|
|
82
118
|
else:
|
|
83
119
|
print("Please enter 'y' or 'n'")
|
|
84
|
-
|
|
120
|
+
|
|
85
121
|
def fix_system_dependencies(self, missing_deps: List[str]) -> bool:
|
|
86
122
|
"""Fix missing system dependencies."""
|
|
87
123
|
if not missing_deps:
|
|
88
124
|
return True
|
|
89
|
-
|
|
125
|
+
|
|
90
126
|
self.logger.info("Fixing system dependencies...")
|
|
91
|
-
|
|
127
|
+
|
|
92
128
|
# Group dependencies by package manager
|
|
93
129
|
apt_packages = []
|
|
94
130
|
brew_packages = []
|
|
95
|
-
|
|
96
|
-
|
|
131
|
+
|
|
97
132
|
for dep in missing_deps:
|
|
98
133
|
if dep == "java":
|
|
99
134
|
if self.system == "linux":
|
|
@@ -107,20 +142,41 @@ class DependencyFixer:
|
|
|
107
142
|
brew_packages.append("tesseract")
|
|
108
143
|
elif dep == "tesseract_lang_packs":
|
|
109
144
|
if self.system == "linux":
|
|
110
|
-
apt_packages.extend(
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
145
|
+
apt_packages.extend(
|
|
146
|
+
[
|
|
147
|
+
"tesseract-ocr-chi-sim",
|
|
148
|
+
"tesseract-ocr-chi-tra",
|
|
149
|
+
"tesseract-ocr-fra",
|
|
150
|
+
"tesseract-ocr-deu",
|
|
151
|
+
"tesseract-ocr-jpn",
|
|
152
|
+
"tesseract-ocr-kor",
|
|
153
|
+
"tesseract-ocr-rus",
|
|
154
|
+
"tesseract-ocr-spa",
|
|
155
|
+
]
|
|
156
|
+
)
|
|
116
157
|
elif dep == "pillow_system_deps":
|
|
117
158
|
if self.system == "linux":
|
|
118
|
-
apt_packages.extend(
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
159
|
+
apt_packages.extend(
|
|
160
|
+
[
|
|
161
|
+
"libjpeg-dev",
|
|
162
|
+
"zlib1g-dev",
|
|
163
|
+
"libpng-dev",
|
|
164
|
+
"libtiff-dev",
|
|
165
|
+
"libwebp-dev",
|
|
166
|
+
"libopenjp2-7-dev",
|
|
167
|
+
]
|
|
168
|
+
)
|
|
122
169
|
elif self.system == "darwin":
|
|
123
|
-
brew_packages.extend(
|
|
170
|
+
brew_packages.extend(
|
|
171
|
+
[
|
|
172
|
+
"libjpeg",
|
|
173
|
+
"zlib",
|
|
174
|
+
"libpng",
|
|
175
|
+
"libtiff",
|
|
176
|
+
"webp",
|
|
177
|
+
"openjpeg",
|
|
178
|
+
]
|
|
179
|
+
)
|
|
124
180
|
elif dep == "pyreadstat_deps":
|
|
125
181
|
if self.system == "linux":
|
|
126
182
|
apt_packages.append("libreadstat-dev")
|
|
@@ -128,21 +184,31 @@ class DependencyFixer:
|
|
|
128
184
|
brew_packages.append("readstat")
|
|
129
185
|
elif dep == "weasyprint_deps":
|
|
130
186
|
if self.system == "linux":
|
|
131
|
-
apt_packages.extend(
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
187
|
+
apt_packages.extend(
|
|
188
|
+
[
|
|
189
|
+
"libcairo2-dev",
|
|
190
|
+
"libpango1.0-dev",
|
|
191
|
+
"libgdk-pixbuf2.0-dev",
|
|
192
|
+
"libffi-dev",
|
|
193
|
+
"shared-mime-info",
|
|
194
|
+
]
|
|
195
|
+
)
|
|
135
196
|
elif self.system == "darwin":
|
|
136
197
|
brew_packages.extend(["cairo", "pango", "gdk-pixbuf", "libffi"])
|
|
137
198
|
elif dep == "matplotlib_deps":
|
|
138
199
|
if self.system == "linux":
|
|
139
|
-
apt_packages.extend(
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
200
|
+
apt_packages.extend(
|
|
201
|
+
[
|
|
202
|
+
"libfreetype6-dev",
|
|
203
|
+
"libpng-dev",
|
|
204
|
+
"libjpeg-dev",
|
|
205
|
+
"libtiff-dev",
|
|
206
|
+
"libwebp-dev",
|
|
207
|
+
]
|
|
208
|
+
)
|
|
143
209
|
elif self.system == "darwin":
|
|
144
210
|
brew_packages.extend(["freetype", "libpng", "libjpeg", "libtiff", "webp"])
|
|
145
|
-
|
|
211
|
+
|
|
146
212
|
# Install apt packages
|
|
147
213
|
if apt_packages and self.system == "linux":
|
|
148
214
|
if self._ask_confirmation(f"Install system packages: {', '.join(apt_packages)}?"):
|
|
@@ -154,7 +220,7 @@ class DependencyFixer:
|
|
|
154
220
|
else:
|
|
155
221
|
self.fixes_failed.append(f"System packages: {', '.join(apt_packages)}")
|
|
156
222
|
return False
|
|
157
|
-
|
|
223
|
+
|
|
158
224
|
# Install brew packages
|
|
159
225
|
if brew_packages and self.system == "darwin":
|
|
160
226
|
if self._ask_confirmation(f"Install Homebrew packages: {', '.join(brew_packages)}?"):
|
|
@@ -165,16 +231,16 @@ class DependencyFixer:
|
|
|
165
231
|
else:
|
|
166
232
|
self.fixes_failed.append(f"Homebrew package: {package}")
|
|
167
233
|
return False
|
|
168
|
-
|
|
234
|
+
|
|
169
235
|
return True
|
|
170
|
-
|
|
236
|
+
|
|
171
237
|
def fix_python_dependencies(self, missing_packages: List[str]) -> bool:
|
|
172
238
|
"""Fix missing Python packages."""
|
|
173
239
|
if not missing_packages:
|
|
174
240
|
return True
|
|
175
|
-
|
|
241
|
+
|
|
176
242
|
self.logger.info("Fixing Python dependencies...")
|
|
177
|
-
|
|
243
|
+
|
|
178
244
|
if self._ask_confirmation(f"Install Python packages: {', '.join(missing_packages)}?"):
|
|
179
245
|
cmd = [sys.executable, "-m", "pip", "install"] + missing_packages
|
|
180
246
|
if self._run_command(cmd, f"Install Python packages: {', '.join(missing_packages)}"):
|
|
@@ -183,40 +249,73 @@ class DependencyFixer:
|
|
|
183
249
|
else:
|
|
184
250
|
self.fixes_failed.append(f"Python packages: {', '.join(missing_packages)}")
|
|
185
251
|
return False
|
|
186
|
-
|
|
252
|
+
|
|
187
253
|
return True
|
|
188
|
-
|
|
254
|
+
|
|
189
255
|
def fix_model_dependencies(self, missing_models: List[str]) -> bool:
|
|
190
256
|
"""Fix missing model dependencies."""
|
|
191
257
|
if not missing_models:
|
|
192
258
|
return True
|
|
193
|
-
|
|
259
|
+
|
|
194
260
|
self.logger.info("Fixing model dependencies...")
|
|
195
|
-
|
|
261
|
+
|
|
196
262
|
# spaCy models
|
|
197
263
|
spacy_models = [m for m in missing_models if m.startswith("spacy_")]
|
|
198
264
|
if spacy_models:
|
|
199
265
|
if self._ask_confirmation(f"Download spaCy models: {', '.join(spacy_models)}?"):
|
|
200
266
|
for model in spacy_models:
|
|
201
267
|
model_name = model.replace("spacy_", "")
|
|
202
|
-
cmd = [
|
|
268
|
+
cmd = [
|
|
269
|
+
sys.executable,
|
|
270
|
+
"-m",
|
|
271
|
+
"spacy",
|
|
272
|
+
"download",
|
|
273
|
+
model_name,
|
|
274
|
+
]
|
|
203
275
|
if self._run_command(cmd, f"Download spaCy model: {model_name}"):
|
|
204
276
|
self.fixes_applied.append(f"spaCy model: {model_name}")
|
|
205
277
|
else:
|
|
206
278
|
self.fixes_failed.append(f"spaCy model: {model_name}")
|
|
207
|
-
|
|
279
|
+
|
|
208
280
|
# NLTK data
|
|
209
281
|
nltk_data = [m for m in missing_models if m.startswith("nltk_")]
|
|
210
282
|
if nltk_data:
|
|
211
283
|
if self._ask_confirmation(f"Download NLTK data: {', '.join(nltk_data)}?"):
|
|
284
|
+
# Get environment path for environment-specific NLTK data storage
|
|
285
|
+
env_path = self._get_environment_path()
|
|
286
|
+
nltk_data_path: Optional[Path] = None
|
|
287
|
+
original_nltk_data = os.environ.get("NLTK_DATA")
|
|
288
|
+
|
|
289
|
+
if env_path:
|
|
290
|
+
# Create nltk_data directory in the environment
|
|
291
|
+
nltk_data_path = env_path / "nltk_data"
|
|
292
|
+
nltk_data_path.mkdir(parents=True, exist_ok=True)
|
|
293
|
+
self.logger.info(f"Using environment-specific NLTK data directory: {nltk_data_path}")
|
|
294
|
+
else:
|
|
295
|
+
self.logger.info("No virtual environment detected. Using default NLTK data location (~/nltk_data)")
|
|
296
|
+
|
|
212
297
|
for data in nltk_data:
|
|
213
298
|
data_name = data.replace("nltk_", "")
|
|
214
|
-
|
|
299
|
+
# Build Python command that sets NLTK_DATA if environment path is available
|
|
300
|
+
if nltk_data_path:
|
|
301
|
+
# Set NLTK_DATA environment variable in the subprocess
|
|
302
|
+
python_code = (
|
|
303
|
+
f"import os; "
|
|
304
|
+
f"os.environ['NLTK_DATA'] = '{nltk_data_path}'; "
|
|
305
|
+
f"import nltk; "
|
|
306
|
+
f"nltk.download('{data_name}', quiet=True)"
|
|
307
|
+
)
|
|
308
|
+
else:
|
|
309
|
+
python_code = f"import nltk; nltk.download('{data_name}', quiet=True)"
|
|
310
|
+
|
|
311
|
+
cmd = [sys.executable, "-c", python_code]
|
|
215
312
|
if self._run_command(cmd, f"Download NLTK data: {data_name}"):
|
|
216
313
|
self.fixes_applied.append(f"NLTK data: {data_name}")
|
|
314
|
+
if nltk_data_path:
|
|
315
|
+
self.logger.info(f"NLTK data '{data_name}' stored in environment: {nltk_data_path}")
|
|
217
316
|
else:
|
|
218
317
|
self.fixes_failed.append(f"NLTK data: {data_name}")
|
|
219
|
-
|
|
318
|
+
|
|
220
319
|
# Playwright browsers
|
|
221
320
|
if "playwright_browsers" in missing_models:
|
|
222
321
|
if self._ask_confirmation("Install Playwright browsers?"):
|
|
@@ -225,18 +324,18 @@ class DependencyFixer:
|
|
|
225
324
|
self.fixes_applied.append("Playwright browsers")
|
|
226
325
|
else:
|
|
227
326
|
self.fixes_failed.append("Playwright browsers")
|
|
228
|
-
|
|
327
|
+
|
|
229
328
|
return True
|
|
230
|
-
|
|
329
|
+
|
|
231
330
|
def fix_dependencies_from_checker(self, checker_results: Dict) -> bool:
|
|
232
331
|
"""Fix dependencies based on checker results."""
|
|
233
332
|
self.logger.info("Starting dependency fixing process...")
|
|
234
|
-
|
|
333
|
+
|
|
235
334
|
# Extract missing dependencies
|
|
236
335
|
missing_system = []
|
|
237
336
|
missing_python = []
|
|
238
337
|
missing_models = []
|
|
239
|
-
|
|
338
|
+
|
|
240
339
|
for tool_name, tool_deps in checker_results.items():
|
|
241
340
|
if isinstance(tool_deps, dict):
|
|
242
341
|
# Handle tool-specific dependencies
|
|
@@ -253,88 +352,95 @@ class DependencyFixer:
|
|
|
253
352
|
for dep in deps:
|
|
254
353
|
if dep.status.value == "missing":
|
|
255
354
|
missing_models.append(f"{dep.name.lower().replace(' ', '_')}")
|
|
256
|
-
|
|
355
|
+
|
|
257
356
|
# Apply fixes
|
|
258
357
|
success = True
|
|
259
|
-
|
|
358
|
+
|
|
260
359
|
if missing_system:
|
|
261
360
|
if not self.fix_system_dependencies(missing_system):
|
|
262
361
|
success = False
|
|
263
|
-
|
|
362
|
+
|
|
264
363
|
if missing_python:
|
|
265
364
|
if not self.fix_python_dependencies(missing_python):
|
|
266
365
|
success = False
|
|
267
|
-
|
|
366
|
+
|
|
268
367
|
if missing_models:
|
|
269
368
|
if not self.fix_model_dependencies(missing_models):
|
|
270
369
|
success = False
|
|
271
|
-
|
|
370
|
+
|
|
272
371
|
return success
|
|
273
|
-
|
|
372
|
+
|
|
274
373
|
def generate_fix_report(self) -> str:
|
|
275
374
|
"""Generate a report of fixes applied."""
|
|
276
375
|
report = []
|
|
277
376
|
report.append("=" * 60)
|
|
278
377
|
report.append("AIECS DEPENDENCY FIX REPORT")
|
|
279
378
|
report.append("=" * 60)
|
|
280
|
-
|
|
379
|
+
|
|
281
380
|
if self.fixes_applied:
|
|
282
381
|
report.append("\n✅ Successfully Applied Fixes:")
|
|
283
382
|
for fix in self.fixes_applied:
|
|
284
383
|
report.append(f" • {fix}")
|
|
285
|
-
|
|
384
|
+
|
|
286
385
|
if self.fixes_failed:
|
|
287
386
|
report.append("\n❌ Failed Fixes:")
|
|
288
387
|
for fix in self.fixes_failed:
|
|
289
388
|
report.append(f" • {fix}")
|
|
290
|
-
|
|
389
|
+
|
|
291
390
|
if not self.fixes_applied and not self.fixes_failed:
|
|
292
391
|
report.append("\nℹ️ No fixes were applied.")
|
|
293
|
-
|
|
392
|
+
|
|
294
393
|
report.append(f"\nTotal fixes applied: {len(self.fixes_applied)}")
|
|
295
394
|
report.append(f"Total fixes failed: {len(self.fixes_failed)}")
|
|
296
|
-
|
|
395
|
+
|
|
297
396
|
if self.fixes_failed:
|
|
298
397
|
report.append("\n⚠️ Some fixes failed. Please check the logs and try manual installation.")
|
|
299
398
|
else:
|
|
300
399
|
report.append("\n🎉 All fixes applied successfully!")
|
|
301
|
-
|
|
400
|
+
|
|
302
401
|
return "\n".join(report)
|
|
303
402
|
|
|
304
403
|
|
|
305
404
|
def main():
|
|
306
405
|
"""Main function."""
|
|
307
406
|
import argparse
|
|
308
|
-
|
|
407
|
+
|
|
309
408
|
parser = argparse.ArgumentParser(description="Fix AIECS dependencies")
|
|
310
|
-
parser.add_argument(
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
409
|
+
parser.add_argument(
|
|
410
|
+
"--non-interactive",
|
|
411
|
+
action="store_true",
|
|
412
|
+
help="Run in non-interactive mode (auto-approve all fixes)",
|
|
413
|
+
)
|
|
414
|
+
parser.add_argument(
|
|
415
|
+
"--check-only",
|
|
416
|
+
action="store_true",
|
|
417
|
+
help="Only check dependencies, don't fix them",
|
|
418
|
+
)
|
|
419
|
+
|
|
315
420
|
args = parser.parse_args()
|
|
316
|
-
|
|
421
|
+
|
|
317
422
|
# Import and run dependency checker first
|
|
318
423
|
try:
|
|
319
|
-
from aiecs.scripts.dependency_checker import DependencyChecker
|
|
424
|
+
from aiecs.scripts.dependance_check.dependency_checker import DependencyChecker # type: ignore[import-untyped]
|
|
425
|
+
|
|
320
426
|
checker = DependencyChecker()
|
|
321
427
|
tools = checker.check_all_dependencies()
|
|
322
|
-
|
|
428
|
+
|
|
323
429
|
if args.check_only:
|
|
324
430
|
report = checker.generate_report(tools)
|
|
325
431
|
print(report)
|
|
326
432
|
return 0
|
|
327
|
-
|
|
433
|
+
|
|
328
434
|
# Run fixer
|
|
329
435
|
fixer = DependencyFixer(interactive=not args.non_interactive)
|
|
330
436
|
success = fixer.fix_dependencies_from_checker(tools)
|
|
331
|
-
|
|
437
|
+
|
|
332
438
|
# Generate and display report
|
|
333
439
|
report = fixer.generate_fix_report()
|
|
334
440
|
print(report)
|
|
335
|
-
|
|
441
|
+
|
|
336
442
|
return 0 if success else 1
|
|
337
|
-
|
|
443
|
+
|
|
338
444
|
except Exception as e:
|
|
339
445
|
print(f"Error: {e}")
|
|
340
446
|
return 1
|
|
@@ -342,7 +448,3 @@ def main():
|
|
|
342
448
|
|
|
343
449
|
if __name__ == "__main__":
|
|
344
450
|
sys.exit(main())
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|