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,357 @@
1
+ """
2
+ World Bank API Provider
3
+
4
+ Provides access to World Bank development indicators and data.
5
+ Supports country data, indicators, and time series queries.
6
+
7
+ API Documentation: https://datahelpdesk.worldbank.org/knowledgebase/articles/889392-about-the-indicators-api-documentation
8
+ """
9
+
10
+ import logging
11
+ from typing import Any, Dict, List, Optional, Tuple
12
+
13
+ from aiecs.tools.apisource.providers.base import (
14
+ BaseAPIProvider,
15
+ expose_operation,
16
+ )
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+ # Optional HTTP client
21
+ try:
22
+ import requests
23
+
24
+ REQUESTS_AVAILABLE = True
25
+ except ImportError:
26
+ REQUESTS_AVAILABLE = False
27
+
28
+
29
+ class WorldBankProvider(BaseAPIProvider):
30
+ """
31
+ World Bank API provider for development indicators and country data.
32
+
33
+ Provides access to:
34
+ - Economic indicators (GDP, inflation, trade, etc.)
35
+ - Social indicators (education, health, population)
36
+ - Environmental data
37
+ - Country-specific statistics
38
+ """
39
+
40
+ BASE_URL = "https://api.worldbank.org/v2"
41
+
42
+ @property
43
+ def name(self) -> str:
44
+ return "worldbank"
45
+
46
+ @property
47
+ def description(self) -> str:
48
+ return "World Bank API for global development indicators and country statistics"
49
+
50
+ @property
51
+ def supported_operations(self) -> List[str]:
52
+ return [
53
+ "get_indicator",
54
+ "search_indicators",
55
+ "get_country_data",
56
+ "list_countries",
57
+ "list_indicators",
58
+ ]
59
+
60
+ def validate_params(self, operation: str, params: Dict[str, Any]) -> Tuple[bool, Optional[str]]:
61
+ """Validate parameters for World Bank operations"""
62
+
63
+ if operation == "get_indicator":
64
+ if "indicator_code" not in params:
65
+ return False, "Missing required parameter: indicator_code"
66
+ if "country_code" not in params:
67
+ return False, "Missing required parameter: country_code"
68
+
69
+ elif operation == "get_country_data":
70
+ if "country_code" not in params:
71
+ return False, "Missing required parameter: country_code"
72
+
73
+ elif operation == "search_indicators":
74
+ if "search_text" not in params:
75
+ return False, "Missing required parameter: search_text"
76
+
77
+ return True, None
78
+
79
+ # Exposed operations for AI agent visibility
80
+
81
+ @expose_operation(
82
+ operation_name="get_indicator",
83
+ description="Get World Bank development indicator data for a specific country and indicator",
84
+ )
85
+ def get_indicator(
86
+ self,
87
+ indicator_code: str,
88
+ country_code: str,
89
+ start_year: Optional[int] = None,
90
+ end_year: Optional[int] = None,
91
+ ) -> Dict[str, Any]:
92
+ """
93
+ Get World Bank indicator data.
94
+
95
+ Args:
96
+ indicator_code: World Bank indicator code (e.g., 'NY.GDP.MKTP.CD', 'SP.POP.TOTL')
97
+ country_code: ISO 3-letter country code (e.g., 'USA', 'CHN', 'GBR')
98
+ start_year: Start year for data range
99
+ end_year: End year for data range
100
+
101
+ Returns:
102
+ Dictionary containing indicator data and metadata
103
+ """
104
+ params = {
105
+ "indicator_code": indicator_code,
106
+ "country_code": country_code,
107
+ }
108
+ if start_year:
109
+ params["start_year"] = start_year
110
+ if end_year:
111
+ params["end_year"] = end_year
112
+
113
+ return self.execute("get_indicator", params)
114
+
115
+ @expose_operation(
116
+ operation_name="search_indicators",
117
+ description="Search for World Bank indicators by keywords",
118
+ )
119
+ def search_indicators(self, search_text: str, limit: Optional[int] = None) -> Dict[str, Any]:
120
+ """
121
+ Search for World Bank indicators.
122
+
123
+ Args:
124
+ search_text: Search keywords (e.g., 'GDP', 'population', 'education')
125
+ limit: Maximum number of results to return
126
+
127
+ Returns:
128
+ Dictionary containing search results and metadata
129
+ """
130
+ params = {"search_text": search_text}
131
+ if limit:
132
+ params["limit"] = limit
133
+
134
+ return self.execute("search_indicators", params)
135
+
136
+ @expose_operation(
137
+ operation_name="get_country_data",
138
+ description="Get general information and statistics about a specific country",
139
+ )
140
+ def get_country_data(self, country_code: str) -> Dict[str, Any]:
141
+ """
142
+ Get country data and metadata.
143
+
144
+ Args:
145
+ country_code: ISO 3-letter country code (e.g., 'USA', 'CHN')
146
+
147
+ Returns:
148
+ Dictionary containing country information
149
+ """
150
+ return self.execute("get_country_data", {"country_code": country_code})
151
+
152
+ @expose_operation(
153
+ operation_name="list_countries",
154
+ description="List all available countries in the World Bank database",
155
+ )
156
+ def list_countries(self) -> Dict[str, Any]:
157
+ """
158
+ List all available countries.
159
+
160
+ Returns:
161
+ Dictionary containing list of countries
162
+ """
163
+ return self.execute("list_countries", {})
164
+
165
+ @expose_operation(
166
+ operation_name="list_indicators",
167
+ description="List all available World Bank indicators",
168
+ )
169
+ def list_indicators(self, limit: Optional[int] = None) -> Dict[str, Any]:
170
+ """
171
+ List all available indicators.
172
+
173
+ Args:
174
+ limit: Maximum number of indicators to return
175
+
176
+ Returns:
177
+ Dictionary containing list of indicators
178
+ """
179
+ params = {}
180
+ if limit:
181
+ params["limit"] = limit
182
+
183
+ return self.execute("list_indicators", params)
184
+
185
+ def fetch(self, operation: str, params: Dict[str, Any]) -> Dict[str, Any]:
186
+ """Fetch data from World Bank API"""
187
+
188
+ if not REQUESTS_AVAILABLE:
189
+ raise ImportError("requests library is required for World Bank provider")
190
+
191
+ # World Bank API doesn't require API key for most operations
192
+ timeout = self.config.get("timeout", 30)
193
+
194
+ # Build endpoint based on operation
195
+ if operation == "get_indicator":
196
+ country = params["country_code"]
197
+ indicator = params["indicator_code"]
198
+ endpoint = f"{self.BASE_URL}/country/{country}/indicator/{indicator}"
199
+ query_params = {"format": "json"}
200
+
201
+ # Optional parameters
202
+ if "date" in params:
203
+ query_params["date"] = params["date"]
204
+ if "per_page" in params:
205
+ query_params["per_page"] = params["per_page"]
206
+
207
+ elif operation == "get_country_data":
208
+ country = params["country_code"]
209
+ endpoint = f"{self.BASE_URL}/country/{country}"
210
+ query_params = {"format": "json"}
211
+
212
+ elif operation == "list_countries":
213
+ endpoint = f"{self.BASE_URL}/country"
214
+ query_params = {
215
+ "format": "json",
216
+ "per_page": params.get("per_page", 100),
217
+ }
218
+
219
+ elif operation == "list_indicators":
220
+ endpoint = f"{self.BASE_URL}/indicator"
221
+ query_params = {
222
+ "format": "json",
223
+ "per_page": params.get("per_page", 100),
224
+ }
225
+
226
+ elif operation == "search_indicators":
227
+ # World Bank doesn't have direct search, so we list and filter
228
+ endpoint = f"{self.BASE_URL}/indicator"
229
+ query_params = {"format": "json", "per_page": 1000}
230
+
231
+ else:
232
+ raise ValueError(f"Unknown operation: {operation}")
233
+
234
+ # Make API request
235
+ try:
236
+ response = requests.get(endpoint, params=query_params, timeout=timeout)
237
+ response.raise_for_status()
238
+
239
+ data = response.json()
240
+
241
+ # World Bank API returns [metadata, data]
242
+ if isinstance(data, list) and len(data) > 1:
243
+ result_data = data[1]
244
+ else:
245
+ result_data = data
246
+
247
+ # Filter for search operation
248
+ if operation == "search_indicators" and result_data:
249
+ search_text = params["search_text"].lower()
250
+ filtered = [
251
+ item
252
+ for item in result_data
253
+ if search_text in str(item.get("name", "")).lower()
254
+ or search_text in str(item.get("sourceNote", "")).lower()
255
+ ]
256
+ result_data = filtered[: params.get("limit", 20)]
257
+
258
+ return self._format_response(
259
+ operation=operation,
260
+ data=result_data,
261
+ source=f"World Bank API - {endpoint}",
262
+ )
263
+
264
+ except requests.exceptions.RequestException as e:
265
+ self.logger.error(f"World Bank API request failed: {e}")
266
+ raise Exception(f"World Bank API request failed: {str(e)}")
267
+
268
+ def get_operation_schema(self, operation: str) -> Optional[Dict[str, Any]]:
269
+ """Get detailed schema for World Bank operations"""
270
+
271
+ schemas = {
272
+ "get_indicator": {
273
+ "description": "Get World Bank development indicator data",
274
+ "parameters": {
275
+ "indicator_code": {
276
+ "type": "string",
277
+ "required": True,
278
+ "description": "World Bank indicator code",
279
+ "examples": [
280
+ "NY.GDP.MKTP.CD",
281
+ "SP.POP.TOTL",
282
+ "SE.PRM.ENRR",
283
+ ],
284
+ },
285
+ "country_code": {
286
+ "type": "string",
287
+ "required": True,
288
+ "description": "ISO 3-letter country code",
289
+ "examples": ["USA", "CHN", "GBR", "IND"],
290
+ },
291
+ "start_year": {
292
+ "type": "integer",
293
+ "required": False,
294
+ "description": "Start year for data range",
295
+ "examples": [2010, 2015, 2020],
296
+ },
297
+ "end_year": {
298
+ "type": "integer",
299
+ "required": False,
300
+ "description": "End year for data range",
301
+ "examples": [2020, 2023, 2025],
302
+ },
303
+ },
304
+ },
305
+ "search_indicators": {
306
+ "description": "Search for World Bank indicators by keywords",
307
+ "parameters": {
308
+ "search_text": {
309
+ "type": "string",
310
+ "required": True,
311
+ "description": "Search keywords",
312
+ "examples": [
313
+ "GDP",
314
+ "population",
315
+ "education",
316
+ "health",
317
+ ],
318
+ },
319
+ "limit": {
320
+ "type": "integer",
321
+ "required": False,
322
+ "description": "Maximum number of results",
323
+ "examples": [10, 20, 50],
324
+ "default": 20,
325
+ },
326
+ },
327
+ },
328
+ "get_country_data": {
329
+ "description": "Get country information and metadata",
330
+ "parameters": {
331
+ "country_code": {
332
+ "type": "string",
333
+ "required": True,
334
+ "description": "ISO 3-letter country code",
335
+ "examples": ["USA", "CHN", "GBR"],
336
+ }
337
+ },
338
+ },
339
+ "list_countries": {
340
+ "description": "List all available countries",
341
+ "parameters": {},
342
+ },
343
+ "list_indicators": {
344
+ "description": "List all available indicators",
345
+ "parameters": {
346
+ "limit": {
347
+ "type": "integer",
348
+ "required": False,
349
+ "description": "Maximum number of indicators",
350
+ "examples": [50, 100, 200],
351
+ "default": 100,
352
+ }
353
+ },
354
+ },
355
+ }
356
+
357
+ return schemas.get(operation)
@@ -0,0 +1,12 @@
1
+ """
2
+ Reliability Module
3
+
4
+ Contains error handling and fallback strategy components.
5
+ """
6
+
7
+ from aiecs.tools.apisource.reliability.error_handler import SmartErrorHandler
8
+ from aiecs.tools.apisource.reliability.fallback_strategy import (
9
+ FallbackStrategy,
10
+ )
11
+
12
+ __all__ = ["SmartErrorHandler", "FallbackStrategy"]