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,412 @@
1
+ """
2
+ News API Provider
3
+
4
+ Provides access to news articles from various sources worldwide.
5
+ Supports headline retrieval, article search, and source listing.
6
+
7
+ API Documentation: https://newsapi.org/docs
8
+ """
9
+
10
+ import logging
11
+ from datetime import datetime, timedelta
12
+ from typing import Any, Dict, List, Optional, Tuple
13
+
14
+ from aiecs.tools.apisource.providers.base import (
15
+ BaseAPIProvider,
16
+ expose_operation,
17
+ )
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+ # Optional HTTP client
22
+ try:
23
+ import requests
24
+
25
+ REQUESTS_AVAILABLE = True
26
+ except ImportError:
27
+ REQUESTS_AVAILABLE = False
28
+
29
+
30
+ class NewsAPIProvider(BaseAPIProvider):
31
+ """
32
+ News API provider for accessing news articles and headlines.
33
+
34
+ Provides access to:
35
+ - Top headlines from various sources
36
+ - Article search by keywords
37
+ - News sources listing
38
+ - Filtering by country, language, category
39
+ """
40
+
41
+ BASE_URL = "https://newsapi.org/v2"
42
+
43
+ @property
44
+ def name(self) -> str:
45
+ return "newsapi"
46
+
47
+ @property
48
+ def description(self) -> str:
49
+ return "News API for accessing news articles, headlines, and sources worldwide"
50
+
51
+ @property
52
+ def supported_operations(self) -> List[str]:
53
+ return ["get_top_headlines", "search_everything", "get_sources"]
54
+
55
+ def validate_params(self, operation: str, params: Dict[str, Any]) -> Tuple[bool, Optional[str]]:
56
+ """Validate parameters for News API operations"""
57
+
58
+ if operation == "get_top_headlines":
59
+ # At least one of these is required
60
+ if not any(k in params for k in ["q", "country", "category", "sources"]):
61
+ return (
62
+ False,
63
+ "At least one of q, country, category, or sources is required",
64
+ )
65
+
66
+ elif operation == "search_everything":
67
+ if "q" not in params:
68
+ return False, "Missing required parameter: q (search query)"
69
+
70
+ return True, None
71
+
72
+ # Exposed operations for AI agent visibility
73
+
74
+ @expose_operation(
75
+ operation_name="get_top_headlines",
76
+ description="Get top news headlines from various sources with optional filtering",
77
+ )
78
+ def get_top_headlines(
79
+ self,
80
+ q: Optional[str] = None,
81
+ country: Optional[str] = None,
82
+ category: Optional[str] = None,
83
+ sources: Optional[str] = None,
84
+ page_size: Optional[int] = None,
85
+ ) -> Dict[str, Any]:
86
+ """
87
+ Get top headlines.
88
+
89
+ Args:
90
+ q: Keywords or phrases to search for in article title and body
91
+ country: 2-letter ISO country code (e.g., 'us', 'gb', 'cn')
92
+ category: Category (business, entertainment, general, health, science, sports, technology)
93
+ sources: Comma-separated news source IDs
94
+ page_size: Number of results to return (max 100)
95
+
96
+ Returns:
97
+ Dictionary containing news articles and metadata
98
+ """
99
+ params = {}
100
+ if q:
101
+ params["q"] = q
102
+ if country:
103
+ params["country"] = country
104
+ if category:
105
+ params["category"] = category
106
+ if sources:
107
+ params["sources"] = sources
108
+ if page_size:
109
+ params["page_size"] = page_size
110
+
111
+ return self.execute("get_top_headlines", params)
112
+
113
+ @expose_operation(
114
+ operation_name="search_everything",
115
+ description="Search through millions of articles from news sources and blogs",
116
+ )
117
+ def search_everything(
118
+ self,
119
+ q: str,
120
+ from_date: Optional[str] = None,
121
+ to_date: Optional[str] = None,
122
+ language: Optional[str] = None,
123
+ sort_by: Optional[str] = None,
124
+ page_size: Optional[int] = None,
125
+ ) -> Dict[str, Any]:
126
+ """
127
+ Search all articles.
128
+
129
+ Args:
130
+ q: Keywords or phrases to search for
131
+ from_date: Start date (YYYY-MM-DD or ISO 8601)
132
+ to_date: End date (YYYY-MM-DD or ISO 8601)
133
+ language: 2-letter ISO language code (e.g., 'en', 'es', 'fr')
134
+ sort_by: Sort order (relevancy, popularity, publishedAt)
135
+ page_size: Number of results to return (max 100)
136
+
137
+ Returns:
138
+ Dictionary containing search results and metadata
139
+ """
140
+ params = {"q": q}
141
+ if from_date:
142
+ params["from"] = from_date
143
+ if to_date:
144
+ params["to"] = to_date
145
+ if language:
146
+ params["language"] = language
147
+ if sort_by:
148
+ params["sortBy"] = sort_by
149
+ if page_size:
150
+ params["pageSize"] = page_size
151
+
152
+ return self.execute("search_everything", params)
153
+
154
+ @expose_operation(
155
+ operation_name="get_sources",
156
+ description="Get the list of available news sources",
157
+ )
158
+ def get_sources(
159
+ self,
160
+ category: Optional[str] = None,
161
+ language: Optional[str] = None,
162
+ country: Optional[str] = None,
163
+ ) -> Dict[str, Any]:
164
+ """
165
+ Get available news sources.
166
+
167
+ Args:
168
+ category: Filter by category
169
+ language: Filter by language (2-letter ISO code)
170
+ country: Filter by country (2-letter ISO code)
171
+
172
+ Returns:
173
+ Dictionary containing list of news sources
174
+ """
175
+ params = {}
176
+ if category:
177
+ params["category"] = category
178
+ if language:
179
+ params["language"] = language
180
+ if country:
181
+ params["country"] = country
182
+
183
+ return self.execute("get_sources", params)
184
+
185
+ def fetch(self, operation: str, params: Dict[str, Any]) -> Dict[str, Any]:
186
+ """Fetch data from News API"""
187
+
188
+ if not REQUESTS_AVAILABLE:
189
+ raise ImportError("requests library is required for News API provider")
190
+
191
+ # Get API key
192
+ api_key = self._get_api_key("NEWSAPI_API_KEY")
193
+ if not api_key:
194
+ raise ValueError(
195
+ "News API key not found. Set NEWSAPI_API_KEY environment variable or "
196
+ "provide 'api_key' in config. Get your key at https://newsapi.org"
197
+ )
198
+
199
+ headers = {"X-Api-Key": api_key}
200
+ timeout = self.config.get("timeout", 30)
201
+
202
+ # Build endpoint based on operation
203
+ if operation == "get_top_headlines":
204
+ endpoint = f"{self.BASE_URL}/top-headlines"
205
+ query_params = {}
206
+
207
+ # Optional parameters
208
+ if "q" in params:
209
+ query_params["q"] = params["q"]
210
+ if "country" in params:
211
+ query_params["country"] = params["country"]
212
+ if "category" in params:
213
+ query_params["category"] = params["category"]
214
+ if "sources" in params:
215
+ query_params["sources"] = params["sources"]
216
+ if "page_size" in params:
217
+ query_params["pageSize"] = params["page_size"]
218
+ if "page" in params:
219
+ query_params["page"] = params["page"]
220
+
221
+ elif operation == "search_everything":
222
+ endpoint = f"{self.BASE_URL}/everything"
223
+ query_params = {"q": params["q"]}
224
+
225
+ # Optional parameters
226
+ if "from_date" in params:
227
+ query_params["from"] = params["from_date"]
228
+ elif "days_back" in params:
229
+ # Convenience parameter: go back N days
230
+ from_date = datetime.now() - timedelta(days=params["days_back"])
231
+ query_params["from"] = from_date.strftime("%Y-%m-%d")
232
+
233
+ if "to_date" in params:
234
+ query_params["to"] = params["to_date"]
235
+ if "language" in params:
236
+ query_params["language"] = params["language"]
237
+ if "sort_by" in params:
238
+ query_params["sortBy"] = params["sort_by"]
239
+ if "page_size" in params:
240
+ query_params["pageSize"] = params["page_size"]
241
+ if "page" in params:
242
+ query_params["page"] = params["page"]
243
+
244
+ elif operation == "get_sources":
245
+ endpoint = f"{self.BASE_URL}/top-headlines/sources"
246
+ query_params = {}
247
+
248
+ # Optional parameters
249
+ if "country" in params:
250
+ query_params["country"] = params["country"]
251
+ if "language" in params:
252
+ query_params["language"] = params["language"]
253
+ if "category" in params:
254
+ query_params["category"] = params["category"]
255
+
256
+ else:
257
+ raise ValueError(f"Unknown operation: {operation}")
258
+
259
+ # Make API request
260
+ try:
261
+ response = requests.get(endpoint, params=query_params, headers=headers, timeout=timeout)
262
+ response.raise_for_status()
263
+
264
+ data = response.json()
265
+
266
+ # Check API response status
267
+ if data.get("status") != "ok":
268
+ raise Exception(f"News API error: {data.get('message', 'Unknown error')}")
269
+
270
+ # Extract relevant data
271
+ if operation == "get_sources":
272
+ result_data = data.get("sources", [])
273
+ else:
274
+ result_data = {
275
+ "articles": data.get("articles", []),
276
+ "total_results": data.get("totalResults", 0),
277
+ }
278
+
279
+ return self._format_response(
280
+ operation=operation,
281
+ data=result_data,
282
+ source=f"News API - {endpoint}",
283
+ )
284
+
285
+ except requests.exceptions.RequestException as e:
286
+ self.logger.error(f"News API request failed: {e}")
287
+ raise Exception(f"News API request failed: {str(e)}")
288
+
289
+ def get_operation_schema(self, operation: str) -> Optional[Dict[str, Any]]:
290
+ """Get detailed schema for News API operations"""
291
+
292
+ schemas = {
293
+ "get_top_headlines": {
294
+ "description": "Get top news headlines",
295
+ "parameters": {
296
+ "q": {
297
+ "type": "string",
298
+ "required": False,
299
+ "description": "Keywords or phrases to search for",
300
+ "examples": [
301
+ "bitcoin",
302
+ "climate change",
303
+ "technology",
304
+ ],
305
+ },
306
+ "country": {
307
+ "type": "string",
308
+ "required": False,
309
+ "description": "2-letter ISO country code",
310
+ "examples": ["us", "gb", "cn", "jp"],
311
+ },
312
+ "category": {
313
+ "type": "string",
314
+ "required": False,
315
+ "description": "News category",
316
+ "examples": [
317
+ "business",
318
+ "entertainment",
319
+ "health",
320
+ "science",
321
+ "sports",
322
+ "technology",
323
+ ],
324
+ },
325
+ "sources": {
326
+ "type": "string",
327
+ "required": False,
328
+ "description": "Comma-separated news source IDs",
329
+ "examples": ["bbc-news", "cnn", "the-verge"],
330
+ },
331
+ "page_size": {
332
+ "type": "integer",
333
+ "required": False,
334
+ "description": "Number of results (max 100)",
335
+ "examples": [10, 20, 50],
336
+ "default": 20,
337
+ },
338
+ },
339
+ },
340
+ "search_everything": {
341
+ "description": "Search all news articles",
342
+ "parameters": {
343
+ "q": {
344
+ "type": "string",
345
+ "required": True,
346
+ "description": "Keywords or phrases to search for",
347
+ "examples": [
348
+ "artificial intelligence",
349
+ "climate summit",
350
+ "stock market",
351
+ ],
352
+ },
353
+ "from_date": {
354
+ "type": "string",
355
+ "required": False,
356
+ "description": "Start date (YYYY-MM-DD)",
357
+ "examples": ["2024-01-01", "2024-10-01"],
358
+ },
359
+ "to_date": {
360
+ "type": "string",
361
+ "required": False,
362
+ "description": "End date (YYYY-MM-DD)",
363
+ "examples": ["2024-12-31", "2024-10-17"],
364
+ },
365
+ "language": {
366
+ "type": "string",
367
+ "required": False,
368
+ "description": "2-letter ISO language code",
369
+ "examples": ["en", "es", "fr", "de"],
370
+ },
371
+ "sort_by": {
372
+ "type": "string",
373
+ "required": False,
374
+ "description": "Sort order",
375
+ "examples": ["relevancy", "popularity", "publishedAt"],
376
+ "default": "publishedAt",
377
+ },
378
+ "page_size": {
379
+ "type": "integer",
380
+ "required": False,
381
+ "description": "Number of results (max 100)",
382
+ "examples": [10, 20, 50],
383
+ "default": 20,
384
+ },
385
+ },
386
+ },
387
+ "get_sources": {
388
+ "description": "Get available news sources",
389
+ "parameters": {
390
+ "category": {
391
+ "type": "string",
392
+ "required": False,
393
+ "description": "Filter by category",
394
+ "examples": ["business", "technology", "sports"],
395
+ },
396
+ "language": {
397
+ "type": "string",
398
+ "required": False,
399
+ "description": "Filter by language (2-letter ISO code)",
400
+ "examples": ["en", "es", "fr"],
401
+ },
402
+ "country": {
403
+ "type": "string",
404
+ "required": False,
405
+ "description": "Filter by country (2-letter ISO code)",
406
+ "examples": ["us", "gb", "cn"],
407
+ },
408
+ },
409
+ },
410
+ }
411
+
412
+ return schemas.get(operation)