iatoolkit 2.2.4__tar.gz → 2.3.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 (229) hide show
  1. {iatoolkit-2.2.4/src/iatoolkit.egg-info → iatoolkit-2.3.1}/PKG-INFO +1 -1
  2. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/common/routes.py +19 -0
  4. iatoolkit-2.3.1/src/iatoolkit/config/system_prompts_pack.yaml +114 -0
  5. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/locales/en.yaml +15 -4
  6. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/locales/es.yaml +15 -4
  7. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/repositories/llm_query_repo.py +21 -23
  8. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/repositories/models.py +51 -4
  9. iatoolkit-2.3.1/src/iatoolkit/repositories/prompt_resource_repo.py +40 -0
  10. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/company_context_service.py +50 -21
  11. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/configuration_service.py +12 -9
  12. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/context_builder_service.py +189 -26
  13. iatoolkit-2.3.1/src/iatoolkit/services/prompt_resource_service.py +182 -0
  14. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/prompt_service.py +81 -31
  15. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/query_service.py +431 -37
  16. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/system_prompt_catalog.py +103 -8
  17. iatoolkit-2.3.1/src/iatoolkit/system_prompts/chat_state_rules.prompt +5 -0
  18. iatoolkit-2.3.1/src/iatoolkit/system_prompts/chat_user_profile.prompt +6 -0
  19. iatoolkit-2.3.1/src/iatoolkit/system_prompts/core_identity.prompt +9 -0
  20. iatoolkit-2.3.1/src/iatoolkit/system_prompts/email_output.prompt +6 -0
  21. iatoolkit-2.3.1/src/iatoolkit/system_prompts/file_download_output.prompt +10 -0
  22. iatoolkit-2.3.1/src/iatoolkit/system_prompts/html_structures.prompt +14 -0
  23. iatoolkit-2.3.1/src/iatoolkit/system_prompts/links_documents.prompt +26 -0
  24. iatoolkit-2.3.1/src/iatoolkit/system_prompts/multimodal_basics.prompt +6 -0
  25. iatoolkit-2.3.1/src/iatoolkit/system_prompts/output_basics.prompt +8 -0
  26. iatoolkit-2.3.1/src/iatoolkit/system_prompts/presentation_formatting.prompt +10 -0
  27. iatoolkit-2.3.1/src/iatoolkit/system_prompts/sql_aggregation_scope.prompt +14 -0
  28. iatoolkit-2.3.1/src/iatoolkit/system_prompts/sql_casting.prompt +14 -0
  29. iatoolkit-2.3.1/src/iatoolkit/system_prompts/sql_core.prompt +9 -0
  30. iatoolkit-2.3.1/src/iatoolkit/system_prompts/sql_jsonb.prompt +12 -0
  31. iatoolkit-2.3.1/src/iatoolkit/system_prompts/tool_html_passthrough.prompt +8 -0
  32. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/categories_api_view.py +4 -4
  33. iatoolkit-2.3.1/src/iatoolkit/views/prompt_resource_api_view.py +90 -0
  34. {iatoolkit-2.2.4 → iatoolkit-2.3.1/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  35. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit.egg-info/SOURCES.txt +18 -0
  36. iatoolkit-2.2.4/src/iatoolkit/config/system_prompts_pack.yaml +0 -13
  37. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/LICENSE +0 -0
  38. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/LICENSE_COMMUNITY.md +0 -0
  39. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/pyproject.toml +0 -0
  40. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/readme.md +0 -0
  41. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/requirements.txt +0 -0
  42. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/setup.cfg +0 -0
  43. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/base_company.py +0 -0
  44. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/cli_commands.py +0 -0
  45. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/common/__init__.py +0 -0
  46. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/common/exceptions.py +0 -0
  47. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  48. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  49. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  50. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  51. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  52. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  53. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  54. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  55. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/common/model_registry.py +0 -0
  56. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/common/secret_resolver.py +0 -0
  57. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/common/session_manager.py +0 -0
  58. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/common/util.py +0 -0
  59. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/company_registry.py +0 -0
  60. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/config/__init__.py +0 -0
  61. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  62. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  63. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/core.py +0 -0
  64. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/__init__.py +0 -0
  65. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  66. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/call_service.py +0 -0
  67. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  68. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  69. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  70. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  71. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  72. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  73. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  74. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/google_auth_client.py +0 -0
  75. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/google_chat_app.py +0 -0
  76. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  77. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/inference_handler.py +0 -0
  78. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  79. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  80. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  81. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  82. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  83. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  84. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  85. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/llm_proxy.py +0 -0
  86. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/llm_response.py +0 -0
  87. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  88. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/repositories/__init__.py +0 -0
  89. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  90. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/repositories/database_manager.py +0 -0
  91. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/repositories/document_repo.py +0 -0
  92. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  93. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  94. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/repositories/memory_repo.py +0 -0
  95. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/repositories/profile_repo.py +0 -0
  96. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  97. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  98. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/repositories/vs_repo.py +0 -0
  99. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/__init__.py +0 -0
  100. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/api_key_service.py +0 -0
  101. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  102. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/auth_service.py +0 -0
  103. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/benchmark_service.py +0 -0
  104. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/branding_service.py +0 -0
  105. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/dispatcher_service.py +0 -0
  106. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/embedding_service.py +0 -0
  107. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/excel_service.py +0 -0
  108. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/file_processor_service.py +0 -0
  109. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/history_manager_service.py +0 -0
  110. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/http_tool_service.py +0 -0
  111. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/i18n_service.py +0 -0
  112. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/inference_service.py +0 -0
  113. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/jwt_service.py +0 -0
  114. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  115. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/language_service.py +0 -0
  116. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/license_service.py +0 -0
  117. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/llm_client_service.py +0 -0
  118. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/mail_service.py +0 -0
  119. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  120. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/memory_lint_service.py +0 -0
  121. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  122. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/memory_service.py +0 -0
  123. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  124. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  125. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  126. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/parsers/__init__.py +0 -0
  127. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/parsers/contracts.py +0 -0
  128. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  129. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  130. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  131. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  132. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  133. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  134. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  135. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  136. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/parsers/validator.py +0 -0
  137. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/pdf_service.py +0 -0
  138. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/profile_service.py +0 -0
  139. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  140. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  141. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/sql_service.py +0 -0
  142. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/sql_source_service.py +0 -0
  143. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/storage_service.py +0 -0
  144. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/structured_output_service.py +0 -0
  145. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/system_tools.py +0 -0
  146. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/tool_service.py +0 -0
  147. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/user_feedback_service.py +0 -0
  148. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/user_session_context_service.py +0 -0
  149. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/visual_kb_service.py +0 -0
  150. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/visual_tool_service.py +0 -0
  151. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/warmup_service.py +0 -0
  152. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/web_search/__init__.py +0 -0
  153. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  154. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  155. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  156. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/services/web_search_service.py +0 -0
  157. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  158. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  159. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  160. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  161. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  162. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  163. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  164. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  165. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/js/chat_main.js +0 -0
  166. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  167. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  168. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  169. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  170. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  171. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  172. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  173. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/styles/chat_public.css +0 -0
  174. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/styles/documents.css +0 -0
  175. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/styles/landing_page.css +0 -0
  176. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/styles/llm_output.css +0 -0
  177. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/static/styles/onboarding.css +0 -0
  178. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/system_prompts/__init__.py +0 -0
  179. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/system_prompts/format_styles.prompt +0 -0
  180. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/system_prompts/query_main.prompt +0 -0
  181. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/system_prompts/sql_rules.prompt +0 -0
  182. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/_company_header.html +0 -0
  183. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/_login_widget.html +0 -0
  184. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/base.html +0 -0
  185. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/change_password.html +0 -0
  186. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/chat.html +0 -0
  187. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  188. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/chat_modals.html +0 -0
  189. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/error.html +0 -0
  190. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/forgot_password.html +0 -0
  191. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  192. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  193. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  194. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/pdf/base.html +0 -0
  195. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/pdf/letter.html +0 -0
  196. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/pdf/report.html +0 -0
  197. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/pdf/simple.html +0 -0
  198. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/templates/signup.html +0 -0
  199. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/__init__.py +0 -0
  200. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/api_key_api_view.py +0 -0
  201. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/base_login_view.py +0 -0
  202. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/change_password_view.py +0 -0
  203. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/chat_view.py +0 -0
  204. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/configuration_api_view.py +0 -0
  205. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/connectors_api_view.py +0 -0
  206. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/embedding_api_view.py +0 -0
  207. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/forgot_password_view.py +0 -0
  208. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/help_content_api_view.py +0 -0
  209. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/history_api_view.py +0 -0
  210. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/home_view.py +0 -0
  211. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/init_context_api_view.py +0 -0
  212. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  213. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/load_document_api_view.py +0 -0
  214. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/login_view.py +0 -0
  215. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/logout_api_view.py +0 -0
  216. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/memory_api_view.py +0 -0
  217. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/profile_api_view.py +0 -0
  218. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/prompt_api_view.py +0 -0
  219. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/rag_api_view.py +0 -0
  220. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/root_redirect_view.py +0 -0
  221. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/signup_view.py +0 -0
  222. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/static_page_view.py +0 -0
  223. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/tool_api_view.py +0 -0
  224. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  225. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/users_api_view.py +0 -0
  226. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit/views/verify_user_view.py +0 -0
  227. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  228. {iatoolkit-2.2.4 → iatoolkit-2.3.1}/src/iatoolkit.egg-info/requires.txt +0 -0
  229. {iatoolkit-2.2.4 → iatoolkit-2.3.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.2.4
3
+ Version: 2.3.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.2.4"
6
+ __version__ = "2.3.1"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -22,6 +22,9 @@ def register_views(app):
22
22
  from iatoolkit.views.load_document_api_view import LoadDocumentApiView
23
23
  from iatoolkit.views.user_feedback_api_view import UserFeedbackApiView
24
24
  from iatoolkit.views.prompt_api_view import PromptApiView
25
+ from iatoolkit.views.chat_context_preview_api_view import ChatContextPreviewApiView
26
+ from iatoolkit.views.prompt_context_preview_api_view import PromptContextPreviewApiView
27
+ from iatoolkit.views.prompt_resource_api_view import PromptResourceApiView
25
28
  from iatoolkit.views.history_api_view import HistoryApiView
26
29
  from iatoolkit.views.help_content_api_view import HelpContentApiView
27
30
  from iatoolkit.views.profile_api_view import UserLanguageApiView
@@ -121,6 +124,22 @@ def register_views(app):
121
124
  app.add_url_rule('/<company_short_name>/api/prompts/<prompt_name>',
122
125
  view_func=prompt_view,
123
126
  methods=['GET', 'POST','PUT', 'DELETE'])
127
+
128
+ app.add_url_rule(
129
+ '/<string:company_short_name>/api/admin/context-preview/chat',
130
+ view_func=ChatContextPreviewApiView.as_view('chat_context_preview_api'),
131
+ methods=['GET'],
132
+ )
133
+ app.add_url_rule(
134
+ '/<string:company_short_name>/api/admin/prompts/<string:prompt_name>/context-preview',
135
+ view_func=PromptContextPreviewApiView.as_view('prompt_context_preview_api'),
136
+ methods=['POST'],
137
+ )
138
+ app.add_url_rule(
139
+ '/<string:company_short_name>/api/admin/prompts/<string:prompt_name>/resources',
140
+ view_func=PromptResourceApiView.as_view('prompt_resources_api'),
141
+ methods=['GET', 'PUT'],
142
+ )
124
143
  # toolbar buttons
125
144
  app.add_url_rule('/<company_short_name>/api/feedback', view_func=UserFeedbackApiView.as_view('feedback'))
126
145
  app.add_url_rule('/<company_short_name>/api/history', view_func=HistoryApiView.as_view('history'))
@@ -0,0 +1,114 @@
1
+ version: 2
2
+ prompts:
3
+ - key: core_identity
4
+ filename: core_identity.prompt
5
+ include:
6
+ execution_modes:
7
+ - chat
8
+ - agent
9
+ - key: chat_user_profile
10
+ filename: chat_user_profile.prompt
11
+ include:
12
+ execution_modes:
13
+ - chat
14
+ - key: chat_state_rules
15
+ filename: chat_state_rules.prompt
16
+ include:
17
+ execution_modes:
18
+ - chat
19
+ - key: links_documents
20
+ filename: links_documents.prompt
21
+ include:
22
+ execution_modes:
23
+ - chat
24
+ - agent
25
+ - key: memory_usage
26
+ filename: memory_usage.prompt
27
+ include:
28
+ execution_modes:
29
+ - chat
30
+ - agent
31
+ all_capabilities:
32
+ - can_use_memory
33
+ - key: multimodal_basics
34
+ filename: multimodal_basics.prompt
35
+ include:
36
+ execution_modes:
37
+ - chat
38
+ - agent
39
+ - key: output_basics
40
+ filename: output_basics.prompt
41
+ include:
42
+ execution_modes:
43
+ - chat
44
+ - agent
45
+ response_modes:
46
+ - chat_compatible
47
+ - key: presentation_formatting
48
+ filename: presentation_formatting.prompt
49
+ include:
50
+ execution_modes:
51
+ - chat
52
+ response_modes:
53
+ - chat_compatible
54
+ - key: html_structures
55
+ filename: html_structures.prompt
56
+ include:
57
+ execution_modes:
58
+ - chat
59
+ response_modes:
60
+ - chat_compatible
61
+ - key: tool_html_passthrough
62
+ filename: tool_html_passthrough.prompt
63
+ include:
64
+ execution_modes:
65
+ - chat
66
+ - agent
67
+ - key: file_download_output
68
+ filename: file_download_output.prompt
69
+ include:
70
+ execution_modes:
71
+ - chat
72
+ - agent
73
+ all_capabilities:
74
+ - can_generate_files
75
+ - key: email_output
76
+ filename: email_output.prompt
77
+ include:
78
+ execution_modes:
79
+ - chat
80
+ - agent
81
+ all_capabilities:
82
+ - can_send_email
83
+ - key: sql_core
84
+ filename: sql_core.prompt
85
+ include:
86
+ execution_modes:
87
+ - chat
88
+ - agent
89
+ all_capabilities:
90
+ - can_query_sql
91
+ - key: sql_jsonb
92
+ filename: sql_jsonb.prompt
93
+ include:
94
+ execution_modes:
95
+ - chat
96
+ - agent
97
+ all_capabilities:
98
+ - can_query_sql
99
+ - key: sql_casting
100
+ filename: sql_casting.prompt
101
+ include:
102
+ execution_modes:
103
+ - chat
104
+ - agent
105
+ all_capabilities:
106
+ - can_query_sql
107
+ - key: sql_aggregation_scope
108
+ filename: sql_aggregation_scope.prompt
109
+ include:
110
+ execution_modes:
111
+ - chat
112
+ - agent
113
+ all_capabilities:
114
+ - can_query_sql
@@ -312,14 +312,14 @@ ui:
312
312
  restore_failed: "Failed to restore skill version."
313
313
  restore_ok: "Skill version restored."
314
314
  readonly_message: "Skill editing requires admin or owner role."
315
- uncategorized: "Uncategorized"
315
+ uncategorized: "General"
316
316
  binding_label: "Binding {number}"
317
317
  resource_type_label: "Resource type"
318
318
  resource_key_label: "Resource key"
319
319
  resource_key_placeholder: "routing.yaml or collection name"
320
320
  metadata_json_label: "Metadata JSON"
321
- prompt_type_agent: "Agent"
322
- prompt_type_prompt: "Prompt"
321
+ execution_mode_agentic: "Agentic"
322
+ execution_mode_conversational: "Conversational"
323
323
  resource_type_tool: "Tool"
324
324
  resource_type_rag_collection: "RAG collection"
325
325
  resource_type_sql_source: "SQL source"
@@ -661,6 +661,9 @@ ui:
661
661
  definition_error_loading: "Could not load pipeline definition"
662
662
  definition_error_loading_list: "Could not load pipeline definitions"
663
663
  no_definitions: "No pipeline definitions yet."
664
+ no_active_definitions: "No active pipeline definitions."
665
+ show_inactive: "Show inactive"
666
+ definitions_filter_summary: "Showing {visible} of {total} pipelines"
664
667
  definition_last_run: "Last run"
665
668
  definition_no_runs: "No runs"
666
669
  definition_column_pipeline: "Pipeline"
@@ -984,12 +987,13 @@ ui:
984
987
  tab_editor: "Editor"
985
988
  tab_output: "Output"
986
989
  tab_tools: "Tools"
990
+ tab_resources: "Resources"
987
991
  tab_playground: "Playground"
988
992
  config_title: "Config"
989
993
  desc_label: "Description"
990
994
  desc_placeholder: "Describe this prompt..."
991
995
  vars_label: "Input Variables"
992
- prompt_type_label: "Prompt Type"
996
+ execution_mode_label: "Execution Mode"
993
997
  active_label: "Active"
994
998
  output_type_label: "Output Type"
995
999
  output_type_free_text: "Free text"
@@ -1056,6 +1060,13 @@ ui:
1056
1060
  tools_type_http: "HTTP"
1057
1061
  tools_type_native: "NATIVE"
1058
1062
  tools_type_system: "SYSTEM"
1063
+ resources_title: "Agent Resources"
1064
+ resources_help: "Define the data scope visible to this agent. Only typed resources relevant to the selected tools are shown."
1065
+ resources_sql_title: "SQL Sources"
1066
+ resources_sql_help: "Select the SQL sources this agent can use."
1067
+ resources_rag_title: "RAG Collections"
1068
+ resources_rag_help: "Select the document collections this agent can search."
1069
+ resources_memory_hint: "Memory tools use the current user scope and do not require extra bindings."
1059
1070
  run_btn: "Run"
1060
1071
  copy_html_btn: "Copy HTML"
1061
1072
  copy_json_btn: "Copy JSON"
@@ -312,14 +312,14 @@ ui:
312
312
  restore_failed: "No se pudo restaurar la versión de la skill."
313
313
  restore_ok: "Versión de skill restaurada."
314
314
  readonly_message: "La edición de skills requiere rol admin u owner."
315
- uncategorized: "Sin categoría"
315
+ uncategorized: "General"
316
316
  binding_label: "Binding {number}"
317
317
  resource_type_label: "Tipo de recurso"
318
318
  resource_key_label: "Key del recurso"
319
319
  resource_key_placeholder: "routing.yaml o nombre de colección"
320
320
  metadata_json_label: "Metadata JSON"
321
- prompt_type_agent: "Agente"
322
- prompt_type_prompt: "Prompt"
321
+ execution_mode_agentic: "Agéntico"
322
+ execution_mode_conversational: "Conversacional"
323
323
  resource_type_tool: "Tool"
324
324
  resource_type_rag_collection: "Colección RAG"
325
325
  resource_type_sql_source: "Fuente SQL"
@@ -662,6 +662,9 @@ ui:
662
662
  definition_error_loading: "No se pudo cargar la definición de pipeline"
663
663
  definition_error_loading_list: "No se pudieron cargar las definiciones de pipeline"
664
664
  no_definitions: "Todavía no hay definiciones de pipeline."
665
+ no_active_definitions: "No hay definiciones de pipeline activas."
666
+ show_inactive: "Mostrar inactivas"
667
+ definitions_filter_summary: "Mostrando {visible} de {total} pipelines"
665
668
  definition_last_run: "Última ejecución"
666
669
  definition_no_runs: "Sin ejecuciones"
667
670
  definition_column_pipeline: "Pipeline"
@@ -987,12 +990,13 @@ ui:
987
990
  tab_editor: "Editor"
988
991
  tab_output: "Salida"
989
992
  tab_tools: "Tools"
993
+ tab_resources: "Recursos"
990
994
  tab_playground: "Playground"
991
995
  config_title: "Configuración"
992
996
  desc_label: "Descripción"
993
997
  desc_placeholder: "Describe este prompt..."
994
998
  vars_label: "Variables de Entrada"
995
- prompt_type_label: "Tipo de Prompt"
999
+ execution_mode_label: "Modo de ejecución"
996
1000
  active_label: "Activo"
997
1001
  output_type_label: "Tipo de Salida"
998
1002
  output_type_free_text: "Texto libre"
@@ -1059,6 +1063,13 @@ ui:
1059
1063
  tools_type_http: "HTTP"
1060
1064
  tools_type_native: "NATIVE"
1061
1065
  tools_type_system: "SYSTEM"
1066
+ resources_title: "Recursos del Agente"
1067
+ resources_help: "Define el alcance de datos visible para este agente. Solo se muestran recursos tipados relevantes para las tools seleccionadas."
1068
+ resources_sql_title: "Fuentes SQL"
1069
+ resources_sql_help: "Selecciona las fuentes SQL que este agente podrá usar."
1070
+ resources_rag_title: "Colecciones RAG"
1071
+ resources_rag_help: "Selecciona las colecciones documentales que este agente podrá consultar."
1072
+ resources_memory_hint: "Las tools de memoria usan el scope del usuario actual y no requieren bindings adicionales."
1062
1073
  run_btn: "Ejecutar"
1063
1074
  copy_html_btn: "Copiar HTML"
1064
1075
  copy_json_btn: "Copiar JSON"
@@ -3,8 +3,14 @@
3
3
  #
4
4
  # IAToolkit is open source software.
5
5
 
6
- from iatoolkit.repositories.models import (LLMQuery, Tool,
7
- Company, Prompt, PromptCategory, PromptType)
6
+ from iatoolkit.repositories.models import (
7
+ LLMQuery,
8
+ Tool,
9
+ Company,
10
+ Prompt,
11
+ PromptCategory,
12
+ PromptExecutionMode,
13
+ )
8
14
  from injector import inject
9
15
  from iatoolkit.repositories.database_manager import DatabaseManager
10
16
  from sqlalchemy import or_, and_
@@ -134,36 +140,19 @@ class LLMQueryRepo:
134
140
  return self.session.query(Prompt).filter_by(company_id=company.id, name=prompt_name).first()
135
141
 
136
142
  def get_prompts(self, company: Company, include_all: bool = False) -> list[Prompt]:
137
- editable_types = [PromptType.COMPANY.value, PromptType.AGENT.value]
138
143
  if include_all:
139
144
  # Include all prompts (for the prompt admin dashboard)
140
145
  return self.session.query(Prompt).filter(
141
146
  Prompt.company_id == company.id,
142
- Prompt.prompt_type.in_(editable_types),
143
147
  ).all()
144
148
  else:
145
- # Only active company prompts (default behavior for end users)
149
+ # Only active prompts explicitly exposed in chat for end users.
146
150
  return self.session.query(Prompt).filter(
147
151
  Prompt.company_id == company.id,
148
- Prompt.prompt_type == PromptType.COMPANY.value,
149
- Prompt.active == True
152
+ Prompt.visible_in_chat.is_(True),
153
+ Prompt.active.is_(True),
150
154
  ).all()
151
155
 
152
- def delete_prompts_by_type(self, company_id: int, prompt_types: list[str]) -> int:
153
- if not prompt_types:
154
- return 0
155
-
156
- deleted_count = (
157
- self.session.query(Prompt)
158
- .filter(
159
- Prompt.company_id == company_id,
160
- Prompt.prompt_type.in_(prompt_types),
161
- )
162
- .delete(synchronize_session=False)
163
- )
164
- self.session.commit()
165
- return int(deleted_count or 0)
166
-
167
156
  def create_or_update_prompt(self, new_prompt: Prompt):
168
157
  prompt = self.session.query(Prompt).filter_by(company_id=new_prompt.company_id,
169
158
  name=new_prompt.name).first()
@@ -171,7 +160,12 @@ class LLMQueryRepo:
171
160
  prompt.category_id = new_prompt.category_id
172
161
  prompt.description = new_prompt.description
173
162
  prompt.order = new_prompt.order
174
- prompt.prompt_type = new_prompt.prompt_type
163
+ prompt.visible_in_chat = bool(getattr(new_prompt, "visible_in_chat", True))
164
+ prompt.execution_mode = (
165
+ getattr(new_prompt, "execution_mode", None)
166
+ or prompt.execution_mode
167
+ or PromptExecutionMode.CONVERSATIONAL.value
168
+ )
175
169
  prompt.filename = new_prompt.filename
176
170
  prompt.custom_fields = new_prompt.custom_fields
177
171
  prompt.output_schema = new_prompt.output_schema
@@ -189,6 +183,10 @@ class LLMQueryRepo:
189
183
  prompt.llm_request_options = dict(new_prompt.llm_request_options or {})
190
184
  prompt.tool_policy = dict(new_prompt.tool_policy or {})
191
185
  else:
186
+ if new_prompt.visible_in_chat is None:
187
+ new_prompt.visible_in_chat = True
188
+ if not new_prompt.execution_mode:
189
+ new_prompt.execution_mode = PromptExecutionMode.CONVERSATIONAL.value
192
190
  if not new_prompt.output_schema_mode:
193
191
  new_prompt.output_schema_mode = "best_effort"
194
192
  if not new_prompt.output_response_mode:
@@ -30,9 +30,15 @@ class DocumentStatus(str, enum.Enum):
30
30
  ACTIVE = "active"
31
31
  FAILED = "failed"
32
32
 
33
- class PromptType(str, enum.Enum):
34
- COMPANY = "company"
35
- AGENT = "agent"
33
+
34
+ class PromptExecutionMode(str, enum.Enum):
35
+ CONVERSATIONAL = "conversational"
36
+ AGENTIC = "agentic"
37
+
38
+
39
+ class PromptResourceType(str, enum.Enum):
40
+ SQL_SOURCE = "sql_source"
41
+ RAG_COLLECTION = "rag_collection"
36
42
 
37
43
 
38
44
  class MemoryItemType(str, enum.Enum):
@@ -545,7 +551,8 @@ class Prompt(Base):
545
551
  description = Column(String, nullable=False)
546
552
  filename = Column(String, nullable=False)
547
553
  active = Column(Boolean, default=True)
548
- prompt_type = Column(String, default=PromptType.COMPANY.value, nullable=False)
554
+ visible_in_chat = Column(Boolean, default=True, nullable=False)
555
+ execution_mode = Column(String, default=PromptExecutionMode.CONVERSATIONAL.value, nullable=False)
549
556
  order = Column(Integer, nullable=True, default=0)
550
557
  category_id = Column(Integer, ForeignKey(f'{ORM_SCHEMA}.iat_prompt_categories.id', ondelete='SET NULL'), nullable=True)
551
558
  custom_fields = Column(JSON, nullable=False, default=[])
@@ -560,11 +567,51 @@ class Prompt(Base):
560
567
  llm_request_options = Column(JSON_NATIVE, nullable=False, default=dict)
561
568
  tool_policy = Column(JSON_NATIVE, nullable=False, default=dict)
562
569
  created_at = Column(DateTime, default=datetime.now)
570
+
563
571
  def to_dict(self):
564
572
  return {column.key: getattr(self, column.key) for column in class_mapper(self.__class__).columns}
565
573
 
566
574
  company = relationship("Company", back_populates="prompts")
567
575
  category = relationship("PromptCategory", back_populates="prompts")
576
+ resource_bindings = relationship(
577
+ "PromptResourceBinding",
578
+ back_populates="prompt",
579
+ cascade="all, delete-orphan",
580
+ order_by="PromptResourceBinding.binding_order",
581
+ )
582
+
583
+
584
+ class PromptResourceBinding(Base):
585
+ __tablename__ = "iat_prompt_resource_bindings"
586
+
587
+ id = Column(Integer, primary_key=True, autoincrement=True)
588
+ prompt_id = Column(
589
+ Integer,
590
+ ForeignKey(f"{ORM_SCHEMA}.iat_prompt.id", ondelete="CASCADE"),
591
+ nullable=False,
592
+ index=True,
593
+ )
594
+ resource_type = Column(String(32), nullable=False, index=True)
595
+ resource_key = Column(String(255), nullable=False)
596
+ binding_order = Column(Integer, nullable=False, default=0)
597
+ metadata_json = Column(JSON_NATIVE, nullable=False, default=dict)
598
+ created_at = Column(DateTime, default=datetime.now)
599
+ updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)
600
+ updated_by = Column(String(100), nullable=True)
601
+
602
+ __table_args__ = (
603
+ UniqueConstraint(
604
+ "prompt_id",
605
+ "resource_type",
606
+ "resource_key",
607
+ name="uix_prompt_resource_binding_resource_key",
608
+ ),
609
+ )
610
+
611
+ prompt = relationship("Prompt", back_populates="resource_bindings")
612
+
613
+ def to_dict(self):
614
+ return {column.key: getattr(self, column.key) for column in class_mapper(self.__class__).columns}
568
615
 
569
616
 
570
617
  class SqlSource(Base):
@@ -0,0 +1,40 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
6
+ from __future__ import annotations
7
+
8
+ from injector import inject
9
+
10
+ from iatoolkit.repositories.database_manager import DatabaseManager
11
+ from iatoolkit.repositories.models import PromptResourceBinding
12
+
13
+
14
+ class PromptResourceRepo:
15
+ @inject
16
+ def __init__(self, db_manager: DatabaseManager):
17
+ self.session = db_manager.get_session()
18
+
19
+ def list_by_prompt(self, prompt_id: int) -> list[PromptResourceBinding]:
20
+ return (
21
+ self.session.query(PromptResourceBinding)
22
+ .filter(PromptResourceBinding.prompt_id == prompt_id)
23
+ .order_by(PromptResourceBinding.binding_order.asc(), PromptResourceBinding.id.asc())
24
+ .all()
25
+ )
26
+
27
+ def replace_bindings(
28
+ self,
29
+ prompt_id: int,
30
+ bindings: list[PromptResourceBinding],
31
+ ) -> list[PromptResourceBinding]:
32
+ (
33
+ self.session.query(PromptResourceBinding)
34
+ .filter(PromptResourceBinding.prompt_id == prompt_id)
35
+ .delete(synchronize_session="fetch")
36
+ )
37
+ for binding in bindings:
38
+ self.session.add(binding)
39
+ self.session.commit()
40
+ return bindings
@@ -34,9 +34,11 @@ class CompanyContextService:
34
34
  """
35
35
  Builds the full context by aggregating three sources:
36
36
  1. Static context files (Markdown).
37
- 2. Static schema files (YAML files for SQL data sources).
37
+ 2. Physical SQL schemas and enriched metadata.
38
+ 3. Residual schema files (YAML files not already covered by SQL enrichment).
38
39
  """
39
40
  context_parts = []
41
+ db_tables = []
40
42
 
41
43
  # 1. Context from Markdown (context/*.md) files
42
44
  try:
@@ -46,28 +48,42 @@ class CompanyContextService:
46
48
  except Exception as e:
47
49
  logging.warning(f"Could not load Markdown context for '{company_short_name}': {e}")
48
50
 
49
- # 2. Context from company-specific SQL databases
50
- db_tables = []
51
+ # 2. Resolve company-specific SQL databases. We collect them first so YAML
52
+ # context can avoid duplicating table definitions already covered by SQL.
53
+ sql_context = ""
51
54
  try:
52
55
  sql_context, db_tables = self._get_sql_enriched_context(company_short_name)
53
- if sql_context:
54
- context_parts.append(sql_context)
55
56
  except Exception as e:
56
57
  logging.warning(f"Could not generate SQL context for '{company_short_name}': {e}")
57
58
 
58
- # 3. Context from yaml (schema/*.yaml) files
59
+ # 3. Append physical SQL context after markdown. Table-level YAML metadata
60
+ # is already merged inline inside the enriched SQL definitions.
61
+ if sql_context:
62
+ context_parts.append(sql_context)
63
+
64
+ # 4. Context from residual yaml (schema/*.yaml) files
59
65
  try:
60
66
  yaml_schema_context = self._get_yaml_schema_context(company_short_name, db_tables)
61
67
  if yaml_schema_context:
62
- context_parts.append(yaml_schema_context)
68
+ context_parts.append(f"## Esquemas adicionales\n\n{yaml_schema_context.strip()}")
63
69
  except Exception as e:
64
70
  logging.warning(f"Could not load Yaml context for '{company_short_name}': {e}")
65
71
 
66
72
  # Join all parts with a clear separator
67
73
  return "\n\n---\n\n".join(context_parts)
68
74
 
75
+ def get_sql_context(self, company_short_name: str, allowed_databases: List[str] | None = None) -> str:
76
+ try:
77
+ sql_context, _ = self._get_sql_enriched_context(
78
+ company_short_name,
79
+ allowed_databases=allowed_databases,
80
+ )
81
+ return sql_context
82
+ except Exception as e:
83
+ logging.warning(f"Could not generate SQL context for '{company_short_name}': {e}")
84
+ return ""
69
85
 
70
- def _get_sql_enriched_context(self, company_short_name: str):
86
+ def _get_sql_enriched_context(self, company_short_name: str, allowed_databases: List[str] | None = None):
71
87
  """
72
88
  Generates the SQL context for the LLM using the enriched schema logic.
73
89
  It iterates over configured databases, fetches their enriched structure,
@@ -77,6 +93,14 @@ class CompanyContextService:
77
93
  if not sql_sources:
78
94
  return '', []
79
95
 
96
+ allowed_database_set = {
97
+ str(database or "").strip()
98
+ for database in (allowed_databases or [])
99
+ if str(database or "").strip()
100
+ }
101
+ if allowed_databases is not None and not allowed_database_set:
102
+ return "", []
103
+
80
104
  context_output = []
81
105
  db_tables=[]
82
106
 
@@ -84,6 +108,8 @@ class CompanyContextService:
84
108
  db_name = source.get('database')
85
109
  if not db_name:
86
110
  continue
111
+ if allowed_database_set and db_name not in allowed_database_set:
112
+ continue
87
113
 
88
114
  try:
89
115
  # 1. Get the Enriched Schema (Physical + YAML)
@@ -92,16 +118,15 @@ class CompanyContextService:
92
118
  continue
93
119
 
94
120
  # 2. Build Header for this Database
95
- db_context = f"***Database (`database_key`)***: {db_name}\n"
121
+ db_context = f"### Base SQL (`database_key`): {db_name}\n"
96
122
 
97
123
  # Optional: Add DB description from config if available (useful context)
98
124
  db_desc = source.get('description', '')
99
125
  if db_desc:
100
- db_context += f"**Description:** {db_desc}\n"
126
+ db_context += f"- Descripcion: {db_desc}\n"
101
127
 
102
128
  db_context += (
103
- f"IMPORTANT: To query this database you MUST use the service/tool "
104
- f"**iat_sql_query**, with `database_key='{db_name}'`.\n"
129
+ f"- Usa `iat_sql_query` con `database_key='{db_name}'` para consultar esta base.\n"
105
130
  )
106
131
 
107
132
  # 3. Format Tables
@@ -110,11 +135,11 @@ class CompanyContextService:
110
135
  columns = table_data.get('columns', [])
111
136
 
112
137
  # Table Header
113
- table_str = f"\nTable: **{table_name}**"
138
+ table_str = f"\n\n#### Tabla: `{table_name}`"
114
139
  if table_desc:
115
- table_str += f"\nDescription: {table_desc}"
140
+ table_str += f"\n- Descripcion: {table_desc}"
116
141
 
117
- table_str += "\nColumns:"
142
+ table_str += "\n- Columnas:"
118
143
 
119
144
  # Format Columns
120
145
  for col in columns:
@@ -151,7 +176,11 @@ class CompanyContextService:
151
176
  if not context_output:
152
177
  return "", []
153
178
 
154
- header = "These are the SQL databases you can query using the **`iat_sql_service`**. The schema below includes enriched metadata:\n"
179
+ header = (
180
+ "## Bases de datos SQL disponibles\n\n"
181
+ "Estas son las bases SQL que puedes consultar usando `iat_sql_query`. "
182
+ "El schema a continuacion incluye metadata enriquecida.\n"
183
+ )
155
184
  return header + "\n\n---\n\n".join(context_output), db_tables
156
185
 
157
186
 
@@ -186,7 +215,7 @@ class CompanyContextService:
186
215
  # 4. Generate markdown description from the dict
187
216
  if schema_dict:
188
217
  # We use generate_schema_table which accepts a dict directly
189
- yaml_schema_context += self.generate_schema_table(schema_dict)
218
+ yaml_schema_context += self.generate_schema_table(schema_dict) + "\n\n"
190
219
 
191
220
  except Exception as e:
192
221
  logging.warning(f"Error processing schema file {filename}: {e}")
@@ -207,25 +236,25 @@ class CompanyContextService:
207
236
 
208
237
  root_name = keys[0]
209
238
  root_data = schema[root_name]
210
- output = [f"\n### Objeto: `{root_name}`"]
239
+ output = [f"### Objeto: `{root_name}`"]
211
240
 
212
241
  # table description
213
242
  root_description = root_data.get('description', '')
214
243
  if root_description:
215
244
  clean_desc = root_description.replace('\n', ' ').strip()
216
- output.append(f"##Descripción: {clean_desc}")
245
+ output.append(f"- Descripcion: {clean_desc}")
217
246
 
218
247
  # extract columns and properties from the root object
219
248
  # priority: columns > properties > fields
220
249
  properties = root_data.get('columns', root_data.get('properties', {}))
221
250
  if properties:
222
- output.append("**Estructura de Datos:**")
251
+ output.append("#### Estructura de datos")
223
252
 
224
253
  # use indent_level 0 for the main columns
225
254
  # call recursive function to format the properties
226
255
  output.append(self._format_json_schema(properties, 0))
227
256
  else:
228
- output.append("\n_Sin definición de estructura._")
257
+ output.append("_Sin definicion de estructura._")
229
258
 
230
259
  return "\n".join(output)
231
260