File size: 5,603 Bytes
45ba16d
 
 
900f49a
 
5804420
 
900f49a
 
fc4520c
900f49a
 
fc4520c
900f49a
 
 
 
 
 
fc4520c
900f49a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5804420
900f49a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5804420
900f49a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fc4520c
5804420
 
900f49a
06cd4e8
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
136
137
import warnings
warnings.filterwarnings("ignore", message="Can't initialize NVML")

import datetime
import requests
import gradio as gr
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline

# Detectar si hay GPU disponible, de lo contrario usar CPU (-1)
device = 0 if torch.cuda.is_available() else -1

# Cargar el modelo y el tokenizador (se usar谩 CPU si no hay GPU)
model_name = "microsoft/Phi-4-mini-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
if device == 0:
    model.to("cuda")

# Crear un pipeline de generaci贸n de texto utilizando el dispositivo adecuado
generator = pipeline("text-generation", model=model, tokenizer=tokenizer, device=device)

# Funci贸n para obtener las reservaciones de hotel filtradas por t铆tulo
def get_hotel_reservations(title_filter):
    url = "http://127.0.0.1:4000/api/accommodations"
    try:
        response = requests.get(url)
        if response.status_code == 200:
            data = response.json()  # Se espera que 'data' sea una lista de reservaciones
            summary = "Reservaciones de Hotel:\n\n"
            found = False
            for reservation in data:
                hotel_title = reservation.get("title", "N/A")
                # Filtrar solo las reservaciones que contengan el filtro en el t铆tulo
                if title_filter.lower() not in hotel_title.lower():
                    continue

                found = True
                hotel_id = reservation.get("id", "N/A")

                address = reservation.get("address", {})
                street = address.get("street", "N/A")
                zip_code = address.get("zip_code", "N/A")
                latitude = address.get("latitude", "N/A")
                longitude = address.get("longitude", "N/A")

                guests = reservation.get("guests", {})
                adult = guests.get("adult", "N/A")
                child = guests.get("child", "N/A")

                price = reservation.get("price", "N/A")

                summary += (
                    f"Reservaci贸n {hotel_id}:\n"
                    f"  - Hotel: {hotel_title}\n"
                    f"  - Direcci贸n: {street}, C贸digo Postal: {zip_code}\n"
                    f"    (Latitud: {latitude}, Longitud: {longitude})\n"
                    f"  - Hu茅spedes: {adult} adultos, {child} ni帽os\n"
                    f"  - Precio: {price}\n\n"
                )
            if not found:
                summary += f"No se encontraron reservaciones que coincidan con el filtro '{title_filter}'.\n"
            return summary
        else:
            return "Lo sentimos, no se pudieron obtener las reservaciones de hotel."
    except Exception as e:
        return f"Error al conectar con la API: {e}"

# Diccionario que asocia nombres de funciones a sus implementaciones
function_map = {
    "get_hotel_reservations": get_hotel_reservations,
}

# Definir la herramienta para function calling (煤til para documentar la funci贸n)
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_hotel_reservations",
            "description": "Obtiene una lista de reservaciones de hotel filtradas por un t铆tulo. El par谩metro 'title' permite especificar parte del nombre del hotel o regi贸n.",
            "parameters": {
                "type": "object",
                "properties": {
                    "title": {
                        "type": "string",
                        "description": "Parte del nombre del hotel o regi贸n, e.g., Medell铆n, Bogot谩, Cartagena"
                    }
                },
                "required": ["title"]
            }
        }
    }
]

def process_instruction(instruction: str):
    """
    Env铆a la instrucci贸n al modelo y verifica si se debe llamar a una funci贸n.
    Se espera que el modelo devuelva una cadena que contenga un llamado a funci贸n en el siguiente formato:
    "Llamada a funci贸n: get_hotel_reservations(Bogot谩)"
    """
    output = ""
    result = generator(instruction, max_length=150)[0]['generated_text']
    output += "Respuesta generada:\n" + result + "\n\n"
    
    if "Llamada a funci贸n:" in result:
        try:
            # Extraer la parte de la cadena que contiene el llamado a funci贸n
            start_index = result.find("Llamada a funci贸n:") + len("Llamada a funci贸n:")
            # Se asume que el llamado est谩 en una 煤nica l铆nea, por ejemplo: get_hotel_reservations(Bogot谩)
            call_str = result[start_index:].strip().split()[0]
            func_name, params = call_str.split("(", 1)
            params = params.rstrip(")")
            func_name = func_name.strip()
            params = params.strip()
            
            if func_name in function_map:
                function_result = function_map[func_name](params)
                output += "Resultado de la funci贸n:\n" + str(function_result)
            else:
                output += "Funci贸n no encontrada: " + func_name
        except Exception as e:
            output += "Error al procesar la llamada a funci贸n: " + str(e)
    else:
        output += "No se encontr贸 ninguna llamada a funci贸n en la respuesta."
    return output

# Crear una interfaz Gradio para interactuar con el sistema
iface = gr.Interface(
    fn=process_instruction,
    inputs=gr.Textbox(lines=5, placeholder="Escribe tu instrucci贸n aqu铆...", label="Instrucci贸n"),
    outputs="text",
    title="Demo de Function Calling con Phi-4-mini-instruct (CPU)"
)

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