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.
Files changed (302) hide show
  1. aiecs/__init__.py +72 -0
  2. aiecs/__main__.py +41 -0
  3. aiecs/aiecs_client.py +469 -0
  4. aiecs/application/__init__.py +10 -0
  5. aiecs/application/executors/__init__.py +10 -0
  6. aiecs/application/executors/operation_executor.py +363 -0
  7. aiecs/application/knowledge_graph/__init__.py +7 -0
  8. aiecs/application/knowledge_graph/builder/__init__.py +37 -0
  9. aiecs/application/knowledge_graph/builder/document_builder.py +375 -0
  10. aiecs/application/knowledge_graph/builder/graph_builder.py +356 -0
  11. aiecs/application/knowledge_graph/builder/schema_mapping.py +531 -0
  12. aiecs/application/knowledge_graph/builder/structured_pipeline.py +443 -0
  13. aiecs/application/knowledge_graph/builder/text_chunker.py +319 -0
  14. aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
  15. aiecs/application/knowledge_graph/extractors/base.py +100 -0
  16. aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +327 -0
  17. aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +349 -0
  18. aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +244 -0
  19. aiecs/application/knowledge_graph/fusion/__init__.py +23 -0
  20. aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +387 -0
  21. aiecs/application/knowledge_graph/fusion/entity_linker.py +343 -0
  22. aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +580 -0
  23. aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +189 -0
  24. aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
  25. aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +344 -0
  26. aiecs/application/knowledge_graph/pattern_matching/query_executor.py +378 -0
  27. aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
  28. aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +199 -0
  29. aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
  30. aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
  31. aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +347 -0
  32. aiecs/application/knowledge_graph/reasoning/inference_engine.py +504 -0
  33. aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +167 -0
  34. aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
  35. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
  36. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +630 -0
  37. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +654 -0
  38. aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +477 -0
  39. aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +390 -0
  40. aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +217 -0
  41. aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +169 -0
  42. aiecs/application/knowledge_graph/reasoning/query_planner.py +872 -0
  43. aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +554 -0
  44. aiecs/application/knowledge_graph/retrieval/__init__.py +19 -0
  45. aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +596 -0
  46. aiecs/application/knowledge_graph/search/__init__.py +59 -0
  47. aiecs/application/knowledge_graph/search/hybrid_search.py +423 -0
  48. aiecs/application/knowledge_graph/search/reranker.py +295 -0
  49. aiecs/application/knowledge_graph/search/reranker_strategies.py +553 -0
  50. aiecs/application/knowledge_graph/search/text_similarity.py +398 -0
  51. aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
  52. aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +329 -0
  53. aiecs/application/knowledge_graph/traversal/path_scorer.py +269 -0
  54. aiecs/application/knowledge_graph/validators/__init__.py +13 -0
  55. aiecs/application/knowledge_graph/validators/relation_validator.py +189 -0
  56. aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
  57. aiecs/application/knowledge_graph/visualization/graph_visualizer.py +321 -0
  58. aiecs/common/__init__.py +9 -0
  59. aiecs/common/knowledge_graph/__init__.py +17 -0
  60. aiecs/common/knowledge_graph/runnable.py +484 -0
  61. aiecs/config/__init__.py +16 -0
  62. aiecs/config/config.py +498 -0
  63. aiecs/config/graph_config.py +137 -0
  64. aiecs/config/registry.py +23 -0
  65. aiecs/core/__init__.py +46 -0
  66. aiecs/core/interface/__init__.py +34 -0
  67. aiecs/core/interface/execution_interface.py +152 -0
  68. aiecs/core/interface/storage_interface.py +171 -0
  69. aiecs/domain/__init__.py +289 -0
  70. aiecs/domain/agent/__init__.py +189 -0
  71. aiecs/domain/agent/base_agent.py +697 -0
  72. aiecs/domain/agent/exceptions.py +103 -0
  73. aiecs/domain/agent/graph_aware_mixin.py +559 -0
  74. aiecs/domain/agent/hybrid_agent.py +490 -0
  75. aiecs/domain/agent/integration/__init__.py +26 -0
  76. aiecs/domain/agent/integration/context_compressor.py +222 -0
  77. aiecs/domain/agent/integration/context_engine_adapter.py +252 -0
  78. aiecs/domain/agent/integration/retry_policy.py +219 -0
  79. aiecs/domain/agent/integration/role_config.py +213 -0
  80. aiecs/domain/agent/knowledge_aware_agent.py +646 -0
  81. aiecs/domain/agent/lifecycle.py +296 -0
  82. aiecs/domain/agent/llm_agent.py +300 -0
  83. aiecs/domain/agent/memory/__init__.py +12 -0
  84. aiecs/domain/agent/memory/conversation.py +197 -0
  85. aiecs/domain/agent/migration/__init__.py +14 -0
  86. aiecs/domain/agent/migration/conversion.py +160 -0
  87. aiecs/domain/agent/migration/legacy_wrapper.py +90 -0
  88. aiecs/domain/agent/models.py +317 -0
  89. aiecs/domain/agent/observability.py +407 -0
  90. aiecs/domain/agent/persistence.py +289 -0
  91. aiecs/domain/agent/prompts/__init__.py +29 -0
  92. aiecs/domain/agent/prompts/builder.py +161 -0
  93. aiecs/domain/agent/prompts/formatters.py +189 -0
  94. aiecs/domain/agent/prompts/template.py +255 -0
  95. aiecs/domain/agent/registry.py +260 -0
  96. aiecs/domain/agent/tool_agent.py +257 -0
  97. aiecs/domain/agent/tools/__init__.py +12 -0
  98. aiecs/domain/agent/tools/schema_generator.py +221 -0
  99. aiecs/domain/community/__init__.py +155 -0
  100. aiecs/domain/community/agent_adapter.py +477 -0
  101. aiecs/domain/community/analytics.py +481 -0
  102. aiecs/domain/community/collaborative_workflow.py +642 -0
  103. aiecs/domain/community/communication_hub.py +645 -0
  104. aiecs/domain/community/community_builder.py +320 -0
  105. aiecs/domain/community/community_integration.py +800 -0
  106. aiecs/domain/community/community_manager.py +813 -0
  107. aiecs/domain/community/decision_engine.py +879 -0
  108. aiecs/domain/community/exceptions.py +225 -0
  109. aiecs/domain/community/models/__init__.py +33 -0
  110. aiecs/domain/community/models/community_models.py +268 -0
  111. aiecs/domain/community/resource_manager.py +457 -0
  112. aiecs/domain/community/shared_context_manager.py +603 -0
  113. aiecs/domain/context/__init__.py +58 -0
  114. aiecs/domain/context/context_engine.py +989 -0
  115. aiecs/domain/context/conversation_models.py +354 -0
  116. aiecs/domain/context/graph_memory.py +467 -0
  117. aiecs/domain/execution/__init__.py +12 -0
  118. aiecs/domain/execution/model.py +57 -0
  119. aiecs/domain/knowledge_graph/__init__.py +19 -0
  120. aiecs/domain/knowledge_graph/models/__init__.py +52 -0
  121. aiecs/domain/knowledge_graph/models/entity.py +130 -0
  122. aiecs/domain/knowledge_graph/models/evidence.py +194 -0
  123. aiecs/domain/knowledge_graph/models/inference_rule.py +186 -0
  124. aiecs/domain/knowledge_graph/models/path.py +179 -0
  125. aiecs/domain/knowledge_graph/models/path_pattern.py +173 -0
  126. aiecs/domain/knowledge_graph/models/query.py +272 -0
  127. aiecs/domain/knowledge_graph/models/query_plan.py +187 -0
  128. aiecs/domain/knowledge_graph/models/relation.py +136 -0
  129. aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
  130. aiecs/domain/knowledge_graph/schema/entity_type.py +135 -0
  131. aiecs/domain/knowledge_graph/schema/graph_schema.py +271 -0
  132. aiecs/domain/knowledge_graph/schema/property_schema.py +155 -0
  133. aiecs/domain/knowledge_graph/schema/relation_type.py +171 -0
  134. aiecs/domain/knowledge_graph/schema/schema_manager.py +496 -0
  135. aiecs/domain/knowledge_graph/schema/type_enums.py +205 -0
  136. aiecs/domain/task/__init__.py +13 -0
  137. aiecs/domain/task/dsl_processor.py +613 -0
  138. aiecs/domain/task/model.py +62 -0
  139. aiecs/domain/task/task_context.py +268 -0
  140. aiecs/infrastructure/__init__.py +24 -0
  141. aiecs/infrastructure/graph_storage/__init__.py +11 -0
  142. aiecs/infrastructure/graph_storage/base.py +601 -0
  143. aiecs/infrastructure/graph_storage/batch_operations.py +449 -0
  144. aiecs/infrastructure/graph_storage/cache.py +429 -0
  145. aiecs/infrastructure/graph_storage/distributed.py +226 -0
  146. aiecs/infrastructure/graph_storage/error_handling.py +390 -0
  147. aiecs/infrastructure/graph_storage/graceful_degradation.py +306 -0
  148. aiecs/infrastructure/graph_storage/health_checks.py +378 -0
  149. aiecs/infrastructure/graph_storage/in_memory.py +514 -0
  150. aiecs/infrastructure/graph_storage/index_optimization.py +483 -0
  151. aiecs/infrastructure/graph_storage/lazy_loading.py +410 -0
  152. aiecs/infrastructure/graph_storage/metrics.py +357 -0
  153. aiecs/infrastructure/graph_storage/migration.py +413 -0
  154. aiecs/infrastructure/graph_storage/pagination.py +471 -0
  155. aiecs/infrastructure/graph_storage/performance_monitoring.py +466 -0
  156. aiecs/infrastructure/graph_storage/postgres.py +871 -0
  157. aiecs/infrastructure/graph_storage/query_optimizer.py +635 -0
  158. aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
  159. aiecs/infrastructure/graph_storage/sqlite.py +623 -0
  160. aiecs/infrastructure/graph_storage/streaming.py +495 -0
  161. aiecs/infrastructure/messaging/__init__.py +13 -0
  162. aiecs/infrastructure/messaging/celery_task_manager.py +383 -0
  163. aiecs/infrastructure/messaging/websocket_manager.py +298 -0
  164. aiecs/infrastructure/monitoring/__init__.py +34 -0
  165. aiecs/infrastructure/monitoring/executor_metrics.py +174 -0
  166. aiecs/infrastructure/monitoring/global_metrics_manager.py +213 -0
  167. aiecs/infrastructure/monitoring/structured_logger.py +48 -0
  168. aiecs/infrastructure/monitoring/tracing_manager.py +410 -0
  169. aiecs/infrastructure/persistence/__init__.py +24 -0
  170. aiecs/infrastructure/persistence/context_engine_client.py +187 -0
  171. aiecs/infrastructure/persistence/database_manager.py +333 -0
  172. aiecs/infrastructure/persistence/file_storage.py +754 -0
  173. aiecs/infrastructure/persistence/redis_client.py +220 -0
  174. aiecs/llm/__init__.py +86 -0
  175. aiecs/llm/callbacks/__init__.py +11 -0
  176. aiecs/llm/callbacks/custom_callbacks.py +264 -0
  177. aiecs/llm/client_factory.py +420 -0
  178. aiecs/llm/clients/__init__.py +33 -0
  179. aiecs/llm/clients/base_client.py +193 -0
  180. aiecs/llm/clients/googleai_client.py +181 -0
  181. aiecs/llm/clients/openai_client.py +131 -0
  182. aiecs/llm/clients/vertex_client.py +437 -0
  183. aiecs/llm/clients/xai_client.py +184 -0
  184. aiecs/llm/config/__init__.py +51 -0
  185. aiecs/llm/config/config_loader.py +275 -0
  186. aiecs/llm/config/config_validator.py +236 -0
  187. aiecs/llm/config/model_config.py +151 -0
  188. aiecs/llm/utils/__init__.py +10 -0
  189. aiecs/llm/utils/validate_config.py +91 -0
  190. aiecs/main.py +363 -0
  191. aiecs/scripts/__init__.py +3 -0
  192. aiecs/scripts/aid/VERSION_MANAGEMENT.md +97 -0
  193. aiecs/scripts/aid/__init__.py +19 -0
  194. aiecs/scripts/aid/version_manager.py +215 -0
  195. aiecs/scripts/dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md +242 -0
  196. aiecs/scripts/dependance_check/README_DEPENDENCY_CHECKER.md +310 -0
  197. aiecs/scripts/dependance_check/__init__.py +17 -0
  198. aiecs/scripts/dependance_check/dependency_checker.py +938 -0
  199. aiecs/scripts/dependance_check/dependency_fixer.py +391 -0
  200. aiecs/scripts/dependance_check/download_nlp_data.py +396 -0
  201. aiecs/scripts/dependance_check/quick_dependency_check.py +270 -0
  202. aiecs/scripts/dependance_check/setup_nlp_data.sh +217 -0
  203. aiecs/scripts/dependance_patch/__init__.py +7 -0
  204. aiecs/scripts/dependance_patch/fix_weasel/README_WEASEL_PATCH.md +126 -0
  205. aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
  206. aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.py +128 -0
  207. aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.sh +82 -0
  208. aiecs/scripts/dependance_patch/fix_weasel/patch_weasel_library.sh +188 -0
  209. aiecs/scripts/dependance_patch/fix_weasel/run_weasel_patch.sh +41 -0
  210. aiecs/scripts/tools_develop/README.md +449 -0
  211. aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
  212. aiecs/scripts/tools_develop/__init__.py +21 -0
  213. aiecs/scripts/tools_develop/check_type_annotations.py +259 -0
  214. aiecs/scripts/tools_develop/validate_tool_schemas.py +422 -0
  215. aiecs/scripts/tools_develop/verify_tools.py +356 -0
  216. aiecs/tasks/__init__.py +1 -0
  217. aiecs/tasks/worker.py +172 -0
  218. aiecs/tools/__init__.py +299 -0
  219. aiecs/tools/apisource/__init__.py +99 -0
  220. aiecs/tools/apisource/intelligence/__init__.py +19 -0
  221. aiecs/tools/apisource/intelligence/data_fusion.py +381 -0
  222. aiecs/tools/apisource/intelligence/query_analyzer.py +413 -0
  223. aiecs/tools/apisource/intelligence/search_enhancer.py +388 -0
  224. aiecs/tools/apisource/monitoring/__init__.py +9 -0
  225. aiecs/tools/apisource/monitoring/metrics.py +303 -0
  226. aiecs/tools/apisource/providers/__init__.py +115 -0
  227. aiecs/tools/apisource/providers/base.py +664 -0
  228. aiecs/tools/apisource/providers/census.py +401 -0
  229. aiecs/tools/apisource/providers/fred.py +564 -0
  230. aiecs/tools/apisource/providers/newsapi.py +412 -0
  231. aiecs/tools/apisource/providers/worldbank.py +357 -0
  232. aiecs/tools/apisource/reliability/__init__.py +12 -0
  233. aiecs/tools/apisource/reliability/error_handler.py +375 -0
  234. aiecs/tools/apisource/reliability/fallback_strategy.py +391 -0
  235. aiecs/tools/apisource/tool.py +850 -0
  236. aiecs/tools/apisource/utils/__init__.py +9 -0
  237. aiecs/tools/apisource/utils/validators.py +338 -0
  238. aiecs/tools/base_tool.py +201 -0
  239. aiecs/tools/docs/__init__.py +121 -0
  240. aiecs/tools/docs/ai_document_orchestrator.py +599 -0
  241. aiecs/tools/docs/ai_document_writer_orchestrator.py +2403 -0
  242. aiecs/tools/docs/content_insertion_tool.py +1333 -0
  243. aiecs/tools/docs/document_creator_tool.py +1317 -0
  244. aiecs/tools/docs/document_layout_tool.py +1166 -0
  245. aiecs/tools/docs/document_parser_tool.py +994 -0
  246. aiecs/tools/docs/document_writer_tool.py +1818 -0
  247. aiecs/tools/knowledge_graph/__init__.py +17 -0
  248. aiecs/tools/knowledge_graph/graph_reasoning_tool.py +734 -0
  249. aiecs/tools/knowledge_graph/graph_search_tool.py +923 -0
  250. aiecs/tools/knowledge_graph/kg_builder_tool.py +476 -0
  251. aiecs/tools/langchain_adapter.py +542 -0
  252. aiecs/tools/schema_generator.py +275 -0
  253. aiecs/tools/search_tool/__init__.py +100 -0
  254. aiecs/tools/search_tool/analyzers.py +589 -0
  255. aiecs/tools/search_tool/cache.py +260 -0
  256. aiecs/tools/search_tool/constants.py +128 -0
  257. aiecs/tools/search_tool/context.py +216 -0
  258. aiecs/tools/search_tool/core.py +749 -0
  259. aiecs/tools/search_tool/deduplicator.py +123 -0
  260. aiecs/tools/search_tool/error_handler.py +271 -0
  261. aiecs/tools/search_tool/metrics.py +371 -0
  262. aiecs/tools/search_tool/rate_limiter.py +178 -0
  263. aiecs/tools/search_tool/schemas.py +277 -0
  264. aiecs/tools/statistics/__init__.py +80 -0
  265. aiecs/tools/statistics/ai_data_analysis_orchestrator.py +643 -0
  266. aiecs/tools/statistics/ai_insight_generator_tool.py +505 -0
  267. aiecs/tools/statistics/ai_report_orchestrator_tool.py +694 -0
  268. aiecs/tools/statistics/data_loader_tool.py +564 -0
  269. aiecs/tools/statistics/data_profiler_tool.py +658 -0
  270. aiecs/tools/statistics/data_transformer_tool.py +573 -0
  271. aiecs/tools/statistics/data_visualizer_tool.py +495 -0
  272. aiecs/tools/statistics/model_trainer_tool.py +487 -0
  273. aiecs/tools/statistics/statistical_analyzer_tool.py +459 -0
  274. aiecs/tools/task_tools/__init__.py +86 -0
  275. aiecs/tools/task_tools/chart_tool.py +732 -0
  276. aiecs/tools/task_tools/classfire_tool.py +922 -0
  277. aiecs/tools/task_tools/image_tool.py +447 -0
  278. aiecs/tools/task_tools/office_tool.py +684 -0
  279. aiecs/tools/task_tools/pandas_tool.py +635 -0
  280. aiecs/tools/task_tools/report_tool.py +635 -0
  281. aiecs/tools/task_tools/research_tool.py +392 -0
  282. aiecs/tools/task_tools/scraper_tool.py +715 -0
  283. aiecs/tools/task_tools/stats_tool.py +688 -0
  284. aiecs/tools/temp_file_manager.py +130 -0
  285. aiecs/tools/tool_executor/__init__.py +37 -0
  286. aiecs/tools/tool_executor/tool_executor.py +881 -0
  287. aiecs/utils/LLM_output_structor.py +445 -0
  288. aiecs/utils/__init__.py +34 -0
  289. aiecs/utils/base_callback.py +47 -0
  290. aiecs/utils/cache_provider.py +695 -0
  291. aiecs/utils/execution_utils.py +184 -0
  292. aiecs/utils/logging.py +1 -0
  293. aiecs/utils/prompt_loader.py +14 -0
  294. aiecs/utils/token_usage_repository.py +323 -0
  295. aiecs/ws/__init__.py +0 -0
  296. aiecs/ws/socket_server.py +52 -0
  297. aiecs-1.5.1.dist-info/METADATA +608 -0
  298. aiecs-1.5.1.dist-info/RECORD +302 -0
  299. aiecs-1.5.1.dist-info/WHEEL +5 -0
  300. aiecs-1.5.1.dist-info/entry_points.txt +10 -0
  301. aiecs-1.5.1.dist-info/licenses/LICENSE +225 -0
  302. aiecs-1.5.1.dist-info/top_level.txt +1 -0
@@ -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
+ ]