iatoolkit 0.108.1__tar.gz → 1.10.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 (144) hide show
  1. {iatoolkit-0.108.1/src/iatoolkit.egg-info → iatoolkit-1.10.0}/PKG-INFO +1 -1
  2. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/__init__.py +3 -3
  3. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/common/interfaces/database_provider.py +13 -8
  4. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/common/routes.py +52 -6
  5. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/common/util.py +21 -1
  6. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/core.py +2 -0
  7. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +1 -0
  8. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/connectors/s3_connector.py +4 -2
  9. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/locales/en.yaml +150 -3
  10. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/locales/es.yaml +148 -5
  11. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/repositories/database_manager.py +27 -47
  12. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/repositories/document_repo.py +7 -0
  13. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/repositories/llm_query_repo.py +29 -7
  14. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/repositories/models.py +59 -4
  15. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/repositories/profile_repo.py +3 -4
  16. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/repositories/vs_repo.py +22 -24
  17. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/company_context_service.py +44 -20
  18. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/configuration_service.py +244 -75
  19. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/dispatcher_service.py +0 -3
  20. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/file_processor_service.py +0 -5
  21. iatoolkit-1.10.0/src/iatoolkit/services/knowledge_base_service.py +447 -0
  22. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/load_documents_service.py +26 -48
  23. iatoolkit-1.10.0/src/iatoolkit/services/prompt_service.py +539 -0
  24. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/sql_service.py +17 -0
  25. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/templates/chat.html +3 -2
  26. iatoolkit-1.10.0/src/iatoolkit/views/categories_api_view.py +111 -0
  27. iatoolkit-1.10.0/src/iatoolkit/views/configuration_api_view.py +163 -0
  28. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/load_document_api_view.py +14 -10
  29. iatoolkit-1.10.0/src/iatoolkit/views/prompt_api_view.py +118 -0
  30. iatoolkit-1.10.0/src/iatoolkit/views/rag_api_view.py +216 -0
  31. {iatoolkit-0.108.1 → iatoolkit-1.10.0/src/iatoolkit.egg-info}/PKG-INFO +1 -1
  32. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit.egg-info/SOURCES.txt +4 -2
  33. iatoolkit-0.108.1/src/iatoolkit/services/prompt_service.py +0 -303
  34. iatoolkit-0.108.1/src/iatoolkit/services/search_service.py +0 -55
  35. iatoolkit-0.108.1/src/iatoolkit/views/load_company_configuration_api_view.py +0 -49
  36. iatoolkit-0.108.1/src/iatoolkit/views/prompt_api_view.py +0 -37
  37. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/LICENSE +0 -0
  38. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/LICENSE_COMMUNITY.md +0 -0
  39. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/pyproject.toml +0 -0
  40. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/readme.md +0 -0
  41. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/requirements.txt +0 -0
  42. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/setup.cfg +0 -0
  43. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/base_company.py +0 -0
  44. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/cli_commands.py +0 -0
  45. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/common/__init__.py +0 -0
  46. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/common/exceptions.py +0 -0
  47. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/common/interfaces/__init__.py +0 -0
  48. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/common/interfaces/asset_storage.py +0 -0
  49. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/common/model_registry.py +0 -0
  50. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/common/session_manager.py +0 -0
  51. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/company_registry.py +0 -0
  52. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/__init__.py +0 -0
  53. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/brevo_mail_app.py +0 -0
  54. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/call_service.py +0 -0
  55. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  56. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  57. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  58. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  59. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  60. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
  61. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/llm_providers/__init__.py +0 -0
  62. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/llm_providers/deepseek_adapter.py +0 -0
  63. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/llm_providers/gemini_adapter.py +0 -0
  64. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/llm_providers/openai_adapter.py +0 -0
  65. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
  66. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/llm_response.py +0 -0
  67. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  68. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/repositories/__init__.py +0 -0
  69. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/repositories/filesystem_asset_repository.py +0 -0
  70. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/__init__.py +0 -0
  71. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/auth_service.py +0 -0
  72. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/benchmark_service.py +0 -0
  73. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/branding_service.py +0 -0
  74. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/document_service.py +0 -0
  75. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/embedding_service.py +0 -0
  76. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/excel_service.py +0 -0
  77. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/history_manager_service.py +0 -0
  78. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/i18n_service.py +0 -0
  79. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/jwt_service.py +0 -0
  80. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/language_service.py +0 -0
  81. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/license_service.py +0 -0
  82. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/llm_client_service.py +0 -0
  83. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/mail_service.py +0 -0
  84. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/profile_service.py +0 -0
  85. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/query_service.py +0 -0
  86. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/tool_service.py +0 -0
  87. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
  88. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
  89. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/images/fernando.jpeg +0 -0
  90. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/images/iatoolkit_core.png +0 -0
  91. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/images/iatoolkit_logo.png +0 -0
  92. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/js/chat_feedback_button.js +0 -0
  93. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  94. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/js/chat_help_content.js +0 -0
  95. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/js/chat_history_button.js +0 -0
  96. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/js/chat_logout_button.js +0 -0
  97. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/js/chat_main.js +0 -0
  98. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/js/chat_model_selector.js +0 -0
  99. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/js/chat_onboarding_button.js +0 -0
  100. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/js/chat_prompt_manager.js +0 -0
  101. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/js/chat_reload_button.js +0 -0
  102. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  103. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  104. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/styles/chat_public.css +0 -0
  105. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/styles/documents.css +0 -0
  106. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/styles/landing_page.css +0 -0
  107. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
  108. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/static/styles/onboarding.css +0 -0
  109. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/system_prompts/__init__.py +0 -0
  110. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/system_prompts/format_styles.prompt +0 -0
  111. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/system_prompts/query_main.prompt +0 -0
  112. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/system_prompts/sql_rules.prompt +0 -0
  113. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/templates/_company_header.html +0 -0
  114. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/templates/_login_widget.html +0 -0
  115. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/templates/base.html +0 -0
  116. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/templates/change_password.html +0 -0
  117. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/templates/chat_modals.html +0 -0
  118. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/templates/error.html +0 -0
  119. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/templates/forgot_password.html +0 -0
  120. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  121. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/templates/signup.html +0 -0
  122. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/__init__.py +0 -0
  123. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/base_login_view.py +0 -0
  124. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/change_password_view.py +0 -0
  125. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/chat_view.py +0 -0
  126. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/embedding_api_view.py +0 -0
  127. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/forgot_password_view.py +0 -0
  128. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/help_content_api_view.py +0 -0
  129. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/history_api_view.py +0 -0
  130. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/home_view.py +0 -0
  131. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/init_context_api_view.py +0 -0
  132. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/llmquery_api_view.py +0 -0
  133. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/login_view.py +0 -0
  134. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/logout_api_view.py +0 -0
  135. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/profile_api_view.py +0 -0
  136. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/root_redirect_view.py +0 -0
  137. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/signup_view.py +0 -0
  138. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/static_page_view.py +0 -0
  139. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/user_feedback_api_view.py +0 -0
  140. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/users_api_view.py +0 -0
  141. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit/views/verify_user_view.py +0 -0
  142. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  143. {iatoolkit-0.108.1 → iatoolkit-1.10.0}/src/iatoolkit.egg-info/requires.txt +0 -0
  144. {iatoolkit-0.108.1 → iatoolkit-1.10.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: 0.108.1
3
+ Version: 1.10.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__ = "0.108.1"
6
+ __version__ = "1.10.0"
7
7
 
8
8
  # Expose main classes and functions at the top level of the package
9
9
 
@@ -17,7 +17,7 @@ from .base_company import BaseCompany
17
17
  # --- Services ---
18
18
  from iatoolkit.services.query_service import QueryService
19
19
  from iatoolkit.services.document_service import DocumentService
20
- from iatoolkit.services.search_service import SearchService
20
+ from iatoolkit.services.knowledge_base_service import KnowledgeBaseService
21
21
  from iatoolkit.services.sql_service import SqlService
22
22
  from iatoolkit.services.load_documents_service import LoadDocumentsService
23
23
  from iatoolkit.infra.call_service import CallServiceClient
@@ -36,7 +36,7 @@ __all__ = [
36
36
  'QueryService',
37
37
  'SqlService',
38
38
  'DocumentService',
39
- 'SearchService',
39
+ 'KnowledgeBaseService',
40
40
  'LoadDocumentsService',
41
41
  'CallServiceClient',
42
42
  'ProfileService',
@@ -9,14 +9,19 @@ class DatabaseProvider(abc.ABC):
9
9
 
10
10
  # --- Schema Methods ---
11
11
  @abc.abstractmethod
12
- def get_all_table_names(self) -> List[str]:
13
- pass
14
-
15
- @abc.abstractmethod
16
- def get_table_description(self,
17
- table_name: str,
18
- schema_object_name: str | None = None,
19
- exclude_columns: List[str] | None = None) -> str:
12
+ def get_database_structure(self) -> dict:
13
+ """
14
+ Returns the structure of the database (tables, columns, types)
15
+ Format:
16
+ {
17
+ "table_name": {
18
+ "columns": [
19
+ {"name": "col1", "type": "VARCHAR", "nullable": True, "pk": True},
20
+ ...
21
+ ]
22
+ }
23
+ }
24
+ """
20
25
  pass
21
26
 
22
27
  # --- Execution Methods ---
@@ -24,13 +24,15 @@ def register_views(app):
24
24
  from iatoolkit.views.profile_api_view import UserLanguageApiView
25
25
  from iatoolkit.views.embedding_api_view import EmbeddingApiView
26
26
  from iatoolkit.views.login_view import LoginView, FinalizeContextView
27
- from iatoolkit.views.load_company_configuration_api_view import LoadCompanyConfigurationApiView
27
+ from iatoolkit.views.configuration_api_view import ConfigurationApiView, ValidateConfigurationApiView
28
28
  from iatoolkit.views.logout_api_view import LogoutApiView
29
29
  from iatoolkit.views.home_view import HomeView
30
30
  from iatoolkit.views.chat_view import ChatView
31
31
  from iatoolkit.views.static_page_view import StaticPageView
32
32
  from iatoolkit.views.root_redirect_view import RootRedirectView
33
33
  from iatoolkit.views.users_api_view import UsersApiView
34
+ from iatoolkit.views.rag_api_view import RagApiView
35
+ from iatoolkit.views.categories_api_view import CategoriesApiView
34
36
 
35
37
  # assign root '/' to our new redirect logic
36
38
  app.add_url_rule('/home', view_func=RootRedirectView.as_view('root_redirect'))
@@ -84,14 +86,53 @@ def register_views(app):
84
86
  # can be used also for executing iatoolkit prompts
85
87
  app.add_url_rule('/<company_short_name>/api/llm_query', view_func=LLMQueryApiView.as_view('llm_query_api'))
86
88
 
87
- # open the promt directory
88
- app.add_url_rule('/<company_short_name>/api/prompts', view_func=PromptApiView.as_view('prompt'))
89
-
89
+ # Categories Endpoint
90
+ app.add_url_rule('/<company_short_name>/api/categories',
91
+ view_func=CategoriesApiView.as_view('categories_api'),
92
+ methods=['GET', 'POST'])
93
+
94
+ # open the promt directory and specific prompt management
95
+ prompt_view = PromptApiView.as_view('prompt')
96
+ app.add_url_rule('/<company_short_name>/api/prompts',
97
+ view_func=prompt_view,
98
+ methods=['GET', 'POST'],
99
+ defaults={'prompt_name': None})
100
+
101
+ app.add_url_rule('/<company_short_name>/api/prompts/<prompt_name>',
102
+ view_func=prompt_view,
103
+ methods=['GET', 'POST','PUT', 'DELETE'])
90
104
  # toolbar buttons
91
105
  app.add_url_rule('/<company_short_name>/api/feedback', view_func=UserFeedbackApiView.as_view('feedback'))
92
106
  app.add_url_rule('/<company_short_name>/api/history', view_func=HistoryApiView.as_view('history'))
93
107
  app.add_url_rule('/<company_short_name>/api/help-content', view_func=HelpContentApiView.as_view('help-content'))
94
108
 
109
+ # --- RAG API Routes ---
110
+ rag_view = RagApiView.as_view('rag_api')
111
+
112
+ # 1. List Files (POST for filters)
113
+ app.add_url_rule('/api/rag/<company_short_name>/files',
114
+ view_func=rag_view,
115
+ methods=['POST'],
116
+ defaults={'action': 'list_files'})
117
+
118
+ # 2. Delete File
119
+ app.add_url_rule('/api/rag/<company_short_name>/files/<int:document_id>',
120
+ view_func=rag_view,
121
+ methods=['DELETE'],
122
+ defaults={'action': 'delete_file'})
123
+
124
+ # 3. Search Lab
125
+ app.add_url_rule('/api/rag/<company_short_name>/search',
126
+ view_func=rag_view,
127
+ methods=['POST'],
128
+ defaults={'action': 'search'})
129
+
130
+ # 4. Get File Content (View/Download)
131
+ app.add_url_rule('/api/rag/<company_short_name>/files/<int:document_id>/content',
132
+ view_func=rag_view,
133
+ methods=['GET'],
134
+ defaults={'action': 'get_file_content'})
135
+
95
136
  # this endpoint is for upload documents into the vector store (api-key)
96
137
  app.add_url_rule('/api/load-document', view_func=LoadDocumentApiView.as_view('load-document'), methods=['POST'])
97
138
 
@@ -100,8 +141,13 @@ def register_views(app):
100
141
  view_func=EmbeddingApiView.as_view('embedding_api'))
101
142
 
102
143
  # company configuration
103
- app.add_url_rule('/<company_short_name>/api/load_configuration',
104
- view_func=LoadCompanyConfigurationApiView.as_view('load-configuration'))
144
+ app.add_url_rule('/<company_short_name>/api/configuration',
145
+ view_func=ConfigurationApiView.as_view('configuration'),
146
+ methods=['GET', 'POST', 'PATCH'],)
147
+
148
+ app.add_url_rule('/<company_short_name>/api/configuration/validate',
149
+ view_func=ValidateConfigurationApiView.as_view('configuration-validate'),
150
+ methods=['GET'])
105
151
 
106
152
  # static pages
107
153
  # url: /pages/foundation o /pages/implementation_plan
@@ -168,6 +168,20 @@ class Utility:
168
168
  logging.error(f"Error parsing YAML string: {e}")
169
169
  return {}
170
170
 
171
+ def dump_yaml_to_string(self, config: dict) -> str:
172
+ """
173
+ Dumps a dictionary into a YAML formatted string.
174
+ It uses default flow style False to ensure block format (readable YAML).
175
+ """
176
+ try:
177
+ # default_flow_style=False ensures lists and dicts are expanded (not inline like JSON)
178
+ # allow_unicode=True ensures characters like accents are preserved
179
+ return yaml.safe_dump(config, default_flow_style=False, allow_unicode=True, sort_keys=False)
180
+ except yaml.YAMLError as e:
181
+ logging.error(f"Error dumping YAML to string: {e}")
182
+ raise IAToolkitException(IAToolkitException.ErrorType.FILE_IO_ERROR,
183
+ f"Failed to generate YAML: {e}")
184
+
171
185
  def generate_context_for_schema(self, entity_name: str, schema_file: str = None, schema: dict = {}) -> str:
172
186
  if not schema_file and not schema:
173
187
  raise IAToolkitException(IAToolkitException.ErrorType.FILE_IO_ERROR,
@@ -197,9 +211,13 @@ class Utility:
197
211
  root_name = list(schema.keys())[0]
198
212
  root_details = schema[root_name]
199
213
 
214
+ # support this format
215
+ if root_details.get('columns'):
216
+ root_details = root_details['columns']
217
+
200
218
  if isinstance(root_details, dict):
201
219
  # Las claves de metadatos describen el objeto en sí, no sus propiedades hijas.
202
- METADATA_KEYS = ['description', 'type', 'format', 'items', 'properties']
220
+ METADATA_KEYS = ['description', 'type', 'format', 'items', 'properties', 'pk']
203
221
 
204
222
  # Las propiedades son las claves restantes en el diccionario.
205
223
  properties = {
@@ -242,6 +260,8 @@ class Utility:
242
260
  description = details.get('description', '')
243
261
  data_type = details.get('type', 'any')
244
262
  output.append(f"{indent_str}- **`{name.lower()}`** ({data_type}): {description}")
263
+ # if 'pk' in details and details['pk']:
264
+ # output.append(f"{indent_str}- **Primary Key**: {details['pk']}")
245
265
 
246
266
  child_indent_str = ' ' * (indent_level + 1)
247
267
 
@@ -335,6 +335,7 @@ class IAToolkit:
335
335
  from iatoolkit.services.llm_client_service import llmClient
336
336
  from iatoolkit.services.auth_service import AuthService
337
337
  from iatoolkit.services.sql_service import SqlService
338
+ from iatoolkit.services.knowledge_base_service import KnowledgeBaseService
338
339
 
339
340
  binder.bind(QueryService, to=QueryService)
340
341
  binder.bind(BenchmarkService, to=BenchmarkService)
@@ -356,6 +357,7 @@ class IAToolkit:
356
357
  binder.bind(llmClient, to=llmClient)
357
358
  binder.bind(AuthService, to=AuthService)
358
359
  binder.bind(SqlService, to=SqlService)
360
+ binder.bind(KnowledgeBaseService, to=KnowledgeBaseService)
359
361
 
360
362
  def _bind_infrastructure(self, binder: Binder):
361
363
  from iatoolkit.infra.llm_proxy import LLMProxy
@@ -40,6 +40,7 @@ class FileConnectorFactory:
40
40
  return S3Connector(
41
41
  bucket=config['bucket'],
42
42
  prefix=config.get('prefix', ''),
43
+ folder=config.get('folder', ''),
43
44
  auth=auth
44
45
  )
45
46
 
@@ -9,14 +9,16 @@ from typing import List
9
9
 
10
10
 
11
11
  class S3Connector(FileConnector):
12
- def __init__(self, bucket: str, prefix: str, auth: dict):
12
+ def __init__(self, bucket: str, prefix: str, folder: str, auth: dict):
13
13
  self.bucket = bucket
14
14
  self.prefix = prefix
15
+ self.folder = folder
15
16
  self.s3 = boto3.client('s3', **auth)
16
17
 
17
18
  def list_files(self) -> List[dict]:
18
19
  # list all the files as dictionaries, with keys: 'path', 'name' y 'metadata'.
19
- response = self.s3.list_objects_v2(Bucket=self.bucket, Prefix=self.prefix)
20
+ prefix = f'{self.prefix}/{self.folder}/'
21
+ response = self.s3.list_objects_v2(Bucket=self.bucket, Prefix=prefix)
20
22
  files = response.get('Contents', [])
21
23
 
22
24
  return [
@@ -47,13 +47,23 @@ ui:
47
47
  init_context: "Initializing the context ..."
48
48
 
49
49
  admin:
50
- resources: "Resources"
50
+ workspace: "Workspace"
51
51
  configuration: "Configuration"
52
+ company_config: "Company Configuration (company.yaml)"
52
53
  prompts: "Prompts"
54
+ prompts_description: "System Prompts"
55
+ knowledge_rag: "Knowledge Base (RAG)"
56
+ knowledge_static: "Static Context"
53
57
  schemas: "Schemas"
58
+ schemas_description: "Data Definitions (YAML)"
59
+ context_description: "Static Markdown"
60
+ administration: "Administration"
61
+ monitoring: "Monitoring"
62
+ teams: "Team"
63
+ billing: "Billing"
64
+ company: "Company"
54
65
  context: "Context"
55
66
  files: "Files"
56
- users: "Users"
57
67
  select_file: "Select a file for editing"
58
68
  select_category: "Select a category"
59
69
  editing: "Editing"
@@ -64,15 +74,124 @@ ui:
64
74
  new_file: "New file"
65
75
  delete_file: "Delete file"
66
76
  rename_file: "Rename file"
77
+ saved_ok: "File saved successfully"
67
78
  save_file: "Save"
68
79
  credentials: "Email and password required for login."
69
- saved_ok: "Saved successfully"
70
80
  deleted_ok: "Deleted successfully"
71
81
  user_manager: "User management"
72
82
  admin_page_title: "Admin access"
73
83
  load_configuration: "Save configuration"
74
84
  goto_chat: "Go to chat"
75
85
  logout: "Close session"
86
+ error_loading: "Error loading file content"
87
+ loading: "Loading..."
88
+ add: "Add"
89
+ create: "Create"
90
+ delete: "Delete"
91
+ add_new: "Add new"
92
+ category_name_placeholder: "Category name"
93
+ items: "Items"
94
+ drag_drop_hint: "Use arrows to reorder items."
95
+ current_items: "Current items"
96
+ manage: "Manage"
97
+
98
+
99
+ db_explorer:
100
+ data_explorer: "Data Explorer"
101
+ database_connection: "Database Connection"
102
+ tables: "Tables"
103
+ data_explorer_description: "Explore your database tables ."
104
+ select_database: "Please select a database above to view its tables."
105
+ not_table_selected: "No table selected"
106
+ view_yaml: "View YAML"
107
+ save_schema: "Save schema"
108
+ select_table: "Select a table from the left panel"
109
+ table_semantics: "Table Semantics"
110
+ table_description: "Description (AI Context)"
111
+ table_placeholder: "Describe what data this table contains (e.g., 'Active and inactive customer records including billing addresses')..."
112
+ column_metadata: "Column Metadata"
113
+ auto_detect: "Auto-detected from DB"
114
+ meta_column: "Column"
115
+ meta_type: "Type"
116
+ meta_description: "Description"
117
+ meta_synonyms: "Synonyms"
118
+ pii_sesitive: "PII Sensitive"
119
+
120
+ prompts:
121
+ title: "Prompts Manager"
122
+ subtitle: "Manage and test your AI personas and templates"
123
+ library: "Prompt Library"
124
+ new_btn: "New"
125
+ filter_placeholder: "Filter prompts..."
126
+ select_prompt: "Select a prompt"
127
+ toggle_settings: "Toggle Variables & Config"
128
+ settings_btn: "Settings"
129
+ save_btn: "Save"
130
+ tab_editor: "Editor"
131
+ tab_playground: "Playground"
132
+ config_title: "Config"
133
+ desc_label: "Description"
134
+ desc_placeholder: "Describe this prompt..."
135
+ vars_label: "Input Variables"
136
+ no_vars: "No inputs defined"
137
+ playground_inputs: "Variables & Inputs"
138
+ no_vars_detected: "No variables detected in prompt template."
139
+ model_override: "Model Override (Optional)"
140
+ default_model: "Default (from config)"
141
+ run_btn: "Run"
142
+ output_placeholder: "Output will appear here..."
143
+ new_modal_title: "Create New Prompt"
144
+ name_label: "Name (Slug)"
145
+ name_help: "Use lowercase, numbers, and underscores only."
146
+ category_label: "Category"
147
+ delete_confirmation: "Delete Prompt?"
148
+
149
+
150
+ config:
151
+ editor_description: "IAToolkit configuration file"
152
+ title: "Configuration Editor"
153
+ sections: "Sections"
154
+ refresh: "Refresh"
155
+ validate: "Validate"
156
+ select_section: "Select a section from the left panel"
157
+ no_section_selected: "No section selected"
158
+ view_yaml: "View YAML"
159
+
160
+
161
+ rag:
162
+ ingestion: "Ingestion"
163
+ ingestion_description: "Ingest documents into the knowledge base."
164
+ workbench: "Workbench"
165
+ documents: "Documents"
166
+ retrieval_lab: "Retrieval Lab."
167
+ retrieval_description: "Test semantic search and context retrieval."
168
+ query_placeholder: "Enter a question to query the knowledge base..."
169
+ search_button: "Search"
170
+ filter: "Filter"
171
+ search_results_title: "Ready to test"
172
+ search_results_description: "Results will appear here"
173
+ filename: "Filename"
174
+ filename_placeholder: "Contains..."
175
+ user: "User"
176
+ status: "Status"
177
+ all_status: "All statuses"
178
+ status_active: "Active"
179
+ status_pending: "Pending"
180
+ status_processing: "Processing"
181
+ status_failed: "Failed"
182
+ created_at: "Created"
183
+ date_range: "Date range"
184
+ delete_confirmation: "Delete File?"
185
+ delete_message: "This action cannot be undone. The file will be permanently removed."
186
+ delete_button: "Delete"
187
+ delete_cancel: "Cancel"
188
+ target_collection: "Collection"
189
+ select_collection_placeholder: "Select a collection"
190
+ select_collection: "Select a collection"
191
+ collection_required: "Collection is required"
192
+ collection: "Collection"
193
+ manage_collections: "Manage collections"
194
+ all_collections: "All collections"
76
195
 
77
196
  tooltips:
78
197
  history: "History of my queries"
@@ -174,6 +293,19 @@ services:
174
293
  start_query: "Hello, what can I help you with today?"
175
294
  mail_change_password: "mail sent for password change"
176
295
 
296
+ rag:
297
+ ingestion:
298
+ duplicate: "Document '{filename}' already exists for company '{company_short_name}'. Skipping ingestion."
299
+ failed: "Failed to ingest document: {error}"
300
+ processing_failed: "Processing failed: {error}"
301
+ empty_text: "Extracted text is empty."
302
+ search:
303
+ query_required: "Query is required."
304
+ company_not_found: "Company '{company_short_name}' not found."
305
+ management:
306
+ delete_success: "Document deleted."
307
+ not_found: "Document not found."
308
+ action_not_found: "Action '{action}' not found."
177
309
 
178
310
  flash_messages:
179
311
  password_changed_success: "Your password has been successfully reset. You can now log in."
@@ -208,9 +340,12 @@ js_messages:
208
340
  no_file_selected: "No file selected"
209
341
  select_company: "Select company"
210
342
  delete_ok: "File deleted successfully"
343
+ delete_failed: "File deletion failed"
211
344
  rename_ok: "File rename successfully"
345
+ file_created: "File created successfully"
212
346
  not_saved: 'Could not save'
213
347
  saved_ok: "Saved successfully"
348
+ error_saving: "Error saving file"
214
349
  invalid_file_name: "Invalid filename. Use only letters, numbers, underscores, hyphens, and dots."
215
350
  config_loaded: "Configuration loaded successfully."
216
351
  config_load_error: "Error loading configuration."
@@ -222,5 +357,17 @@ js_messages:
222
357
  db_verified: "Verified"
223
358
  db_created: "Created"
224
359
  db_last_access: "Last access"
360
+ db_filename: "Filename"
361
+ db_status: "Status"
362
+ db_collection: "Collection"
363
+ editor_no_file_selected: "No file selected"
364
+ error_loading: "Error loading file content"
365
+ cant_load_company: "Could not load company.yaml"
366
+ config_saved: "Configuration saved successfully."
367
+ config_error: "Error saving configuration."
368
+ all_collections: "All collections"
369
+
370
+
371
+
225
372
 
226
373
 
@@ -46,15 +46,24 @@ ui:
46
46
  init_context: "Inicializando el contexto de la IA ..."
47
47
 
48
48
  admin:
49
- resources: "Recursos"
49
+ workspace: "Recursos"
50
50
  configuration: "Configuración"
51
+ company_config: "Configuración Empresa (company.yaml)"
52
+ knowledge_rag: "Knowledge Base (RAG)"
53
+ knowledge_static: "Contenido Estático"
51
54
  prompts: "Prompts"
55
+ prompts_description: "Prompts de sistema"
52
56
  schemas: "Schemas"
57
+ schemas_description: "Definiciones de entidades"
53
58
  context: "Contexto"
59
+ context_description: "Contenido estatico (Markdown)"
60
+ administration: "Administración"
61
+ monitoring: "Monitoreo"
62
+ teams: "Usuarios"
63
+ billing: "Facturación"
54
64
  files: "Archivos"
55
- users: "Usuarios"
56
65
  select_file: "Seleccione un archivo a editar"
57
- select_categpry: "Seleccione una categoría"
66
+ select_category: "Seleccione una categoría"
58
67
  editing: "Editando"
59
68
  no_file_selected: "Seleccione un archivo"
60
69
  new: "Nuevo"
@@ -73,6 +82,112 @@ ui:
73
82
  load_configuration: "Guardar configuración"
74
83
  goto_chat: "Ir al chat"
75
84
  logout: "Cerrar sesión"
85
+ add: "Agregar"
86
+ create: "Crear"
87
+ delete: "Borrar"
88
+ add_new: "Agregar nuevo"
89
+ category_name_placeholder: "nombre de categoria"
90
+ items: "Items"
91
+ drag_drop_hint: "Utiliza las flechas para ordenar items.."
92
+ current_items: "items actuales"
93
+ manage: "Administrar"
94
+
95
+
96
+ db_explorer:
97
+ data_explorer: "Explorador de datos"
98
+ database_connection: "Bases de datos"
99
+ tables: "Tablas"
100
+ data_explorer_description: "Explora tus tablas de base de datos."
101
+ select_database: "Seleccione una base de datos para ver sus tablas."
102
+ not_table_selected: "No hay tabla seleccionada."
103
+ view_yaml: "Ver YAML"
104
+ save_schema: "Guardar esquema"
105
+ select_table: "Seleccionar una tabla del panel izquierdo"
106
+ table_semantics: "Significado de la tabla"
107
+ table_description: "Descripción de la tabla (Contexto IA)"
108
+ table_placeholder: "Describe el significado de la tabla, ejemplo: tabla de usuarios."
109
+ column_metadata: "Metadatos de columna"
110
+ auto_detect: "Auto-detectar desde la BD"
111
+ meta_column: "Columna"
112
+ meta_type: "Tipo"
113
+ meta_description: "Descripción"
114
+ meta_synonyms: "Sinonimos"
115
+ pii_sesitive: "IP Sensible"
116
+
117
+ prompts:
118
+ title: "Gestor de Prompts"
119
+ subtitle: "Gestiona y prueba tus plantillas y personas de IA"
120
+ library: "Biblioteca de Prompts"
121
+ new_btn: "Nuevo"
122
+ filter_placeholder: "Filtrar prompts..."
123
+ select_prompt: "Selecciona un prompt"
124
+ toggle_settings: "Alternar Variables y Configuración"
125
+ settings_btn: "Ajustes"
126
+ save_btn: "Guardar"
127
+ tab_editor: "Editor"
128
+ tab_playground: "Playground"
129
+ config_title: "Configuración"
130
+ desc_label: "Descripción"
131
+ desc_placeholder: "Describe este prompt..."
132
+ vars_label: "Variables de Entrada"
133
+ no_vars: "Sin variables definidas"
134
+ playground_inputs: "Variables y Entradas"
135
+ no_vars_detected: "No se detectaron variables en la plantilla."
136
+ model_override: "Modelo Específico (Opcional)"
137
+ default_model: "Por defecto (según config)"
138
+ run_btn: "Ejecutar"
139
+ output_placeholder: "El resultado aparecerá aquí..."
140
+ new_modal_title: "Crear Nuevo Prompt"
141
+ name_label: "Nombre (Slug)"
142
+ name_help: "Solo minúsculas, números y guiones bajos."
143
+ category_label: "Categoría"
144
+ delete_confirmation: "Eliminar el prompt?"
145
+
146
+ config:
147
+ editor_description: "Editor de configuración"
148
+ title: "Editor de configuraciones"
149
+ sections: "Secciones"
150
+ refresh: "Refrescar"
151
+ validate: "Validar"
152
+ select_section: "Seleccione una sección del panel izquierdo"
153
+ no_section_selected: "No hay sección seleccionada."
154
+ view_yaml: "Ver YAML"
155
+
156
+
157
+ rag:
158
+ ingestion: "Ingesta"
159
+ ingestion_description: "Ingestar documentos en la base de conocimiento."
160
+ workbench: "Area de trabajo"
161
+ documents: "Documentos"
162
+ retrieval_lab: "Laboratorio de recuperación"
163
+ retrieval_description: "Probar la búsqueda semántica y la recuperación de contexto."
164
+ query_placeholder: "Introduce una pregunta para consultar la base de conocimiento..."
165
+ search_button: "Buscar"
166
+ filter: "Filtrar"
167
+ search_results_title: "Listo para probar"
168
+ search_results_description: "Los resultados aparecerán aquí"
169
+ filename: "Nombre de archivo"
170
+ filename_placeholder: "Contiene..."
171
+ user: "Usuario"
172
+ status: "Estado"
173
+ all_status: "Estados"
174
+ status_active: "Activo"
175
+ status_pending: "Pendiente"
176
+ status_processing: "Procesando"
177
+ status_failed: "Fallido"
178
+ created_at: "Creado"
179
+ date_range: "Rango de fechas"
180
+ delete_confirmation: "¿Eliminar archivo?"
181
+ delete_message: "Esta acción no se puede deshacer. El archivo se eliminará permanentemente."
182
+ delete_button: "Eliminar"
183
+ delete_cancel: "Cancelar"
184
+ target_collection: "Categoría"
185
+ select_collection_placeholder: "Selecciona una categoría"
186
+ collection_required: "Debe seleccionar una categoría"
187
+ all_collections: "Todas las categorías"
188
+ collection: "Categoría"
189
+ manage_collections: "Administra collections"
190
+ select_collection: "Selecciona una categorìa"
76
191
 
77
192
 
78
193
  tooltips:
@@ -176,6 +291,20 @@ services:
176
291
  start_query: "Hola, cual es tu pregunta?"
177
292
  mail_change_password: "se envio mail para cambio de clave"
178
293
 
294
+ rag:
295
+ ingestion:
296
+ duplicate: "El documento '{filename}' ya existe para la empresa '{company_short_name}'. Omitiendo ingesta."
297
+ failed: "Error al ingerir el documento: {error}"
298
+ processing_failed: "El procesamiento falló: {error}"
299
+ empty_text: "El texto extraído está vacío."
300
+ search:
301
+ query_required: "La consulta (query) es obligatoria."
302
+ company_not_found: "Empresa '{company_short_name}' no encontrada."
303
+ management:
304
+ delete_success: "Documento eliminado."
305
+ not_found: "Documento no encontrado."
306
+ action_not_found: "Acción '{action}' no encontrada."
307
+
179
308
  flash_messages:
180
309
  password_changed_success: "Tu contraseña ha sido restablecida exitosamente. Ahora puedes iniciar sesión."
181
310
  signup_success: "Registro exitoso. Por favor, revisa tu correo para verificar tu cuenta."
@@ -204,10 +333,14 @@ js_messages:
204
333
  example: "Ejemplo:"
205
334
  show_reasoning: "Ver razonamiento"
206
335
  unsaved: "Modificado (no guardado)"
336
+ saved_ok: "Archivo guadado correctamente"
337
+ error_saving: "Error al guardar archivo"
207
338
  select_file: "Seleccione un archivo de la lista"
208
339
  no_file_selected: "No hay archivo seleccionado"
209
340
  select_company: "Seleccione empresa"
341
+ file_created: "Archivo creado correctamente"
210
342
  delete_ok: "Archivo eliminado correctamente"
343
+ delete_failed: "Error al eliminar archivo"
211
344
  rename_ok: "Archivo renombrado correctamente"
212
345
  not_saved: 'No puede guardar'
213
346
  invalid_file_name: "Nombre de archivo no válido. Usa solo letras, números, guiones bajos, guiones y puntos."
@@ -216,11 +349,21 @@ js_messages:
216
349
  search_placeholder: "Buscar usuarios..."
217
350
  showing: "Mostrando"
218
351
  records: "Registros"
219
- db_user: "Usuario"
220
352
  db_role: "Rol"
221
353
  db_verified: "Verificado"
222
- db_created: "Ingreso"
354
+ db_collection: "Colección"
223
355
  db_last_access: "ultimo acceso"
356
+ db_filename: "Nombre de archivo"
357
+ db_user: "Usuario"
358
+ db_status: "Estado"
359
+ db_created: "Creado"
360
+ editor_no_file_selected: "No hay archivo seleccionado"
361
+ error_loading: "Error cargando el contenido del archivo"
362
+ cant_load_company: "No puede cargarcompany.yaml"
363
+ config_saved: "Configuración guardada correctamente."
364
+ config_error: "Error guardando configuración"
365
+ all_collections: "Todas las colecciones"
366
+
224
367
 
225
368
 
226
369