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.
- iatoolkit/__init__.py +2 -6
- iatoolkit/base_company.py +9 -29
- iatoolkit/cli_commands.py +1 -1
- iatoolkit/common/routes.py +96 -52
- iatoolkit/common/session_manager.py +2 -1
- iatoolkit/common/util.py +17 -27
- iatoolkit/company_registry.py +1 -2
- iatoolkit/iatoolkit.py +97 -53
- iatoolkit/infra/llm_client.py +15 -20
- iatoolkit/infra/llm_proxy.py +38 -10
- iatoolkit/infra/openai_adapter.py +1 -1
- iatoolkit/infra/redis_session_manager.py +48 -2
- iatoolkit/locales/en.yaml +167 -0
- iatoolkit/locales/es.yaml +163 -0
- iatoolkit/repositories/database_manager.py +23 -3
- iatoolkit/repositories/document_repo.py +1 -1
- iatoolkit/repositories/models.py +35 -10
- iatoolkit/repositories/profile_repo.py +3 -2
- iatoolkit/repositories/vs_repo.py +26 -20
- iatoolkit/services/auth_service.py +193 -0
- iatoolkit/services/branding_service.py +70 -25
- iatoolkit/services/company_context_service.py +155 -0
- iatoolkit/services/configuration_service.py +133 -0
- iatoolkit/services/dispatcher_service.py +80 -105
- iatoolkit/services/document_service.py +5 -2
- iatoolkit/services/embedding_service.py +146 -0
- iatoolkit/services/excel_service.py +30 -26
- iatoolkit/services/file_processor_service.py +4 -12
- iatoolkit/services/history_service.py +7 -16
- iatoolkit/services/i18n_service.py +104 -0
- iatoolkit/services/jwt_service.py +18 -29
- iatoolkit/services/language_service.py +83 -0
- iatoolkit/services/load_documents_service.py +100 -113
- iatoolkit/services/mail_service.py +9 -4
- iatoolkit/services/profile_service.py +152 -76
- iatoolkit/services/prompt_manager_service.py +20 -16
- iatoolkit/services/query_service.py +208 -96
- iatoolkit/services/search_service.py +11 -4
- iatoolkit/services/sql_service.py +57 -25
- iatoolkit/services/tasks_service.py +1 -1
- iatoolkit/services/user_feedback_service.py +72 -34
- iatoolkit/services/user_session_context_service.py +112 -54
- iatoolkit/static/images/fernando.jpeg +0 -0
- iatoolkit/static/js/chat_feedback_button.js +80 -0
- iatoolkit/static/js/chat_help_content.js +124 -0
- iatoolkit/static/js/chat_history_button.js +110 -0
- iatoolkit/static/js/chat_logout_button.js +36 -0
- iatoolkit/static/js/chat_main.js +135 -222
- iatoolkit/static/js/chat_onboarding_button.js +103 -0
- iatoolkit/static/js/chat_prompt_manager.js +94 -0
- iatoolkit/static/js/chat_reload_button.js +35 -0
- iatoolkit/static/styles/chat_iatoolkit.css +289 -210
- iatoolkit/static/styles/chat_modal.css +63 -77
- iatoolkit/static/styles/chat_public.css +107 -0
- iatoolkit/static/styles/landing_page.css +182 -0
- iatoolkit/static/styles/onboarding.css +176 -0
- iatoolkit/system_prompts/query_main.prompt +5 -22
- iatoolkit/templates/_company_header.html +20 -0
- iatoolkit/templates/_login_widget.html +42 -0
- iatoolkit/templates/base.html +40 -20
- iatoolkit/templates/change_password.html +57 -36
- iatoolkit/templates/chat.html +180 -86
- iatoolkit/templates/chat_modals.html +138 -68
- iatoolkit/templates/error.html +44 -8
- iatoolkit/templates/forgot_password.html +40 -23
- iatoolkit/templates/index.html +145 -0
- iatoolkit/templates/login_simulation.html +45 -0
- iatoolkit/templates/onboarding_shell.html +107 -0
- iatoolkit/templates/signup.html +63 -65
- iatoolkit/views/base_login_view.py +91 -0
- iatoolkit/views/change_password_view.py +56 -31
- iatoolkit/views/embedding_api_view.py +65 -0
- iatoolkit/views/external_login_view.py +61 -28
- iatoolkit/views/{file_store_view.py → file_store_api_view.py} +10 -3
- iatoolkit/views/forgot_password_view.py +27 -21
- iatoolkit/views/help_content_api_view.py +54 -0
- iatoolkit/views/history_api_view.py +56 -0
- iatoolkit/views/home_view.py +50 -23
- iatoolkit/views/index_view.py +14 -0
- iatoolkit/views/init_context_api_view.py +74 -0
- iatoolkit/views/llmquery_api_view.py +58 -0
- iatoolkit/views/login_simulation_view.py +93 -0
- iatoolkit/views/login_view.py +130 -37
- iatoolkit/views/logout_api_view.py +49 -0
- iatoolkit/views/profile_api_view.py +46 -0
- iatoolkit/views/{prompt_view.py → prompt_api_view.py} +10 -10
- iatoolkit/views/signup_view.py +41 -36
- iatoolkit/views/{tasks_view.py → tasks_api_view.py} +10 -36
- iatoolkit/views/tasks_review_api_view.py +55 -0
- iatoolkit/views/user_feedback_api_view.py +60 -0
- iatoolkit/views/verify_user_view.py +34 -29
- {iatoolkit-0.11.0.dist-info → iatoolkit-0.71.2.dist-info}/METADATA +41 -23
- iatoolkit-0.71.2.dist-info/RECORD +122 -0
- iatoolkit-0.71.2.dist-info/licenses/LICENSE +21 -0
- iatoolkit/common/auth.py +0 -200
- iatoolkit/static/images/arrow_up.png +0 -0
- iatoolkit/static/images/diagrama_iatoolkit.jpg +0 -0
- iatoolkit/static/images/logo_clinica.png +0 -0
- iatoolkit/static/images/logo_iatoolkit.png +0 -0
- iatoolkit/static/images/logo_maxxa.png +0 -0
- iatoolkit/static/images/logo_notaria.png +0 -0
- iatoolkit/static/images/logo_tarjeta.png +0 -0
- iatoolkit/static/images/logo_umayor.png +0 -0
- iatoolkit/static/images/upload.png +0 -0
- iatoolkit/static/js/chat_feedback.js +0 -115
- iatoolkit/static/js/chat_history.js +0 -117
- iatoolkit/static/styles/chat_info.css +0 -53
- iatoolkit/templates/header.html +0 -31
- iatoolkit/templates/home.html +0 -199
- iatoolkit/templates/login.html +0 -43
- iatoolkit/templates/test.html +0 -9
- iatoolkit/views/chat_token_request_view.py +0 -98
- iatoolkit/views/chat_view.py +0 -58
- iatoolkit/views/download_file_view.py +0 -58
- iatoolkit/views/external_chat_login_view.py +0 -95
- iatoolkit/views/history_view.py +0 -57
- iatoolkit/views/llmquery_view.py +0 -65
- iatoolkit/views/tasks_review_view.py +0 -83
- iatoolkit/views/user_feedback_view.py +0 -74
- iatoolkit-0.11.0.dist-info/RECORD +0 -110
- {iatoolkit-0.11.0.dist-info → iatoolkit-0.71.2.dist-info}/WHEEL +0 -0
- {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,
|
|
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
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
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
|
|
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
iatoolkit/common/routes.py
CHANGED
|
@@ -3,80 +3,106 @@
|
|
|
3
3
|
#
|
|
4
4
|
# IAToolkit is open source software.
|
|
5
5
|
|
|
6
|
-
from flask import render_template, redirect,
|
|
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.
|
|
26
|
-
from iatoolkit.views.
|
|
27
|
-
from iatoolkit.views.
|
|
28
|
-
from iatoolkit.views.
|
|
29
|
-
from iatoolkit.views.
|
|
30
|
-
from iatoolkit.views.
|
|
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.
|
|
37
|
-
from iatoolkit.views.
|
|
38
|
-
from iatoolkit.views.
|
|
39
|
-
from iatoolkit.views.
|
|
40
|
-
from iatoolkit.views.
|
|
41
|
-
from iatoolkit.views.
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
#
|
|
46
|
-
app.add_url_rule('
|
|
35
|
+
# iatoolkit home page
|
|
36
|
+
app.add_url_rule('/', view_func=IndexView.as_view('index'))
|
|
47
37
|
|
|
48
|
-
#
|
|
49
|
-
app.add_url_rule('/<company_short_name>/
|
|
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
|
-
#
|
|
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
|
-
#
|
|
63
|
-
|
|
64
|
-
app.add_url_rule('/<company_short_name>/
|
|
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
|
-
|
|
72
|
-
|
|
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
|
-
|
|
76
|
-
|
|
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
|
+
|
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()
|
iatoolkit/company_registry.py
CHANGED
|
@@ -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
|
|
36
|
+
logging.error(f"Error while creating company instance for {company_key}: {e}")
|
|
38
37
|
logging.exception(e)
|
|
39
38
|
raise
|
|
40
39
|
|