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,607 @@
1
+ import asyncio
2
+ import logging
3
+ from typing import Dict, Any, List, Optional, Callable
4
+ from enum import Enum
5
+ from datetime import datetime
6
+
7
+ from pydantic import BaseModel, Field
8
+ from pydantic_settings import BaseSettings, SettingsConfigDict
9
+
10
+ from aiecs.tools.base_tool import BaseTool
11
+ from aiecs.tools import register_tool
12
+
13
+
14
+ class ProcessingMode(str, Enum):
15
+ """AI document processing modes"""
16
+
17
+ SUMMARIZE = "summarize"
18
+ EXTRACT_INFO = "extract_info"
19
+ ANALYZE = "analyze"
20
+ TRANSLATE = "translate"
21
+ CLASSIFY = "classify"
22
+ ANSWER_QUESTIONS = "answer_questions"
23
+ CUSTOM = "custom"
24
+
25
+
26
+ class AIProvider(str, Enum):
27
+ """Supported AI providers"""
28
+
29
+ OPENAI = "openai"
30
+ VERTEX_AI = "vertex_ai"
31
+ XAI = "xai"
32
+ LOCAL = "local"
33
+
34
+
35
+ class AIDocumentOrchestratorError(Exception):
36
+ """Base exception for AI Document Orchestrator errors"""
37
+
38
+
39
+ class AIProviderError(AIDocumentOrchestratorError):
40
+ """Raised when AI provider operations fail"""
41
+
42
+
43
+ class ProcessingError(AIDocumentOrchestratorError):
44
+ """Raised when document processing fails"""
45
+
46
+
47
+ @register_tool("ai_document_orchestrator")
48
+ class AIDocumentOrchestrator(BaseTool):
49
+ """
50
+ AI-powered document processing orchestrator that:
51
+ 1. Coordinates document parsing with AI analysis
52
+ 2. Manages AI provider interactions
53
+ 3. Handles complex document processing workflows
54
+ 4. Provides intelligent content analysis and extraction
55
+
56
+ Integrates with:
57
+ - DocumentParserTool for document parsing
58
+ - Various AI providers for content analysis
59
+ - Existing AIECS infrastructure
60
+ """
61
+
62
+ # Configuration schema
63
+ class Config(BaseSettings):
64
+ """Configuration for the AI document orchestrator tool
65
+
66
+ Automatically reads from environment variables with AI_DOC_ORCHESTRATOR_ prefix.
67
+ Example: AI_DOC_ORCHESTRATOR_DEFAULT_AI_PROVIDER -> default_ai_provider
68
+ """
69
+
70
+ model_config = SettingsConfigDict(env_prefix="AI_DOC_ORCHESTRATOR_")
71
+
72
+ default_ai_provider: str = Field(default="openai", description="Default AI provider to use")
73
+ max_chunk_size: int = Field(default=4000, description="Maximum chunk size for AI processing")
74
+ max_concurrent_requests: int = Field(default=5, description="Maximum concurrent AI requests")
75
+ default_temperature: float = Field(default=0.1, description="Default temperature for AI model")
76
+ max_tokens: int = Field(default=2000, description="Maximum tokens for AI response")
77
+ timeout: int = Field(default=60, description="Timeout in seconds for AI operations")
78
+
79
+ def __init__(self, config: Optional[Dict] = None, **kwargs):
80
+ """Initialize AI Document Orchestrator with settings
81
+
82
+ Configuration is automatically loaded by BaseTool from:
83
+ 1. Explicit config dict (highest priority)
84
+ 2. YAML config files (config/tools/ai_document_orchestrator.yaml)
85
+ 3. Environment variables (via dotenv from .env files)
86
+ 4. Tool defaults (lowest priority)
87
+
88
+ Args:
89
+ config: Optional configuration overrides
90
+ **kwargs: Additional arguments passed to BaseTool (e.g., tool_name)
91
+ """
92
+ super().__init__(config, **kwargs)
93
+
94
+ # Configuration is automatically loaded by BaseTool into self._config_obj
95
+ # Access config via self._config_obj (BaseSettings instance)
96
+ self.config = self._config_obj if self._config_obj else self.Config()
97
+
98
+ self.logger = logging.getLogger(__name__)
99
+
100
+ # Initialize document parser
101
+ self._init_document_parser()
102
+
103
+ # Initialize AI providers
104
+ self._init_ai_providers()
105
+
106
+ # Processing templates
107
+ self._init_processing_templates()
108
+
109
+ def _init_document_parser(self):
110
+ """Initialize document parser tool"""
111
+ try:
112
+ from aiecs.tools.docs.document_parser_tool import (
113
+ DocumentParserTool,
114
+ )
115
+
116
+ self.document_parser = DocumentParserTool()
117
+ except ImportError:
118
+ self.logger.error("DocumentParserTool not available")
119
+ self.document_parser = None
120
+
121
+ def _init_ai_providers(self):
122
+ """Initialize AI providers"""
123
+ self.ai_providers = {}
124
+
125
+ try:
126
+ # Initialize AIECS client for AI operations
127
+ from aiecs import AIECS
128
+
129
+ self.aiecs_client = AIECS()
130
+ self.ai_providers["aiecs"] = self.aiecs_client
131
+ except ImportError:
132
+ self.logger.warning("AIECS client not available")
133
+ self.aiecs_client = None
134
+
135
+ def _init_processing_templates(self):
136
+ """Initialize processing templates for different AI tasks"""
137
+ self.processing_templates = {
138
+ ProcessingMode.SUMMARIZE: {
139
+ "system_prompt": "You are an expert document summarizer. Create concise, informative summaries.",
140
+ "user_prompt_template": "Please summarize the following document content:\n\n{content}\n\nProvide a clear, structured summary highlighting the key points.",
141
+ },
142
+ ProcessingMode.EXTRACT_INFO: {
143
+ "system_prompt": "You are an expert information extractor. Extract specific information from documents.",
144
+ "user_prompt_template": (
145
+ "Extract the following information from the document:\n{extraction_criteria}\n\n" "Document content:\n{content}\n\nProvide the extracted information in a structured format."
146
+ ),
147
+ },
148
+ ProcessingMode.ANALYZE: {
149
+ "system_prompt": "You are an expert document analyzer. Provide thorough analysis of document content.",
150
+ "user_prompt_template": (
151
+ "Analyze the following document content and provide insights:\n\n{content}\n\n"
152
+ "Include analysis of:\n- Main themes and topics\n- Key findings\n- Important details\n"
153
+ "- Overall structure and organization"
154
+ ),
155
+ },
156
+ ProcessingMode.TRANSLATE: {
157
+ "system_prompt": "You are an expert translator. Provide accurate translations while preserving meaning and context.",
158
+ "user_prompt_template": "Translate the following document content to {target_language}:\n\n{content}\n\nMaintain the original structure and formatting where possible.",
159
+ },
160
+ ProcessingMode.CLASSIFY: {
161
+ "system_prompt": "You are an expert document classifier. Classify documents accurately based on their content.",
162
+ "user_prompt_template": (
163
+ "Classify the following document content into the appropriate categories:\n\n"
164
+ "Categories: {categories}\n\nDocument content:\n{content}\n\n"
165
+ "Provide the classification with confidence scores and reasoning."
166
+ ),
167
+ },
168
+ ProcessingMode.ANSWER_QUESTIONS: {
169
+ "system_prompt": "You are an expert document analyst. Answer questions based on document content accurately.",
170
+ "user_prompt_template": (
171
+ "Based on the following document content, answer these questions:\n\nQuestions:\n{questions}\n\n"
172
+ "Document content:\n{content}\n\nProvide clear, accurate answers with references to the "
173
+ "relevant parts of the document."
174
+ ),
175
+ },
176
+ ProcessingMode.CUSTOM: {
177
+ "system_prompt": "You are an expert document analyst. Follow the custom instructions provided.",
178
+ "user_prompt_template": "{custom_prompt}\n\nDocument content:\n{content}\n\nPlease provide your analysis based on the custom instructions above.",
179
+ },
180
+ }
181
+
182
+ # Schema definitions
183
+ class Process_documentSchema(BaseModel):
184
+ """Schema for process_document operation"""
185
+
186
+ source: str = Field(description="URL or file path to the document")
187
+ processing_mode: ProcessingMode = Field(description="AI processing mode to apply")
188
+ ai_provider: Optional[AIProvider] = Field(default=None, description="AI provider to use")
189
+ processing_params: Optional[Dict[str, Any]] = Field(default=None, description="Additional processing parameters")
190
+ parse_params: Optional[Dict[str, Any]] = Field(default=None, description="Document parsing parameters")
191
+ ai_params: Optional[Dict[str, Any]] = Field(default=None, description="AI provider parameters")
192
+
193
+ class Batch_process_documentsSchema(BaseModel):
194
+ """Schema for batch_process_documents operation"""
195
+
196
+ sources: List[str] = Field(description="List of URLs or file paths")
197
+ processing_mode: ProcessingMode = Field(description="AI processing mode to apply")
198
+ ai_provider: Optional[AIProvider] = Field(default=None, description="AI provider to use")
199
+ processing_params: Optional[Dict[str, Any]] = Field(default=None, description="Additional processing parameters")
200
+ max_concurrent: Optional[int] = Field(default=None, description="Maximum concurrent processing")
201
+
202
+ class Analyze_documentSchema(BaseModel):
203
+ """Schema for analyze_document operation (AI-first approach)"""
204
+
205
+ source: str = Field(description="URL or file path to the document")
206
+ analysis_type: str = Field(description="Type of analysis to perform")
207
+ custom_prompt: Optional[str] = Field(default=None, description="Custom AI prompt for analysis")
208
+ ai_provider: Optional[AIProvider] = Field(default=None, description="AI provider to use")
209
+
210
+ def process_document(
211
+ self,
212
+ source: str,
213
+ processing_mode: ProcessingMode,
214
+ ai_provider: Optional[AIProvider] = None,
215
+ processing_params: Optional[Dict[str, Any]] = None,
216
+ parse_params: Optional[Dict[str, Any]] = None,
217
+ ai_params: Optional[Dict[str, Any]] = None,
218
+ ) -> Dict[str, Any]:
219
+ """
220
+ Process a document using AI with intelligent orchestration
221
+
222
+ Args:
223
+ source: URL or file path to document
224
+ processing_mode: AI processing mode to apply
225
+ ai_provider: AI provider to use (optional)
226
+ processing_params: Additional processing parameters
227
+ parse_params: Document parsing parameters
228
+ ai_params: AI provider parameters
229
+
230
+ Returns:
231
+ Dict containing processed results and metadata
232
+ """
233
+ try:
234
+ start_time = datetime.now()
235
+
236
+ # Step 1: Parse the document
237
+ self.logger.info(f"Starting document processing: {source}")
238
+ parsed_result = self._parse_document(source, parse_params or {})
239
+
240
+ # Step 2: Prepare content for AI processing
241
+ content = self._prepare_content_for_ai(parsed_result, processing_mode)
242
+
243
+ # Step 3: Process with AI
244
+ provider = ai_provider or AIProvider(self.config.default_ai_provider)
245
+ ai_result = self._process_with_ai(
246
+ content,
247
+ processing_mode,
248
+ provider,
249
+ processing_params or {},
250
+ ai_params or {},
251
+ )
252
+
253
+ # Step 4: Combine results
254
+ result = {
255
+ "source": source,
256
+ "processing_mode": processing_mode,
257
+ "ai_provider": ai_provider or self.config.default_ai_provider,
258
+ "document_info": {
259
+ "type": parsed_result.get("document_type"),
260
+ "detection_confidence": parsed_result.get("detection_confidence"),
261
+ "content_stats": parsed_result.get("content_stats"),
262
+ },
263
+ "ai_result": ai_result,
264
+ "processing_metadata": {
265
+ "start_time": start_time.isoformat(),
266
+ "end_time": datetime.now().isoformat(),
267
+ "processing_duration": (datetime.now() - start_time).total_seconds(),
268
+ },
269
+ }
270
+
271
+ # Step 5: Post-process if needed
272
+ result = self._post_process_result(result, processing_mode, processing_params or {})
273
+
274
+ return result
275
+
276
+ except Exception as e:
277
+ raise ProcessingError(f"Document processing failed: {str(e)}")
278
+
279
+ async def process_document_async(
280
+ self,
281
+ source: str,
282
+ processing_mode: ProcessingMode,
283
+ ai_provider: Optional[AIProvider] = None,
284
+ processing_params: Optional[Dict[str, Any]] = None,
285
+ parse_params: Optional[Dict[str, Any]] = None,
286
+ ai_params: Optional[Dict[str, Any]] = None,
287
+ ) -> Dict[str, Any]:
288
+ """Async version of process_document"""
289
+ return await asyncio.to_thread(
290
+ self.process_document,
291
+ source=source,
292
+ processing_mode=processing_mode,
293
+ ai_provider=ai_provider,
294
+ processing_params=processing_params,
295
+ parse_params=parse_params,
296
+ ai_params=ai_params,
297
+ )
298
+
299
+ def batch_process_documents(
300
+ self,
301
+ sources: List[str],
302
+ processing_mode: ProcessingMode,
303
+ ai_provider: Optional[AIProvider] = None,
304
+ processing_params: Optional[Dict[str, Any]] = None,
305
+ max_concurrent: Optional[int] = None,
306
+ ) -> Dict[str, Any]:
307
+ """
308
+ Process multiple documents in batch with intelligent orchestration
309
+
310
+ Args:
311
+ sources: List of URLs or file paths
312
+ processing_mode: AI processing mode to apply
313
+ ai_provider: AI provider to use
314
+ processing_params: Additional processing parameters
315
+ max_concurrent: Maximum concurrent processing
316
+
317
+ Returns:
318
+ Dict containing batch processing results
319
+ """
320
+ try:
321
+ start_time = datetime.now()
322
+ max_concurrent = max_concurrent or self.config.max_concurrent_requests
323
+
324
+ # Process documents in batches
325
+ results = asyncio.run(
326
+ self._batch_process_async(
327
+ sources,
328
+ processing_mode,
329
+ ai_provider,
330
+ processing_params,
331
+ max_concurrent,
332
+ )
333
+ )
334
+
335
+ # Aggregate results
336
+ batch_result = {
337
+ "sources": sources,
338
+ "processing_mode": processing_mode,
339
+ "ai_provider": ai_provider or self.config.default_ai_provider,
340
+ "total_documents": len(sources),
341
+ "successful_documents": len([r for r in results if r.get("status") == "success"]),
342
+ "failed_documents": len([r for r in results if r.get("status") == "error"]),
343
+ "results": results,
344
+ "batch_metadata": {
345
+ "start_time": start_time.isoformat(),
346
+ "end_time": datetime.now().isoformat(),
347
+ "total_duration": (datetime.now() - start_time).total_seconds(),
348
+ },
349
+ }
350
+
351
+ return batch_result
352
+
353
+ except Exception as e:
354
+ raise ProcessingError(f"Batch processing failed: {str(e)}")
355
+
356
+ def analyze_document(
357
+ self,
358
+ source: str,
359
+ analysis_type: str,
360
+ custom_prompt: Optional[str] = None,
361
+ ai_provider: Optional[AIProvider] = None,
362
+ ) -> Dict[str, Any]:
363
+ """
364
+ Perform AI-first document analysis
365
+
366
+ Args:
367
+ source: URL or file path to document
368
+ analysis_type: Type of analysis to perform
369
+ custom_prompt: Custom AI prompt for analysis
370
+ ai_provider: AI provider to use
371
+
372
+ Returns:
373
+ Dict containing analysis results
374
+ """
375
+ try:
376
+ # Parse document first
377
+ parsed_result = self._parse_document(source, {})
378
+ content = parsed_result.get("content", "")
379
+
380
+ # Prepare AI prompt
381
+ if custom_prompt:
382
+ prompt = custom_prompt.format(content=content, analysis_type=analysis_type)
383
+ else:
384
+ prompt = f"Perform {analysis_type} analysis on the following document:\n\n{content}"
385
+
386
+ # Process with AI
387
+ provider = ai_provider or AIProvider(self.config.default_ai_provider)
388
+ ai_result = self._call_ai_provider(prompt, provider, {})
389
+
390
+ return {
391
+ "source": source,
392
+ "analysis_type": analysis_type,
393
+ "document_info": {
394
+ "type": parsed_result.get("document_type"),
395
+ "content_stats": parsed_result.get("content_stats"),
396
+ },
397
+ "analysis_result": ai_result,
398
+ "timestamp": datetime.now().isoformat(),
399
+ }
400
+
401
+ except Exception as e:
402
+ raise ProcessingError(f"Document analysis failed: {str(e)}")
403
+
404
+ def _parse_document(self, source: str, parse_params: Dict[str, Any]) -> Dict[str, Any]:
405
+ """Parse document using DocumentParserTool"""
406
+ if not self.document_parser:
407
+ raise ProcessingError("DocumentParserTool not available")
408
+
409
+ try:
410
+ return self.document_parser.parse_document(source, **parse_params)
411
+ except Exception as e:
412
+ raise ProcessingError(f"Document parsing failed: {str(e)}")
413
+
414
+ def _prepare_content_for_ai(self, parsed_result: Dict[str, Any], processing_mode: ProcessingMode) -> str:
415
+ """Prepare parsed content for AI processing"""
416
+ content = parsed_result.get("content", "")
417
+
418
+ if isinstance(content, dict):
419
+ # Extract text from structured content
420
+ text_content = content.get("text", str(content))
421
+ else:
422
+ text_content = str(content)
423
+
424
+ # Chunk content if too large
425
+ max_size = self.config.max_chunk_size
426
+ if len(text_content) > max_size:
427
+ # For now, truncate - could implement smart chunking
428
+ text_content = text_content[:max_size] + "\n\n[Content truncated...]"
429
+
430
+ return text_content
431
+
432
+ def _process_with_ai(
433
+ self,
434
+ content: str,
435
+ processing_mode: ProcessingMode,
436
+ ai_provider: AIProvider,
437
+ processing_params: Dict[str, Any],
438
+ ai_params: Dict[str, Any],
439
+ ) -> Dict[str, Any]:
440
+ """Process content with AI based on processing mode"""
441
+ try:
442
+ # Get processing template
443
+ template = self.processing_templates.get(processing_mode)
444
+ if not template:
445
+ raise ProcessingError(f"No template found for processing mode: {processing_mode}")
446
+
447
+ # Format prompt
448
+ prompt = self._format_prompt(template, content, processing_params)
449
+
450
+ # Call AI provider
451
+ ai_result = self._call_ai_provider(prompt, ai_provider, ai_params)
452
+
453
+ return {
454
+ "processing_mode": processing_mode,
455
+ "prompt_used": prompt,
456
+ "ai_response": ai_result,
457
+ "ai_provider": ai_provider,
458
+ }
459
+
460
+ except Exception as e:
461
+ raise AIProviderError(f"AI processing failed: {str(e)}")
462
+
463
+ def _format_prompt(self, template: Dict[str, str], content: str, params: Dict[str, Any]) -> str:
464
+ """Format AI prompt using template and parameters"""
465
+ user_prompt = template["user_prompt_template"]
466
+
467
+ # Replace content placeholder
468
+ formatted_prompt = user_prompt.replace("{content}", content)
469
+
470
+ # Replace other parameters
471
+ for key, value in params.items():
472
+ placeholder = f"{{{key}}}"
473
+ if placeholder in formatted_prompt:
474
+ formatted_prompt = formatted_prompt.replace(placeholder, str(value))
475
+
476
+ return formatted_prompt
477
+
478
+ def _call_ai_provider(self, prompt: str, ai_provider: AIProvider, ai_params: Dict[str, Any]) -> str:
479
+ """Call AI provider with prompt"""
480
+ try:
481
+ if self.aiecs_client:
482
+ # Use AIECS client for AI operations
483
+ from aiecs.domain.task.task_context import TaskContext
484
+
485
+ task_context = TaskContext(
486
+ data={
487
+ "task_id": f"doc_processing_{datetime.now().timestamp()}",
488
+ "task_type": "document_processing",
489
+ "input_data": {"prompt": prompt},
490
+ "metadata": ai_params,
491
+ },
492
+ task_dir="./tasks",
493
+ )
494
+
495
+ # This would need to be adapted based on actual AIECS API
496
+ result = self.aiecs_client.process_task(task_context)
497
+ return result.get("response", "")
498
+ else:
499
+ # Fallback to direct AI provider calls
500
+ return self._direct_ai_call(prompt, ai_provider, ai_params)
501
+
502
+ except Exception as e:
503
+ raise AIProviderError(f"AI provider call failed: {str(e)}")
504
+
505
+ def _direct_ai_call(self, prompt: str, ai_provider: AIProvider, ai_params: Dict[str, Any]) -> str:
506
+ """Direct AI provider call (fallback)"""
507
+ # This is a placeholder for direct AI provider integration
508
+ # In a real implementation, you would integrate with specific AI APIs
509
+ self.logger.warning("Using mock AI response - implement actual AI provider integration")
510
+ return f"Mock AI response for prompt: {prompt[:100]}..."
511
+
512
+ async def _batch_process_async(
513
+ self,
514
+ sources: List[str],
515
+ processing_mode: ProcessingMode,
516
+ ai_provider: Optional[AIProvider],
517
+ processing_params: Optional[Dict[str, Any]],
518
+ max_concurrent: int,
519
+ ) -> List[Dict[str, Any]]:
520
+ """Process documents in parallel with concurrency control"""
521
+ semaphore = asyncio.Semaphore(max_concurrent)
522
+
523
+ async def process_single(source: str) -> Dict[str, Any]:
524
+ async with semaphore:
525
+ try:
526
+ result = await self.process_document_async(
527
+ source=source,
528
+ processing_mode=processing_mode,
529
+ ai_provider=ai_provider,
530
+ processing_params=processing_params,
531
+ )
532
+ return {
533
+ "source": source,
534
+ "status": "success",
535
+ "result": result,
536
+ }
537
+ except Exception as e:
538
+ return {
539
+ "source": source,
540
+ "status": "error",
541
+ "error": str(e),
542
+ }
543
+
544
+ tasks = [process_single(source) for source in sources]
545
+ return await asyncio.gather(*tasks)
546
+
547
+ def _post_process_result(
548
+ self,
549
+ result: Dict[str, Any],
550
+ processing_mode: ProcessingMode,
551
+ params: Dict[str, Any],
552
+ ) -> Dict[str, Any]:
553
+ """Post-process results based on processing mode"""
554
+ # Add any post-processing logic here
555
+ # For example, formatting, validation, additional analysis
556
+
557
+ if processing_mode == ProcessingMode.EXTRACT_INFO:
558
+ # Validate extracted information
559
+ result["validation"] = self._validate_extracted_info(result, params)
560
+ elif processing_mode == ProcessingMode.CLASSIFY:
561
+ # Add confidence scoring
562
+ result["confidence_analysis"] = self._analyze_classification_confidence(result)
563
+
564
+ return result
565
+
566
+ def _validate_extracted_info(self, result: Dict[str, Any], params: Dict[str, Any]) -> Dict[str, str]:
567
+ """Validate extracted information"""
568
+ # Placeholder for validation logic
569
+ return {"status": "validated", "notes": "Validation completed"}
570
+
571
+ def _analyze_classification_confidence(self, result: Dict[str, Any]) -> Dict[str, Any]:
572
+ """Analyze classification confidence"""
573
+ # Placeholder for confidence analysis
574
+ return {
575
+ "overall_confidence": 0.85,
576
+ "factors": ["content_quality", "model_certainty"],
577
+ }
578
+
579
+ # Utility methods for custom processing
580
+ def create_custom_processor(self, system_prompt: str, user_prompt_template: str) -> Callable:
581
+ """Create a custom processing function"""
582
+
583
+ def custom_processor(source: str, **kwargs) -> Dict[str, Any]:
584
+ # Add custom template
585
+ self.processing_templates[ProcessingMode.CUSTOM] = {
586
+ "system_prompt": system_prompt,
587
+ "user_prompt_template": user_prompt_template,
588
+ }
589
+
590
+ return self.process_document(
591
+ source=source,
592
+ processing_mode=ProcessingMode.CUSTOM,
593
+ processing_params=kwargs,
594
+ )
595
+
596
+ return custom_processor
597
+
598
+ def get_processing_stats(self) -> Dict[str, Any]:
599
+ """Get processing statistics"""
600
+ # Placeholder for statistics tracking
601
+ return {
602
+ "total_documents_processed": 0,
603
+ "average_processing_time": 0,
604
+ "success_rate": 1.0,
605
+ "most_common_document_types": [],
606
+ "ai_provider_usage": {},
607
+ }