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.
- iatoolkit/__init__.py +13 -35
- iatoolkit/base_company.py +74 -8
- iatoolkit/cli_commands.py +15 -23
- iatoolkit/common/__init__.py +0 -0
- iatoolkit/common/exceptions.py +46 -0
- iatoolkit/common/routes.py +141 -0
- iatoolkit/common/session_manager.py +24 -0
- iatoolkit/common/util.py +348 -0
- iatoolkit/company_registry.py +7 -8
- iatoolkit/iatoolkit.py +169 -96
- iatoolkit/infra/__init__.py +5 -0
- iatoolkit/infra/call_service.py +140 -0
- iatoolkit/infra/connectors/__init__.py +5 -0
- iatoolkit/infra/connectors/file_connector.py +17 -0
- iatoolkit/infra/connectors/file_connector_factory.py +57 -0
- iatoolkit/infra/connectors/google_cloud_storage_connector.py +53 -0
- iatoolkit/infra/connectors/google_drive_connector.py +68 -0
- iatoolkit/infra/connectors/local_file_connector.py +46 -0
- iatoolkit/infra/connectors/s3_connector.py +33 -0
- iatoolkit/infra/gemini_adapter.py +356 -0
- iatoolkit/infra/google_chat_app.py +57 -0
- iatoolkit/infra/llm_client.py +429 -0
- iatoolkit/infra/llm_proxy.py +139 -0
- iatoolkit/infra/llm_response.py +40 -0
- iatoolkit/infra/mail_app.py +145 -0
- iatoolkit/infra/openai_adapter.py +90 -0
- iatoolkit/infra/redis_session_manager.py +122 -0
- iatoolkit/locales/en.yaml +144 -0
- iatoolkit/locales/es.yaml +140 -0
- iatoolkit/repositories/__init__.py +5 -0
- iatoolkit/repositories/database_manager.py +110 -0
- iatoolkit/repositories/document_repo.py +33 -0
- iatoolkit/repositories/llm_query_repo.py +91 -0
- iatoolkit/repositories/models.py +336 -0
- iatoolkit/repositories/profile_repo.py +123 -0
- iatoolkit/repositories/tasks_repo.py +52 -0
- iatoolkit/repositories/vs_repo.py +139 -0
- iatoolkit/services/__init__.py +5 -0
- iatoolkit/services/auth_service.py +193 -0
- {services → iatoolkit/services}/benchmark_service.py +6 -6
- iatoolkit/services/branding_service.py +149 -0
- {services → iatoolkit/services}/dispatcher_service.py +39 -99
- {services → iatoolkit/services}/document_service.py +5 -5
- {services → iatoolkit/services}/excel_service.py +27 -21
- {services → iatoolkit/services}/file_processor_service.py +5 -5
- iatoolkit/services/help_content_service.py +30 -0
- {services → iatoolkit/services}/history_service.py +8 -16
- iatoolkit/services/i18n_service.py +104 -0
- {services → iatoolkit/services}/jwt_service.py +18 -27
- iatoolkit/services/language_service.py +77 -0
- {services → iatoolkit/services}/load_documents_service.py +19 -14
- {services → iatoolkit/services}/mail_service.py +5 -5
- iatoolkit/services/onboarding_service.py +43 -0
- {services → iatoolkit/services}/profile_service.py +155 -89
- {services → iatoolkit/services}/prompt_manager_service.py +26 -11
- {services → iatoolkit/services}/query_service.py +142 -104
- {services → iatoolkit/services}/search_service.py +21 -5
- {services → iatoolkit/services}/sql_service.py +24 -6
- {services → iatoolkit/services}/tasks_service.py +10 -10
- iatoolkit/services/user_feedback_service.py +103 -0
- iatoolkit/services/user_session_context_service.py +143 -0
- iatoolkit/static/images/fernando.jpeg +0 -0
- iatoolkit/static/js/chat_feedback_button.js +80 -0
- iatoolkit/static/js/chat_filepond.js +85 -0
- iatoolkit/static/js/chat_help_content.js +124 -0
- iatoolkit/static/js/chat_history_button.js +112 -0
- iatoolkit/static/js/chat_logout_button.js +36 -0
- iatoolkit/static/js/chat_main.js +364 -0
- iatoolkit/static/js/chat_onboarding_button.js +97 -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 +592 -0
- iatoolkit/static/styles/chat_modal.css +169 -0
- iatoolkit/static/styles/chat_public.css +107 -0
- iatoolkit/static/styles/landing_page.css +182 -0
- iatoolkit/static/styles/llm_output.css +115 -0
- iatoolkit/static/styles/onboarding.css +169 -0
- iatoolkit/system_prompts/query_main.prompt +5 -15
- iatoolkit/templates/_company_header.html +20 -0
- iatoolkit/templates/_login_widget.html +42 -0
- iatoolkit/templates/about.html +13 -0
- iatoolkit/templates/base.html +65 -0
- iatoolkit/templates/change_password.html +66 -0
- iatoolkit/templates/chat.html +287 -0
- iatoolkit/templates/chat_modals.html +181 -0
- iatoolkit/templates/error.html +51 -0
- iatoolkit/templates/forgot_password.html +50 -0
- iatoolkit/templates/index.html +145 -0
- iatoolkit/templates/login_simulation.html +34 -0
- iatoolkit/templates/onboarding_shell.html +104 -0
- iatoolkit/templates/signup.html +76 -0
- iatoolkit/views/__init__.py +5 -0
- iatoolkit/views/base_login_view.py +92 -0
- iatoolkit/views/change_password_view.py +117 -0
- iatoolkit/views/external_login_view.py +73 -0
- iatoolkit/views/file_store_api_view.py +65 -0
- iatoolkit/views/forgot_password_view.py +72 -0
- iatoolkit/views/help_content_api_view.py +54 -0
- iatoolkit/views/history_api_view.py +56 -0
- iatoolkit/views/home_view.py +61 -0
- iatoolkit/views/index_view.py +14 -0
- iatoolkit/views/init_context_api_view.py +73 -0
- iatoolkit/views/llmquery_api_view.py +57 -0
- iatoolkit/views/login_simulation_view.py +81 -0
- iatoolkit/views/login_view.py +153 -0
- iatoolkit/views/logout_api_view.py +49 -0
- iatoolkit/views/profile_api_view.py +46 -0
- iatoolkit/views/prompt_api_view.py +37 -0
- iatoolkit/views/signup_view.py +94 -0
- iatoolkit/views/tasks_api_view.py +72 -0
- iatoolkit/views/tasks_review_api_view.py +55 -0
- iatoolkit/views/user_feedback_api_view.py +60 -0
- iatoolkit/views/verify_user_view.py +62 -0
- {iatoolkit-0.4.2.dist-info → iatoolkit-0.66.2.dist-info}/METADATA +2 -2
- iatoolkit-0.66.2.dist-info/RECORD +119 -0
- {iatoolkit-0.4.2.dist-info → iatoolkit-0.66.2.dist-info}/top_level.txt +0 -1
- iatoolkit/system_prompts/arquitectura.prompt +0 -32
- iatoolkit-0.4.2.dist-info/RECORD +0 -32
- services/__init__.py +0 -5
- services/api_service.py +0 -75
- services/user_feedback_service.py +0 -67
- services/user_session_context_service.py +0 -85
- {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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
|
|
19
|
-
from services.sql_service import SqlService
|
|
20
|
-
from services.
|
|
21
|
-
from services.
|
|
22
|
-
from services.
|
|
23
|
-
from services.
|
|
24
|
-
from
|
|
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
|
-
#
|
|
3
|
-
#
|
|
4
|
-
#
|
|
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
|
|
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
|
|
13
|
-
|
|
14
|
-
|
|
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,
|
|
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.
|
|
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("
|
|
14
|
+
@app.cli.command("api-key")
|
|
23
15
|
@click.argument("company_short_name")
|
|
24
|
-
def
|
|
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
|
|
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
|
|
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()
|