iatoolkit 2.31.0__tar.gz → 2.32.1__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.31.0/src/iatoolkit.egg-info → iatoolkit-2.32.1}/PKG-INFO +1 -1
  2. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/repositories/document_repo.py +12 -0
  4. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/repositories/llm_query_repo.py +34 -32
  5. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/repositories/models.py +54 -3
  6. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/repositories/vs_repo.py +15 -0
  7. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/configuration_service.py +14 -9
  8. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/context_builder_service.py +26 -12
  9. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/knowledge_base_service.py +93 -0
  10. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/prompt_service.py +161 -51
  11. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/query_service.py +21 -19
  12. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/prompt_api_view.py +9 -1
  13. {iatoolkit-2.31.0 → iatoolkit-2.32.1/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  14. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/LICENSE +0 -0
  15. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/LICENSE_COMMUNITY.md +0 -0
  16. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/pyproject.toml +0 -0
  17. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/readme.md +0 -0
  18. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/requirements.txt +0 -0
  19. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/setup.cfg +0 -0
  20. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/base_company.py +0 -0
  21. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/cli_commands.py +0 -0
  22. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/common/__init__.py +0 -0
  23. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/common/exceptions.py +0 -0
  24. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  25. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  26. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  27. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  28. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  29. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  30. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  31. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  32. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/common/model_registry.py +0 -0
  33. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/common/routes.py +0 -0
  34. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/common/secret_resolver.py +0 -0
  35. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/common/session_manager.py +0 -0
  36. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/common/util.py +0 -0
  37. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/company_registry.py +0 -0
  38. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/__init__.py +0 -0
  39. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  40. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  41. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  42. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  43. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  44. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  45. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  46. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  47. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  48. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  49. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  50. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  51. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  52. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  53. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  54. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  55. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  56. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  57. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  58. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  59. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  60. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  61. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  62. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  63. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  64. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  65. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  66. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  67. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  68. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/core.py +0 -0
  69. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/__init__.py +0 -0
  70. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  71. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/call_service.py +0 -0
  72. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  73. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  74. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  75. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  76. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  77. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  78. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  79. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/google_auth_client.py +0 -0
  80. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/google_chat_app.py +0 -0
  81. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  82. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/inference_handler.py +0 -0
  83. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  84. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  85. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  86. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  87. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  88. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  89. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  90. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  91. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  92. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/llm_proxy.py +0 -0
  93. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/llm_response.py +0 -0
  94. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  95. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/locales/en.yaml +0 -0
  96. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/locales/es.yaml +0 -0
  97. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/repositories/__init__.py +0 -0
  98. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  99. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/repositories/database_manager.py +0 -0
  100. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  101. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  102. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/repositories/knowledge_wiki_repo.py +0 -0
  103. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  104. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/repositories/memory_repo.py +0 -0
  105. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/repositories/profile_repo.py +0 -0
  106. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  107. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  108. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  109. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/runtime_logging.py +0 -0
  110. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/__init__.py +0 -0
  111. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/api_key_service.py +0 -0
  112. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  113. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/auth_service.py +0 -0
  114. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/benchmark_service.py +0 -0
  115. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/branding_service.py +0 -0
  116. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/company_context_service.py +0 -0
  117. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/dispatcher_service.py +0 -0
  118. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/embedding_service.py +0 -0
  119. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/excel_service.py +0 -0
  120. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/file_processor_service.py +0 -0
  121. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/history_manager_service.py +0 -0
  122. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/http_tool_service.py +0 -0
  123. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/i18n_service.py +0 -0
  124. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/inference_service.py +0 -0
  125. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/jwt_service.py +0 -0
  126. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/language_service.py +0 -0
  127. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/license_service.py +0 -0
  128. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/llm_client_service.py +0 -0
  129. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/mail_service.py +0 -0
  130. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
  131. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/mcp_token_service.py +0 -0
  132. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  133. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/memory_lint_service.py +0 -0
  134. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  135. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/memory_service.py +0 -0
  136. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  137. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  138. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  139. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/parsers/__init__.py +0 -0
  140. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/parsers/contracts.py +0 -0
  141. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  142. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  143. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  144. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  145. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  146. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  147. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  148. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  149. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/parsers/validator.py +0 -0
  150. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/pdf_service.py +0 -0
  151. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/profile_service.py +0 -0
  152. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  153. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  154. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  155. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/sql_service.py +0 -0
  156. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/sql_source_service.py +0 -0
  157. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/storage_service.py +0 -0
  158. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/structured_output_service.py +0 -0
  159. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  160. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/system_tools.py +0 -0
  161. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/telemetry_service.py +0 -0
  162. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/tenant_wiki_service.py +0 -0
  163. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/tool_output_contract.py +0 -0
  164. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/tool_service.py +0 -0
  165. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/user_feedback_service.py +0 -0
  166. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/user_session_context_service.py +0 -0
  167. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/visual_kb_service.py +0 -0
  168. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/visual_tool_service.py +0 -0
  169. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/warmup_service.py +0 -0
  170. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/web_search/__init__.py +0 -0
  171. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  172. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  173. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  174. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/services/web_search_service.py +0 -0
  175. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  176. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  177. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  178. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  179. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  180. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  181. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  182. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  183. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/js/chat_main.js +0 -0
  184. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  185. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  186. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  187. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  188. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  189. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  190. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  191. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/styles/chat_public.css +0 -0
  192. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/styles/documents.css +0 -0
  193. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/styles/landing_page.css +0 -0
  194. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/styles/llm_output.css +0 -0
  195. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/static/styles/onboarding.css +0 -0
  196. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/_company_header.html +0 -0
  197. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/_login_widget.html +0 -0
  198. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/account.html +0 -0
  199. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/base.html +0 -0
  200. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/change_password.html +0 -0
  201. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/chat.html +0 -0
  202. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  203. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/chat_modals.html +0 -0
  204. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/error.html +0 -0
  205. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/forgot_password.html +0 -0
  206. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  207. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  208. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  209. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/pdf/base.html +0 -0
  210. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/pdf/letter.html +0 -0
  211. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/pdf/report.html +0 -0
  212. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/pdf/simple.html +0 -0
  213. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/templates/signup.html +0 -0
  214. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/__init__.py +0 -0
  215. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/account_view.py +0 -0
  216. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/api_key_api_view.py +0 -0
  217. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/base_login_view.py +0 -0
  218. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/categories_api_view.py +0 -0
  219. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/change_password_view.py +0 -0
  220. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  221. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/chat_view.py +0 -0
  222. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/configuration_api_view.py +0 -0
  223. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/connectors_api_view.py +0 -0
  224. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/embedding_api_view.py +0 -0
  225. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/forgot_password_view.py +0 -0
  226. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/help_content_api_view.py +0 -0
  227. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/history_api_view.py +0 -0
  228. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/home_view.py +0 -0
  229. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/init_context_api_view.py +0 -0
  230. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  231. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/load_document_api_view.py +0 -0
  232. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/login_view.py +0 -0
  233. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/logout_api_view.py +0 -0
  234. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/memory_api_view.py +0 -0
  235. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/profile_api_view.py +0 -0
  236. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  237. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  238. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/rag_api_view.py +0 -0
  239. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/root_redirect_view.py +0 -0
  240. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/signup_view.py +0 -0
  241. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/static_page_view.py +0 -0
  242. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/tool_api_view.py +0 -0
  243. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  244. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/users_api_view.py +0 -0
  245. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit/views/verify_user_view.py +0 -0
  246. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
  247. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  248. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/src/iatoolkit.egg-info/requires.txt +0 -0
  249. {iatoolkit-2.31.0 → iatoolkit-2.32.1}/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.31.0
3
+ Version: 2.32.1
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.31.0"
6
+ __version__ = "2.32.1"
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,
@@ -10,7 +10,6 @@ from iatoolkit.repositories.models import (
10
10
  Prompt,
11
11
  PromptAgentRole,
12
12
  PromptCategory,
13
- PromptExecutionMode,
14
13
  )
15
14
  from injector import inject
16
15
  from iatoolkit.repositories.database_manager import DatabaseManager
@@ -147,16 +146,34 @@ class LLMQueryRepo:
147
146
  return self.session.query(Prompt).filter(
148
147
  Prompt.company_id == company.id,
149
148
  ).all()
150
- else:
151
- # Only active prompts explicitly exposed in chat for end users.
152
- return self.session.query(Prompt).filter(
153
- Prompt.company_id == company.id,
154
- Prompt.active.is_(True),
155
- Prompt.agent_role.in_([
156
- PromptAgentRole.WORKSPACE_CHAT.value,
157
- PromptAgentRole.WORKSPACE_AGENT.value,
158
- ]),
159
- ).all()
149
+
150
+ # Only active prompts explicitly exposed in chat for end users.
151
+ prompts = self.session.query(Prompt).filter(
152
+ Prompt.company_id == company.id,
153
+ Prompt.active.is_(True),
154
+ ).all()
155
+ return [
156
+ prompt for prompt in prompts
157
+ if self._get_prompt_runtime_role(prompt) in {
158
+ PromptAgentRole.WORKSPACE_CHAT.value,
159
+ PromptAgentRole.WORKSPACE_AGENT.value,
160
+ }
161
+ ]
162
+
163
+ @staticmethod
164
+ def _get_prompt_runtime_role(prompt: Prompt) -> str:
165
+ runtime_policy = getattr(prompt, "runtime_policy", None)
166
+ if not isinstance(runtime_policy, dict):
167
+ runtime_policy = {}
168
+ role = str(runtime_policy.get("role") or "").strip().lower()
169
+ if role in {
170
+ PromptAgentRole.WORKSPACE_CHAT.value,
171
+ PromptAgentRole.WORKSPACE_AGENT.value,
172
+ PromptAgentRole.CHANNELS.value,
173
+ PromptAgentRole.OPERATIONS.value,
174
+ }:
175
+ return role
176
+ return PromptAgentRole.WORKSPACE_CHAT.value
160
177
 
161
178
  def create_or_update_prompt(self, new_prompt: Prompt):
162
179
  prompt = self.session.query(Prompt).filter_by(company_id=new_prompt.company_id,
@@ -167,16 +184,6 @@ class LLMQueryRepo:
167
184
  prompt.order = new_prompt.order
168
185
  if new_prompt.active is not None:
169
186
  prompt.active = new_prompt.active
170
- prompt.agent_role = (
171
- getattr(new_prompt, "agent_role", None)
172
- or prompt.agent_role
173
- or PromptAgentRole.WORKSPACE_CHAT.value
174
- )
175
- prompt.execution_mode = (
176
- PromptExecutionMode.CONVERSATIONAL.value
177
- if prompt.agent_role == PromptAgentRole.WORKSPACE_CHAT.value
178
- else PromptExecutionMode.AGENTIC.value
179
- )
180
187
  prompt.filename = new_prompt.filename
181
188
  prompt.custom_fields = new_prompt.custom_fields
182
189
  prompt.output_schema = new_prompt.output_schema
@@ -191,20 +198,15 @@ class LLMQueryRepo:
191
198
  )
192
199
  prompt.attachment_fallback = new_prompt.attachment_fallback or prompt.attachment_fallback or "extract"
193
200
  prompt.llm_model = new_prompt.llm_model
194
- prompt.queue_tier = getattr(new_prompt, "queue_tier", None) or prompt.queue_tier or "default"
195
201
  prompt.llm_request_options = dict(new_prompt.llm_request_options or {})
196
202
  prompt.tool_policy = dict(new_prompt.tool_policy or {})
203
+ prompt.runtime_policy = (
204
+ dict(getattr(new_prompt, "runtime_policy", None) or {})
205
+ or dict(getattr(prompt, "runtime_policy", None) or {})
206
+ )
197
207
  else:
198
208
  if new_prompt.active is None:
199
209
  new_prompt.active = True
200
- if not new_prompt.agent_role:
201
- new_prompt.agent_role = PromptAgentRole.WORKSPACE_CHAT.value
202
- if not new_prompt.execution_mode:
203
- new_prompt.execution_mode = (
204
- PromptExecutionMode.CONVERSATIONAL.value
205
- if new_prompt.agent_role == PromptAgentRole.WORKSPACE_CHAT.value
206
- else PromptExecutionMode.AGENTIC.value
207
- )
208
210
  if not new_prompt.output_schema_mode:
209
211
  new_prompt.output_schema_mode = "best_effort"
210
212
  if not new_prompt.output_response_mode:
@@ -215,12 +217,12 @@ class LLMQueryRepo:
215
217
  new_prompt.attachment_parser_provider = "basic"
216
218
  if not new_prompt.attachment_fallback:
217
219
  new_prompt.attachment_fallback = "extract"
218
- if not getattr(new_prompt, "queue_tier", None):
219
- new_prompt.queue_tier = "default"
220
220
  if new_prompt.llm_request_options is None:
221
221
  new_prompt.llm_request_options = {}
222
222
  if new_prompt.tool_policy is None:
223
223
  new_prompt.tool_policy = {}
224
+ if getattr(new_prompt, "runtime_policy", None) is None:
225
+ new_prompt.runtime_policy = {}
224
226
  self.session.add(new_prompt)
225
227
  prompt = new_prompt
226
228
 
@@ -724,8 +724,6 @@ class Prompt(Base):
724
724
  description = Column(String, nullable=False)
725
725
  filename = Column(String, nullable=False)
726
726
  active = Column(Boolean, default=True)
727
- agent_role = Column(String, default=PromptAgentRole.WORKSPACE_CHAT.value, nullable=False)
728
- execution_mode = Column(String, default=PromptExecutionMode.CONVERSATIONAL.value, nullable=False)
729
727
  order = Column(Integer, nullable=True, default=0)
730
728
  category_id = Column(Integer, ForeignKey(f'{ORM_SCHEMA}.iat_prompt_categories.id', ondelete='SET NULL'), nullable=True)
731
729
  custom_fields = Column(JSON, nullable=False, default=[])
@@ -737,9 +735,9 @@ class Prompt(Base):
737
735
  attachment_parser_provider = Column(String, nullable=False, default="basic")
738
736
  attachment_fallback = Column(String, nullable=False, default="extract")
739
737
  llm_model = Column(String, nullable=True, default=None)
740
- queue_tier = Column(String, nullable=False, default="default")
741
738
  llm_request_options = Column(JSON_NATIVE, nullable=False, default=dict)
742
739
  tool_policy = Column(JSON_NATIVE, nullable=False, default=dict)
740
+ runtime_policy = Column(JSON_NATIVE, nullable=False, default=dict)
743
741
  created_at = Column(DateTime, default=datetime.now)
744
742
 
745
743
  def to_dict(self):
@@ -754,6 +752,59 @@ class Prompt(Base):
754
752
  order_by="PromptResourceBinding.binding_order",
755
753
  )
756
754
 
755
+ def _runtime_policy_dict(self) -> dict:
756
+ return dict(self.runtime_policy or {})
757
+
758
+ def _set_runtime_policy_value(self, key: str, value):
759
+ policy = self._runtime_policy_dict()
760
+ policy["version"] = 1
761
+ policy[key] = value
762
+ self.runtime_policy = policy
763
+
764
+ @property
765
+ def agent_role(self) -> str:
766
+ role = str((self.runtime_policy or {}).get("role") or "").strip().lower()
767
+ if role in {item.value for item in PromptAgentRole}:
768
+ return role
769
+ return PromptAgentRole.WORKSPACE_CHAT.value
770
+
771
+ @agent_role.setter
772
+ def agent_role(self, value: str | None):
773
+ role = str(value or "").strip().lower()
774
+ if role not in {item.value for item in PromptAgentRole}:
775
+ role = PromptAgentRole.WORKSPACE_CHAT.value
776
+ self._set_runtime_policy_value("role", role)
777
+
778
+ @property
779
+ def execution_mode(self) -> str:
780
+ if self.agent_role == PromptAgentRole.WORKSPACE_CHAT.value:
781
+ return PromptExecutionMode.CONVERSATIONAL.value
782
+ return PromptExecutionMode.AGENTIC.value
783
+
784
+ @execution_mode.setter
785
+ def execution_mode(self, value: str | None):
786
+ # execution_mode is derived from runtime_policy.role and is intentionally not persisted.
787
+ return
788
+
789
+ @property
790
+ def queue_tier(self) -> str:
791
+ tier = str((self.runtime_policy or {}).get("queue_tier") or "default").strip().lower()
792
+ return "low" if tier == "low" else "default"
793
+
794
+ @queue_tier.setter
795
+ def queue_tier(self, value: str | None):
796
+ tier = str(value or "default").strip().lower()
797
+ self._set_runtime_policy_value("queue_tier", "low" if tier == "low" else "default")
798
+
799
+ @property
800
+ def context_policy(self) -> dict:
801
+ context = (self.runtime_policy or {}).get("context")
802
+ return dict(context or {}) if isinstance(context, dict) else {}
803
+
804
+ @context_policy.setter
805
+ def context_policy(self, value: dict | None):
806
+ self._set_runtime_policy_value("context", dict(value or {}))
807
+
757
808
 
758
809
  class PromptResourceBinding(Base):
759
810
  __tablename__ = "iat_prompt_resource_bindings"
@@ -81,6 +81,21 @@ class VSRepo:
81
81
  self.session.rollback()
82
82
  raise e
83
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
+
84
99
  def query(self,
85
100
  company_short_name: str,
86
101
  query_text: str,
@@ -777,13 +777,13 @@ class ConfigurationService:
777
777
  prompt_list, categories_config = self._get_prompt_config(config)
778
778
 
779
779
  category_set = set(categories_config)
780
- allowed_execution_modes = {"conversational", "agentic"}
781
780
  allowed_agent_roles = {
782
781
  "workspace_chat",
783
782
  "workspace_agent",
784
783
  "channels",
785
784
  "operations",
786
785
  }
786
+ allowed_queue_tiers = {"default", "low"}
787
787
  allowed_output_schema_modes = {"best_effort", "strict"}
788
788
  allowed_output_response_modes = {"chat_compatible", "structured_only"}
789
789
  allowed_attachment_modes = {"extracted_only", "native_only", "native_plus_extracted"}
@@ -816,19 +816,24 @@ class ConfigurationService:
816
816
  add_error(f"prompts[{i}]", "Missing required key: 'description'")
817
817
 
818
818
  prompt_cat = prompt.get("category")
819
- execution_mode = str(prompt.get("execution_mode", "") or "").strip().lower()
820
- if execution_mode and execution_mode not in allowed_execution_modes:
819
+ runtime_policy = prompt.get("runtime_policy") or {}
820
+ if not isinstance(runtime_policy, dict):
821
+ add_error(f"prompts[{i}].runtime_policy", "Must be a dictionary.")
822
+ continue
823
+
824
+ agent_role = str(runtime_policy.get("role", "") or "").strip().lower()
825
+ if agent_role and agent_role not in allowed_agent_roles:
821
826
  add_error(
822
- f"prompts[{i}]",
823
- f"Unsupported execution_mode '{execution_mode}'. Must be one of: {sorted(allowed_execution_modes)}."
827
+ f"prompts[{i}].runtime_policy.role",
828
+ f"Unsupported runtime_policy.role '{agent_role}'. Must be one of: {sorted(allowed_agent_roles)}.",
824
829
  )
825
830
  continue
826
831
 
827
- agent_role = str(prompt.get("agent_role", "") or "").strip().lower()
828
- if agent_role and agent_role not in allowed_agent_roles:
832
+ queue_tier = str(runtime_policy.get("queue_tier", "") or "").strip().lower()
833
+ if queue_tier and queue_tier not in allowed_queue_tiers:
829
834
  add_error(
830
- f"prompts[{i}].agent_role",
831
- f"Unsupported agent_role '{agent_role}'. Must be one of: {sorted(allowed_agent_roles)}.",
835
+ f"prompts[{i}].runtime_policy.queue_tier",
836
+ f"Unsupported runtime_policy.queue_tier '{queue_tier}'. Must be one of: {sorted(allowed_queue_tiers)}.",
832
837
  )
833
838
  continue
834
839
 
@@ -129,15 +129,17 @@ class ContextBuilderService:
129
129
  except Exception:
130
130
  schema = None
131
131
 
132
- raw_execution_mode = str(getattr(prompt_obj, "execution_mode", "") or "").strip().lower()
133
- execution_mode = raw_execution_mode if raw_execution_mode in {"conversational", "agentic"} else "conversational"
134
- raw_agent_role = str(getattr(prompt_obj, "agent_role", "") or "").strip().lower()
135
- agent_role = (
136
- raw_agent_role
137
- if raw_agent_role in {"workspace_chat", "workspace_agent", "channels", "operations"}
138
- else "workspace_chat"
139
- )
140
- execution_mode = "conversational" if agent_role == "workspace_chat" else "agentic"
132
+ raw_runtime_policy = getattr(prompt_obj, "runtime_policy", None)
133
+ if isinstance(raw_runtime_policy, dict):
134
+ runtime_policy = PromptService.normalize_runtime_policy(raw_runtime_policy)
135
+ else:
136
+ runtime_policy = PromptService.normalize_runtime_policy({
137
+ "role": getattr(prompt_obj, "agent_role", None),
138
+ "queue_tier": getattr(prompt_obj, "queue_tier", None),
139
+ "context": getattr(prompt_obj, "context_policy", None),
140
+ })
141
+ agent_role = runtime_policy["role"]
142
+ execution_mode = PromptService.execution_mode_for_agent_role(agent_role)
141
143
 
142
144
  resource_bindings: list[dict] = []
143
145
  for binding in getattr(prompt_obj, "resource_bindings", []) or []:
@@ -163,6 +165,8 @@ class ContextBuilderService:
163
165
  "prompt_name": prompt_obj.name,
164
166
  "agent_role": agent_role,
165
167
  "execution_mode": execution_mode,
168
+ "runtime_policy": runtime_policy,
169
+ "context_policy": runtime_policy["context"],
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.