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,455 @@
1
+ """
2
+ Automatic Schema Generation Tool
3
+
4
+ Automatically generate Pydantic Schema from method signatures and type annotations
5
+ """
6
+
7
+ import inspect
8
+ import logging
9
+ import re
10
+ from typing import Any, Dict, Optional, Type, get_type_hints, Callable, List, Union, get_origin, get_args
11
+ from pydantic import BaseModel, Field, create_model, ConfigDict, ValidationError
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ def _normalize_type(param_type: Type) -> Type:
17
+ """
18
+ Normalize types, handle unsupported types and generics
19
+
20
+ Map complex types like pandas.DataFrame, pandas.Series to Any.
21
+ Handle generics like List[T], Dict[K, V], Optional[T], Union[T, U].
22
+ """
23
+ # Handle None type
24
+ if param_type is type(None):
25
+ return Any
26
+
27
+ # Handle generics (List, Dict, Optional, Union, etc.)
28
+ origin = get_origin(param_type)
29
+ if origin is not None:
30
+ # Handle Optional[T] which is Union[T, None]
31
+ if origin is Union:
32
+ args = get_args(param_type)
33
+ # Filter out None type
34
+ non_none_args = [arg for arg in args if arg is not type(None)]
35
+ if len(non_none_args) == 1:
36
+ # Optional[T] -> normalize T
37
+ return _normalize_type(non_none_args[0])
38
+ elif len(non_none_args) > 1:
39
+ # Union[T, U, ...] -> Any (too complex)
40
+ return Any
41
+ else:
42
+ # Union[None] -> Any
43
+ return Any
44
+
45
+ # Handle List[T], Dict[K, V], Tuple[T, ...], etc.
46
+ # For now, simplify to List[Any] or Dict[str, Any]
47
+ if origin is list or origin is List:
48
+ return List[Any]
49
+ elif origin is dict or origin is Dict:
50
+ return Dict[str, Any]
51
+ else:
52
+ # Other generics -> Any
53
+ return Any
54
+
55
+ # Get type name
56
+ type_name = getattr(param_type, "__name__", str(param_type))
57
+ type_str = str(param_type)
58
+
59
+ # Check if it's a pandas type
60
+ if "DataFrame" in type_name or "Series" in type_name or "pandas" in type_str.lower():
61
+ return Any
62
+
63
+ # Check for other complex types that might not be supported
64
+ # numpy arrays, scipy types, etc.
65
+ if "numpy" in type_str.lower() or "scipy" in type_str.lower():
66
+ return Any
67
+
68
+ # Check for callable types (functions)
69
+ if "Callable" in type_str or callable(param_type) and not isinstance(param_type, type):
70
+ return Any
71
+
72
+ return param_type
73
+
74
+
75
+ def _extract_param_description_from_docstring(docstring: str, param_name: str) -> Optional[str]:
76
+ """
77
+ Extract parameter description from docstring
78
+
79
+ Supported formats:
80
+ - Google style: Args: param_name: description
81
+ - NumPy style: Parameters: param_name : type description
82
+ - Sphinx style: :param param_name: description
83
+ """
84
+ if not docstring:
85
+ return None
86
+
87
+ lines = docstring.split("\n")
88
+ in_args_section = False
89
+ current_param = None
90
+ description_lines: List[str] = []
91
+
92
+ for line in lines:
93
+ stripped = line.strip()
94
+
95
+ # Detect Args/Parameters section (Google/NumPy style)
96
+ if stripped in ["Args:", "Arguments:", "Parameters:"]:
97
+ in_args_section = True
98
+ continue
99
+
100
+ # Detect Sphinx style parameter
101
+ sphinx_pattern = rf":param\s+{re.escape(param_name)}\s*:"
102
+ if re.match(sphinx_pattern, stripped, re.IGNORECASE):
103
+ # Extract description after colon
104
+ parts = stripped.split(":", 2)
105
+ if len(parts) >= 3:
106
+ desc = parts[2].strip()
107
+ if desc:
108
+ return desc
109
+ continue
110
+
111
+ # Detect end of Args section
112
+ if in_args_section and stripped in [
113
+ "Returns:",
114
+ "Raises:",
115
+ "Yields:",
116
+ "Examples:",
117
+ "Note:",
118
+ "Notes:",
119
+ "See Also:",
120
+ "Attributes:",
121
+ ]:
122
+ break
123
+
124
+ if in_args_section:
125
+ # Google style: param_name: description or param_name (type): description
126
+ if ":" in stripped and not stripped.startswith(" "):
127
+ # Save previous parameter
128
+ if current_param == param_name and description_lines:
129
+ return " ".join(description_lines).strip()
130
+
131
+ # Parse new parameter
132
+ parts = stripped.split(":", 1)
133
+ if len(parts) == 2:
134
+ # Remove possible type annotation (type) or [type]
135
+ param_part = parts[0].strip()
136
+ # Handle param_name (type): or param_name [type]:
137
+ param_part = re.sub(r'\s*\([^)]*\)\s*$', '', param_part) # Remove (type)
138
+ param_part = re.sub(r'\s*\[[^\]]*\]\s*$', '', param_part) # Remove [type]
139
+ param_part = param_part.strip()
140
+
141
+ current_param = param_part
142
+ description_lines = [parts[1].strip()]
143
+ elif current_param and stripped:
144
+ # Continue description (indented lines)
145
+ if stripped.startswith(" ") or not stripped:
146
+ description_lines.append(stripped)
147
+ else:
148
+ # New section or parameter, save current if it matches
149
+ if current_param == param_name and description_lines:
150
+ return " ".join(description_lines).strip()
151
+ current_param = None
152
+ description_lines = []
153
+
154
+ # Check last parameter
155
+ if current_param == param_name and description_lines:
156
+ return " ".join(description_lines).strip()
157
+
158
+ # Try NumPy style: param_name : type description
159
+ # This is more lenient and looks for "param_name :" pattern
160
+ numpy_pattern = rf"^{re.escape(param_name)}\s*:\s*(.+)$"
161
+ for line in lines:
162
+ stripped = line.strip()
163
+ match = re.match(numpy_pattern, stripped, re.IGNORECASE)
164
+ if match:
165
+ desc = match.group(1).strip()
166
+ if desc:
167
+ return desc
168
+
169
+ return None
170
+
171
+
172
+ def generate_schema_from_method(method: Callable[..., Any], method_name: str, base_class: Type[BaseModel] = BaseModel) -> Optional[Type[BaseModel]]:
173
+ """
174
+ Automatically generate Pydantic Schema from method signature
175
+
176
+ Args:
177
+ method: Method to generate Schema for
178
+ method_name: Method name
179
+ base_class: Schema base class
180
+
181
+ Returns:
182
+ Generated Pydantic Schema class, returns None if unable to generate
183
+ """
184
+ try:
185
+ # Get method signature
186
+ sig = inspect.signature(method)
187
+
188
+ # Get type annotations
189
+ try:
190
+ type_hints = get_type_hints(method)
191
+ except Exception as e:
192
+ logger.debug(f"Failed to get type hints for {method_name}: {e}")
193
+ type_hints = {}
194
+
195
+ # Get docstring
196
+ docstring = inspect.getdoc(method) or f"Execute {method_name} operation"
197
+
198
+ # Extract short description (first line)
199
+ first_line = docstring.split("\n")[0].strip()
200
+ schema_description = first_line if first_line else f"Execute {method_name} operation"
201
+
202
+ # Build field definitions
203
+ field_definitions = {}
204
+
205
+ for param_name, param in sig.parameters.items():
206
+ # Skip self parameter
207
+ if param_name == "self":
208
+ continue
209
+
210
+ # Get parameter type and normalize
211
+ param_type = type_hints.get(param_name, Any)
212
+
213
+ # Handle Optional[T] explicitly - check if default is None or type is Optional
214
+ has_default = param.default != inspect.Parameter.empty
215
+ default_value = param.default if has_default else inspect.Parameter.empty
216
+
217
+ # Check if type is Optional or Union with None
218
+ origin = get_origin(param_type)
219
+ is_optional = False
220
+ if origin is Union:
221
+ args = get_args(param_type)
222
+ if type(None) in args:
223
+ is_optional = True
224
+ # Extract the non-None type
225
+ non_none_args = [arg for arg in args if arg is not type(None)]
226
+ if non_none_args:
227
+ param_type = non_none_args[0]
228
+
229
+ # Normalize the type
230
+ param_type = _normalize_type(param_type)
231
+
232
+ # If default is None or type is Optional, make it Optional
233
+ if default_value is None or (has_default and default_value == inspect.Parameter.empty and is_optional):
234
+ param_type = Optional[param_type]
235
+ elif has_default and default_value == inspect.Parameter.empty:
236
+ # Parameter with default but not None - use the actual default
237
+ pass
238
+
239
+ # Extract parameter description from docstring
240
+ field_description = _extract_param_description_from_docstring(docstring, param_name)
241
+ if not field_description:
242
+ field_description = f"Parameter {param_name}"
243
+
244
+ # Create Field with proper handling of defaults
245
+ if has_default and default_value != inspect.Parameter.empty:
246
+ if default_value is None:
247
+ # Optional parameter with None default
248
+ field_definitions[param_name] = (
249
+ Optional[param_type],
250
+ Field(default=None, description=field_description),
251
+ )
252
+ else:
253
+ # Parameter with non-None default
254
+ try:
255
+ # Validate default value can be serialized
256
+ field_definitions[param_name] = (
257
+ param_type,
258
+ Field(
259
+ default=default_value,
260
+ description=field_description,
261
+ ),
262
+ )
263
+ except Exception as e:
264
+ logger.warning(f"Failed to set default for {param_name}: {e}, using Any")
265
+ field_definitions[param_name] = (
266
+ Any,
267
+ Field(
268
+ default=default_value,
269
+ description=field_description,
270
+ ),
271
+ )
272
+ elif is_optional:
273
+ # Optional parameter without explicit default
274
+ field_definitions[param_name] = (
275
+ Optional[param_type],
276
+ Field(default=None, description=field_description),
277
+ )
278
+ else:
279
+ # Required parameter
280
+ field_definitions[param_name] = (
281
+ param_type,
282
+ Field(description=field_description),
283
+ )
284
+
285
+ # If no parameters (except self), return None
286
+ if not field_definitions:
287
+ logger.debug(f"No parameters found for {method_name}, skipping schema generation")
288
+ return None
289
+
290
+ # Generate Schema class name
291
+ schema_name = f"{method_name.title().replace('_', '')}Schema"
292
+
293
+ # Create Schema class, allow arbitrary types
294
+ # In Pydantic v2, create_model signature may vary - use type ignore for dynamic model creation
295
+ try:
296
+ schema_class = create_model( # type: ignore[call-overload]
297
+ schema_name,
298
+ __base__=base_class,
299
+ __doc__=schema_description,
300
+ **field_definitions,
301
+ )
302
+ # Set model_config if base_class supports it
303
+ if hasattr(schema_class, "model_config"):
304
+ schema_class.model_config = ConfigDict(arbitrary_types_allowed=True) # type: ignore[assignment]
305
+
306
+ # Validate the generated schema
307
+ _validate_generated_schema(schema_class, method_name, field_definitions)
308
+
309
+ logger.debug(f"Generated schema {schema_name} for method {method_name}")
310
+ return schema_class
311
+ except Exception as e:
312
+ logger.warning(f"Failed to create schema class for {method_name}: {e}")
313
+ return None
314
+
315
+ except Exception as e:
316
+ logger.warning(f"Failed to generate schema for {method_name}: {e}")
317
+ return None
318
+
319
+
320
+ def _validate_generated_schema(
321
+ schema_class: Type[BaseModel],
322
+ method_name: str,
323
+ field_definitions: Dict[str, Any]
324
+ ) -> None:
325
+ """
326
+ Validate that a generated schema is a valid Pydantic model.
327
+
328
+ Args:
329
+ schema_class: The generated schema class
330
+ method_name: Name of the method for error reporting
331
+ field_definitions: The field definitions used to create the schema
332
+
333
+ Raises:
334
+ ValueError: If the schema is invalid
335
+ """
336
+ # Check it's a subclass of BaseModel
337
+ if not issubclass(schema_class, BaseModel):
338
+ raise ValueError(f"Generated schema for {method_name} is not a BaseModel subclass")
339
+
340
+ # Check it has model_fields
341
+ if not hasattr(schema_class, "model_fields"):
342
+ raise ValueError(f"Generated schema for {method_name} has no model_fields")
343
+
344
+ # Try to instantiate with minimal valid data
345
+ try:
346
+ test_data = {}
347
+ for field_name, field_info in schema_class.model_fields.items():
348
+ if not field_info.is_required():
349
+ # Skip optional fields for validation
350
+ continue
351
+ # Use default test values based on type
352
+ field_type = field_info.annotation
353
+ if field_type == str:
354
+ test_data[field_name] = "test"
355
+ elif field_type == int:
356
+ test_data[field_name] = 0
357
+ elif field_type == float:
358
+ test_data[field_name] = 0.0
359
+ elif field_type == bool:
360
+ test_data[field_name] = False
361
+ elif field_type == list or (hasattr(field_type, "__origin__") and get_origin(field_type) is list):
362
+ test_data[field_name] = []
363
+ elif field_type == dict or (hasattr(field_type, "__origin__") and get_origin(field_type) is dict):
364
+ test_data[field_name] = {}
365
+ else:
366
+ test_data[field_name] = None
367
+
368
+ # Try to create an instance
369
+ instance = schema_class(**test_data)
370
+ if not isinstance(instance, BaseModel):
371
+ raise ValueError(f"Schema instance for {method_name} is not a BaseModel")
372
+ except ValidationError as e:
373
+ # Validation errors are okay - just means our test data wasn't perfect
374
+ logger.debug(f"Schema validation test failed for {method_name} (expected): {e}")
375
+ except Exception as e:
376
+ logger.warning(f"Schema validation test failed for {method_name}: {e}")
377
+ # Don't raise - schema might still be valid for actual use cases
378
+
379
+
380
+ def generate_schemas_for_tool(tool_class: Type) -> Dict[str, Type[BaseModel]]:
381
+ """
382
+ Generate Schema for all methods of a tool class
383
+
384
+ Args:
385
+ tool_class: Tool class
386
+
387
+ Returns:
388
+ Mapping from method names to Schema classes
389
+ """
390
+ schemas = {}
391
+
392
+ for method_name in dir(tool_class):
393
+ # Skip private methods and special methods
394
+ if method_name.startswith("_"):
395
+ continue
396
+
397
+ # Skip base class methods
398
+ if method_name in ["run", "run_async", "run_batch"]:
399
+ continue
400
+
401
+ method = getattr(tool_class, method_name)
402
+
403
+ # Skip non-method attributes
404
+ if not callable(method):
405
+ continue
406
+
407
+ # Skip classes (like Config, Schema, etc.)
408
+ if isinstance(method, type):
409
+ continue
410
+
411
+ # Generate Schema
412
+ schema = generate_schema_from_method(method, method_name)
413
+
414
+ if schema:
415
+ # Normalize method name (remove underscores, convert to lowercase)
416
+ normalized_name = method_name.replace("_", "").lower()
417
+ schemas[normalized_name] = schema
418
+ logger.info(f"Generated schema for {method_name}")
419
+
420
+ return schemas
421
+
422
+
423
+ # Usage example
424
+ if __name__ == "__main__":
425
+ import sys
426
+
427
+ sys.path.insert(0, "/home/coder1/python-middleware-dev")
428
+
429
+ from aiecs.tools import discover_tools, TOOL_CLASSES
430
+
431
+ # Configure logging
432
+ logging.basicConfig(level=logging.INFO)
433
+
434
+ # Discover tools
435
+ discover_tools()
436
+
437
+ # Generate Schema for PandasTool
438
+ print("Generating Schema for PandasTool:")
439
+ print("=" * 80)
440
+
441
+ pandas_tool = TOOL_CLASSES["pandas"]
442
+ schemas = generate_schemas_for_tool(pandas_tool)
443
+
444
+ print(f"\nGenerated {len(schemas)} Schemas:\n")
445
+
446
+ # Show first 3 examples
447
+ for method_name, schema in list(schemas.items())[:3]:
448
+ print(f"{schema.__name__}:")
449
+ print(f" Description: {schema.__doc__}")
450
+ print(" Fields:")
451
+ for field_name, field_info in schema.model_fields.items():
452
+ required = "Required" if field_info.is_required() else "Optional"
453
+ default = f" (default: {field_info.default})" if not field_info.is_required() and field_info.default is not None else ""
454
+ print(f" - {field_name}: {field_info.description} [{required}]{default}")
455
+ print()
@@ -0,0 +1,100 @@
1
+ """
2
+ Enhanced Search Tool Package
3
+
4
+ A comprehensive, production-ready web search tool that integrates Google Custom Search API
5
+ with advanced features including:
6
+
7
+ - Result quality scoring and ranking
8
+ - Query intent analysis and optimization
9
+ - Result deduplication
10
+ - Context-aware search with history tracking
11
+ - Intelligent Redis caching with intent-aware TTL
12
+ - Comprehensive metrics and monitoring
13
+ - Agent-friendly error handling
14
+
15
+ Features:
16
+ - Multiple search types: web, image, news, video
17
+ - Dual authentication: API key and service account
18
+ - Rate limiting with token bucket algorithm
19
+ - Circuit breaker pattern for API resilience
20
+ - Intelligent caching with Redis backend
21
+ - Quality analysis with authority, relevance, and freshness scoring
22
+ - Query enhancement based on detected intent
23
+ - Structured result summaries
24
+ - Search context tracking and preference learning
25
+ - Enhanced metrics and health scoring
26
+ - Agent-optimized error messages with actionable suggestions
27
+
28
+ Usage:
29
+ from aiecs.tools.search_tool import SearchTool
30
+
31
+ # Create search tool instance
32
+ search_tool = SearchTool()
33
+
34
+ # Perform enhanced web search
35
+ results = search_tool.search_web(
36
+ query="machine learning tutorial",
37
+ auto_enhance=True,
38
+ return_summary=True
39
+ )
40
+
41
+ # Access results and quality analysis
42
+ for result in results['results']:
43
+ print(f"Title: {result['title']}")
44
+ print(f"Quality: {result['_quality_summary']['score']:.2f}")
45
+ print(f"Credibility: {result['_quality_summary']['level']}")
46
+
47
+ # Check metrics
48
+ print(search_tool.get_metrics_report())
49
+ """
50
+
51
+ from aiecs.tools import register_tool
52
+ from .core import SearchTool
53
+ from .constants import (
54
+ SearchType,
55
+ SafeSearch,
56
+ ImageSize,
57
+ ImageType,
58
+ ImageColorType,
59
+ QueryIntentType,
60
+ CredibilityLevel,
61
+ CircuitState,
62
+ # Exceptions
63
+ SearchToolError,
64
+ AuthenticationError,
65
+ QuotaExceededError,
66
+ RateLimitError,
67
+ CircuitBreakerOpenError,
68
+ SearchAPIError,
69
+ ValidationError,
70
+ CacheError,
71
+ )
72
+
73
+ # Register the tool with the AIECS tool registry
74
+ # Note: Tool is registered as "search" (not "search_tool") for consistency
75
+ register_tool("search")(SearchTool)
76
+
77
+ __all__ = [
78
+ # Main class
79
+ "SearchTool",
80
+ # Enums
81
+ "SearchType",
82
+ "SafeSearch",
83
+ "ImageSize",
84
+ "ImageType",
85
+ "ImageColorType",
86
+ "QueryIntentType",
87
+ "CredibilityLevel",
88
+ "CircuitState",
89
+ # Exceptions
90
+ "SearchToolError",
91
+ "AuthenticationError",
92
+ "QuotaExceededError",
93
+ "RateLimitError",
94
+ "CircuitBreakerOpenError",
95
+ "SearchAPIError",
96
+ "ValidationError",
97
+ "CacheError",
98
+ ]
99
+
100
+ __version__ = "2.0.0"