aiecs 1.0.1__py3-none-any.whl → 1.7.17__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 +435 -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 +3949 -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 +1731 -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 +894 -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 +377 -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 +230 -37
  195. aiecs/llm/client_resolver.py +155 -0
  196. aiecs/llm/clients/__init__.py +38 -0
  197. aiecs/llm/clients/base_client.py +328 -0
  198. aiecs/llm/clients/google_function_calling_mixin.py +415 -0
  199. aiecs/llm/clients/googleai_client.py +314 -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 +1186 -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 +1464 -0
  269. aiecs/tools/docs/document_layout_tool.py +1160 -0
  270. aiecs/tools/docs/document_parser_tool.py +1016 -0
  271. aiecs/tools/docs/document_writer_tool.py +2008 -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 +220 -141
  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.17.dist-info}/METADATA +52 -15
  321. aiecs-1.7.17.dist-info/RECORD +337 -0
  322. aiecs-1.7.17.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.17.dist-info}/WHEEL +0 -0
  339. {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/licenses/LICENSE +0 -0
  340. {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,264 @@
1
+ """
2
+ Intelligent Caching with Redis
3
+
4
+ This module implements intelligent caching with intent-aware TTL strategies
5
+ using Redis as the backend.
6
+ """
7
+
8
+ import hashlib
9
+ import json
10
+ import logging
11
+ from datetime import datetime
12
+ from typing import Any, Dict, List, Optional
13
+
14
+ from .constants import QueryIntentType
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ class IntelligentCache:
20
+ """Redis-based intelligent cache with intent-aware TTL"""
21
+
22
+ # TTL strategies by intent type (in seconds)
23
+ TTL_STRATEGIES = {
24
+ # 30 days (rarely changes)
25
+ QueryIntentType.DEFINITION.value: 86400 * 30,
26
+ QueryIntentType.HOW_TO.value: 86400 * 7, # 7 days
27
+ QueryIntentType.FACTUAL.value: 86400 * 7, # 7 days
28
+ # 30 days (papers don't change)
29
+ QueryIntentType.ACADEMIC.value: 86400 * 30,
30
+ # 1 hour (fast-changing)
31
+ QueryIntentType.RECENT_NEWS.value: 3600,
32
+ QueryIntentType.PRODUCT.value: 86400, # 1 day
33
+ QueryIntentType.COMPARISON.value: 86400 * 3, # 3 days
34
+ QueryIntentType.GENERAL.value: 3600, # 1 hour default
35
+ }
36
+
37
+ def __init__(self, redis_client: Optional[Any] = None, enabled: bool = True):
38
+ """
39
+ Initialize intelligent cache.
40
+
41
+ Args:
42
+ redis_client: Redis client instance (optional)
43
+ enabled: Whether caching is enabled
44
+ """
45
+ self.redis_client = redis_client
46
+ self.enabled = enabled and redis_client is not None
47
+ self.cache_prefix = "search_tool:"
48
+
49
+ if not self.enabled:
50
+ logger.info("Intelligent cache is disabled (no Redis client)")
51
+
52
+ async def get(self, query: str, params: Dict[str, Any]) -> Optional[Dict[str, Any]]:
53
+ """
54
+ Get cached search results.
55
+
56
+ Args:
57
+ query: Search query
58
+ params: Search parameters
59
+
60
+ Returns:
61
+ Cached results dictionary or None if not found
62
+ """
63
+ if not self.enabled:
64
+ return None
65
+
66
+ try:
67
+ if self.redis_client is None:
68
+ return None
69
+ cache_key = self._generate_cache_key(query, params)
70
+ redis = await self.redis_client.get_client()
71
+ cached_data = await redis.get(cache_key)
72
+
73
+ if cached_data:
74
+ logger.debug(f"Cache hit for query: {query}")
75
+ return json.loads(cached_data)
76
+
77
+ logger.debug(f"Cache miss for query: {query}")
78
+ return None
79
+
80
+ except Exception as e:
81
+ logger.warning(f"Cache get error: {e}")
82
+ return None
83
+
84
+ async def set(
85
+ self,
86
+ query: str,
87
+ params: Dict[str, Any],
88
+ results: List[Dict[str, Any]],
89
+ intent_type: str = QueryIntentType.GENERAL.value,
90
+ metadata: Optional[Dict[str, Any]] = None,
91
+ ):
92
+ """
93
+ Cache search results with intelligent TTL.
94
+
95
+ Args:
96
+ query: Search query
97
+ params: Search parameters
98
+ results: Search results to cache
99
+ intent_type: Query intent type for TTL calculation
100
+ metadata: Optional metadata about the search
101
+ """
102
+ if not self.enabled:
103
+ return
104
+
105
+ try:
106
+ cache_key = self._generate_cache_key(query, params)
107
+
108
+ # Calculate intelligent TTL
109
+ ttl = self.calculate_ttl(query, intent_type, results)
110
+
111
+ # Prepare cache data
112
+ cache_data = {
113
+ "query": query,
114
+ "params": params,
115
+ "results": results,
116
+ "intent_type": intent_type,
117
+ "metadata": metadata or {},
118
+ "cached_at": datetime.utcnow().isoformat(),
119
+ "ttl": ttl,
120
+ }
121
+
122
+ # Store in Redis
123
+ if self.redis_client is None:
124
+ return
125
+ redis = await self.redis_client.get_client()
126
+ await redis.set(cache_key, json.dumps(cache_data), ex=ttl)
127
+
128
+ logger.debug(f"Cached results for query: {query} (TTL: {ttl}s)")
129
+
130
+ except Exception as e:
131
+ logger.warning(f"Cache set error: {e}")
132
+
133
+ def calculate_ttl(self, query: str, intent_type: str, results: List[Dict[str, Any]]) -> int:
134
+ """
135
+ Calculate intelligent TTL based on intent and result quality.
136
+
137
+ Args:
138
+ query: Search query
139
+ intent_type: Query intent type
140
+ results: Search results
141
+
142
+ Returns:
143
+ TTL in seconds
144
+ """
145
+ # Base TTL from intent type
146
+ base_ttl = self.TTL_STRATEGIES.get(intent_type, self.TTL_STRATEGIES[QueryIntentType.GENERAL.value])
147
+
148
+ if not results:
149
+ # No results: shorter cache time
150
+ return base_ttl // 2
151
+
152
+ # Adjust based on result freshness
153
+ try:
154
+ avg_freshness = sum(r.get("_quality", {}).get("freshness_score", 0.5) for r in results) / len(results)
155
+
156
+ # Very fresh results can be cached longer
157
+ if avg_freshness > 0.9:
158
+ base_ttl = int(base_ttl * 2)
159
+ # Old results should have shorter cache
160
+ elif avg_freshness < 0.3:
161
+ base_ttl = base_ttl // 2
162
+ except Exception:
163
+ pass
164
+
165
+ # Adjust based on result quality
166
+ try:
167
+ avg_quality = sum(r.get("_quality", {}).get("quality_score", 0.5) for r in results) / len(results)
168
+
169
+ # High quality results can be cached longer
170
+ if avg_quality > 0.8:
171
+ base_ttl = int(base_ttl * 1.5)
172
+ except Exception:
173
+ pass
174
+
175
+ return base_ttl
176
+
177
+ async def invalidate(self, query: str, params: Dict[str, Any]):
178
+ """
179
+ Invalidate cached results.
180
+
181
+ Args:
182
+ query: Search query
183
+ params: Search parameters
184
+ """
185
+ if not self.enabled:
186
+ return
187
+
188
+ try:
189
+ if self.redis_client is None:
190
+ return
191
+ cache_key = self._generate_cache_key(query, params)
192
+ redis = await self.redis_client.get_client()
193
+ await redis.delete(cache_key)
194
+ logger.debug(f"Invalidated cache for query: {query}")
195
+ except Exception as e:
196
+ logger.warning(f"Cache invalidate error: {e}")
197
+
198
+ async def clear_all(self):
199
+ """Clear all cached search results"""
200
+ if not self.enabled:
201
+ return
202
+
203
+ try:
204
+ if self.redis_client is None:
205
+ return
206
+ redis = await self.redis_client.get_client()
207
+ # Find all search_tool cache keys
208
+ pattern = f"{self.cache_prefix}*"
209
+ keys = []
210
+ async for key in redis.scan_iter(match=pattern):
211
+ keys.append(key)
212
+
213
+ if keys:
214
+ await redis.delete(*keys)
215
+ logger.info(f"Cleared {len(keys)} cached entries")
216
+ except Exception as e:
217
+ logger.warning(f"Cache clear error: {e}")
218
+
219
+ def _generate_cache_key(self, query: str, params: Dict[str, Any]) -> str:
220
+ """
221
+ Generate unique cache key from query and parameters.
222
+
223
+ Args:
224
+ query: Search query
225
+ params: Search parameters
226
+
227
+ Returns:
228
+ Cache key string
229
+ """
230
+ # Create deterministic string from query and params
231
+ param_str = json.dumps(params, sort_keys=True)
232
+ key_data = f"{query}:{param_str}"
233
+ key_hash = hashlib.sha256(key_data.encode()).hexdigest()[:16]
234
+
235
+ return f"{self.cache_prefix}{key_hash}"
236
+
237
+ async def get_stats(self) -> Dict[str, Any]:
238
+ """
239
+ Get cache statistics.
240
+
241
+ Returns:
242
+ Cache statistics dictionary
243
+ """
244
+ if not self.enabled:
245
+ return {"enabled": False, "total_keys": 0}
246
+
247
+ try:
248
+ if self.redis_client is None:
249
+ return {"enabled": False, "total_keys": 0}
250
+ redis = await self.redis_client.get_client()
251
+ # Count cache keys
252
+ pattern = f"{self.cache_prefix}*"
253
+ key_count = 0
254
+ async for _ in redis.scan_iter(match=pattern):
255
+ key_count += 1
256
+
257
+ return {
258
+ "enabled": True,
259
+ "total_keys": key_count,
260
+ "prefix": self.cache_prefix,
261
+ }
262
+ except Exception as e:
263
+ logger.warning(f"Cache stats error: {e}")
264
+ return {"enabled": True, "error": str(e)}
@@ -0,0 +1,128 @@
1
+ """
2
+ Constants, Enums, and Exception Classes for Search Tool
3
+
4
+ This module contains all the shared constants, enumeration types, and
5
+ custom exception classes used across the search tool package.
6
+ """
7
+
8
+ from enum import Enum
9
+
10
+
11
+ # ============================================================================
12
+ # Enums
13
+ # ============================================================================
14
+
15
+
16
+ class SearchType(str, Enum):
17
+ """Supported search types"""
18
+
19
+ WEB = "web"
20
+ IMAGE = "image"
21
+ NEWS = "news"
22
+ VIDEO = "video"
23
+
24
+
25
+ class SafeSearch(str, Enum):
26
+ """Safe search levels"""
27
+
28
+ OFF = "off"
29
+ MEDIUM = "medium"
30
+ HIGH = "high"
31
+
32
+
33
+ class ImageSize(str, Enum):
34
+ """Image size filters"""
35
+
36
+ ICON = "icon"
37
+ SMALL = "small"
38
+ MEDIUM = "medium"
39
+ LARGE = "large"
40
+ XLARGE = "xlarge"
41
+ XXLARGE = "xxlarge"
42
+ HUGE = "huge"
43
+
44
+
45
+ class ImageType(str, Enum):
46
+ """Image type filters"""
47
+
48
+ CLIPART = "clipart"
49
+ FACE = "face"
50
+ LINEART = "lineart"
51
+ STOCK = "stock"
52
+ PHOTO = "photo"
53
+ ANIMATED = "animated"
54
+
55
+
56
+ class ImageColorType(str, Enum):
57
+ """Image color type filters"""
58
+
59
+ COLOR = "color"
60
+ GRAY = "gray"
61
+ MONO = "mono"
62
+ TRANS = "trans"
63
+
64
+
65
+ class CircuitState(str, Enum):
66
+ """Circuit breaker states"""
67
+
68
+ CLOSED = "closed"
69
+ OPEN = "open"
70
+ HALF_OPEN = "half_open"
71
+
72
+
73
+ class QueryIntentType(str, Enum):
74
+ """Query intent types"""
75
+
76
+ DEFINITION = "definition"
77
+ HOW_TO = "how_to"
78
+ COMPARISON = "comparison"
79
+ FACTUAL = "factual"
80
+ RECENT_NEWS = "recent_news"
81
+ ACADEMIC = "academic"
82
+ PRODUCT = "product"
83
+ GENERAL = "general"
84
+
85
+
86
+ class CredibilityLevel(str, Enum):
87
+ """Result credibility levels"""
88
+
89
+ HIGH = "high"
90
+ MEDIUM = "medium"
91
+ LOW = "low"
92
+
93
+
94
+ # ============================================================================
95
+ # Exception Hierarchy
96
+ # ============================================================================
97
+
98
+
99
+ class SearchToolError(Exception):
100
+ """Base exception for SearchTool errors"""
101
+
102
+
103
+ class AuthenticationError(SearchToolError):
104
+ """Authentication-related errors"""
105
+
106
+
107
+ class QuotaExceededError(SearchToolError):
108
+ """API quota exceeded"""
109
+
110
+
111
+ class RateLimitError(SearchToolError):
112
+ """Rate limit exceeded"""
113
+
114
+
115
+ class CircuitBreakerOpenError(SearchToolError):
116
+ """Circuit breaker is open"""
117
+
118
+
119
+ class SearchAPIError(SearchToolError):
120
+ """Search API errors"""
121
+
122
+
123
+ class ValidationError(SearchToolError):
124
+ """Input validation errors"""
125
+
126
+
127
+ class CacheError(SearchToolError):
128
+ """Cache-related errors"""
@@ -0,0 +1,224 @@
1
+ """
2
+ Search Context Management
3
+
4
+ This module tracks search history, learns user preferences, and provides
5
+ contextual suggestions for better search results.
6
+ """
7
+
8
+ from datetime import datetime
9
+ from typing import Any, Dict, List, Optional, Set, cast
10
+
11
+
12
+ class SearchContext:
13
+ """Manages search history and context for improved results"""
14
+
15
+ def __init__(self, max_history: int = 10):
16
+ """
17
+ Initialize search context.
18
+
19
+ Args:
20
+ max_history: Maximum number of searches to keep in history
21
+ """
22
+ self.search_history: List[Dict[str, Any]] = []
23
+ self.max_history = max_history
24
+ self.topic_context: Optional[List[str]] = None
25
+ self.user_preferences: Dict[str, Any] = {
26
+ "preferred_domains": set(),
27
+ "avoided_domains": set(),
28
+ "preferred_content_types": [],
29
+ "language": "en",
30
+ }
31
+
32
+ def add_search(
33
+ self,
34
+ query: str,
35
+ results: List[Dict[str, Any]],
36
+ user_feedback: Optional[Dict[str, Any]] = None,
37
+ ):
38
+ """
39
+ Add search to history and update context.
40
+
41
+ Args:
42
+ query: Search query
43
+ results: Search results
44
+ user_feedback: Optional user feedback for learning
45
+ """
46
+ search_record = {
47
+ "timestamp": datetime.utcnow().isoformat(),
48
+ "query": query,
49
+ "result_count": len(results),
50
+ "clicked_results": [],
51
+ "feedback": user_feedback,
52
+ }
53
+
54
+ self.search_history.append(search_record)
55
+
56
+ # Maintain history size limit
57
+ if len(self.search_history) > self.max_history:
58
+ self.search_history.pop(0)
59
+
60
+ # Update topic context
61
+ self._update_topic_context(query, results)
62
+
63
+ # Learn from feedback if provided
64
+ if user_feedback:
65
+ self._learn_preferences(results, user_feedback)
66
+
67
+ def get_contextual_suggestions(self, current_query: str) -> Dict[str, Any]:
68
+ """
69
+ Generate context-aware suggestions for the current query.
70
+
71
+ Args:
72
+ current_query: Current search query
73
+
74
+ Returns:
75
+ Suggestions dictionary with related queries and parameters
76
+ """
77
+ suggestions: Dict[str, Any] = {
78
+ "related_queries": [],
79
+ "refinement_suggestions": [],
80
+ "context_aware_params": {},
81
+ }
82
+
83
+ if not self.search_history:
84
+ return suggestions
85
+
86
+ # Find related historical queries
87
+ related_queries = cast(List[Dict[str, Any]], suggestions["related_queries"])
88
+ for record in reversed(self.search_history[-5:]):
89
+ prev_query = record["query"]
90
+ similarity = self._calculate_query_similarity(current_query, prev_query)
91
+
92
+ if similarity > 0.5:
93
+ related_queries.append(
94
+ {
95
+ "query": prev_query,
96
+ "similarity": similarity,
97
+ "timestamp": record["timestamp"],
98
+ }
99
+ )
100
+
101
+ # Suggest preferred sites if available
102
+ preferred_domains = cast(Set[str], self.user_preferences["preferred_domains"])
103
+ if preferred_domains:
104
+ context_aware_params = cast(Dict[str, Any], suggestions["context_aware_params"])
105
+ context_aware_params["preferred_sites"] = list(preferred_domains)
106
+
107
+ return suggestions
108
+
109
+ def get_history(self, limit: Optional[int] = None) -> List[Dict[str, Any]]:
110
+ """
111
+ Get search history.
112
+
113
+ Args:
114
+ limit: Maximum number of records to return
115
+
116
+ Returns:
117
+ List of search history records
118
+ """
119
+ if limit:
120
+ return self.search_history[-limit:]
121
+ return self.search_history.copy()
122
+
123
+ def clear_history(self):
124
+ """Clear search history"""
125
+ self.search_history.clear()
126
+ self.topic_context = None
127
+
128
+ def get_preferences(self) -> Dict[str, Any]:
129
+ """
130
+ Get current user preferences.
131
+
132
+ Returns:
133
+ User preferences dictionary
134
+ """
135
+ preferred_domains = cast(Set[str], self.user_preferences["preferred_domains"])
136
+ avoided_domains = cast(Set[str], self.user_preferences["avoided_domains"])
137
+ preferred_content_types = cast(List[str], self.user_preferences["preferred_content_types"])
138
+ return {
139
+ "preferred_domains": list(preferred_domains),
140
+ "avoided_domains": list(avoided_domains),
141
+ "preferred_content_types": preferred_content_types.copy(),
142
+ "language": self.user_preferences["language"],
143
+ }
144
+
145
+ def set_preference(self, key: str, value: Any):
146
+ """
147
+ Set a user preference.
148
+
149
+ Args:
150
+ key: Preference key
151
+ value: Preference value
152
+ """
153
+ if key in self.user_preferences:
154
+ pref_value = self.user_preferences[key]
155
+ if isinstance(pref_value, set):
156
+ if isinstance(value, (list, set)):
157
+ self.user_preferences[key] = set(value)
158
+ else:
159
+ pref_set = cast(Set[str], pref_value)
160
+ pref_set.add(value)
161
+ else:
162
+ self.user_preferences[key] = value
163
+
164
+ def _update_topic_context(self, query: str, results: List[Dict[str, Any]]):
165
+ """
166
+ Update topic context from query and results.
167
+
168
+ Args:
169
+ query: Search query
170
+ results: Search results
171
+ """
172
+ # Simple implementation: extract common words
173
+ words = query.lower().split()
174
+ self.topic_context = words
175
+
176
+ def _learn_preferences(self, results: List[Dict[str, Any]], feedback: Dict[str, Any]):
177
+ """
178
+ Learn user preferences from feedback.
179
+
180
+ Args:
181
+ results: Search results
182
+ feedback: User feedback
183
+ """
184
+ # Learn from clicked/used results
185
+ preferred_domains = cast(Set[str], self.user_preferences["preferred_domains"])
186
+ if "clicked_indices" in feedback:
187
+ for idx in feedback["clicked_indices"]:
188
+ if 0 <= idx < len(results):
189
+ result = results[idx]
190
+ domain = result.get("displayLink", "")
191
+ if domain:
192
+ preferred_domains.add(domain)
193
+
194
+ # Learn from disliked results
195
+ avoided_domains = cast(Set[str], self.user_preferences["avoided_domains"])
196
+ if "disliked_indices" in feedback:
197
+ for idx in feedback["disliked_indices"]:
198
+ if 0 <= idx < len(results):
199
+ result = results[idx]
200
+ domain = result.get("displayLink", "")
201
+ if domain:
202
+ avoided_domains.add(domain)
203
+
204
+ def _calculate_query_similarity(self, query1: str, query2: str) -> float:
205
+ """
206
+ Calculate similarity between two queries using Jaccard index.
207
+
208
+ Args:
209
+ query1: First query
210
+ query2: Second query
211
+
212
+ Returns:
213
+ Similarity score (0-1)
214
+ """
215
+ words1 = set(query1.lower().split())
216
+ words2 = set(query2.lower().split())
217
+
218
+ if not words1 or not words2:
219
+ return 0.0
220
+
221
+ intersection = words1 & words2
222
+ union = words1 | words2
223
+
224
+ return len(intersection) / len(union) if union else 0.0