aiecs 1.0.1__py3-none-any.whl → 1.7.17__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 +435 -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 +3949 -0
- aiecs/domain/agent/exceptions.py +99 -0
- aiecs/domain/agent/graph_aware_mixin.py +569 -0
- aiecs/domain/agent/hybrid_agent.py +1731 -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 +894 -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 +377 -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 +230 -37
- aiecs/llm/client_resolver.py +155 -0
- aiecs/llm/clients/__init__.py +38 -0
- aiecs/llm/clients/base_client.py +328 -0
- aiecs/llm/clients/google_function_calling_mixin.py +415 -0
- aiecs/llm/clients/googleai_client.py +314 -0
- aiecs/llm/clients/openai_client.py +158 -0
- aiecs/llm/clients/openai_compatible_mixin.py +367 -0
- aiecs/llm/clients/vertex_client.py +1186 -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 +1464 -0
- aiecs/tools/docs/document_layout_tool.py +1160 -0
- aiecs/tools/docs/document_parser_tool.py +1016 -0
- aiecs/tools/docs/document_writer_tool.py +2008 -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 +220 -141
- 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.17.dist-info}/METADATA +52 -15
- aiecs-1.7.17.dist-info/RECORD +337 -0
- aiecs-1.7.17.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.17.dist-info}/WHEEL +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/licenses/LICENSE +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/top_level.txt +0 -0
aiecs/tools/__init__.py
CHANGED
|
@@ -5,190 +5,312 @@ import inspect
|
|
|
5
5
|
import logging
|
|
6
6
|
import os
|
|
7
7
|
import pkgutil
|
|
8
|
-
from typing import
|
|
8
|
+
from typing import Dict, Any
|
|
9
9
|
|
|
10
10
|
from aiecs.tools.base_tool import BaseTool
|
|
11
11
|
|
|
12
12
|
logger = logging.getLogger(__name__)
|
|
13
13
|
|
|
14
|
-
#
|
|
15
|
-
TOOL_REGISTRY = {}
|
|
16
|
-
TOOL_CLASSES = {}
|
|
17
|
-
TOOL_CONFIGS
|
|
14
|
+
# Global tool registry
|
|
15
|
+
TOOL_REGISTRY: Dict[str, Any] = {}
|
|
16
|
+
TOOL_CLASSES: Dict[str, Any] = {}
|
|
17
|
+
# TOOL_CONFIGS: Legacy configuration dictionary.
|
|
18
|
+
# Values here are passed as explicit config to tools (highest precedence).
|
|
19
|
+
# Prefer using YAML config files (config/tools/{tool_name}.yaml) or .env files instead.
|
|
20
|
+
TOOL_CONFIGS: Dict[str, Any] = {}
|
|
21
|
+
|
|
18
22
|
|
|
19
23
|
def register_tool(name):
|
|
20
24
|
"""
|
|
21
|
-
|
|
25
|
+
Decorator for registering tool classes
|
|
22
26
|
|
|
23
27
|
Args:
|
|
24
|
-
name:
|
|
28
|
+
name: Tool name
|
|
25
29
|
|
|
26
30
|
Returns:
|
|
27
|
-
|
|
31
|
+
Decorated class
|
|
28
32
|
"""
|
|
33
|
+
|
|
29
34
|
def wrapper(cls):
|
|
30
|
-
#
|
|
35
|
+
# Store tool class but don't instantiate immediately
|
|
31
36
|
TOOL_CLASSES[name] = cls
|
|
32
|
-
#
|
|
37
|
+
# Backward compatibility: if class inherits from BaseTool, don't
|
|
38
|
+
# instantiate immediately
|
|
33
39
|
if not issubclass(cls, BaseTool):
|
|
34
40
|
TOOL_REGISTRY[name] = cls()
|
|
35
41
|
return cls
|
|
42
|
+
|
|
36
43
|
return wrapper
|
|
37
44
|
|
|
45
|
+
|
|
38
46
|
def get_tool(name):
|
|
39
47
|
"""
|
|
40
|
-
|
|
48
|
+
Get tool instance
|
|
41
49
|
|
|
42
50
|
Args:
|
|
43
|
-
name:
|
|
51
|
+
name: Tool name
|
|
44
52
|
|
|
45
53
|
Returns:
|
|
46
|
-
|
|
54
|
+
Tool instance
|
|
47
55
|
|
|
48
56
|
Raises:
|
|
49
|
-
ValueError:
|
|
57
|
+
ValueError: If tool is not registered
|
|
50
58
|
"""
|
|
51
|
-
if
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
59
|
+
# Check if placeholder needs to be replaced or lazy instantiation is needed
|
|
60
|
+
if name in TOOL_CLASSES:
|
|
61
|
+
# If TOOL_REGISTRY contains placeholder or doesn't exist, instantiate
|
|
62
|
+
# real tool class
|
|
63
|
+
current_tool = TOOL_REGISTRY.get(name)
|
|
64
|
+
is_placeholder = getattr(current_tool, "is_placeholder", False)
|
|
65
|
+
|
|
66
|
+
if current_tool is None or is_placeholder:
|
|
67
|
+
# Lazy instantiation of BaseTool subclasses, replace placeholder
|
|
68
|
+
# Configuration is loaded automatically by BaseTool using ToolConfigLoader:
|
|
69
|
+
# 1. TOOL_CONFIGS values (explicit config, highest precedence)
|
|
70
|
+
# 2. YAML config files (config/tools/{tool_name}.yaml or config/tools.yaml)
|
|
71
|
+
# 3. Environment variables (via dotenv from .env files)
|
|
72
|
+
# 4. Tool defaults (lowest priority)
|
|
73
|
+
tool_class = TOOL_CLASSES[name]
|
|
74
|
+
config = TOOL_CONFIGS.get(name, {})
|
|
75
|
+
# Pass tool name to BaseTool for config file discovery (used for YAML file lookup)
|
|
76
|
+
# Check if tool class accepts tool_name parameter (for backward compatibility)
|
|
77
|
+
sig = inspect.signature(tool_class.__init__)
|
|
78
|
+
if "tool_name" in sig.parameters or any(
|
|
79
|
+
p.kind == inspect.Parameter.VAR_KEYWORD for p in sig.parameters.values()
|
|
80
|
+
):
|
|
81
|
+
TOOL_REGISTRY[name] = tool_class(config=config, tool_name=name)
|
|
82
|
+
else:
|
|
83
|
+
# Tool class doesn't accept tool_name, only pass config
|
|
84
|
+
TOOL_REGISTRY[name] = tool_class(config=config)
|
|
85
|
+
logger.debug(f"Instantiated tool '{name}' from class {tool_class.__name__}")
|
|
56
86
|
|
|
57
87
|
if name not in TOOL_REGISTRY:
|
|
58
88
|
raise ValueError(f"Tool '{name}' is not registered")
|
|
59
89
|
|
|
60
90
|
return TOOL_REGISTRY[name]
|
|
61
91
|
|
|
92
|
+
|
|
62
93
|
def list_tools():
|
|
63
94
|
"""
|
|
64
|
-
|
|
95
|
+
List all registered tools
|
|
65
96
|
|
|
66
97
|
Returns:
|
|
67
|
-
|
|
98
|
+
List of tool information dictionaries
|
|
68
99
|
"""
|
|
69
100
|
tools = []
|
|
70
101
|
all_tool_names = list(set(list(TOOL_REGISTRY.keys()) + list(TOOL_CLASSES.keys())))
|
|
71
|
-
|
|
102
|
+
|
|
72
103
|
for tool_name in all_tool_names:
|
|
73
104
|
try:
|
|
74
|
-
#
|
|
105
|
+
# Prefer using information from existing instances
|
|
75
106
|
if tool_name in TOOL_REGISTRY:
|
|
76
107
|
tool_instance = TOOL_REGISTRY[tool_name]
|
|
77
108
|
tool_info = {
|
|
78
109
|
"name": tool_name,
|
|
79
|
-
"description": getattr(tool_instance,
|
|
80
|
-
"category": getattr(tool_instance,
|
|
110
|
+
"description": getattr(tool_instance, "description", f"{tool_name} tool"),
|
|
111
|
+
"category": getattr(tool_instance, "category", "general"),
|
|
81
112
|
"class_name": tool_instance.__class__.__name__,
|
|
82
113
|
"module": tool_instance.__class__.__module__,
|
|
83
|
-
"status": "loaded"
|
|
114
|
+
"status": "loaded",
|
|
84
115
|
}
|
|
85
116
|
elif tool_name in TOOL_CLASSES:
|
|
86
|
-
#
|
|
117
|
+
# Get information from class definition but don't instantiate
|
|
87
118
|
tool_class = TOOL_CLASSES[tool_name]
|
|
88
119
|
tool_info = {
|
|
89
120
|
"name": tool_name,
|
|
90
|
-
"description": getattr(tool_class,
|
|
91
|
-
"category": getattr(tool_class,
|
|
121
|
+
"description": getattr(tool_class, "description", f"{tool_name} tool"),
|
|
122
|
+
"category": getattr(tool_class, "category", "general"),
|
|
92
123
|
"class_name": tool_class.__name__,
|
|
93
124
|
"module": tool_class.__module__,
|
|
94
|
-
"status": "available"
|
|
125
|
+
"status": "available",
|
|
95
126
|
}
|
|
96
127
|
else:
|
|
97
128
|
continue
|
|
98
|
-
|
|
129
|
+
|
|
99
130
|
tools.append(tool_info)
|
|
100
|
-
|
|
131
|
+
|
|
101
132
|
except Exception as e:
|
|
102
133
|
logger.warning(f"Failed to get info for tool {tool_name}: {e}")
|
|
103
|
-
#
|
|
104
|
-
tools.append(
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
134
|
+
# Provide basic information
|
|
135
|
+
tools.append(
|
|
136
|
+
{
|
|
137
|
+
"name": tool_name,
|
|
138
|
+
"description": f"{tool_name} (info unavailable)",
|
|
139
|
+
"category": "unknown",
|
|
140
|
+
"class_name": "Unknown",
|
|
141
|
+
"module": "unknown",
|
|
142
|
+
"status": "error",
|
|
143
|
+
}
|
|
144
|
+
)
|
|
145
|
+
|
|
113
146
|
return tools
|
|
114
147
|
|
|
148
|
+
|
|
115
149
|
def discover_tools(package_path: str = "aiecs.tools"):
|
|
116
150
|
"""
|
|
117
|
-
|
|
151
|
+
Discover and register all tools in the package
|
|
118
152
|
|
|
119
153
|
Args:
|
|
120
|
-
package_path:
|
|
154
|
+
package_path: Package path to search
|
|
121
155
|
"""
|
|
122
156
|
package = importlib.import_module(package_path)
|
|
157
|
+
if package.__file__ is None:
|
|
158
|
+
return
|
|
123
159
|
package_dir = os.path.dirname(package.__file__)
|
|
124
160
|
|
|
125
161
|
for _, module_name, is_pkg in pkgutil.iter_modules([package_dir]):
|
|
126
162
|
if is_pkg:
|
|
127
|
-
#
|
|
163
|
+
# Recursively search for tools in subpackages
|
|
128
164
|
discover_tools(f"{package_path}.{module_name}")
|
|
129
165
|
else:
|
|
130
|
-
#
|
|
166
|
+
# Import module
|
|
131
167
|
try:
|
|
132
168
|
importlib.import_module(f"{package_path}.{module_name}")
|
|
133
169
|
except Exception as e:
|
|
134
170
|
logger.error(f"Error importing module {module_name}: {e}")
|
|
135
171
|
|
|
136
|
-
# 导入基础工具类供继承使用
|
|
137
|
-
from aiecs.tools.base_tool import BaseTool
|
|
138
172
|
|
|
139
173
|
# Lazy loading strategy: don't import all tools at package init
|
|
140
174
|
# Tools will be loaded on-demand when requested
|
|
141
175
|
|
|
176
|
+
|
|
142
177
|
def _ensure_task_tools_available():
|
|
143
178
|
"""Ensure task_tools module is available for lazy loading"""
|
|
144
179
|
try:
|
|
145
|
-
from . import task_tools
|
|
146
180
|
return True
|
|
147
181
|
except ImportError as e:
|
|
148
182
|
logger.error(f"Failed to import task_tools: {e}")
|
|
149
183
|
return False
|
|
150
184
|
|
|
185
|
+
|
|
186
|
+
def _auto_discover_tools():
|
|
187
|
+
"""Automatically discover all tools by scanning tool directories"""
|
|
188
|
+
import re
|
|
189
|
+
|
|
190
|
+
# Define tool directories and their categories
|
|
191
|
+
tool_dirs = [
|
|
192
|
+
("task_tools", "task"),
|
|
193
|
+
("docs", "docs"),
|
|
194
|
+
("statistics", "statistics"),
|
|
195
|
+
("search_tool", "task"), # Enhanced search tool
|
|
196
|
+
("api_sources", "task"), # API data sources (legacy)
|
|
197
|
+
("apisource", "task"), # API Source Tool (new modular version)
|
|
198
|
+
]
|
|
199
|
+
|
|
200
|
+
discovered_tools = []
|
|
201
|
+
|
|
202
|
+
for dir_name, category in tool_dirs:
|
|
203
|
+
dir_path = os.path.join(os.path.dirname(__file__), dir_name)
|
|
204
|
+
if not os.path.exists(dir_path):
|
|
205
|
+
continue
|
|
206
|
+
|
|
207
|
+
# Check if this is a package (has __init__.py) or a directory of
|
|
208
|
+
# modules
|
|
209
|
+
init_file = os.path.join(dir_path, "__init__.py")
|
|
210
|
+
files_to_scan = []
|
|
211
|
+
|
|
212
|
+
if os.path.isfile(init_file):
|
|
213
|
+
# Scan __init__.py for package-level registrations
|
|
214
|
+
files_to_scan.append(("__init__.py", init_file))
|
|
215
|
+
|
|
216
|
+
# Scan all other Python files in the directory
|
|
217
|
+
for filename in os.listdir(dir_path):
|
|
218
|
+
if filename.endswith(".py") and not filename.startswith("__"):
|
|
219
|
+
file_path = os.path.join(dir_path, filename)
|
|
220
|
+
files_to_scan.append((filename, file_path))
|
|
221
|
+
|
|
222
|
+
# Process all files
|
|
223
|
+
for filename, file_path in files_to_scan:
|
|
224
|
+
try:
|
|
225
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
|
226
|
+
content = f.read()
|
|
227
|
+
|
|
228
|
+
# Find @register_tool decorators (two patterns)
|
|
229
|
+
# Pattern 1: @register_tool("name") decorator syntax
|
|
230
|
+
decorator_pattern = r'@register_tool\([\'"]([^\'"]+)[\'"]\)'
|
|
231
|
+
decorator_matches = re.findall(decorator_pattern, content)
|
|
232
|
+
|
|
233
|
+
# Pattern 2: register_tool("name")(ClassName) function call
|
|
234
|
+
# syntax
|
|
235
|
+
function_pattern = r'register_tool\([\'"]([^\'"]+)[\'"]\)\([A-Za-z_][A-Za-z0-9_]*\)'
|
|
236
|
+
function_matches = re.findall(function_pattern, content)
|
|
237
|
+
|
|
238
|
+
# Combine all matches
|
|
239
|
+
all_matches = list(set(decorator_matches + function_matches))
|
|
240
|
+
|
|
241
|
+
for tool_name in all_matches:
|
|
242
|
+
# Try to extract description from class docstring or
|
|
243
|
+
# module docstring
|
|
244
|
+
description = f"{tool_name} tool"
|
|
245
|
+
|
|
246
|
+
# Method 1: Look for class definition after the
|
|
247
|
+
# decorator
|
|
248
|
+
class_pattern = rf'@register_tool\([\'"]({tool_name})[\'"]\)\s*class\s+\w+.*?"""(.*?)"""'
|
|
249
|
+
class_match = re.search(class_pattern, content, re.DOTALL)
|
|
250
|
+
if class_match:
|
|
251
|
+
doc = class_match.group(2).strip()
|
|
252
|
+
# Get first line of docstring
|
|
253
|
+
first_line = doc.split("\n")[0].strip()
|
|
254
|
+
if first_line and len(first_line) < 200:
|
|
255
|
+
description = first_line
|
|
256
|
+
|
|
257
|
+
# Method 2: For __init__.py files, try to extract from
|
|
258
|
+
# module docstring
|
|
259
|
+
if not class_match and filename == "__init__.py":
|
|
260
|
+
module_doc_pattern = r'^"""(.*?)"""'
|
|
261
|
+
module_doc_match = re.search(
|
|
262
|
+
module_doc_pattern,
|
|
263
|
+
content,
|
|
264
|
+
re.DOTALL | re.MULTILINE,
|
|
265
|
+
)
|
|
266
|
+
if module_doc_match:
|
|
267
|
+
doc = module_doc_match.group(1).strip()
|
|
268
|
+
# Get first non-empty line
|
|
269
|
+
for line in doc.split("\n"):
|
|
270
|
+
line = line.strip()
|
|
271
|
+
if line and not line.startswith("#") and len(line) < 200:
|
|
272
|
+
description = line
|
|
273
|
+
break
|
|
274
|
+
|
|
275
|
+
discovered_tools.append((tool_name, description, category))
|
|
276
|
+
except Exception as e:
|
|
277
|
+
logger.debug(f"Error scanning {filename}: {e}")
|
|
278
|
+
|
|
279
|
+
return discovered_tools
|
|
280
|
+
|
|
281
|
+
|
|
151
282
|
def _register_known_tools():
|
|
152
283
|
"""Register known tools without importing heavy dependencies"""
|
|
153
|
-
#
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
("classfire_tool", "Text classification and keyword extraction"),
|
|
159
|
-
("image_tool", "Image processing and OCR operations"),
|
|
160
|
-
("office_tool", "Office document processing"),
|
|
161
|
-
("pandas_tool", "Data analysis and manipulation"),
|
|
162
|
-
("report_tool", "Report generation and formatting"),
|
|
163
|
-
("research_tool", "Research and information gathering"),
|
|
164
|
-
("scraper_tool", "Web scraping and data extraction"),
|
|
165
|
-
("search_api", "Search API integration"),
|
|
166
|
-
("stats_tool", "Statistical analysis and computation")
|
|
167
|
-
]
|
|
168
|
-
|
|
284
|
+
# Automatically discover all tools
|
|
285
|
+
discovered_tools = _auto_discover_tools()
|
|
286
|
+
|
|
287
|
+
logger.info(f"Auto-discovered {len(discovered_tools)} tools")
|
|
288
|
+
|
|
169
289
|
# Register as placeholder until actually loaded
|
|
170
|
-
for
|
|
290
|
+
for tool_info in discovered_tools:
|
|
291
|
+
tool_name, description, category = tool_info
|
|
171
292
|
if tool_name not in TOOL_REGISTRY and tool_name not in TOOL_CLASSES:
|
|
172
293
|
# Create a placeholder class for discovery
|
|
173
294
|
class ToolPlaceholder:
|
|
174
|
-
def __init__(self, name, desc):
|
|
295
|
+
def __init__(self, name, desc, cat):
|
|
175
296
|
self.name = name
|
|
176
297
|
self.description = desc
|
|
177
|
-
self.category =
|
|
298
|
+
self.category = cat
|
|
178
299
|
self.is_placeholder = True
|
|
179
|
-
|
|
180
|
-
TOOL_REGISTRY[tool_name] = ToolPlaceholder(tool_name, description)
|
|
300
|
+
|
|
301
|
+
TOOL_REGISTRY[tool_name] = ToolPlaceholder(tool_name, description, category)
|
|
302
|
+
|
|
181
303
|
|
|
182
304
|
# Register known tools for discovery
|
|
183
305
|
_register_known_tools()
|
|
184
306
|
|
|
185
307
|
try:
|
|
186
|
-
|
|
308
|
+
pass
|
|
187
309
|
except ImportError:
|
|
188
310
|
pass
|
|
189
311
|
|
|
190
312
|
try:
|
|
191
|
-
|
|
313
|
+
pass
|
|
192
314
|
except ImportError:
|
|
193
315
|
pass
|
|
194
316
|
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""
|
|
2
|
+
APISource Tool - Unified API Data Source Interface
|
|
3
|
+
|
|
4
|
+
A comprehensive tool for querying external API data sources with advanced features:
|
|
5
|
+
- Multi-provider support (FRED, World Bank, News API, Census Bureau)
|
|
6
|
+
- Intelligent query understanding and parameter enhancement
|
|
7
|
+
- Cross-provider data fusion
|
|
8
|
+
- Automatic fallback and retry logic
|
|
9
|
+
- Advanced search with relevance ranking
|
|
10
|
+
- Comprehensive metrics and health monitoring
|
|
11
|
+
|
|
12
|
+
Usage:
|
|
13
|
+
from aiecs.tools.apisource import APISourceTool
|
|
14
|
+
|
|
15
|
+
tool = APISourceTool({
|
|
16
|
+
'fred_api_key': 'YOUR_KEY',
|
|
17
|
+
'enable_fallback': True,
|
|
18
|
+
'enable_query_enhancement': True
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
# Query with natural language
|
|
22
|
+
result = tool.query(
|
|
23
|
+
provider='fred',
|
|
24
|
+
operation='get_series_observations',
|
|
25
|
+
params={'series_id': 'GDP'},
|
|
26
|
+
query_text="Get GDP data for last 5 years"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
# Multi-provider search with fusion
|
|
30
|
+
results = tool.search(
|
|
31
|
+
query="unemployment trends",
|
|
32
|
+
enable_fusion=True
|
|
33
|
+
)
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
from aiecs.tools.apisource.tool import (
|
|
37
|
+
APISourceTool,
|
|
38
|
+
APISourceError,
|
|
39
|
+
ProviderNotFoundError,
|
|
40
|
+
APIRateLimitError,
|
|
41
|
+
APIAuthenticationError,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
# Import providers for convenience
|
|
45
|
+
from aiecs.tools.apisource.providers import (
|
|
46
|
+
BaseAPIProvider,
|
|
47
|
+
get_provider,
|
|
48
|
+
list_providers,
|
|
49
|
+
PROVIDER_REGISTRY,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# Import intelligence components
|
|
53
|
+
from aiecs.tools.apisource.intelligence import (
|
|
54
|
+
QueryIntentAnalyzer,
|
|
55
|
+
QueryEnhancer,
|
|
56
|
+
DataFusionEngine,
|
|
57
|
+
SearchEnhancer,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
# Import reliability components
|
|
61
|
+
from aiecs.tools.apisource.reliability import (
|
|
62
|
+
SmartErrorHandler,
|
|
63
|
+
FallbackStrategy,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
# Import monitoring components
|
|
67
|
+
from aiecs.tools.apisource.monitoring import DetailedMetrics
|
|
68
|
+
|
|
69
|
+
# Import utilities
|
|
70
|
+
from aiecs.tools.apisource.utils import DataValidator
|
|
71
|
+
|
|
72
|
+
__version__ = "2.0.0"
|
|
73
|
+
|
|
74
|
+
__all__ = [
|
|
75
|
+
# Main tool
|
|
76
|
+
"APISourceTool",
|
|
77
|
+
# Exceptions
|
|
78
|
+
"APISourceError",
|
|
79
|
+
"ProviderNotFoundError",
|
|
80
|
+
"APIRateLimitError",
|
|
81
|
+
"APIAuthenticationError",
|
|
82
|
+
# Providers
|
|
83
|
+
"BaseAPIProvider",
|
|
84
|
+
"get_provider",
|
|
85
|
+
"list_providers",
|
|
86
|
+
"PROVIDER_REGISTRY",
|
|
87
|
+
# Intelligence
|
|
88
|
+
"QueryIntentAnalyzer",
|
|
89
|
+
"QueryEnhancer",
|
|
90
|
+
"DataFusionEngine",
|
|
91
|
+
"SearchEnhancer",
|
|
92
|
+
# Reliability
|
|
93
|
+
"SmartErrorHandler",
|
|
94
|
+
"FallbackStrategy",
|
|
95
|
+
# Monitoring
|
|
96
|
+
"DetailedMetrics",
|
|
97
|
+
# Utils
|
|
98
|
+
"DataValidator",
|
|
99
|
+
]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Intelligence Module
|
|
3
|
+
|
|
4
|
+
Contains query analysis, data fusion, and search enhancement components.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from aiecs.tools.apisource.intelligence.query_analyzer import (
|
|
8
|
+
QueryIntentAnalyzer,
|
|
9
|
+
QueryEnhancer,
|
|
10
|
+
)
|
|
11
|
+
from aiecs.tools.apisource.intelligence.data_fusion import DataFusionEngine
|
|
12
|
+
from aiecs.tools.apisource.intelligence.search_enhancer import SearchEnhancer
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"QueryIntentAnalyzer",
|
|
16
|
+
"QueryEnhancer",
|
|
17
|
+
"DataFusionEngine",
|
|
18
|
+
"SearchEnhancer",
|
|
19
|
+
]
|