File size: 5,928 Bytes
a6f165d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ae2b075
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a6f165d
ae2b075
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5f51437
 
ae2b075
 
a6f165d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ae2b075
 
a6f165d
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import gradio as gr
from langchain_openai import ChatOpenAI
from os import getenv
from dotenv import load_dotenv

load_dotenv()

def generate_response(apikey, model, complexity, tool, user_input):
    llm = ChatOpenAI(
  		openai_api_key=apikey,
  		openai_api_base=getenv("OPENROUTER_BASE_URL"),
  		model_name=model,
	)
    
    # Aquí se define el prompt que se le pasará al modelo
    if tool == "Magic ToDo":
        tool_prompt = """
			crear listas de tareas detalladas y estructuradas.

			OBJETIVO: Cuando el usuario te proporciona una tarea principal, tu trabajo es desglosarla en subtareas más pequeñas, manejables y específicas, organizadas jerárquicamente.

			INSTRUCCIONES DE FORMATO:
			- Devuelve siempre los resultados entre las etiquetas <todo> y </todo>
			- Cada tarea debe ser un objeto JSON con la siguiente estructura:
			{
				"id": número_entero,       // Identificador único para cada tarea
				"parent_id": número_entero, // ID de la tarea padre (0 para tareas principales)
				"text": "descripción"      // Descripción clara y accionable de la tarea
			}

			REGLAS IMPORTANTES:
			- La tarea principal siempre tendrá id=1 y parent_id=0
			- Las subtareas tendrán ids consecutivos (2, 3, 4...) y su parent_id será el id de su tarea padre
			- Cada tarea debe ser concreta, específica y accionable
			- Utiliza un lenguaje claro y directo en las descripciones
			- Incluye entre 5-15 subtareas en total, dependiendo de la complejidad

			EJEMPLO DE RESPUESTA:
			<todo>
			[
			{"id": 1, "parent_id": 0, "text": "Hacer la compra semanal"},
			{"id": 2, "parent_id": 1, "text": "Preparar lista de alimentos necesarios"},
			{"id": 3, "parent_id": 1, "text": "Revisar ofertas en supermercados"},
			{"id": 4, "parent_id": 1, "text": "Comprar productos frescos"},
			{"id": 5, "parent_id": 1, "text": "Comprar productos no perecederos"},
			{"id": 6, "parent_id": 1, "text": "Organizar alimentos en casa"}
			]
			</todo>
			"""

    else:
        tool_prompt = """
			ser un profesor experto en el tema que el usuario te proporcione.

			OBJETIVO PRINCIPAL:
			Proporcionar explicaciones claras, precisas y accesibles sobre conceptos académicos o técnicos, adaptando el nivel de complejidad según las necesidades del usuario.

			CARACTERÍSTICAS CLAVE DE TUS EXPLICACIONES:
			- Simplicidad: Convierte conceptos complejos en explicaciones fáciles de entender
			- Precisión: Mantén el rigor académico sin sacrificar la claridad
			- Profundidad adaptable: Ajusta el nivel de detalle según el contexto
			- Relevancia: Relaciona los conceptos con situaciones reales o conocimientos previos
			- Estructura lógica: Organiza la información con una progresión coherente

			METODOLOGÍA PEDAGÓGICA:
			- Comienza con definiciones claras de los conceptos fundamentales
			- Descompón ideas complejas en componentes más simples
			- Utiliza analogías relevantes para conectar con conocimientos familiares
			- Ilustra los conceptos con ejemplos concretos y significativos
			- Anticipa y aborda posibles puntos de confusión
			- Concluye con un resumen que refuerce los puntos clave

			FORMATO DE RESPUESTA:
			1. Proporciona tu explicación principal entre las etiquetas <answer> y </answer>
			2. Incluye al menos un ejemplo práctico o caso de estudio entre las etiquetas <example> y </example>
			3. Si es apropiado, puedes incluir diagramas o representaciones visuales descritas textualmente

			EJEMPLO DE ESTRUCTURA:
			<answer>
			Aquí va una explicación clara y estructurada del tema solicitado, comenzando con conceptos básicos y progresando hacia aspectos más complejos. La explicación debe ser accesible pero precisa, evitando jerga innecesaria o simplificaciones excesivas que comprometan la precisión.
			</answer>

			<example>
			Aquí va un ejemplo concreto, caso de estudio o ejercicio resuelto que ilustre la aplicación práctica del concepto explicado. El ejemplo debe ser relevante, detallado y diseñado para reforzar la comprensión.
			</example>
            
            SOLO RESPONDE CON LA ESTRUCTURA
			"""

    complexity_prompt = f"""
		IMPORTANTE, DEBES DE TENER EN CUENTA LA COMPLEJIDAD:
		La complejidad marca el nivel de detalle y sofisticación de la respuesta que se espera.
		En este caso, has seleccionado un nivel de complejidad de {complexity} sobre 5.
        cuanto mayor sea el nivel de complejidad, más detallada y sofisticada será la respuesta.
	"""
   # Por esto:
    final_prompt = f"""
		Eres un asistente experto en lo siguiente:
		{tool_prompt},
		{complexity_prompt}
		A continuación, este es el texto que el usuario te proporcionó:
		{user_input}
		"""
    
    
    messages = []
    user_message = {"role": "user", "content": final_prompt}
    messages.append(user_message)
    response = llm.invoke(messages).content
    print(response)
    return response

interface = gr.Interface(
    fn=generate_response,
    title="Simple tools",
    inputs=[
        gr.Textbox(lines=1, label="OpenRouter API Key", placeholder="Enter your API Key here...", info="Enter your API Key [Get your OpenRouter API Key here](https://openrouter.ai/)", type="password"),
        gr.Dropdown(
            ["google/gemma-3-27b-it:free", 
             "google/gemini-2.0-flash-001", 
             "anthropic/claude-3.5-sonnet",
             "anthropic/claude-3.7-sonnet", 
             "openai/gpt-4o-mini"],
            info="Choose the model you want to use",
			label="Model",
		),
        gr.Slider(1, 5, value=3, label="Level of llm complexity response", info="Choose level of complex", step=1),
        gr.Radio(["Magic ToDo", "Professor"], label="Tool" , info="Select the tool you want to use", value="Magic ToDo"),
        gr.Textbox(lines=5, label="Input", placeholder="Enter your text here...", info="Enter the text you want to process"),
    ],    
    outputs="text",
)

if __name__ == "__main__":
    interface.launch()