iatoolkit 2.14.1__tar.gz → 2.14.2__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 (243) hide show
  1. {iatoolkit-2.14.1/src/iatoolkit.egg-info → iatoolkit-2.14.2}/PKG-INFO +7 -5
  2. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/requirements.txt +6 -4
  3. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/__init__.py +1 -1
  4. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/common/util.py +10 -5
  5. iatoolkit-2.14.2/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +9 -0
  6. iatoolkit-2.14.2/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +12 -0
  7. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts_pack.yaml +18 -0
  8. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/repositories/database_manager.py +80 -6
  9. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/context_builder_service.py +1 -0
  10. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/prompt_service.py +3 -0
  11. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/sql_service.py +28 -1
  12. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/sql_source_service.py +65 -34
  13. {iatoolkit-2.14.1 → iatoolkit-2.14.2/src/iatoolkit.egg-info}/PKG-INFO +7 -5
  14. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit.egg-info/SOURCES.txt +2 -0
  15. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit.egg-info/requires.txt +6 -4
  16. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/LICENSE +0 -0
  17. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/LICENSE_COMMUNITY.md +0 -0
  18. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/pyproject.toml +0 -0
  19. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/readme.md +0 -0
  20. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/setup.cfg +0 -0
  21. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/base_company.py +0 -0
  22. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/cli_commands.py +0 -0
  23. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/common/__init__.py +0 -0
  24. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/common/exceptions.py +0 -0
  25. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  26. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  27. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  28. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  29. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  30. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  31. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  32. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  33. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/common/model_registry.py +0 -0
  34. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/common/routes.py +0 -0
  35. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/common/secret_resolver.py +0 -0
  36. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/common/session_manager.py +0 -0
  37. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/company_registry.py +0 -0
  38. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/__init__.py +0 -0
  39. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  40. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  41. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  42. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  43. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  44. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  45. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  46. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  47. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  48. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  49. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  50. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  51. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  52. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  53. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  54. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  55. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  56. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  57. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  58. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  59. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  60. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  61. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  62. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  63. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  64. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  65. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/core.py +0 -0
  66. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/__init__.py +0 -0
  67. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  68. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/call_service.py +0 -0
  69. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  70. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  71. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  72. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  73. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  74. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  75. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  76. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/google_auth_client.py +0 -0
  77. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/google_chat_app.py +0 -0
  78. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  79. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/inference_handler.py +0 -0
  80. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  81. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  82. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  83. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  84. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  85. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  86. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  87. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  88. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_proxy.py +0 -0
  89. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_response.py +0 -0
  90. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  91. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/locales/en.yaml +0 -0
  92. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/locales/es.yaml +0 -0
  93. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/repositories/__init__.py +0 -0
  94. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  95. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/repositories/document_repo.py +0 -0
  96. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  97. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  98. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  99. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/repositories/mcp_personal_access_token_repo.py +0 -0
  100. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/repositories/memory_repo.py +0 -0
  101. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/repositories/models.py +0 -0
  102. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/repositories/profile_repo.py +0 -0
  103. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  104. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  105. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  106. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/repositories/vs_repo.py +0 -0
  107. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/__init__.py +0 -0
  108. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/api_key_service.py +0 -0
  109. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  110. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/auth_service.py +0 -0
  111. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/benchmark_service.py +0 -0
  112. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/branding_service.py +0 -0
  113. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/company_context_service.py +0 -0
  114. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/configuration_service.py +0 -0
  115. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/dispatcher_service.py +0 -0
  116. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/embedding_service.py +0 -0
  117. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/excel_service.py +0 -0
  118. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/file_processor_service.py +0 -0
  119. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/history_manager_service.py +0 -0
  120. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/http_tool_service.py +0 -0
  121. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/i18n_service.py +0 -0
  122. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/inference_service.py +0 -0
  123. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/jwt_service.py +0 -0
  124. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  125. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/language_service.py +0 -0
  126. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/license_service.py +0 -0
  127. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/llm_client_service.py +0 -0
  128. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/mail_service.py +0 -0
  129. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/mcp_personal_access_token_service.py +0 -0
  130. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  131. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/memory_lint_service.py +0 -0
  132. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  133. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/memory_service.py +0 -0
  134. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  135. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  136. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  137. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/__init__.py +0 -0
  138. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/contracts.py +0 -0
  139. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  140. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  141. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  142. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  143. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  144. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  145. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  146. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  147. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/validator.py +0 -0
  148. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/pdf_service.py +0 -0
  149. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/profile_service.py +0 -0
  150. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  151. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/query_service.py +0 -0
  152. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  153. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  154. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/storage_service.py +0 -0
  155. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/structured_output_service.py +0 -0
  156. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  157. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/system_tools.py +0 -0
  158. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/telemetry_service.py +0 -0
  159. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/tool_service.py +0 -0
  160. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/user_feedback_service.py +0 -0
  161. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/user_session_context_service.py +0 -0
  162. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/visual_kb_service.py +0 -0
  163. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/visual_tool_service.py +0 -0
  164. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/warmup_service.py +0 -0
  165. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/web_search/__init__.py +0 -0
  166. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  167. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  168. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  169. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/services/web_search_service.py +0 -0
  170. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  171. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  172. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  173. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  174. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  175. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  176. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  177. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  178. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_main.js +0 -0
  179. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  180. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  181. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  182. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  183. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  184. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  185. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  186. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/chat_public.css +0 -0
  187. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/documents.css +0 -0
  188. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/landing_page.css +0 -0
  189. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/llm_output.css +0 -0
  190. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/onboarding.css +0 -0
  191. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/_company_header.html +0 -0
  192. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/_login_widget.html +0 -0
  193. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/account.html +0 -0
  194. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/base.html +0 -0
  195. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/change_password.html +0 -0
  196. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/chat.html +0 -0
  197. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  198. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/chat_modals.html +0 -0
  199. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/error.html +0 -0
  200. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/forgot_password.html +0 -0
  201. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  202. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  203. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  204. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/pdf/base.html +0 -0
  205. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/pdf/letter.html +0 -0
  206. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/pdf/report.html +0 -0
  207. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/pdf/simple.html +0 -0
  208. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/templates/signup.html +0 -0
  209. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/__init__.py +0 -0
  210. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/account_view.py +0 -0
  211. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/api_key_api_view.py +0 -0
  212. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/base_login_view.py +0 -0
  213. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/categories_api_view.py +0 -0
  214. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/change_password_view.py +0 -0
  215. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  216. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/chat_view.py +0 -0
  217. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/configuration_api_view.py +0 -0
  218. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/connectors_api_view.py +0 -0
  219. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/embedding_api_view.py +0 -0
  220. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/forgot_password_view.py +0 -0
  221. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/help_content_api_view.py +0 -0
  222. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/history_api_view.py +0 -0
  223. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/home_view.py +0 -0
  224. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/init_context_api_view.py +0 -0
  225. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  226. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/load_document_api_view.py +0 -0
  227. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/login_view.py +0 -0
  228. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/logout_api_view.py +0 -0
  229. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/memory_api_view.py +0 -0
  230. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/profile_api_view.py +0 -0
  231. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/prompt_api_view.py +0 -0
  232. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  233. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  234. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/rag_api_view.py +0 -0
  235. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/root_redirect_view.py +0 -0
  236. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/signup_view.py +0 -0
  237. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/static_page_view.py +0 -0
  238. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/tool_api_view.py +0 -0
  239. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  240. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/users_api_view.py +0 -0
  241. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit/views/verify_user_view.py +0 -0
  242. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  243. {iatoolkit-2.14.1 → iatoolkit-2.14.2}/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.14.1
3
+ Version: 2.14.2
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -10,8 +10,8 @@ License-File: LICENSE
10
10
  License-File: LICENSE_COMMUNITY.md
11
11
  Requires-Dist: bcrypt==4.2.1
12
12
  Requires-Dist: anthropic>=0.83.0
13
- Requires-Dist: boto3==1.36.22
14
- Requires-Dist: botocore==1.36.22
13
+ Requires-Dist: boto3==1.43.10
14
+ Requires-Dist: botocore==1.43.10
15
15
  Requires-Dist: braintrust>=0.17.0
16
16
  Requires-Dist: build==1.2.2.post1
17
17
  Requires-Dist: click==8.1.8
@@ -74,9 +74,11 @@ Requires-Dist: regex==2024.11.6
74
74
  Requires-Dist: requests==2.32.3
75
75
  Requires-Dist: requests-oauthlib==2.0.0
76
76
  Requires-Dist: requests-toolbelt==1.0.0
77
- Requires-Dist: s3transfer==0.11.2
77
+ Requires-Dist: s3transfer==0.17.0
78
78
  Requires-Dist: sib-api-v3-sdk==7.6.0
79
- Requires-Dist: SQLAlchemy==2.0.36
79
+ Requires-Dist: SQLAlchemy==2.0.49
80
+ Requires-Dist: sqlalchemy-redshift==1.0.0
81
+ Requires-Dist: redshift_connector==2.1.14
80
82
  Requires-Dist: tiktoken==0.8.0
81
83
  Requires-Dist: tokenizers>=0.22.0
82
84
  Requires-Dist: websocket-client==1.8.0
@@ -1,7 +1,7 @@
1
1
  bcrypt==4.2.1
2
2
  anthropic>=0.83.0
3
- boto3==1.36.22
4
- botocore==1.36.22
3
+ boto3==1.43.10
4
+ botocore==1.43.10
5
5
  braintrust>=0.17.0
6
6
  build==1.2.2.post1
7
7
  click==8.1.8
@@ -64,9 +64,11 @@ regex==2024.11.6
64
64
  requests==2.32.3
65
65
  requests-oauthlib==2.0.0
66
66
  requests-toolbelt==1.0.0
67
- s3transfer==0.11.2
67
+ s3transfer==0.17.0
68
68
  sib-api-v3-sdk==7.6.0
69
- SQLAlchemy==2.0.36
69
+ SQLAlchemy==2.0.49
70
+ sqlalchemy-redshift==1.0.0
71
+ redshift_connector==2.1.14
70
72
  tiktoken==0.8.0
71
73
  tokenizers>=0.22.0
72
74
  websocket-client==1.8.0
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # IAToolkit is open source software.
5
5
 
6
- __version__ = "2.14.1"
6
+ __version__ = "2.14.2"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -36,11 +36,13 @@ class Utility:
36
36
  env = Environment(loader=FileSystemLoader(template_dir))
37
37
  template = env.get_template(template_file)
38
38
 
39
- # add all the keys in client_data to kwargs
40
- kwargs.update(client_data)
39
+ # Explicit kwargs should win over client_data to preserve rich objects
40
+ # such as `company` passed by the caller.
41
+ render_context = dict(client_data)
42
+ render_context.update(kwargs)
41
43
 
42
44
  # render my dynamic prompt
43
- prompt = template.render(**kwargs)
45
+ prompt = template.render(**render_context)
44
46
  return prompt
45
47
  except Exception as e:
46
48
  logging.exception(e)
@@ -72,9 +74,12 @@ class Utility:
72
74
  env = Environment(loader=loader)
73
75
  template = env.from_string(template_string)
74
76
 
75
- kwargs.update(client_data)
77
+ # Explicit kwargs should win over client_data to preserve rich objects
78
+ # such as `company` passed by the caller.
79
+ render_context = dict(client_data)
80
+ render_context.update(kwargs)
76
81
 
77
- prompt = template.render(**kwargs)
82
+ prompt = template.render(**render_context)
78
83
  return prompt
79
84
  except Exception as e:
80
85
  logging.exception(e)
@@ -0,0 +1,9 @@
1
+ ### SQL Redshift: reglas base
2
+
3
+ - Si el contexto marca `dialect=redshift`, escribe SQL compatible con Amazon Redshift.
4
+ - Prefiere SQL analitico clasico: `SELECT`, `JOIN`, `CTE`, agregaciones y funciones de ventana.
5
+ - No asumas compatibilidad completa con PostgreSQL aunque la sintaxis se parezca.
6
+ - No uses `DISTINCT ON`, `RETURNING`, `ON CONFLICT`, `ILIKE ANY` ni otras extensiones
7
+ de PostgreSQL que no sean necesarias para una consulta analitica.
8
+ - Si el schema muestra tablas en un schema especifico, respeta ese schema o los alias
9
+ provistos por el contexto.
@@ -0,0 +1,12 @@
1
+ ### SQL Redshift: tipos, casting y JSON
2
+
3
+ - Usa `CAST(... AS INTEGER)`, `CAST(... AS DECIMAL(18, 4))`, `CAST(... AS DATE)` o el tipo
4
+ explicito que corresponda. Evita casts estilo PostgreSQL como `::NUMERIC`, `::INTEGER`
5
+ o `::DATE`.
6
+ - No uses tipos ni operadores `jsonb` de PostgreSQL como `->`, `->>`, `jsonb_each`
7
+ o `jsonb_array_elements`.
8
+ - Si hay columnas semiestructuradas, apóyate solo en las funciones o expresiones que el
9
+ schema y el contexto hagan evidentes. Si no aparecen detalles suficientes, prioriza
10
+ columnas relacionales normales antes que inventar acceso a JSON.
11
+ - Para fechas y timestamps, usa funciones compatibles con Redshift y evita asumir helpers
12
+ exclusivos de PostgreSQL si no son necesarios.
@@ -151,6 +151,24 @@ prompts:
151
151
  - agent
152
152
  all_capabilities:
153
153
  - can_query_sql
154
+ - key: sql_redshift_basics
155
+ filename: sql_redshift_basics.prompt
156
+ section: data_access_rules
157
+ include:
158
+ execution_modes:
159
+ - chat
160
+ - agent
161
+ all_capabilities:
162
+ - can_query_sql_redshift
163
+ - key: sql_redshift_types
164
+ filename: sql_redshift_types.prompt
165
+ section: data_access_rules
166
+ include:
167
+ execution_modes:
168
+ - chat
169
+ - agent
170
+ all_capabilities:
171
+ - can_query_sql_redshift
154
172
  - key: sql_mysql_json
155
173
  filename: sql_mysql_json.prompt
156
174
  section: data_access_rules
@@ -5,6 +5,7 @@
5
5
 
6
6
  # database_manager.py
7
7
  from sqlalchemy import create_engine, event, inspect, text
8
+ from sqlalchemy.dialects import registry
8
9
  from sqlalchemy.orm import sessionmaker, scoped_session
9
10
  from sqlalchemy.engine.url import make_url
10
11
  from iatoolkit.repositories.models import Base, ORM_SCHEMA
@@ -17,12 +18,14 @@ import logging
17
18
  class DatabaseManager(DatabaseProvider):
18
19
  _POSTGRES_BOOTSTRAP_PATCHES = (
19
20
  )
21
+ _DEFAULT_CONNECT_TIMEOUT = 10
20
22
 
21
23
  @inject
22
24
  def __init__(self,
23
25
  database_url: str,
24
26
  schema: str = 'public',
25
- register_pgvector: bool = True):
27
+ register_pgvector: bool = True,
28
+ timeout: int | None = None):
26
29
  """
27
30
  Inicializa el gestor de la base de datos.
28
31
  :param database_url: URL de la base de datos.
@@ -31,6 +34,7 @@ class DatabaseManager(DatabaseProvider):
31
34
  """
32
35
 
33
36
  self.schema = schema
37
+ self.timeout = self._normalize_timeout(timeout)
34
38
 
35
39
  # FIX HEROKU: replace postgres:// by postgresql:// for compatibility with SQLAlchemy 1.4+
36
40
  if database_url and database_url.startswith("postgres://"):
@@ -38,12 +42,15 @@ class DatabaseManager(DatabaseProvider):
38
42
 
39
43
  self.url = make_url(database_url)
40
44
  self.backend = self.url.get_backend_name()
45
+ if self._is_redshift():
46
+ self._ensure_redshift_dialect_registered()
47
+ self.engine_url = self._build_engine_url()
41
48
 
42
49
  if self.backend == 'sqlite':
43
- raw_engine = create_engine(database_url, echo=False)
50
+ raw_engine = create_engine(self.engine_url, echo=False)
44
51
  else:
45
52
  raw_engine = create_engine(
46
- database_url,
53
+ self.engine_url,
47
54
  echo=False,
48
55
  pool_size=10, # per worker
49
56
  max_overflow=20,
@@ -58,6 +65,7 @@ class DatabaseManager(DatabaseProvider):
58
65
  self._engine = raw_engine.execution_options(
59
66
  schema_translate_map={ORM_SCHEMA: translated_schema}
60
67
  )
68
+ self.engine = self._engine
61
69
  self.SessionFactory = sessionmaker(bind=self._engine,
62
70
  autoflush=False,
63
71
  autocommit=False,
@@ -76,24 +84,82 @@ class DatabaseManager(DatabaseProvider):
76
84
  def _is_postgres(self) -> bool:
77
85
  return self.backend in ('postgresql', 'postgres')
78
86
 
87
+ def _is_redshift(self) -> bool:
88
+ return self.backend == 'redshift'
89
+
79
90
  def _is_mysql(self) -> bool:
80
91
  return self.backend == 'mysql'
81
92
 
93
+ @classmethod
94
+ def _normalize_timeout(cls, timeout: int | str | None) -> int:
95
+ if timeout is None:
96
+ return cls._DEFAULT_CONNECT_TIMEOUT
97
+
98
+ try:
99
+ normalized = int(timeout)
100
+ except (TypeError, ValueError):
101
+ return cls._DEFAULT_CONNECT_TIMEOUT
102
+
103
+ return normalized if normalized > 0 else cls._DEFAULT_CONNECT_TIMEOUT
104
+
105
+ def _resolve_timeout(self) -> int:
106
+ if self.timeout != self._DEFAULT_CONNECT_TIMEOUT:
107
+ return self.timeout
108
+
109
+ for query_key in ("timeout", "connect_timeout"):
110
+ value = self.url.query.get(query_key)
111
+ if value is None:
112
+ continue
113
+ return self._normalize_timeout(value)
114
+
115
+ return self.timeout
116
+
117
+ def _build_engine_url(self):
118
+ normalized_url = self.url
119
+ if self._is_redshift():
120
+ normalized_url = self.url.difference_update_query(["timeout", "connect_timeout"])
121
+
122
+ return normalized_url.render_as_string(hide_password=False)
123
+
124
+ @staticmethod
125
+ def _ensure_redshift_dialect_registered():
126
+ try:
127
+ # Avoid relying solely on SQLAlchemy entrypoint discovery. In long-lived
128
+ # processes, the plugin registry may not notice a dialect installed later.
129
+ registry.register(
130
+ "redshift",
131
+ "sqlalchemy_redshift.dialect",
132
+ "RedshiftDialect_psycopg2",
133
+ )
134
+ registry.register(
135
+ "redshift.redshift_connector",
136
+ "sqlalchemy_redshift.dialect",
137
+ "RedshiftDialect_redshift_connector",
138
+ )
139
+ except Exception as e:
140
+ logging.debug("Unable to pre-register Redshift SQLAlchemy dialects: %s", e)
141
+
82
142
  def _build_connect_args(self) -> dict:
143
+ resolved_timeout = self._resolve_timeout()
144
+
83
145
  if self._is_postgres():
84
146
  return {
85
147
  "keepalives": 1,
86
148
  "keepalives_idle": 30,
87
149
  "keepalives_interval": 10,
88
150
  "keepalives_count": 5,
89
- "connect_timeout": 10,
151
+ "connect_timeout": resolved_timeout,
152
+ }
153
+ if self._is_redshift():
154
+ return {
155
+ "timeout": resolved_timeout,
90
156
  }
91
157
  if self._is_mysql():
92
158
  return {
93
- "connect_timeout": 10,
159
+ "connect_timeout": resolved_timeout,
94
160
  }
95
161
  return {
96
- "connect_timeout": 10,
162
+ "connect_timeout": resolved_timeout,
97
163
  }
98
164
 
99
165
  def _effective_schema(self) -> str | None:
@@ -103,6 +169,10 @@ class DatabaseManager(DatabaseProvider):
103
169
  if self._is_postgres():
104
170
  return self.schema
105
171
 
172
+ if self._is_redshift():
173
+ normalized = str(self.schema or "").strip()
174
+ return normalized or "public"
175
+
106
176
  if self._is_mysql():
107
177
  normalized = str(self.schema or "").strip()
108
178
  if normalized and normalized.lower() != "public":
@@ -190,6 +260,10 @@ class DatabaseManager(DatabaseProvider):
190
260
  session = self.get_session()
191
261
  if self._is_postgres() and self.schema:
192
262
  session.execute(text(f"SET search_path TO {self.schema}"))
263
+ elif self._is_redshift():
264
+ normalized_schema = str(self.schema or "").strip()
265
+ if normalized_schema and normalized_schema.lower() != "public":
266
+ session.execute(text(f"SET search_path TO {normalized_schema}, public"))
193
267
 
194
268
  result = session.execute(text(query))
195
269
  if commit:
@@ -295,6 +295,7 @@ class ContextBuilderService:
295
295
  if self.SQL_TOOL_NAME in enabled_tool_names and not sql_sources:
296
296
  prompt_capabilities.discard("can_query_sql")
297
297
  prompt_capabilities.discard("can_query_sql_postgres")
298
+ prompt_capabilities.discard("can_query_sql_redshift")
298
299
  prompt_capabilities.discard("can_query_sql_mysql")
299
300
  prompt_capabilities = self.prompt_service.resolve_system_prompt_capabilities(
300
301
  company.short_name,
@@ -729,6 +729,8 @@ class PromptService:
729
729
  only_dialect = next(iter(dialects))
730
730
  if only_dialect in {"postgresql", "postgres"}:
731
731
  capabilities.add("can_query_sql_postgres")
732
+ elif only_dialect == "redshift":
733
+ capabilities.add("can_query_sql_redshift")
732
734
  elif only_dialect == "mysql":
733
735
  capabilities.add("can_query_sql_mysql")
734
736
  except Exception as e:
@@ -760,6 +762,7 @@ class PromptService:
760
762
  capabilities.update(sql_capabilities)
761
763
  else:
762
764
  capabilities.discard("can_query_sql_postgres")
765
+ capabilities.discard("can_query_sql_redshift")
763
766
  capabilities.discard("can_query_sql_mysql")
764
767
 
765
768
  return capabilities
@@ -52,10 +52,11 @@ class SqlService:
52
52
  """Default factory for standard SQLAlchemy connections."""
53
53
  uri = config.get('db_uri') or config.get('DATABASE_URI')
54
54
  schema = config.get('schema')
55
+ timeout = config.get('timeout')
55
56
  if not uri:
56
57
  raise IAToolkitException(IAToolkitException.ErrorType.DATABASE_ERROR,
57
58
  "Missing db_uri for direct connection")
58
- return DatabaseManager(uri, schema=schema, register_pgvector=False)
59
+ return DatabaseManager(uri, schema=schema, register_pgvector=False, timeout=timeout)
59
60
 
60
61
  def register_database(self, company_short_name: str, db_name: str, config: dict):
61
62
  """
@@ -111,12 +112,38 @@ class SqlService:
111
112
  return value.strip().lower()
112
113
  return ""
113
114
 
115
+ def _hydrate_database_from_catalog(self, company_short_name: str, db_name: str) -> bool:
116
+ try:
117
+ from iatoolkit.core import current_iatoolkit
118
+ from iatoolkit.services.sql_source_service import SqlSourceService
119
+
120
+ injector = current_iatoolkit().get_injector()
121
+ sql_source_service = injector.get(SqlSourceService)
122
+ return bool(sql_source_service.ensure_runtime_registration(company_short_name, db_name))
123
+ except Exception as e:
124
+ logging.debug(
125
+ "Unable to hydrate SQL source '%s' for '%s' from catalog: %s",
126
+ db_name,
127
+ company_short_name,
128
+ e,
129
+ )
130
+ return False
131
+
114
132
  def get_database_provider(self, company_short_name: str, db_name: str) -> DatabaseProvider:
115
133
  """
116
134
  Retrieves a registered DatabaseProvider instance using the composite key.
117
135
  Replaces the old 'get_database_manager'.
118
136
  """
119
137
  key = (company_short_name, db_name)
138
+ provider = self._db_connections.get(key)
139
+ if provider is not None:
140
+ return provider
141
+
142
+ if self._hydrate_database_from_catalog(company_short_name, db_name):
143
+ provider = self._db_connections.get(key)
144
+ if provider is not None:
145
+ return provider
146
+
120
147
  try:
121
148
  return self._db_connections[key]
122
149
  except KeyError:
@@ -329,6 +329,67 @@ class SqlSourceService:
329
329
  "skipped": skipped,
330
330
  }
331
331
 
332
+ def _build_runtime_config(self, company_short_name: str, src: SqlSource) -> dict | None:
333
+ db_name = self._normalize_database(src.database)
334
+ connection_type = self._normalize_connection_type(src.connection_type)
335
+ schema_name = self._normalize_schema(src.schema)
336
+
337
+ db_config = {
338
+ "database": db_name,
339
+ "schema": schema_name,
340
+ "connection_type": connection_type,
341
+ "bridge_id": self._normalize_optional_text(src.bridge_id),
342
+ }
343
+
344
+ if connection_type == SqlSource.CONNECTION_DIRECT:
345
+ secret_ref = normalize_secret_ref(src.connection_string_env)
346
+ db_uri = resolve_secret(self.secret_provider, company_short_name, secret_ref)
347
+ if not db_uri:
348
+ logging.error(
349
+ "Skipping SQL source '%s' for '%s': missing secret '%s'.",
350
+ db_name,
351
+ company_short_name,
352
+ secret_ref,
353
+ )
354
+ return None
355
+ db_config["db_uri"] = db_uri
356
+ return db_config
357
+
358
+ if connection_type == SqlSource.CONNECTION_BRIDGE:
359
+ if not db_config.get("bridge_id"):
360
+ logging.error(
361
+ "Skipping SQL source '%s' for '%s': missing bridge_id.",
362
+ db_name,
363
+ company_short_name,
364
+ )
365
+ return None
366
+ return db_config
367
+
368
+ logging.error(
369
+ "Skipping SQL source '%s' for '%s': unsupported connection_type '%s'.",
370
+ db_name,
371
+ company_short_name,
372
+ connection_type,
373
+ )
374
+ return None
375
+
376
+ def ensure_runtime_registration(self, company_short_name: str, db_name: str) -> bool:
377
+ company = self._get_company(company_short_name)
378
+ normalized_db_name = self._normalize_database(db_name)
379
+ if not normalized_db_name:
380
+ return False
381
+
382
+ source = self.sql_source_repo.get_by_database(company.id, normalized_db_name)
383
+ if not source or not bool(getattr(source, "is_active", False)):
384
+ return False
385
+
386
+ db_config = self._build_runtime_config(company_short_name, source)
387
+ if not db_config:
388
+ return False
389
+
390
+ self.sql_service.register_database(company_short_name, normalized_db_name, db_config)
391
+ return normalized_db_name in self.sql_service.get_db_names(company_short_name)
392
+
332
393
  def refresh_runtime(self, company_short_name: str) -> dict:
333
394
  company = self._get_company(company_short_name)
334
395
  self.sql_service.clear_company_connections(company_short_name)
@@ -339,40 +400,10 @@ class SqlSourceService:
339
400
 
340
401
  for src in active_sources:
341
402
  db_name = self._normalize_database(src.database)
342
- connection_type = self._normalize_connection_type(src.connection_type)
343
- schema_name = self._normalize_schema(src.schema)
344
-
345
- db_config = {
346
- "database": db_name,
347
- "schema": schema_name,
348
- "connection_type": connection_type,
349
- "bridge_id": self._normalize_optional_text(src.bridge_id),
350
- }
351
-
352
- if connection_type == SqlSource.CONNECTION_DIRECT:
353
- secret_ref = normalize_secret_ref(src.connection_string_env)
354
- db_uri = resolve_secret(self.secret_provider, company_short_name, secret_ref)
355
- if not db_uri:
356
- skipped += 1
357
- logging.error(
358
- "Skipping SQL source '%s' for '%s': missing secret '%s'.",
359
- db_name,
360
- company_short_name,
361
- secret_ref,
362
- )
363
- continue
364
- db_config["db_uri"] = db_uri
365
-
366
- elif connection_type == SqlSource.CONNECTION_BRIDGE:
367
- if not db_config.get("bridge_id"):
368
- skipped += 1
369
- logging.error(
370
- "Skipping SQL source '%s' for '%s': missing bridge_id.",
371
- db_name,
372
- company_short_name,
373
- )
374
- continue
375
-
403
+ db_config = self._build_runtime_config(company_short_name, src)
404
+ if not db_config:
405
+ skipped += 1
406
+ continue
376
407
  self.sql_service.register_database(company_short_name, db_name, db_config)
377
408
  registered += 1
378
409
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.14.1
3
+ Version: 2.14.2
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -10,8 +10,8 @@ License-File: LICENSE
10
10
  License-File: LICENSE_COMMUNITY.md
11
11
  Requires-Dist: bcrypt==4.2.1
12
12
  Requires-Dist: anthropic>=0.83.0
13
- Requires-Dist: boto3==1.36.22
14
- Requires-Dist: botocore==1.36.22
13
+ Requires-Dist: boto3==1.43.10
14
+ Requires-Dist: botocore==1.43.10
15
15
  Requires-Dist: braintrust>=0.17.0
16
16
  Requires-Dist: build==1.2.2.post1
17
17
  Requires-Dist: click==8.1.8
@@ -74,9 +74,11 @@ Requires-Dist: regex==2024.11.6
74
74
  Requires-Dist: requests==2.32.3
75
75
  Requires-Dist: requests-oauthlib==2.0.0
76
76
  Requires-Dist: requests-toolbelt==1.0.0
77
- Requires-Dist: s3transfer==0.11.2
77
+ Requires-Dist: s3transfer==0.17.0
78
78
  Requires-Dist: sib-api-v3-sdk==7.6.0
79
- Requires-Dist: SQLAlchemy==2.0.36
79
+ Requires-Dist: SQLAlchemy==2.0.49
80
+ Requires-Dist: sqlalchemy-redshift==1.0.0
81
+ Requires-Dist: redshift_connector==2.1.14
80
82
  Requires-Dist: tiktoken==0.8.0
81
83
  Requires-Dist: tokenizers>=0.22.0
82
84
  Requires-Dist: websocket-client==1.8.0
@@ -54,6 +54,8 @@ src/iatoolkit/config/system_prompts/sql_core.prompt
54
54
  src/iatoolkit/config/system_prompts/sql_jsonb.prompt
55
55
  src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt
56
56
  src/iatoolkit/config/system_prompts/sql_mysql_json.prompt
57
+ src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt
58
+ src/iatoolkit/config/system_prompts/sql_redshift_types.prompt
57
59
  src/iatoolkit/config/system_prompts/sql_rules.prompt
58
60
  src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt
59
61
  src/iatoolkit/infra/__init__.py
@@ -1,7 +1,7 @@
1
1
  bcrypt==4.2.1
2
2
  anthropic>=0.83.0
3
- boto3==1.36.22
4
- botocore==1.36.22
3
+ boto3==1.43.10
4
+ botocore==1.43.10
5
5
  braintrust>=0.17.0
6
6
  build==1.2.2.post1
7
7
  click==8.1.8
@@ -64,9 +64,11 @@ regex==2024.11.6
64
64
  requests==2.32.3
65
65
  requests-oauthlib==2.0.0
66
66
  requests-toolbelt==1.0.0
67
- s3transfer==0.11.2
67
+ s3transfer==0.17.0
68
68
  sib-api-v3-sdk==7.6.0
69
- SQLAlchemy==2.0.36
69
+ SQLAlchemy==2.0.49
70
+ sqlalchemy-redshift==1.0.0
71
+ redshift_connector==2.1.14
70
72
  tiktoken==0.8.0
71
73
  tokenizers>=0.22.0
72
74
  websocket-client==1.8.0
File without changes
File without changes
File without changes
File without changes