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,363 @@
1
+ """
2
+ Smart Error Handler for API Providers
3
+
4
+ Provides intelligent error handling with:
5
+ - Classification of retryable vs non-retryable errors
6
+ - Exponential backoff retry strategy
7
+ - Agent-friendly error messages with recovery suggestions
8
+ - Detailed error context and history
9
+ """
10
+
11
+ import logging
12
+ import time
13
+ from datetime import datetime
14
+ from typing import Any, Callable, Dict, List
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ class SmartErrorHandler:
20
+ """
21
+ Intelligent error handler with retry logic and recovery suggestions.
22
+
23
+ Automatically classifies errors, applies appropriate retry strategies,
24
+ and provides actionable recovery suggestions for AI agents.
25
+ """
26
+
27
+ # Error types that can be retried
28
+ RETRYABLE_ERRORS = [
29
+ "timeout",
30
+ "connection",
31
+ "rate limit",
32
+ "rate_limit",
33
+ "429", # Too Many Requests
34
+ "500", # Internal Server Error
35
+ "502", # Bad Gateway
36
+ "503", # Service Unavailable
37
+ "504", # Gateway Timeout
38
+ "temporary",
39
+ "transient",
40
+ ]
41
+
42
+ # Error types that should not be retried
43
+ NON_RETRYABLE_ERRORS = [
44
+ "authentication",
45
+ "auth",
46
+ "api key",
47
+ "unauthorized",
48
+ "401", # Unauthorized
49
+ "403", # Forbidden
50
+ "invalid",
51
+ "not found",
52
+ "404", # Not Found
53
+ "bad request",
54
+ "400", # Bad Request
55
+ ]
56
+
57
+ def __init__(
58
+ self,
59
+ max_retries: int = 3,
60
+ backoff_factor: float = 2.0,
61
+ initial_delay: float = 1.0,
62
+ max_delay: float = 30.0,
63
+ ):
64
+ """
65
+ Initialize error handler.
66
+
67
+ Args:
68
+ max_retries: Maximum number of retry attempts
69
+ backoff_factor: Multiplier for exponential backoff
70
+ initial_delay: Initial delay in seconds before first retry
71
+ max_delay: Maximum delay between retries in seconds
72
+ """
73
+ self.max_retries = max_retries
74
+ self.backoff_factor = backoff_factor
75
+ self.initial_delay = initial_delay
76
+ self.max_delay = max_delay
77
+
78
+ def execute_with_retry(
79
+ self,
80
+ operation_func: Callable[[], Any],
81
+ operation_name: str = "operation",
82
+ provider_name: str = "provider",
83
+ ) -> Dict[str, Any]:
84
+ """
85
+ Execute an operation with intelligent retry logic.
86
+
87
+ Args:
88
+ operation_func: Function to execute (should take no arguments)
89
+ operation_name: Name of the operation for logging
90
+ provider_name: Name of the provider for logging
91
+
92
+ Returns:
93
+ Dictionary with:
94
+ - success: bool
95
+ - data: result data if successful
96
+ - error: error details if failed
97
+ - retry_info: retry attempt information
98
+ """
99
+ last_error = None
100
+ retry_info: Dict[str, Any] = {"attempts": 0, "errors": [], "recovery_suggestions": []}
101
+
102
+ for attempt in range(self.max_retries):
103
+ retry_info["attempts"] = attempt + 1
104
+
105
+ try:
106
+ # Execute the operation
107
+ result = operation_func()
108
+
109
+ # Success!
110
+ if attempt > 0:
111
+ logger.info(f"{provider_name}.{operation_name} succeeded after " f"{attempt + 1} attempts")
112
+
113
+ return {
114
+ "success": True,
115
+ "data": result,
116
+ "retry_info": retry_info,
117
+ }
118
+
119
+ except Exception as e:
120
+ last_error = e
121
+ error_msg = str(e).lower()
122
+ error_type = self._classify_error(e, error_msg)
123
+
124
+ # Record this error
125
+ retry_info["errors"].append(
126
+ {
127
+ "attempt": attempt + 1,
128
+ "error": str(e),
129
+ "error_type": error_type,
130
+ "timestamp": datetime.utcnow().isoformat(),
131
+ }
132
+ )
133
+
134
+ # Determine if we should retry
135
+ is_retryable = self._is_retryable(error_msg, error_type)
136
+ is_last_attempt = attempt == self.max_retries - 1
137
+
138
+ if not is_retryable:
139
+ logger.warning(f"{provider_name}.{operation_name} failed with non-retryable " f"error: {error_type}")
140
+ break
141
+
142
+ if is_last_attempt:
143
+ logger.error(f"{provider_name}.{operation_name} failed after " f"{self.max_retries} attempts")
144
+ break
145
+
146
+ # Calculate wait time with exponential backoff
147
+ wait_time = min(
148
+ self.initial_delay * (self.backoff_factor**attempt),
149
+ self.max_delay,
150
+ )
151
+
152
+ logger.info(f"{provider_name}.{operation_name} attempt {attempt + 1} failed " f"({error_type}), retrying in {wait_time:.1f}s...")
153
+
154
+ time.sleep(wait_time)
155
+
156
+ # All retries exhausted or non-retryable error
157
+ if last_error is None:
158
+ # This should never happen, but handle it gracefully
159
+ last_error = Exception("Unknown error occurred")
160
+
161
+ retry_info["recovery_suggestions"] = self._generate_recovery_suggestions(last_error, operation_name, provider_name)
162
+
163
+ return {
164
+ "success": False,
165
+ "error": {
166
+ "type": type(last_error).__name__,
167
+ "message": str(last_error),
168
+ "details": self._parse_error_details(last_error),
169
+ "is_retryable": self._is_retryable(
170
+ str(last_error).lower(),
171
+ self._classify_error(last_error, str(last_error).lower()),
172
+ ),
173
+ },
174
+ "retry_info": retry_info,
175
+ }
176
+
177
+ def _classify_error(self, error: Exception, error_msg: str) -> str:
178
+ """
179
+ Classify error type.
180
+
181
+ Args:
182
+ error: The exception object
183
+ error_msg: Error message in lowercase
184
+
185
+ Returns:
186
+ Error classification string
187
+ """
188
+ # Check exception type
189
+ error_class = type(error).__name__.lower()
190
+
191
+ if "timeout" in error_class or "timeout" in error_msg:
192
+ return "timeout"
193
+ elif "connection" in error_class or "connection" in error_msg:
194
+ return "connection"
195
+ elif "rate" in error_msg and "limit" in error_msg:
196
+ return "rate_limit"
197
+ elif "429" in error_msg:
198
+ return "rate_limit"
199
+ elif "auth" in error_msg or "401" in error_msg or "403" in error_msg:
200
+ return "authentication"
201
+ elif "not found" in error_msg or "404" in error_msg:
202
+ return "not_found"
203
+ elif "bad request" in error_msg or "400" in error_msg:
204
+ return "invalid_parameter"
205
+ elif "500" in error_msg or "502" in error_msg or "503" in error_msg or "504" in error_msg:
206
+ return "server_error"
207
+ elif "invalid" in error_msg:
208
+ return "invalid_parameter"
209
+ else:
210
+ return "unknown"
211
+
212
+ def _is_retryable(self, error_msg: str, error_type: str) -> bool:
213
+ """
214
+ Determine if an error is retryable.
215
+
216
+ Args:
217
+ error_msg: Error message in lowercase
218
+ error_type: Classified error type
219
+
220
+ Returns:
221
+ True if error is retryable
222
+ """
223
+ # Check non-retryable first (higher priority)
224
+ for non_retryable in self.NON_RETRYABLE_ERRORS:
225
+ if non_retryable in error_msg or non_retryable in error_type:
226
+ return False
227
+
228
+ # Check retryable
229
+ for retryable in self.RETRYABLE_ERRORS:
230
+ if retryable in error_msg or retryable in error_type:
231
+ return True
232
+
233
+ # Default: retry server errors and unknown errors
234
+ return error_type in [
235
+ "server_error",
236
+ "timeout",
237
+ "connection",
238
+ "rate_limit",
239
+ ]
240
+
241
+ def _parse_error_details(self, error: Exception) -> Dict[str, Any]:
242
+ """
243
+ Extract detailed information from error.
244
+
245
+ Args:
246
+ error: The exception object
247
+
248
+ Returns:
249
+ Dictionary with error details
250
+ """
251
+ details = {"class": type(error).__name__, "message": str(error)}
252
+
253
+ # Extract HTTP status code if available
254
+ if hasattr(error, "response") and hasattr(error.response, "status_code"):
255
+ details["status_code"] = error.response.status_code
256
+ if hasattr(error.response, "text"):
257
+ # Limit size
258
+ details["response_body"] = error.response.text[:500]
259
+
260
+ # Extract additional context
261
+ if hasattr(error, "__cause__") and error.__cause__:
262
+ details["cause"] = str(error.__cause__)
263
+
264
+ return details
265
+
266
+ def _generate_recovery_suggestions(self, error: Exception, operation_name: str, provider_name: str) -> List[str]:
267
+ """
268
+ Generate actionable recovery suggestions for the error.
269
+
270
+ Args:
271
+ error: The exception object
272
+ operation_name: Name of the failed operation
273
+ provider_name: Name of the provider
274
+
275
+ Returns:
276
+ List of recovery suggestion strings
277
+ """
278
+ suggestions = []
279
+ error_msg = str(error).lower()
280
+ error_type = self._classify_error(error, error_msg)
281
+
282
+ if error_type == "authentication":
283
+ suggestions.extend(
284
+ [
285
+ f"Check that your {provider_name.upper()} API key is valid and properly configured",
286
+ f"Verify the API key environment variable {provider_name.upper()}_API_KEY is set",
287
+ "Confirm the API key has not expired or been revoked",
288
+ f"Ensure you have the necessary permissions for the {operation_name} operation",
289
+ ]
290
+ )
291
+
292
+ elif error_type == "rate_limit":
293
+ suggestions.extend(
294
+ [
295
+ "Wait before making more requests (rate limit exceeded)",
296
+ "Consider using a different provider if available",
297
+ "Reduce the frequency of requests or implement request batching",
298
+ "Check if you can upgrade your API plan for higher rate limits",
299
+ "Enable caching to reduce API calls",
300
+ ]
301
+ )
302
+
303
+ elif error_type == "not_found":
304
+ suggestions.extend(
305
+ [
306
+ f"Verify the resource ID or parameter values are correct for {provider_name}",
307
+ "Use the search or list operations to find valid resource IDs",
308
+ "Check that the resource exists and is accessible with your credentials",
309
+ f"Review the {provider_name} API documentation for correct resource identifiers",
310
+ ]
311
+ )
312
+
313
+ elif error_type == "invalid_parameter":
314
+ suggestions.extend(
315
+ [
316
+ f"Check the operation schema for {operation_name} to see required parameters",
317
+ "Review parameter types and value formats",
318
+ f"Use get_operation_schema('{operation_name}') to see valid parameters and examples",
319
+ "Verify parameter names are spelled correctly",
320
+ ]
321
+ )
322
+
323
+ elif error_type == "timeout":
324
+ suggestions.extend(
325
+ [
326
+ "Try again with a smaller date range or result limit",
327
+ "Increase the timeout setting in the provider configuration",
328
+ "Check your network connection",
329
+ "The API service may be experiencing high load, try again later",
330
+ ]
331
+ )
332
+
333
+ elif error_type == "connection":
334
+ suggestions.extend(
335
+ [
336
+ "Check your internet connection",
337
+ "Verify the API endpoint is accessible",
338
+ "Check if there are any firewall or proxy issues",
339
+ "The API service may be temporarily unavailable",
340
+ ]
341
+ )
342
+
343
+ elif error_type == "server_error":
344
+ suggestions.extend(
345
+ [
346
+ "The API service is experiencing issues, try again later",
347
+ "Check the API status page for known outages",
348
+ "Try a different provider if available",
349
+ "Reduce the complexity of your request",
350
+ ]
351
+ )
352
+
353
+ else:
354
+ suggestions.extend(
355
+ [
356
+ "Review the error message for specific details",
357
+ f"Check the {provider_name} API documentation for {operation_name}",
358
+ "Verify all required parameters are provided",
359
+ "Try a simpler query to isolate the issue",
360
+ ]
361
+ )
362
+
363
+ return suggestions