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,99 @@
1
+ """
2
+ Agent Domain Exceptions
3
+
4
+ Defines agent-specific exceptions for the base AI agent model.
5
+ """
6
+
7
+ from typing import Optional
8
+
9
+
10
+ class AgentException(Exception):
11
+ """Base exception for agent-related errors."""
12
+
13
+ def __init__(self, message: str, agent_id: Optional[str] = None):
14
+ super().__init__(message)
15
+ self.agent_id = agent_id
16
+ self.message = message
17
+
18
+
19
+ class AgentNotFoundError(AgentException):
20
+ """Raised when an agent cannot be found."""
21
+
22
+ def __init__(self, agent_id: str, message: Optional[str] = None):
23
+ msg = message or f"Agent with ID '{agent_id}' not found"
24
+ super().__init__(msg, agent_id)
25
+
26
+
27
+ class AgentAlreadyRegisteredError(AgentException):
28
+ """Raised when attempting to register an agent with an existing ID."""
29
+
30
+ def __init__(self, agent_id: str):
31
+ msg = f"Agent with ID '{agent_id}' is already registered"
32
+ super().__init__(msg, agent_id)
33
+
34
+
35
+ class InvalidStateTransitionError(AgentException):
36
+ """Raised when an invalid agent state transition is attempted."""
37
+
38
+ def __init__(
39
+ self,
40
+ agent_id: str,
41
+ current_state: str,
42
+ attempted_state: str,
43
+ message: Optional[str] = None,
44
+ ):
45
+ msg = message or f"Invalid state transition for agent '{agent_id}': " f"cannot transition from '{current_state}' to '{attempted_state}'"
46
+ super().__init__(msg, agent_id)
47
+ self.current_state = current_state
48
+ self.attempted_state = attempted_state
49
+
50
+
51
+ class ConfigurationError(AgentException):
52
+ """Raised when agent configuration is invalid."""
53
+
54
+ def __init__(
55
+ self,
56
+ message: str,
57
+ agent_id: Optional[str] = None,
58
+ field: Optional[str] = None,
59
+ ):
60
+ super().__init__(message, agent_id)
61
+ self.field = field
62
+
63
+
64
+ class TaskExecutionError(AgentException):
65
+ """Raised when task execution fails."""
66
+
67
+ def __init__(
68
+ self,
69
+ message: str,
70
+ agent_id: Optional[str] = None,
71
+ task_id: Optional[str] = None,
72
+ retry_count: Optional[int] = None,
73
+ ):
74
+ super().__init__(message, agent_id)
75
+ self.task_id = task_id
76
+ self.retry_count = retry_count
77
+
78
+
79
+ class ToolAccessDeniedError(AgentException):
80
+ """Raised when an agent attempts to use a tool it doesn't have access to."""
81
+
82
+ def __init__(self, agent_id: str, tool_name: str):
83
+ msg = f"Agent '{agent_id}' does not have access to tool '{tool_name}'"
84
+ super().__init__(msg, agent_id)
85
+ self.tool_name = tool_name
86
+
87
+
88
+ class SerializationError(AgentException):
89
+ """Raised when agent serialization/deserialization fails."""
90
+
91
+ def __init__(self, message: str, agent_id: Optional[str] = None):
92
+ super().__init__(message, agent_id)
93
+
94
+
95
+ class AgentInitializationError(AgentException):
96
+ """Raised when agent initialization fails."""
97
+
98
+ def __init__(self, message: str, agent_id: Optional[str] = None):
99
+ super().__init__(message, agent_id)
@@ -0,0 +1,569 @@
1
+ """
2
+ Graph-Aware Agent Mixin
3
+
4
+ Provides reusable knowledge graph functionality for agents.
5
+ Can be mixed into any agent class to add graph capabilities.
6
+ """
7
+
8
+ import logging
9
+ from typing import Dict, List, Any, Optional, Set, TYPE_CHECKING
10
+
11
+ from aiecs.domain.knowledge_graph.models.entity import Entity
12
+ from aiecs.domain.knowledge_graph.models.relation import Relation
13
+ from aiecs.domain.knowledge_graph.models.path import Path
14
+
15
+ if TYPE_CHECKING:
16
+ from aiecs.infrastructure.graph_storage.protocols import GraphAwareAgentMixinProtocol
17
+ from aiecs.infrastructure.graph_storage.base import GraphStore
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ class GraphAwareAgentMixin:
23
+ """
24
+ Mixin to add knowledge graph capabilities to any agent.
25
+
26
+ Provides:
27
+ - Graph store integration
28
+ - Knowledge formatting utilities
29
+ - Graph query helpers
30
+ - Entity/relation utilities
31
+
32
+ This mixin expects the class it's mixed into to implement `GraphAwareAgentMixinProtocol`,
33
+ specifically the `graph_store` attribute.
34
+
35
+ Usage:
36
+ class MyAgent(BaseAIAgent, GraphAwareAgentMixin):
37
+ def __init__(self, graph_store, ...):
38
+ super().__init__(...)
39
+ self.graph_store = graph_store
40
+ """
41
+
42
+ if TYPE_CHECKING:
43
+ # Type hint for mypy: this mixin expects GraphAwareAgentMixinProtocol
44
+ graph_store: Optional["GraphStore"]
45
+
46
+ # ==================== Knowledge Formatting ====================
47
+
48
+ def format_entity(self, entity: Entity, include_properties: bool = True) -> str:
49
+ """
50
+ Format a single entity as a readable string.
51
+
52
+ Args:
53
+ entity: Entity to format
54
+ include_properties: Whether to include properties
55
+
56
+ Returns:
57
+ Formatted string
58
+
59
+ Example:
60
+ >>> entity = Entity(id="alice", entity_type="Person", properties={"name": "Alice"})
61
+ >>> mixin.format_entity(entity)
62
+ "Person: alice (name=Alice)"
63
+ """
64
+ parts = [f"{entity.entity_type}: {entity.id}"]
65
+
66
+ if include_properties and entity.properties:
67
+ props_str = ", ".join(f"{k}={v}" for k, v in entity.properties.items())
68
+ parts.append(f"({props_str})")
69
+
70
+ return " ".join(parts)
71
+
72
+ def format_entities(self, entities: List[Entity], max_items: int = 10) -> str:
73
+ """
74
+ Format a list of entities as a readable string.
75
+
76
+ Args:
77
+ entities: List of entities to format
78
+ max_items: Maximum number of entities to include
79
+
80
+ Returns:
81
+ Formatted string with one entity per line
82
+
83
+ Example:
84
+ >>> entities = [Entity(id="alice", entity_type="Person", ...), ...]
85
+ >>> mixin.format_entities(entities)
86
+ "- Person: alice (name=Alice)\n- Company: tech_corp (name=TechCorp)"
87
+ """
88
+ if not entities:
89
+ return ""
90
+
91
+ lines = []
92
+ for entity in entities[:max_items]:
93
+ lines.append(f"- {self.format_entity(entity)}")
94
+
95
+ if len(entities) > max_items:
96
+ lines.append(f"... and {len(entities) - max_items} more")
97
+
98
+ return "\n".join(lines)
99
+
100
+ def format_relation(self, relation: Relation, include_entities: bool = False) -> str:
101
+ """
102
+ Format a relation as a readable string.
103
+
104
+ Args:
105
+ relation: Relation to format
106
+ include_entities: Whether to fetch and include entity details
107
+
108
+ Returns:
109
+ Formatted string
110
+
111
+ Example:
112
+ >>> relation = Relation(id="r1", source_id="alice", target_id="bob", relation_type="KNOWS")
113
+ >>> mixin.format_relation(relation)
114
+ "alice --[KNOWS]--> bob"
115
+ """
116
+ if include_entities and hasattr(self, "graph_store") and self.graph_store:
117
+ # Fetch entity details (async, but this is a sync method)
118
+ # In production, this would be async
119
+ return f"{relation.source_id} --[{relation.relation_type}]--> {relation.target_id}"
120
+
121
+ return f"{relation.source_id} --[{relation.relation_type}]--> {relation.target_id}"
122
+
123
+ def format_path(self, path: Path, include_properties: bool = False) -> str:
124
+ """
125
+ Format a graph path as a readable string.
126
+
127
+ Args:
128
+ path: Path to format
129
+ include_properties: Whether to include entity properties
130
+
131
+ Returns:
132
+ Formatted string showing the path
133
+
134
+ Example:
135
+ >>> path = Path(nodes=[e1, e2], edges=[r1], weight=1.0)
136
+ >>> mixin.format_path(path)
137
+ "alice --[KNOWS]--> bob --[WORKS_FOR]--> tech_corp"
138
+ """
139
+ if not path.nodes:
140
+ return ""
141
+
142
+ parts = []
143
+
144
+ # Add first node
145
+ parts.append(self.format_entity(path.nodes[0], include_properties))
146
+
147
+ # Add edges and subsequent nodes
148
+ for i, edge in enumerate(path.edges):
149
+ parts.append(f"--[{edge.relation_type}]-->")
150
+ if i + 1 < len(path.nodes):
151
+ parts.append(self.format_entity(path.nodes[i + 1], include_properties))
152
+
153
+ return " ".join(parts)
154
+
155
+ def format_knowledge_summary(
156
+ self,
157
+ entities: List[Entity],
158
+ relations: Optional[List[Relation]] = None,
159
+ max_entities: int = 5,
160
+ max_relations: int = 5,
161
+ ) -> str:
162
+ """
163
+ Format a summary of knowledge (entities and relations).
164
+
165
+ Args:
166
+ entities: List of entities
167
+ relations: Optional list of relations
168
+ max_entities: Maximum entities to show
169
+ max_relations: Maximum relations to show
170
+
171
+ Returns:
172
+ Formatted summary string
173
+ """
174
+ lines = []
175
+
176
+ if entities:
177
+ lines.append(f"Entities ({len(entities)}):")
178
+ lines.append(self.format_entities(entities, max_items=max_entities))
179
+
180
+ if relations:
181
+ lines.append(f"\nRelations ({len(relations)}):")
182
+ for rel in relations[:max_relations]:
183
+ lines.append(f" {self.format_relation(rel)}")
184
+ if len(relations) > max_relations:
185
+ lines.append(f" ... and {len(relations) - max_relations} more")
186
+
187
+ return "\n".join(lines)
188
+
189
+ # ==================== Graph Query Utilities ====================
190
+
191
+ async def find_entity_by_property(
192
+ self,
193
+ entity_type: Optional[str] = None,
194
+ property_name: str = "name",
195
+ property_value: Any = None,
196
+ limit: int = 10,
197
+ ) -> List[Entity]:
198
+ """
199
+ Find entities by property value.
200
+
201
+ Args:
202
+ entity_type: Optional filter by entity type
203
+ property_name: Property name to search
204
+ property_value: Property value to match
205
+ limit: Maximum results
206
+
207
+ Returns:
208
+ List of matching entities
209
+
210
+ Example:
211
+ >>> entities = await mixin.find_entity_by_property(
212
+ ... entity_type="Person",
213
+ ... property_name="name",
214
+ ... property_value="Alice"
215
+ ... )
216
+ """
217
+ if not hasattr(self, "graph_store") or self.graph_store is None:
218
+ logger.warning("GraphStore not available")
219
+ return []
220
+
221
+ # This is a simplified implementation
222
+ # In production, would use proper graph query or filtering
223
+ try:
224
+ # For now, return empty - would need graph query support
225
+ # This is a placeholder for future enhancement
226
+ return []
227
+ except Exception as e:
228
+ logger.error(f"Error finding entity by property: {e}")
229
+ return []
230
+
231
+ async def get_entity_neighbors(
232
+ self,
233
+ entity_id: str,
234
+ relation_type: Optional[str] = None,
235
+ direction: str = "outgoing",
236
+ limit: int = 10,
237
+ ) -> List[Entity]:
238
+ """
239
+ Get neighboring entities for a given entity.
240
+
241
+ Args:
242
+ entity_id: Entity ID
243
+ relation_type: Optional filter by relation type
244
+ direction: "outgoing", "incoming", or "both"
245
+ limit: Maximum results
246
+
247
+ Returns:
248
+ List of neighboring entities
249
+
250
+ Example:
251
+ >>> neighbors = await mixin.get_entity_neighbors(
252
+ ... entity_id="alice",
253
+ ... relation_type="KNOWS",
254
+ ... direction="outgoing"
255
+ ... )
256
+ """
257
+ if not hasattr(self, "graph_store") or self.graph_store is None:
258
+ logger.warning("GraphStore not available")
259
+ return []
260
+
261
+ try:
262
+ neighbors = await self.graph_store.get_neighbors(
263
+ entity_id=entity_id,
264
+ relation_type=relation_type,
265
+ direction=direction,
266
+ )
267
+ return neighbors[:limit]
268
+ except Exception as e:
269
+ logger.error(f"Error getting neighbors: {e}")
270
+ return []
271
+
272
+ async def find_paths_between(
273
+ self,
274
+ source_id: str,
275
+ target_id: str,
276
+ max_depth: int = 3,
277
+ relation_types: Optional[List[str]] = None,
278
+ ) -> List[Path]:
279
+ """
280
+ Find paths between two entities.
281
+
282
+ Args:
283
+ source_id: Source entity ID
284
+ target_id: Target entity ID
285
+ max_depth: Maximum path depth
286
+ relation_types: Optional filter by relation types
287
+
288
+ Returns:
289
+ List of paths
290
+
291
+ Example:
292
+ >>> paths = await mixin.find_paths_between(
293
+ ... source_id="alice",
294
+ ... target_id="tech_corp",
295
+ ... max_depth=2
296
+ ... )
297
+ """
298
+ if not hasattr(self, "graph_store") or self.graph_store is None:
299
+ logger.warning("GraphStore not available")
300
+ return []
301
+
302
+ try:
303
+ # Use graph store's find_paths method
304
+ paths = await self.graph_store.find_paths(
305
+ source_entity_id=source_id,
306
+ target_entity_id=target_id,
307
+ max_depth=max_depth,
308
+ max_paths=10,
309
+ )
310
+
311
+ # Filter by relation types if specified
312
+ if relation_types:
313
+ filtered_paths = []
314
+ for path in paths:
315
+ # Check if all edges match relation types
316
+ if all(edge.relation_type in relation_types for edge in path.edges):
317
+ filtered_paths.append(path)
318
+ return filtered_paths
319
+
320
+ return paths
321
+ except Exception as e:
322
+ logger.error(f"Error finding paths: {e}")
323
+ return []
324
+
325
+ async def get_entity_subgraph(
326
+ self,
327
+ entity_id: str,
328
+ max_depth: int = 2,
329
+ relation_types: Optional[List[str]] = None,
330
+ ) -> Dict[str, Any]:
331
+ """
332
+ Get a subgraph centered around an entity.
333
+
334
+ Args:
335
+ entity_id: Center entity ID
336
+ max_depth: Maximum depth for traversal
337
+ relation_types: Optional filter by relation types
338
+
339
+ Returns:
340
+ Dictionary with 'entities' and 'relations' lists
341
+
342
+ Example:
343
+ >>> subgraph = await mixin.get_entity_subgraph(
344
+ ... entity_id="alice",
345
+ ... max_depth=2
346
+ ... )
347
+ >>> print(f"Entities: {len(subgraph['entities'])}")
348
+ """
349
+ if not hasattr(self, "graph_store") or self.graph_store is None:
350
+ logger.warning("GraphStore not available")
351
+ return {"entities": [], "relations": []}
352
+
353
+ try:
354
+ entities = []
355
+ relations: List[Any] = []
356
+ visited: Set[str] = {entity_id}
357
+
358
+ # Get center entity
359
+ center = await self.graph_store.get_entity(entity_id)
360
+ if not center:
361
+ return {"entities": [], "relations": []}
362
+
363
+ entities.append(center)
364
+ current_level = [entity_id]
365
+
366
+ for depth in range(max_depth):
367
+ next_level = []
368
+
369
+ for e_id in current_level:
370
+ neighbors = await self.graph_store.get_neighbors(
371
+ entity_id=e_id,
372
+ relation_type=None, # Get all relation types
373
+ direction="both",
374
+ )
375
+
376
+ for neighbor in neighbors:
377
+ if neighbor.id not in visited:
378
+ visited.add(neighbor.id)
379
+ entities.append(neighbor)
380
+ next_level.append(neighbor.id)
381
+
382
+ # Note: In a full implementation, we'd also collect relations
383
+ # This is simplified
384
+
385
+ current_level = next_level
386
+ if not current_level:
387
+ break
388
+
389
+ return {
390
+ "entities": [e.model_dump() for e in entities],
391
+ "relations": relations,
392
+ }
393
+ except Exception as e:
394
+ logger.error(f"Error getting subgraph: {e}")
395
+ return {"entities": [], "relations": []}
396
+
397
+ async def search_entities(
398
+ self,
399
+ query: Optional[str] = None,
400
+ entity_types: Optional[List[str]] = None,
401
+ limit: int = 10,
402
+ threshold: float = 0.7,
403
+ ) -> List[Entity]:
404
+ """
405
+ Search for entities using vector search or filtering.
406
+
407
+ Args:
408
+ query: Optional search query (for vector search)
409
+ entity_types: Optional filter by entity types
410
+ limit: Maximum results
411
+ threshold: Similarity threshold for vector search
412
+
413
+ Returns:
414
+ List of matching entities
415
+
416
+ Example:
417
+ >>> entities = await mixin.search_entities(
418
+ ... query="engineer at tech company",
419
+ ... entity_types=["Person"],
420
+ ... limit=5
421
+ ... )
422
+ """
423
+ if not hasattr(self, "graph_store") or self.graph_store is None:
424
+ logger.warning("GraphStore not available")
425
+ return []
426
+
427
+ try:
428
+ # If query provided, try vector search
429
+ if query:
430
+ # Note: This would require embedding generation
431
+ # For now, this is a placeholder
432
+ # In production: generate embedding and use vector_search
433
+ pass
434
+
435
+ # For now, return empty
436
+ # In production, would use vector_search or filtering
437
+ return []
438
+ except Exception as e:
439
+ logger.error(f"Error searching entities: {e}")
440
+ return []
441
+
442
+ # ==================== Knowledge Context Utilities ====================
443
+
444
+ def extract_entity_mentions(self, text: str) -> List[str]:
445
+ """
446
+ Extract potential entity mentions from text.
447
+
448
+ Simple implementation - in production would use NER or more sophisticated methods.
449
+
450
+ Args:
451
+ text: Text to analyze
452
+
453
+ Returns:
454
+ List of potential entity IDs or names
455
+
456
+ Example:
457
+ >>> mentions = mixin.extract_entity_mentions("Alice works at TechCorp")
458
+ >>> # Returns: ["Alice", "TechCorp"]
459
+ """
460
+ # Simple implementation - split by common delimiters
461
+ # In production, would use NER or entity linking
462
+ words = text.split()
463
+ mentions = []
464
+
465
+ # Look for capitalized words (potential entity names)
466
+ for word in words:
467
+ if word and word[0].isupper() and len(word) > 1:
468
+ mentions.append(word.strip(".,!?;:"))
469
+
470
+ return mentions
471
+
472
+ def build_knowledge_context_prompt(
473
+ self,
474
+ entities: List[Entity],
475
+ relations: Optional[List[Relation]] = None,
476
+ max_length: int = 500,
477
+ ) -> str:
478
+ """
479
+ Build a prompt section with knowledge context.
480
+
481
+ Args:
482
+ entities: List of entities to include
483
+ relations: Optional list of relations
484
+ max_length: Maximum length of formatted text
485
+
486
+ Returns:
487
+ Formatted prompt section
488
+
489
+ Example:
490
+ >>> prompt = mixin.build_knowledge_context_prompt(
491
+ ... entities=[alice, bob],
492
+ ... relations=[knows_rel]
493
+ ... )
494
+ >>> # Returns formatted string for inclusion in prompt
495
+ """
496
+ lines = ["RELEVANT KNOWLEDGE:"]
497
+
498
+ # Add entities
499
+ if entities:
500
+ lines.append("\nEntities:")
501
+ entity_text = self.format_entities(entities, max_items=5)
502
+ lines.append(entity_text)
503
+
504
+ # Add relations
505
+ if relations:
506
+ lines.append("\nRelations:")
507
+ for rel in relations[:5]:
508
+ lines.append(f" {self.format_relation(rel)}")
509
+
510
+ full_text = "\n".join(lines)
511
+
512
+ # Truncate if too long
513
+ if len(full_text) > max_length:
514
+ full_text = full_text[:max_length] + "..."
515
+
516
+ return full_text
517
+
518
+ def validate_graph_store(self) -> bool:
519
+ """
520
+ Validate that graph store is available and initialized.
521
+
522
+ Returns:
523
+ True if graph store is available, False otherwise
524
+ """
525
+ if not hasattr(self, "graph_store"):
526
+ return False
527
+
528
+ if self.graph_store is None:
529
+ return False
530
+
531
+ # Could add more validation (e.g., ping the store)
532
+ return True
533
+
534
+ def get_graph_stats(self) -> Dict[str, Any]:
535
+ """
536
+ Get statistics about the knowledge graph.
537
+
538
+ Returns:
539
+ Dictionary with graph statistics
540
+
541
+ Example:
542
+ >>> stats = mixin.get_graph_stats()
543
+ >>> print(f"Entities: {stats['entity_count']}")
544
+ """
545
+ if not self.validate_graph_store():
546
+ return {"available": False, "entity_count": 0, "relation_count": 0}
547
+
548
+ try:
549
+ # Use graph store's get_stats if available
550
+ graph_store = getattr(self, "graph_store", None) # type: ignore[attr-defined]
551
+ if graph_store is not None and hasattr(graph_store, "get_stats"):
552
+ stats = graph_store.get_stats() # type: ignore[attr-defined]
553
+ # Normalize stats format
554
+ return {
555
+ "available": True,
556
+ "entity_count": stats.get("entities", stats.get("nodes", "unknown")),
557
+ "relation_count": stats.get("relations", stats.get("edges", "unknown")),
558
+ **stats, # Include all original stats
559
+ }
560
+
561
+ # Otherwise return basic info
562
+ return {
563
+ "available": True,
564
+ "entity_count": "unknown",
565
+ "relation_count": "unknown",
566
+ }
567
+ except Exception as e:
568
+ logger.error(f"Error getting graph stats: {e}")
569
+ return {"available": False, "error": str(e)}