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,581 @@
1
+ """
2
+ Search Result Analyzers
3
+
4
+ This module contains analyzers for assessing search result quality,
5
+ understanding query intent, and generating result summaries.
6
+ """
7
+
8
+ from datetime import datetime
9
+ from typing import Any, Dict, List, cast
10
+
11
+ from .constants import QueryIntentType, CredibilityLevel
12
+
13
+
14
+ # ============================================================================
15
+ # Result Quality Analyzer
16
+ # ============================================================================
17
+
18
+
19
+ class ResultQualityAnalyzer:
20
+ """Analyzer for assessing search result quality"""
21
+
22
+ # High authority domains with trust scores
23
+ AUTHORITATIVE_DOMAINS = {
24
+ # Academic and research
25
+ "scholar.google.com": 0.95,
26
+ "arxiv.org": 0.95,
27
+ "ieee.org": 0.95,
28
+ "acm.org": 0.95,
29
+ "nature.com": 0.95,
30
+ "science.org": 0.95,
31
+ # Government and official
32
+ ".gov": 0.90,
33
+ ".edu": 0.85,
34
+ "who.int": 0.90,
35
+ "un.org": 0.90,
36
+ # Major media
37
+ "nytimes.com": 0.80,
38
+ "bbc.com": 0.80,
39
+ "reuters.com": 0.85,
40
+ "apnews.com": 0.85,
41
+ # Technical documentation
42
+ "docs.python.org": 0.90,
43
+ "developer.mozilla.org": 0.90,
44
+ "stackoverflow.com": 0.75,
45
+ "github.com": 0.70,
46
+ # Encyclopedia
47
+ "wikipedia.org": 0.75,
48
+ }
49
+
50
+ # Low quality indicators
51
+ LOW_QUALITY_INDICATORS = [
52
+ "clickbait",
53
+ "ads",
54
+ "spam",
55
+ "scam",
56
+ "download-now",
57
+ "free-download",
58
+ "xxx",
59
+ "adult",
60
+ "casino",
61
+ "pills",
62
+ ]
63
+
64
+ def analyze_result_quality(self, result: Dict[str, Any], query: str, position: int) -> Dict[str, Any]:
65
+ """
66
+ Analyze quality of a single search result.
67
+
68
+ Args:
69
+ result: Search result dictionary
70
+ query: Original search query
71
+ position: Position in search results (1-based)
72
+
73
+ Returns:
74
+ Quality analysis dictionary with scores and signals
75
+ """
76
+ quality_analysis: Dict[str, Any] = {
77
+ "quality_score": 0.0,
78
+ "authority_score": 0.0,
79
+ "relevance_score": 0.0,
80
+ "freshness_score": 0.0,
81
+ "credibility_level": CredibilityLevel.MEDIUM.value,
82
+ "quality_signals": {},
83
+ "warnings": [],
84
+ }
85
+
86
+ # 1. Evaluate domain authority
87
+ domain = result.get("displayLink", "").lower()
88
+ authority_score = self._calculate_authority_score(domain)
89
+ quality_analysis["authority_score"] = authority_score
90
+ quality_signals = cast(Dict[str, Any], quality_analysis["quality_signals"])
91
+ quality_signals["domain_authority"] = "high" if authority_score > 0.8 else "medium" if authority_score > 0.5 else "low"
92
+
93
+ # 2. Evaluate relevance
94
+ relevance_score = self._calculate_relevance_score(query, result.get("title", ""), result.get("snippet", ""), position)
95
+ quality_analysis["relevance_score"] = relevance_score
96
+
97
+ # 3. Evaluate freshness
98
+ freshness_score = self._calculate_freshness_score(result)
99
+ quality_analysis["freshness_score"] = freshness_score
100
+
101
+ # 4. Check HTTPS
102
+ link = result.get("link", "")
103
+ has_https = link.startswith("https://")
104
+ quality_signals["has_https"] = has_https
105
+ warnings = cast(List[str], quality_analysis["warnings"])
106
+ if not has_https:
107
+ warnings.append("No HTTPS - security concern")
108
+
109
+ # 5. Check content length
110
+ snippet_length = len(result.get("snippet", ""))
111
+ quality_signals["content_length"] = "adequate" if snippet_length > 100 else "short"
112
+ if snippet_length < 50:
113
+ warnings.append("Very short snippet - may lack detail")
114
+
115
+ # 6. Check metadata
116
+ has_metadata = "metadata" in result
117
+ quality_signals["has_metadata"] = has_metadata
118
+
119
+ # 7. Position ranking (Google's ranking is a quality signal)
120
+ position_score = max(0, 1.0 - (position - 1) * 0.05)
121
+ quality_signals["position_rank"] = position
122
+
123
+ # 8. Detect low quality indicators
124
+ url_lower = link.lower()
125
+ title_lower = result.get("title", "").lower()
126
+ for indicator in self.LOW_QUALITY_INDICATORS:
127
+ if indicator in url_lower or indicator in title_lower:
128
+ warnings.append(f"Low quality indicator detected: {indicator}")
129
+ authority_score *= 0.5 # Significantly reduce authority
130
+
131
+ # 9. Calculate comprehensive quality score
132
+ quality_score = (
133
+ authority_score * 0.35 # Authority 35%
134
+ + relevance_score * 0.30 # Relevance 30%
135
+ + position_score * 0.20 # Position 20%
136
+ + freshness_score * 0.10 # Freshness 10%
137
+ + (0.05 if has_https else 0) # HTTPS 5%
138
+ )
139
+ quality_analysis["quality_score"] = quality_score
140
+
141
+ # 10. Determine credibility level
142
+ if quality_score > 0.75:
143
+ quality_analysis["credibility_level"] = CredibilityLevel.HIGH.value
144
+ elif quality_score > 0.5:
145
+ quality_analysis["credibility_level"] = CredibilityLevel.MEDIUM.value
146
+ else:
147
+ quality_analysis["credibility_level"] = CredibilityLevel.LOW.value
148
+
149
+ return quality_analysis
150
+
151
+ def _calculate_authority_score(self, domain: str) -> float:
152
+ """Calculate domain authority score"""
153
+ # Exact match
154
+ if domain in self.AUTHORITATIVE_DOMAINS:
155
+ return self.AUTHORITATIVE_DOMAINS[domain]
156
+
157
+ # Suffix match
158
+ for auth_domain, score in self.AUTHORITATIVE_DOMAINS.items():
159
+ if domain.endswith(auth_domain):
160
+ return score
161
+
162
+ # Default medium authority
163
+ return 0.5
164
+
165
+ def _calculate_relevance_score(self, query: str, title: str, snippet: str, position: int) -> float:
166
+ """Calculate relevance score based on query match"""
167
+ query_terms = set(query.lower().split())
168
+ title_lower = title.lower()
169
+ snippet_lower = snippet.lower()
170
+
171
+ # Title matching
172
+ title_matches = sum(1 for term in query_terms if term in title_lower)
173
+ title_score = title_matches / len(query_terms) if query_terms else 0
174
+
175
+ # Snippet matching
176
+ snippet_matches = sum(1 for term in query_terms if term in snippet_lower)
177
+ snippet_score = snippet_matches / len(query_terms) if query_terms else 0
178
+
179
+ # Position bonus (top 3 get extra credit)
180
+ position_bonus = 0.2 if position <= 3 else 0.1 if position <= 10 else 0
181
+
182
+ # Combined relevance
183
+ relevance = title_score * 0.6 + snippet_score * 0.3 + position_bonus # Title weighted higher # Snippet secondary # Position bonus
184
+
185
+ return min(1.0, relevance)
186
+
187
+ def _calculate_freshness_score(self, result: Dict[str, Any]) -> float:
188
+ """Calculate freshness score from publish date metadata"""
189
+ metadata = result.get("metadata", {})
190
+
191
+ # Look for date in various metadata fields
192
+ date_fields = ["metatags", "article", "newsarticle"]
193
+ publish_date = None
194
+
195
+ for field in date_fields:
196
+ if field in metadata:
197
+ items = metadata[field]
198
+ if isinstance(items, list) and items:
199
+ item = items[0]
200
+ # Common date field names
201
+ for date_key in [
202
+ "publishdate",
203
+ "datepublished",
204
+ "article:published_time",
205
+ ]:
206
+ if date_key in item:
207
+ publish_date = item[date_key]
208
+ break
209
+ if publish_date:
210
+ break
211
+
212
+ if not publish_date:
213
+ # No date info, return neutral score
214
+ return 0.5
215
+
216
+ try:
217
+ # Parse date
218
+ pub_dt = datetime.fromisoformat(publish_date.replace("Z", "+00:00"))
219
+ now = datetime.now(pub_dt.tzinfo)
220
+
221
+ days_old = (now - pub_dt).days
222
+
223
+ # Freshness scoring
224
+ if days_old < 7:
225
+ return 1.0 # < 1 week - very fresh
226
+ elif days_old < 30:
227
+ return 0.9 # < 1 month - fresh
228
+ elif days_old < 90:
229
+ return 0.7 # < 3 months - moderately fresh
230
+ elif days_old < 365:
231
+ return 0.5 # < 1 year - neutral
232
+ elif days_old < 730:
233
+ return 0.3 # < 2 years - dated
234
+ else:
235
+ return 0.1 # > 2 years - old
236
+ except Exception:
237
+ return 0.5
238
+
239
+ def rank_results(self, results: List[Dict[str, Any]], ranking_strategy: str = "balanced") -> List[Dict[str, Any]]:
240
+ """
241
+ Re-rank results by quality metrics.
242
+
243
+ Args:
244
+ results: List of results with quality analysis
245
+ ranking_strategy: Ranking strategy ('balanced', 'authority', 'relevance', 'freshness')
246
+
247
+ Returns:
248
+ Sorted list of results
249
+ """
250
+ if ranking_strategy == "authority":
251
+ return sorted(
252
+ results,
253
+ key=lambda x: x.get("_quality", {}).get("authority_score", 0),
254
+ reverse=True,
255
+ )
256
+ elif ranking_strategy == "relevance":
257
+ return sorted(
258
+ results,
259
+ key=lambda x: x.get("_quality", {}).get("relevance_score", 0),
260
+ reverse=True,
261
+ )
262
+ elif ranking_strategy == "freshness":
263
+ return sorted(
264
+ results,
265
+ key=lambda x: x.get("_quality", {}).get("freshness_score", 0),
266
+ reverse=True,
267
+ )
268
+ else: # balanced
269
+ return sorted(
270
+ results,
271
+ key=lambda x: x.get("_quality", {}).get("quality_score", 0),
272
+ reverse=True,
273
+ )
274
+
275
+
276
+ # ============================================================================
277
+ # Query Intent Analyzer
278
+ # ============================================================================
279
+
280
+
281
+ class QueryIntentAnalyzer:
282
+ """Analyzer for understanding query intent and optimizing queries"""
283
+
284
+ # Intent patterns with keywords and enhancements
285
+ INTENT_PATTERNS = {
286
+ QueryIntentType.DEFINITION.value: {
287
+ "keywords": ["what is", "define", "meaning of", "definition"],
288
+ "query_enhancement": 'definition OR meaning OR "what is"',
289
+ "suggested_params": {"num_results": 5},
290
+ },
291
+ QueryIntentType.HOW_TO.value: {
292
+ "keywords": [
293
+ "how to",
294
+ "how do i",
295
+ "tutorial",
296
+ "guide",
297
+ "steps to",
298
+ ],
299
+ "query_enhancement": 'tutorial OR guide OR "step by step"',
300
+ "suggested_params": {"num_results": 10},
301
+ },
302
+ QueryIntentType.COMPARISON.value: {
303
+ "keywords": [
304
+ "vs",
305
+ "versus",
306
+ "compare",
307
+ "difference between",
308
+ "better than",
309
+ ],
310
+ "query_enhancement": 'comparison OR versus OR "vs"',
311
+ "suggested_params": {"num_results": 10},
312
+ },
313
+ QueryIntentType.FACTUAL.value: {
314
+ "keywords": [
315
+ "when",
316
+ "where",
317
+ "who",
318
+ "which",
319
+ "statistics",
320
+ "data",
321
+ ],
322
+ "query_enhancement": "",
323
+ "suggested_params": {"num_results": 5},
324
+ },
325
+ QueryIntentType.RECENT_NEWS.value: {
326
+ "keywords": ["latest", "recent", "news", "today", "current"],
327
+ "query_enhancement": "news OR latest",
328
+ "suggested_params": {"date_restrict": "w1", "sort_by": "date"},
329
+ },
330
+ QueryIntentType.ACADEMIC.value: {
331
+ "keywords": ["research", "study", "paper", "journal", "academic"],
332
+ "query_enhancement": "research OR study OR paper",
333
+ "suggested_params": {"file_type": "pdf", "num_results": 10},
334
+ },
335
+ QueryIntentType.PRODUCT.value: {
336
+ "keywords": ["buy", "price", "review", "best", "top rated"],
337
+ "query_enhancement": "review OR comparison",
338
+ "suggested_params": {"num_results": 15},
339
+ },
340
+ }
341
+
342
+ def analyze_query_intent(self, query: str) -> Dict[str, Any]:
343
+ """
344
+ Analyze query to determine intent and generate enhancements.
345
+
346
+ Args:
347
+ query: Search query string
348
+
349
+ Returns:
350
+ Intent analysis with enhanced query and suggestions
351
+ """
352
+ query_lower = query.lower()
353
+
354
+ analysis: Dict[str, Any] = {
355
+ "original_query": query,
356
+ "intent_type": QueryIntentType.GENERAL.value,
357
+ "confidence": 0.0,
358
+ "enhanced_query": query,
359
+ "suggested_params": {},
360
+ "query_entities": [],
361
+ "query_modifiers": [],
362
+ "suggestions": [],
363
+ }
364
+
365
+ # Detect intent type
366
+ max_confidence = 0.0
367
+ detected_intent = QueryIntentType.GENERAL.value
368
+
369
+ for intent_type, intent_config in self.INTENT_PATTERNS.items():
370
+ keywords = intent_config["keywords"]
371
+ matches = sum(1 for kw in keywords if kw in query_lower)
372
+
373
+ if matches > 0:
374
+ confidence = min(1.0, matches / len(keywords) * 2)
375
+ if confidence > max_confidence:
376
+ max_confidence = confidence
377
+ detected_intent = intent_type
378
+
379
+ analysis["intent_type"] = detected_intent
380
+ analysis["confidence"] = max_confidence
381
+
382
+ # Enhance query if intent detected
383
+ if detected_intent != QueryIntentType.GENERAL.value:
384
+ intent_config = self.INTENT_PATTERNS[detected_intent]
385
+ enhancement = intent_config["query_enhancement"]
386
+
387
+ if enhancement:
388
+ analysis["enhanced_query"] = f"{query} {enhancement}"
389
+
390
+ suggested_params = cast(Dict[str, Any], intent_config["suggested_params"])
391
+ analysis["suggested_params"] = suggested_params.copy()
392
+
393
+ # Extract entities and modifiers
394
+ analysis["query_entities"] = self._extract_entities(query)
395
+ analysis["query_modifiers"] = self._extract_modifiers(query)
396
+
397
+ # Generate suggestions
398
+ analysis["suggestions"] = self._generate_suggestions(query, detected_intent)
399
+
400
+ return analysis
401
+
402
+ def _extract_entities(self, query: str) -> List[str]:
403
+ """Extract potential entities from query (simplified)"""
404
+ words = query.split()
405
+ entities = []
406
+
407
+ for word in words:
408
+ # Simple rule: capitalized words might be entities
409
+ if word and word[0].isupper() and len(word) > 2:
410
+ entities.append(word)
411
+
412
+ return entities
413
+
414
+ def _extract_modifiers(self, query: str) -> List[str]:
415
+ """Extract query modifiers"""
416
+ modifiers = []
417
+ modifier_words = [
418
+ "best",
419
+ "top",
420
+ "latest",
421
+ "new",
422
+ "old",
423
+ "cheap",
424
+ "expensive",
425
+ "free",
426
+ "open source",
427
+ "commercial",
428
+ "beginner",
429
+ "advanced",
430
+ ]
431
+
432
+ query_lower = query.lower()
433
+ for modifier in modifier_words:
434
+ if modifier in query_lower:
435
+ modifiers.append(modifier)
436
+
437
+ return modifiers
438
+
439
+ def _generate_suggestions(self, query: str, intent_type: str) -> List[str]:
440
+ """Generate query optimization suggestions"""
441
+ suggestions = []
442
+
443
+ if intent_type == QueryIntentType.HOW_TO.value:
444
+ if "beginner" not in query.lower() and "advanced" not in query.lower():
445
+ suggestions.append('Consider adding "beginner" or "advanced" to target skill level')
446
+
447
+ elif intent_type == QueryIntentType.COMPARISON.value:
448
+ if " vs " not in query.lower():
449
+ suggestions.append('Use "vs" or "versus" for better comparison results')
450
+
451
+ elif intent_type == QueryIntentType.ACADEMIC.value:
452
+ if "pdf" not in query.lower():
453
+ suggestions.append('Consider adding "filetype:pdf" to find research papers')
454
+
455
+ elif intent_type == QueryIntentType.RECENT_NEWS.value:
456
+ suggestions.append("Results will be filtered to last week for freshness")
457
+
458
+ # General suggestions
459
+ if len(query.split()) < 3:
460
+ suggestions.append("Query is short - consider adding more specific terms")
461
+
462
+ if len(query.split()) > 10:
463
+ suggestions.append("Query is long - consider simplifying to key terms")
464
+
465
+ return suggestions
466
+
467
+
468
+ # ============================================================================
469
+ # Result Summarizer
470
+ # ============================================================================
471
+
472
+
473
+ class ResultSummarizer:
474
+ """Generator of structured summaries from search results"""
475
+
476
+ def generate_summary(self, results: List[Dict[str, Any]], query: str) -> Dict[str, Any]:
477
+ """
478
+ Generate comprehensive summary of search results.
479
+
480
+ Args:
481
+ results: List of search results with quality analysis
482
+ query: Original search query
483
+
484
+ Returns:
485
+ Summary dictionary with statistics and recommendations
486
+ """
487
+ summary: Dict[str, Any] = {
488
+ "query": query,
489
+ "total_results": len(results),
490
+ "quality_distribution": {"high": 0, "medium": 0, "low": 0},
491
+ "top_domains": [],
492
+ "content_types": {},
493
+ "freshness_distribution": {
494
+ "very_fresh": 0,
495
+ "fresh": 0,
496
+ "moderate": 0,
497
+ "old": 0,
498
+ },
499
+ "recommended_results": [],
500
+ "warnings": [],
501
+ "suggestions": [],
502
+ }
503
+
504
+ if not results:
505
+ warnings = cast(List[str], summary["warnings"])
506
+ warnings.append("No results found")
507
+ return summary
508
+
509
+ # Gather statistics
510
+ domain_stats: Dict[str, Dict[str, Any]] = {}
511
+
512
+ quality_distribution = cast(Dict[str, int], summary["quality_distribution"])
513
+ freshness_distribution = cast(Dict[str, int], summary["freshness_distribution"])
514
+ warnings = cast(List[str], summary["warnings"])
515
+ suggestions = cast(List[str], summary["suggestions"])
516
+
517
+ for result in results:
518
+ quality = result.get("_quality", {})
519
+ quality_level = quality.get("credibility_level", "medium")
520
+ quality_distribution[quality_level] += 1
521
+
522
+ # Domain statistics
523
+ domain = result.get("displayLink", "unknown")
524
+ if domain not in domain_stats:
525
+ domain_stats[domain] = {"count": 0, "total_quality": 0.0}
526
+ domain_stats[domain]["count"] += 1
527
+ domain_stats[domain]["total_quality"] += quality.get("quality_score", 0.5)
528
+
529
+ # Freshness distribution
530
+ freshness = quality.get("freshness_score", 0.5)
531
+ if freshness > 0.9:
532
+ freshness_distribution["very_fresh"] += 1
533
+ elif freshness > 0.7:
534
+ freshness_distribution["fresh"] += 1
535
+ elif freshness > 0.5:
536
+ freshness_distribution["moderate"] += 1
537
+ else:
538
+ freshness_distribution["old"] += 1
539
+
540
+ # Top domains
541
+ top_domains: List[Dict[str, Any]] = []
542
+ for domain, stats in domain_stats.items():
543
+ avg_quality = stats["total_quality"] / stats["count"]
544
+ top_domains.append(
545
+ {
546
+ "domain": domain,
547
+ "count": stats["count"],
548
+ "avg_quality": avg_quality,
549
+ }
550
+ )
551
+
552
+ summary["top_domains"] = sorted(
553
+ top_domains,
554
+ key=lambda x: (x["count"], x["avg_quality"]),
555
+ reverse=True,
556
+ )[:5]
557
+
558
+ # Recommended results (top 3 by quality)
559
+ sorted_results = sorted(
560
+ results,
561
+ key=lambda x: x.get("_quality", {}).get("quality_score", 0),
562
+ reverse=True,
563
+ )
564
+ summary["recommended_results"] = sorted_results[:3]
565
+
566
+ # Generate warnings
567
+ if quality_distribution["low"] > 0:
568
+ warnings.append(f"{quality_distribution['low']} low quality result(s) detected")
569
+
570
+ https_count = sum(1 for r in results if r.get("link", "").startswith("https://"))
571
+ if https_count < len(results):
572
+ warnings.append(f"{len(results) - https_count} result(s) lack HTTPS")
573
+
574
+ # Generate suggestions
575
+ if freshness_distribution["old"] > len(results) / 2:
576
+ suggestions.append("Many results are outdated - consider adding date filter")
577
+
578
+ if quality_distribution["high"] < 3:
579
+ suggestions.append("Few high-quality results - try refining your query")
580
+
581
+ return summary