iatoolkit 2.14.0__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 (244) hide show
  1. {iatoolkit-2.14.0/src/iatoolkit.egg-info → iatoolkit-2.14.2}/PKG-INFO +7 -5
  2. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/requirements.txt +6 -4
  3. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/__init__.py +1 -1
  4. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/util.py +10 -5
  5. iatoolkit-2.14.2/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +7 -0
  6. iatoolkit-2.14.2/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +7 -0
  7. iatoolkit-2.14.2/src/iatoolkit/config/system_prompts/channel_response_style.prompt +7 -0
  8. iatoolkit-2.14.2/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +9 -0
  9. iatoolkit-2.14.2/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +12 -0
  10. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts_pack.yaml +44 -0
  11. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/database_manager.py +80 -6
  12. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/context_builder_service.py +13 -1
  13. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/prompt_service.py +6 -0
  14. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/sql_service.py +28 -1
  15. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/sql_source_service.py +65 -34
  16. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/system_prompt_catalog.py +30 -2
  17. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/telemetry_service.py +2 -2
  18. {iatoolkit-2.14.0 → iatoolkit-2.14.2/src/iatoolkit.egg-info}/PKG-INFO +7 -5
  19. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit.egg-info/SOURCES.txt +5 -1
  20. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit.egg-info/requires.txt +6 -4
  21. iatoolkit-2.14.0/src/iatoolkit/system_prompts/__init__.py +0 -0
  22. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/LICENSE +0 -0
  23. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/LICENSE_COMMUNITY.md +0 -0
  24. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/pyproject.toml +0 -0
  25. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/readme.md +0 -0
  26. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/setup.cfg +0 -0
  27. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/base_company.py +0 -0
  28. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/cli_commands.py +0 -0
  29. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/__init__.py +0 -0
  30. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/exceptions.py +0 -0
  31. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  32. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  33. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  34. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  35. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  36. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  37. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  38. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  39. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/model_registry.py +0 -0
  40. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/routes.py +0 -0
  41. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/secret_resolver.py +0 -0
  42. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/common/session_manager.py +0 -0
  43. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/company_registry.py +0 -0
  44. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/__init__.py +0 -0
  45. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  46. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  47. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  48. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  49. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  50. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  51. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  52. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  53. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  54. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  55. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  56. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  57. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  58. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  59. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  60. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  61. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  62. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  63. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  64. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  65. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  66. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  67. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  68. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/core.py +0 -0
  69. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/__init__.py +0 -0
  70. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  71. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/call_service.py +0 -0
  72. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  73. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  74. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  75. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  76. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  77. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  78. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  79. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/google_auth_client.py +0 -0
  80. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/google_chat_app.py +0 -0
  81. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  82. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/inference_handler.py +0 -0
  83. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  84. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  85. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  86. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  87. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  88. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  89. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  90. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  91. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_proxy.py +0 -0
  92. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/llm_response.py +0 -0
  93. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  94. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/locales/en.yaml +0 -0
  95. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/locales/es.yaml +0 -0
  96. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/__init__.py +0 -0
  97. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  98. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/document_repo.py +0 -0
  99. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  100. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  101. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  102. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/mcp_personal_access_token_repo.py +0 -0
  103. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/memory_repo.py +0 -0
  104. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/models.py +0 -0
  105. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/profile_repo.py +0 -0
  106. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  107. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  108. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  109. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/repositories/vs_repo.py +0 -0
  110. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/__init__.py +0 -0
  111. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/api_key_service.py +0 -0
  112. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  113. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/auth_service.py +0 -0
  114. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/benchmark_service.py +0 -0
  115. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/branding_service.py +0 -0
  116. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/company_context_service.py +0 -0
  117. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/configuration_service.py +0 -0
  118. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/dispatcher_service.py +0 -0
  119. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/embedding_service.py +0 -0
  120. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/excel_service.py +0 -0
  121. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/file_processor_service.py +0 -0
  122. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/history_manager_service.py +0 -0
  123. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/http_tool_service.py +0 -0
  124. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/i18n_service.py +0 -0
  125. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/inference_service.py +0 -0
  126. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/jwt_service.py +0 -0
  127. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  128. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/language_service.py +0 -0
  129. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/license_service.py +0 -0
  130. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/llm_client_service.py +0 -0
  131. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/mail_service.py +0 -0
  132. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/mcp_personal_access_token_service.py +0 -0
  133. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  134. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/memory_lint_service.py +0 -0
  135. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  136. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/memory_service.py +0 -0
  137. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  138. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  139. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  140. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/__init__.py +0 -0
  141. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/contracts.py +0 -0
  142. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  143. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  144. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  145. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  146. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  147. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  148. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  149. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  150. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/parsers/validator.py +0 -0
  151. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/pdf_service.py +0 -0
  152. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/profile_service.py +0 -0
  153. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  154. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/query_service.py +0 -0
  155. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  156. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  157. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/storage_service.py +0 -0
  158. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/structured_output_service.py +0 -0
  159. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/system_tools.py +0 -0
  160. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/tool_service.py +0 -0
  161. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/user_feedback_service.py +0 -0
  162. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/user_session_context_service.py +0 -0
  163. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/visual_kb_service.py +0 -0
  164. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/visual_tool_service.py +0 -0
  165. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/warmup_service.py +0 -0
  166. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/web_search/__init__.py +0 -0
  167. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  168. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  169. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  170. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/services/web_search_service.py +0 -0
  171. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  172. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  173. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  174. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  175. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  176. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  177. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  178. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  179. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_main.js +0 -0
  180. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  181. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  182. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  183. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  184. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  185. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  186. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  187. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/chat_public.css +0 -0
  188. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/documents.css +0 -0
  189. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/landing_page.css +0 -0
  190. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/llm_output.css +0 -0
  191. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/static/styles/onboarding.css +0 -0
  192. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/_company_header.html +0 -0
  193. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/_login_widget.html +0 -0
  194. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/account.html +0 -0
  195. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/base.html +0 -0
  196. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/change_password.html +0 -0
  197. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/chat.html +0 -0
  198. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  199. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/chat_modals.html +0 -0
  200. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/error.html +0 -0
  201. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/forgot_password.html +0 -0
  202. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  203. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  204. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  205. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/pdf/base.html +0 -0
  206. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/pdf/letter.html +0 -0
  207. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/pdf/report.html +0 -0
  208. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/pdf/simple.html +0 -0
  209. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/templates/signup.html +0 -0
  210. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/__init__.py +0 -0
  211. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/account_view.py +0 -0
  212. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/api_key_api_view.py +0 -0
  213. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/base_login_view.py +0 -0
  214. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/categories_api_view.py +0 -0
  215. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/change_password_view.py +0 -0
  216. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  217. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/chat_view.py +0 -0
  218. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/configuration_api_view.py +0 -0
  219. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/connectors_api_view.py +0 -0
  220. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/embedding_api_view.py +0 -0
  221. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/forgot_password_view.py +0 -0
  222. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/help_content_api_view.py +0 -0
  223. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/history_api_view.py +0 -0
  224. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/home_view.py +0 -0
  225. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/init_context_api_view.py +0 -0
  226. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  227. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/load_document_api_view.py +0 -0
  228. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/login_view.py +0 -0
  229. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/logout_api_view.py +0 -0
  230. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/memory_api_view.py +0 -0
  231. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/profile_api_view.py +0 -0
  232. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/prompt_api_view.py +0 -0
  233. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  234. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  235. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/rag_api_view.py +0 -0
  236. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/root_redirect_view.py +0 -0
  237. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/signup_view.py +0 -0
  238. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/static_page_view.py +0 -0
  239. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/tool_api_view.py +0 -0
  240. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  241. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/users_api_view.py +0 -0
  242. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit/views/verify_user_view.py +0 -0
  243. {iatoolkit-2.14.0 → iatoolkit-2.14.2}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  244. {iatoolkit-2.14.0 → 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.0
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.0"
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,7 @@
1
+ ### Identidad comercial del canal
2
+
3
+ - Estas conversando con un cliente externo a nombre de {{ company }}.
4
+ - Si el cliente pregunta de que empresa eres, quien le escribe o de parte de quien hablas,
5
+ responde usando el nombre de la empresa: {{ company }}.
6
+ - Presentate como asistente o representante de {{ company }}, no como un sistema generico sin afiliacion.
7
+ - Si el cliente pregunta por el motivo del contacto, explica el proposito comercial o operativo con claridad usando el contexto disponible.
@@ -0,0 +1,7 @@
1
+ ### Continuidad conversacional del canal
2
+
3
+ - Si estas respondiendo en un canal conversacional como WhatsApp, asume continuidad con los mensajes previos del mismo hilo.
4
+ - No digas que esta es la primera interaccion ni que no tienes contexto previo si ya existe un intercambio en la conversacion.
5
+ - Si el cliente confirma un dato solicitado por la empresa, reconocelo explicitamente y continua desde ese punto.
6
+ - No vuelvas a pedir un dato que el cliente acaba de confirmar, salvo que haga falta aclararlo o corregirlo.
7
+ - Cuando el cliente haga una pregunta sobre el mensaje anterior, interpretala como continuidad del contacto ya iniciado por la empresa.
@@ -0,0 +1,7 @@
1
+ ### Estilo de respuesta en canal
2
+
3
+ - En canales como WhatsApp, responde de forma breve, natural y util.
4
+ - Prioriza una respuesta directa antes que una explicacion larga.
5
+ - Si necesitas hacer seguimiento, formula una sola pregunta clara por turno.
6
+ - Evita listas extensas o bloques largos salvo que el usuario lo pida o el caso realmente lo requiera.
7
+ - Manten un tono cercano, profesional y orientado a resolver la necesidad del cliente.
@@ -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.
@@ -19,6 +19,14 @@ prompts:
19
19
  include:
20
20
  execution_modes:
21
21
  - chat
22
+ - key: channel_business_identity
23
+ filename: channel_business_identity.prompt
24
+ section: business_context
25
+ include:
26
+ execution_modes:
27
+ - agent
28
+ agent_roles:
29
+ - channels
22
30
  - key: links_documents
23
31
  filename: links_documents.prompt
24
32
  section: conversation_rules
@@ -26,6 +34,14 @@ prompts:
26
34
  execution_modes:
27
35
  - chat
28
36
  - agent
37
+ - key: channel_conversation_continuity
38
+ filename: channel_conversation_continuity.prompt
39
+ section: conversation_rules
40
+ include:
41
+ execution_modes:
42
+ - agent
43
+ agent_roles:
44
+ - channels
29
45
  - key: memory_usage
30
46
  filename: memory_usage.prompt
31
47
  section: conversation_rules
@@ -49,6 +65,16 @@ prompts:
49
65
  - agent
50
66
  response_modes:
51
67
  - chat_compatible
68
+ - key: channel_response_style
69
+ filename: channel_response_style.prompt
70
+ section: output_contract
71
+ include:
72
+ execution_modes:
73
+ - agent
74
+ agent_roles:
75
+ - channels
76
+ response_modes:
77
+ - chat_compatible
52
78
  - key: presentation_formatting
53
79
  filename: presentation_formatting.prompt
54
80
  section: output_contract
@@ -125,6 +151,24 @@ prompts:
125
151
  - agent
126
152
  all_capabilities:
127
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
128
172
  - key: sql_mysql_json
129
173
  filename: sql_mysql_json.prompt
130
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:
@@ -207,6 +207,7 @@ class ContextBuilderService:
207
207
 
208
208
  final_system_context = self._join_context_sections(
209
209
  rendered_sections.get("identity"),
210
+ rendered_sections.get("business_context"),
210
211
  company_context_blocks.get("markdown_context"),
211
212
  rendered_sections.get("conversation_rules"),
212
213
  rendered_sections.get("retrieval_guidance"),
@@ -294,6 +295,7 @@ class ContextBuilderService:
294
295
  if self.SQL_TOOL_NAME in enabled_tool_names and not sql_sources:
295
296
  prompt_capabilities.discard("can_query_sql")
296
297
  prompt_capabilities.discard("can_query_sql_postgres")
298
+ prompt_capabilities.discard("can_query_sql_redshift")
297
299
  prompt_capabilities.discard("can_query_sql_mysql")
298
300
  prompt_capabilities = self.prompt_service.resolve_system_prompt_capabilities(
299
301
  company.short_name,
@@ -308,6 +310,7 @@ class ContextBuilderService:
308
310
  capabilities_override=prompt_capabilities,
309
311
  execution_mode="agent",
310
312
  response_mode=str(resolved_contract.get("response_mode") or "chat_compatible").strip().lower() or "chat_compatible",
313
+ agent_role=str(resolved_contract.get("agent_role") or "").strip().lower() or None,
311
314
  )
312
315
  selected_system_prompt_keys = system_prompt_payload.get("selected_keys")
313
316
  if not isinstance(selected_system_prompt_keys, list):
@@ -334,9 +337,9 @@ class ContextBuilderService:
334
337
  )
335
338
 
336
339
  company_context_blocks = self.company_context_service.get_company_context_blocks(company_short_name)
337
-
338
340
  final_system_context = self._join_context_sections(
339
341
  rendered_sections.get("identity"),
342
+ rendered_sections.get("business_context"),
340
343
  company_context_blocks.get("markdown_context"),
341
344
  rendered_sections.get("conversation_rules"),
342
345
  rendered_sections.get("retrieval_guidance"),
@@ -467,6 +470,15 @@ class ContextBuilderService:
467
470
 
468
471
  final_client_data = (user_profile or {}).copy()
469
472
  final_client_data.update(client_data)
473
+ if company is not None:
474
+ company_name = str(getattr(company, "name", "") or "").strip()
475
+ company_short_name = str(getattr(company, "short_name", "") or "").strip()
476
+ if company_name and not str(final_client_data.get("company_name") or "").strip():
477
+ final_client_data["company_name"] = company_name
478
+ if company_name and not str(final_client_data.get("company") or "").strip():
479
+ final_client_data["company"] = company_name
480
+ if company_short_name and not str(final_client_data.get("company_short_name") or "").strip():
481
+ final_client_data["company_short_name"] = company_short_name
470
482
 
471
483
  # Process attached files: extract text content and separate images
472
484
  files_context, images = self._process_attachments(files)
@@ -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
@@ -772,6 +775,7 @@ class PromptService:
772
775
  capabilities_override: set[str] | None = None,
773
776
  execution_mode: str | None = None,
774
777
  response_mode: str | None = None,
778
+ agent_role: str | None = None,
775
779
  ) -> dict:
776
780
  try:
777
781
  resolved_short_name = (company_short_name or "").strip()
@@ -796,11 +800,13 @@ class PromptService:
796
800
  normalized_response_mode = (
797
801
  str(response_mode or "chat_compatible").strip().lower() or "chat_compatible"
798
802
  )
803
+ normalized_agent_role = str(agent_role or "").strip().lower() or None
799
804
  payload = build_system_prompt_payload(
800
805
  capabilities,
801
806
  query_text=query_text,
802
807
  execution_mode=normalized_execution_mode,
803
808
  response_mode=normalized_response_mode,
809
+ agent_role=normalized_agent_role,
804
810
  )
805
811
  selected_keys = payload.get("selected_keys")
806
812
  if not isinstance(selected_keys, list):
@@ -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