iatoolkit 2.40.0__tar.gz → 2.41.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 (251) hide show
  1. {iatoolkit-2.40.0/src/iatoolkit.egg-info → iatoolkit-2.41.0}/PKG-INFO +1 -1
  2. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/__init__.py +1 -1
  3. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/common/model_registry.py +20 -0
  4. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/common/routes.py +3 -1
  5. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/llm_proxy.py +57 -4
  6. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/locales/en.yaml +52 -5
  7. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/locales/es.yaml +52 -5
  8. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/database_manager.py +33 -0
  9. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/knowledge_wiki_repo.py +7 -0
  10. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/models.py +242 -0
  11. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/dispatcher_service.py +10 -1
  12. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/tenant_wiki_service.py +460 -6
  13. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/tool_service.py +7 -0
  14. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/configuration_api_view.py +45 -39
  15. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/login_view.py +11 -1
  16. {iatoolkit-2.40.0 → iatoolkit-2.41.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  17. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/LICENSE +0 -0
  18. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/LICENSE_COMMUNITY.md +0 -0
  19. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/pyproject.toml +0 -0
  20. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/readme.md +0 -0
  21. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/requirements.txt +0 -0
  22. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/setup.cfg +0 -0
  23. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/base_company.py +0 -0
  24. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/cli_commands.py +0 -0
  25. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/common/__init__.py +0 -0
  26. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/common/bridge_validation.py +0 -0
  27. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/common/exceptions.py +0 -0
  28. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  29. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  30. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/common/interfaces/database_provider.py +0 -0
  31. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/common/interfaces/memory_compilation_trigger.py +0 -0
  32. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/common/interfaces/memory_lint_trigger.py +0 -0
  33. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/common/interfaces/secret_provider.py +0 -0
  34. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/common/interfaces/signup_policy_resolver.py +0 -0
  35. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/common/interfaces/web_search_provider.py +0 -0
  36. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/common/secret_resolver.py +0 -0
  37. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/common/session_manager.py +0 -0
  38. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/common/util.py +0 -0
  39. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/company_registry.py +0 -0
  40. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/__init__.py +0 -0
  41. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/llm_capabilities.yaml +0 -0
  42. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/channel_business_identity.prompt +0 -0
  43. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/channel_conversation_continuity.prompt +0 -0
  44. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/channel_response_style.prompt +0 -0
  45. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/chat_state_rules.prompt +0 -0
  46. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/chat_user_profile.prompt +0 -0
  47. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/core_identity.prompt +0 -0
  48. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/email_output.prompt +0 -0
  49. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/file_download_output.prompt +0 -0
  50. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/format_styles.prompt +0 -0
  51. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/html_structures.prompt +0 -0
  52. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/links_documents.prompt +0 -0
  53. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/memory_usage.prompt +0 -0
  54. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/multimodal_basics.prompt +0 -0
  55. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/output_basics.prompt +0 -0
  56. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/presentation_formatting.prompt +0 -0
  57. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/query_main.prompt +0 -0
  58. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/sql_aggregation_scope.prompt +0 -0
  59. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/sql_casting.prompt +0 -0
  60. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/sql_core.prompt +0 -0
  61. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/sql_jsonb.prompt +0 -0
  62. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/sql_mysql_casting.prompt +0 -0
  63. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/sql_mysql_json.prompt +0 -0
  64. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/sql_redshift_basics.prompt +0 -0
  65. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/sql_redshift_types.prompt +0 -0
  66. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/sql_rules.prompt +0 -0
  67. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts/tool_html_passthrough.prompt +0 -0
  68. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_prompts_pack.yaml +0 -0
  69. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/config/system_tools_pack.yaml +0 -0
  70. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/core.py +0 -0
  71. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/__init__.py +0 -0
  72. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  73. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/call_service.py +0 -0
  74. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  75. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  76. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  77. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  78. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  79. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  80. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  81. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/google_auth_client.py +0 -0
  82. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
  83. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/inference_embeddings_client.py +0 -0
  84. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/inference_handler.py +0 -0
  85. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/jina_embeddings_client.py +0 -0
  86. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/llm_gateway_resolver.py +0 -0
  87. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  88. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/llm_providers/anthropic_adapter.py +0 -0
  89. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  90. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  91. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  92. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/llm_providers/openai_compatible_chat_adapter.py +0 -0
  93. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/llm_providers/openrouter_adapter.py +0 -0
  94. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/llm_response.py +0 -0
  95. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  96. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/__init__.py +0 -0
  97. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/api_key_repo.py +0 -0
  98. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/bridge_repo.py +0 -0
  99. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/document_repo.py +0 -0
  100. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/env_secret_provider.py +0 -0
  101. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  102. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  103. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/mcp_token_repo.py +0 -0
  104. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/memory_repo.py +0 -0
  105. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
  106. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/prompt_resource_repo.py +0 -0
  107. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/sql_dataset_repo.py +0 -0
  108. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/sql_source_repo.py +0 -0
  109. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
  110. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/runtime_logging.py +0 -0
  111. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/__init__.py +0 -0
  112. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/api_key_service.py +0 -0
  113. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/attachment_policy_service.py +0 -0
  114. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/auth_service.py +0 -0
  115. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/benchmark_service.py +0 -0
  116. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/branding_service.py +0 -0
  117. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/company_context_service.py +0 -0
  118. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/configuration_service.py +0 -0
  119. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/context_builder_service.py +0 -0
  120. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/embedding_service.py +0 -0
  121. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/excel_service.py +0 -0
  122. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/file_processor_service.py +0 -0
  123. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/history_manager_service.py +0 -0
  124. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/http_tool_service.py +0 -0
  125. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/i18n_service.py +0 -0
  126. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/inference_service.py +0 -0
  127. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/jwt_service.py +0 -0
  128. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/knowledge_base_service.py +0 -0
  129. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/language_service.py +0 -0
  130. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/license_service.py +0 -0
  131. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/llm_client_service.py +0 -0
  132. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/mail_service.py +0 -0
  133. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/markdown_wiki_service.py +0 -0
  134. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/mcp_token_service.py +0 -0
  135. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/memory_compiler_service.py +0 -0
  136. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/memory_lint_service.py +0 -0
  137. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/memory_lookup_policy_service.py +0 -0
  138. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/memory_service.py +0 -0
  139. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/memory_wiki_service.py +0 -0
  140. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/noop_memory_compilation_trigger.py +0 -0
  141. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/noop_memory_lint_trigger.py +0 -0
  142. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/parsers/__init__.py +0 -0
  143. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/parsers/contracts.py +0 -0
  144. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/parsers/image_normalizer.py +0 -0
  145. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/parsers/parsing_service.py +0 -0
  146. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/parsers/pdf_ocr_detection.py +0 -0
  147. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/parsers/provider_factory.py +0 -0
  148. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/parsers/provider_resolver.py +0 -0
  149. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/parsers/providers/__init__.py +0 -0
  150. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/parsers/providers/basic_provider.py +0 -0
  151. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/parsers/providers/docling_provider.py +0 -0
  152. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/parsers/validator.py +0 -0
  153. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/pdf_service.py +0 -0
  154. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/profile_service.py +0 -0
  155. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/prompt_resource_service.py +0 -0
  156. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/prompt_service.py +0 -0
  157. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/query_service.py +0 -0
  158. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/signup_policy_resolver.py +0 -0
  159. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/sql_dataset_service.py +0 -0
  160. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/sql_service.py +0 -0
  161. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/sql_source_service.py +0 -0
  162. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/storage_service.py +0 -0
  163. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/structured_output_service.py +0 -0
  164. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/system_prompt_catalog.py +0 -0
  165. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/system_tools.py +0 -0
  166. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/telemetry_service.py +0 -0
  167. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/tool_output_contract.py +0 -0
  168. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
  169. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
  170. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/visual_kb_service.py +0 -0
  171. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/visual_tool_service.py +0 -0
  172. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/warmup_service.py +0 -0
  173. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/web_search/__init__.py +0 -0
  174. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/web_search/provider_factory.py +0 -0
  175. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/web_search/providers/__init__.py +0 -0
  176. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/web_search/providers/brave_provider.py +0 -0
  177. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/services/web_search_service.py +0 -0
  178. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  179. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  180. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  181. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  182. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  183. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  184. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  185. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  186. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/js/chat_main.js +0 -0
  187. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/js/chat_memory_button.js +0 -0
  188. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  189. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  190. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  191. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  192. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  193. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  194. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
  195. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/styles/documents.css +0 -0
  196. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
  197. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
  198. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
  199. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/_company_header.html +0 -0
  200. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/_login_widget.html +0 -0
  201. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/account.html +0 -0
  202. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/base.html +0 -0
  203. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/change_password.html +0 -0
  204. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/chat.html +0 -0
  205. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/chat_memory_modal.html +0 -0
  206. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/chat_modals.html +0 -0
  207. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/error.html +0 -0
  208. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/forgot_password.html +0 -0
  209. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/home_hosted_default.html +0 -0
  210. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/memory/wiki_schema.md +0 -0
  211. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  212. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/pdf/base.html +0 -0
  213. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/pdf/letter.html +0 -0
  214. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/pdf/report.html +0 -0
  215. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/pdf/simple.html +0 -0
  216. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/templates/signup.html +0 -0
  217. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/__init__.py +0 -0
  218. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/account_view.py +0 -0
  219. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/api_key_api_view.py +0 -0
  220. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/base_login_view.py +0 -0
  221. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/categories_api_view.py +0 -0
  222. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/change_password_view.py +0 -0
  223. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/chat_context_preview_api_view.py +0 -0
  224. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/chat_view.py +0 -0
  225. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/connectors_api_view.py +0 -0
  226. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
  227. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
  228. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
  229. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/history_api_view.py +0 -0
  230. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/home_view.py +0 -0
  231. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
  232. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  233. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/load_document_api_view.py +0 -0
  234. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/logout_api_view.py +0 -0
  235. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/memory_api_view.py +0 -0
  236. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/profile_api_view.py +0 -0
  237. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/prompt_api_view.py +0 -0
  238. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/prompt_context_preview_api_view.py +0 -0
  239. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/prompt_resource_api_view.py +0 -0
  240. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/rag_api_view.py +0 -0
  241. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
  242. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/signup_view.py +0 -0
  243. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/static_page_view.py +0 -0
  244. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/tool_api_view.py +0 -0
  245. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  246. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/users_api_view.py +0 -0
  247. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit/views/verify_user_view.py +0 -0
  248. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit.egg-info/SOURCES.txt +0 -0
  249. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  250. {iatoolkit-2.40.0 → iatoolkit-2.41.0}/src/iatoolkit.egg-info/requires.txt +0 -0
  251. {iatoolkit-2.40.0 → iatoolkit-2.41.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.40.0
3
+ Version: 2.41.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # IAToolkit is open source software.
5
5
 
6
- __version__ = "2.40.0"
6
+ __version__ = "2.41.0"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -26,6 +26,26 @@ class ModelMetadata:
26
26
  history_type: HistoryType
27
27
 
28
28
 
29
+ #: Providers a model can actually be served by: the ones `LLMProxy._build_adapter`
30
+ #: knows how to build. Deliberately narrower than `ProviderType`, which also
31
+ #: contains `xai` — `normalize_provider` accepts it and a client is built for it,
32
+ #: but there is no xAI adapter, so a model declared `xai` raises "Provider not
33
+ #: supported" on its first request. A test pins this tuple to the adapters that
34
+ #: exist so the two cannot drift.
35
+ #:
36
+ #: Anything that lets a person choose a provider must offer exactly these: the
37
+ #: value reaches `_build_adapter` verbatim, so a typo becomes a runtime failure in
38
+ #: front of an end user, hours after it was saved.
39
+ SERVABLE_PROVIDERS: tuple[str, ...] = (
40
+ "openai",
41
+ "anthropic",
42
+ "gemini",
43
+ "deepseek",
44
+ "openrouter",
45
+ "openai_compatible",
46
+ )
47
+
48
+
29
49
  @singleton
30
50
  class ModelRegistry:
31
51
  """
@@ -253,9 +253,11 @@ def register_views(app):
253
253
 
254
254
  # company configuration
255
255
  configuration_view = ConfigurationApiView.as_view('configuration')
256
+ # No POST: adding an arbitrary new key had no caller in any frontend, and
257
+ # the write path is deliberately narrow — see TENANT_WRITABLE_CONFIG_KEYS.
256
258
  app.add_url_rule('/<company_short_name>/api/configuration',
257
259
  view_func=configuration_view,
258
- methods=['GET', 'POST', 'PATCH'],)
260
+ methods=['GET', 'PATCH'],)
259
261
 
260
262
  # explicit runtime reload endpoint used by admin/dashboard integrations
261
263
  app.add_url_rule('/<company_short_name>/api/load_configuration',
@@ -118,6 +118,7 @@ class LLMProxy:
118
118
  provider=provider,
119
119
  company_short_name=company_short_name,
120
120
  telemetry_request=telemetry_request,
121
+ model_config=model_config,
121
122
  )
122
123
 
123
124
  request_kwargs = self._apply_provider_request_overrides(
@@ -202,12 +203,20 @@ class LLMProxy:
202
203
  provider: str,
203
204
  company_short_name: str,
204
205
  telemetry_request: Dict[str, Any] | None = None,
206
+ model_config: Dict[str, Any] | None = None,
205
207
  ) -> Any:
206
208
  """
207
209
  Return an adapter instance for the given provider.
208
210
  If none exists yet, create it using a cached or new low-level client.
211
+
212
+ ``model_config`` is threaded through because whose key pays is decided
213
+ per model, not per provider: a company can resell one model through the
214
+ platform and fund another with a key of its own, and both may be served
215
+ by the same provider. The client cache is keyed by the resolved api key,
216
+ so two models of one provider on different keys get different clients
217
+ instead of sharing the first one created.
209
218
  """
210
- client_config = self._get_client_config(company_short_name, provider)
219
+ client_config = self._get_client_config(company_short_name, provider, model_config=model_config)
211
220
  api_key = client_config["api_key"]
212
221
  base_url = client_config.get("base_url") or ""
213
222
  default_headers = client_config.get("default_headers") or {}
@@ -569,12 +578,19 @@ class LLMProxy:
569
578
  f"Provider not supported in _create_client_for_provider: {provider}"
570
579
  )
571
580
 
572
- def _get_client_config(self, company_short_name: str, provider: str) -> dict:
581
+ def _get_client_config(
582
+ self,
583
+ company_short_name: str,
584
+ provider: str,
585
+ model_config: Dict[str, Any] | None = None,
586
+ ) -> dict:
573
587
  provider_config = self.configuration_service.get_llm_provider_config(company_short_name, provider) or {}
588
+ secret_ref = self._model_credential_ref(model_config)
574
589
  provider_api_key = self._get_api_key_from_config(
575
590
  company_short_name,
576
591
  provider,
577
592
  required=False,
593
+ secret_ref=secret_ref,
578
594
  )
579
595
  gateway_transport = self.gateway_resolver.resolve(
580
596
  company_short_name=company_short_name,
@@ -595,6 +611,7 @@ class LLMProxy:
595
611
  company_short_name,
596
612
  provider,
597
613
  required=True,
614
+ secret_ref=secret_ref,
598
615
  )
599
616
  configured_base_url = self._get_base_url_from_config(company_short_name, provider)
600
617
  configured_headers = self._get_default_headers_from_config(company_short_name, provider)
@@ -709,7 +726,34 @@ class LLMProxy:
709
726
  # -------------------------------------------------------------------------
710
727
  # Configuration helpers
711
728
  # -------------------------------------------------------------------------
712
- def _get_api_key_from_config(self, company_short_name: str, provider: str, *, required: bool = True) -> str:
729
+ @staticmethod
730
+ def _model_credential_ref(model_config: Dict[str, Any] | None) -> str | None:
731
+ """The secret this model is entitled to run on, when the company owns it.
732
+
733
+ `credential_owner` and `secret_key_name` come from the company's
734
+ catalogue entitlement, and until now nothing on the request path read
735
+ them: the key was resolved only from `llm.provider_api_keys`, by name. So
736
+ a model the catalogue said the platform pays for could still run on a
737
+ customer's key — whenever the customer had stored a secret under the same
738
+ name as the platform's variable — and be invoiced as platform-served.
739
+
740
+ Only `company` ownership overrides. `platform` deliberately falls through
741
+ to the deployment's mapping, which is what "we pay for this" means.
742
+ """
743
+ if not isinstance(model_config, dict):
744
+ return None
745
+ if str(model_config.get("credential_owner") or "").strip().lower() != "company":
746
+ return None
747
+ return str(model_config.get("secret_key_name") or "").strip() or None
748
+
749
+ def _get_api_key_from_config(
750
+ self,
751
+ company_short_name: str,
752
+ provider: str,
753
+ *,
754
+ required: bool = True,
755
+ secret_ref: str | None = None,
756
+ ) -> str:
713
757
  """
714
758
  Read the LLM API key from company configuration and environment variables.
715
759
 
@@ -730,8 +774,17 @@ class LLMProxy:
730
774
  provider_keys = llm_config.get("provider_api_keys") or {}
731
775
  env_var_name = None
732
776
 
777
+ # 0) El secreto de la habilitación del modelo, cuando la empresa trae su
778
+ # propia key. Gana sobre el mapeo del archivo porque es la decisión
779
+ # explícita y por modelo; el mapeo es del deployment y por proveedor.
780
+ # 0) El secreto de la habilitación del modelo, cuando la empresa trae su
781
+ # propia key. Gana sobre el mapeo del archivo porque es la decisión
782
+ # explícita y por modelo; el mapeo es del deployment y por proveedor.
783
+ if secret_ref:
784
+ env_var_name = secret_ref
785
+
733
786
  # 1) Intentar api-key específica por proveedor (si existe el bloque provider_api_keys)
734
- if provider_keys and isinstance(provider_keys, dict):
787
+ if not env_var_name and provider_keys and isinstance(provider_keys, dict):
735
788
  env_var_name = provider_keys.get(provider)
736
789
 
737
790
  # 2) Fallback: usar api-key global si no hay específica
@@ -2138,6 +2138,57 @@ ui:
2138
2138
  obs_identity: "Identity"
2139
2139
  obs_outcome: "Outcome"
2140
2140
  obs_latency: "Latency"
2141
+ models:
2142
+ form_provider_hint: "A model you run yourself — locally, a self-hosted endpoint, your own gateway — is openai_compatible."
2143
+ form_model_key: "Model key"
2144
+ form_model_key_hint: "Exactly as the provider expects it."
2145
+ form_provider: "Provider"
2146
+ form_display_name: "Name people see here"
2147
+ empty_state_self_serve: "No models yet. Add the first one to make it available here."
2148
+ action_add: "Add model"
2149
+ action_remove: "Remove"
2150
+ confirm_remove: "Remove {model_key} from this workspace? People here stop being able to pick it."
2151
+ add_title: "Add a model"
2152
+ add_hint: "The key has to match exactly what the provider expects. This install invoices nobody, so there is no price to set."
2153
+ add_success: "Model added and available."
2154
+ remove_success: "Model removed."
2155
+ key_required: "The model key is required."
2156
+ title: "Models"
2157
+ subtitle: "Choose which AI models this workspace can use, and whose API key pays for them."
2158
+ empty_state: "No models are available yet. Your IAToolkit contact publishes them."
2159
+ col_model: "Model"
2160
+ col_cost: "Cost"
2161
+ col_key: "API key"
2162
+ col_enabled: "Enabled"
2163
+ cost_metered: "Metered"
2164
+ cost_not_billable: "No charge"
2165
+ cost_own_key: "Billed by your provider"
2166
+ key_platform: "Included"
2167
+ label_default: "Default"
2168
+ label_enabled: "Enabled"
2169
+ label_disabled: "Not enabled"
2170
+ action_configure: "Configure"
2171
+ action_enable: "Enable"
2172
+ modal_title: "Model settings"
2173
+ form_enabled: "Available in this workspace"
2174
+ form_enabled_hint: "People here can pick this model when they start a conversation."
2175
+ form_is_default: "Use as the default model"
2176
+ form_credential_owner: "Which API key runs it"
2177
+ form_owner_platform: "The key included with IAToolkit"
2178
+ form_owner_platform_hint: "Usage is measured and appears on your invoice."
2179
+ form_owner_company: "One of your own keys"
2180
+ form_owner_company_hint: "Your provider bills you directly, so this usage never reaches your IAToolkit invoice."
2181
+ form_secret_key_name: "Stored key to use"
2182
+ form_secret_hint: "Keys are added and rotated under Administration → Secrets, where they stay encrypted. This screen only points at one by name."
2183
+ not_billable_note: "This model costs nothing to run, so it never appears on an invoice whichever key it uses."
2184
+ secret_required: "Choose the stored key this model should use."
2185
+ load_error: "Could not load the models."
2186
+ save_error: "Could not save the model."
2187
+ save_success: "Model updated."
2188
+ reasoning_applies_to: "Applies to {model}"
2189
+ form_secret_value: "Your provider key"
2190
+ secret_hint_new: "Stored encrypted for this provider. Your provider bills you directly."
2191
+ secret_hint_stored: "A key is already stored for this provider. Paste one to replace it."
2141
2192
  secrets:
2142
2193
  title: "Secrets"
2143
2194
  subtitle: "Manage company secrets used by integrations and services."
@@ -2195,10 +2246,6 @@ ui:
2195
2246
  company_name: "Company name"
2196
2247
  short_name: "Short name"
2197
2248
  runtime_mode: "Runtime mode"
2198
- model_card_title: "Default AI Model"
2199
- model_card_desc: "Choose the default model used across the company configuration."
2200
- default_model: "Default model"
2201
- model_card_helper: "This model will be used as the default runtime selection."
2202
2249
  default_reasoning: "Default reasoning"
2203
2250
  default_reasoning_auto: "Automatic"
2204
2251
  reasoning_card_helper: "Applies when the selected model and provider support this reasoning level. Prompts can still override it."
@@ -2213,7 +2260,6 @@ ui:
2213
2260
  reasoning_effort_high: "High"
2214
2261
  reasoning_effort_xhigh: "Very high"
2215
2262
  branding_card_title: "Branding"
2216
- branding_card_desc: "Adjust the main colors used by the company experience."
2217
2263
  primary_color: "Primary color"
2218
2264
  secondary_color: "Secondary color"
2219
2265
  preview: "Preview"
@@ -2236,6 +2282,7 @@ ui:
2236
2282
  chat_context_preview_subtitle: "Logical view of the active conversational context for this user."
2237
2283
  chat_context_preview_block_label: "Sent Context"
2238
2284
 
2285
+ runtime_defaults_card_title: "Runtime defaults"
2239
2286
  rag:
2240
2287
  ingestion: "Ingestion"
2241
2288
  ingestion_description: "Ingest documents into the knowledge base."
@@ -2144,6 +2144,57 @@ ui:
2144
2144
  obs_identity: "Identidad"
2145
2145
  obs_outcome: "Resultado"
2146
2146
  obs_latency: "Latencia"
2147
+ models:
2148
+ form_provider_hint: "Un modelo que corres vos —local, un endpoint propio, tu gateway— es openai_compatible."
2149
+ form_model_key: "Clave del modelo"
2150
+ form_model_key_hint: "Exactamente como la espera el proveedor."
2151
+ form_provider: "Proveedor"
2152
+ form_display_name: "Nombre que ven las personas de acá"
2153
+ empty_state_self_serve: "Todavía no hay modelos. Agrega el primero para que quede disponible acá."
2154
+ action_add: "Agregar modelo"
2155
+ action_remove: "Quitar"
2156
+ confirm_remove: "¿Quitar {model_key} de este espacio de trabajo? Las personas de acá dejan de poder elegirlo."
2157
+ add_title: "Agregar un modelo"
2158
+ add_hint: "La clave tiene que coincidir exactamente con lo que espera el proveedor. Esta instalación no factura a nadie, así que no hay precio que definir."
2159
+ add_success: "Modelo agregado y disponible."
2160
+ remove_success: "Modelo quitado."
2161
+ key_required: "La clave del modelo es obligatoria."
2162
+ title: "Modelos"
2163
+ subtitle: "Elige qué modelos de IA puede usar este espacio de trabajo, y con qué API key se pagan."
2164
+ empty_state: "Todavía no hay modelos disponibles. Tu contacto en IAToolkit los publica."
2165
+ col_model: "Modelo"
2166
+ col_cost: "Costo"
2167
+ col_key: "API key"
2168
+ col_enabled: "Habilitado"
2169
+ cost_metered: "Con medición"
2170
+ cost_not_billable: "Sin costo"
2171
+ cost_own_key: "Lo factura tu proveedor"
2172
+ key_platform: "Incluida"
2173
+ label_default: "Por defecto"
2174
+ label_enabled: "Habilitado"
2175
+ label_disabled: "No habilitado"
2176
+ action_configure: "Configurar"
2177
+ action_enable: "Habilitar"
2178
+ modal_title: "Configuración del modelo"
2179
+ form_enabled: "Disponible en este espacio de trabajo"
2180
+ form_enabled_hint: "Las personas de aquí podrán elegir este modelo al iniciar una conversación."
2181
+ form_is_default: "Usar como modelo por defecto"
2182
+ form_credential_owner: "Con qué API key funciona"
2183
+ form_owner_platform: "La key incluida con IAToolkit"
2184
+ form_owner_platform_hint: "El consumo se mide y aparece en tu factura."
2185
+ form_owner_company: "Una key propia"
2186
+ form_owner_company_hint: "Tu proveedor te factura directo, así que este consumo nunca llega a tu factura de IAToolkit."
2187
+ form_secret_key_name: "Key almacenada a usar"
2188
+ form_secret_hint: "Las keys se agregan y rotan en Administración → Secretos, donde quedan encriptadas. Esta pantalla solo apunta a una por su nombre."
2189
+ not_billable_note: "Este modelo no tiene costo de ejecución, así que no aparece en ninguna factura sin importar con qué key funcione."
2190
+ secret_required: "Elige la key almacenada que debe usar este modelo."
2191
+ load_error: "No se pudieron cargar los modelos."
2192
+ save_error: "No se pudo guardar el modelo."
2193
+ save_success: "Modelo actualizado."
2194
+ reasoning_applies_to: "Aplica a {model}"
2195
+ form_secret_value: "Tu key del proveedor"
2196
+ secret_hint_new: "Se guarda cifrada para este proveedor. Tu proveedor te factura directamente."
2197
+ secret_hint_stored: "Ya hay una key guardada para este proveedor. Pegá otra para reemplazarla."
2147
2198
  secrets:
2148
2199
  title: "Secrets"
2149
2200
  subtitle: "Administra los secrets de la empresa usados por integraciones y servicios."
@@ -2201,10 +2252,6 @@ ui:
2201
2252
  company_name: "Nombre de la empresa"
2202
2253
  short_name: "Nombre corto"
2203
2254
  runtime_mode: "Modo runtime"
2204
- model_card_title: "Modelo AI por defecto"
2205
- model_card_desc: "Elige el modelo por defecto usado en la configuración de la empresa."
2206
- default_model: "Modelo por defecto"
2207
- model_card_helper: "Este modelo se usará como selección por defecto en runtime."
2208
2255
  default_reasoning: "Razonamiento por defecto"
2209
2256
  default_reasoning_auto: "Automático"
2210
2257
  reasoning_card_helper: "Se aplica cuando el modelo y el provider seleccionados soportan este nivel de razonamiento. Los prompts igual pueden sobreescribirlo."
@@ -2219,7 +2266,6 @@ ui:
2219
2266
  reasoning_effort_high: "Alto"
2220
2267
  reasoning_effort_xhigh: "Muy alto"
2221
2268
  branding_card_title: "Branding"
2222
- branding_card_desc: "Ajusta los colores principales usados por la experiencia de la empresa."
2223
2269
  primary_color: "Color primario"
2224
2270
  secondary_color: "Color secundario"
2225
2271
  preview: "Vista previa"
@@ -2242,6 +2288,7 @@ ui:
2242
2288
  chat_context_preview_subtitle: "Vista lógica del contexto conversacional activo para este usuario."
2243
2289
  chat_context_preview_block_label: "Contexto Enviado"
2244
2290
 
2291
+ runtime_defaults_card_title: "Valores por defecto en runtime"
2245
2292
  rag:
2246
2293
  ingestion: "Ingesta"
2247
2294
  ingestion_description: "Ingestar documentos en la base de conocimiento."
@@ -208,7 +208,40 @@ class DatabaseManager(DatabaseProvider):
208
208
  """
209
209
  Esta función se ejecuta cada vez que se establece una conexión.
210
210
  dbapi_connection es la conexión psycopg2 real.
211
+
212
+ On a database that does not have the pgvector extension yet, this is
213
+ where a brand-new installation dies: ``register_vector`` raises "vector
214
+ type not found in the database" on the very first connection, before
215
+ ``create_all`` has run and long before any CLI command can help. So the
216
+ extension is created here, once, and only after the lookup has already
217
+ failed — a database that has it pays nothing.
218
+
219
+ ``CREATE EXTENSION`` needs a privileged role. When the connecting role
220
+ does not have it, the original error is raised with the statement to run
221
+ by hand, because there is nothing this process can do about it.
211
222
  """
223
+ try:
224
+ register_vector(dbapi_connection)
225
+ return
226
+ except Exception as exc:
227
+ logging.info("pgvector is not registered yet on this database: %s", exc)
228
+
229
+ try:
230
+ # The failed lookup left a transaction open, and psycopg2 refuses to
231
+ # switch autocommit inside one — so end it and commit explicitly
232
+ # instead of touching the connection's mode.
233
+ dbapi_connection.rollback()
234
+ with dbapi_connection.cursor() as cursor:
235
+ cursor.execute("CREATE EXTENSION IF NOT EXISTS vector")
236
+ dbapi_connection.commit()
237
+ logging.info("Created the pgvector extension on this database.")
238
+ except Exception as exc:
239
+ raise RuntimeError(
240
+ "This database does not have the pgvector extension and the "
241
+ f"connecting role could not create it ({exc}). Run this once as "
242
+ "a privileged role: CREATE EXTENSION IF NOT EXISTS vector;"
243
+ ) from exc
244
+
212
245
  register_vector(dbapi_connection)
213
246
 
214
247
  def get_session(self):
@@ -149,6 +149,7 @@ class KnowledgeWikiRepo:
149
149
  body_text: str | None = None,
150
150
  status: KnowledgeWikiPageStatus = KnowledgeWikiPageStatus.PUBLISHED,
151
151
  tags: list[str] | None = None,
152
+ access_tags: list[str] | None = None,
152
153
  owner: str | None = None,
153
154
  source_meta: dict | None = None,
154
155
  last_synced_at: datetime | None = None,
@@ -166,6 +167,11 @@ class KnowledgeWikiRepo:
166
167
  page.source_storage_key = source_storage_key
167
168
  page.status = status
168
169
  page.tags = tags or []
170
+ # None means "leave the stored labels alone": a wiki with no access
171
+ # manifest must not lose its labels because a page's markdown changed.
172
+ # An empty list is a real value and does clear them.
173
+ if access_tags is not None:
174
+ page.access_tags = list(access_tags)
169
175
  page.owner = owner
170
176
  page.source_meta = source_meta or {}
171
177
  page.last_synced_at = last_synced_at
@@ -181,6 +187,7 @@ class KnowledgeWikiRepo:
181
187
  source_storage_key=source_storage_key,
182
188
  status=status,
183
189
  tags=tags or [],
190
+ access_tags=list(access_tags or []),
184
191
  owner=owner,
185
192
  source_meta=source_meta or {},
186
193
  last_synced_at=last_synced_at,