Cambios Realizados
1. Creación del archivo services.py
- Se creó un nuevo archivo llamado
services.py
en el que se definió la clase RoutineService
. Este archivo centraliza la lógica de interacción con la IA, desacoplando la generación de rutinas de las vistas.
2. Extracción de la lógica de generación de rutinas
- La lógica encargada de crear la plantilla para la IA, enviar la solicitud, y procesar la respuesta se movió a la clase
RoutineService
.
- Esto incluyó obtener los detalles del perfil del usuario (género, objetivo, condiciones médicas, deporte practicado, equipo de entrenamiento) y enviarlos al chatbot para generar una rutina.
3. Modificación de la vista rutinas()
- En lugar de incluir la lógica completa en la vista, ahora la vista se encarga únicamente de manejar la solicitud HTTP y de delegar el procesamiento al servicio
RoutineService
.
- Esto simplifica la vista y mejora su legibilidad y mantenibilidad.
4. Formato y estructura
- La clase
RoutineService
se encarga de recibir los datos del usuario, crear la solicitud para la IA en el formato adecuado, procesar la respuesta de la IA y devolver los datos formateados al frontend.
Código Anterior:
#views.py
def rutinas(request):
if request.method == 'POST':
if request.POST.get('action') == 'Go':
pass
user_input = request.POST.get('user_input')
place = request.POST.get('place')
perfil = Perfil.objects.get(user = request.user)
deporte = perfil.deporte_practicado
objetivo = perfil.objetivos
condiciones = perfil.condiciones_medicas
genero = perfil.genero
edad = perfil.fecha_Nacimiento
edad = calcular_edad(edad)
try:
equipa = Equipamiento_Del_Usuario.objects.get(user = request.user)
if place == 'Gym':
equipa = equipa.equp_gimnasio
if equipa == '':
equipa = 'No especificado'
else:
equipa = equipa.equp_casa
if equipa == '':
equipa = 'No especificado'
except ObjectDoesNotExist:
equipa = 'No especificado'
solicitud = '''Necesito que actues como un entrenador deportivo de alta calidad, tu proposito es dar excelente rutinas de ejercicio para las personas dependiendo de las distintas caracteristicas de la persona en si. La rutina que vas a proporcionar va a ser en formato json de la manera que te voy a decir a continuación: {"Tiempo_Aproximado" : "Tu respuesta", "Tiempo_de_Descanso": "Tu respuesta", "Calentamiento" : "Tu respuesta" , "Numero_de_series_por_ejercicio" : "Tu respuesta", "Ejercicios" : {"Ejercicio_1": "Tu respuesta", "Ejercicio_2": "Tu respuesta", "Ejercicio_3": "Tu respuesta - Numero de repeticiones", "Ejercicio_4": "Tu respuesta ", "Ejercicio_5": "Tu respuesta", "Ejercicio_6": "Tu respuesta",.....,"Ejercicio_n":"Tu respuesta"}}
'''+ f'''Las caracteristicas de la persona son las siguientes: Genero: {genero}, Objetivo: {objetivo}, Edad: {edad} años, Condiciones medicas: {condiciones}, Deporte practicado: {deporte}, Equipamiento para entrenar: {equipa}, Lugar de entreno: {place}
La cantidad de ejercicios depende de tu criterio o de lo que la persona especifique, lo mismo con la el tiempo aproximado y el tiempo de descanso. Estas son las cualidades especificas que quiere la persona en su rutina: {user_input}. Dado el caso que la persona no especifique nada, o lo que te haya dicho no tenga nada de relevancia, elige por ella lo mas adecuado basado en los datos que se te han dado.
Por ultimo solamente quiero que la respuesta que me des sea el json, no quiero que me des ningun mensaje mas para que des un mejor rendimiento.'''
respuestaVanilla = get_completion(solicitud)
respuestaDict = repuestaJson(respuestaVanilla)
return render(request, 'rutinas.html', {'respuestaV': respuestaVanilla, 'entreno': respuestaDict})
else:
return render(request, 'rutinas.html')
Código Actual:
#views.py
def rutinas(request):
if request.method == 'POST':
user_input = request.POST.get('user_input')
place = request.POST.get('place')
# Instanciar el servicio y generar la rutina
routine_service = RoutineService(request.user)
respuestaVanilla, respuestaDict = routine_service.generate_routine(user_input, place)
return render(request, 'rutinas.html', {'respuestaV': respuestaVanilla, 'entreno': respuestaDict})
else:
return render(request, 'rutinas.html')
#services.py
class RoutineService:
def __init__(self, user):
self.user = user
def get_user_profile(self):
# Obtener los detalles del perfil del usuario
perfil = Perfil.objects.get(user=self.user)
return {
'deporte': perfil.deporte_practicado,
'objetivo': perfil.objetivos,
'condiciones': perfil.condiciones_medicas,
'genero': perfil.genero,
'edad': calcular_edad(perfil.fecha_Nacimiento)
}
def get_user_equipment(self, place):
# Obtener el equipamiento del usuario
try:
equipa = Equipamiento_Del_Usuario.objects.get(user=self.user)
if place == 'Gym':
equipa = equipa.equp_gimnasio or 'No especificado'
else:
equipa = equipa.equp_casa or 'No especificado'
except ObjectDoesNotExist:
equipa = 'No especificado'
return equipa
def generate_routine(self, user_input, place):
# Obtener detalles del perfil y equipo del usuario
profile = self.get_user_profile()
equipa = self.get_user_equipment(place)
# Crear la solicitud con todos los parámetros relevantes
solicitud = '''Necesito que actues como un entrenador deportivo de alta calidad, tu proposito es dar excelente rutinas de ejercicio para las personas dependiendo de las distintas caracteristicas de la persona en si. La rutina que vas a proporcionar va a ser en formato json de la manera que te voy a decir a continuación: {"Tiempo_Aproximado" : "Tu respuesta", "Tiempo_de_Descanso": "Tu respuesta", "Calentamiento" : "Tu respuesta" , "Numero_de_series_por_ejercicio" : "Tu respuesta", "Ejercicios" : {"Ejercicio_1": "Tu respuesta", "Ejercicio_2": "Tu respuesta", "Ejercicio_3": "Tu respuesta - Numero de repeticiones", "Ejercicio_4": "Tu respuesta ", "Ejercicio_5": "Tu respuesta", "Ejercicio_6": "Tu respuesta",.....,"Ejercicio_n":"Tu respuesta"}}
'''+ f'''Las caracteristicas de la persona son las siguientes: Genero: {profile['genero']}, Objetivo: {profile['objetivo']}, Edad: {profile['edad']} años, Condiciones medicas: {profile['condiciones']}, Deporte practicado: {profile['deporte']}, Equipamiento para entrenar: {equipa}, Lugar de entreno: {place}
La cantidad de ejercicios depende de tu criterio o de lo que la persona especifique, lo mismo con la el tiempo aproximado y el tiempo de descanso. Estas son las cualidades especificas que quiere la persona en su rutina: {user_input}. Dado el caso que la persona no especifique nada, o lo que te haya dicho no tenga nada de relevancia, elige por ella lo mas adecuado basado en los datos que se te han dado.
Por ultimo solamente quiero que la respuesta que me des sea el json, no quiero que me des ningun mensaje mas para que des un mejor rendimiento.'''
# Llamar a la IA para obtener la respuesta
respuesta_vanilla = get_completion(solicitud)
respuesta_dict = self.process_response(respuesta_vanilla)
return respuesta_vanilla, respuesta_dict
def process_response(self, response):
# Procesar la respuesta de la IA (convertirla a JSON)
try:
return json.loads(response)
except json.JSONDecodeError:
return {}
Clase RoutineService
- get_user_profile: Este método obtiene los detalles del perfil del usuario como el género, deporte practicado, objetivo y condiciones médicas.
- get_user_equipment: Obtiene el equipo disponible para el usuario dependiendo de si entrena en el gimnasio o en casa.
- generate_routine: Este método crea la solicitud para el chatbot, enviando los datos obtenidos del usuario, y procesa la respuesta que devuelve la IA.
- process_response: Se encarga de convertir la respuesta del chatbot en formato JSON.