iatoolkit 0.11.0__py3-none-any.whl → 0.71.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 (122) hide show
  1. iatoolkit/__init__.py +2 -6
  2. iatoolkit/base_company.py +9 -29
  3. iatoolkit/cli_commands.py +1 -1
  4. iatoolkit/common/routes.py +96 -52
  5. iatoolkit/common/session_manager.py +2 -1
  6. iatoolkit/common/util.py +17 -27
  7. iatoolkit/company_registry.py +1 -2
  8. iatoolkit/iatoolkit.py +97 -53
  9. iatoolkit/infra/llm_client.py +15 -20
  10. iatoolkit/infra/llm_proxy.py +38 -10
  11. iatoolkit/infra/openai_adapter.py +1 -1
  12. iatoolkit/infra/redis_session_manager.py +48 -2
  13. iatoolkit/locales/en.yaml +167 -0
  14. iatoolkit/locales/es.yaml +163 -0
  15. iatoolkit/repositories/database_manager.py +23 -3
  16. iatoolkit/repositories/document_repo.py +1 -1
  17. iatoolkit/repositories/models.py +35 -10
  18. iatoolkit/repositories/profile_repo.py +3 -2
  19. iatoolkit/repositories/vs_repo.py +26 -20
  20. iatoolkit/services/auth_service.py +193 -0
  21. iatoolkit/services/branding_service.py +70 -25
  22. iatoolkit/services/company_context_service.py +155 -0
  23. iatoolkit/services/configuration_service.py +133 -0
  24. iatoolkit/services/dispatcher_service.py +80 -105
  25. iatoolkit/services/document_service.py +5 -2
  26. iatoolkit/services/embedding_service.py +146 -0
  27. iatoolkit/services/excel_service.py +30 -26
  28. iatoolkit/services/file_processor_service.py +4 -12
  29. iatoolkit/services/history_service.py +7 -16
  30. iatoolkit/services/i18n_service.py +104 -0
  31. iatoolkit/services/jwt_service.py +18 -29
  32. iatoolkit/services/language_service.py +83 -0
  33. iatoolkit/services/load_documents_service.py +100 -113
  34. iatoolkit/services/mail_service.py +9 -4
  35. iatoolkit/services/profile_service.py +152 -76
  36. iatoolkit/services/prompt_manager_service.py +20 -16
  37. iatoolkit/services/query_service.py +208 -96
  38. iatoolkit/services/search_service.py +11 -4
  39. iatoolkit/services/sql_service.py +57 -25
  40. iatoolkit/services/tasks_service.py +1 -1
  41. iatoolkit/services/user_feedback_service.py +72 -34
  42. iatoolkit/services/user_session_context_service.py +112 -54
  43. iatoolkit/static/images/fernando.jpeg +0 -0
  44. iatoolkit/static/js/chat_feedback_button.js +80 -0
  45. iatoolkit/static/js/chat_help_content.js +124 -0
  46. iatoolkit/static/js/chat_history_button.js +110 -0
  47. iatoolkit/static/js/chat_logout_button.js +36 -0
  48. iatoolkit/static/js/chat_main.js +135 -222
  49. iatoolkit/static/js/chat_onboarding_button.js +103 -0
  50. iatoolkit/static/js/chat_prompt_manager.js +94 -0
  51. iatoolkit/static/js/chat_reload_button.js +35 -0
  52. iatoolkit/static/styles/chat_iatoolkit.css +289 -210
  53. iatoolkit/static/styles/chat_modal.css +63 -77
  54. iatoolkit/static/styles/chat_public.css +107 -0
  55. iatoolkit/static/styles/landing_page.css +182 -0
  56. iatoolkit/static/styles/onboarding.css +176 -0
  57. iatoolkit/system_prompts/query_main.prompt +5 -22
  58. iatoolkit/templates/_company_header.html +20 -0
  59. iatoolkit/templates/_login_widget.html +42 -0
  60. iatoolkit/templates/base.html +40 -20
  61. iatoolkit/templates/change_password.html +57 -36
  62. iatoolkit/templates/chat.html +180 -86
  63. iatoolkit/templates/chat_modals.html +138 -68
  64. iatoolkit/templates/error.html +44 -8
  65. iatoolkit/templates/forgot_password.html +40 -23
  66. iatoolkit/templates/index.html +145 -0
  67. iatoolkit/templates/login_simulation.html +45 -0
  68. iatoolkit/templates/onboarding_shell.html +107 -0
  69. iatoolkit/templates/signup.html +63 -65
  70. iatoolkit/views/base_login_view.py +91 -0
  71. iatoolkit/views/change_password_view.py +56 -31
  72. iatoolkit/views/embedding_api_view.py +65 -0
  73. iatoolkit/views/external_login_view.py +61 -28
  74. iatoolkit/views/{file_store_view.py → file_store_api_view.py} +10 -3
  75. iatoolkit/views/forgot_password_view.py +27 -21
  76. iatoolkit/views/help_content_api_view.py +54 -0
  77. iatoolkit/views/history_api_view.py +56 -0
  78. iatoolkit/views/home_view.py +50 -23
  79. iatoolkit/views/index_view.py +14 -0
  80. iatoolkit/views/init_context_api_view.py +74 -0
  81. iatoolkit/views/llmquery_api_view.py +58 -0
  82. iatoolkit/views/login_simulation_view.py +93 -0
  83. iatoolkit/views/login_view.py +130 -37
  84. iatoolkit/views/logout_api_view.py +49 -0
  85. iatoolkit/views/profile_api_view.py +46 -0
  86. iatoolkit/views/{prompt_view.py → prompt_api_view.py} +10 -10
  87. iatoolkit/views/signup_view.py +41 -36
  88. iatoolkit/views/{tasks_view.py → tasks_api_view.py} +10 -36
  89. iatoolkit/views/tasks_review_api_view.py +55 -0
  90. iatoolkit/views/user_feedback_api_view.py +60 -0
  91. iatoolkit/views/verify_user_view.py +34 -29
  92. {iatoolkit-0.11.0.dist-info → iatoolkit-0.71.2.dist-info}/METADATA +41 -23
  93. iatoolkit-0.71.2.dist-info/RECORD +122 -0
  94. iatoolkit-0.71.2.dist-info/licenses/LICENSE +21 -0
  95. iatoolkit/common/auth.py +0 -200
  96. iatoolkit/static/images/arrow_up.png +0 -0
  97. iatoolkit/static/images/diagrama_iatoolkit.jpg +0 -0
  98. iatoolkit/static/images/logo_clinica.png +0 -0
  99. iatoolkit/static/images/logo_iatoolkit.png +0 -0
  100. iatoolkit/static/images/logo_maxxa.png +0 -0
  101. iatoolkit/static/images/logo_notaria.png +0 -0
  102. iatoolkit/static/images/logo_tarjeta.png +0 -0
  103. iatoolkit/static/images/logo_umayor.png +0 -0
  104. iatoolkit/static/images/upload.png +0 -0
  105. iatoolkit/static/js/chat_feedback.js +0 -115
  106. iatoolkit/static/js/chat_history.js +0 -117
  107. iatoolkit/static/styles/chat_info.css +0 -53
  108. iatoolkit/templates/header.html +0 -31
  109. iatoolkit/templates/home.html +0 -199
  110. iatoolkit/templates/login.html +0 -43
  111. iatoolkit/templates/test.html +0 -9
  112. iatoolkit/views/chat_token_request_view.py +0 -98
  113. iatoolkit/views/chat_view.py +0 -58
  114. iatoolkit/views/download_file_view.py +0 -58
  115. iatoolkit/views/external_chat_login_view.py +0 -95
  116. iatoolkit/views/history_view.py +0 -57
  117. iatoolkit/views/llmquery_view.py +0 -65
  118. iatoolkit/views/tasks_review_view.py +0 -83
  119. iatoolkit/views/user_feedback_view.py +0 -74
  120. iatoolkit-0.11.0.dist-info/RECORD +0 -110
  121. {iatoolkit-0.11.0.dist-info → iatoolkit-0.71.2.dist-info}/WHEEL +0 -0
  122. {iatoolkit-0.11.0.dist-info → iatoolkit-0.71.2.dist-info}/top_level.txt +0 -0
iatoolkit/__init__.py CHANGED
@@ -5,20 +5,18 @@ IAToolkit Package
5
5
  # Expose main classes and functions at the top level of the package
6
6
 
7
7
  # main IAToolkit class
8
- from .iatoolkit import IAToolkit, current_iatoolkit, create_app
8
+ from .iatoolkit import IAToolkit, create_app, current_iatoolkit
9
9
 
10
10
  # for registering the client companies
11
11
  from .company_registry import register_company
12
12
  from .base_company import BaseCompany
13
- from iatoolkit.repositories.database_manager import DatabaseManager
14
13
 
15
14
  # --- Services ---
16
15
  from iatoolkit.services.query_service import QueryService
17
- from iatoolkit.services.sql_service import SqlService
18
16
  from iatoolkit.services.document_service import DocumentService
19
17
  from iatoolkit.services.search_service import SearchService
18
+ from iatoolkit.services.sql_service import SqlService
20
19
  from iatoolkit.services.load_documents_service import LoadDocumentsService
21
- from iatoolkit.services.excel_service import ExcelService
22
20
  from iatoolkit.infra.call_service import CallServiceClient
23
21
 
24
22
  __all__ = [
@@ -27,10 +25,8 @@ __all__ = [
27
25
  'current_iatoolkit',
28
26
  'register_company',
29
27
  'BaseCompany',
30
- 'DatabaseManager',
31
28
  'QueryService',
32
29
  'SqlService',
33
- 'ExcelService',
34
30
  'DocumentService',
35
31
  'SearchService',
36
32
  'LoadDocumentsService',
iatoolkit/base_company.py CHANGED
@@ -7,10 +7,9 @@
7
7
  from abc import ABC, abstractmethod
8
8
  from iatoolkit.repositories.profile_repo import ProfileRepo
9
9
  from iatoolkit.repositories.llm_query_repo import LLMQueryRepo
10
-
11
10
  from iatoolkit.services.prompt_manager_service import PromptService
12
11
  from iatoolkit.repositories.models import Company, Function, PromptCategory
13
- from iatoolkit import IAToolkit
12
+ from .iatoolkit import IAToolkit
14
13
 
15
14
 
16
15
  class BaseCompany(ABC):
@@ -21,15 +20,16 @@ class BaseCompany(ABC):
21
20
  self.llm_query_repo: LLMQueryRepo = injector.get(LLMQueryRepo)
22
21
  self.prompt_service: PromptService = injector.get(PromptService)
23
22
  self.company: Company | None = None
23
+ self.company_short_name: str
24
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, short_name: str, name: str, branding: dict | None = None) -> Company:
25
+ def _create_company(self,
26
+ short_name: str,
27
+ name: str,
28
+ parameters: dict | None = None,
29
+ ) -> Company:
30
30
  company_obj = Company(short_name=short_name,
31
31
  name=name,
32
- branding=branding)
32
+ parameters=parameters)
33
33
  self.company = self.profile_repo.create_company(company_obj)
34
34
  return self.company
35
35
 
@@ -69,20 +69,9 @@ class BaseCompany(ABC):
69
69
  **kwargs
70
70
  )
71
71
 
72
-
73
- @abstractmethod
74
- # initialize all the database tables needed
75
- def register_company(self):
76
- raise NotImplementedError("La subclase debe implementar el método create_company()")
77
-
78
72
  @abstractmethod
79
73
  # get context specific for this company
80
- def get_company_context(self, **kwargs) -> str:
81
- raise NotImplementedError("La subclase debe implementar el método get_company_context()")
82
-
83
- @abstractmethod
84
- # get context specific for this company
85
- def get_user_info(self, **kwargs) -> str:
74
+ def get_user_info(self, user_identifier: str) -> dict:
86
75
  raise NotImplementedError("La subclase debe implementar el método get_user_info()")
87
76
 
88
77
  @abstractmethod
@@ -90,15 +79,6 @@ class BaseCompany(ABC):
90
79
  def handle_request(self, tag: str, params: dict) -> dict:
91
80
  raise NotImplementedError("La subclase debe implementar el método handle_request()")
92
81
 
93
- @abstractmethod
94
- # get context specific for the query
95
- def start_execution(self):
96
- raise NotImplementedError("La subclase debe implementar el método start_execution()")
97
-
98
- @abstractmethod
99
- # get context specific for the query
100
- def get_metadata_from_filename(self, filename: str) -> dict:
101
- raise NotImplementedError("La subclase debe implementar el método get_query_context()")
102
82
 
103
83
  def register_cli_commands(self, app):
104
84
  """
iatoolkit/cli_commands.py CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  import click
7
7
  import logging
8
- from iatoolkit import IAToolkit
8
+ from .iatoolkit import IAToolkit
9
9
  from iatoolkit.services.profile_service import ProfileService
10
10
 
11
11
  def register_core_commands(app):
@@ -3,80 +3,106 @@
3
3
  #
4
4
  # IAToolkit is open source software.
5
5
 
6
- from flask import render_template, redirect, flash, url_for,send_from_directory, current_app, abort
7
- from iatoolkit.common.session_manager import SessionManager
6
+ from flask import render_template, redirect, url_for,send_from_directory, current_app, abort
8
7
  from flask import jsonify
9
- from iatoolkit.views.history_view import HistoryView
10
- import os
11
-
12
-
13
- def logout(company_short_name: str):
14
- SessionManager.clear()
15
- flash("Has cerrado sesión correctamente", "info")
16
- if company_short_name:
17
- return redirect(url_for('login', company_short_name=company_short_name))
18
- else:
19
- return redirect(url_for('home'))
20
8
 
21
9
 
22
10
  # this function register all the views
23
11
  def register_views(injector, app):
24
12
 
25
- from iatoolkit.views.llmquery_view import LLMQueryView
26
- from iatoolkit.views.tasks_view import TaskView
27
- from iatoolkit.views.tasks_review_view import TaskReviewView
28
- from iatoolkit.views.home_view import HomeView
29
- from iatoolkit.views.chat_view import ChatView
30
- from iatoolkit.views.login_view import LoginView
31
- from iatoolkit.views.external_chat_login_view import ExternalChatLoginView
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
32
19
  from iatoolkit.views.signup_view import SignupView
33
20
  from iatoolkit.views.verify_user_view import VerifyAccountView
34
21
  from iatoolkit.views.forgot_password_view import ForgotPasswordView
35
22
  from iatoolkit.views.change_password_view import ChangePasswordView
36
- from iatoolkit.views.file_store_view import FileStoreView
37
- from iatoolkit.views.user_feedback_view import UserFeedbackView
38
- from iatoolkit.views.prompt_view import PromptView
39
- from iatoolkit.views.chat_token_request_view import ChatTokenRequestView
40
- from iatoolkit.views.external_login_view import ExternalLoginView
41
- from iatoolkit.views.download_file_view import DownloadFileView
42
-
43
- app.add_url_rule('/', view_func=HomeView.as_view('home'))
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
+ from iatoolkit.views.embedding_api_view import EmbeddingApiView
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
44
34
 
45
- # main chat for iatoolkit front
46
- app.add_url_rule('/<company_short_name>/chat', view_func=ChatView.as_view('chat'))
35
+ # iatoolkit home page
36
+ app.add_url_rule('/', view_func=IndexView.as_view('index'))
47
37
 
48
- # front if the company internal portal
49
- app.add_url_rule('/<company_short_name>/chat_login', view_func=ExternalChatLoginView.as_view('external_chat_login'))
50
- app.add_url_rule('/<company_short_name>/external_login/<external_user_id>', view_func=ExternalLoginView.as_view('external_login'))
51
- app.add_url_rule('/auth/chat_token', view_func=ChatTokenRequestView.as_view('chat-token'))
38
+ # company home view
39
+ app.add_url_rule('/<company_short_name>/home', view_func=HomeView.as_view('home'))
52
40
 
53
- # main pages for the iatoolkit frontend
41
+ # login for the iatoolkit integrated frontend
54
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
55
78
  app.add_url_rule('/<company_short_name>/signup',view_func=SignupView.as_view('signup'))
56
- app.add_url_rule('/<company_short_name>/logout', 'logout', logout)
57
- app.add_url_rule('/logout', 'logout', logout)
58
79
  app.add_url_rule('/<company_short_name>/verify/<token>', view_func=VerifyAccountView.as_view('verify_account'))
59
80
  app.add_url_rule('/<company_short_name>/forgot-password', view_func=ForgotPasswordView.as_view('forgot_password'))
60
81
  app.add_url_rule('/<company_short_name>/change-password/<token>', view_func=ChangePasswordView.as_view('change_password'))
61
82
 
62
- # this are backend endpoints mainly
63
- app.add_url_rule('/<company_short_name>/llm_query', view_func=LLMQueryView.as_view('llm_query'))
64
- app.add_url_rule('/<company_short_name>/feedback', view_func=UserFeedbackView.as_view('feedback'))
65
- app.add_url_rule('/<company_short_name>/prompts', view_func=PromptView.as_view('prompt'))
66
- app.add_url_rule('/<company_short_name>/history', view_func=HistoryView.as_view('history'))
67
- app.add_url_rule('/tasks', view_func=TaskView.as_view('tasks'))
68
- app.add_url_rule('/tasks/review/<int:task_id>', view_func=TaskReviewView.as_view('tasks-review'))
69
- app.add_url_rule('/load', view_func=FileStoreView.as_view('load'))
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'))
70
86
 
71
- app.add_url_rule(
72
- '/about', # URL de la ruta
73
- view_func=lambda: render_template('about.html'))
87
+ # open the promt directory
88
+ app.add_url_rule('/<company_short_name>/api/prompts', view_func=PromptApiView.as_view('prompt'))
74
89
 
75
- app.add_url_rule('/version', 'version',
76
- lambda: jsonify({"version": app.config['VERSION']}))
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
+ # this endpoint is for generating embeddings for a given text
103
+ app.add_url_rule('/<company_short_name>/api/embedding',
104
+ view_func=EmbeddingApiView.as_view('embedding_api'))
77
105
 
78
- app.add_url_rule('/<company_short_name>/<external_user_id>/download-file/<path:filename>',
79
- view_func=DownloadFileView.as_view('download-file'))
80
106
 
81
107
  @app.route('/download/<path:filename>')
82
108
  def download_file(filename):
@@ -99,3 +125,21 @@ def register_views(injector, app):
99
125
  except FileNotFoundError:
100
126
  abort(404)
101
127
 
128
+ # login testing
129
+ app.add_url_rule('/<company_short_name>/login_test',
130
+ view_func=LoginSimulationView.as_view('login_test'))
131
+
132
+ app.add_url_rule(
133
+ '/about', # URL de la ruta
134
+ view_func=lambda: render_template('about.html'))
135
+
136
+ app.add_url_rule('/version', 'version',
137
+ lambda: jsonify({"iatoolkit_version": current_app.config.get('VERSION', 'N/A')}))
138
+
139
+
140
+ # hacer que la raíz '/' vaya al home de iatoolkit
141
+ @app.route('/')
142
+ def root_redirect():
143
+ return redirect(url_for('index'))
144
+
145
+
@@ -3,8 +3,9 @@
3
3
  #
4
4
  # IAToolkit is open source software.
5
5
 
6
- from flask import session
6
+ # This is the Flask connected session manager for IAToolkit
7
7
 
8
+ from flask import session
8
9
 
9
10
  class SessionManager:
10
11
  @staticmethod
iatoolkit/common/util.py CHANGED
@@ -9,7 +9,6 @@ from iatoolkit.common.exceptions import IAToolkitException
9
9
  from injector import inject
10
10
  import os
11
11
  from jinja2 import Environment, FileSystemLoader
12
- from iatoolkit.common.session_manager import SessionManager
13
12
  from datetime import datetime, date
14
13
  from decimal import Decimal
15
14
  import yaml
@@ -22,30 +21,8 @@ class Utility:
22
21
  def __init__(self):
23
22
  self.encryption_key = os.getenv('FERNET_KEY')
24
23
 
25
- @staticmethod
26
- def resolve_user_identifier(external_user_id: str = None, local_user_id: int = 0) -> tuple[str, bool]:
27
- """
28
- Resuelve un identificador único de usuario desde external_user_id o local_user_id.
29
-
30
- Lógica:
31
- - Si external_user_id existe y no está vacío: usar external_user_id
32
- - Si no, y local_user_id > 0: obtener email de la sesión actual y retornarlo como ID
33
- - Si ninguno: retornar string vacío
34
-
35
- """
36
- if external_user_id and external_user_id.strip():
37
- return external_user_id.strip(), False
38
- elif local_user_id and local_user_id > 0:
39
- # get the user information from the session
40
- user_data = SessionManager.get('user')
41
- if user_data:
42
- return user_data.get('email', ''), True
43
-
44
- return "", False
45
-
46
24
  def render_prompt_from_template(self,
47
25
  template_pathname: str,
48
- query: str = None,
49
26
  client_data: dict = {},
50
27
  **kwargs) -> str:
51
28
 
@@ -58,8 +35,6 @@ class Utility:
58
35
  env = Environment(loader=FileSystemLoader(template_dir))
59
36
  template = env.get_template(template_file)
60
37
 
61
- kwargs["query"] = query
62
-
63
38
  # add all the keys in client_data to kwargs
64
39
  kwargs.update(client_data)
65
40
 
@@ -74,7 +49,6 @@ class Utility:
74
49
  def render_prompt_from_string(self,
75
50
  template_string: str,
76
51
  searchpath: str | list[str] = None,
77
- query: str = None,
78
52
  client_data: dict = {},
79
53
  **kwargs) -> str:
80
54
  """
@@ -97,7 +71,6 @@ class Utility:
97
71
  env = Environment(loader=loader)
98
72
  template = env.from_string(template_string)
99
73
 
100
- kwargs["query"] = query
101
74
  kwargs.update(client_data)
102
75
 
103
76
  prompt = template.render(**kwargs)
@@ -108,6 +81,23 @@ class Utility:
108
81
  f'No se pudo renderizar el template desde el string, error: {str(e)}') from e
109
82
 
110
83
 
84
+ def get_company_template(self, company_short_name: str, template_name: str) -> str:
85
+ # 1. get the path to the company specific template
86
+ template_path = os.path.join(os.getcwd(), f'companies/{company_short_name}/templates/{template_name}')
87
+ if not os.path.exists(template_path):
88
+ return None
89
+
90
+ # 2. read the file
91
+ try:
92
+ with open(template_path, 'r') as f:
93
+ template_string = f.read()
94
+
95
+ return template_string
96
+ except Exception as e:
97
+ logging.exception(e)
98
+ return None
99
+
100
+
111
101
  def serialize(self, obj):
112
102
  if isinstance(obj, datetime) or isinstance(obj, date):
113
103
  return obj.isoformat()
@@ -31,10 +31,9 @@ class CompanyRegistry:
31
31
 
32
32
  # save the created instance in the registry
33
33
  self._company_instances[company_key] = company_instance
34
- logging.info(f"company '{company_key}' instantiated")
35
34
 
36
35
  except Exception as e:
37
- logging.error(f"Error instanciando empresa {company_key}: {e}")
36
+ logging.error(f"Error while creating company instance for {company_key}: {e}")
38
37
  logging.exception(e)
39
38
  raise
40
39