aiecs 1.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aiecs/__init__.py +72 -0
- aiecs/__main__.py +41 -0
- aiecs/aiecs_client.py +469 -0
- aiecs/application/__init__.py +10 -0
- aiecs/application/executors/__init__.py +10 -0
- aiecs/application/executors/operation_executor.py +363 -0
- aiecs/application/knowledge_graph/__init__.py +7 -0
- aiecs/application/knowledge_graph/builder/__init__.py +37 -0
- aiecs/application/knowledge_graph/builder/document_builder.py +375 -0
- aiecs/application/knowledge_graph/builder/graph_builder.py +356 -0
- aiecs/application/knowledge_graph/builder/schema_mapping.py +531 -0
- aiecs/application/knowledge_graph/builder/structured_pipeline.py +443 -0
- aiecs/application/knowledge_graph/builder/text_chunker.py +319 -0
- aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
- aiecs/application/knowledge_graph/extractors/base.py +100 -0
- aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +327 -0
- aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +349 -0
- aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +244 -0
- aiecs/application/knowledge_graph/fusion/__init__.py +23 -0
- aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +387 -0
- aiecs/application/knowledge_graph/fusion/entity_linker.py +343 -0
- aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +580 -0
- aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +189 -0
- aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
- aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +344 -0
- aiecs/application/knowledge_graph/pattern_matching/query_executor.py +378 -0
- aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
- aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +199 -0
- aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
- aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
- aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +347 -0
- aiecs/application/knowledge_graph/reasoning/inference_engine.py +504 -0
- aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +167 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +630 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +654 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +477 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +390 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +217 -0
- aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +169 -0
- aiecs/application/knowledge_graph/reasoning/query_planner.py +872 -0
- aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +554 -0
- aiecs/application/knowledge_graph/retrieval/__init__.py +19 -0
- aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +596 -0
- aiecs/application/knowledge_graph/search/__init__.py +59 -0
- aiecs/application/knowledge_graph/search/hybrid_search.py +423 -0
- aiecs/application/knowledge_graph/search/reranker.py +295 -0
- aiecs/application/knowledge_graph/search/reranker_strategies.py +553 -0
- aiecs/application/knowledge_graph/search/text_similarity.py +398 -0
- aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
- aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +329 -0
- aiecs/application/knowledge_graph/traversal/path_scorer.py +269 -0
- aiecs/application/knowledge_graph/validators/__init__.py +13 -0
- aiecs/application/knowledge_graph/validators/relation_validator.py +189 -0
- aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
- aiecs/application/knowledge_graph/visualization/graph_visualizer.py +321 -0
- aiecs/common/__init__.py +9 -0
- aiecs/common/knowledge_graph/__init__.py +17 -0
- aiecs/common/knowledge_graph/runnable.py +484 -0
- aiecs/config/__init__.py +16 -0
- aiecs/config/config.py +498 -0
- aiecs/config/graph_config.py +137 -0
- aiecs/config/registry.py +23 -0
- aiecs/core/__init__.py +46 -0
- aiecs/core/interface/__init__.py +34 -0
- aiecs/core/interface/execution_interface.py +152 -0
- aiecs/core/interface/storage_interface.py +171 -0
- aiecs/domain/__init__.py +289 -0
- aiecs/domain/agent/__init__.py +189 -0
- aiecs/domain/agent/base_agent.py +697 -0
- aiecs/domain/agent/exceptions.py +103 -0
- aiecs/domain/agent/graph_aware_mixin.py +559 -0
- aiecs/domain/agent/hybrid_agent.py +490 -0
- aiecs/domain/agent/integration/__init__.py +26 -0
- aiecs/domain/agent/integration/context_compressor.py +222 -0
- aiecs/domain/agent/integration/context_engine_adapter.py +252 -0
- aiecs/domain/agent/integration/retry_policy.py +219 -0
- aiecs/domain/agent/integration/role_config.py +213 -0
- aiecs/domain/agent/knowledge_aware_agent.py +646 -0
- aiecs/domain/agent/lifecycle.py +296 -0
- aiecs/domain/agent/llm_agent.py +300 -0
- aiecs/domain/agent/memory/__init__.py +12 -0
- aiecs/domain/agent/memory/conversation.py +197 -0
- aiecs/domain/agent/migration/__init__.py +14 -0
- aiecs/domain/agent/migration/conversion.py +160 -0
- aiecs/domain/agent/migration/legacy_wrapper.py +90 -0
- aiecs/domain/agent/models.py +317 -0
- aiecs/domain/agent/observability.py +407 -0
- aiecs/domain/agent/persistence.py +289 -0
- aiecs/domain/agent/prompts/__init__.py +29 -0
- aiecs/domain/agent/prompts/builder.py +161 -0
- aiecs/domain/agent/prompts/formatters.py +189 -0
- aiecs/domain/agent/prompts/template.py +255 -0
- aiecs/domain/agent/registry.py +260 -0
- aiecs/domain/agent/tool_agent.py +257 -0
- aiecs/domain/agent/tools/__init__.py +12 -0
- aiecs/domain/agent/tools/schema_generator.py +221 -0
- aiecs/domain/community/__init__.py +155 -0
- aiecs/domain/community/agent_adapter.py +477 -0
- aiecs/domain/community/analytics.py +481 -0
- aiecs/domain/community/collaborative_workflow.py +642 -0
- aiecs/domain/community/communication_hub.py +645 -0
- aiecs/domain/community/community_builder.py +320 -0
- aiecs/domain/community/community_integration.py +800 -0
- aiecs/domain/community/community_manager.py +813 -0
- aiecs/domain/community/decision_engine.py +879 -0
- aiecs/domain/community/exceptions.py +225 -0
- aiecs/domain/community/models/__init__.py +33 -0
- aiecs/domain/community/models/community_models.py +268 -0
- aiecs/domain/community/resource_manager.py +457 -0
- aiecs/domain/community/shared_context_manager.py +603 -0
- aiecs/domain/context/__init__.py +58 -0
- aiecs/domain/context/context_engine.py +989 -0
- aiecs/domain/context/conversation_models.py +354 -0
- aiecs/domain/context/graph_memory.py +467 -0
- aiecs/domain/execution/__init__.py +12 -0
- aiecs/domain/execution/model.py +57 -0
- aiecs/domain/knowledge_graph/__init__.py +19 -0
- aiecs/domain/knowledge_graph/models/__init__.py +52 -0
- aiecs/domain/knowledge_graph/models/entity.py +130 -0
- aiecs/domain/knowledge_graph/models/evidence.py +194 -0
- aiecs/domain/knowledge_graph/models/inference_rule.py +186 -0
- aiecs/domain/knowledge_graph/models/path.py +179 -0
- aiecs/domain/knowledge_graph/models/path_pattern.py +173 -0
- aiecs/domain/knowledge_graph/models/query.py +272 -0
- aiecs/domain/knowledge_graph/models/query_plan.py +187 -0
- aiecs/domain/knowledge_graph/models/relation.py +136 -0
- aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
- aiecs/domain/knowledge_graph/schema/entity_type.py +135 -0
- aiecs/domain/knowledge_graph/schema/graph_schema.py +271 -0
- aiecs/domain/knowledge_graph/schema/property_schema.py +155 -0
- aiecs/domain/knowledge_graph/schema/relation_type.py +171 -0
- aiecs/domain/knowledge_graph/schema/schema_manager.py +496 -0
- aiecs/domain/knowledge_graph/schema/type_enums.py +205 -0
- aiecs/domain/task/__init__.py +13 -0
- aiecs/domain/task/dsl_processor.py +613 -0
- aiecs/domain/task/model.py +62 -0
- aiecs/domain/task/task_context.py +268 -0
- aiecs/infrastructure/__init__.py +24 -0
- aiecs/infrastructure/graph_storage/__init__.py +11 -0
- aiecs/infrastructure/graph_storage/base.py +601 -0
- aiecs/infrastructure/graph_storage/batch_operations.py +449 -0
- aiecs/infrastructure/graph_storage/cache.py +429 -0
- aiecs/infrastructure/graph_storage/distributed.py +226 -0
- aiecs/infrastructure/graph_storage/error_handling.py +390 -0
- aiecs/infrastructure/graph_storage/graceful_degradation.py +306 -0
- aiecs/infrastructure/graph_storage/health_checks.py +378 -0
- aiecs/infrastructure/graph_storage/in_memory.py +514 -0
- aiecs/infrastructure/graph_storage/index_optimization.py +483 -0
- aiecs/infrastructure/graph_storage/lazy_loading.py +410 -0
- aiecs/infrastructure/graph_storage/metrics.py +357 -0
- aiecs/infrastructure/graph_storage/migration.py +413 -0
- aiecs/infrastructure/graph_storage/pagination.py +471 -0
- aiecs/infrastructure/graph_storage/performance_monitoring.py +466 -0
- aiecs/infrastructure/graph_storage/postgres.py +871 -0
- aiecs/infrastructure/graph_storage/query_optimizer.py +635 -0
- aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
- aiecs/infrastructure/graph_storage/sqlite.py +623 -0
- aiecs/infrastructure/graph_storage/streaming.py +495 -0
- aiecs/infrastructure/messaging/__init__.py +13 -0
- aiecs/infrastructure/messaging/celery_task_manager.py +383 -0
- aiecs/infrastructure/messaging/websocket_manager.py +298 -0
- aiecs/infrastructure/monitoring/__init__.py +34 -0
- aiecs/infrastructure/monitoring/executor_metrics.py +174 -0
- aiecs/infrastructure/monitoring/global_metrics_manager.py +213 -0
- aiecs/infrastructure/monitoring/structured_logger.py +48 -0
- aiecs/infrastructure/monitoring/tracing_manager.py +410 -0
- aiecs/infrastructure/persistence/__init__.py +24 -0
- aiecs/infrastructure/persistence/context_engine_client.py +187 -0
- aiecs/infrastructure/persistence/database_manager.py +333 -0
- aiecs/infrastructure/persistence/file_storage.py +754 -0
- aiecs/infrastructure/persistence/redis_client.py +220 -0
- aiecs/llm/__init__.py +86 -0
- aiecs/llm/callbacks/__init__.py +11 -0
- aiecs/llm/callbacks/custom_callbacks.py +264 -0
- aiecs/llm/client_factory.py +420 -0
- aiecs/llm/clients/__init__.py +33 -0
- aiecs/llm/clients/base_client.py +193 -0
- aiecs/llm/clients/googleai_client.py +181 -0
- aiecs/llm/clients/openai_client.py +131 -0
- aiecs/llm/clients/vertex_client.py +437 -0
- aiecs/llm/clients/xai_client.py +184 -0
- aiecs/llm/config/__init__.py +51 -0
- aiecs/llm/config/config_loader.py +275 -0
- aiecs/llm/config/config_validator.py +236 -0
- aiecs/llm/config/model_config.py +151 -0
- aiecs/llm/utils/__init__.py +10 -0
- aiecs/llm/utils/validate_config.py +91 -0
- aiecs/main.py +363 -0
- aiecs/scripts/__init__.py +3 -0
- aiecs/scripts/aid/VERSION_MANAGEMENT.md +97 -0
- aiecs/scripts/aid/__init__.py +19 -0
- aiecs/scripts/aid/version_manager.py +215 -0
- aiecs/scripts/dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md +242 -0
- aiecs/scripts/dependance_check/README_DEPENDENCY_CHECKER.md +310 -0
- aiecs/scripts/dependance_check/__init__.py +17 -0
- aiecs/scripts/dependance_check/dependency_checker.py +938 -0
- aiecs/scripts/dependance_check/dependency_fixer.py +391 -0
- aiecs/scripts/dependance_check/download_nlp_data.py +396 -0
- aiecs/scripts/dependance_check/quick_dependency_check.py +270 -0
- aiecs/scripts/dependance_check/setup_nlp_data.sh +217 -0
- aiecs/scripts/dependance_patch/__init__.py +7 -0
- aiecs/scripts/dependance_patch/fix_weasel/README_WEASEL_PATCH.md +126 -0
- aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
- aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.py +128 -0
- aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.sh +82 -0
- aiecs/scripts/dependance_patch/fix_weasel/patch_weasel_library.sh +188 -0
- aiecs/scripts/dependance_patch/fix_weasel/run_weasel_patch.sh +41 -0
- aiecs/scripts/tools_develop/README.md +449 -0
- aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
- aiecs/scripts/tools_develop/__init__.py +21 -0
- aiecs/scripts/tools_develop/check_type_annotations.py +259 -0
- aiecs/scripts/tools_develop/validate_tool_schemas.py +422 -0
- aiecs/scripts/tools_develop/verify_tools.py +356 -0
- aiecs/tasks/__init__.py +1 -0
- aiecs/tasks/worker.py +172 -0
- aiecs/tools/__init__.py +299 -0
- aiecs/tools/apisource/__init__.py +99 -0
- aiecs/tools/apisource/intelligence/__init__.py +19 -0
- aiecs/tools/apisource/intelligence/data_fusion.py +381 -0
- aiecs/tools/apisource/intelligence/query_analyzer.py +413 -0
- aiecs/tools/apisource/intelligence/search_enhancer.py +388 -0
- aiecs/tools/apisource/monitoring/__init__.py +9 -0
- aiecs/tools/apisource/monitoring/metrics.py +303 -0
- aiecs/tools/apisource/providers/__init__.py +115 -0
- aiecs/tools/apisource/providers/base.py +664 -0
- aiecs/tools/apisource/providers/census.py +401 -0
- aiecs/tools/apisource/providers/fred.py +564 -0
- aiecs/tools/apisource/providers/newsapi.py +412 -0
- aiecs/tools/apisource/providers/worldbank.py +357 -0
- aiecs/tools/apisource/reliability/__init__.py +12 -0
- aiecs/tools/apisource/reliability/error_handler.py +375 -0
- aiecs/tools/apisource/reliability/fallback_strategy.py +391 -0
- aiecs/tools/apisource/tool.py +850 -0
- aiecs/tools/apisource/utils/__init__.py +9 -0
- aiecs/tools/apisource/utils/validators.py +338 -0
- aiecs/tools/base_tool.py +201 -0
- aiecs/tools/docs/__init__.py +121 -0
- aiecs/tools/docs/ai_document_orchestrator.py +599 -0
- aiecs/tools/docs/ai_document_writer_orchestrator.py +2403 -0
- aiecs/tools/docs/content_insertion_tool.py +1333 -0
- aiecs/tools/docs/document_creator_tool.py +1317 -0
- aiecs/tools/docs/document_layout_tool.py +1166 -0
- aiecs/tools/docs/document_parser_tool.py +994 -0
- aiecs/tools/docs/document_writer_tool.py +1818 -0
- aiecs/tools/knowledge_graph/__init__.py +17 -0
- aiecs/tools/knowledge_graph/graph_reasoning_tool.py +734 -0
- aiecs/tools/knowledge_graph/graph_search_tool.py +923 -0
- aiecs/tools/knowledge_graph/kg_builder_tool.py +476 -0
- aiecs/tools/langchain_adapter.py +542 -0
- aiecs/tools/schema_generator.py +275 -0
- aiecs/tools/search_tool/__init__.py +100 -0
- aiecs/tools/search_tool/analyzers.py +589 -0
- aiecs/tools/search_tool/cache.py +260 -0
- aiecs/tools/search_tool/constants.py +128 -0
- aiecs/tools/search_tool/context.py +216 -0
- aiecs/tools/search_tool/core.py +749 -0
- aiecs/tools/search_tool/deduplicator.py +123 -0
- aiecs/tools/search_tool/error_handler.py +271 -0
- aiecs/tools/search_tool/metrics.py +371 -0
- aiecs/tools/search_tool/rate_limiter.py +178 -0
- aiecs/tools/search_tool/schemas.py +277 -0
- aiecs/tools/statistics/__init__.py +80 -0
- aiecs/tools/statistics/ai_data_analysis_orchestrator.py +643 -0
- aiecs/tools/statistics/ai_insight_generator_tool.py +505 -0
- aiecs/tools/statistics/ai_report_orchestrator_tool.py +694 -0
- aiecs/tools/statistics/data_loader_tool.py +564 -0
- aiecs/tools/statistics/data_profiler_tool.py +658 -0
- aiecs/tools/statistics/data_transformer_tool.py +573 -0
- aiecs/tools/statistics/data_visualizer_tool.py +495 -0
- aiecs/tools/statistics/model_trainer_tool.py +487 -0
- aiecs/tools/statistics/statistical_analyzer_tool.py +459 -0
- aiecs/tools/task_tools/__init__.py +86 -0
- aiecs/tools/task_tools/chart_tool.py +732 -0
- aiecs/tools/task_tools/classfire_tool.py +922 -0
- aiecs/tools/task_tools/image_tool.py +447 -0
- aiecs/tools/task_tools/office_tool.py +684 -0
- aiecs/tools/task_tools/pandas_tool.py +635 -0
- aiecs/tools/task_tools/report_tool.py +635 -0
- aiecs/tools/task_tools/research_tool.py +392 -0
- aiecs/tools/task_tools/scraper_tool.py +715 -0
- aiecs/tools/task_tools/stats_tool.py +688 -0
- aiecs/tools/temp_file_manager.py +130 -0
- aiecs/tools/tool_executor/__init__.py +37 -0
- aiecs/tools/tool_executor/tool_executor.py +881 -0
- aiecs/utils/LLM_output_structor.py +445 -0
- aiecs/utils/__init__.py +34 -0
- aiecs/utils/base_callback.py +47 -0
- aiecs/utils/cache_provider.py +695 -0
- aiecs/utils/execution_utils.py +184 -0
- aiecs/utils/logging.py +1 -0
- aiecs/utils/prompt_loader.py +14 -0
- aiecs/utils/token_usage_repository.py +323 -0
- aiecs/ws/__init__.py +0 -0
- aiecs/ws/socket_server.py +52 -0
- aiecs-1.5.1.dist-info/METADATA +608 -0
- aiecs-1.5.1.dist-info/RECORD +302 -0
- aiecs-1.5.1.dist-info/WHEEL +5 -0
- aiecs-1.5.1.dist-info/entry_points.txt +10 -0
- aiecs-1.5.1.dist-info/licenses/LICENSE +225 -0
- aiecs-1.5.1.dist-info/top_level.txt +1 -0
aiecs/tools/__init__.py
ADDED
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
# python-middleware/app/tools/__init__.py
|
|
2
|
+
|
|
3
|
+
import importlib
|
|
4
|
+
import logging
|
|
5
|
+
import os
|
|
6
|
+
import pkgutil
|
|
7
|
+
|
|
8
|
+
from aiecs.tools.base_tool import BaseTool
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
# Global tool registry
|
|
13
|
+
TOOL_REGISTRY = {}
|
|
14
|
+
TOOL_CLASSES = {}
|
|
15
|
+
TOOL_CONFIGS = {}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def register_tool(name):
|
|
19
|
+
"""
|
|
20
|
+
Decorator for registering tool classes
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
name: Tool name
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
Decorated class
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def wrapper(cls):
|
|
30
|
+
# Store tool class but don't instantiate immediately
|
|
31
|
+
TOOL_CLASSES[name] = cls
|
|
32
|
+
# Backward compatibility: if class inherits from BaseTool, don't
|
|
33
|
+
# instantiate immediately
|
|
34
|
+
if not issubclass(cls, BaseTool):
|
|
35
|
+
TOOL_REGISTRY[name] = cls()
|
|
36
|
+
return cls
|
|
37
|
+
|
|
38
|
+
return wrapper
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def get_tool(name):
|
|
42
|
+
"""
|
|
43
|
+
Get tool instance
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
name: Tool name
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
Tool instance
|
|
50
|
+
|
|
51
|
+
Raises:
|
|
52
|
+
ValueError: If tool is not registered
|
|
53
|
+
"""
|
|
54
|
+
# Check if placeholder needs to be replaced or lazy instantiation is needed
|
|
55
|
+
if name in TOOL_CLASSES:
|
|
56
|
+
# If TOOL_REGISTRY contains placeholder or doesn't exist, instantiate
|
|
57
|
+
# real tool class
|
|
58
|
+
current_tool = TOOL_REGISTRY.get(name)
|
|
59
|
+
is_placeholder = getattr(current_tool, "is_placeholder", False)
|
|
60
|
+
|
|
61
|
+
if current_tool is None or is_placeholder:
|
|
62
|
+
# Lazy instantiation of BaseTool subclasses, replace placeholder
|
|
63
|
+
tool_class = TOOL_CLASSES[name]
|
|
64
|
+
config = TOOL_CONFIGS.get(name, {})
|
|
65
|
+
TOOL_REGISTRY[name] = tool_class(config)
|
|
66
|
+
logger.debug(f"Instantiated tool '{name}' from class {tool_class.__name__}")
|
|
67
|
+
|
|
68
|
+
if name not in TOOL_REGISTRY:
|
|
69
|
+
raise ValueError(f"Tool '{name}' is not registered")
|
|
70
|
+
|
|
71
|
+
return TOOL_REGISTRY[name]
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def list_tools():
|
|
75
|
+
"""
|
|
76
|
+
List all registered tools
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
List of tool information dictionaries
|
|
80
|
+
"""
|
|
81
|
+
tools = []
|
|
82
|
+
all_tool_names = list(set(list(TOOL_REGISTRY.keys()) + list(TOOL_CLASSES.keys())))
|
|
83
|
+
|
|
84
|
+
for tool_name in all_tool_names:
|
|
85
|
+
try:
|
|
86
|
+
# Prefer using information from existing instances
|
|
87
|
+
if tool_name in TOOL_REGISTRY:
|
|
88
|
+
tool_instance = TOOL_REGISTRY[tool_name]
|
|
89
|
+
tool_info = {
|
|
90
|
+
"name": tool_name,
|
|
91
|
+
"description": getattr(tool_instance, "description", f"{tool_name} tool"),
|
|
92
|
+
"category": getattr(tool_instance, "category", "general"),
|
|
93
|
+
"class_name": tool_instance.__class__.__name__,
|
|
94
|
+
"module": tool_instance.__class__.__module__,
|
|
95
|
+
"status": "loaded",
|
|
96
|
+
}
|
|
97
|
+
elif tool_name in TOOL_CLASSES:
|
|
98
|
+
# Get information from class definition but don't instantiate
|
|
99
|
+
tool_class = TOOL_CLASSES[tool_name]
|
|
100
|
+
tool_info = {
|
|
101
|
+
"name": tool_name,
|
|
102
|
+
"description": getattr(tool_class, "description", f"{tool_name} tool"),
|
|
103
|
+
"category": getattr(tool_class, "category", "general"),
|
|
104
|
+
"class_name": tool_class.__name__,
|
|
105
|
+
"module": tool_class.__module__,
|
|
106
|
+
"status": "available",
|
|
107
|
+
}
|
|
108
|
+
else:
|
|
109
|
+
continue
|
|
110
|
+
|
|
111
|
+
tools.append(tool_info)
|
|
112
|
+
|
|
113
|
+
except Exception as e:
|
|
114
|
+
logger.warning(f"Failed to get info for tool {tool_name}: {e}")
|
|
115
|
+
# Provide basic information
|
|
116
|
+
tools.append(
|
|
117
|
+
{
|
|
118
|
+
"name": tool_name,
|
|
119
|
+
"description": f"{tool_name} (info unavailable)",
|
|
120
|
+
"category": "unknown",
|
|
121
|
+
"class_name": "Unknown",
|
|
122
|
+
"module": "unknown",
|
|
123
|
+
"status": "error",
|
|
124
|
+
}
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
return tools
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def discover_tools(package_path: str = "aiecs.tools"):
|
|
131
|
+
"""
|
|
132
|
+
Discover and register all tools in the package
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
package_path: Package path to search
|
|
136
|
+
"""
|
|
137
|
+
package = importlib.import_module(package_path)
|
|
138
|
+
package_dir = os.path.dirname(package.__file__)
|
|
139
|
+
|
|
140
|
+
for _, module_name, is_pkg in pkgutil.iter_modules([package_dir]):
|
|
141
|
+
if is_pkg:
|
|
142
|
+
# Recursively search for tools in subpackages
|
|
143
|
+
discover_tools(f"{package_path}.{module_name}")
|
|
144
|
+
else:
|
|
145
|
+
# Import module
|
|
146
|
+
try:
|
|
147
|
+
importlib.import_module(f"{package_path}.{module_name}")
|
|
148
|
+
except Exception as e:
|
|
149
|
+
logger.error(f"Error importing module {module_name}: {e}")
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
# Lazy loading strategy: don't import all tools at package init
|
|
153
|
+
# Tools will be loaded on-demand when requested
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def _ensure_task_tools_available():
|
|
157
|
+
"""Ensure task_tools module is available for lazy loading"""
|
|
158
|
+
try:
|
|
159
|
+
return True
|
|
160
|
+
except ImportError as e:
|
|
161
|
+
logger.error(f"Failed to import task_tools: {e}")
|
|
162
|
+
return False
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _auto_discover_tools():
|
|
166
|
+
"""Automatically discover all tools by scanning tool directories"""
|
|
167
|
+
import re
|
|
168
|
+
|
|
169
|
+
# Define tool directories and their categories
|
|
170
|
+
tool_dirs = [
|
|
171
|
+
("task_tools", "task"),
|
|
172
|
+
("docs", "docs"),
|
|
173
|
+
("statistics", "statistics"),
|
|
174
|
+
("search_tool", "task"), # Enhanced search tool
|
|
175
|
+
("api_sources", "task"), # API data sources (legacy)
|
|
176
|
+
("apisource", "task"), # API Source Tool (new modular version)
|
|
177
|
+
]
|
|
178
|
+
|
|
179
|
+
discovered_tools = []
|
|
180
|
+
|
|
181
|
+
for dir_name, category in tool_dirs:
|
|
182
|
+
dir_path = os.path.join(os.path.dirname(__file__), dir_name)
|
|
183
|
+
if not os.path.exists(dir_path):
|
|
184
|
+
continue
|
|
185
|
+
|
|
186
|
+
# Check if this is a package (has __init__.py) or a directory of
|
|
187
|
+
# modules
|
|
188
|
+
init_file = os.path.join(dir_path, "__init__.py")
|
|
189
|
+
files_to_scan = []
|
|
190
|
+
|
|
191
|
+
if os.path.isfile(init_file):
|
|
192
|
+
# Scan __init__.py for package-level registrations
|
|
193
|
+
files_to_scan.append(("__init__.py", init_file))
|
|
194
|
+
|
|
195
|
+
# Scan all other Python files in the directory
|
|
196
|
+
for filename in os.listdir(dir_path):
|
|
197
|
+
if filename.endswith(".py") and not filename.startswith("__"):
|
|
198
|
+
file_path = os.path.join(dir_path, filename)
|
|
199
|
+
files_to_scan.append((filename, file_path))
|
|
200
|
+
|
|
201
|
+
# Process all files
|
|
202
|
+
for filename, file_path in files_to_scan:
|
|
203
|
+
try:
|
|
204
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
|
205
|
+
content = f.read()
|
|
206
|
+
|
|
207
|
+
# Find @register_tool decorators (two patterns)
|
|
208
|
+
# Pattern 1: @register_tool("name") decorator syntax
|
|
209
|
+
decorator_pattern = r'@register_tool\([\'"]([^\'"]+)[\'"]\)'
|
|
210
|
+
decorator_matches = re.findall(decorator_pattern, content)
|
|
211
|
+
|
|
212
|
+
# Pattern 2: register_tool("name")(ClassName) function call
|
|
213
|
+
# syntax
|
|
214
|
+
function_pattern = (
|
|
215
|
+
r'register_tool\([\'"]([^\'"]+)[\'"]\)\([A-Za-z_][A-Za-z0-9_]*\)'
|
|
216
|
+
)
|
|
217
|
+
function_matches = re.findall(function_pattern, content)
|
|
218
|
+
|
|
219
|
+
# Combine all matches
|
|
220
|
+
all_matches = list(set(decorator_matches + function_matches))
|
|
221
|
+
|
|
222
|
+
for tool_name in all_matches:
|
|
223
|
+
# Try to extract description from class docstring or
|
|
224
|
+
# module docstring
|
|
225
|
+
description = f"{tool_name} tool"
|
|
226
|
+
|
|
227
|
+
# Method 1: Look for class definition after the
|
|
228
|
+
# decorator
|
|
229
|
+
class_pattern = rf'@register_tool\([\'"]({tool_name})[\'"]\)\s*class\s+\w+.*?"""(.*?)"""'
|
|
230
|
+
class_match = re.search(class_pattern, content, re.DOTALL)
|
|
231
|
+
if class_match:
|
|
232
|
+
doc = class_match.group(2).strip()
|
|
233
|
+
# Get first line of docstring
|
|
234
|
+
first_line = doc.split("\n")[0].strip()
|
|
235
|
+
if first_line and len(first_line) < 200:
|
|
236
|
+
description = first_line
|
|
237
|
+
|
|
238
|
+
# Method 2: For __init__.py files, try to extract from
|
|
239
|
+
# module docstring
|
|
240
|
+
if not class_match and filename == "__init__.py":
|
|
241
|
+
module_doc_pattern = r'^"""(.*?)"""'
|
|
242
|
+
module_doc_match = re.search(
|
|
243
|
+
module_doc_pattern,
|
|
244
|
+
content,
|
|
245
|
+
re.DOTALL | re.MULTILINE,
|
|
246
|
+
)
|
|
247
|
+
if module_doc_match:
|
|
248
|
+
doc = module_doc_match.group(1).strip()
|
|
249
|
+
# Get first non-empty line
|
|
250
|
+
for line in doc.split("\n"):
|
|
251
|
+
line = line.strip()
|
|
252
|
+
if line and not line.startswith("#") and len(line) < 200:
|
|
253
|
+
description = line
|
|
254
|
+
break
|
|
255
|
+
|
|
256
|
+
discovered_tools.append((tool_name, description, category))
|
|
257
|
+
except Exception as e:
|
|
258
|
+
logger.debug(f"Error scanning {filename}: {e}")
|
|
259
|
+
|
|
260
|
+
return discovered_tools
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def _register_known_tools():
|
|
264
|
+
"""Register known tools without importing heavy dependencies"""
|
|
265
|
+
# Automatically discover all tools
|
|
266
|
+
discovered_tools = _auto_discover_tools()
|
|
267
|
+
|
|
268
|
+
logger.info(f"Auto-discovered {len(discovered_tools)} tools")
|
|
269
|
+
|
|
270
|
+
# Register as placeholder until actually loaded
|
|
271
|
+
for tool_info in discovered_tools:
|
|
272
|
+
tool_name, description, category = tool_info
|
|
273
|
+
if tool_name not in TOOL_REGISTRY and tool_name not in TOOL_CLASSES:
|
|
274
|
+
# Create a placeholder class for discovery
|
|
275
|
+
class ToolPlaceholder:
|
|
276
|
+
def __init__(self, name, desc, cat):
|
|
277
|
+
self.name = name
|
|
278
|
+
self.description = desc
|
|
279
|
+
self.category = cat
|
|
280
|
+
self.is_placeholder = True
|
|
281
|
+
|
|
282
|
+
TOOL_REGISTRY[tool_name] = ToolPlaceholder(tool_name, description, category)
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
# Register known tools for discovery
|
|
286
|
+
_register_known_tools()
|
|
287
|
+
|
|
288
|
+
try:
|
|
289
|
+
pass
|
|
290
|
+
except ImportError:
|
|
291
|
+
pass
|
|
292
|
+
|
|
293
|
+
try:
|
|
294
|
+
pass
|
|
295
|
+
except ImportError:
|
|
296
|
+
pass
|
|
297
|
+
|
|
298
|
+
# Don't auto-discover tools at import time for performance
|
|
299
|
+
# Tools will be discovered when explicitly requested via discover_tools() call
|
|
@@ -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
|
+
]
|