iatoolkit 2.9.1__tar.gz → 2.11.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. {iatoolkit-2.9.1/src/iatoolkit.egg-info → iatoolkit-2.11.0}/PKG-INFO +2 -1
  2. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/requirements.txt +1 -0
  3. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/__init__.py +1 -1
  4. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/common/interfaces/database_provider.py +9 -1
  5. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +1 -1
  6. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +4 -1
  7. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +1 -1
  8. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts_pack.yaml +20 -2
  9. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/locales/en.yaml +3 -0
  10. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/locales/es.yaml +3 -0
  11. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/repositories/database_manager.py +54 -19
  12. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/company_context_service.py +3 -1
  13. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/context_builder_service.py +18 -5
  14. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/prompt_service.py +61 -1
  15. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/sql_service.py +9 -0
  16. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/telemetry_service.py +24 -5
  17. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/llmquery_api_view.py +8 -1
  18. {iatoolkit-2.9.1 → iatoolkit-2.11.0/src/iatoolkit.egg-info}/PKG-INFO +2 -1
  19. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit.egg-info/requires.txt +1 -0
  20. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/LICENSE +0 -0
  21. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/LICENSE_COMMUNITY.md +0 -0
  22. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/pyproject.toml +0 -0
  23. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/readme.md +0 -0
  24. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/setup.cfg +0 -0
  25. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/base_company.py +0 -0
  26. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/cli_commands.py +0 -0
  27. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/common/__init__.py +0 -0
  28. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/common/exceptions.py +0 -0
  29. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  30. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  31. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  32. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  33. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  34. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  35. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  36. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/common/model_registry.py +0 -0
  37. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/common/routes.py +0 -0
  38. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/common/secret_resolver.py +0 -0
  39. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/common/session_manager.py +0 -0
  40. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/common/util.py +0 -0
  41. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/company_registry.py +0 -0
  42. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/__init__.py +0 -0
  43. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  44. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  45. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  46. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  47. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  48. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  49. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  50. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  51. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  52. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  53. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  54. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  55. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  56. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  57. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  58. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  59. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  60. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  61. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/core.py +0 -0
  62. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/__init__.py +0 -0
  63. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  64. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/call_service.py +0 -0
  65. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  66. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  67. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  68. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  69. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  70. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  71. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  72. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
  73. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
  74. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  75. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/inference_handler.py +0 -0
  76. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  77. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  78. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  79. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  80. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  81. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  82. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  83. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  84. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
  85. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/llm_response.py +0 -0
  86. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  87. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/repositories/__init__.py +0 -0
  88. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  89. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/repositories/document_repo.py +0 -0
  90. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  91. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  92. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  93. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/repositories/mcp_personal_access_token_repo.py +0 -0
  94. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
  95. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/repositories/models.py +0 -0
  96. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
  97. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  98. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  99. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  100. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
  101. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/__init__.py +0 -0
  102. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/api_key_service.py +0 -0
  103. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  104. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/auth_service.py +0 -0
  105. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/benchmark_service.py +0 -0
  106. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/branding_service.py +0 -0
  107. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/configuration_service.py +0 -0
  108. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
  109. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/embedding_service.py +0 -0
  110. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/excel_service.py +0 -0
  111. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/file_processor_service.py +0 -0
  112. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/history_manager_service.py +0 -0
  113. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/http_tool_service.py +0 -0
  114. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/i18n_service.py +0 -0
  115. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/inference_service.py +0 -0
  116. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/jwt_service.py +0 -0
  117. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  118. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/language_service.py +0 -0
  119. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/license_service.py +0 -0
  120. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/llm_client_service.py +0 -0
  121. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/mail_service.py +0 -0
  122. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/mcp_personal_access_token_service.py +0 -0
  123. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  124. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
  125. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  126. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/memory_service.py +0 -0
  127. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  128. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  129. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  130. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
  131. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
  132. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  133. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  134. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  135. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  136. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  137. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  138. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  139. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  140. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/parsers/validator.py +0 -0
  141. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/pdf_service.py +0 -0
  142. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/profile_service.py +0 -0
  143. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  144. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/query_service.py +0 -0
  145. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  146. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  147. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/sql_source_service.py +0 -0
  148. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/storage_service.py +0 -0
  149. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/structured_output_service.py +0 -0
  150. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  151. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/system_tools.py +0 -0
  152. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/tool_service.py +0 -0
  153. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
  154. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
  155. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
  156. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
  157. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/warmup_service.py +0 -0
  158. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
  159. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  160. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  161. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  162. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/services/web_search_service.py +0 -0
  163. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  164. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  165. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  166. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  167. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  168. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  169. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  170. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  171. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/js/chat_main.js +0 -0
  172. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  173. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  174. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  175. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  176. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  177. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  178. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  179. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
  180. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/styles/documents.css +0 -0
  181. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
  182. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
  183. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
  184. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/system_prompts/__init__.py +0 -0
  185. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/_company_header.html +0 -0
  186. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/_login_widget.html +0 -0
  187. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/account.html +0 -0
  188. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/base.html +0 -0
  189. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/change_password.html +0 -0
  190. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/chat.html +0 -0
  191. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  192. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/chat_modals.html +0 -0
  193. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/error.html +0 -0
  194. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/forgot_password.html +0 -0
  195. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  196. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  197. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  198. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/pdf/base.html +0 -0
  199. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
  200. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/pdf/report.html +0 -0
  201. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
  202. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/templates/signup.html +0 -0
  203. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/__init__.py +0 -0
  204. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/account_view.py +0 -0
  205. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
  206. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/base_login_view.py +0 -0
  207. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/categories_api_view.py +0 -0
  208. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/change_password_view.py +0 -0
  209. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  210. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/chat_view.py +0 -0
  211. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/configuration_api_view.py +0 -0
  212. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
  213. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
  214. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
  215. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
  216. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/history_api_view.py +0 -0
  217. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/home_view.py +0 -0
  218. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
  219. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
  220. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/login_view.py +0 -0
  221. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/logout_api_view.py +0 -0
  222. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/memory_api_view.py +0 -0
  223. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/profile_api_view.py +0 -0
  224. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
  225. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  226. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  227. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/rag_api_view.py +0 -0
  228. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
  229. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/signup_view.py +0 -0
  230. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/static_page_view.py +0 -0
  231. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/tool_api_view.py +0 -0
  232. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  233. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/users_api_view.py +0 -0
  234. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit/views/verify_user_view.py +0 -0
  235. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
  236. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  237. {iatoolkit-2.9.1 → iatoolkit-2.11.0}/src/iatoolkit.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.9.1
3
+ Version: 2.11.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -57,6 +57,7 @@ Requires-Dist: pgvector==0.3.6
57
57
  Requires-Dist: pillow==11.0.0
58
58
  Requires-Dist: psutil==7.0.0
59
59
  Requires-Dist: psycopg2-binary==2.9.10
60
+ Requires-Dist: PyMySQL==1.1.1
60
61
  Requires-Dist: PyJWT==2.10.1
61
62
  Requires-Dist: PyMuPDF==1.25.0
62
63
  Requires-Dist: python-dotenv==1.0.1
@@ -47,6 +47,7 @@ pgvector==0.3.6
47
47
  pillow==11.0.0
48
48
  psutil==7.0.0
49
49
  psycopg2-binary==2.9.10
50
+ PyMySQL==1.1.1
50
51
  PyJWT==2.10.1
51
52
  PyMuPDF==1.25.0
52
53
  python-dotenv==1.0.1
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # IAToolkit is open source software.
5
5
 
6
- __version__ = "2.9.1"
6
+ __version__ = "2.11.0"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -24,6 +24,14 @@ class DatabaseProvider(abc.ABC):
24
24
  """
25
25
  pass
26
26
 
27
+ @abc.abstractmethod
28
+ def get_dialect(self) -> str:
29
+ """
30
+ Returns the normalized SQL dialect/backend name used by this provider
31
+ (for example: 'postgresql', 'mysql', 'sqlite').
32
+ """
33
+ pass
34
+
27
35
  # --- Execution Methods ---
28
36
  @abc.abstractmethod
29
37
  def execute_query(self, query: str, commit: bool = False) -> Union[List[Dict[str, Any]], Dict[str, int]]:
@@ -40,4 +48,4 @@ class DatabaseProvider(abc.ABC):
40
48
 
41
49
  @abc.abstractmethod
42
50
  def rollback(self) -> None:
43
- pass
51
+ pass
@@ -1,4 +1,4 @@
1
- ### SQL: casting y tipos
1
+ ### SQL PostgreSQL: casting y tipos
2
2
 
3
3
  - Si un numero puede venir con decimales, usa `NUMERIC`, no `INTEGER`.
4
4
  - Para numeros extraidos desde JSONB que pueden venir vacios, usa
@@ -1,9 +1,12 @@
1
1
  ### SQL: reglas base
2
2
 
3
- - Trabaja siempre en PostgreSQL y genera consultas sintacticamente validas.
3
+ - Trabaja siempre con el dialecto SQL indicado para la base seleccionada.
4
+ - Antes de escribir la consulta, revisa el contexto de la base y respeta su marcador
5
+ `dialect=...` (por ejemplo `postgresql` o `mysql`).
4
6
  - Usa solo tablas, columnas y relaciones presentes en el schema provisto.
5
7
  No inventes columnas ni supongas nombres parecidos.
6
8
  - Si la consulta requiere una base especifica, usa `iat_sql_query` con el
7
9
  `database_key` correcto.
8
10
  - Si hay mas de una tabla, subconsulta o CTE, califica las columnas con alias
9
11
  en `SELECT`, `JOIN`, `ON`, `WHERE`, `GROUP BY`, `HAVING` y `ORDER BY`.
12
+ - No mezcles sintaxis de distintos dialectos en la misma consulta.
@@ -1,4 +1,4 @@
1
- ### SQL: columnas JSONB
1
+ ### SQL PostgreSQL: columnas JSONB
2
2
 
3
3
  - Nunca trates una clave JSONB como si fuera una columna fisica.
4
4
  - Usa `jsonb_col->>'campo'` para texto y `jsonb_col->'campo'` para objetos o arrays.
@@ -106,7 +106,7 @@ prompts:
106
106
  - chat
107
107
  - agent
108
108
  all_capabilities:
109
- - can_query_sql
109
+ - can_query_sql_postgres
110
110
  - key: sql_casting
111
111
  filename: sql_casting.prompt
112
112
  section: data_access_rules
@@ -115,7 +115,7 @@ prompts:
115
115
  - chat
116
116
  - agent
117
117
  all_capabilities:
118
- - can_query_sql
118
+ - can_query_sql_postgres
119
119
  - key: sql_aggregation_scope
120
120
  filename: sql_aggregation_scope.prompt
121
121
  section: data_access_rules
@@ -125,3 +125,21 @@ prompts:
125
125
  - agent
126
126
  all_capabilities:
127
127
  - can_query_sql
128
+ - key: sql_mysql_json
129
+ filename: sql_mysql_json.prompt
130
+ section: data_access_rules
131
+ include:
132
+ execution_modes:
133
+ - chat
134
+ - agent
135
+ all_capabilities:
136
+ - can_query_sql_mysql
137
+ - key: sql_mysql_casting
138
+ filename: sql_mysql_casting.prompt
139
+ section: data_access_rules
140
+ include:
141
+ execution_modes:
142
+ - chat
143
+ - agent
144
+ all_capabilities:
145
+ - can_query_sql_mysql
@@ -1322,6 +1322,9 @@ ui:
1322
1322
  reasoning_card_helper: "Applies when the selected model and provider support this reasoning level. Prompts can still override it."
1323
1323
  reasoning_unavailable: "Not available for this model"
1324
1324
  reasoning_unavailable_help: "This model/provider does not support a company-level reasoning default."
1325
+ telemetry_toggle_label: "LLM telemetry"
1326
+ telemetry_card_helper: "When enabled, requests executed through QueryService send LLM runs to the company telemetry backend."
1327
+ telemetry_requires_setup: "Configure llm.telemetry provider, project, and api_key before enabling this switch."
1325
1328
  reasoning_effort_minimal: "Minimal"
1326
1329
  reasoning_effort_low: "Low"
1327
1330
  reasoning_effort_medium: "Medium"
@@ -1326,6 +1326,9 @@ ui:
1326
1326
  reasoning_card_helper: "Se aplica cuando el modelo y el provider seleccionados soportan este nivel de razonamiento. Los prompts igual pueden sobreescribirlo."
1327
1327
  reasoning_unavailable: "No disponible para este modelo"
1328
1328
  reasoning_unavailable_help: "Este modelo o provider no soporta un valor por defecto de razonamiento a nivel company."
1329
+ telemetry_toggle_label: "Telemetría LLM"
1330
+ telemetry_card_helper: "Cuando está habilitada, las requests ejecutadas a través de QueryService envían las ejecuciones LLM al backend de telemetría de la empresa."
1331
+ telemetry_requires_setup: "Configura llm.telemetry con provider, project y api_key antes de habilitar este switch."
1329
1332
  reasoning_effort_minimal: "Minimal"
1330
1333
  reasoning_effort_low: "Bajo"
1331
1334
  reasoning_effort_medium: "Medio"
@@ -37,8 +37,9 @@ class DatabaseManager(DatabaseProvider):
37
37
  database_url = database_url.replace("postgres://", "postgresql://", 1)
38
38
 
39
39
  self.url = make_url(database_url)
40
+ self.backend = self.url.get_backend_name()
40
41
 
41
- if database_url.startswith('sqlite'):
42
+ if self.backend == 'sqlite':
42
43
  raw_engine = create_engine(database_url, echo=False)
43
44
  else:
44
45
  raw_engine = create_engine(
@@ -50,16 +51,10 @@ class DatabaseManager(DatabaseProvider):
50
51
  pool_recycle=1800,
51
52
  pool_pre_ping=True,
52
53
  pool_use_lifo=True,
53
- connect_args={
54
- "keepalives": 1,
55
- "keepalives_idle": 30,
56
- "keepalives_interval": 10,
57
- "keepalives_count": 5,
58
- "connect_timeout": 10,
59
- },
54
+ connect_args=self._build_connect_args(),
60
55
  future=True,
61
56
  )
62
- translated_schema = None if self.url.get_backend_name() == 'sqlite' else self.schema
57
+ translated_schema = self.schema if self._is_postgres() else None
63
58
  self._engine = raw_engine.execution_options(
64
59
  schema_translate_map={ORM_SCHEMA: translated_schema}
65
60
  )
@@ -70,8 +65,7 @@ class DatabaseManager(DatabaseProvider):
70
65
  self.scoped_session = scoped_session(self.SessionFactory)
71
66
 
72
67
  # Register pgvector for each new connection
73
- backend = self.url.get_backend_name()
74
- if backend == 'postgresql' or backend == 'postgres':
68
+ if self._is_postgres():
75
69
  if register_pgvector:
76
70
  event.listen(raw_engine, 'connect', self.on_connect)
77
71
 
@@ -79,6 +73,45 @@ class DatabaseManager(DatabaseProvider):
79
73
  if self.schema:
80
74
  event.listen(raw_engine, 'checkout', self.set_search_path)
81
75
 
76
+ def _is_postgres(self) -> bool:
77
+ return self.backend in ('postgresql', 'postgres')
78
+
79
+ def _is_mysql(self) -> bool:
80
+ return self.backend == 'mysql'
81
+
82
+ def _build_connect_args(self) -> dict:
83
+ if self._is_postgres():
84
+ return {
85
+ "keepalives": 1,
86
+ "keepalives_idle": 30,
87
+ "keepalives_interval": 10,
88
+ "keepalives_count": 5,
89
+ "connect_timeout": 10,
90
+ }
91
+ if self._is_mysql():
92
+ return {
93
+ "connect_timeout": 10,
94
+ }
95
+ return {
96
+ "connect_timeout": 10,
97
+ }
98
+
99
+ def _effective_schema(self) -> str | None:
100
+ if self.backend == 'sqlite':
101
+ return None
102
+
103
+ if self._is_postgres():
104
+ return self.schema
105
+
106
+ if self._is_mysql():
107
+ normalized = str(self.schema or "").strip()
108
+ if normalized and normalized.lower() != "public":
109
+ return normalized
110
+ return self.url.database
111
+
112
+ normalized = str(self.schema or "").strip()
113
+ return normalized or None
114
+
82
115
  def set_search_path(self, dbapi_connection, connection_record, connection_proxy):
83
116
  # Configure the search_path for this connection
84
117
  cursor = dbapi_connection.cursor()
@@ -110,10 +143,12 @@ class DatabaseManager(DatabaseProvider):
110
143
  def get_connection(self):
111
144
  return self._engine.connect()
112
145
 
146
+ def get_dialect(self) -> str:
147
+ return str(self.backend or "").strip().lower()
148
+
113
149
  def create_all(self):
114
150
  # if there is a schema defined, make sure it exists before creating tables
115
- backend = self.url.get_backend_name()
116
- if self.schema and (backend == 'postgresql' or backend == 'postgres'):
151
+ if self.schema and self._is_postgres():
117
152
  with self._engine.begin() as conn:
118
153
  conn.execute(text(f"CREATE SCHEMA IF NOT EXISTS {self.schema}"))
119
154
 
@@ -126,8 +161,7 @@ class DatabaseManager(DatabaseProvider):
126
161
  )
127
162
 
128
163
  def _apply_bootstrap_patches(self) -> list[str]:
129
- backend = self.url.get_backend_name()
130
- if backend not in ('postgresql', 'postgres'):
164
+ if not self._is_postgres():
131
165
  return []
132
166
 
133
167
  applied = []
@@ -154,7 +188,7 @@ class DatabaseManager(DatabaseProvider):
154
188
  Implementation for Direct SQLAlchemy connection.
155
189
  """
156
190
  session = self.get_session()
157
- if self.schema:
191
+ if self._is_postgres() and self.schema:
158
192
  session.execute(text(f"SET search_path TO {self.schema}"))
159
193
 
160
194
  result = session.execute(text(query))
@@ -178,14 +212,15 @@ class DatabaseManager(DatabaseProvider):
178
212
  def get_database_structure(self) -> dict:
179
213
  inspector = inspect(self._engine)
180
214
  structure = {}
181
- for table in inspector.get_table_names(schema=self.schema):
215
+ effective_schema = self._effective_schema()
216
+ for table in inspector.get_table_names(schema=effective_schema):
182
217
  columns_data = []
183
218
 
184
219
  # get columns
185
220
  try:
186
- columns = inspector.get_columns(table, schema=self.schema)
221
+ columns = inspector.get_columns(table, schema=effective_schema)
187
222
  # Obtener PKs para marcarlas
188
- pks = inspector.get_pk_constraint(table, schema=self.schema).get('constrained_columns', [])
223
+ pks = inspector.get_pk_constraint(table, schema=effective_schema).get('constrained_columns', [])
189
224
 
190
225
  for col in columns:
191
226
  columns_data.append({
@@ -128,7 +128,9 @@ class CompanyContextService:
128
128
  continue
129
129
 
130
130
  # 2. Build Header for this Database
131
- db_context = f"### Base SQL (`database_key`): {db_name}\n"
131
+ dialect = self.sql_service.get_database_dialect(company_short_name, db_name)
132
+ dialect_suffix = f" [dialect={dialect}]" if dialect else ""
133
+ db_context = f"### Base SQL (`database_key`): {db_name}{dialect_suffix}\n"
132
134
 
133
135
  # Optional: Add DB description from config if available (useful context)
134
136
  db_desc = source.get('description', '')
@@ -73,7 +73,10 @@ class ContextBuilderService:
73
73
  company_id=company.id,
74
74
  company_short_name=company.short_name,
75
75
  query_text=query_text,
76
- capabilities_override=self._resolve_system_prompt_capabilities(available_tools),
76
+ capabilities_override=self.prompt_service.resolve_system_prompt_capabilities(
77
+ company.short_name,
78
+ self._resolve_system_prompt_capabilities(available_tools),
79
+ ),
77
80
  execution_mode="chat",
78
81
  response_mode="chat_compatible",
79
82
  )
@@ -179,7 +182,10 @@ class ContextBuilderService:
179
182
  company_id=company.id,
180
183
  company_short_name=company.short_name,
181
184
  query_text=query_text,
182
- capabilities_override=self._resolve_system_prompt_capabilities(available_tools),
185
+ capabilities_override=self.prompt_service.resolve_system_prompt_capabilities(
186
+ company.short_name,
187
+ self._resolve_system_prompt_capabilities(available_tools),
188
+ ),
183
189
  execution_mode="chat",
184
190
  response_mode="chat_compatible",
185
191
  )
@@ -282,15 +288,22 @@ class ContextBuilderService:
282
288
  PromptResourceType.RAG_COLLECTION.value,
283
289
  )
284
290
 
285
- capabilities_override = self._resolve_system_prompt_capabilities(enabled_tools)
291
+ prompt_capabilities = self._resolve_system_prompt_capabilities(enabled_tools)
286
292
  if self.SQL_TOOL_NAME in enabled_tool_names and not sql_sources:
287
- capabilities_override.discard("can_query_sql")
293
+ prompt_capabilities.discard("can_query_sql")
294
+ prompt_capabilities.discard("can_query_sql_postgres")
295
+ prompt_capabilities.discard("can_query_sql_mysql")
296
+ prompt_capabilities = self.prompt_service.resolve_system_prompt_capabilities(
297
+ company.short_name,
298
+ prompt_capabilities,
299
+ allowed_sql_databases=sql_sources if self.SQL_TOOL_NAME in enabled_tool_names else None,
300
+ )
288
301
 
289
302
  system_prompt_payload = self.prompt_service.get_system_prompt_payload(
290
303
  company_id=company.id,
291
304
  company_short_name=company.short_name,
292
305
  query_text=query_text,
293
- capabilities_override=capabilities_override,
306
+ capabilities_override=prompt_capabilities,
294
307
  execution_mode="agent",
295
308
  response_mode=str(resolved_contract.get("response_mode") or "chat_compatible").strip().lower() or "chat_compatible",
296
309
  )
@@ -633,14 +633,50 @@ class PromptService:
633
633
  self.llm_query_repo.delete_prompt(prompt_db)
634
634
 
635
635
  def _resolve_system_prompt_capabilities(self, company_short_name: str) -> set[str]:
636
+ return self._resolve_sql_prompt_capabilities(company_short_name)
637
+
638
+ def _resolve_sql_prompt_capabilities(
639
+ self,
640
+ company_short_name: str,
641
+ allowed_sql_databases: list[str] | None = None,
642
+ ) -> set[str]:
636
643
  capabilities: set[str] = set()
637
644
  if not company_short_name:
638
645
  return capabilities
639
646
 
640
647
  try:
641
648
  db_names = self.sql_service.get_db_names(company_short_name)
642
- if isinstance(db_names, list) and db_names:
649
+ if not isinstance(db_names, list):
650
+ return capabilities
651
+
652
+ allowed_database_set = None
653
+ if allowed_sql_databases is not None:
654
+ allowed_database_set = {
655
+ str(item or "").strip()
656
+ for item in allowed_sql_databases
657
+ if str(item or "").strip()
658
+ }
659
+ db_names = [db_name for db_name in db_names if db_name in allowed_database_set]
660
+
661
+ if db_names:
643
662
  capabilities.add("can_query_sql")
663
+
664
+ dialects: set[str] = set()
665
+ for db_name in db_names:
666
+ try:
667
+ dialect = self.sql_service.get_database_dialect(company_short_name, db_name)
668
+ except Exception:
669
+ continue
670
+ normalized = str(dialect or "").strip().lower()
671
+ if normalized:
672
+ dialects.add(normalized)
673
+
674
+ if len(dialects) == 1:
675
+ only_dialect = next(iter(dialects))
676
+ if only_dialect in {"postgresql", "postgres"}:
677
+ capabilities.add("can_query_sql_postgres")
678
+ elif only_dialect == "mysql":
679
+ capabilities.add("can_query_sql_mysql")
644
680
  except Exception as e:
645
681
  logging.debug(
646
682
  "Could not resolve SQL capabilities for company '%s': %s",
@@ -650,6 +686,30 @@ class PromptService:
650
686
 
651
687
  return capabilities
652
688
 
689
+ def resolve_system_prompt_capabilities(
690
+ self,
691
+ company_short_name: str,
692
+ base_capabilities: set[str] | list[str] | tuple[str, ...] | None = None,
693
+ allowed_sql_databases: list[str] | None = None,
694
+ ) -> set[str]:
695
+ capabilities = {
696
+ str(item or "").strip()
697
+ for item in (base_capabilities or set())
698
+ if str(item or "").strip()
699
+ }
700
+ sql_capabilities = self._resolve_sql_prompt_capabilities(
701
+ company_short_name,
702
+ allowed_sql_databases=allowed_sql_databases,
703
+ )
704
+
705
+ if "can_query_sql" in capabilities:
706
+ capabilities.update(sql_capabilities)
707
+ else:
708
+ capabilities.discard("can_query_sql_postgres")
709
+ capabilities.discard("can_query_sql_mysql")
710
+
711
+ return capabilities
712
+
653
713
  def get_system_prompt_payload(
654
714
  self,
655
715
  company_id: int,
@@ -102,6 +102,15 @@ class SqlService:
102
102
  """
103
103
  return [db for (co, db) in self._db_connections.keys() if co == company_short_name]
104
104
 
105
+ def get_database_dialect(self, company_short_name: str, db_name: str) -> str:
106
+ provider = self.get_database_provider(company_short_name, db_name)
107
+ dialect = getattr(provider, "get_dialect", None)
108
+ if callable(dialect):
109
+ value = dialect()
110
+ if isinstance(value, str):
111
+ return value.strip().lower()
112
+ return ""
113
+
105
114
  def get_database_provider(self, company_short_name: str, db_name: str) -> DatabaseProvider:
106
115
  """
107
116
  Retrieves a registered DatabaseProvider instance using the composite key.
@@ -310,15 +310,32 @@ class TelemetryService:
310
310
  execution_metadata: dict | None = None,
311
311
  request_metadata: dict | None = None,
312
312
  ) -> dict[str, Any]:
313
+ telemetry_config = self.configuration_service.get_llm_telemetry_config(company_short_name) or {}
314
+ company_telemetry_enabled = bool(telemetry_config.get("enabled"))
313
315
  prompt_options = dict((prompt_output_contract or {}).get("llm_request_options") or {})
314
- if prompt_options.get("telemetry_enabled") is not True:
316
+ prompt_telemetry_requested = prompt_options.get("telemetry_enabled") is True
317
+ request_source = str((execution_metadata or {}).get("request_source") or "").strip().lower()
318
+ chat_request = request_source == "chat_ui"
319
+
320
+ telemetry_requested = company_telemetry_enabled or prompt_telemetry_requested
321
+ if not telemetry_requested:
315
322
  return {}
316
323
 
317
- telemetry_config = self.configuration_service.get_llm_telemetry_config(company_short_name) or {}
318
324
  provider_name = str(telemetry_config.get("provider") or "").strip().lower()
319
- enabled = bool(telemetry_config.get("enabled"))
325
+ enabled = company_telemetry_enabled
320
326
  prompt_name = str((prompt_output_contract or {}).get("prompt_name") or "").strip()
321
327
  execution_mode = str((prompt_output_contract or {}).get("execution_mode") or "").strip().lower() or None
328
+ if chat_request and not execution_mode:
329
+ execution_mode = "chat"
330
+
331
+ agent_name = prompt_name or ("chat" if chat_request else None)
332
+ execution_name = prompt_name or ("iatoolkit.chat" if chat_request else "iatoolkit.llm_execution")
333
+ if chat_request:
334
+ telemetry_scope = "chat"
335
+ elif prompt_name:
336
+ telemetry_scope = "prompt"
337
+ else:
338
+ telemetry_scope = "query_service"
322
339
  request: dict[str, Any] = {
323
340
  "requested": True,
324
341
  "record_stats": True,
@@ -326,14 +343,16 @@ class TelemetryService:
326
343
  "provider": provider_name or None,
327
344
  "metadata": {
328
345
  "company": str(company_short_name or "").strip() or None,
329
- "agent_name": prompt_name or None,
346
+ "agent_name": agent_name,
330
347
  "provider": provider,
331
348
  "model": model,
332
349
  "task_id": task_id,
333
350
  "user_identifier": user_identifier,
334
351
  "execution_mode": execution_mode,
352
+ "request_source": request_source or None,
353
+ "telemetry_scope": telemetry_scope,
335
354
  },
336
- "execution_name": prompt_name or "iatoolkit.llm_execution",
355
+ "execution_name": execution_name,
337
356
  }
338
357
 
339
358
  if isinstance(request_metadata, dict):
@@ -37,6 +37,13 @@ class LLMQueryApiView(MethodView):
37
37
  if not data:
38
38
  return jsonify({"error": "Invalid JSON body"}), 400
39
39
 
40
+ client_data = data.get('client_data') or {}
41
+ if not isinstance(client_data, dict):
42
+ client_data = {}
43
+ else:
44
+ client_data = dict(client_data)
45
+ client_data.setdefault("source", "chat_ui")
46
+
40
47
  # 4. Call the unified query service method.
41
48
  result = self.query_service.llm_query(
42
49
  company_short_name=company_short_name,
@@ -47,7 +54,7 @@ class LLMQueryApiView(MethodView):
47
54
  },
48
55
  question=data.get('question', ''),
49
56
  prompt_name=data.get('prompt_name'),
50
- client_data=data.get('client_data', {}),
57
+ client_data=client_data,
51
58
  ignore_history=data.get('ignore_history', False),
52
59
  files=data.get('files', [])
53
60
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 2.9.1
3
+ Version: 2.11.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -57,6 +57,7 @@ Requires-Dist: pgvector==0.3.6
57
57
  Requires-Dist: pillow==11.0.0
58
58
  Requires-Dist: psutil==7.0.0
59
59
  Requires-Dist: psycopg2-binary==2.9.10
60
+ Requires-Dist: PyMySQL==1.1.1
60
61
  Requires-Dist: PyJWT==2.10.1
61
62
  Requires-Dist: PyMuPDF==1.25.0
62
63
  Requires-Dist: python-dotenv==1.0.1
@@ -47,6 +47,7 @@ pgvector==0.3.6
47
47
  pillow==11.0.0
48
48
  psutil==7.0.0
49
49
  psycopg2-binary==2.9.10
50
+ PyMySQL==1.1.1
50
51
  PyJWT==2.10.1
51
52
  PyMuPDF==1.25.0
52
53
  python-dotenv==1.0.1
File without changes
File without changes
File without changes
File without changes