iatoolkit 2.30.0__tar.gz → 2.32.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 (249) hide show
  1. {iatoolkit-2.30.0/src/iatoolkit.egg-info → iatoolkit-2.32.0}/PKG-INFO +1 -1
  2. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/document_repo.py +12 -0
  4. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/llm_query_repo.py +3 -0
  5. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/models.py +1 -0
  6. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/vs_repo.py +83 -6
  7. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/context_builder_service.py +17 -3
  8. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/knowledge_base_service.py +93 -0
  9. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/prompt_service.py +52 -0
  10. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/query_service.py +9 -0
  11. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/tool_service.py +3 -0
  12. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/warmup_service.py +44 -6
  13. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/rag_api_view.py +6 -0
  14. {iatoolkit-2.30.0 → iatoolkit-2.32.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  15. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/LICENSE +0 -0
  16. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/LICENSE_COMMUNITY.md +0 -0
  17. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/pyproject.toml +0 -0
  18. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/readme.md +0 -0
  19. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/requirements.txt +0 -0
  20. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/setup.cfg +0 -0
  21. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/base_company.py +0 -0
  22. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/cli_commands.py +0 -0
  23. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/__init__.py +0 -0
  24. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/exceptions.py +0 -0
  25. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  26. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  27. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  28. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  29. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  30. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  31. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  32. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  33. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/model_registry.py +0 -0
  34. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/routes.py +0 -0
  35. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/secret_resolver.py +0 -0
  36. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/session_manager.py +0 -0
  37. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/common/util.py +0 -0
  38. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/company_registry.py +0 -0
  39. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/__init__.py +0 -0
  40. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  41. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  42. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  43. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  44. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  45. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  46. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  47. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  48. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  49. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  50. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  51. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  52. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  53. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  54. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  55. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  56. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  57. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  58. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  59. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  60. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  61. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  62. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  63. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  64. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  65. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  66. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  67. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  68. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  69. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/core.py +0 -0
  70. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/__init__.py +0 -0
  71. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  72. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/call_service.py +0 -0
  73. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  74. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  75. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  76. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  77. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  78. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  79. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  80. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
  81. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
  82. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  83. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/inference_handler.py +0 -0
  84. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  85. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  86. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  87. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  88. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  89. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  90. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  91. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  92. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  93. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
  94. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/llm_response.py +0 -0
  95. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  96. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/locales/en.yaml +0 -0
  97. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/locales/es.yaml +0 -0
  98. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/__init__.py +0 -0
  99. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  100. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/database_manager.py +0 -0
  101. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  102. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  103. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
  104. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  105. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
  106. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
  107. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  108. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  109. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  110. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/runtime_logging.py +0 -0
  111. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/__init__.py +0 -0
  112. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/api_key_service.py +0 -0
  113. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  114. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/auth_service.py +0 -0
  115. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/benchmark_service.py +0 -0
  116. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/branding_service.py +0 -0
  117. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/company_context_service.py +0 -0
  118. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/configuration_service.py +0 -0
  119. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
  120. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/embedding_service.py +0 -0
  121. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/excel_service.py +0 -0
  122. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/file_processor_service.py +0 -0
  123. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/history_manager_service.py +0 -0
  124. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/http_tool_service.py +0 -0
  125. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/i18n_service.py +0 -0
  126. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/inference_service.py +0 -0
  127. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/jwt_service.py +0 -0
  128. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/language_service.py +0 -0
  129. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/license_service.py +0 -0
  130. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/llm_client_service.py +0 -0
  131. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/mail_service.py +0 -0
  132. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
  133. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
  134. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  135. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
  136. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  137. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/memory_service.py +0 -0
  138. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  139. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  140. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  141. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
  142. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
  143. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  144. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  145. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  146. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  147. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  148. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  149. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  150. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  151. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/parsers/validator.py +0 -0
  152. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/pdf_service.py +0 -0
  153. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/profile_service.py +0 -0
  154. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  155. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  156. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  157. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/sql_service.py +0 -0
  158. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/sql_source_service.py +0 -0
  159. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/storage_service.py +0 -0
  160. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/structured_output_service.py +0 -0
  161. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  162. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/system_tools.py +0 -0
  163. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/telemetry_service.py +0 -0
  164. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/tenant_wiki_service.py +0 -0
  165. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
  166. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
  167. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
  168. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
  169. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
  170. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
  171. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  172. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  173. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  174. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/services/web_search_service.py +0 -0
  175. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  176. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  177. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  178. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  179. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  180. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  181. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  182. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  183. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_main.js +0 -0
  184. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  185. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  186. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  187. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  188. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  189. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  190. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  191. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
  192. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/styles/documents.css +0 -0
  193. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
  194. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
  195. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
  196. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/_company_header.html +0 -0
  197. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/_login_widget.html +0 -0
  198. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/account.html +0 -0
  199. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/base.html +0 -0
  200. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/change_password.html +0 -0
  201. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/chat.html +0 -0
  202. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  203. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/chat_modals.html +0 -0
  204. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/error.html +0 -0
  205. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/forgot_password.html +0 -0
  206. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  207. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  208. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  209. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/pdf/base.html +0 -0
  210. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
  211. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/pdf/report.html +0 -0
  212. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
  213. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/templates/signup.html +0 -0
  214. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/__init__.py +0 -0
  215. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/account_view.py +0 -0
  216. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
  217. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/base_login_view.py +0 -0
  218. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/categories_api_view.py +0 -0
  219. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/change_password_view.py +0 -0
  220. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  221. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/chat_view.py +0 -0
  222. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
  223. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
  224. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
  225. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
  226. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
  227. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/history_api_view.py +0 -0
  228. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/home_view.py +0 -0
  229. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
  230. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  231. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
  232. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/login_view.py +0 -0
  233. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/logout_api_view.py +0 -0
  234. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/memory_api_view.py +0 -0
  235. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/profile_api_view.py +0 -0
  236. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
  237. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  238. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  239. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
  240. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/signup_view.py +0 -0
  241. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/static_page_view.py +0 -0
  242. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/tool_api_view.py +0 -0
  243. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  244. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/users_api_view.py +0 -0
  245. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit/views/verify_user_view.py +0 -0
  246. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
  247. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  248. {iatoolkit-2.30.0 → iatoolkit-2.32.0}/src/iatoolkit.egg-info/requires.txt +0 -0
  249. {iatoolkit-2.30.0 → iatoolkit-2.32.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.30.0
3
+ Version: 2.32.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # IAToolkit is open source software.
5
5
 
6
- __version__ = "2.30.0"
6
+ __version__ = "2.32.0"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -27,6 +27,18 @@ class DocumentRepo:
27
27
  self.session.commit()
28
28
  return document_image
29
29
 
30
+ def get_document_images(self, document_id: int, limit: int | None = None) -> list[DocumentImage]:
31
+ if not document_id:
32
+ return []
33
+ query = (
34
+ self.session.query(DocumentImage)
35
+ .filter(DocumentImage.document_id == document_id)
36
+ .order_by(DocumentImage.page.asc(), DocumentImage.image_index.asc(), DocumentImage.id.asc())
37
+ )
38
+ if limit is not None:
39
+ query = query.limit(max(int(limit), 0))
40
+ return list(query.all())
41
+
30
42
  def get(self, company_id, filename: str ) -> Document:
31
43
  if not company_id or not filename:
32
44
  raise IAToolkitException(IAToolkitException.ErrorType.PARAM_NOT_FILLED,
@@ -194,6 +194,7 @@ class LLMQueryRepo:
194
194
  prompt.queue_tier = getattr(new_prompt, "queue_tier", None) or prompt.queue_tier or "default"
195
195
  prompt.llm_request_options = dict(new_prompt.llm_request_options or {})
196
196
  prompt.tool_policy = dict(new_prompt.tool_policy or {})
197
+ prompt.context_policy = dict(getattr(new_prompt, "context_policy", None) or {})
197
198
  else:
198
199
  if new_prompt.active is None:
199
200
  new_prompt.active = True
@@ -221,6 +222,8 @@ class LLMQueryRepo:
221
222
  new_prompt.llm_request_options = {}
222
223
  if new_prompt.tool_policy is None:
223
224
  new_prompt.tool_policy = {}
225
+ if getattr(new_prompt, "context_policy", None) is None:
226
+ new_prompt.context_policy = {}
224
227
  self.session.add(new_prompt)
225
228
  prompt = new_prompt
226
229
 
@@ -740,6 +740,7 @@ class Prompt(Base):
740
740
  queue_tier = Column(String, nullable=False, default="default")
741
741
  llm_request_options = Column(JSON_NATIVE, nullable=False, default=dict)
742
742
  tool_policy = Column(JSON_NATIVE, nullable=False, default=dict)
743
+ context_policy = Column(JSON_NATIVE, nullable=False, default=dict)
743
744
  created_at = Column(DateTime, default=datetime.now)
744
745
 
745
746
  def to_dict(self):
@@ -7,6 +7,7 @@ import ast
7
7
  import json
8
8
  import logging
9
9
  import re
10
+ from time import perf_counter
10
11
  from typing import Dict, List
11
12
 
12
13
  from sqlalchemy import text
@@ -80,6 +81,21 @@ class VSRepo:
80
81
  self.session.rollback()
81
82
  raise e
82
83
 
84
+ def get_document_tables(self, document_id: int, limit: int | None = None) -> list[VSDoc]:
85
+ if not document_id:
86
+ return []
87
+ query = (
88
+ self.session.query(VSDoc)
89
+ .filter(
90
+ VSDoc.document_id == document_id,
91
+ VSDoc.meta["source_type"].as_string() == "table",
92
+ )
93
+ .order_by(VSDoc.id.asc())
94
+ )
95
+ if limit is not None:
96
+ query = query.limit(max(int(limit), 0))
97
+ return list(query.all())
98
+
83
99
  def query(self,
84
100
  company_short_name: str,
85
101
  query_text: str,
@@ -101,36 +117,70 @@ class VSRepo:
101
117
  Returns:
102
118
  list of documents matching the query and filters
103
119
  """
120
+ query_started_at = perf_counter()
121
+ embedding_started_at = perf_counter()
104
122
  # Generate the embedding with the query text for the specific company
105
123
  try:
106
124
  query_embedding = self.embedding_service.embed_text(company_short_name, query_text)
107
125
  except Exception as e:
108
- logging.error(f"error while creating text embedding: {str(e)}")
126
+ logging.error(
127
+ "RAG vector query embedding failed: company=%s duration_ms=%s error=%s",
128
+ company_short_name,
129
+ round((perf_counter() - embedding_started_at) * 1000),
130
+ str(e),
131
+ )
109
132
  raise IAToolkitException(IAToolkitException.ErrorType.EMBEDDING_ERROR,
110
133
  f"embedding error: {str(e)}")
134
+ embedding_duration_ms = round((perf_counter() - embedding_started_at) * 1000)
135
+ try:
136
+ embedding_dimensions = len(query_embedding)
137
+ except TypeError as exc:
138
+ raise IAToolkitException(
139
+ IAToolkitException.ErrorType.EMBEDDING_ERROR,
140
+ "embedding error: query embedding has no dimensions",
141
+ ) from exc
142
+ if embedding_dimensions < 1 or embedding_dimensions > 2000:
143
+ raise IAToolkitException(
144
+ IAToolkitException.ErrorType.EMBEDDING_ERROR,
145
+ f"embedding error: unsupported query embedding dimensions ({embedding_dimensions})",
146
+ )
111
147
 
112
148
  sql_query, params = None, None
113
149
  try:
114
150
  # Get company ID from its short name for the SQL query
151
+ company_lookup_started_at = perf_counter()
115
152
  company = self.session.query(Company).filter(Company.short_name == company_short_name).one_or_none()
153
+ company_lookup_duration_ms = round((perf_counter() - company_lookup_started_at) * 1000)
116
154
  if not company:
117
155
  raise IAToolkitException(IAToolkitException.ErrorType.VECTOR_STORE_ERROR,
118
156
  f"Company with short name '{company_short_name}' not found.")
119
157
 
158
+ distance_metric = "l2"
159
+ distance_expression = (
160
+ f"iat_vsdocs.embedding::vector({embedding_dimensions}) "
161
+ f"<-> CAST(:query_embedding AS vector({embedding_dimensions}))"
162
+ )
163
+
120
164
  # build the SQL query
121
- sql_query_parts = ["""
165
+ sql_query_parts = [f"""
122
166
  SELECT iat_vsdocs.id, \
123
167
  iat_documents.filename, \
124
168
  iat_vsdocs.text, \
125
169
  iat_documents.storage_key, \
126
170
  iat_documents.meta,
127
171
  iat_documents.id, \
128
- iat_vsdocs.meta
172
+ iat_vsdocs.meta,
173
+ ({distance_expression}) AS distance
129
174
  FROM iat_vsdocs, \
130
175
  iat_documents
131
176
  WHERE iat_vsdocs.company_id = :company_id
132
177
  AND iat_vsdocs.document_id = iat_documents.id \
133
178
  """]
179
+ # The literal dimension lets PostgreSQL prove that a matching partial
180
+ # pgvector expression index can satisfy the nearest-neighbor order.
181
+ sql_query_parts.append(
182
+ f" AND vector_dims(iat_vsdocs.embedding) = {embedding_dimensions}"
183
+ )
134
184
 
135
185
  # query parameters
136
186
  params = {
@@ -168,15 +218,18 @@ class VSRepo:
168
218
  sql_query = "".join(sql_query_parts)
169
219
 
170
220
  # add sorting and limit of results
171
- sql_query += " ORDER BY embedding <-> CAST(:query_embedding AS VECTOR) LIMIT :n_results"
221
+ sql_query += " ORDER BY distance ASC LIMIT :n_results"
172
222
 
173
223
  logging.debug(f"Executing SQL query: {sql_query}")
174
224
  logging.debug(f"With parameters: {params}")
175
225
 
176
226
  # execute the query
227
+ vector_sql_started_at = perf_counter()
228
+ self.session.execute(text("SET LOCAL hnsw.iterative_scan = strict_order"))
229
+ self.session.execute(text("SET LOCAL hnsw.ef_search = 100"))
177
230
  result = self.session.execute(text(sql_query), params)
178
-
179
231
  rows = result.fetchall()
232
+ vector_sql_duration_ms = round((perf_counter() - vector_sql_started_at) * 1000)
180
233
  vs_documents = []
181
234
 
182
235
  for row in rows:
@@ -184,6 +237,8 @@ class VSRepo:
184
237
  doc_meta = row[4] if len(row) > 4 and row[4] is not None else {}
185
238
  chunk_meta = row[6] if len(row) > 6 and row[6] is not None else {}
186
239
 
240
+ distance = float(row[7]) if len(row) > 7 and row[7] is not None else None
241
+
187
242
  # get the url of the document
188
243
  storage_key = row[3] if len(row) > 3 and row[3] is not None else None
189
244
  url = None
@@ -198,10 +253,26 @@ class VSRepo:
198
253
  'text': row[2],
199
254
  'meta': doc_meta,
200
255
  'chunk_meta': chunk_meta,
201
- 'url': url
256
+ 'url': url,
257
+ 'distance': distance,
258
+ 'distance_metric': distance_metric,
259
+ 'score': self._score_from_l2_distance(distance),
202
260
  }
203
261
  )
204
262
 
263
+ logging.info(
264
+ "RAG vector query completed: company=%s collection_ids=%s dimensions=%s n_results=%s rows=%s "
265
+ "embedding_ms=%s company_lookup_ms=%s vector_sql_ms=%s total_ms=%s",
266
+ company_short_name,
267
+ normalized_collection_ids,
268
+ embedding_dimensions,
269
+ n_results,
270
+ len(rows),
271
+ embedding_duration_ms,
272
+ company_lookup_duration_ms,
273
+ vector_sql_duration_ms,
274
+ round((perf_counter() - query_started_at) * 1000),
275
+ )
205
276
  return vs_documents
206
277
 
207
278
  except Exception as e:
@@ -388,6 +459,12 @@ class VSRepo:
388
459
 
389
460
  return sql_parts, params
390
461
 
462
+ @staticmethod
463
+ def _score_from_l2_distance(distance: float | None) -> float | None:
464
+ if distance is None:
465
+ return None
466
+ return 1 / (1 + distance)
467
+
391
468
  @staticmethod
392
469
  def _normalize_metadata_filter_input(metadata_filter):
393
470
  if metadata_filter is None:
@@ -163,6 +163,10 @@ class ContextBuilderService:
163
163
  "prompt_name": prompt_obj.name,
164
164
  "agent_role": agent_role,
165
165
  "execution_mode": execution_mode,
166
+ "context_policy": self.prompt_service.normalize_context_policy(
167
+ getattr(prompt_obj, "context_policy", None),
168
+ agent_role,
169
+ ),
166
170
  "schema": schema,
167
171
  "schema_yaml": prompt_obj.output_schema_yaml,
168
172
  "schema_mode": prompt_obj.output_schema_mode or "best_effort",
@@ -354,15 +358,25 @@ class ContextBuilderService:
354
358
  collection_names=rag_collections,
355
359
  )
356
360
 
361
+ context_policy = self.prompt_service.normalize_context_policy(
362
+ resolved_contract.get("context_policy"),
363
+ resolved_contract.get("agent_role"),
364
+ )
365
+ company_context_policy = context_policy.get("company_context_blocks") or {}
357
366
  company_context_blocks = self.company_context_service.get_company_context_blocks(
358
367
  company_short_name,
359
- include_sql_context=False,
360
- include_yaml_context=False,
368
+ include_sql_context=bool(company_context_policy.get("sql_context")),
369
+ include_yaml_context=bool(company_context_policy.get("yaml_context")),
370
+ )
371
+ markdown_context = (
372
+ company_context_blocks.get("markdown_context")
373
+ if bool(company_context_policy.get("markdown_context"))
374
+ else ""
361
375
  )
362
376
  final_system_context = self._join_context_sections(
363
377
  rendered_sections.get("identity"),
364
378
  rendered_sections.get("business_context"),
365
- company_context_blocks.get("markdown_context"),
379
+ markdown_context,
366
380
  rendered_sections.get("conversation_rules"),
367
381
  rendered_sections.get("retrieval_guidance"),
368
382
  collection_context,
@@ -759,6 +759,99 @@ class KnowledgeBaseService:
759
759
  raise IAToolkitException(IAToolkitException.ErrorType.FILE_FORMAT_ERROR,
760
760
  f"Error reading file content: {e}")
761
761
 
762
+ def get_document_images(
763
+ self,
764
+ company_short_name: str,
765
+ document_id: int,
766
+ *,
767
+ limit: int | None = None,
768
+ ) -> list[dict[str, Any]]:
769
+ document = self.document_repo.get_by_id(document_id)
770
+ if not document:
771
+ return []
772
+ document_company = str(getattr(getattr(document, "company", None), "short_name", "") or "").strip()
773
+ if document_company != str(company_short_name or "").strip():
774
+ raise IAToolkitException(
775
+ IAToolkitException.ErrorType.INVALID_OPERATION,
776
+ "Document does not belong to the requested company.",
777
+ )
778
+
779
+ images = self.document_repo.get_document_images(document_id, limit=limit)
780
+ payloads: list[dict[str, Any]] = []
781
+ for image in images:
782
+ storage_key = str(getattr(image, "storage_key", "") or "").strip()
783
+ if not storage_key:
784
+ continue
785
+ content = self.storage_service.get_document_content(document_company, storage_key)
786
+ if not content:
787
+ continue
788
+ metadata = dict(getattr(image, "meta", None) or {})
789
+ filename = os.path.basename(storage_key) or f"document-{document_id}-image-{image.id}.png"
790
+ mime_type, _ = mimetypes.guess_type(filename)
791
+ if not mime_type:
792
+ image_format = str(metadata.get("format") or "").strip().lower()
793
+ mime_type = {
794
+ "jpeg": "image/jpeg",
795
+ "jpg": "image/jpeg",
796
+ "png": "image/png",
797
+ "webp": "image/webp",
798
+ "gif": "image/gif",
799
+ }.get(image_format, "application/octet-stream")
800
+ payloads.append(
801
+ {
802
+ "image_id": image.id,
803
+ "document_id": document_id,
804
+ "page": image.page,
805
+ "image_index": image.image_index,
806
+ "filename": filename,
807
+ "mime_type": mime_type,
808
+ "width": metadata.get("width"),
809
+ "height": metadata.get("height"),
810
+ "metadata": metadata,
811
+ "content": content,
812
+ }
813
+ )
814
+ return payloads
815
+
816
+ def get_document_tables(
817
+ self,
818
+ company_short_name: str,
819
+ document_id: int,
820
+ *,
821
+ limit: int | None = None,
822
+ ) -> list[dict[str, Any]]:
823
+ document = self.document_repo.get_by_id(document_id)
824
+ if not document:
825
+ return []
826
+ document_company = str(getattr(getattr(document, "company", None), "short_name", "") or "").strip()
827
+ if document_company != str(company_short_name or "").strip():
828
+ raise IAToolkitException(
829
+ IAToolkitException.ErrorType.INVALID_OPERATION,
830
+ "Document does not belong to the requested company.",
831
+ )
832
+
833
+ payloads: list[dict[str, Any]] = []
834
+ for table in self.vs_repo.get_document_tables(document_id, limit=limit):
835
+ metadata = dict(getattr(table, "meta", None) or {})
836
+ table_text = str(getattr(table, "text", "") or "").strip()
837
+ if not table_text:
838
+ continue
839
+ payloads.append(
840
+ {
841
+ "chunk_id": table.id,
842
+ "document_id": document_id,
843
+ "table_index": metadata.get("table_index"),
844
+ "block_index": metadata.get("block_index"),
845
+ "page": metadata.get("page"),
846
+ "page_start": metadata.get("page_start"),
847
+ "page_end": metadata.get("page_end"),
848
+ "title": metadata.get("title") or metadata.get("caption_text"),
849
+ "text": table_text,
850
+ "table_json": metadata.get("table_json"),
851
+ }
852
+ )
853
+ return payloads
854
+
762
855
  def delete_document(self, document_id: int) -> bool:
763
856
  """
764
857
  Deletes a document and its associated vectors.
@@ -56,6 +56,11 @@ class PromptService:
56
56
  AGENT_ROLE_CHANNELS = PromptAgentRole.CHANNELS.value
57
57
  AGENT_ROLE_OPERATIONS = PromptAgentRole.OPERATIONS.value
58
58
  DEFAULT_CATEGORY_LABEL = "General"
59
+ COMPANY_CONTEXT_BLOCK_KEYS = {
60
+ "markdown_context",
61
+ "sql_context",
62
+ "yaml_context",
63
+ }
59
64
 
60
65
  @inject
61
66
  def __init__(self,
@@ -142,6 +147,41 @@ class PromptService:
142
147
  cls.AGENT_ROLE_CHANNELS,
143
148
  }
144
149
 
150
+ @classmethod
151
+ def default_context_policy_for_agent_role(cls, agent_role: str | None) -> dict:
152
+ normalized = str(agent_role or "").strip().lower()
153
+ if normalized == cls.AGENT_ROLE_WORKSPACE_CHAT:
154
+ blocks = {
155
+ "markdown_context": True,
156
+ "sql_context": True,
157
+ "yaml_context": True,
158
+ }
159
+ else:
160
+ blocks = {
161
+ "markdown_context": True,
162
+ "sql_context": False,
163
+ "yaml_context": False,
164
+ }
165
+ return {"company_context_blocks": blocks}
166
+
167
+ @classmethod
168
+ def normalize_context_policy(cls, context_policy: dict | None, agent_role: str | None = None) -> dict:
169
+ defaults = cls.default_context_policy_for_agent_role(agent_role)
170
+ if not isinstance(context_policy, dict):
171
+ return defaults
172
+
173
+ raw_blocks = context_policy.get("company_context_blocks")
174
+ if raw_blocks is None:
175
+ raw_blocks = context_policy.get("company_context")
176
+ if not isinstance(raw_blocks, dict):
177
+ return defaults
178
+
179
+ blocks = dict(defaults["company_context_blocks"])
180
+ for key in cls.COMPANY_CONTEXT_BLOCK_KEYS:
181
+ if key in raw_blocks:
182
+ blocks[key] = bool(raw_blocks.get(key))
183
+ return {"company_context_blocks": blocks}
184
+
145
185
  def _normalize_output_schema_mode(self, output_schema_mode: str | None) -> str:
146
186
  candidate = str(output_schema_mode or self.OUTPUT_SCHEMA_MODE_BEST_EFFORT).strip().lower()
147
187
  allowed = {
@@ -557,6 +597,10 @@ class PromptService:
557
597
  ),
558
598
  'llm_request_options': dict(getattr(p, 'llm_request_options', None) or {}),
559
599
  'tool_policy': dict(getattr(p, 'tool_policy', None) or {}),
600
+ 'context_policy': self.normalize_context_policy(
601
+ getattr(p, 'context_policy', None),
602
+ getattr(p, 'agent_role', None),
603
+ ),
560
604
  }
561
605
  for p in prompts
562
606
  ]
@@ -687,6 +731,10 @@ class PromptService:
687
731
  ),
688
732
  llm_request_options=llm_request_options,
689
733
  tool_policy=tool_policy,
734
+ context_policy=self.normalize_context_policy(
735
+ data.get("context_policy"),
736
+ agent_role,
737
+ ),
690
738
  )
691
739
  self.llm_query_repo.create_or_update_prompt(new_prompt)
692
740
 
@@ -963,6 +1011,10 @@ class PromptService:
963
1011
  self._extract_llm_request_options_payload(prompt_data)
964
1012
  ),
965
1013
  tool_policy=self._normalize_tool_policy(prompt_data.get("tool_policy")),
1014
+ context_policy=self.normalize_context_policy(
1015
+ prompt_data.get("context_policy"),
1016
+ agent_role,
1017
+ ),
966
1018
  )
967
1019
 
968
1020
  self.llm_query_repo.create_or_update_prompt(new_prompt)
@@ -15,6 +15,7 @@ from iatoolkit.services.context_builder_service import ContextBuilderService
15
15
  from iatoolkit.services.attachment_policy_service import AttachmentPolicyService
16
16
  from iatoolkit.services.memory_lookup_policy_service import MemoryLookupPolicyService
17
17
  from iatoolkit.services.telemetry_service import NoopTelemetryService
18
+ from iatoolkit.services.prompt_service import PromptService
18
19
  from iatoolkit.common.model_registry import ModelRegistry
19
20
  from injector import inject
20
21
  import logging
@@ -341,6 +342,10 @@ class QueryService:
341
342
  })
342
343
  contract["resource_bindings"] = normalized_resource_bindings
343
344
  contract["tool_policy"] = self._normalize_prompt_tool_policy(contract.get("tool_policy"))
345
+ contract["context_policy"] = PromptService.normalize_context_policy(
346
+ contract.get("context_policy"),
347
+ contract.get("agent_role"),
348
+ )
344
349
  contract["provider"] = self._get_provider(company.short_name, contract.get("llm_model") or "")
345
350
  return contract
346
351
  except Exception as e:
@@ -1875,6 +1880,10 @@ class QueryService:
1875
1880
  "provider": provider,
1876
1881
  "effective_model": effective_model,
1877
1882
  "tool_policy": self._normalize_prompt_tool_policy(prompt_output_contract.get("tool_policy")),
1883
+ "context_policy": PromptService.normalize_context_policy(
1884
+ prompt_output_contract.get("context_policy"),
1885
+ prompt_output_contract.get("agent_role"),
1886
+ ),
1878
1887
  "resource_bindings": list(prompt_output_contract.get("resource_bindings") or []),
1879
1888
  "selected_system_prompt_keys": selected_system_prompt_keys,
1880
1889
  "tool_names": self._get_tool_names(tools),
@@ -374,6 +374,9 @@ class ToolService:
374
374
  "page": page,
375
375
  "caption_text": caption,
376
376
  "document_id": item.get("document_id"),
377
+ "distance": item.get("distance"),
378
+ "distance_metric": item.get("distance_metric"),
379
+ "score": item.get("score"),
377
380
  }
378
381
  lines.append(json.dumps(header, ensure_ascii=False))
379
382
  text_content = (item.get("text") or "").strip()
@@ -59,14 +59,38 @@ class WarmupService:
59
59
  def warmup_startup_configured_companies(self, trigger: str = "startup") -> list[str]:
60
60
  warmed_companies: list[str] = []
61
61
  for company_short_name in get_registered_companies().keys():
62
- warmed_profiles = self._warmup_remote_text_embeddings(company_short_name, startup_only=True)
63
- if not warmed_profiles:
64
- logging.debug(
62
+ profiles = self._get_remote_text_embedding_profiles(company_short_name, startup_only=True)
63
+ if not profiles:
64
+ logging.info(
65
65
  "Startup warm-up skipped for company='%s': no embedding provider enabled warmup_on_startup.",
66
66
  company_short_name,
67
67
  )
68
68
  continue
69
69
 
70
+ logging.info(
71
+ "Startup warm-up starting for company='%s' profiles=%s trigger='%s'.",
72
+ company_short_name,
73
+ self._format_profile_labels(profiles),
74
+ trigger,
75
+ )
76
+ warmed_profiles = self._warmup_remote_text_embeddings(
77
+ company_short_name,
78
+ startup_only=True,
79
+ profiles=profiles,
80
+ )
81
+ if not warmed_profiles:
82
+ logging.warning(
83
+ "Startup warm-up attempted but no embedding profiles warmed for company='%s' profiles=%s.",
84
+ company_short_name,
85
+ self._format_profile_labels(profiles),
86
+ )
87
+ continue
88
+
89
+ logging.info(
90
+ "Startup warm-up warmed company='%s' profiles=%s.",
91
+ company_short_name,
92
+ self._format_profile_labels(warmed_profiles),
93
+ )
70
94
  warmed_companies.append(company_short_name)
71
95
 
72
96
  return warmed_companies
@@ -74,8 +98,14 @@ class WarmupService:
74
98
  def is_startup_warmup_enabled(self, company_short_name: str) -> bool:
75
99
  return bool(self._get_remote_text_embedding_profiles(company_short_name, startup_only=True))
76
100
 
77
- def _warmup_remote_text_embeddings(self, company_short_name: str, startup_only: bool = False) -> list[tuple[str, str, str]]:
78
- profiles = self._get_remote_text_embedding_profiles(company_short_name, startup_only=startup_only)
101
+ def _warmup_remote_text_embeddings(
102
+ self,
103
+ company_short_name: str,
104
+ startup_only: bool = False,
105
+ profiles: list[tuple[str, str, str]] | None = None,
106
+ ) -> list[tuple[str, str, str]]:
107
+ if profiles is None:
108
+ profiles = self._get_remote_text_embedding_profiles(company_short_name, startup_only=startup_only)
79
109
  if not profiles:
80
110
  logging.debug(
81
111
  "Warm-up skipped for company='%s': no remote embedding inference configured.",
@@ -102,7 +132,8 @@ class WarmupService:
102
132
  )
103
133
  warmed_profiles.append((model_type, config_section, tool_name))
104
134
  except Exception as e:
105
- logging.debug(
135
+ log_fn = logging.warning if startup_only else logging.debug
136
+ log_fn(
106
137
  "Warm-up failed for remote embedding profile company='%s' section='%s' model_type='%s' tool='%s': %s",
107
138
  company_short_name,
108
139
  config_section,
@@ -113,6 +144,13 @@ class WarmupService:
113
144
 
114
145
  return warmed_profiles
115
146
 
147
+ @staticmethod
148
+ def _format_profile_labels(profiles: list[tuple[str, str, str]]) -> list[str]:
149
+ return [
150
+ f"{config_section}:{model_type}:{tool_name}"
151
+ for model_type, config_section, tool_name in profiles
152
+ ]
153
+
116
154
  def _uses_remote_text_inference(self, company_short_name: str) -> bool:
117
155
  return bool(self._get_remote_text_embedding_profiles(company_short_name))
118
156
 
@@ -499,6 +499,9 @@ class RagApiView(MethodView):
499
499
  "text": item.get("text"),
500
500
  "chunk_meta": item.get("chunk_meta") or {},
501
501
  "document_meta": item.get("meta") or {},
502
+ "distance": item.get("distance"),
503
+ "distance_metric": item.get("distance_metric"),
504
+ "score": item.get("score"),
502
505
  })
503
506
  return normalized
504
507
 
@@ -537,6 +540,9 @@ class RagApiView(MethodView):
537
540
  "chunk_id": item.get("chunk_id"),
538
541
  "source_type": (item.get("chunk_meta") or {}).get("source_type"),
539
542
  "page": (item.get("chunk_meta") or {}).get("page") or (item.get("chunk_meta") or {}).get("page_start"),
543
+ "distance": item.get("distance"),
544
+ "distance_metric": item.get("distance_metric"),
545
+ "score": item.get("score"),
540
546
  }
541
547
  lines.append(json.dumps(header, ensure_ascii=False))
542
548
  if item.get("text"):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.30.0
3
+ Version: 2.32.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
File without changes
File without changes
File without changes
File without changes
File without changes