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
aiecs/utils/execution_utils.py
CHANGED
|
@@ -2,22 +2,30 @@ import json
|
|
|
2
2
|
import asyncio
|
|
3
3
|
import threading
|
|
4
4
|
import time
|
|
5
|
-
from typing import Any, Callable, Dict,
|
|
5
|
+
from typing import Any, Callable, Dict, Optional, MutableMapping
|
|
6
6
|
from cachetools import LRUCache
|
|
7
7
|
from contextlib import contextmanager
|
|
8
8
|
import logging
|
|
9
|
-
from tenacity import retry, stop_after_attempt, wait_exponential
|
|
9
|
+
from tenacity import retry, stop_after_attempt, wait_exponential
|
|
10
10
|
|
|
11
11
|
logger = logging.getLogger(__name__)
|
|
12
12
|
|
|
13
|
+
|
|
13
14
|
class ExecutionUtils:
|
|
14
15
|
"""
|
|
15
16
|
Provides common utility set for execution layer, including caching and retry logic.
|
|
16
17
|
"""
|
|
17
|
-
|
|
18
|
+
|
|
19
|
+
def __init__(
|
|
20
|
+
self,
|
|
21
|
+
cache_size: int = 100,
|
|
22
|
+
cache_ttl: int = 3600,
|
|
23
|
+
retry_attempts: int = 3,
|
|
24
|
+
retry_backoff: float = 1.0,
|
|
25
|
+
):
|
|
18
26
|
"""
|
|
19
27
|
Initialize execution utility class.
|
|
20
|
-
|
|
28
|
+
|
|
21
29
|
Args:
|
|
22
30
|
cache_size (int): Maximum number of cache entries
|
|
23
31
|
cache_ttl (int): Cache time-to-live (seconds)
|
|
@@ -28,30 +36,37 @@ class ExecutionUtils:
|
|
|
28
36
|
self.cache_ttl = cache_ttl
|
|
29
37
|
self.retry_attempts = retry_attempts
|
|
30
38
|
self.retry_backoff = retry_backoff
|
|
31
|
-
self._cache = LRUCache(maxsize=self.cache_size) if cache_size > 0 else None
|
|
39
|
+
self._cache: Optional[MutableMapping[str, Any]] = LRUCache(maxsize=self.cache_size) if cache_size > 0 else None
|
|
32
40
|
self._cache_lock = threading.Lock()
|
|
33
41
|
self._cache_ttl_dict: Dict[str, float] = {}
|
|
34
|
-
|
|
35
|
-
def generate_cache_key(
|
|
42
|
+
|
|
43
|
+
def generate_cache_key(
|
|
44
|
+
self,
|
|
45
|
+
func_name: str,
|
|
46
|
+
user_id: str,
|
|
47
|
+
task_id: str,
|
|
48
|
+
args: tuple,
|
|
49
|
+
kwargs: Dict[str, Any],
|
|
50
|
+
) -> str:
|
|
36
51
|
"""
|
|
37
52
|
Generate context-based cache key including user ID, task ID, function name and parameters.
|
|
38
|
-
|
|
53
|
+
|
|
39
54
|
Args:
|
|
40
55
|
func_name (str): Function name
|
|
41
56
|
user_id (str): User ID
|
|
42
57
|
task_id (str): Task ID
|
|
43
58
|
args (tuple): Positional arguments
|
|
44
59
|
kwargs (Dict[str, Any]): Keyword arguments
|
|
45
|
-
|
|
60
|
+
|
|
46
61
|
Returns:
|
|
47
62
|
str: Cache key
|
|
48
63
|
"""
|
|
49
64
|
key_dict = {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
65
|
+
"func": func_name,
|
|
66
|
+
"user_id": user_id,
|
|
67
|
+
"task_id": task_id,
|
|
68
|
+
"args": args,
|
|
69
|
+
"kwargs": {k: v for k, v in kwargs.items() if k != "self"},
|
|
55
70
|
}
|
|
56
71
|
try:
|
|
57
72
|
key_str = json.dumps(key_dict, sort_keys=True)
|
|
@@ -62,14 +77,14 @@ class ExecutionUtils:
|
|
|
62
77
|
def get_from_cache(self, cache_key: str) -> Optional[Any]:
|
|
63
78
|
"""
|
|
64
79
|
Get result from cache if it exists and is not expired.
|
|
65
|
-
|
|
80
|
+
|
|
66
81
|
Args:
|
|
67
82
|
cache_key (str): Cache key
|
|
68
|
-
|
|
83
|
+
|
|
69
84
|
Returns:
|
|
70
85
|
Optional[Any]: Cached result or None
|
|
71
86
|
"""
|
|
72
|
-
if
|
|
87
|
+
if self._cache is None:
|
|
73
88
|
return None
|
|
74
89
|
with self._cache_lock:
|
|
75
90
|
if cache_key in self._cache:
|
|
@@ -83,13 +98,13 @@ class ExecutionUtils:
|
|
|
83
98
|
def add_to_cache(self, cache_key: str, result: Any, ttl: Optional[int] = None) -> None:
|
|
84
99
|
"""
|
|
85
100
|
Add result to cache with optional time-to-live setting.
|
|
86
|
-
|
|
101
|
+
|
|
87
102
|
Args:
|
|
88
103
|
cache_key (str): Cache key
|
|
89
104
|
result (Any): Cached result
|
|
90
105
|
ttl (Optional[int]): Time-to-live (seconds)
|
|
91
106
|
"""
|
|
92
|
-
if
|
|
107
|
+
if self._cache is None:
|
|
93
108
|
return
|
|
94
109
|
with self._cache_lock:
|
|
95
110
|
self._cache[cache_key] = result
|
|
@@ -100,36 +115,40 @@ class ExecutionUtils:
|
|
|
100
115
|
def create_retry_strategy(self, metric_name: Optional[str] = None) -> Callable:
|
|
101
116
|
"""
|
|
102
117
|
Create retry strategy for execution operations.
|
|
103
|
-
|
|
118
|
+
|
|
104
119
|
Args:
|
|
105
120
|
metric_name (Optional[str]): Metric name for logging
|
|
106
|
-
|
|
121
|
+
|
|
107
122
|
Returns:
|
|
108
123
|
Callable: Retry decorator
|
|
109
124
|
"""
|
|
125
|
+
|
|
110
126
|
def after_retry(retry_state):
|
|
111
127
|
logger.warning(f"Retry {retry_state.attempt_number}/{self.retry_attempts} for {metric_name or 'operation'} after {retry_state.idle_for}s: {retry_state.outcome.exception()}")
|
|
112
|
-
|
|
128
|
+
|
|
113
129
|
return retry(
|
|
114
130
|
stop=stop_after_attempt(self.retry_attempts),
|
|
115
131
|
wait=wait_exponential(multiplier=self.retry_backoff, min=1, max=10),
|
|
116
|
-
after=after_retry
|
|
132
|
+
after=after_retry,
|
|
117
133
|
)
|
|
118
134
|
|
|
119
135
|
@contextmanager
|
|
120
136
|
def timeout_context(self, seconds: int):
|
|
121
137
|
"""
|
|
122
138
|
Context manager for enforcing operation timeout.
|
|
123
|
-
|
|
139
|
+
|
|
124
140
|
Args:
|
|
125
141
|
seconds (int): Timeout duration (seconds)
|
|
126
|
-
|
|
142
|
+
|
|
127
143
|
Raises:
|
|
128
144
|
TimeoutError: If operation exceeds timeout duration
|
|
129
145
|
"""
|
|
130
146
|
loop = asyncio.get_event_loop()
|
|
131
|
-
future = asyncio.Future()
|
|
132
|
-
handle = loop.call_later(
|
|
147
|
+
future: asyncio.Future[None] = asyncio.Future()
|
|
148
|
+
handle = loop.call_later(
|
|
149
|
+
seconds,
|
|
150
|
+
lambda: future.set_exception(TimeoutError(f"Operation timed out after {seconds}s")),
|
|
151
|
+
)
|
|
133
152
|
try:
|
|
134
153
|
yield future
|
|
135
154
|
finally:
|
|
@@ -138,16 +157,16 @@ class ExecutionUtils:
|
|
|
138
157
|
async def execute_with_retry_and_timeout(self, func: Callable, timeout: int, *args, **kwargs) -> Any:
|
|
139
158
|
"""
|
|
140
159
|
Execute operation with retry and timeout mechanism.
|
|
141
|
-
|
|
160
|
+
|
|
142
161
|
Args:
|
|
143
162
|
func (Callable): Function to execute
|
|
144
163
|
timeout (int): Timeout duration (seconds)
|
|
145
164
|
*args: Positional arguments
|
|
146
165
|
**kwargs: Keyword arguments
|
|
147
|
-
|
|
166
|
+
|
|
148
167
|
Returns:
|
|
149
168
|
Any: Operation result
|
|
150
|
-
|
|
169
|
+
|
|
151
170
|
Raises:
|
|
152
171
|
OperationError: If all retry attempts fail
|
|
153
172
|
"""
|
|
@@ -155,4 +174,4 @@ class ExecutionUtils:
|
|
|
155
174
|
try:
|
|
156
175
|
return await asyncio.wait_for(retry_strategy(func)(*args, **kwargs), timeout=timeout)
|
|
157
176
|
except asyncio.TimeoutError:
|
|
158
|
-
raise TimeoutError(f"Operation timed out after {timeout}s")
|
|
177
|
+
raise TimeoutError(f"Operation timed out after {timeout}s")
|
aiecs/utils/prompt_loader.py
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
from datetime import datetime
|
|
2
2
|
from typing import Optional, Dict, Any
|
|
3
3
|
import logging
|
|
4
|
-
from
|
|
4
|
+
from aiecs.infrastructure.persistence.redis_client import get_redis_client
|
|
5
5
|
|
|
6
6
|
logger = logging.getLogger(__name__)
|
|
7
7
|
|
|
8
|
+
|
|
8
9
|
class TokenUsageRepository:
|
|
9
10
|
"""Encapsulates all Redis operations related to user token usage"""
|
|
10
11
|
|
|
@@ -28,7 +29,12 @@ class TokenUsageRepository:
|
|
|
28
29
|
|
|
29
30
|
return f"token_usage:{user_id}:{period}"
|
|
30
31
|
|
|
31
|
-
async def increment_prompt_tokens(
|
|
32
|
+
async def increment_prompt_tokens(
|
|
33
|
+
self,
|
|
34
|
+
user_id: str,
|
|
35
|
+
prompt_tokens: int,
|
|
36
|
+
cycle_start_date: Optional[str] = None,
|
|
37
|
+
):
|
|
32
38
|
"""
|
|
33
39
|
Increment prompt token usage for specified user
|
|
34
40
|
|
|
@@ -51,7 +57,12 @@ class TokenUsageRepository:
|
|
|
51
57
|
logger.error(f"Failed to increment prompt tokens for user {user_id}: {e}")
|
|
52
58
|
raise
|
|
53
59
|
|
|
54
|
-
async def increment_completion_tokens(
|
|
60
|
+
async def increment_completion_tokens(
|
|
61
|
+
self,
|
|
62
|
+
user_id: str,
|
|
63
|
+
completion_tokens: int,
|
|
64
|
+
cycle_start_date: Optional[str] = None,
|
|
65
|
+
):
|
|
55
66
|
"""
|
|
56
67
|
Increment completion token usage for specified user
|
|
57
68
|
|
|
@@ -74,7 +85,12 @@ class TokenUsageRepository:
|
|
|
74
85
|
logger.error(f"Failed to increment completion tokens for user {user_id}: {e}")
|
|
75
86
|
raise
|
|
76
87
|
|
|
77
|
-
async def increment_total_usage(
|
|
88
|
+
async def increment_total_usage(
|
|
89
|
+
self,
|
|
90
|
+
user_id: str,
|
|
91
|
+
total_tokens: int,
|
|
92
|
+
cycle_start_date: Optional[str] = None,
|
|
93
|
+
):
|
|
78
94
|
"""
|
|
79
95
|
Increment total token usage for specified user
|
|
80
96
|
|
|
@@ -102,7 +118,7 @@ class TokenUsageRepository:
|
|
|
102
118
|
user_id: str,
|
|
103
119
|
prompt_tokens: int,
|
|
104
120
|
completion_tokens: int,
|
|
105
|
-
cycle_start_date: Optional[str] = None
|
|
121
|
+
cycle_start_date: Optional[str] = None,
|
|
106
122
|
):
|
|
107
123
|
"""
|
|
108
124
|
Increment both prompt and completion token usage for specified user
|
|
@@ -187,7 +203,7 @@ class TokenUsageRepository:
|
|
|
187
203
|
return {
|
|
188
204
|
"prompt_tokens": 0,
|
|
189
205
|
"completion_tokens": 0,
|
|
190
|
-
"total_tokens": 0
|
|
206
|
+
"total_tokens": 0,
|
|
191
207
|
}
|
|
192
208
|
|
|
193
209
|
async def reset_usage(self, user_id: str, cycle_start_date: Optional[str] = None):
|
|
@@ -228,7 +244,7 @@ class TokenUsageRepository:
|
|
|
228
244
|
|
|
229
245
|
try:
|
|
230
246
|
client = await get_redis_client()
|
|
231
|
-
await client.hset(redis_key,
|
|
247
|
+
await client.hset(redis_key, key="usage_limit", value=str(limit))
|
|
232
248
|
logger.info(f"[Repository] Set usage limit {limit} for user '{user_id}' in key '{redis_key}'.")
|
|
233
249
|
except Exception as e:
|
|
234
250
|
logger.error(f"Failed to set usage limit for user {user_id}: {e}")
|
|
@@ -246,7 +262,12 @@ class TokenUsageRepository:
|
|
|
246
262
|
Dictionary containing limit check results
|
|
247
263
|
"""
|
|
248
264
|
if not user_id:
|
|
249
|
-
return {
|
|
265
|
+
return {
|
|
266
|
+
"exceeded": False,
|
|
267
|
+
"current_usage": 0,
|
|
268
|
+
"limit": 0,
|
|
269
|
+
"remaining": 0,
|
|
270
|
+
}
|
|
250
271
|
|
|
251
272
|
try:
|
|
252
273
|
stats = await self.get_usage_stats(user_id, cycle_start_date)
|
|
@@ -258,13 +279,13 @@ class TokenUsageRepository:
|
|
|
258
279
|
limit = int(limit_str) if limit_str else 0
|
|
259
280
|
|
|
260
281
|
exceeded = limit > 0 and current_usage >= limit
|
|
261
|
-
remaining = max(0, limit - current_usage) if limit > 0 else float(
|
|
282
|
+
remaining = max(0, limit - current_usage) if limit > 0 else float("inf")
|
|
262
283
|
|
|
263
284
|
result = {
|
|
264
285
|
"exceeded": exceeded,
|
|
265
286
|
"current_usage": current_usage,
|
|
266
287
|
"limit": limit,
|
|
267
|
-
"remaining": remaining
|
|
288
|
+
"remaining": remaining,
|
|
268
289
|
}
|
|
269
290
|
|
|
270
291
|
logger.debug(f"[Repository] Usage limit check for user '{user_id}': {result}")
|
|
@@ -272,7 +293,12 @@ class TokenUsageRepository:
|
|
|
272
293
|
|
|
273
294
|
except Exception as e:
|
|
274
295
|
logger.error(f"Failed to check usage limit for user {user_id}: {e}")
|
|
275
|
-
return {
|
|
296
|
+
return {
|
|
297
|
+
"exceeded": False,
|
|
298
|
+
"current_usage": 0,
|
|
299
|
+
"limit": 0,
|
|
300
|
+
"remaining": 0,
|
|
301
|
+
}
|
|
276
302
|
|
|
277
303
|
|
|
278
304
|
# Create a singleton for global application use
|
aiecs/ws/socket_server.py
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
from typing import Any, Dict
|
|
2
|
+
|
|
3
|
+
import socketio # type: ignore[import-untyped]
|
|
4
|
+
from typing import Dict, Any
|
|
2
5
|
from aiecs.config.config import get_settings
|
|
3
6
|
|
|
4
7
|
settings = get_settings()
|
|
@@ -9,17 +12,20 @@ allowed_origins = settings.cors_allowed_origins.split(",") if hasattr(settings,
|
|
|
9
12
|
# Allow all origins for development (more permissive)
|
|
10
13
|
# In production, you should use specific origins
|
|
11
14
|
# Explicitly set async_mode to 'asgi' for compatibility with uvicorn
|
|
12
|
-
sio = socketio.AsyncServer(cors_allowed_origins="*", async_mode=
|
|
15
|
+
sio = socketio.AsyncServer(cors_allowed_origins="*", async_mode="asgi")
|
|
13
16
|
# We no longer create a FastAPI app or combined ASGI app here
|
|
14
|
-
# The FastAPI app will be created in main.py and the Socket.IO server will
|
|
17
|
+
# The FastAPI app will be created in main.py and the Socket.IO server will
|
|
18
|
+
# be mounted there
|
|
15
19
|
|
|
16
20
|
# Store connected clients by user ID
|
|
17
|
-
connected_clients = {}
|
|
21
|
+
connected_clients: Dict[str, Any] = {}
|
|
22
|
+
|
|
18
23
|
|
|
19
24
|
@sio.event
|
|
20
25
|
async def connect(sid, environ, auth=None):
|
|
21
26
|
print(f"Client connected: {sid}")
|
|
22
27
|
|
|
28
|
+
|
|
23
29
|
@sio.event
|
|
24
30
|
async def disconnect(sid):
|
|
25
31
|
print(f"Client disconnected: {sid}")
|
|
@@ -27,6 +33,7 @@ async def disconnect(sid):
|
|
|
27
33
|
if socket_id == sid:
|
|
28
34
|
del connected_clients[user]
|
|
29
35
|
|
|
36
|
+
|
|
30
37
|
@sio.event
|
|
31
38
|
async def register(sid, data):
|
|
32
39
|
user_id = data.get("user_id")
|
|
@@ -34,7 +41,10 @@ async def register(sid, data):
|
|
|
34
41
|
connected_clients[user_id] = sid
|
|
35
42
|
print(f"Registered user {user_id} on SID {sid}")
|
|
36
43
|
|
|
44
|
+
|
|
37
45
|
# Send progress update to user
|
|
46
|
+
|
|
47
|
+
|
|
38
48
|
async def push_progress(user_id: str, data: dict):
|
|
39
49
|
sid = connected_clients.get(user_id)
|
|
40
50
|
if sid:
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aiecs
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.7.6
|
|
4
4
|
Summary: AI Execute Services - A middleware framework for AI-powered task execution and tool orchestration
|
|
5
5
|
Author-email: AIECS Team <iretbl@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
7
|
-
Project-URL: Homepage, https://github.com/
|
|
8
|
-
Project-URL: Bug Tracker, https://github.com/
|
|
7
|
+
Project-URL: Homepage, https://github.com/Howmany-Zeta/AI-Execute-Services
|
|
8
|
+
Project-URL: Bug Tracker, https://github.com/Howmany-Zeta/AI-Execute-Services/issues
|
|
9
9
|
Project-URL: Documentation, https://aiecs.readthedocs.io
|
|
10
10
|
Keywords: ai,middleware,llm,orchestration,async,tools
|
|
11
11
|
Classifier: Development Status :: 4 - Beta
|
|
@@ -18,7 +18,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
18
18
|
Classifier: Framework :: FastAPI
|
|
19
19
|
Classifier: Framework :: Celery
|
|
20
20
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
21
|
-
Requires-Python: <3.13,>=3.
|
|
21
|
+
Requires-Python: <3.13,>=3.11
|
|
22
22
|
Description-Content-Type: text/markdown
|
|
23
23
|
License-File: LICENSE
|
|
24
24
|
Requires-Dist: fastapi<0.116.0,>=0.115.12
|
|
@@ -37,7 +37,12 @@ Requires-Dist: python-engineio<5.0.0,>=4.12.1
|
|
|
37
37
|
Requires-Dist: tenacity<10.0.0,>=9.1.2
|
|
38
38
|
Requires-Dist: flower<3.0.0,>=2.0.1
|
|
39
39
|
Requires-Dist: openai<1.76.0,>=1.68.2
|
|
40
|
-
Requires-Dist: google-cloud-aiplatform<2.0.0,>=1.
|
|
40
|
+
Requires-Dist: google-cloud-aiplatform<2.0.0,>=1.80.0
|
|
41
|
+
Requires-Dist: google-genai<2.0.0,>=1.0.0
|
|
42
|
+
Requires-Dist: google-api-python-client<3.0.0,>=2.108.0
|
|
43
|
+
Requires-Dist: google-auth<3.0.0,>=2.25.0
|
|
44
|
+
Requires-Dist: google-auth-httplib2<1.0.0,>=0.2.0
|
|
45
|
+
Requires-Dist: google-auth-oauthlib<2.0.0,>=1.2.0
|
|
41
46
|
Requires-Dist: langchain<0.4.0,>=0.3.26
|
|
42
47
|
Requires-Dist: langgraph<0.6.0,>=0.5.3
|
|
43
48
|
Requires-Dist: weasel==0.4.1
|
|
@@ -49,13 +54,14 @@ Requires-Dist: scipy<2.0.0,>=1.15.3
|
|
|
49
54
|
Requires-Dist: scikit-learn<2.0.0,>=1.5.0
|
|
50
55
|
Requires-Dist: statsmodels<0.15.0,>=0.14.4
|
|
51
56
|
Requires-Dist: pyreadstat<2.0.0,>=1.2.9
|
|
57
|
+
Requires-Dist: pyarrow<22.0.0,>=21.0.0
|
|
52
58
|
Requires-Dist: tabulate<0.10.0,>=0.9.0
|
|
53
59
|
Requires-Dist: python-docx<2.0.0,>=1.1.2
|
|
54
60
|
Requires-Dist: python-pptx<2.0.0,>=1.0.2
|
|
55
61
|
Requires-Dist: openpyxl<4.0.0,>=3.1.5
|
|
56
62
|
Requires-Dist: pdfplumber<0.12.0,>=0.11.7
|
|
57
63
|
Requires-Dist: pdfminer-six==20250506
|
|
58
|
-
Requires-Dist: tika<
|
|
64
|
+
Requires-Dist: tika<4.0.0,>=3.1.0
|
|
59
65
|
Requires-Dist: matplotlib<4.0.0,>=3.10.3
|
|
60
66
|
Requires-Dist: seaborn<0.14.0,>=0.13.2
|
|
61
67
|
Requires-Dist: jinja2<4.0.0,>=3.1.6
|
|
@@ -70,20 +76,35 @@ Requires-Dist: markdown<4.0,>=3.8
|
|
|
70
76
|
Requires-Dist: bleach<7.0.0,>=6.2.0
|
|
71
77
|
Requires-Dist: sqlalchemy<3.0.0,>=2.0.41
|
|
72
78
|
Requires-Dist: asyncpg<1.0.0,>=0.30.0
|
|
79
|
+
Requires-Dist: aiosqlite<1.0.0,>=0.20.0
|
|
80
|
+
Requires-Dist: networkx<4.0.0,>=3.0
|
|
81
|
+
Requires-Dist: lark-parser<0.13.0,>=0.12.0
|
|
73
82
|
Requires-Dist: prometheus-client<1.0.0,>=0.21.1
|
|
74
83
|
Requires-Dist: jaeger-client<5.0.0,>=4.8.0
|
|
75
84
|
Requires-Dist: opentracing<3.0.0,>=2.4.0
|
|
76
85
|
Requires-Dist: psutil<8.0.0,>=7.0.0
|
|
77
86
|
Provides-Extra: dev
|
|
78
|
-
Requires-Dist: pytest
|
|
79
|
-
Requires-Dist: pytest-asyncio
|
|
80
|
-
Requires-Dist: pytest-cov
|
|
81
|
-
Requires-Dist: pytest-
|
|
82
|
-
Requires-Dist:
|
|
83
|
-
Requires-Dist:
|
|
84
|
-
Requires-Dist:
|
|
85
|
-
Requires-Dist:
|
|
86
|
-
Requires-Dist:
|
|
87
|
+
Requires-Dist: pytest<9.0.0,>=8.4.2; extra == "dev"
|
|
88
|
+
Requires-Dist: pytest-asyncio<2.0.0,>=1.2.0; extra == "dev"
|
|
89
|
+
Requires-Dist: pytest-cov<8.0.0,>=7.0.0; extra == "dev"
|
|
90
|
+
Requires-Dist: pytest-timeout<3.0.0,>=2.4.0; extra == "dev"
|
|
91
|
+
Requires-Dist: mypy<2.0.0,>=1.18.2; extra == "dev"
|
|
92
|
+
Requires-Dist: flake8<8.0.0,>=7.3.0; extra == "dev"
|
|
93
|
+
Requires-Dist: black<26.0.0,>=25.1.0; extra == "dev"
|
|
94
|
+
Requires-Dist: types-aiofiles>=25.1.0.20251011; extra == "dev"
|
|
95
|
+
Requires-Dist: types-cachetools>=6.2.0.20251022; extra == "dev"
|
|
96
|
+
Requires-Dist: types-colorama>=0.4.15.20250801; extra == "dev"
|
|
97
|
+
Requires-Dist: types-tqdm>=4.67.0.20250809; extra == "dev"
|
|
98
|
+
Requires-Dist: types-pyyaml>=6.0.12.20250915; extra == "dev"
|
|
99
|
+
Requires-Dist: types-opentracing>=2.4.10.20250622; extra == "dev"
|
|
100
|
+
Requires-Dist: types-lxml>=2025.8.25; extra == "dev"
|
|
101
|
+
Requires-Dist: types-bleach>=6.3.0.20251115; extra == "dev"
|
|
102
|
+
Provides-Extra: docs
|
|
103
|
+
Requires-Dist: sphinx<8.0.0,>=7.0.0; extra == "docs"
|
|
104
|
+
Requires-Dist: sphinx-rtd-theme<3.0.0,>=2.0.0; extra == "docs"
|
|
105
|
+
Requires-Dist: sphinx-autodoc-typehints<3.0.0,>=2.0.0; extra == "docs"
|
|
106
|
+
Requires-Dist: myst-parser<3.0.0,>=2.0.0; extra == "docs"
|
|
107
|
+
Requires-Dist: sphinx-copybutton<1.0.0,>=0.5.0; extra == "docs"
|
|
87
108
|
Dynamic: license-file
|
|
88
109
|
|
|
89
110
|
# AIECS - AI Execute Services
|
|
@@ -146,6 +167,22 @@ aiecs-fix-deps
|
|
|
146
167
|
aiecs-patch-weasel
|
|
147
168
|
```
|
|
148
169
|
|
|
170
|
+
### Container Deployment
|
|
171
|
+
|
|
172
|
+
When installing aiecs in a container (e.g., Docker), you may encounter a warning about scripts not being on PATH:
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
WARNING: The scripts aiecs, aiecs-check-deps, ... are installed in '/tmp/.local/bin' which is not on PATH.
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**Quick Fix:** Add the user bin directory to PATH in your Dockerfile:
|
|
179
|
+
|
|
180
|
+
```dockerfile
|
|
181
|
+
ENV PATH="${PATH}:/root/.local/bin"
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
For detailed troubleshooting and best practices, see [Deployment Troubleshooting Guide](docs/user/DEPLOYMENT_TROUBLESHOOTING.md).
|
|
185
|
+
|
|
149
186
|
## Quick Start
|
|
150
187
|
|
|
151
188
|
### Basic Usage
|