iatoolkit 0.4.2__py3-none-any.whl → 0.66.2__py3-none-any.whl

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 (123) hide show
  1. iatoolkit/__init__.py +13 -35
  2. iatoolkit/base_company.py +74 -8
  3. iatoolkit/cli_commands.py +15 -23
  4. iatoolkit/common/__init__.py +0 -0
  5. iatoolkit/common/exceptions.py +46 -0
  6. iatoolkit/common/routes.py +141 -0
  7. iatoolkit/common/session_manager.py +24 -0
  8. iatoolkit/common/util.py +348 -0
  9. iatoolkit/company_registry.py +7 -8
  10. iatoolkit/iatoolkit.py +169 -96
  11. iatoolkit/infra/__init__.py +5 -0
  12. iatoolkit/infra/call_service.py +140 -0
  13. iatoolkit/infra/connectors/__init__.py +5 -0
  14. iatoolkit/infra/connectors/file_connector.py +17 -0
  15. iatoolkit/infra/connectors/file_connector_factory.py +57 -0
  16. iatoolkit/infra/connectors/google_cloud_storage_connector.py +53 -0
  17. iatoolkit/infra/connectors/google_drive_connector.py +68 -0
  18. iatoolkit/infra/connectors/local_file_connector.py +46 -0
  19. iatoolkit/infra/connectors/s3_connector.py +33 -0
  20. iatoolkit/infra/gemini_adapter.py +356 -0
  21. iatoolkit/infra/google_chat_app.py +57 -0
  22. iatoolkit/infra/llm_client.py +429 -0
  23. iatoolkit/infra/llm_proxy.py +139 -0
  24. iatoolkit/infra/llm_response.py +40 -0
  25. iatoolkit/infra/mail_app.py +145 -0
  26. iatoolkit/infra/openai_adapter.py +90 -0
  27. iatoolkit/infra/redis_session_manager.py +122 -0
  28. iatoolkit/locales/en.yaml +144 -0
  29. iatoolkit/locales/es.yaml +140 -0
  30. iatoolkit/repositories/__init__.py +5 -0
  31. iatoolkit/repositories/database_manager.py +110 -0
  32. iatoolkit/repositories/document_repo.py +33 -0
  33. iatoolkit/repositories/llm_query_repo.py +91 -0
  34. iatoolkit/repositories/models.py +336 -0
  35. iatoolkit/repositories/profile_repo.py +123 -0
  36. iatoolkit/repositories/tasks_repo.py +52 -0
  37. iatoolkit/repositories/vs_repo.py +139 -0
  38. iatoolkit/services/__init__.py +5 -0
  39. iatoolkit/services/auth_service.py +193 -0
  40. {services → iatoolkit/services}/benchmark_service.py +6 -6
  41. iatoolkit/services/branding_service.py +149 -0
  42. {services → iatoolkit/services}/dispatcher_service.py +39 -99
  43. {services → iatoolkit/services}/document_service.py +5 -5
  44. {services → iatoolkit/services}/excel_service.py +27 -21
  45. {services → iatoolkit/services}/file_processor_service.py +5 -5
  46. iatoolkit/services/help_content_service.py +30 -0
  47. {services → iatoolkit/services}/history_service.py +8 -16
  48. iatoolkit/services/i18n_service.py +104 -0
  49. {services → iatoolkit/services}/jwt_service.py +18 -27
  50. iatoolkit/services/language_service.py +77 -0
  51. {services → iatoolkit/services}/load_documents_service.py +19 -14
  52. {services → iatoolkit/services}/mail_service.py +5 -5
  53. iatoolkit/services/onboarding_service.py +43 -0
  54. {services → iatoolkit/services}/profile_service.py +155 -89
  55. {services → iatoolkit/services}/prompt_manager_service.py +26 -11
  56. {services → iatoolkit/services}/query_service.py +142 -104
  57. {services → iatoolkit/services}/search_service.py +21 -5
  58. {services → iatoolkit/services}/sql_service.py +24 -6
  59. {services → iatoolkit/services}/tasks_service.py +10 -10
  60. iatoolkit/services/user_feedback_service.py +103 -0
  61. iatoolkit/services/user_session_context_service.py +143 -0
  62. iatoolkit/static/images/fernando.jpeg +0 -0
  63. iatoolkit/static/js/chat_feedback_button.js +80 -0
  64. iatoolkit/static/js/chat_filepond.js +85 -0
  65. iatoolkit/static/js/chat_help_content.js +124 -0
  66. iatoolkit/static/js/chat_history_button.js +112 -0
  67. iatoolkit/static/js/chat_logout_button.js +36 -0
  68. iatoolkit/static/js/chat_main.js +364 -0
  69. iatoolkit/static/js/chat_onboarding_button.js +97 -0
  70. iatoolkit/static/js/chat_prompt_manager.js +94 -0
  71. iatoolkit/static/js/chat_reload_button.js +35 -0
  72. iatoolkit/static/styles/chat_iatoolkit.css +592 -0
  73. iatoolkit/static/styles/chat_modal.css +169 -0
  74. iatoolkit/static/styles/chat_public.css +107 -0
  75. iatoolkit/static/styles/landing_page.css +182 -0
  76. iatoolkit/static/styles/llm_output.css +115 -0
  77. iatoolkit/static/styles/onboarding.css +169 -0
  78. iatoolkit/system_prompts/query_main.prompt +5 -15
  79. iatoolkit/templates/_company_header.html +20 -0
  80. iatoolkit/templates/_login_widget.html +42 -0
  81. iatoolkit/templates/about.html +13 -0
  82. iatoolkit/templates/base.html +65 -0
  83. iatoolkit/templates/change_password.html +66 -0
  84. iatoolkit/templates/chat.html +287 -0
  85. iatoolkit/templates/chat_modals.html +181 -0
  86. iatoolkit/templates/error.html +51 -0
  87. iatoolkit/templates/forgot_password.html +50 -0
  88. iatoolkit/templates/index.html +145 -0
  89. iatoolkit/templates/login_simulation.html +34 -0
  90. iatoolkit/templates/onboarding_shell.html +104 -0
  91. iatoolkit/templates/signup.html +76 -0
  92. iatoolkit/views/__init__.py +5 -0
  93. iatoolkit/views/base_login_view.py +92 -0
  94. iatoolkit/views/change_password_view.py +117 -0
  95. iatoolkit/views/external_login_view.py +73 -0
  96. iatoolkit/views/file_store_api_view.py +65 -0
  97. iatoolkit/views/forgot_password_view.py +72 -0
  98. iatoolkit/views/help_content_api_view.py +54 -0
  99. iatoolkit/views/history_api_view.py +56 -0
  100. iatoolkit/views/home_view.py +61 -0
  101. iatoolkit/views/index_view.py +14 -0
  102. iatoolkit/views/init_context_api_view.py +73 -0
  103. iatoolkit/views/llmquery_api_view.py +57 -0
  104. iatoolkit/views/login_simulation_view.py +81 -0
  105. iatoolkit/views/login_view.py +153 -0
  106. iatoolkit/views/logout_api_view.py +49 -0
  107. iatoolkit/views/profile_api_view.py +46 -0
  108. iatoolkit/views/prompt_api_view.py +37 -0
  109. iatoolkit/views/signup_view.py +94 -0
  110. iatoolkit/views/tasks_api_view.py +72 -0
  111. iatoolkit/views/tasks_review_api_view.py +55 -0
  112. iatoolkit/views/user_feedback_api_view.py +60 -0
  113. iatoolkit/views/verify_user_view.py +62 -0
  114. {iatoolkit-0.4.2.dist-info → iatoolkit-0.66.2.dist-info}/METADATA +2 -2
  115. iatoolkit-0.66.2.dist-info/RECORD +119 -0
  116. {iatoolkit-0.4.2.dist-info → iatoolkit-0.66.2.dist-info}/top_level.txt +0 -1
  117. iatoolkit/system_prompts/arquitectura.prompt +0 -32
  118. iatoolkit-0.4.2.dist-info/RECORD +0 -32
  119. services/__init__.py +0 -5
  120. services/api_service.py +0 -75
  121. services/user_feedback_service.py +0 -67
  122. services/user_session_context_service.py +0 -85
  123. {iatoolkit-0.4.2.dist-info → iatoolkit-0.66.2.dist-info}/WHEEL +0 -0
iatoolkit/__init__.py CHANGED
@@ -4,33 +4,22 @@ IAToolkit Package
4
4
 
5
5
  # Expose main classes and functions at the top level of the package
6
6
 
7
- # Assuming 'toolkit.py' contains the IAToolkit class
8
- from .iatoolkit import IAToolkit, create_app
9
- from .iatoolkit import current_iatoolkit
7
+ # main IAToolkit class
8
+ from .iatoolkit import IAToolkit, current_iatoolkit, create_app
10
9
 
11
- # Assuming 'app_factory.py' contains create_app and register_company
10
+ # for registering the client companies
12
11
  from .company_registry import register_company
13
-
14
- # Assuming 'base_company.py' contains BaseCompany
15
12
  from .base_company import BaseCompany
13
+ from iatoolkit.repositories.database_manager import DatabaseManager
16
14
 
17
15
  # --- Services ---
18
- # Assuming they are in a 'services' sub-package
19
- from services.sql_service import SqlService
20
- from services.excel_service import ExcelService
21
- from services.dispatcher_service import Dispatcher
22
- from services.document_service import DocumentService
23
- from services.search_service import SearchService
24
- from services.load_documents_service import LoadDocumentsService
25
- from repositories.profile_repo import ProfileRepo
26
- from repositories.llm_query_repo import LLMQueryRepo
27
- from services.query_service import QueryService
28
- from services.prompt_manager_service import PromptService
29
- from repositories.database_manager import DatabaseManager
30
- from infra.call_service import CallServiceClient
31
- from common.util import Utility
32
- from repositories.models import Base, Company, Function, TaskType, Prompt, PromptCategory
33
-
16
+ from iatoolkit.services.query_service import QueryService
17
+ from iatoolkit.services.sql_service import SqlService
18
+ from iatoolkit.services.document_service import DocumentService
19
+ from iatoolkit.services.search_service import SearchService
20
+ from iatoolkit.services.load_documents_service import LoadDocumentsService
21
+ from iatoolkit.services.excel_service import ExcelService
22
+ from iatoolkit.infra.call_service import CallServiceClient
34
23
 
35
24
  __all__ = [
36
25
  'IAToolkit',
@@ -38,23 +27,12 @@ __all__ = [
38
27
  'current_iatoolkit',
39
28
  'register_company',
40
29
  'BaseCompany',
30
+ 'DatabaseManager',
31
+ 'QueryService',
41
32
  'SqlService',
42
33
  'ExcelService',
43
- 'Dispatcher',
44
34
  'DocumentService',
45
35
  'SearchService',
46
- 'QueryService',
47
36
  'LoadDocumentsService',
48
- 'ProfileRepo',
49
- 'LLMQueryRepo',
50
- 'PromptService',
51
- 'DatabaseManager',
52
37
  'CallServiceClient',
53
- 'Utility',
54
- 'Company',
55
- 'Function',
56
- 'TaskType',
57
- 'Base',
58
- 'Prompt',
59
- 'PromptCategory'
60
38
  ]
iatoolkit/base_company.py CHANGED
@@ -1,17 +1,82 @@
1
1
  # Copyright (c) 2024 Fernando Libedinsky
2
- # Producto: IAToolkit
3
- # Todos los derechos reservados.
4
- # En trámite de registro en el Registro de Propiedad Intelectual de Chile.
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
5
 
6
6
  # companies/base_company.py
7
7
  from abc import ABC, abstractmethod
8
- from typing import Any
8
+ from iatoolkit.repositories.profile_repo import ProfileRepo
9
+ from iatoolkit.repositories.llm_query_repo import LLMQueryRepo
10
+
11
+ from iatoolkit.services.prompt_manager_service import PromptService
12
+ from iatoolkit.repositories.models import Company, Function, PromptCategory
13
+ from iatoolkit import IAToolkit
9
14
 
10
15
 
11
16
  class BaseCompany(ABC):
12
- def __init__(self, profile_repo: Any = None, llm_query_repo: Any = None):
13
- self.profile_repo = profile_repo
14
- self.llm_query_repo = llm_query_repo
17
+ def __init__(self):
18
+ # Obtener el inyector global y resolver las dependencias internamente
19
+ injector = IAToolkit.get_instance().get_injector()
20
+ self.profile_repo: ProfileRepo = injector.get(ProfileRepo)
21
+ self.llm_query_repo: LLMQueryRepo = injector.get(LLMQueryRepo)
22
+ self.prompt_service: PromptService = injector.get(PromptService)
23
+ self.company: Company | None = None
24
+
25
+ def _load_company_by_short_name(self, short_name: str) -> Company:
26
+ self.company = self.profile_repo.get_company_by_short_name(short_name)
27
+ return self.company
28
+
29
+ def _create_company(self,
30
+ short_name: str,
31
+ name: str,
32
+ parameters: dict | None = None,
33
+ branding: dict | None = None,
34
+ onboarding_cards: dict | None = None,
35
+ ) -> Company:
36
+ company_obj = Company(short_name=short_name,
37
+ name=name,
38
+ parameters=parameters,
39
+ branding=branding,
40
+ onboarding_cards=onboarding_cards)
41
+ self.company = self.profile_repo.create_company(company_obj)
42
+ return self.company
43
+
44
+ def _create_function(self, function_name: str, description: str, params: dict, **kwargs):
45
+ if not self.company:
46
+ raise ValueError("La compañía debe estar definida antes de crear una función.")
47
+
48
+ self.llm_query_repo.create_or_update_function(
49
+ Function(
50
+ company_id=self.company.id,
51
+ name=function_name,
52
+ description=description,
53
+ parameters=params,
54
+ system_function=False,
55
+ **kwargs
56
+ )
57
+ )
58
+
59
+ def _create_prompt_category(self, name: str, order: int) -> PromptCategory:
60
+ if not self.company:
61
+ raise ValueError("La compañía debe estar definida antes de crear una categoría.")
62
+
63
+ return self.llm_query_repo.create_or_update_prompt_category(
64
+ PromptCategory(name=name, order=order, company_id=self.company.id)
65
+ )
66
+
67
+ def _create_prompt(self, prompt_name: str, description: str, category: PromptCategory, order: int, **kwargs):
68
+ if not self.company:
69
+ raise ValueError("La compañía debe estar definida antes de crear un prompt.")
70
+
71
+ self.prompt_service.create_prompt(
72
+ prompt_name=prompt_name,
73
+ description=description,
74
+ order=order,
75
+ company=self.company,
76
+ category=category,
77
+ **kwargs
78
+ )
79
+
15
80
 
16
81
  @abstractmethod
17
82
  # initialize all the database tables needed
@@ -25,7 +90,7 @@ class BaseCompany(ABC):
25
90
 
26
91
  @abstractmethod
27
92
  # get context specific for this company
28
- def get_user_info(self, **kwargs) -> str:
93
+ def get_user_info(self, user_identifier: str) -> dict:
29
94
  raise NotImplementedError("La subclase debe implementar el método get_user_info()")
30
95
 
31
96
  @abstractmethod
@@ -49,5 +114,6 @@ class BaseCompany(ABC):
49
114
  """
50
115
  pass
51
116
 
117
+
52
118
  def unsupported_operation(self, tag):
53
119
  raise NotImplementedError(f"La operación '{tag}' no está soportada por esta empresa.")
iatoolkit/cli_commands.py CHANGED
@@ -1,31 +1,21 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
1
6
  import click
2
7
  import logging
3
8
  from iatoolkit import IAToolkit
4
- from services.dispatcher_service import Dispatcher
5
- from services.profile_service import ProfileService
9
+ from iatoolkit.services.profile_service import ProfileService
6
10
 
7
11
  def register_core_commands(app):
8
12
  """Registra los comandos CLI del núcleo de IAToolkit."""
9
-
10
- @app.cli.command("setup-all-companies")
11
- def setup_all_companies():
12
- """🗄️ Inicializa todas las compañías registradas en la base de datos."""
13
- try:
14
- dispatcher = IAToolkit.get_instance().get_injector().get(Dispatcher)
15
- click.echo("🚀 Inicializando base de datos y compañías...")
16
- dispatcher.setup_all_companies()
17
- click.echo("✅ Base de datos y compañías inicializadas correctamente.")
18
- except Exception as e:
19
- logging.exception(e)
20
- click.echo(f"❌ Error: {e}")
21
13
 
22
- @app.cli.command("setup-company")
14
+ @app.cli.command("api-key")
23
15
  @click.argument("company_short_name")
24
- def setup_company(company_short_name: str):
16
+ def api_key(company_short_name: str):
25
17
  """⚙️ Genera una nueva API key para una compañía ya registrada."""
26
18
  try:
27
- dispatcher = IAToolkit.get_instance().get_injector().get(Dispatcher)
28
- dispatcher.setup_all_companies()
29
19
  profile_service = IAToolkit.get_instance().get_injector().get(ProfileService)
30
20
  click.echo(f"🔑 Generando API key para '{company_short_name}'...")
31
21
  result = profile_service.new_api_key(company_short_name)
@@ -35,20 +25,22 @@ def register_core_commands(app):
35
25
  click.echo("👉 Asegúrate de que el nombre de la compañía es correcto y está registrada.")
36
26
  else:
37
27
  click.echo("✅ ¡Configuración lista! Agrega esta variable a tu entorno:")
38
- click.echo(f"IATOOLKIT_API_KEY={result['api-key']}")
28
+ click.echo(f"IATOOLKIT_API_KEY='{result['api-key']}'")
39
29
  except Exception as e:
40
30
  logging.exception(e)
41
31
  click.echo(f"❌ Ocurrió un error inesperado durante la configuración: {e}")
42
32
 
43
33
  @app.cli.command("encrypt-key")
44
34
  @click.argument("key")
45
- def api_key(key: str):
46
- from common.util import Utility
35
+ def encrypt_llm_api_key(key: str):
36
+ from iatoolkit.common.util import Utility
37
+
38
+
47
39
 
48
40
  util = IAToolkit.get_instance().get_injector().get(Utility)
49
41
  try:
50
42
  encrypt_key = util.encrypt_key(key)
51
- click.echo(f'la clave encriptada es: {encrypt_key} \n')
43
+ click.echo(f'la api-key del LLM encriptada es: {encrypt_key} \n')
52
44
  except Exception as e:
53
45
  logging.exception(e)
54
46
  click.echo(f"Error: {str(e)}")
@@ -56,7 +48,7 @@ def register_core_commands(app):
56
48
  @app.cli.command("exec-tasks")
57
49
  @click.argument("company_short_name")
58
50
  def exec_pending_tasks(company_short_name: str):
59
- from services.tasks_service import TaskService
51
+ from iatoolkit.services.tasks_service import TaskService
60
52
  task_service = IAToolkit.get_instance().get_injector().get(TaskService)
61
53
 
62
54
  try:
File without changes
@@ -0,0 +1,46 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
6
+ from enum import Enum
7
+
8
+
9
+ class IAToolkitException(Exception):
10
+
11
+ class ErrorType(Enum):
12
+ SYSTEM_ERROR = 0
13
+ DATABASE_ERROR = 1
14
+ LLM_ERROR = 2
15
+ CLOUD_STORAGE_ERROR = 3
16
+ DOCUMENT_NOT_FOUND = 4
17
+ INVALID_PARAMETER = 5
18
+ MISSING_PARAMETER = 6
19
+ PARAM_NOT_FILLED = 7
20
+ PERMISSION = 8
21
+ EXIST = 9
22
+ API_KEY = 10
23
+ CALL_ERROR = 11
24
+ PROMPT_ERROR = 12
25
+ FILE_FORMAT_ERROR = 13
26
+ FILE_IO_ERROR = 14
27
+ TEMPLATE_ERROR = 15
28
+ EXTERNAL_SOURCE_ERROR = 16
29
+ MAIL_ERROR = 17
30
+ CONFIG_ERROR = 18
31
+ INVALID_NAME = 19
32
+ REQUEST_ERROR = 20
33
+ TASK_EXECUTION_ERROR = 21
34
+ TASK_NOT_FOUND = 22
35
+ INVALID_STATE = 23
36
+ CRYPT_ERROR = 24
37
+ LOAD_DOCUMENT_ERROR = 25
38
+ INVALID_USER = 26
39
+ VECTOR_STORE_ERROR = 27
40
+
41
+
42
+
43
+ def __init__(self, error_type: ErrorType = ErrorType.SYSTEM_ERROR, message=None):
44
+ self.error_type = error_type
45
+ self.message = message
46
+ super().__init__(self.message)
@@ -0,0 +1,141 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
6
+ from flask import render_template, redirect, url_for,send_from_directory, current_app, abort
7
+ from flask import jsonify
8
+
9
+
10
+ # this function register all the views
11
+ def register_views(injector, app):
12
+
13
+ from iatoolkit.views.index_view import IndexView
14
+ from iatoolkit.views.init_context_api_view import InitContextApiView
15
+ from iatoolkit.views.llmquery_api_view import LLMQueryApiView
16
+ from iatoolkit.views.tasks_api_view import TaskApiView
17
+ from iatoolkit.views.tasks_review_api_view import TaskReviewApiView
18
+ from iatoolkit.views.login_simulation_view import LoginSimulationView
19
+ from iatoolkit.views.signup_view import SignupView
20
+ from iatoolkit.views.verify_user_view import VerifyAccountView
21
+ from iatoolkit.views.forgot_password_view import ForgotPasswordView
22
+ from iatoolkit.views.change_password_view import ChangePasswordView
23
+ from iatoolkit.views.file_store_api_view import FileStoreApiView
24
+ from iatoolkit.views.user_feedback_api_view import UserFeedbackApiView
25
+ from iatoolkit.views.prompt_api_view import PromptApiView
26
+ from iatoolkit.views.history_api_view import HistoryApiView
27
+ from iatoolkit.views.help_content_api_view import HelpContentApiView
28
+ from iatoolkit.views.profile_api_view import UserLanguageApiView # <-- Importa la nueva vista
29
+
30
+ from iatoolkit.views.login_view import LoginView, FinalizeContextView
31
+ from iatoolkit.views.external_login_view import ExternalLoginView, RedeemTokenApiView
32
+ from iatoolkit.views.logout_api_view import LogoutApiView
33
+ from iatoolkit.views.home_view import HomeView
34
+
35
+ # iatoolkit home page
36
+ app.add_url_rule('/', view_func=IndexView.as_view('index'))
37
+
38
+ # company home view
39
+ app.add_url_rule('/<company_short_name>/home', view_func=HomeView.as_view('home'))
40
+
41
+ # login for the iatoolkit integrated frontend
42
+ app.add_url_rule('/<company_short_name>/login', view_func=LoginView.as_view('login'))
43
+
44
+ # this is the login for external users
45
+ app.add_url_rule('/<company_short_name>/external_login',
46
+ view_func=ExternalLoginView.as_view('external_login'))
47
+
48
+ # this endpoint is called when onboarding_shell finish the context load
49
+ app.add_url_rule(
50
+ '/<company_short_name>/finalize',
51
+ view_func=FinalizeContextView.as_view('finalize_no_token')
52
+ )
53
+
54
+ app.add_url_rule(
55
+ '/<company_short_name>/finalize/<token>',
56
+ view_func=FinalizeContextView.as_view('finalize_with_token')
57
+ )
58
+
59
+ app.add_url_rule(
60
+ '/api/profile/language',
61
+ view_func=UserLanguageApiView.as_view('user_language_api')
62
+ )
63
+
64
+ # logout
65
+ app.add_url_rule('/<company_short_name>/api/logout',
66
+ view_func=LogoutApiView.as_view('logout'))
67
+
68
+ # this endpoint is called by the JS for changing the token for a session
69
+ app.add_url_rule('/<string:company_short_name>/api/redeem_token',
70
+ view_func = RedeemTokenApiView.as_view('redeem_token'))
71
+
72
+ # init (reset) the company context
73
+ app.add_url_rule('/<company_short_name>/api/init-context',
74
+ view_func=InitContextApiView.as_view('init-context'),
75
+ methods=['POST', 'OPTIONS'])
76
+
77
+ # register new user, account verification and forgot password
78
+ app.add_url_rule('/<company_short_name>/signup',view_func=SignupView.as_view('signup'))
79
+ app.add_url_rule('/<company_short_name>/verify/<token>', view_func=VerifyAccountView.as_view('verify_account'))
80
+ app.add_url_rule('/<company_short_name>/forgot-password', view_func=ForgotPasswordView.as_view('forgot_password'))
81
+ app.add_url_rule('/<company_short_name>/change-password/<token>', view_func=ChangePasswordView.as_view('change_password'))
82
+
83
+ # main chat query, used by the JS in the browser (with credentials)
84
+ # can be used also for executing iatoolkit prompts
85
+ app.add_url_rule('/<company_short_name>/api/llm_query', view_func=LLMQueryApiView.as_view('llm_query_api'))
86
+
87
+ # open the promt directory
88
+ app.add_url_rule('/<company_short_name>/api/prompts', view_func=PromptApiView.as_view('prompt'))
89
+
90
+ # toolbar buttons
91
+ app.add_url_rule('/<company_short_name>/api/feedback', view_func=UserFeedbackApiView.as_view('feedback'))
92
+ app.add_url_rule('/<company_short_name>/api/history', view_func=HistoryApiView.as_view('history'))
93
+ app.add_url_rule('/<company_short_name>/api/help-content', view_func=HelpContentApiView.as_view('help-content'))
94
+
95
+ # tasks management endpoints: create task, and review answer
96
+ app.add_url_rule('/tasks', view_func=TaskApiView.as_view('tasks'))
97
+ app.add_url_rule('/tasks/review/<int:task_id>', view_func=TaskReviewApiView.as_view('tasks-review'))
98
+
99
+ # this endpoint is for upload documents into the vector store (api-key)
100
+ app.add_url_rule('/api/load', view_func=FileStoreApiView.as_view('load_api'))
101
+
102
+
103
+ @app.route('/download/<path:filename>')
104
+ def download_file(filename):
105
+ """
106
+ Esta vista sirve un archivo previamente generado desde el directorio
107
+ configurado en IATOOLKIT_DOWNLOAD_DIR.
108
+ """
109
+ # Valida que la configuración exista
110
+ if 'IATOOLKIT_DOWNLOAD_DIR' not in current_app.config:
111
+ abort(500, "Error de configuración: IATOOLKIT_DOWNLOAD_DIR no está definido.")
112
+
113
+ download_dir = current_app.config['IATOOLKIT_DOWNLOAD_DIR']
114
+
115
+ try:
116
+ return send_from_directory(
117
+ download_dir,
118
+ filename,
119
+ as_attachment=True # Fuerza la descarga en lugar de la visualización
120
+ )
121
+ except FileNotFoundError:
122
+ abort(404)
123
+
124
+ # login testing
125
+ app.add_url_rule('/<company_short_name>/login_test',
126
+ view_func=LoginSimulationView.as_view('login_test'))
127
+
128
+ app.add_url_rule(
129
+ '/about', # URL de la ruta
130
+ view_func=lambda: render_template('about.html'))
131
+
132
+ app.add_url_rule('/version', 'version',
133
+ lambda: jsonify({"iatoolkit_version": current_app.config.get('VERSION', 'N/A')}))
134
+
135
+
136
+ # hacer que la raíz '/' vaya al home de iatoolkit
137
+ @app.route('/')
138
+ def root_redirect():
139
+ return redirect(url_for('index'))
140
+
141
+
@@ -0,0 +1,24 @@
1
+ # Copyright (c) 2024 Fernando Libedinsky
2
+ # Product: IAToolkit
3
+ #
4
+ # IAToolkit is open source software.
5
+
6
+ from flask import session
7
+
8
+ class SessionManager:
9
+ @staticmethod
10
+ def set(key, value):
11
+ session[key] = value
12
+
13
+ @staticmethod
14
+ def get(key, default=None):
15
+ return session.get(key, default)
16
+
17
+ @staticmethod
18
+ def remove(key):
19
+ if key in session:
20
+ session.pop(key)
21
+
22
+ @staticmethod
23
+ def clear():
24
+ session.clear()