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,548 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ 检查所有注册工具的配置设置是否正确
4
+
5
+ 验证所有工具是否正确使用 self._config_obj 而不是重新创建 Config 对象
6
+ 并提取打印所有工具的配置信息,方便开发者配置
7
+ """
8
+
9
+ import sys
10
+ import os
11
+ import re
12
+ import inspect
13
+ import json
14
+ from typing import List, Tuple, Dict, Any, Optional
15
+ from pathlib import Path
16
+
17
+ # Add project root to path
18
+ sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
19
+
20
+
21
+ def find_all_tool_files() -> List[str]:
22
+ """查找所有工具文件"""
23
+ tool_files = []
24
+ # 从脚本位置向上找到项目根目录
25
+ script_dir = os.path.dirname(os.path.abspath(__file__))
26
+ project_root = os.path.abspath(os.path.join(script_dir, '../../..'))
27
+ tools_dir = os.path.join(project_root, 'aiecs', 'tools')
28
+
29
+ for root, dirs, files in os.walk(tools_dir):
30
+ for file in files:
31
+ # 包含 _tool.py, tool.py, 以及 orchestrator.py 文件
32
+ if (file.endswith('_tool.py') or file == 'tool.py' or
33
+ file.endswith('orchestrator.py')):
34
+ if file != 'base_tool.py':
35
+ tool_files.append(os.path.join(root, file))
36
+
37
+ return sorted(tool_files)
38
+
39
+
40
+ def extract_config_fields(file_path: str, content: str) -> Dict[str, Any]:
41
+ """
42
+ 从工具文件中提取 Config 类的字段信息
43
+
44
+ Returns:
45
+ 包含配置字段信息的字典
46
+ """
47
+ config_fields = {}
48
+
49
+ # 提取 Config 类定义
50
+ config_class_match = re.search(
51
+ r'class Config\(BaseSettings\):(.*?)(?=\n class |\n def |\nclass |\Z)',
52
+ content,
53
+ re.DOTALL
54
+ )
55
+
56
+ if not config_class_match:
57
+ return config_fields
58
+
59
+ config_body = config_class_match.group(1)
60
+
61
+ # 提取字段定义 - 匹配各种模式
62
+ # 模式1: field_name: Type = default_value
63
+ # 模式2: field_name: Type = Field(default=..., description="...")
64
+ # 模式3: field_name: Type
65
+ field_pattern = r'^\s{8}(\w+)\s*:\s*([^=\n]+)(?:\s*=\s*(.+))?$'
66
+
67
+ lines = config_body.split('\n')
68
+ i = 0
69
+ while i < len(lines):
70
+ line = lines[i]
71
+
72
+ # 跳过注释和空行
73
+ if line.strip().startswith('#') or not line.strip():
74
+ i += 1
75
+ continue
76
+
77
+ # 跳过 model_config 和其他特殊配置
78
+ if 'model_config' in line or 'Config:' in line:
79
+ i += 1
80
+ continue
81
+
82
+ match = re.match(field_pattern, line)
83
+ if match:
84
+ field_name = match.group(1)
85
+ field_type = match.group(2).strip()
86
+ field_default = match.group(3).strip() if match.group(3) else None
87
+
88
+ # 提取描述信息
89
+ description = ""
90
+ if field_default and 'Field(' in field_default:
91
+ # 尝试提取 Field 中的 description
92
+ desc_match = re.search(r'description\s*=\s*["\']([^"\']+)["\']', field_default)
93
+ if desc_match:
94
+ description = desc_match.group(1)
95
+
96
+ # 提取实际默认值
97
+ default_match = re.search(r'default\s*=\s*([^,\)]+)', field_default)
98
+ if default_match:
99
+ field_default = default_match.group(1).strip()
100
+ elif 'default_factory' in field_default:
101
+ field_default = "factory function"
102
+ else:
103
+ # Field() 没有指定 default,表示必需字段
104
+ field_default = None
105
+
106
+ # 检查上一行是否有注释
107
+ if i > 0:
108
+ prev_line = lines[i-1].strip()
109
+ if prev_line.startswith('#'):
110
+ if not description:
111
+ description = prev_line[1:].strip()
112
+
113
+ # 判断是否必需(没有默认值且类型不是 Optional)
114
+ is_required = (field_default is None and
115
+ 'Optional' not in field_type and
116
+ '|' not in field_type or 'None' not in field_type)
117
+
118
+ config_fields[field_name] = {
119
+ 'type': field_type,
120
+ 'default': field_default,
121
+ 'required': is_required,
122
+ 'description': description
123
+ }
124
+
125
+ i += 1
126
+
127
+ return config_fields
128
+
129
+
130
+ def check_tool_init_pattern(file_path: str) -> Tuple[str, str, List[str], Dict[str, Any]]:
131
+ """
132
+ 检查工具的 __init__ 方法是否正确使用配置,并提取配置信息
133
+
134
+ Returns:
135
+ (tool_name, status, issues, config_fields)
136
+ status: 'CORRECT', 'INCORRECT', 'NO_CONFIG', 'NO_INIT', 'ERROR'
137
+ """
138
+ try:
139
+ with open(file_path, 'r', encoding='utf-8') as f:
140
+ content = f.read()
141
+
142
+ # 提取工具名称
143
+ tool_name_match = re.search(r'class (\w+Tool)\(BaseTool\)', content)
144
+ if not tool_name_match:
145
+ tool_name_match = re.search(r'class (\w+)\(BaseTool\)', content)
146
+
147
+ tool_name = tool_name_match.group(1) if tool_name_match else os.path.basename(file_path)
148
+
149
+ # 检查是否有 Config 类
150
+ has_config_class = bool(re.search(r'class Config\(BaseSettings\)', content))
151
+
152
+ # 提取配置字段
153
+ config_fields = extract_config_fields(file_path, content) if has_config_class else {}
154
+
155
+ if not has_config_class:
156
+ return tool_name, 'NO_CONFIG', [], config_fields
157
+
158
+ # 检查是否有 __init__ 方法
159
+ init_match = re.search(r'def __init__\(self[^)]*\):(.*?)(?=\n def |\nclass |\Z)', content, re.DOTALL)
160
+
161
+ if not init_match:
162
+ return tool_name, 'NO_INIT', [], config_fields
163
+
164
+ init_body = init_match.group(1)
165
+
166
+ issues = []
167
+
168
+ # 检查是否调用了 super().__init__
169
+ if 'super().__init__' not in init_body:
170
+ issues.append("未调用 super().__init__()")
171
+
172
+ # 检查错误模式:重新创建 Config 对象
173
+ incorrect_patterns = [
174
+ r'self\.config\s*=\s*self\.Config\(\*\*', # self.config = self.Config(**...)
175
+ r'self\.config\s*=\s*self\.Config\(\s*\)', # self.config = self.Config()
176
+ r'self\.config\s*=\s*Config\(\*\*', # self.config = Config(**...)
177
+ ]
178
+
179
+ for pattern in incorrect_patterns:
180
+ if re.search(pattern, init_body):
181
+ # 检查是否在正确的模式之前(即不是 self._config_obj 的回退)
182
+ if 'self._config_obj if self._config_obj else' not in init_body:
183
+ issues.append(f"发现错误模式: 直接创建 Config 对象")
184
+ break
185
+
186
+ # 检查正确模式:使用 self._config_obj
187
+ correct_pattern = r'self\.config\s*=\s*self\._config_obj\s+if\s+self\._config_obj\s+else\s+self\.Config\(\)'
188
+
189
+ if re.search(correct_pattern, init_body):
190
+ if not issues:
191
+ return tool_name, 'CORRECT', [], config_fields
192
+ else:
193
+ return tool_name, 'MIXED', issues, config_fields
194
+ else:
195
+ if not issues:
196
+ issues.append("未找到正确的配置模式 (self._config_obj)")
197
+ return tool_name, 'INCORRECT', issues, config_fields
198
+
199
+ except Exception as e:
200
+ return os.path.basename(file_path), 'ERROR', [str(e)], {}
201
+
202
+
203
+ def print_config_details(tool_name: str, config_fields: Dict[str, Any], indent: str = " "):
204
+ """打印配置字段详情"""
205
+ if not config_fields:
206
+ print(f"{indent}(无配置字段)")
207
+ return
208
+
209
+ print(f"{indent}配置字段 ({len(config_fields)} 个):")
210
+ for field_name, field_info in sorted(config_fields.items()):
211
+ required_marker = "🔴 必需" if field_info['required'] else "🟢 可选"
212
+ print(f"{indent} • {field_name}: {field_info['type']}")
213
+ print(f"{indent} {required_marker}")
214
+
215
+ if field_info['default'] is not None:
216
+ default_str = str(field_info['default'])
217
+ if len(default_str) > 50:
218
+ default_str = default_str[:47] + "..."
219
+ print(f"{indent} 默认值: {default_str}")
220
+
221
+ if field_info['description']:
222
+ desc = field_info['description']
223
+ if len(desc) > 60:
224
+ desc = desc[:57] + "..."
225
+ print(f"{indent} 说明: {desc}")
226
+
227
+
228
+ def generate_config_template(all_configs: Dict[str, Dict[str, Any]], output_file: str = None):
229
+ """生成配置模板文件"""
230
+
231
+ if output_file is None:
232
+ script_dir = os.path.dirname(os.path.abspath(__file__))
233
+ output_file = os.path.join(script_dir, 'tools_config_template.json')
234
+
235
+ template = {}
236
+
237
+ for tool_name, config_fields in sorted(all_configs.items()):
238
+ if not config_fields:
239
+ continue
240
+
241
+ tool_config = {}
242
+ for field_name, field_info in sorted(config_fields.items()):
243
+ # 为每个字段生成示例值
244
+ if field_info['default'] is not None:
245
+ value = field_info['default']
246
+ elif field_info['required']:
247
+ # 必需字段,根据类型提供示例
248
+ field_type = field_info['type'].lower()
249
+ if 'str' in field_type:
250
+ value = f"your_{field_name}_here"
251
+ elif 'int' in field_type:
252
+ value = 0
253
+ elif 'float' in field_type:
254
+ value = 0.0
255
+ elif 'bool' in field_type:
256
+ value = False
257
+ elif 'list' in field_type:
258
+ value = []
259
+ elif 'dict' in field_type:
260
+ value = {}
261
+ else:
262
+ value = None
263
+ else:
264
+ continue # 可选字段且没有默认值,跳过
265
+
266
+ tool_config[field_name] = {
267
+ "value": value,
268
+ "type": field_info['type'],
269
+ "required": field_info['required'],
270
+ "description": field_info['description']
271
+ }
272
+
273
+ if tool_config:
274
+ template[tool_name] = tool_config
275
+
276
+ # 写入文件
277
+ with open(output_file, 'w', encoding='utf-8') as f:
278
+ json.dump(template, f, indent=2, ensure_ascii=False)
279
+
280
+ return output_file
281
+
282
+
283
+ def generate_markdown_doc(all_configs: Dict[str, Dict[str, Any]], output_file: str = None):
284
+ """生成 Markdown 格式的配置文档"""
285
+
286
+ if output_file is None:
287
+ script_dir = os.path.dirname(os.path.abspath(__file__))
288
+ output_file = os.path.join(script_dir, 'TOOLS_CONFIG_GUIDE.md')
289
+
290
+ lines = []
291
+ lines.append("# AIECS 工具配置指南")
292
+ lines.append("")
293
+ lines.append("本文档列出了所有工具的配置参数,方便开发者快速配置和使用。")
294
+ lines.append("")
295
+ lines.append(f"生成时间: {Path(__file__).name}")
296
+ lines.append("")
297
+
298
+ # 目录
299
+ lines.append("## 目录")
300
+ lines.append("")
301
+ for i, tool_name in enumerate(sorted(all_configs.keys()), 1):
302
+ lines.append(f"{i}. [{tool_name}](#{tool_name.lower()})")
303
+ lines.append("")
304
+ lines.append("---")
305
+ lines.append("")
306
+
307
+ # 各工具详情
308
+ for tool_name, config_fields in sorted(all_configs.items()):
309
+ if not config_fields:
310
+ continue
311
+
312
+ lines.append(f"## {tool_name}")
313
+ lines.append("")
314
+
315
+ # 统计信息
316
+ required_count = sum(1 for f in config_fields.values() if f['required'])
317
+ optional_count = len(config_fields) - required_count
318
+ lines.append(f"**配置字段数**: {len(config_fields)} (必需: {required_count}, 可选: {optional_count})")
319
+ lines.append("")
320
+
321
+ # 配置表格
322
+ lines.append("| 字段名 | 类型 | 必需 | 默认值 | 说明 |")
323
+ lines.append("|--------|------|------|--------|------|")
324
+
325
+ for field_name, field_info in sorted(config_fields.items()):
326
+ field_type = field_info['type'].replace('|', '\\|')
327
+ required_marker = "✅" if field_info['required'] else "❌"
328
+ default_val = field_info['default'] if field_info['default'] is not None else "-"
329
+ if isinstance(default_val, str) and len(str(default_val)) > 30:
330
+ default_val = str(default_val)[:27] + "..."
331
+ description = field_info['description'] if field_info['description'] else "-"
332
+
333
+ lines.append(f"| `{field_name}` | {field_type} | {required_marker} | `{default_val}` | {description} |")
334
+
335
+ lines.append("")
336
+
337
+ # 配置示例
338
+ lines.append("### 配置示例")
339
+ lines.append("")
340
+ lines.append("```python")
341
+ lines.append(f"{tool_name.lower()}_config = {{")
342
+
343
+ for field_name, field_info in sorted(config_fields.items()):
344
+ if field_info['default'] is not None:
345
+ value = field_info['default']
346
+ else:
347
+ field_type = field_info['type'].lower()
348
+ if 'str' in field_type:
349
+ value = f'"your_{field_name}"'
350
+ elif 'int' in field_type:
351
+ value = 0
352
+ elif 'float' in field_type:
353
+ value = 0.0
354
+ elif 'bool' in field_type:
355
+ value = 'False'
356
+ elif 'list' in field_type:
357
+ value = '[]'
358
+ elif 'dict' in field_type:
359
+ value = '{}'
360
+ else:
361
+ value = 'None'
362
+
363
+ comment = f" # {field_info['description']}" if field_info['description'] else ""
364
+ lines.append(f" '{field_name}': {value},{comment}")
365
+
366
+ lines.append("}")
367
+ lines.append("```")
368
+ lines.append("")
369
+
370
+ # 环境变量映射
371
+ lines.append("### 环境变量映射")
372
+ lines.append("")
373
+ lines.append("```bash")
374
+ for field_name in sorted(config_fields.keys()):
375
+ env_var = f"{tool_name.upper().replace('TOOL', '_TOOL').replace('ORCHESTRATOR', '_ORCHESTRATOR')}_{field_name.upper()}"
376
+ lines.append(f"export {env_var}=<value>")
377
+ lines.append("```")
378
+ lines.append("")
379
+ lines.append("---")
380
+ lines.append("")
381
+
382
+ # 写入文件
383
+ with open(output_file, 'w', encoding='utf-8') as f:
384
+ f.write('\n'.join(lines))
385
+
386
+ return output_file
387
+
388
+
389
+ def main():
390
+ """检查所有工具并展示配置信息"""
391
+ import argparse
392
+
393
+ parser = argparse.ArgumentParser(description='检查所有工具的配置并展示配置信息')
394
+ parser.add_argument('--show-config', action='store_true',
395
+ help='显示每个工具的详细配置信息')
396
+ parser.add_argument('--generate-template', action='store_true',
397
+ help='生成 JSON 格式配置模板文件')
398
+ parser.add_argument('--generate-markdown', action='store_true',
399
+ help='生成 Markdown 格式配置文档')
400
+ parser.add_argument('--output', type=str,
401
+ help='配置模板输出文件路径')
402
+ parser.add_argument('--markdown-output', type=str,
403
+ help='Markdown 文档输出文件路径')
404
+
405
+ args = parser.parse_args()
406
+
407
+ print("="*80)
408
+ print("检查所有注册工具的配置设置")
409
+ print("="*80)
410
+
411
+ tool_files = find_all_tool_files()
412
+ print(f"\n找到 {len(tool_files)} 个工具文件\n")
413
+
414
+ results = {
415
+ 'CORRECT': [],
416
+ 'INCORRECT': [],
417
+ 'NO_CONFIG': [],
418
+ 'NO_INIT': [],
419
+ 'MIXED': [],
420
+ 'ERROR': []
421
+ }
422
+
423
+ all_configs = {}
424
+
425
+ for file_path in tool_files:
426
+ rel_path = os.path.relpath(file_path, os.path.join(os.path.dirname(__file__), '..'))
427
+ tool_name, status, issues, config_fields = check_tool_init_pattern(file_path)
428
+
429
+ results[status].append((tool_name, rel_path, issues, config_fields))
430
+
431
+ if config_fields:
432
+ all_configs[tool_name] = config_fields
433
+
434
+ # 打印结果
435
+ print("\n" + "="*80)
436
+ print("配置检查结果")
437
+ print("="*80)
438
+
439
+ # 正确的工具
440
+ if results['CORRECT']:
441
+ print(f"\n✅ 正确配置 ({len(results['CORRECT'])} 个):")
442
+ for tool_name, rel_path, _, config_fields in results['CORRECT']:
443
+ print(f" ✓ {tool_name}")
444
+ print(f" 文件: {rel_path}")
445
+ if args.show_config and config_fields:
446
+ print_config_details(tool_name, config_fields)
447
+
448
+ # 错误的工具
449
+ if results['INCORRECT']:
450
+ print(f"\n❌ 错误配置 ({len(results['INCORRECT'])} 个):")
451
+ for tool_name, rel_path, issues, config_fields in results['INCORRECT']:
452
+ print(f" ✗ {tool_name}")
453
+ print(f" 文件: {rel_path}")
454
+ for issue in issues:
455
+ print(f" 问题: {issue}")
456
+ if args.show_config and config_fields:
457
+ print_config_details(tool_name, config_fields)
458
+
459
+ # 混合模式
460
+ if results['MIXED']:
461
+ print(f"\n⚠️ 混合模式 ({len(results['MIXED'])} 个):")
462
+ for tool_name, rel_path, issues, config_fields in results['MIXED']:
463
+ print(f" ⚠ {tool_name}")
464
+ print(f" 文件: {rel_path}")
465
+ for issue in issues:
466
+ print(f" 问题: {issue}")
467
+ if args.show_config and config_fields:
468
+ print_config_details(tool_name, config_fields)
469
+
470
+ # 无配置类
471
+ if results['NO_CONFIG']:
472
+ print(f"\n📝 无 Config 类 ({len(results['NO_CONFIG'])} 个):")
473
+ for tool_name, rel_path, _, _ in results['NO_CONFIG']:
474
+ print(f" - {tool_name}")
475
+
476
+ # 无 __init__ 方法
477
+ if results['NO_INIT']:
478
+ print(f"\n📝 无 __init__ 方法 ({len(results['NO_INIT'])} 个):")
479
+ for tool_name, rel_path, _, config_fields in results['NO_INIT']:
480
+ print(f" - {tool_name}")
481
+ if args.show_config and config_fields:
482
+ print_config_details(tool_name, config_fields)
483
+
484
+ # 错误
485
+ if results['ERROR']:
486
+ print(f"\n⚠️ 检查错误 ({len(results['ERROR'])} 个):")
487
+ for tool_name, rel_path, issues, _ in results['ERROR']:
488
+ print(f" ! {tool_name}")
489
+ print(f" 文件: {rel_path}")
490
+ for issue in issues:
491
+ print(f" 错误: {issue}")
492
+
493
+ # 配置信息总结
494
+ if all_configs and not args.show_config:
495
+ print("\n" + "="*80)
496
+ print("配置信息概览")
497
+ print("="*80)
498
+ print(f"\n共有 {len(all_configs)} 个工具包含配置类")
499
+
500
+ total_fields = sum(len(fields) for fields in all_configs.values())
501
+ print(f"总配置字段数: {total_fields}")
502
+
503
+ print("\n提示: 使用 --show-config 参数查看所有工具的详细配置信息")
504
+ print("提示: 使用 --generate-template 生成配置模板文件")
505
+
506
+ # 生成配置模板
507
+ if args.generate_template:
508
+ print("\n" + "="*80)
509
+ print("生成 JSON 配置模板")
510
+ print("="*80)
511
+ template_file = generate_config_template(all_configs, args.output)
512
+ print(f"\n✅ JSON 配置模板已生成: {template_file}")
513
+ print(f" 包含 {len(all_configs)} 个工具的配置信息")
514
+
515
+ # 生成 Markdown 文档
516
+ if args.generate_markdown:
517
+ print("\n" + "="*80)
518
+ print("生成 Markdown 配置文档")
519
+ print("="*80)
520
+ markdown_file = generate_markdown_doc(all_configs, args.markdown_output)
521
+ print(f"\n✅ Markdown 配置文档已生成: {markdown_file}")
522
+ print(f" 包含 {len(all_configs)} 个工具的详细配置说明")
523
+
524
+ # 总结
525
+ print("\n" + "="*80)
526
+ print("检查总结")
527
+ print("="*80)
528
+ total = len(tool_files)
529
+ correct = len(results['CORRECT'])
530
+ incorrect = len(results['INCORRECT']) + len(results['MIXED'])
531
+ no_config = len(results['NO_CONFIG']) + len(results['NO_INIT'])
532
+
533
+ print(f"总工具数: {total}")
534
+ print(f"✅ 正确配置: {correct}")
535
+ print(f"❌ 需要修复: {incorrect}")
536
+ print(f"📝 无需配置: {no_config}")
537
+
538
+ if incorrect > 0:
539
+ print(f"\n⚠️ 发现 {incorrect} 个工具需要修复配置!")
540
+ return 1
541
+ else:
542
+ print(f"\n✅ 所有工具配置正确!")
543
+ return 0
544
+
545
+
546
+ if __name__ == "__main__":
547
+ sys.exit(main())
548
+