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,187 @@
1
+ """
2
+ Prompt Formatters
3
+
4
+ Utilities for formatting prompts with context.
5
+ """
6
+
7
+ from typing import List, Dict, Any, Optional
8
+ from aiecs.llm import LLMMessage
9
+
10
+
11
+ def format_conversation_history(
12
+ history: List[LLMMessage],
13
+ max_messages: Optional[int] = None,
14
+ format_style: str = "compact",
15
+ ) -> str:
16
+ """
17
+ Format conversation history as string.
18
+
19
+ Args:
20
+ history: List of LLMMessage instances
21
+ max_messages: Optional limit on number of messages
22
+ format_style: "compact" or "detailed"
23
+
24
+ Returns:
25
+ Formatted conversation string
26
+ """
27
+ if max_messages:
28
+ history = history[-max_messages:]
29
+
30
+ if format_style == "compact":
31
+ lines = []
32
+ for msg in history:
33
+ lines.append(f"{msg.role.upper()}: {msg.content}")
34
+ return "\n".join(lines)
35
+
36
+ elif format_style == "detailed":
37
+ lines = []
38
+ for i, msg in enumerate(history):
39
+ lines.append(f"[{i+1}] {msg.role.upper()}")
40
+ lines.append(msg.content)
41
+ lines.append("") # Empty line between messages
42
+ return "\n".join(lines)
43
+
44
+ else:
45
+ raise ValueError(f"Unknown format_style: {format_style}")
46
+
47
+
48
+ def format_tool_result(
49
+ tool_name: str,
50
+ result: Any,
51
+ success: bool = True,
52
+ error: Optional[str] = None,
53
+ ) -> str:
54
+ """
55
+ Format tool execution result.
56
+
57
+ Args:
58
+ tool_name: Tool name
59
+ result: Tool result (if successful)
60
+ success: Whether execution succeeded
61
+ error: Error message (if failed)
62
+
63
+ Returns:
64
+ Formatted tool result string
65
+ """
66
+ if success:
67
+ return f"Tool '{tool_name}' returned:\n{result}"
68
+ else:
69
+ return f"Tool '{tool_name}' failed: {error}"
70
+
71
+
72
+ def truncate_context(
73
+ text: str,
74
+ max_length: int,
75
+ strategy: str = "middle",
76
+ placeholder: str = "...",
77
+ ) -> str:
78
+ """
79
+ Truncate text to fit within max_length.
80
+
81
+ Args:
82
+ text: Text to truncate
83
+ max_length: Maximum length
84
+ strategy: "start", "middle", or "end"
85
+ placeholder: Placeholder for truncated content
86
+
87
+ Returns:
88
+ Truncated text
89
+ """
90
+ if len(text) <= max_length:
91
+ return text
92
+
93
+ if strategy == "end":
94
+ # Keep start, truncate end
95
+ return text[: max_length - len(placeholder)] + placeholder
96
+
97
+ elif strategy == "start":
98
+ # Truncate start, keep end
99
+ return placeholder + text[-(max_length - len(placeholder)) :]
100
+
101
+ elif strategy == "middle":
102
+ # Keep start and end, truncate middle
103
+ half = (max_length - len(placeholder)) // 2
104
+ return text[:half] + placeholder + text[-half:]
105
+
106
+ else:
107
+ raise ValueError(f"Unknown strategy: {strategy}")
108
+
109
+
110
+ def format_list_items(items: List[str], style: str = "bullets") -> str:
111
+ """
112
+ Format list items.
113
+
114
+ Args:
115
+ items: List of items
116
+ style: "bullets", "numbered", or "compact"
117
+
118
+ Returns:
119
+ Formatted list string
120
+ """
121
+ if style == "bullets":
122
+ return "\n".join(f"• {item}" for item in items)
123
+
124
+ elif style == "numbered":
125
+ return "\n".join(f"{i+1}. {item}" for i, item in enumerate(items))
126
+
127
+ elif style == "compact":
128
+ return ", ".join(items)
129
+
130
+ else:
131
+ raise ValueError(f"Unknown style: {style}")
132
+
133
+
134
+ def format_key_value_pairs(
135
+ data: Dict[str, Any],
136
+ separator: str = ": ",
137
+ exclude_keys: Optional[List[str]] = None,
138
+ ) -> str:
139
+ """
140
+ Format dictionary as key-value pairs.
141
+
142
+ Args:
143
+ data: Dictionary to format
144
+ separator: Separator between key and value
145
+ exclude_keys: Keys to exclude
146
+
147
+ Returns:
148
+ Formatted string
149
+ """
150
+ exclude_keys = exclude_keys or []
151
+ lines = []
152
+
153
+ for key, value in data.items():
154
+ if key in exclude_keys or key.startswith("_"):
155
+ continue
156
+ lines.append(f"{key}{separator}{value}")
157
+
158
+ return "\n".join(lines)
159
+
160
+
161
+ def inject_context_in_prompt(prompt: str, context: Dict[str, Any], context_marker: str = "{context}") -> str:
162
+ """
163
+ Inject context into prompt at marker position.
164
+
165
+ Args:
166
+ prompt: Prompt template with context marker
167
+ context: Context dictionary
168
+ context_marker: Marker to replace with context
169
+
170
+ Returns:
171
+ Prompt with context injected
172
+ """
173
+ context_str = format_key_value_pairs(context)
174
+ return prompt.replace(context_marker, context_str)
175
+
176
+
177
+ def estimate_token_count(text: str) -> int:
178
+ """
179
+ Rough estimation of token count.
180
+
181
+ Args:
182
+ text: Text to estimate
183
+
184
+ Returns:
185
+ Estimated token count (4 chars ≈ 1 token)
186
+ """
187
+ return len(text) // 4
@@ -0,0 +1,255 @@
1
+ """
2
+ Prompt Templates
3
+
4
+ Native template system with variable substitution.
5
+ """
6
+
7
+ import re
8
+ from typing import Dict, List, Optional
9
+ from dataclasses import dataclass
10
+
11
+ from aiecs.llm import LLMMessage
12
+
13
+
14
+ class TemplateMissingVariableError(Exception):
15
+ """Raised when required template variable is missing."""
16
+
17
+
18
+ class PromptTemplate:
19
+ """
20
+ String-based prompt template with {variable} substitution.
21
+
22
+ Example:
23
+ template = PromptTemplate(
24
+ "Hello {name}, you are a {role}.",
25
+ required_variables=["name", "role"]
26
+ )
27
+ result = template.format(name="Alice", role="developer")
28
+ """
29
+
30
+ def __init__(
31
+ self,
32
+ template: str,
33
+ required_variables: Optional[List[str]] = None,
34
+ defaults: Optional[Dict[str, str]] = None,
35
+ ):
36
+ """
37
+ Initialize prompt template.
38
+
39
+ Args:
40
+ template: Template string with {variable} placeholders
41
+ required_variables: List of required variable names
42
+ defaults: Default values for optional variables
43
+ """
44
+ self.template = template
45
+ self.required_variables = required_variables or []
46
+ self.defaults = defaults or {}
47
+
48
+ # Extract all variables from template
49
+ self._extract_variables()
50
+
51
+ def _extract_variables(self) -> None:
52
+ """Extract variable names from template."""
53
+ # Find all {variable_name} patterns
54
+ pattern = r"\{(\w+)\}"
55
+ self.variables = set(re.findall(pattern, self.template))
56
+
57
+ def format(self, **kwargs) -> str:
58
+ """
59
+ Format template with provided variables.
60
+
61
+ Args:
62
+ **kwargs: Variable values
63
+
64
+ Returns:
65
+ Formatted string
66
+
67
+ Raises:
68
+ TemplateMissingVariableError: If required variable missing
69
+ """
70
+ # Check required variables
71
+ for var in self.required_variables:
72
+ if var not in kwargs and var not in self.defaults:
73
+ raise TemplateMissingVariableError(f"Required variable '{var}' not provided")
74
+
75
+ # Merge with defaults
76
+ values = {**self.defaults, **kwargs}
77
+
78
+ # Format template
79
+ try:
80
+ return self.template.format(**values)
81
+ except KeyError as e:
82
+ raise TemplateMissingVariableError(f"Variable {e} not provided and has no default")
83
+
84
+ def partial(self, **kwargs) -> "PromptTemplate":
85
+ """
86
+ Create a partial template with some variables pre-filled.
87
+
88
+ Args:
89
+ **kwargs: Variable values to pre-fill
90
+
91
+ Returns:
92
+ New PromptTemplate with updated defaults
93
+ """
94
+ new_defaults = {**self.defaults, **kwargs}
95
+ return PromptTemplate(
96
+ template=self.template,
97
+ required_variables=self.required_variables,
98
+ defaults=new_defaults,
99
+ )
100
+
101
+ def __repr__(self) -> str:
102
+ return f"PromptTemplate(variables={self.variables})"
103
+
104
+
105
+ @dataclass
106
+ class MessageTemplate:
107
+ """Template for a single message."""
108
+
109
+ role: str
110
+ content: str
111
+
112
+
113
+ class ChatPromptTemplate:
114
+ """
115
+ Multi-message chat template.
116
+
117
+ Example:
118
+ template = ChatPromptTemplate([
119
+ MessageTemplate("system", "You are a {role}."),
120
+ MessageTemplate("user", "{task}"),
121
+ ])
122
+ messages = template.format_messages(role="assistant", task="Help me")
123
+ """
124
+
125
+ def __init__(
126
+ self,
127
+ messages: List[MessageTemplate],
128
+ required_variables: Optional[List[str]] = None,
129
+ defaults: Optional[Dict[str, str]] = None,
130
+ ):
131
+ """
132
+ Initialize chat template.
133
+
134
+ Args:
135
+ messages: List of message templates
136
+ required_variables: List of required variable names
137
+ defaults: Default values for optional variables
138
+ """
139
+ self.messages = messages
140
+ self.required_variables = required_variables or []
141
+ self.defaults = defaults or {}
142
+
143
+ # Extract all variables
144
+ self._extract_variables()
145
+
146
+ def _extract_variables(self) -> None:
147
+ """Extract variables from all message templates."""
148
+ self.variables = set()
149
+ pattern = r"\{(\w+)\}"
150
+
151
+ for msg in self.messages:
152
+ vars_in_msg = set(re.findall(pattern, msg.content))
153
+ self.variables.update(vars_in_msg)
154
+
155
+ def format_messages(self, **kwargs) -> List[LLMMessage]:
156
+ """
157
+ Format all messages with provided variables.
158
+
159
+ Args:
160
+ **kwargs: Variable values
161
+
162
+ Returns:
163
+ List of LLMMessage instances
164
+
165
+ Raises:
166
+ TemplateMissingVariableError: If required variable missing
167
+ """
168
+ # Check required variables
169
+ for var in self.required_variables:
170
+ if var not in kwargs and var not in self.defaults:
171
+ raise TemplateMissingVariableError(f"Required variable '{var}' not provided")
172
+
173
+ # Merge with defaults
174
+ values = {**self.defaults, **kwargs}
175
+
176
+ # Format each message
177
+ formatted_messages = []
178
+ for msg_template in self.messages:
179
+ try:
180
+ content = msg_template.content.format(**values)
181
+ formatted_messages.append(LLMMessage(role=msg_template.role, content=content))
182
+ except KeyError as e:
183
+ raise TemplateMissingVariableError(f"Variable {e} not provided and has no default")
184
+
185
+ return formatted_messages
186
+
187
+ def partial(self, **kwargs) -> "ChatPromptTemplate":
188
+ """
189
+ Create a partial template with some variables pre-filled.
190
+
191
+ Args:
192
+ **kwargs: Variable values to pre-fill
193
+
194
+ Returns:
195
+ New ChatPromptTemplate with updated defaults
196
+ """
197
+ new_defaults = {**self.defaults, **kwargs}
198
+ return ChatPromptTemplate(
199
+ messages=self.messages,
200
+ required_variables=self.required_variables,
201
+ defaults=new_defaults,
202
+ )
203
+
204
+ def add_message(self, role: str, content: str) -> "ChatPromptTemplate":
205
+ """
206
+ Add a message to the template.
207
+
208
+ Args:
209
+ role: Message role
210
+ content: Message content template
211
+
212
+ Returns:
213
+ New ChatPromptTemplate with added message
214
+ """
215
+ new_messages = self.messages + [MessageTemplate(role, content)]
216
+ return ChatPromptTemplate(
217
+ messages=new_messages,
218
+ required_variables=self.required_variables,
219
+ defaults=self.defaults,
220
+ )
221
+
222
+ def __repr__(self) -> str:
223
+ return f"ChatPromptTemplate(messages={len(self.messages)}, variables={self.variables})"
224
+
225
+
226
+ def create_system_prompt(content: str) -> ChatPromptTemplate:
227
+ """
228
+ Helper to create a chat template with system message.
229
+
230
+ Args:
231
+ content: System message content
232
+
233
+ Returns:
234
+ ChatPromptTemplate with system message
235
+ """
236
+ return ChatPromptTemplate([MessageTemplate("system", content)])
237
+
238
+
239
+ def create_basic_chat(system: str, user: str) -> ChatPromptTemplate:
240
+ """
241
+ Helper to create a basic system + user chat template.
242
+
243
+ Args:
244
+ system: System message content
245
+ user: User message content
246
+
247
+ Returns:
248
+ ChatPromptTemplate with system and user messages
249
+ """
250
+ return ChatPromptTemplate(
251
+ [
252
+ MessageTemplate("system", system),
253
+ MessageTemplate("user", user),
254
+ ]
255
+ )
@@ -0,0 +1,253 @@
1
+ """
2
+ Agent Registry
3
+
4
+ Central registry for tracking and managing active agents.
5
+ """
6
+
7
+ import logging
8
+ from typing import Dict, List, Optional, Set
9
+
10
+ from .base_agent import BaseAIAgent
11
+ from .models import AgentState, AgentType
12
+ from .exceptions import AgentNotFoundError, AgentAlreadyRegisteredError
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class AgentRegistry:
18
+ """
19
+ Central registry for tracking and managing active agents.
20
+
21
+ Thread-safe registry for agent lifecycle management.
22
+ """
23
+
24
+ def __init__(self) -> None:
25
+ """Initialize agent registry."""
26
+ self._agents: Dict[str, BaseAIAgent] = {}
27
+ self._agents_by_type: Dict[AgentType, Set[str]] = {}
28
+ self._agents_by_state: Dict[AgentState, Set[str]] = {}
29
+
30
+ logger.info("AgentRegistry initialized")
31
+
32
+ def register(self, agent: BaseAIAgent) -> None:
33
+ """
34
+ Register an agent.
35
+
36
+ Args:
37
+ agent: Agent to register
38
+
39
+ Raises:
40
+ AgentAlreadyRegisteredError: If agent already registered
41
+ """
42
+ if agent.agent_id in self._agents:
43
+ raise AgentAlreadyRegisteredError(agent.agent_id)
44
+
45
+ # Register agent
46
+ self._agents[agent.agent_id] = agent
47
+
48
+ # Index by type
49
+ if agent.agent_type not in self._agents_by_type:
50
+ self._agents_by_type[agent.agent_type] = set()
51
+ self._agents_by_type[agent.agent_type].add(agent.agent_id)
52
+
53
+ # Index by state
54
+ if agent.state not in self._agents_by_state:
55
+ self._agents_by_state[agent.state] = set()
56
+ self._agents_by_state[agent.state].add(agent.agent_id)
57
+
58
+ logger.info(f"Agent registered: {agent.agent_id} ({agent.agent_type.value})")
59
+
60
+ def unregister(self, agent_id: str) -> None:
61
+ """
62
+ Unregister an agent.
63
+
64
+ Args:
65
+ agent_id: Agent identifier
66
+
67
+ Raises:
68
+ AgentNotFoundError: If agent not found
69
+ """
70
+ agent = self.get(agent_id)
71
+
72
+ # Remove from indexes
73
+ if agent.agent_type in self._agents_by_type:
74
+ self._agents_by_type[agent.agent_type].discard(agent_id)
75
+
76
+ if agent.state in self._agents_by_state:
77
+ self._agents_by_state[agent.state].discard(agent_id)
78
+
79
+ # Remove from main registry
80
+ del self._agents[agent_id]
81
+
82
+ logger.info(f"Agent unregistered: {agent_id}")
83
+
84
+ def get(self, agent_id: str) -> BaseAIAgent:
85
+ """
86
+ Get agent by ID.
87
+
88
+ Args:
89
+ agent_id: Agent identifier
90
+
91
+ Returns:
92
+ Agent instance
93
+
94
+ Raises:
95
+ AgentNotFoundError: If agent not found
96
+ """
97
+ if agent_id not in self._agents:
98
+ raise AgentNotFoundError(agent_id)
99
+
100
+ return self._agents[agent_id]
101
+
102
+ def get_optional(self, agent_id: str) -> Optional[BaseAIAgent]:
103
+ """
104
+ Get agent by ID, returning None if not found.
105
+
106
+ Args:
107
+ agent_id: Agent identifier
108
+
109
+ Returns:
110
+ Agent instance or None
111
+ """
112
+ return self._agents.get(agent_id)
113
+
114
+ def exists(self, agent_id: str) -> bool:
115
+ """
116
+ Check if agent exists.
117
+
118
+ Args:
119
+ agent_id: Agent identifier
120
+
121
+ Returns:
122
+ True if agent exists
123
+ """
124
+ return agent_id in self._agents
125
+
126
+ def list_all(self) -> List[BaseAIAgent]:
127
+ """
128
+ List all registered agents.
129
+
130
+ Returns:
131
+ List of all agents
132
+ """
133
+ return list(self._agents.values())
134
+
135
+ def list_by_type(self, agent_type: AgentType) -> List[BaseAIAgent]:
136
+ """
137
+ List agents by type.
138
+
139
+ Args:
140
+ agent_type: Agent type
141
+
142
+ Returns:
143
+ List of agents of specified type
144
+ """
145
+ agent_ids = self._agents_by_type.get(agent_type, set())
146
+ return [self._agents[aid] for aid in agent_ids if aid in self._agents]
147
+
148
+ def list_by_state(self, state: AgentState) -> List[BaseAIAgent]:
149
+ """
150
+ List agents by state.
151
+
152
+ Args:
153
+ state: Agent state
154
+
155
+ Returns:
156
+ List of agents in specified state
157
+ """
158
+ agent_ids = self._agents_by_state.get(state, set())
159
+ return [self._agents[aid] for aid in agent_ids if aid in self._agents]
160
+
161
+ def update_state_index(self, agent_id: str, old_state: AgentState, new_state: AgentState) -> None:
162
+ """
163
+ Update state index when agent state changes.
164
+
165
+ Args:
166
+ agent_id: Agent identifier
167
+ old_state: Previous state
168
+ new_state: New state
169
+ """
170
+ # Remove from old state index
171
+ if old_state in self._agents_by_state:
172
+ self._agents_by_state[old_state].discard(agent_id)
173
+
174
+ # Add to new state index
175
+ if new_state not in self._agents_by_state:
176
+ self._agents_by_state[new_state] = set()
177
+ self._agents_by_state[new_state].add(agent_id)
178
+
179
+ def count(self) -> int:
180
+ """
181
+ Get total number of registered agents.
182
+
183
+ Returns:
184
+ Number of agents
185
+ """
186
+ return len(self._agents)
187
+
188
+ def count_by_type(self, agent_type: AgentType) -> int:
189
+ """
190
+ Get count of agents by type.
191
+
192
+ Args:
193
+ agent_type: Agent type
194
+
195
+ Returns:
196
+ Number of agents of specified type
197
+ """
198
+ return len(self._agents_by_type.get(agent_type, set()))
199
+
200
+ def count_by_state(self, state: AgentState) -> int:
201
+ """
202
+ Get count of agents by state.
203
+
204
+ Args:
205
+ state: Agent state
206
+
207
+ Returns:
208
+ Number of agents in specified state
209
+ """
210
+ return len(self._agents_by_state.get(state, set()))
211
+
212
+ def get_stats(self) -> Dict:
213
+ """
214
+ Get registry statistics.
215
+
216
+ Returns:
217
+ Dictionary with stats
218
+ """
219
+ return {
220
+ "total_agents": self.count(),
221
+ "by_type": {agent_type.value: len(agent_ids) for agent_type, agent_ids in self._agents_by_type.items()},
222
+ "by_state": {state.value: len(agent_ids) for state, agent_ids in self._agents_by_state.items()},
223
+ }
224
+
225
+ def clear(self) -> None:
226
+ """Clear all agents from registry."""
227
+ self._agents.clear()
228
+ self._agents_by_type.clear()
229
+ self._agents_by_state.clear()
230
+ logger.info("AgentRegistry cleared")
231
+
232
+
233
+ # Global registry instance
234
+ _global_registry: Optional[AgentRegistry] = None
235
+
236
+
237
+ def get_global_registry() -> AgentRegistry:
238
+ """
239
+ Get or create global agent registry.
240
+
241
+ Returns:
242
+ Global AgentRegistry instance
243
+ """
244
+ global _global_registry
245
+ if _global_registry is None:
246
+ _global_registry = AgentRegistry()
247
+ return _global_registry
248
+
249
+
250
+ def reset_global_registry() -> None:
251
+ """Reset global registry (primarily for testing)."""
252
+ global _global_registry
253
+ _global_registry = None