aiecs 1.0.1__py3-none-any.whl → 1.7.6__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.

Potentially problematic release.


This version of aiecs might be problematic. Click here for more details.

Files changed (340) hide show
  1. aiecs/__init__.py +13 -16
  2. aiecs/__main__.py +7 -7
  3. aiecs/aiecs_client.py +269 -75
  4. aiecs/application/executors/operation_executor.py +79 -54
  5. aiecs/application/knowledge_graph/__init__.py +7 -0
  6. aiecs/application/knowledge_graph/builder/__init__.py +37 -0
  7. aiecs/application/knowledge_graph/builder/data_quality.py +302 -0
  8. aiecs/application/knowledge_graph/builder/data_reshaping.py +293 -0
  9. aiecs/application/knowledge_graph/builder/document_builder.py +369 -0
  10. aiecs/application/knowledge_graph/builder/graph_builder.py +490 -0
  11. aiecs/application/knowledge_graph/builder/import_optimizer.py +396 -0
  12. aiecs/application/knowledge_graph/builder/schema_inference.py +462 -0
  13. aiecs/application/knowledge_graph/builder/schema_mapping.py +563 -0
  14. aiecs/application/knowledge_graph/builder/structured_pipeline.py +1384 -0
  15. aiecs/application/knowledge_graph/builder/text_chunker.py +317 -0
  16. aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
  17. aiecs/application/knowledge_graph/extractors/base.py +98 -0
  18. aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +422 -0
  19. aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +347 -0
  20. aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +241 -0
  21. aiecs/application/knowledge_graph/fusion/__init__.py +78 -0
  22. aiecs/application/knowledge_graph/fusion/ab_testing.py +395 -0
  23. aiecs/application/knowledge_graph/fusion/abbreviation_expander.py +327 -0
  24. aiecs/application/knowledge_graph/fusion/alias_index.py +597 -0
  25. aiecs/application/knowledge_graph/fusion/alias_matcher.py +384 -0
  26. aiecs/application/knowledge_graph/fusion/cache_coordinator.py +343 -0
  27. aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +433 -0
  28. aiecs/application/knowledge_graph/fusion/entity_linker.py +511 -0
  29. aiecs/application/knowledge_graph/fusion/evaluation_dataset.py +240 -0
  30. aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +632 -0
  31. aiecs/application/knowledge_graph/fusion/matching_config.py +489 -0
  32. aiecs/application/knowledge_graph/fusion/name_normalizer.py +352 -0
  33. aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +183 -0
  34. aiecs/application/knowledge_graph/fusion/semantic_name_matcher.py +464 -0
  35. aiecs/application/knowledge_graph/fusion/similarity_pipeline.py +534 -0
  36. aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
  37. aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +342 -0
  38. aiecs/application/knowledge_graph/pattern_matching/query_executor.py +366 -0
  39. aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
  40. aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +195 -0
  41. aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
  42. aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
  43. aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +341 -0
  44. aiecs/application/knowledge_graph/reasoning/inference_engine.py +500 -0
  45. aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +163 -0
  46. aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
  47. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
  48. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +913 -0
  49. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +866 -0
  50. aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +475 -0
  51. aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +396 -0
  52. aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +208 -0
  53. aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +170 -0
  54. aiecs/application/knowledge_graph/reasoning/query_planner.py +855 -0
  55. aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +518 -0
  56. aiecs/application/knowledge_graph/retrieval/__init__.py +27 -0
  57. aiecs/application/knowledge_graph/retrieval/query_intent_classifier.py +211 -0
  58. aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +592 -0
  59. aiecs/application/knowledge_graph/retrieval/strategy_types.py +23 -0
  60. aiecs/application/knowledge_graph/search/__init__.py +59 -0
  61. aiecs/application/knowledge_graph/search/hybrid_search.py +457 -0
  62. aiecs/application/knowledge_graph/search/reranker.py +293 -0
  63. aiecs/application/knowledge_graph/search/reranker_strategies.py +535 -0
  64. aiecs/application/knowledge_graph/search/text_similarity.py +392 -0
  65. aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
  66. aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +305 -0
  67. aiecs/application/knowledge_graph/traversal/path_scorer.py +271 -0
  68. aiecs/application/knowledge_graph/validators/__init__.py +13 -0
  69. aiecs/application/knowledge_graph/validators/relation_validator.py +239 -0
  70. aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
  71. aiecs/application/knowledge_graph/visualization/graph_visualizer.py +313 -0
  72. aiecs/common/__init__.py +9 -0
  73. aiecs/common/knowledge_graph/__init__.py +17 -0
  74. aiecs/common/knowledge_graph/runnable.py +471 -0
  75. aiecs/config/__init__.py +20 -5
  76. aiecs/config/config.py +762 -31
  77. aiecs/config/graph_config.py +131 -0
  78. aiecs/config/tool_config.py +399 -0
  79. aiecs/core/__init__.py +29 -13
  80. aiecs/core/interface/__init__.py +2 -2
  81. aiecs/core/interface/execution_interface.py +22 -22
  82. aiecs/core/interface/storage_interface.py +37 -88
  83. aiecs/core/registry/__init__.py +31 -0
  84. aiecs/core/registry/service_registry.py +92 -0
  85. aiecs/domain/__init__.py +270 -1
  86. aiecs/domain/agent/__init__.py +191 -0
  87. aiecs/domain/agent/base_agent.py +3870 -0
  88. aiecs/domain/agent/exceptions.py +99 -0
  89. aiecs/domain/agent/graph_aware_mixin.py +569 -0
  90. aiecs/domain/agent/hybrid_agent.py +1435 -0
  91. aiecs/domain/agent/integration/__init__.py +29 -0
  92. aiecs/domain/agent/integration/context_compressor.py +216 -0
  93. aiecs/domain/agent/integration/context_engine_adapter.py +587 -0
  94. aiecs/domain/agent/integration/protocols.py +281 -0
  95. aiecs/domain/agent/integration/retry_policy.py +218 -0
  96. aiecs/domain/agent/integration/role_config.py +213 -0
  97. aiecs/domain/agent/knowledge_aware_agent.py +1892 -0
  98. aiecs/domain/agent/lifecycle.py +291 -0
  99. aiecs/domain/agent/llm_agent.py +692 -0
  100. aiecs/domain/agent/memory/__init__.py +12 -0
  101. aiecs/domain/agent/memory/conversation.py +1124 -0
  102. aiecs/domain/agent/migration/__init__.py +14 -0
  103. aiecs/domain/agent/migration/conversion.py +163 -0
  104. aiecs/domain/agent/migration/legacy_wrapper.py +86 -0
  105. aiecs/domain/agent/models.py +884 -0
  106. aiecs/domain/agent/observability.py +479 -0
  107. aiecs/domain/agent/persistence.py +449 -0
  108. aiecs/domain/agent/prompts/__init__.py +29 -0
  109. aiecs/domain/agent/prompts/builder.py +159 -0
  110. aiecs/domain/agent/prompts/formatters.py +187 -0
  111. aiecs/domain/agent/prompts/template.py +255 -0
  112. aiecs/domain/agent/registry.py +253 -0
  113. aiecs/domain/agent/tool_agent.py +444 -0
  114. aiecs/domain/agent/tools/__init__.py +15 -0
  115. aiecs/domain/agent/tools/schema_generator.py +364 -0
  116. aiecs/domain/community/__init__.py +155 -0
  117. aiecs/domain/community/agent_adapter.py +469 -0
  118. aiecs/domain/community/analytics.py +432 -0
  119. aiecs/domain/community/collaborative_workflow.py +648 -0
  120. aiecs/domain/community/communication_hub.py +634 -0
  121. aiecs/domain/community/community_builder.py +320 -0
  122. aiecs/domain/community/community_integration.py +796 -0
  123. aiecs/domain/community/community_manager.py +803 -0
  124. aiecs/domain/community/decision_engine.py +849 -0
  125. aiecs/domain/community/exceptions.py +231 -0
  126. aiecs/domain/community/models/__init__.py +33 -0
  127. aiecs/domain/community/models/community_models.py +234 -0
  128. aiecs/domain/community/resource_manager.py +461 -0
  129. aiecs/domain/community/shared_context_manager.py +589 -0
  130. aiecs/domain/context/__init__.py +40 -10
  131. aiecs/domain/context/context_engine.py +1910 -0
  132. aiecs/domain/context/conversation_models.py +87 -53
  133. aiecs/domain/context/graph_memory.py +582 -0
  134. aiecs/domain/execution/model.py +12 -4
  135. aiecs/domain/knowledge_graph/__init__.py +19 -0
  136. aiecs/domain/knowledge_graph/models/__init__.py +52 -0
  137. aiecs/domain/knowledge_graph/models/entity.py +148 -0
  138. aiecs/domain/knowledge_graph/models/evidence.py +178 -0
  139. aiecs/domain/knowledge_graph/models/inference_rule.py +184 -0
  140. aiecs/domain/knowledge_graph/models/path.py +171 -0
  141. aiecs/domain/knowledge_graph/models/path_pattern.py +171 -0
  142. aiecs/domain/knowledge_graph/models/query.py +261 -0
  143. aiecs/domain/knowledge_graph/models/query_plan.py +181 -0
  144. aiecs/domain/knowledge_graph/models/relation.py +202 -0
  145. aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
  146. aiecs/domain/knowledge_graph/schema/entity_type.py +131 -0
  147. aiecs/domain/knowledge_graph/schema/graph_schema.py +253 -0
  148. aiecs/domain/knowledge_graph/schema/property_schema.py +143 -0
  149. aiecs/domain/knowledge_graph/schema/relation_type.py +163 -0
  150. aiecs/domain/knowledge_graph/schema/schema_manager.py +691 -0
  151. aiecs/domain/knowledge_graph/schema/type_enums.py +209 -0
  152. aiecs/domain/task/dsl_processor.py +172 -56
  153. aiecs/domain/task/model.py +20 -8
  154. aiecs/domain/task/task_context.py +27 -24
  155. aiecs/infrastructure/__init__.py +0 -2
  156. aiecs/infrastructure/graph_storage/__init__.py +11 -0
  157. aiecs/infrastructure/graph_storage/base.py +837 -0
  158. aiecs/infrastructure/graph_storage/batch_operations.py +458 -0
  159. aiecs/infrastructure/graph_storage/cache.py +424 -0
  160. aiecs/infrastructure/graph_storage/distributed.py +223 -0
  161. aiecs/infrastructure/graph_storage/error_handling.py +380 -0
  162. aiecs/infrastructure/graph_storage/graceful_degradation.py +294 -0
  163. aiecs/infrastructure/graph_storage/health_checks.py +378 -0
  164. aiecs/infrastructure/graph_storage/in_memory.py +1197 -0
  165. aiecs/infrastructure/graph_storage/index_optimization.py +446 -0
  166. aiecs/infrastructure/graph_storage/lazy_loading.py +431 -0
  167. aiecs/infrastructure/graph_storage/metrics.py +344 -0
  168. aiecs/infrastructure/graph_storage/migration.py +400 -0
  169. aiecs/infrastructure/graph_storage/pagination.py +483 -0
  170. aiecs/infrastructure/graph_storage/performance_monitoring.py +456 -0
  171. aiecs/infrastructure/graph_storage/postgres.py +1563 -0
  172. aiecs/infrastructure/graph_storage/property_storage.py +353 -0
  173. aiecs/infrastructure/graph_storage/protocols.py +76 -0
  174. aiecs/infrastructure/graph_storage/query_optimizer.py +642 -0
  175. aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
  176. aiecs/infrastructure/graph_storage/sqlite.py +1373 -0
  177. aiecs/infrastructure/graph_storage/streaming.py +487 -0
  178. aiecs/infrastructure/graph_storage/tenant.py +412 -0
  179. aiecs/infrastructure/messaging/celery_task_manager.py +92 -54
  180. aiecs/infrastructure/messaging/websocket_manager.py +51 -35
  181. aiecs/infrastructure/monitoring/__init__.py +22 -0
  182. aiecs/infrastructure/monitoring/executor_metrics.py +45 -11
  183. aiecs/infrastructure/monitoring/global_metrics_manager.py +212 -0
  184. aiecs/infrastructure/monitoring/structured_logger.py +3 -7
  185. aiecs/infrastructure/monitoring/tracing_manager.py +63 -35
  186. aiecs/infrastructure/persistence/__init__.py +14 -1
  187. aiecs/infrastructure/persistence/context_engine_client.py +184 -0
  188. aiecs/infrastructure/persistence/database_manager.py +67 -43
  189. aiecs/infrastructure/persistence/file_storage.py +180 -103
  190. aiecs/infrastructure/persistence/redis_client.py +74 -21
  191. aiecs/llm/__init__.py +73 -25
  192. aiecs/llm/callbacks/__init__.py +11 -0
  193. aiecs/llm/{custom_callbacks.py → callbacks/custom_callbacks.py} +26 -19
  194. aiecs/llm/client_factory.py +224 -36
  195. aiecs/llm/client_resolver.py +155 -0
  196. aiecs/llm/clients/__init__.py +38 -0
  197. aiecs/llm/clients/base_client.py +324 -0
  198. aiecs/llm/clients/google_function_calling_mixin.py +457 -0
  199. aiecs/llm/clients/googleai_client.py +241 -0
  200. aiecs/llm/clients/openai_client.py +158 -0
  201. aiecs/llm/clients/openai_compatible_mixin.py +367 -0
  202. aiecs/llm/clients/vertex_client.py +897 -0
  203. aiecs/llm/clients/xai_client.py +201 -0
  204. aiecs/llm/config/__init__.py +51 -0
  205. aiecs/llm/config/config_loader.py +272 -0
  206. aiecs/llm/config/config_validator.py +206 -0
  207. aiecs/llm/config/model_config.py +143 -0
  208. aiecs/llm/protocols.py +149 -0
  209. aiecs/llm/utils/__init__.py +10 -0
  210. aiecs/llm/utils/validate_config.py +89 -0
  211. aiecs/main.py +140 -121
  212. aiecs/scripts/aid/VERSION_MANAGEMENT.md +138 -0
  213. aiecs/scripts/aid/__init__.py +19 -0
  214. aiecs/scripts/aid/module_checker.py +499 -0
  215. aiecs/scripts/aid/version_manager.py +235 -0
  216. aiecs/scripts/{DEPENDENCY_SYSTEM_SUMMARY.md → dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md} +1 -0
  217. aiecs/scripts/{README_DEPENDENCY_CHECKER.md → dependance_check/README_DEPENDENCY_CHECKER.md} +1 -0
  218. aiecs/scripts/dependance_check/__init__.py +15 -0
  219. aiecs/scripts/dependance_check/dependency_checker.py +1835 -0
  220. aiecs/scripts/{dependency_fixer.py → dependance_check/dependency_fixer.py} +192 -90
  221. aiecs/scripts/{download_nlp_data.py → dependance_check/download_nlp_data.py} +203 -71
  222. aiecs/scripts/dependance_patch/__init__.py +7 -0
  223. aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
  224. aiecs/scripts/{fix_weasel_validator.py → dependance_patch/fix_weasel/fix_weasel_validator.py} +21 -14
  225. aiecs/scripts/{patch_weasel_library.sh → dependance_patch/fix_weasel/patch_weasel_library.sh} +1 -1
  226. aiecs/scripts/knowledge_graph/__init__.py +3 -0
  227. aiecs/scripts/knowledge_graph/run_threshold_experiments.py +212 -0
  228. aiecs/scripts/migrations/multi_tenancy/README.md +142 -0
  229. aiecs/scripts/tools_develop/README.md +671 -0
  230. aiecs/scripts/tools_develop/README_CONFIG_CHECKER.md +273 -0
  231. aiecs/scripts/tools_develop/TOOLS_CONFIG_GUIDE.md +1287 -0
  232. aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
  233. aiecs/scripts/tools_develop/__init__.py +21 -0
  234. aiecs/scripts/tools_develop/check_all_tools_config.py +548 -0
  235. aiecs/scripts/tools_develop/check_type_annotations.py +257 -0
  236. aiecs/scripts/tools_develop/pre-commit-schema-coverage.sh +66 -0
  237. aiecs/scripts/tools_develop/schema_coverage.py +511 -0
  238. aiecs/scripts/tools_develop/validate_tool_schemas.py +475 -0
  239. aiecs/scripts/tools_develop/verify_executor_config_fix.py +98 -0
  240. aiecs/scripts/tools_develop/verify_tools.py +352 -0
  241. aiecs/tasks/__init__.py +0 -1
  242. aiecs/tasks/worker.py +115 -47
  243. aiecs/tools/__init__.py +194 -72
  244. aiecs/tools/apisource/__init__.py +99 -0
  245. aiecs/tools/apisource/intelligence/__init__.py +19 -0
  246. aiecs/tools/apisource/intelligence/data_fusion.py +632 -0
  247. aiecs/tools/apisource/intelligence/query_analyzer.py +417 -0
  248. aiecs/tools/apisource/intelligence/search_enhancer.py +385 -0
  249. aiecs/tools/apisource/monitoring/__init__.py +9 -0
  250. aiecs/tools/apisource/monitoring/metrics.py +330 -0
  251. aiecs/tools/apisource/providers/__init__.py +112 -0
  252. aiecs/tools/apisource/providers/base.py +671 -0
  253. aiecs/tools/apisource/providers/census.py +397 -0
  254. aiecs/tools/apisource/providers/fred.py +535 -0
  255. aiecs/tools/apisource/providers/newsapi.py +409 -0
  256. aiecs/tools/apisource/providers/worldbank.py +352 -0
  257. aiecs/tools/apisource/reliability/__init__.py +12 -0
  258. aiecs/tools/apisource/reliability/error_handler.py +363 -0
  259. aiecs/tools/apisource/reliability/fallback_strategy.py +376 -0
  260. aiecs/tools/apisource/tool.py +832 -0
  261. aiecs/tools/apisource/utils/__init__.py +9 -0
  262. aiecs/tools/apisource/utils/validators.py +334 -0
  263. aiecs/tools/base_tool.py +415 -21
  264. aiecs/tools/docs/__init__.py +121 -0
  265. aiecs/tools/docs/ai_document_orchestrator.py +607 -0
  266. aiecs/tools/docs/ai_document_writer_orchestrator.py +2350 -0
  267. aiecs/tools/docs/content_insertion_tool.py +1320 -0
  268. aiecs/tools/docs/document_creator_tool.py +1323 -0
  269. aiecs/tools/docs/document_layout_tool.py +1160 -0
  270. aiecs/tools/docs/document_parser_tool.py +1011 -0
  271. aiecs/tools/docs/document_writer_tool.py +1829 -0
  272. aiecs/tools/knowledge_graph/__init__.py +17 -0
  273. aiecs/tools/knowledge_graph/graph_reasoning_tool.py +807 -0
  274. aiecs/tools/knowledge_graph/graph_search_tool.py +944 -0
  275. aiecs/tools/knowledge_graph/kg_builder_tool.py +524 -0
  276. aiecs/tools/langchain_adapter.py +300 -138
  277. aiecs/tools/schema_generator.py +455 -0
  278. aiecs/tools/search_tool/__init__.py +100 -0
  279. aiecs/tools/search_tool/analyzers.py +581 -0
  280. aiecs/tools/search_tool/cache.py +264 -0
  281. aiecs/tools/search_tool/constants.py +128 -0
  282. aiecs/tools/search_tool/context.py +224 -0
  283. aiecs/tools/search_tool/core.py +778 -0
  284. aiecs/tools/search_tool/deduplicator.py +119 -0
  285. aiecs/tools/search_tool/error_handler.py +242 -0
  286. aiecs/tools/search_tool/metrics.py +343 -0
  287. aiecs/tools/search_tool/rate_limiter.py +172 -0
  288. aiecs/tools/search_tool/schemas.py +275 -0
  289. aiecs/tools/statistics/__init__.py +80 -0
  290. aiecs/tools/statistics/ai_data_analysis_orchestrator.py +646 -0
  291. aiecs/tools/statistics/ai_insight_generator_tool.py +508 -0
  292. aiecs/tools/statistics/ai_report_orchestrator_tool.py +684 -0
  293. aiecs/tools/statistics/data_loader_tool.py +555 -0
  294. aiecs/tools/statistics/data_profiler_tool.py +638 -0
  295. aiecs/tools/statistics/data_transformer_tool.py +580 -0
  296. aiecs/tools/statistics/data_visualizer_tool.py +498 -0
  297. aiecs/tools/statistics/model_trainer_tool.py +507 -0
  298. aiecs/tools/statistics/statistical_analyzer_tool.py +472 -0
  299. aiecs/tools/task_tools/__init__.py +49 -36
  300. aiecs/tools/task_tools/chart_tool.py +200 -184
  301. aiecs/tools/task_tools/classfire_tool.py +268 -267
  302. aiecs/tools/task_tools/image_tool.py +175 -131
  303. aiecs/tools/task_tools/office_tool.py +226 -146
  304. aiecs/tools/task_tools/pandas_tool.py +477 -121
  305. aiecs/tools/task_tools/report_tool.py +390 -142
  306. aiecs/tools/task_tools/research_tool.py +149 -79
  307. aiecs/tools/task_tools/scraper_tool.py +339 -145
  308. aiecs/tools/task_tools/stats_tool.py +448 -209
  309. aiecs/tools/temp_file_manager.py +26 -24
  310. aiecs/tools/tool_executor/__init__.py +18 -16
  311. aiecs/tools/tool_executor/tool_executor.py +364 -52
  312. aiecs/utils/LLM_output_structor.py +74 -48
  313. aiecs/utils/__init__.py +14 -3
  314. aiecs/utils/base_callback.py +0 -3
  315. aiecs/utils/cache_provider.py +696 -0
  316. aiecs/utils/execution_utils.py +50 -31
  317. aiecs/utils/prompt_loader.py +1 -0
  318. aiecs/utils/token_usage_repository.py +37 -11
  319. aiecs/ws/socket_server.py +14 -4
  320. {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/METADATA +52 -15
  321. aiecs-1.7.6.dist-info/RECORD +337 -0
  322. aiecs-1.7.6.dist-info/entry_points.txt +13 -0
  323. aiecs/config/registry.py +0 -19
  324. aiecs/domain/context/content_engine.py +0 -982
  325. aiecs/llm/base_client.py +0 -99
  326. aiecs/llm/openai_client.py +0 -125
  327. aiecs/llm/vertex_client.py +0 -186
  328. aiecs/llm/xai_client.py +0 -184
  329. aiecs/scripts/dependency_checker.py +0 -857
  330. aiecs/scripts/quick_dependency_check.py +0 -269
  331. aiecs/tools/task_tools/search_api.py +0 -7
  332. aiecs-1.0.1.dist-info/RECORD +0 -90
  333. aiecs-1.0.1.dist-info/entry_points.txt +0 -7
  334. /aiecs/scripts/{setup_nlp_data.sh → dependance_check/setup_nlp_data.sh} +0 -0
  335. /aiecs/scripts/{README_WEASEL_PATCH.md → dependance_patch/fix_weasel/README_WEASEL_PATCH.md} +0 -0
  336. /aiecs/scripts/{fix_weasel_validator.sh → dependance_patch/fix_weasel/fix_weasel_validator.sh} +0 -0
  337. /aiecs/scripts/{run_weasel_patch.sh → dependance_patch/fix_weasel/run_weasel_patch.sh} +0 -0
  338. {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/WHEEL +0 -0
  339. {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/licenses/LICENSE +0 -0
  340. {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,376 @@
1
+ """
2
+ Intelligent Fallback Strategy for API Providers
3
+
4
+ Provides automatic provider failover:
5
+ - Define fallback chains between providers
6
+ - Map equivalent operations across providers
7
+ - Convert parameters between provider formats
8
+ - Track fallback attempts and success rates
9
+ """
10
+
11
+ import logging
12
+ from typing import Any, Callable, Dict, List, cast
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class FallbackStrategy:
18
+ """
19
+ Manages fallback logic when primary providers fail.
20
+
21
+ Automatically retries with alternative providers when a request fails,
22
+ handling operation mapping and parameter conversion.
23
+ """
24
+
25
+ # Provider fallback chains: primary -> [fallbacks]
26
+ FALLBACK_MAP = {
27
+ "fred": ["worldbank"], # FRED -> World Bank for economic data
28
+ "worldbank": [], # World Bank has no fallback
29
+ "newsapi": [], # News API has no fallback
30
+ "census": ["worldbank"], # Census -> World Bank for demographic data
31
+ }
32
+
33
+ # Operation mappings: (provider, operation) -> [(fallback_provider,
34
+ # fallback_operation)]
35
+ OPERATION_MAP = {
36
+ ("fred", "get_series"): [("worldbank", "get_indicator")],
37
+ ("fred", "get_series_observations"): [("worldbank", "get_indicator")],
38
+ ("fred", "search_series"): [("worldbank", "search_indicators")],
39
+ ("census", "get_population"): [("worldbank", "get_indicator")],
40
+ ("census", "get_acs_data"): [("worldbank", "get_indicator")],
41
+ }
42
+
43
+ # Parameter conversion rules
44
+ PARAMETER_CONVERSIONS = {
45
+ ("fred", "worldbank"): {
46
+ "series_id": "indicator_code",
47
+ "observation_start": "date", # Note: will need special handling
48
+ "observation_end": "date",
49
+ "limit": "per_page",
50
+ },
51
+ ("census", "worldbank"): {
52
+ "variables": "indicator_code",
53
+ # Note: needs conversion (e.g., 'state:*' -> 'US')
54
+ "geography": "country_code",
55
+ },
56
+ }
57
+
58
+ def __init__(self):
59
+ """Initialize fallback strategy"""
60
+ self.fallback_stats = {} # Track fallback success rates
61
+
62
+ def execute_with_fallback(
63
+ self,
64
+ primary_provider: str,
65
+ operation: str,
66
+ params: Dict[str, Any],
67
+ provider_executor: Callable[[str, str, Dict[str, Any]], Dict[str, Any]],
68
+ providers_available: List[str],
69
+ ) -> Dict[str, Any]:
70
+ """
71
+ Execute operation with automatic fallback to alternative providers.
72
+
73
+ Args:
74
+ primary_provider: Primary provider name
75
+ operation: Operation name
76
+ params: Operation parameters
77
+ provider_executor: Function to execute provider operation:
78
+ (provider, operation, params) -> result
79
+ providers_available: List of available provider names
80
+
81
+ Returns:
82
+ Result dictionary with:
83
+ - success: bool
84
+ - data: result data if successful
85
+ - attempts: list of attempt information
86
+ - fallback_used: bool
87
+ """
88
+ result: Dict[str, Any] = {
89
+ "success": False,
90
+ "data": None,
91
+ "attempts": [],
92
+ "fallback_used": False,
93
+ }
94
+
95
+ # Try primary provider
96
+ try:
97
+ logger.info(f"Attempting primary provider: {primary_provider}.{operation}")
98
+ data = provider_executor(primary_provider, operation, params)
99
+
100
+ result["success"] = True
101
+ result["data"] = data
102
+ attempts = cast(List[Dict[str, Any]], result["attempts"])
103
+ attempts.append(
104
+ {
105
+ "provider": primary_provider,
106
+ "operation": operation,
107
+ "status": "success",
108
+ }
109
+ )
110
+
111
+ return result
112
+
113
+ except Exception as primary_error:
114
+ logger.warning(f"Primary provider {primary_provider}.{operation} failed: {primary_error}")
115
+ attempts = cast(List[Dict[str, Any]], result["attempts"])
116
+ attempts.append(
117
+ {
118
+ "provider": primary_provider,
119
+ "operation": operation,
120
+ "status": "failed",
121
+ "error": str(primary_error),
122
+ }
123
+ )
124
+
125
+ # Get fallback providers
126
+ fallback_providers = self.FALLBACK_MAP.get(primary_provider, [])
127
+
128
+ if not fallback_providers:
129
+ logger.info(f"No fallback providers configured for {primary_provider}")
130
+ return result
131
+
132
+ # Try each fallback provider
133
+ for fallback_provider in fallback_providers:
134
+ if fallback_provider not in providers_available:
135
+ logger.debug(f"Fallback provider {fallback_provider} not available")
136
+ continue
137
+
138
+ # Find equivalent operation
139
+ fallback_operations = self._get_fallback_operations(primary_provider, operation, fallback_provider)
140
+
141
+ if not fallback_operations:
142
+ logger.debug(f"No operation mapping from {primary_provider}.{operation} " f"to {fallback_provider}")
143
+ continue
144
+
145
+ # Try each mapped operation
146
+ for fallback_op in fallback_operations:
147
+ try:
148
+ logger.info(f"Attempting fallback: {fallback_provider}.{fallback_op}")
149
+
150
+ # Convert parameters
151
+ converted_params = self._convert_parameters(primary_provider, fallback_provider, params)
152
+
153
+ # Execute fallback
154
+ data = provider_executor(fallback_provider, fallback_op, converted_params)
155
+
156
+ # Success!
157
+ result["success"] = True
158
+ result["data"] = data
159
+ result["fallback_used"] = True
160
+ attempts = cast(List[Dict[str, Any]], result["attempts"])
161
+ attempts.append(
162
+ {
163
+ "provider": fallback_provider,
164
+ "operation": fallback_op,
165
+ "status": "success",
166
+ }
167
+ )
168
+
169
+ # Add fallback warning to metadata
170
+ if isinstance(data, dict) and "metadata" in data:
171
+ data["metadata"]["fallback_warning"] = f"Primary provider {primary_provider} failed, " f"using fallback {fallback_provider}"
172
+ data["metadata"]["original_provider"] = primary_provider
173
+ data["metadata"]["original_operation"] = operation
174
+
175
+ # Update success stats
176
+ self._update_stats(fallback_provider, fallback_op, success=True)
177
+
178
+ logger.info(f"Fallback successful: {fallback_provider}.{fallback_op}")
179
+
180
+ return result
181
+
182
+ except Exception as fallback_error:
183
+ logger.warning(f"Fallback {fallback_provider}.{fallback_op} failed: " f"{fallback_error}")
184
+ attempts = cast(List[Dict[str, Any]], result["attempts"])
185
+ attempts.append(
186
+ {
187
+ "provider": fallback_provider,
188
+ "operation": fallback_op,
189
+ "status": "failed",
190
+ "error": str(fallback_error),
191
+ }
192
+ )
193
+
194
+ # Update failure stats
195
+ self._update_stats(fallback_provider, fallback_op, success=False)
196
+
197
+ # All attempts failed
198
+ logger.error(f"All providers failed for operation {operation}. " f"Attempts: {len(result['attempts'])}")
199
+
200
+ return result
201
+
202
+ def _get_fallback_operations(self, primary_provider: str, operation: str, fallback_provider: str) -> List[str]:
203
+ """
204
+ Get equivalent operations in fallback provider.
205
+
206
+ Args:
207
+ primary_provider: Primary provider name
208
+ operation: Operation name
209
+ fallback_provider: Fallback provider name
210
+
211
+ Returns:
212
+ List of equivalent operation names
213
+ """
214
+ key = (primary_provider, operation)
215
+ mappings = self.OPERATION_MAP.get(key, [])
216
+
217
+ # Filter for specific fallback provider
218
+ fallback_ops = [op for provider, op in mappings if provider == fallback_provider]
219
+
220
+ return fallback_ops
221
+
222
+ def _convert_parameters(
223
+ self,
224
+ source_provider: str,
225
+ target_provider: str,
226
+ params: Dict[str, Any],
227
+ ) -> Dict[str, Any]:
228
+ """
229
+ Convert parameters from source to target provider format.
230
+
231
+ Args:
232
+ source_provider: Source provider name
233
+ target_provider: Target provider name
234
+ params: Original parameters
235
+
236
+ Returns:
237
+ Converted parameters
238
+ """
239
+ conversion_key = (source_provider, target_provider)
240
+ conversion_rules = self.PARAMETER_CONVERSIONS.get(conversion_key, {})
241
+
242
+ converted = {}
243
+
244
+ for source_param, value in params.items():
245
+ # Check if there's a conversion rule
246
+ if source_param in conversion_rules:
247
+ target_param = conversion_rules[source_param]
248
+
249
+ # Apply special conversions
250
+ converted_value = self._convert_parameter_value(
251
+ source_provider,
252
+ target_provider,
253
+ source_param,
254
+ target_param,
255
+ value,
256
+ )
257
+
258
+ converted[target_param] = converted_value
259
+ else:
260
+ # Keep parameter as-is
261
+ converted[source_param] = value
262
+
263
+ # Add default parameters for target provider
264
+ converted = self._add_default_parameters(target_provider, converted)
265
+
266
+ return converted
267
+
268
+ def _convert_parameter_value(
269
+ self,
270
+ source_provider: str,
271
+ target_provider: str,
272
+ source_param: str,
273
+ target_param: str,
274
+ value: Any,
275
+ ) -> Any:
276
+ """
277
+ Convert parameter value between provider formats.
278
+
279
+ Args:
280
+ source_provider: Source provider
281
+ target_provider: Target provider
282
+ source_param: Source parameter name
283
+ target_param: Target parameter name
284
+ value: Original value
285
+
286
+ Returns:
287
+ Converted value
288
+ """
289
+ # FRED -> World Bank conversions
290
+ if source_provider == "fred" and target_provider == "worldbank":
291
+ if source_param == "series_id":
292
+ # Try to map common FRED series to World Bank indicators
293
+ series_map = {
294
+ "GDP": "NY.GDP.MKTP.CD",
295
+ "GDPC1": "NY.GDP.MKTP.KD",
296
+ "UNRATE": "SL.UEM.TOTL.NE.ZS",
297
+ "CPIAUCSL": "FP.CPI.TOTL",
298
+ "CPILFESL": "FP.CPI.TOTL",
299
+ }
300
+ return series_map.get(value, value)
301
+
302
+ elif source_param in ["observation_start", "observation_end"]:
303
+ # Convert to World Bank date format (year or year:year)
304
+ # Extract year from date string
305
+ if isinstance(value, str) and len(value) >= 4:
306
+ return value[:4]
307
+
308
+ # Census -> World Bank conversions
309
+ elif source_provider == "census" and target_provider == "worldbank":
310
+ if source_param == "geography":
311
+ # Convert census geography to country code
312
+ if "state" in str(value).lower():
313
+ return "US" # US country code
314
+
315
+ return value
316
+
317
+ def _add_default_parameters(self, provider: str, params: Dict[str, Any]) -> Dict[str, Any]:
318
+ """
319
+ Add default parameters required by provider.
320
+
321
+ Args:
322
+ provider: Provider name
323
+ params: Current parameters
324
+
325
+ Returns:
326
+ Parameters with defaults added
327
+ """
328
+ if provider == "worldbank":
329
+ # World Bank needs country code
330
+ if "country_code" not in params:
331
+ params["country_code"] = "US" # Default to US
332
+
333
+ return params
334
+
335
+ def _update_stats(self, provider: str, operation: str, success: bool):
336
+ """
337
+ Update fallback success statistics.
338
+
339
+ Args:
340
+ provider: Provider name
341
+ operation: Operation name
342
+ success: Whether attempt was successful
343
+ """
344
+ key = f"{provider}.{operation}"
345
+
346
+ if key not in self.fallback_stats:
347
+ self.fallback_stats[key] = {
348
+ "attempts": 0,
349
+ "successes": 0,
350
+ "failures": 0,
351
+ }
352
+
353
+ self.fallback_stats[key]["attempts"] += 1
354
+ if success:
355
+ self.fallback_stats[key]["successes"] += 1
356
+ else:
357
+ self.fallback_stats[key]["failures"] += 1
358
+
359
+ def get_fallback_stats(self) -> Dict[str, Any]:
360
+ """
361
+ Get fallback statistics.
362
+
363
+ Returns:
364
+ Dictionary with fallback statistics
365
+ """
366
+ stats = {}
367
+ for key, data in self.fallback_stats.items():
368
+ success_rate = data["successes"] / data["attempts"] if data["attempts"] > 0 else 0.0
369
+ stats[key] = {
370
+ "attempts": data["attempts"],
371
+ "successes": data["successes"],
372
+ "failures": data["failures"],
373
+ "success_rate": round(success_rate, 3),
374
+ }
375
+
376
+ return stats