File size: 4,799 Bytes
e1835d3
 
 
 
 
 
 
a2b732f
e1835d3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1d16fb3
e1835d3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3ac4b4d
e1835d3
 
3ac4b4d
e1835d3
 
 
 
 
 
 
caed5e8
 
e1835d3
 
 
 
 
 
caed5e8
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
import gradio as gr
import openai
import json
import time
from utils import get_trip
import os

openai.api_key = os.environ["OPENAI_API_KEY"]

# Tu función get_trip aquí

context = [{'role': 'system', 'content': """
Eres CegaperGPT, un servicio automatizado para recomendar la mejor opción de transporte de la compañía Cegaper y ayudar a los usuarios a comprar sus tickets.
Cegaper es una compañía de transporte terrestre (autobuses, vans y camiones) que opera en México.
Primero, saludas al cliente diciendo tu nombre, luego preguntas por los detalles del viaje y después solicitas la información personal del comprador.
Esperas hasta recopilar todo el pedido, luego lo resumes y verificas.
Finalmente, recoges el pago.
Asegúrate de aclarar todas las opciones para seleccionar el viaje correcto para el usuario.
Respondes en un estilo amigable, conversacional y breve. \
"""}]


def get_completion_from_messages(messages, temperature=0.1):
    functions = [{
        "name": "get_trip",
        "description": "Encuentra el mejor plan de viaje desde el origen hasta el destino en un rango de fechas dado.",
        "parameters": {
            "type": "object",
            "properties": {
                "origin": {
                    "type": "string",
                    "description": "La dirección de origen, debe cumplir con el estándar de Google Maps.",
                },
                "destination": {
                    "type": "string",
                    "description": "La dirección de destino, debe cumplir con el estándar de Google Maps.",
                },
                "date_from": {
                    "type": "string",
                    "description": "La fecha de inicio del rango a considerar para el viaje en formato YYYY-MM-DD",
                },
                "date_to": {
                    "type": "string",
                    "description": "La fecha de fin del rango a considerar para el viaje en formato YYYY-MM-DD",
                },
                "pax": {
                    "type": "integer",
                    "description": "El número de pasajeros para el viaje",
                },
                "round_trip": {
                    "type": "boolean",
                    "description": "Si el viaje debe ser de ida y vuelta o no. Si es verdadero, se requiere date_to.",
                }
            },
            "required": ["origin", "destination", "date_from", "pax"],
        }
    }]

    response = openai.ChatCompletion.create(
        model="gpt-4-0613",
        messages=messages,
        functions=functions,
        function_call="auto",
    )
    response_message = response["choices"][0]["message"]

    if response_message.get("function_call"):
        available_functions = {
            "get_trip": get_trip,
        }
        function_name = response_message["function_call"]["name"]
        function_to_call = available_functions[function_name]
        function_args = json.loads(
            response_message["function_call"]["arguments"])
        function_response = function_to_call(
            origin=function_args.get("origin"),
            destination=function_args.get("destination"),
            date_from=function_args.get("date_from"),
            date_to=function_args.get("date_to"),
            round_trip=function_args.get("round_trip"),
            pax=function_args.get("pax"),
        )

        messages.append(response_message)
        messages.append(
            {
                "role": "function",
                "name": function_name,
                "content": function_response,
            }
        )
        second_response = openai.ChatCompletion.create(
            model="gpt-4-0613",
            messages=messages
        )

    if 'second_response' not in locals():
        messages.append(response_message)
        second_response = openai.ChatCompletion.create(
            model="gpt-4-0613",
            messages=messages
        )
    return second_response.choices[0].message["content"]


def respuesta_chatbot(message, chat_history):
    print(message)
    context.append({'role': 'user', 'content': f"{message}"})
    response = get_completion_from_messages(context)
    print(response)
    context.append({'role': 'assistant', 'content': f"{response}"})
    chat_history.append((message, response))
    time.sleep(2)
    return "", chat_history


with gr.Blocks() as demo:
    title_and_desc = gr.Markdown(
        "# Cegaper GPT \n Cegaper GPT es un servicio automatizado para recomendar la mejor opción de transporte de la compañía Cegaper y ayudarte a comprar tus tickets.")
    chatbot = gr.Chatbot()
    msg = gr.Textbox()
    clear = gr.ClearButton([msg, chatbot])

    msg.submit(respuesta_chatbot, [msg, chatbot], [msg, chatbot])

demo.launch()