iatoolkit 2.51.2__tar.gz → 2.52.0__tar.gz

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.
Files changed (253) hide show
  1. {iatoolkit-2.51.2/src/iatoolkit.egg-info → iatoolkit-2.52.0}/PKG-INFO +1 -5
  2. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/pyproject.toml +4 -4
  3. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/__init__.py +1 -1
  4. iatoolkit-2.52.0/src/iatoolkit/common/text_splitter.py +170 -0
  5. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/core.py +0 -2
  6. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/locales/en.yaml +1 -0
  7. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/locales/es.yaml +1 -0
  8. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/models.py +14 -1
  9. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/knowledge_base_service.py +4 -3
  10. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/llm_client_service.py +23 -2
  11. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/query_service.py +36 -2
  12. {iatoolkit-2.51.2 → iatoolkit-2.52.0/src/iatoolkit.egg-info}/PKG-INFO +1 -5
  13. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit.egg-info/SOURCES.txt +1 -1
  14. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit.egg-info/requires.txt +0 -4
  15. iatoolkit-2.51.2/src/iatoolkit/services/benchmark_service.py +0 -139
  16. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/LICENSE +0 -0
  17. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/LICENSE_COMMUNITY.md +0 -0
  18. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/readme.md +0 -0
  19. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/setup.cfg +0 -0
  20. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/base_company.py +0 -0
  21. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/cli_commands.py +0 -0
  22. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/__init__.py +0 -0
  23. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/bridge_validation.py +0 -0
  24. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/exceptions.py +0 -0
  25. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  26. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  27. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  28. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  29. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  30. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  31. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  32. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  33. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/model_registry.py +0 -0
  34. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/routes.py +0 -0
  35. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/secret_resolver.py +0 -0
  36. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/session_manager.py +0 -0
  37. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/url_safety.py +0 -0
  38. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/common/util.py +0 -0
  39. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/company_registry.py +0 -0
  40. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/__init__.py +0 -0
  41. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  42. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  43. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  44. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  45. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  46. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  47. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  48. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  49. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  50. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  51. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  52. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  53. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  54. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  55. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  56. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  57. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  58. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  59. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  60. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  61. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  62. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  63. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  64. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  65. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  66. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  67. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  68. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  69. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  70. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/__init__.py +0 -0
  71. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  72. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/call_service.py +0 -0
  73. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  74. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  75. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  76. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  77. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  78. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  79. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  80. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
  81. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
  82. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  83. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/inference_handler.py +0 -0
  84. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  85. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  86. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  87. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  88. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  89. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  90. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  91. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  92. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  93. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
  94. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/llm_response.py +0 -0
  95. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  96. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/__init__.py +0 -0
  97. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  98. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/bridge_repo.py +0 -0
  99. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/database_manager.py +0 -0
  100. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/document_repo.py +0 -0
  101. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  102. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  103. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
  104. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  105. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  106. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
  107. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
  108. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  109. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  110. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  111. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
  112. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/runtime_logging.py +0 -0
  113. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/__init__.py +0 -0
  114. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/api_key_service.py +0 -0
  115. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  116. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/auth_service.py +0 -0
  117. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/branding_service.py +0 -0
  118. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/company_context_service.py +0 -0
  119. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/configuration_service.py +0 -0
  120. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/context_builder_service.py +0 -0
  121. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
  122. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/embedding_service.py +0 -0
  123. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/excel_service.py +0 -0
  124. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/file_processor_service.py +0 -0
  125. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/history_manager_service.py +0 -0
  126. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/http_tool_service.py +0 -0
  127. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/i18n_service.py +0 -0
  128. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/inference_service.py +0 -0
  129. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/jwt_service.py +0 -0
  130. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/language_service.py +0 -0
  131. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/license_service.py +0 -0
  132. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/mail_service.py +0 -0
  133. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
  134. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
  135. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  136. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
  137. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  138. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/memory_service.py +0 -0
  139. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  140. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  141. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  142. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/operator_identity_service.py +0 -0
  143. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
  144. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
  145. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  146. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  147. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  148. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  149. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  150. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  151. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  152. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  153. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/parsers/validator.py +0 -0
  154. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/pdf_service.py +0 -0
  155. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/profile_service.py +0 -0
  156. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  157. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/prompt_service.py +0 -0
  158. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  159. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  160. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/sql_service.py +0 -0
  161. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/sql_source_service.py +0 -0
  162. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/storage_service.py +0 -0
  163. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/structured_output_service.py +0 -0
  164. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  165. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/system_tools.py +0 -0
  166. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/telemetry_service.py +0 -0
  167. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/tenant_wiki_service.py +0 -0
  168. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
  169. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/tool_service.py +0 -0
  170. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
  171. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
  172. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
  173. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
  174. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/warmup_service.py +0 -0
  175. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
  176. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  177. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  178. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  179. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/services/web_search_service.py +0 -0
  180. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  181. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  182. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  183. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  184. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  185. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  186. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  187. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  188. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_main.js +0 -0
  189. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  190. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  191. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  192. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  193. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  194. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  195. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  196. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
  197. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/styles/documents.css +0 -0
  198. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
  199. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
  200. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
  201. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/_company_header.html +0 -0
  202. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/_login_widget.html +0 -0
  203. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/account.html +0 -0
  204. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/base.html +0 -0
  205. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/change_password.html +0 -0
  206. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/chat.html +0 -0
  207. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  208. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/chat_modals.html +0 -0
  209. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/error.html +0 -0
  210. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/forgot_password.html +0 -0
  211. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  212. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  213. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  214. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/pdf/base.html +0 -0
  215. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
  216. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/pdf/report.html +0 -0
  217. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
  218. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/templates/signup.html +0 -0
  219. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/__init__.py +0 -0
  220. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/account_view.py +0 -0
  221. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
  222. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/base_login_view.py +0 -0
  223. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/categories_api_view.py +0 -0
  224. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/change_password_view.py +0 -0
  225. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  226. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/chat_view.py +0 -0
  227. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
  228. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
  229. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
  230. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
  231. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
  232. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/history_api_view.py +0 -0
  233. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/home_view.py +0 -0
  234. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
  235. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  236. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
  237. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/login_view.py +0 -0
  238. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/logout_api_view.py +0 -0
  239. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/memory_api_view.py +0 -0
  240. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/profile_api_view.py +0 -0
  241. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
  242. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  243. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  244. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/rag_api_view.py +0 -0
  245. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
  246. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/signup_view.py +0 -0
  247. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/static_page_view.py +0 -0
  248. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/tool_api_view.py +0 -0
  249. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  250. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/users_api_view.py +0 -0
  251. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit/views/verify_user_view.py +0 -0
  252. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  253. {iatoolkit-2.51.2 → iatoolkit-2.52.0}/src/iatoolkit.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.51.2
3
+ Version: 2.52.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -47,9 +47,6 @@ Requires-Dist: humanfriendly==10.0
47
47
  Requires-Dist: idna==3.10
48
48
  Requires-Dist: injector==0.22.0
49
49
  Requires-Dist: Jinja2==3.1.5
50
- Requires-Dist: langchain==0.3.19
51
- Requires-Dist: langchain-core==0.3.35
52
- Requires-Dist: langchain-text-splitters==0.3.6
53
50
  Requires-Dist: markdown2==2.5.3
54
51
  Requires-Dist: nh3==0.3.7
55
52
  Requires-Dist: openai==2.8.1
@@ -79,7 +76,6 @@ Requires-Dist: SQLAlchemy==2.0.49
79
76
  Requires-Dist: sqlalchemy-redshift==1.0.0
80
77
  Requires-Dist: redshift_connector==2.1.14
81
78
  Requires-Dist: tiktoken==0.8.0
82
- Requires-Dist: tokenizers>=0.22.0
83
79
  Requires-Dist: websocket-client==1.8.0
84
80
  Requires-Dist: websockets==14.1
85
81
  Requires-Dist: Werkzeug==3.1.3
@@ -59,9 +59,6 @@ dependencies = [
59
59
  "idna==3.10",
60
60
  "injector==0.22.0",
61
61
  "Jinja2==3.1.5",
62
- "langchain==0.3.19",
63
- "langchain-core==0.3.35",
64
- "langchain-text-splitters==0.3.6",
65
62
  "markdown2==2.5.3",
66
63
  "nh3==0.3.7",
67
64
  "openai==2.8.1",
@@ -91,7 +88,10 @@ dependencies = [
91
88
  "sqlalchemy-redshift==1.0.0",
92
89
  "redshift_connector==2.1.14",
93
90
  "tiktoken==0.8.0",
94
- "tokenizers>=0.22.0",
91
+ # tokenizers is not declared: nothing here imports it, and the only
92
+ # package that needs it is transformers, which arrives through the
93
+ # docling and inference extras and pulls its own. Declaring it put 8MB
94
+ # of Rust bindings into every install that uses neither.
95
95
  "websocket-client==1.8.0",
96
96
  "websockets==14.1",
97
97
  "Werkzeug==3.1.3",
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # IAToolkit is open source software.
5
5
 
6
- __version__ = "2.51.2"
6
+ __version__ = "2.52.0"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -0,0 +1,170 @@
1
+ """Recursive character text splitting for the RAG ingestion path.
2
+
3
+ A drop-in replacement for `langchain_text_splitters.RecursiveCharacterTextSplitter`,
4
+ written out here because that single class was the only langchain import in the
5
+ whole fleet and it dragged langchain-core, langsmith, zstandard and orjson into
6
+ every deployment.
7
+
8
+ The behaviour is reproduced exactly, not approximated: the chunk boundaries this
9
+ produces decide how documents are embedded, so a corpus ingested before the swap
10
+ and one ingested after have to agree. `src/tests/common/test_text_splitter.py`
11
+ pins that with golden fixtures captured from the original implementation.
12
+
13
+ Two details are easy to get wrong when reading the algorithm:
14
+
15
+ - Separators are matched as regular expressions, but the caller passes literals,
16
+ so each one is `re.escape`d before use. Without that, the "." separator this
17
+ codebase configures would match every character.
18
+ - `keep_separator` is True here (langchain's own default for the recursive
19
+ splitter, which overrides the False it inherits). The separator is attached to
20
+ the *start* of the following piece, and the pieces are then joined with "" -
21
+ not with the separator - when merging. Joining with the separator instead
22
+ duplicates it in every chunk.
23
+ """
24
+
25
+ import logging
26
+ import re
27
+ from typing import Callable, Iterable, List, Optional
28
+
29
+
30
+ logger = logging.getLogger(__name__)
31
+
32
+
33
+ class RecursiveCharacterTextSplitter:
34
+ """Splits text by trying each separator in turn, falling back to the next.
35
+
36
+ For every stretch of text the first separator that occurs in it is used. Any
37
+ piece still larger than `chunk_size` is split again with the remaining
38
+ separators, and the pieces that do fit are merged back up to `chunk_size`
39
+ with `chunk_overlap` characters carried between neighbours.
40
+ """
41
+
42
+ def __init__(
43
+ self,
44
+ separators: Optional[List[str]] = None,
45
+ chunk_size: int = 4000,
46
+ chunk_overlap: int = 200,
47
+ length_function: Callable[[str], int] = len,
48
+ keep_separator: bool = True,
49
+ strip_whitespace: bool = True,
50
+ ) -> None:
51
+ if chunk_overlap > chunk_size:
52
+ raise ValueError(
53
+ f"Got a larger chunk overlap ({chunk_overlap}) than chunk size "
54
+ f"({chunk_size}), should be smaller."
55
+ )
56
+ self._separators = separators or ["\n\n", "\n", " ", ""]
57
+ self._chunk_size = chunk_size
58
+ self._chunk_overlap = chunk_overlap
59
+ self._length_function = length_function
60
+ self._keep_separator = keep_separator
61
+ self._strip_whitespace = strip_whitespace
62
+
63
+ def split_text(self, text: str) -> List[str]:
64
+ return self._split_text(text, self._separators)
65
+
66
+ def _split_text(self, text: str, separators: List[str]) -> List[str]:
67
+ final_chunks: List[str] = []
68
+
69
+ # The last separator is the fallback when none of the others occur.
70
+ separator = separators[-1]
71
+ new_separators: List[str] = []
72
+ for i, candidate in enumerate(separators):
73
+ if candidate == "":
74
+ separator = candidate
75
+ break
76
+ if re.search(re.escape(candidate), text):
77
+ separator = candidate
78
+ new_separators = separators[i + 1:]
79
+ break
80
+
81
+ splits = self._split_with_separator(text, separator)
82
+
83
+ # Pieces that already fit accumulate until one does not; that one is
84
+ # flushed first so the recursion cannot reorder the output.
85
+ good_splits: List[str] = []
86
+ merge_separator = "" if self._keep_separator else separator
87
+ for piece in splits:
88
+ if self._length_function(piece) < self._chunk_size:
89
+ good_splits.append(piece)
90
+ continue
91
+ if good_splits:
92
+ final_chunks.extend(self._merge_splits(good_splits, merge_separator))
93
+ good_splits = []
94
+ if not new_separators:
95
+ # No separator left to try: the piece goes out oversized rather
96
+ # than being cut mid-word.
97
+ final_chunks.append(piece)
98
+ else:
99
+ final_chunks.extend(self._split_text(piece, new_separators))
100
+ if good_splits:
101
+ final_chunks.extend(self._merge_splits(good_splits, merge_separator))
102
+ return final_chunks
103
+
104
+ def _split_with_separator(self, text: str, separator: str) -> List[str]:
105
+ """Splits on `separator`, keeping it attached to the piece that follows."""
106
+ if not separator:
107
+ return [c for c in list(text) if c != ""]
108
+
109
+ parts = re.split(f"({re.escape(separator)})", text)
110
+ if self._keep_separator:
111
+ # re.split with a capturing group alternates text, separator, text...
112
+ # Pairing each separator with the following text is what puts the
113
+ # separator at the start of its piece.
114
+ splits = [parts[i] + parts[i + 1] for i in range(1, len(parts), 2)]
115
+ if len(parts) % 2 == 0:
116
+ splits += parts[-1:]
117
+ splits = [parts[0]] + splits
118
+ else:
119
+ splits = re.split(re.escape(separator), text)
120
+ return [s for s in splits if s != ""]
121
+
122
+ def _join_docs(self, docs: List[str], separator: str) -> Optional[str]:
123
+ text = separator.join(docs)
124
+ if self._strip_whitespace:
125
+ text = text.strip()
126
+ return text or None
127
+
128
+ def _merge_splits(self, splits: Iterable[str], separator: str) -> List[str]:
129
+ """Packs consecutive pieces into chunks, carrying `chunk_overlap` over."""
130
+ separator_len = self._length_function(separator)
131
+
132
+ docs: List[str] = []
133
+ current_doc: List[str] = []
134
+ total = 0
135
+ for piece in splits:
136
+ piece_len = self._length_function(piece)
137
+ if (
138
+ total + piece_len + (separator_len if len(current_doc) > 0 else 0)
139
+ > self._chunk_size
140
+ ):
141
+ if total > self._chunk_size:
142
+ logger.warning(
143
+ "Created a chunk of size %s, which is longer than the "
144
+ "specified %s",
145
+ total,
146
+ self._chunk_size,
147
+ )
148
+ if len(current_doc) > 0:
149
+ doc = self._join_docs(current_doc, separator)
150
+ if doc is not None:
151
+ docs.append(doc)
152
+ # Drop from the front until what is left is small enough to
153
+ # serve as the overlap for the next chunk.
154
+ while total > self._chunk_overlap or (
155
+ total
156
+ + piece_len
157
+ + (separator_len if len(current_doc) > 0 else 0)
158
+ > self._chunk_size
159
+ and total > 0
160
+ ):
161
+ total -= self._length_function(current_doc[0]) + (
162
+ separator_len if len(current_doc) > 1 else 0
163
+ )
164
+ current_doc = current_doc[1:]
165
+ current_doc.append(piece)
166
+ total += piece_len + (separator_len if len(current_doc) > 1 else 0)
167
+ doc = self._join_docs(current_doc, separator)
168
+ if doc is not None:
169
+ docs.append(doc)
170
+ return docs
@@ -415,7 +415,6 @@ class IAToolkit:
415
415
  def _bind_services(self, binder: Binder):
416
416
  from iatoolkit.services.query_service import QueryService
417
417
  from iatoolkit.services.api_key_service import ApiKeyService
418
- from iatoolkit.services.benchmark_service import BenchmarkService
419
418
  from iatoolkit.services.parsers.parsing_service import ParsingService
420
419
  from iatoolkit.services.parsers.provider_factory import ParsingProviderFactory
421
420
  from iatoolkit.services.parsers.provider_resolver import ParsingProviderResolver
@@ -458,7 +457,6 @@ class IAToolkit:
458
457
 
459
458
  binder.bind(QueryService, to=QueryService)
460
459
  binder.bind(ApiKeyService, to=ApiKeyService)
461
- binder.bind(BenchmarkService, to=BenchmarkService)
462
460
  binder.bind(ParsingService, to=ParsingService)
463
461
  binder.bind(ParsingProviderFactory, to=ParsingProviderFactory)
464
462
  binder.bind(ParsingProviderResolver, to=ParsingProviderResolver)
@@ -1425,6 +1425,7 @@ ui:
1425
1425
  definitions_filter_summary: "Showing {visible} of {total} pipelines"
1426
1426
  definition_last_run: "Last run"
1427
1427
  definition_no_runs: "No runs"
1428
+ definition_column_id: "ID"
1428
1429
  definition_column_pipeline: "Pipeline"
1429
1430
  definition_column_input: "Input"
1430
1431
  definition_column_steps: "Steps"
@@ -1440,6 +1440,7 @@ ui:
1440
1440
  definitions_filter_summary: "Mostrando {visible} de {total} pipelines"
1441
1441
  definition_last_run: "Última ejecución"
1442
1442
  definition_no_runs: "Sin ejecuciones"
1443
+ definition_column_id: "ID"
1443
1444
  definition_column_pipeline: "Pipeline"
1444
1445
  definition_column_input: "Entrada"
1445
1446
  definition_column_steps: "Pasos"
@@ -9,7 +9,7 @@ from sqlalchemy import Column, Integer, BigInteger, String, DateTime, Enum, Text
9
9
  from sqlalchemy.orm import DeclarativeBase
10
10
  from sqlalchemy.orm import relationship, class_mapper
11
11
  from sqlalchemy.sql import func
12
- from sqlalchemy import UniqueConstraint
12
+ from sqlalchemy import UniqueConstraint, Index
13
13
  from sqlalchemy.dialects.postgresql import JSONB
14
14
  from datetime import datetime
15
15
  from pgvector.sqlalchemy import Vector
@@ -598,6 +598,19 @@ class LLMQuery(Base):
598
598
  created_at = Column(DateTime, default=datetime.now)
599
599
  task_id = Column(Integer, default=None, nullable=True)
600
600
 
601
+ # Execution trace: enough to replay an agent execution later (model
602
+ # evaluations). prompt_inputs are the caller's raw inputs, before they are
603
+ # merged with the user profile; input_files hold storage references only,
604
+ # never file content.
605
+ prompt_name = Column(String, nullable=True)
606
+ prompt_inputs = Column(JSON, nullable=True)
607
+ input_files = Column(JSON, nullable=True)
608
+ input_files_purged_at = Column(DateTime, nullable=True)
609
+
610
+ __table_args__ = (
611
+ Index('ix_iat_queries_company_prompt_created', 'company_id', 'prompt_name', 'created_at'),
612
+ )
613
+
601
614
  company = relationship("Company", back_populates="llm_queries")
602
615
 
603
616
  def to_dict(self):
@@ -12,7 +12,7 @@ from iatoolkit.services.profile_service import ProfileService
12
12
  from iatoolkit.services.i18n_service import I18nService
13
13
  from iatoolkit.services.storage_service import StorageService
14
14
  from iatoolkit.services.parsers.parsing_service import ParsingService
15
- from langchain_text_splitters import RecursiveCharacterTextSplitter
15
+ from iatoolkit.common.text_splitter import RecursiveCharacterTextSplitter
16
16
  from iatoolkit.services.visual_kb_service import VisualKnowledgeBaseService
17
17
  from sqlalchemy import desc, func
18
18
  from typing import Any
@@ -50,7 +50,8 @@ class KnowledgeBaseService:
50
50
  self.profile_service = profile_service
51
51
  self.i18n_service = i18n_service
52
52
 
53
- # Configure LangChain for intelligent text splitting
53
+ # Chunking for the RAG index. These numbers decide how the corpus is
54
+ # embedded, so changing them means re-ingesting what is already stored.
54
55
  self.text_splitter = RecursiveCharacterTextSplitter(
55
56
  chunk_size=1000,
56
57
  chunk_overlap=100,
@@ -83,7 +84,7 @@ class KnowledgeBaseService:
83
84
  Synchronously processes a document through the entire RAG pipeline:
84
85
  1. Saves initial metadata and raw content reference to the SQL Document table.
85
86
  2. Parses content via configured parsing provider (docling/basic/custom).
86
- 3. Splits the text into semantic chunks using LangChain.
87
+ 3. Splits the text into semantic chunks.
87
88
  4. Vectorizes and saves chunks to the Vector Store (VSRepo).
88
89
  5. Updates the document status to ACTIVE or FAILED.
89
90
 
@@ -131,7 +131,8 @@ class llmClient:
131
131
  execution_metadata: Optional[Dict[str, Any]] = None,
132
132
  request_metadata: Optional[Dict[str, str]] = None,
133
133
  telemetry_request: Optional[Dict[str, Any]] = None,
134
- response_contract: Optional[Dict[str, Any]] = None
134
+ response_contract: Optional[Dict[str, Any]] = None,
135
+ execution_trace: Optional[Dict[str, Any]] = None
135
136
  ) -> dict:
136
137
 
137
138
  self._assert_runtime_not_suspended(company)
@@ -426,7 +427,8 @@ class llmClient:
426
427
  response=self.serialize_response(response, decoded_response),
427
428
  function_calls=f_calls,
428
429
  stats=combined_stats,
429
- answer_time=stats['response_time']
430
+ answer_time=stats['response_time'],
431
+ **self._execution_trace_columns(execution_trace)
430
432
  )
431
433
  self.llmquery_repo.add_query(query)
432
434
  telemetry_execution.finalize(
@@ -503,6 +505,7 @@ class llmClient:
503
505
  response={},
504
506
  valid_response=False,
505
507
  function_calls=f_calls,
508
+ **self._execution_trace_columns(execution_trace)
506
509
  )
507
510
  self.llmquery_repo.add_query(query)
508
511
  telemetry_execution.finalize(
@@ -1324,6 +1327,24 @@ class llmClient:
1324
1327
  stats_dict["provider_calls"] = provider_calls
1325
1328
  return stats_dict
1326
1329
 
1330
+ @staticmethod
1331
+ def _execution_trace_columns(execution_trace: Optional[Dict[str, Any]]) -> dict:
1332
+ """Maps the caller's execution trace onto the LLMQuery trace columns."""
1333
+ if not isinstance(execution_trace, dict):
1334
+ return {}
1335
+
1336
+ columns = {}
1337
+ prompt_name = str(execution_trace.get("prompt_name") or "").strip()
1338
+ if prompt_name:
1339
+ columns["prompt_name"] = prompt_name
1340
+ prompt_inputs = execution_trace.get("prompt_inputs")
1341
+ if isinstance(prompt_inputs, dict):
1342
+ columns["prompt_inputs"] = prompt_inputs
1343
+ input_files = execution_trace.get("input_files")
1344
+ if isinstance(input_files, list) and input_files:
1345
+ columns["input_files"] = input_files
1346
+ return columns
1347
+
1327
1348
  @classmethod
1328
1349
  def _compact_execution_metadata_for_stats(cls, key: str, value):
1329
1350
  if key == "tool_router":
@@ -963,6 +963,30 @@ class QueryService:
963
963
  return False
964
964
  return any(marker in error_text for marker in cls._PREVIOUS_RESPONSE_NOT_FOUND_MARKERS)
965
965
 
966
+ @staticmethod
967
+ def build_execution_trace(*,
968
+ prompt_name: str | None,
969
+ client_data: dict | None,
970
+ input_files: list | None) -> dict:
971
+ """
972
+ What an agent execution needs to be replayed later. Inputs are taken
973
+ as the caller sent them, before build_user_turn_prompt merges them with
974
+ the user profile; keys starting with "_" are internal plumbing.
975
+ """
976
+ trace = {}
977
+ normalized_prompt_name = str(prompt_name or "").strip()
978
+ if normalized_prompt_name:
979
+ trace["prompt_name"] = normalized_prompt_name
980
+ safe_client_data = client_data if isinstance(client_data, dict) else {}
981
+ trace["prompt_inputs"] = {
982
+ key: value
983
+ for key, value in safe_client_data.items()
984
+ if not str(key or "").startswith("_")
985
+ }
986
+ if isinstance(input_files, list) and input_files:
987
+ trace["input_files"] = [dict(item) for item in input_files if isinstance(item, dict)]
988
+ return trace
989
+
966
990
  def _invoke_with_history_recovery(self,
967
991
  *,
968
992
  company,
@@ -984,7 +1008,8 @@ class QueryService:
984
1008
  telemetry_request: dict | None,
985
1009
  prompt_output_contract: dict,
986
1010
  history_handle: HistoryHandle,
987
- ignore_history: bool) -> tuple[dict, HistoryHandle]:
1011
+ ignore_history: bool,
1012
+ execution_trace: dict | None = None) -> tuple[dict, HistoryHandle]:
988
1013
  previous_response_id = history_handle.request_params.get('previous_response_id')
989
1014
  context_history = history_handle.request_params.get('context_history')
990
1015
 
@@ -1009,6 +1034,7 @@ class QueryService:
1009
1034
  request_metadata=request_metadata,
1010
1035
  telemetry_request=telemetry_request,
1011
1036
  response_contract=prompt_output_contract if prompt_output_contract.get("schema") else None,
1037
+ execution_trace=execution_trace,
1012
1038
  )
1013
1039
  return response, history_handle
1014
1040
  except Exception as invoke_error:
@@ -1067,6 +1093,7 @@ class QueryService:
1067
1093
  request_metadata=request_metadata,
1068
1094
  telemetry_request=telemetry_request,
1069
1095
  response_contract=prompt_output_contract if prompt_output_contract.get("schema") else None,
1096
+ execution_trace=execution_trace,
1070
1097
  )
1071
1098
  return response, retry_history_handle
1072
1099
 
@@ -1377,10 +1404,16 @@ class QueryService:
1377
1404
  client_data: dict = {},
1378
1405
  task_id: Optional[int] = None,
1379
1406
  ignore_history: bool = False,
1380
- files: list = []
1407
+ files: list = [],
1408
+ input_files: list | None = None
1381
1409
  ) -> dict:
1382
1410
  try:
1383
1411
  stage_started_at = time.time()
1412
+ execution_trace = self.build_execution_trace(
1413
+ prompt_name=prompt_name,
1414
+ client_data=client_data,
1415
+ input_files=input_files,
1416
+ )
1384
1417
  request_source = None
1385
1418
 
1386
1419
  logging.debug(
@@ -1742,6 +1775,7 @@ class QueryService:
1742
1775
  prompt_output_contract=prompt_output_contract,
1743
1776
  history_handle=history_handle,
1744
1777
  ignore_history=ignore_history,
1778
+ execution_trace=execution_trace,
1745
1779
  )
1746
1780
  log_stage("invoke_with_history_recovery")
1747
1781
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.51.2
3
+ Version: 2.52.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -47,9 +47,6 @@ Requires-Dist: humanfriendly==10.0
47
47
  Requires-Dist: idna==3.10
48
48
  Requires-Dist: injector==0.22.0
49
49
  Requires-Dist: Jinja2==3.1.5
50
- Requires-Dist: langchain==0.3.19
51
- Requires-Dist: langchain-core==0.3.35
52
- Requires-Dist: langchain-text-splitters==0.3.6
53
50
  Requires-Dist: markdown2==2.5.3
54
51
  Requires-Dist: nh3==0.3.7
55
52
  Requires-Dist: openai==2.8.1
@@ -79,7 +76,6 @@ Requires-Dist: SQLAlchemy==2.0.49
79
76
  Requires-Dist: sqlalchemy-redshift==1.0.0
80
77
  Requires-Dist: redshift_connector==2.1.14
81
78
  Requires-Dist: tiktoken==0.8.0
82
- Requires-Dist: tokenizers>=0.22.0
83
79
  Requires-Dist: websocket-client==1.8.0
84
80
  Requires-Dist: websockets==14.1
85
81
  Requires-Dist: Werkzeug==3.1.3
@@ -20,6 +20,7 @@ src/iatoolkit/common/model_registry.py
20
20
  src/iatoolkit/common/routes.py
21
21
  src/iatoolkit/common/secret_resolver.py
22
22
  src/iatoolkit/common/session_manager.py
23
+ src/iatoolkit/common/text_splitter.py
23
24
  src/iatoolkit/common/url_safety.py
24
25
  src/iatoolkit/common/util.py
25
26
  src/iatoolkit/common/interfaces/__init__.py
@@ -109,7 +110,6 @@ src/iatoolkit/services/__init__.py
109
110
  src/iatoolkit/services/api_key_service.py
110
111
  src/iatoolkit/services/attachment_policy_service.py
111
112
  src/iatoolkit/services/auth_service.py
112
- src/iatoolkit/services/benchmark_service.py
113
113
  src/iatoolkit/services/branding_service.py
114
114
  src/iatoolkit/services/company_context_service.py
115
115
  src/iatoolkit/services/configuration_service.py
@@ -37,9 +37,6 @@ humanfriendly==10.0
37
37
  idna==3.10
38
38
  injector==0.22.0
39
39
  Jinja2==3.1.5
40
- langchain==0.3.19
41
- langchain-core==0.3.35
42
- langchain-text-splitters==0.3.6
43
40
  markdown2==2.5.3
44
41
  nh3==0.3.7
45
42
  openai==2.8.1
@@ -69,7 +66,6 @@ SQLAlchemy==2.0.49
69
66
  sqlalchemy-redshift==1.0.0
70
67
  redshift_connector==2.1.14
71
68
  tiktoken==0.8.0
72
- tokenizers>=0.22.0
73
69
  websocket-client==1.8.0
74
70
  websockets==14.1
75
71
  Werkzeug==3.1.3
@@ -1,139 +0,0 @@
1
- # Copyright (c) 2024 Fernando Libedinsky
2
- # Product: IAToolkit
3
- #
4
- # IAToolkit is open source software.
5
-
6
- import pandas as pd
7
- import time
8
- import logging
9
- from injector import inject
10
- from iatoolkit.services.query_service import QueryService
11
- from iatoolkit.repositories.profile_repo import ProfileRepo
12
- from iatoolkit.common.exceptions import IAToolkitException
13
-
14
-
15
- class BenchmarkService:
16
- @inject
17
- def __init__(self, query_service: QueryService, profile_repo: ProfileRepo):
18
- self.query_service = query_service
19
- self.profile_repo = profile_repo
20
-
21
- def _update_results_row(self, df: pd.DataFrame, index: int,
22
- status: str,
23
- context_time: float,
24
- gpt_time: float,
25
- answer: str,
26
- error_msg: str,
27
- query_id: int,
28
- stats: dict):
29
- df.at[index, 'status'] = status
30
- df.at[index, 'context_time'] = round(context_time, 2)
31
- df.at[index, 'gpt_time'] = round(gpt_time, 2)
32
- df.at[index, 'answer'] = answer
33
- df.at[index, 'error_message'] = error_msg[:512]
34
- df.at[index, 'query_id'] = query_id
35
- df.at[index, 'in_tokens'] = stats.get('input_tokens', 0)
36
- df.at[index, 'out_tokens'] = stats.get('output_tokens', 0)
37
- df.at[index, 'retry'] = stats.get('sql_retry_count', 0)
38
-
39
- def run(self, company_short_name: str, file_path: str):
40
- if not file_path.endswith('.xlsx'):
41
- raise IAToolkitException(IAToolkitException.ErrorType.INVALID_PARAMETER,
42
- f"solo se leer archivos .xlsx")
43
-
44
- try:
45
- df = pd.read_excel(file_path, keep_default_na=False)
46
- except FileNotFoundError:
47
- raise IAToolkitException(IAToolkitException.ErrorType.INVALID_NAME,
48
- f"El archivo no fue encontrado en: {file_path}")
49
-
50
- required_columns = ['username', 'client_identity', 'prompt_name', 'question', 'model']
51
- if not all(col in df.columns for col in required_columns):
52
- raise IAToolkitException(IAToolkitException.ErrorType.INVALID_PARAMETER,
53
- f"La planilla debe contener las columnas: {required_columns}")
54
-
55
- # Añadir columnas para los resultados
56
- df['status'] = 'pending'
57
- df['context_time'] = 0.0
58
- df['gpt_time'] = 0.0
59
- df['answer'] = ''
60
- df['error_message'] = ''
61
- df['query_id'] = 0
62
- df['in_tokens'] = 0
63
- df['out_tokens'] = 0
64
- df['retry'] = 0
65
-
66
- company = self.profile_repo.get_company_by_short_name(company_short_name)
67
- if not company:
68
- raise IAToolkitException(IAToolkitException.ErrorType.CONFIG_ERROR, f"Compañía {company_short_name} no encontrada.")
69
-
70
- total_rows = len(df)
71
- logging.info(f"Iniciando benchmark para {total_rows} casos de prueba desde el archivo: {file_path}")
72
-
73
- for index, row in df.iterrows():
74
- status = 'OK'
75
- error_msg = ''
76
- answer = ''
77
- stats = {}
78
-
79
- try:
80
- username = str(row['username'])
81
- client_identity = str(row['client_identity'])
82
- prompt_name = str(row['prompt_name'])
83
- question = str(row['question'])
84
- model = str(row['model'])
85
-
86
- logging.info(
87
- f"*** Procesando caso {index + 1}/{total_rows}: client_rut='{client_identity}', prompt='{prompt_name}'")
88
-
89
- # 1. init context with user executing the test
90
- start_time = time.time()
91
- self.query_service.llm_init_context(company.short_name,
92
- external_user_id=username,
93
- model=model)
94
- context_time = time.time() - start_time
95
-
96
- # 2. prepare client data.
97
- client_data = {'client_identity': client_identity}
98
-
99
- # 3. execute the query
100
- start_time = time.time()
101
- response = self.query_service.llm_query(
102
- company_short_name=company.short_name,
103
- prompt_name=prompt_name,
104
- question=question,
105
- external_user_id=username,
106
- client_data=client_data
107
- )
108
- gpt_time = time.time() - start_time
109
-
110
- # 4. process the response
111
- if response.get('error') or not response.get('valid_response'):
112
- status = 'FAILED'
113
- error_msg = response.get('error_message', 'Error desconocido en la respuesta.')
114
- else:
115
- answer = response.get('answer', '')
116
- stats = response.get('stats', {})
117
-
118
- query_id = response.get('query_id', 0)
119
-
120
- except Exception as e:
121
- status = 'FAILED'
122
- error_msg = f"Excepción durante la ejecución: {type(e).__name__} - {str(e)}"
123
- logging.error(f"Fallo en el caso {index + 1}: {error_msg}")
124
-
125
- finally:
126
- self._update_results_row(df, index,
127
- status=status,
128
- context_time=context_time,
129
- gpt_time=gpt_time,
130
- answer=answer,
131
- error_msg=error_msg,
132
- stats=stats,
133
- query_id=query_id)
134
-
135
- output_filename = file_path.replace('.xlsx', '_results.xlsx')
136
- df.to_excel(output_filename, index=False)
137
- logging.info(f"Benchmark finalizado. Resultados guardados en: {output_filename}")
138
-
139
- return output_filename
File without changes
File without changes
File without changes