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,401 @@
1
+ """
2
+ US Census Bureau API Provider
3
+
4
+ Provides access to US Census Bureau data including demographic,
5
+ economic, and geographic information.
6
+
7
+ API Documentation: https://www.census.gov/data/developers/guidance/api-user-guide.html
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 CensusProvider(BaseAPIProvider):
30
+ """
31
+ US Census Bureau API provider for demographic and economic data.
32
+
33
+ Provides access to:
34
+ - American Community Survey (ACS) data
35
+ - Decennial Census
36
+ - Economic indicators
37
+ - Population estimates
38
+ - Geographic data
39
+ """
40
+
41
+ BASE_URL = "https://api.census.gov/data"
42
+
43
+ @property
44
+ def name(self) -> str:
45
+ return "census"
46
+
47
+ @property
48
+ def description(self) -> str:
49
+ return "US Census Bureau API for demographic, economic, and geographic data"
50
+
51
+ @property
52
+ def supported_operations(self) -> List[str]:
53
+ return [
54
+ "get_acs_data",
55
+ "get_population",
56
+ "get_economic_data",
57
+ "list_datasets",
58
+ "list_variables",
59
+ ]
60
+
61
+ def validate_params(self, operation: str, params: Dict[str, Any]) -> Tuple[bool, Optional[str]]:
62
+ """Validate parameters for Census API operations"""
63
+
64
+ if operation == "get_acs_data":
65
+ if "variables" not in params:
66
+ return False, "Missing required parameter: variables"
67
+ if "geography" not in params:
68
+ return False, "Missing required parameter: geography"
69
+
70
+ elif operation == "get_population":
71
+ if "geography" not in params:
72
+ return False, "Missing required parameter: geography"
73
+
74
+ elif operation == "get_economic_data":
75
+ if "variables" not in params:
76
+ return False, "Missing required parameter: variables"
77
+
78
+ return True, None
79
+
80
+ # Exposed operations for AI agent visibility
81
+
82
+ @expose_operation(
83
+ operation_name="get_acs_data",
84
+ description="Get American Community Survey (ACS) demographic and economic data",
85
+ )
86
+ def get_acs_data(
87
+ self, variables: str, geography: str, year: Optional[int] = None
88
+ ) -> Dict[str, Any]:
89
+ """
90
+ Get ACS data.
91
+
92
+ Args:
93
+ variables: Comma-separated variable codes (e.g., 'B01001_001E,B19013_001E')
94
+ geography: Geographic level (e.g., 'state:*', 'county:*', 'tract:*')
95
+ year: Year for data (default: latest available)
96
+
97
+ Returns:
98
+ Dictionary containing ACS data and metadata
99
+ """
100
+ params = {"variables": variables, "geography": geography}
101
+ if year:
102
+ params["year"] = year
103
+
104
+ return self.execute("get_acs_data", params)
105
+
106
+ @expose_operation(
107
+ operation_name="get_population",
108
+ description="Get population estimates and demographic data",
109
+ )
110
+ def get_population(self, geography: str, year: Optional[int] = None) -> Dict[str, Any]:
111
+ """
112
+ Get population data.
113
+
114
+ Args:
115
+ geography: Geographic level (e.g., 'state:06', 'county:*')
116
+ year: Year for data (default: latest available)
117
+
118
+ Returns:
119
+ Dictionary containing population data
120
+ """
121
+ params = {"geography": geography}
122
+ if year:
123
+ params["year"] = year
124
+
125
+ return self.execute("get_population", params)
126
+
127
+ @expose_operation(
128
+ operation_name="get_economic_data",
129
+ description="Get economic indicators and business statistics",
130
+ )
131
+ def get_economic_data(
132
+ self,
133
+ variables: str,
134
+ geography: Optional[str] = None,
135
+ year: Optional[int] = None,
136
+ ) -> Dict[str, Any]:
137
+ """
138
+ Get economic data.
139
+
140
+ Args:
141
+ variables: Comma-separated variable codes
142
+ geography: Geographic level (optional)
143
+ year: Year for data (default: latest available)
144
+
145
+ Returns:
146
+ Dictionary containing economic data
147
+ """
148
+ params = {"variables": variables}
149
+ if geography:
150
+ params["geography"] = geography
151
+ if year:
152
+ params["year"] = year
153
+
154
+ return self.execute("get_economic_data", params)
155
+
156
+ @expose_operation(
157
+ operation_name="list_datasets",
158
+ description="List all available Census datasets",
159
+ )
160
+ def list_datasets(self) -> Dict[str, Any]:
161
+ """
162
+ List available datasets.
163
+
164
+ Returns:
165
+ Dictionary containing list of datasets
166
+ """
167
+ return self.execute("list_datasets", {})
168
+
169
+ @expose_operation(
170
+ operation_name="list_variables",
171
+ description="List available variables for a specific dataset",
172
+ )
173
+ def list_variables(
174
+ self, dataset: Optional[str] = None, year: Optional[int] = None
175
+ ) -> Dict[str, Any]:
176
+ """
177
+ List available variables.
178
+
179
+ Args:
180
+ dataset: Dataset name (e.g., 'acs/acs5')
181
+ year: Year for dataset
182
+
183
+ Returns:
184
+ Dictionary containing list of variables
185
+ """
186
+ params = {}
187
+ if dataset:
188
+ params["dataset"] = dataset
189
+ if year:
190
+ params["year"] = year
191
+
192
+ return self.execute("list_variables", params)
193
+
194
+ def fetch(self, operation: str, params: Dict[str, Any]) -> Dict[str, Any]:
195
+ """Fetch data from Census API"""
196
+
197
+ if not REQUESTS_AVAILABLE:
198
+ raise ImportError("requests library is required for Census provider")
199
+
200
+ # Census API may require a key for some datasets
201
+ api_key = self._get_api_key("CENSUS_API_KEY")
202
+ timeout = self.config.get("timeout", 30)
203
+
204
+ # Build endpoint based on operation
205
+ if operation == "get_acs_data":
206
+ # American Community Survey 5-Year Data
207
+ year = params.get("year", "2021")
208
+ endpoint = f"{self.BASE_URL}/{year}/acs/acs5"
209
+
210
+ # Build query parameters
211
+ variables = params["variables"]
212
+ if isinstance(variables, list):
213
+ variables = ",".join(variables)
214
+
215
+ geography = params["geography"]
216
+
217
+ query_params = {"get": variables, "for": geography}
218
+
219
+ if api_key:
220
+ query_params["key"] = api_key
221
+
222
+ elif operation == "get_population":
223
+ # Population Estimates
224
+ year = params.get("year", "2021")
225
+ endpoint = f"{self.BASE_URL}/{year}/pep/population"
226
+
227
+ geography = params["geography"]
228
+ variables = params.get("variables", "POP")
229
+
230
+ query_params = {"get": variables, "for": geography}
231
+
232
+ if api_key:
233
+ query_params["key"] = api_key
234
+
235
+ elif operation == "get_economic_data":
236
+ # Economic Census or other economic data
237
+ year = params.get("year", "2017")
238
+ dataset = params.get("dataset", "ecnbasic")
239
+ endpoint = f"{self.BASE_URL}/{year}/ecnbasic"
240
+
241
+ variables = params["variables"]
242
+ if isinstance(variables, list):
243
+ variables = ",".join(variables)
244
+
245
+ geography = params.get("geography", "state:*")
246
+
247
+ query_params = {"get": variables, "for": geography}
248
+
249
+ if api_key:
250
+ query_params["key"] = api_key
251
+
252
+ elif operation == "list_datasets":
253
+ # List available datasets
254
+ endpoint = f"{self.BASE_URL}.json"
255
+ query_params = {}
256
+
257
+ elif operation == "list_variables":
258
+ # List variables for a dataset
259
+ year = params.get("year", "2021")
260
+ dataset = params.get("dataset", "acs/acs5")
261
+ endpoint = f"{self.BASE_URL}/{year}/{dataset}/variables.json"
262
+ query_params = {}
263
+
264
+ else:
265
+ raise ValueError(f"Unknown operation: {operation}")
266
+
267
+ # Make API request
268
+ try:
269
+ response = requests.get(endpoint, params=query_params, timeout=timeout)
270
+ response.raise_for_status()
271
+
272
+ data = response.json()
273
+
274
+ # Census API typically returns array of arrays
275
+ # First row is headers, subsequent rows are data
276
+ if operation in [
277
+ "get_acs_data",
278
+ "get_population",
279
+ "get_economic_data",
280
+ ]:
281
+ if isinstance(data, list) and len(data) > 1:
282
+ headers = data[0]
283
+ rows = data[1:]
284
+
285
+ # Convert to list of dictionaries
286
+ result_data = [dict(zip(headers, row)) for row in rows]
287
+ else:
288
+ result_data = data
289
+ else:
290
+ result_data = data
291
+
292
+ return self._format_response(
293
+ operation=operation,
294
+ data=result_data,
295
+ source=f"US Census Bureau - {endpoint}",
296
+ )
297
+
298
+ except requests.exceptions.RequestException as e:
299
+ self.logger.error(f"Census API request failed: {e}")
300
+ raise Exception(f"Census API request failed: {str(e)}")
301
+
302
+ def get_operation_schema(self, operation: str) -> Optional[Dict[str, Any]]:
303
+ """Get detailed schema for Census API operations"""
304
+
305
+ schemas = {
306
+ "get_acs_data": {
307
+ "description": "Get American Community Survey data",
308
+ "parameters": {
309
+ "variables": {
310
+ "type": "string",
311
+ "required": True,
312
+ "description": "Comma-separated variable codes",
313
+ "examples": [
314
+ "B01001_001E",
315
+ "B19013_001E",
316
+ "B25077_001E",
317
+ ],
318
+ },
319
+ "geography": {
320
+ "type": "string",
321
+ "required": True,
322
+ "description": "Geographic level specification",
323
+ "examples": [
324
+ "state:*",
325
+ "county:*",
326
+ "state:06",
327
+ "county:037",
328
+ ],
329
+ },
330
+ "year": {
331
+ "type": "integer",
332
+ "required": False,
333
+ "description": "Year for data",
334
+ "examples": [2020, 2021, 2022],
335
+ },
336
+ },
337
+ },
338
+ "get_population": {
339
+ "description": "Get population estimates",
340
+ "parameters": {
341
+ "geography": {
342
+ "type": "string",
343
+ "required": True,
344
+ "description": "Geographic level specification",
345
+ "examples": ["state:*", "state:06", "county:*"],
346
+ },
347
+ "year": {
348
+ "type": "integer",
349
+ "required": False,
350
+ "description": "Year for data",
351
+ "examples": [2020, 2021, 2022],
352
+ },
353
+ },
354
+ },
355
+ "get_economic_data": {
356
+ "description": "Get economic indicators",
357
+ "parameters": {
358
+ "variables": {
359
+ "type": "string",
360
+ "required": True,
361
+ "description": "Comma-separated variable codes",
362
+ "examples": ["EMP", "PAYANN", "ESTAB"],
363
+ },
364
+ "geography": {
365
+ "type": "string",
366
+ "required": False,
367
+ "description": "Geographic level specification",
368
+ "examples": ["state:*", "county:*"],
369
+ },
370
+ "year": {
371
+ "type": "integer",
372
+ "required": False,
373
+ "description": "Year for data",
374
+ "examples": [2020, 2021, 2022],
375
+ },
376
+ },
377
+ },
378
+ "list_datasets": {
379
+ "description": "List all available datasets",
380
+ "parameters": {},
381
+ },
382
+ "list_variables": {
383
+ "description": "List available variables",
384
+ "parameters": {
385
+ "dataset": {
386
+ "type": "string",
387
+ "required": False,
388
+ "description": "Dataset name",
389
+ "examples": ["acs/acs5", "acs/acs1", "pep/population"],
390
+ },
391
+ "year": {
392
+ "type": "integer",
393
+ "required": False,
394
+ "description": "Year for dataset",
395
+ "examples": [2020, 2021, 2022],
396
+ },
397
+ },
398
+ },
399
+ }
400
+
401
+ return schemas.get(operation)