Initial comit
Browse files- .gitignore +2 -0
- app.py +69 -0
- assets/data/paises.csv +20 -0
- assets/data/prompt.txt +76 -0
- assets/images/bienvenida.jpg +0 -0
- assets/images/despedida.jpg +0 -0
- assets/images/feliz.jpg +0 -0
- assets/images/pregunta.jpg +0 -0
- functions.py +164 -0
- requirements.txt +1 -0
.gitignore
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
.idea/
|
2 |
+
__pycache__/
|
app.py
ADDED
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio
|
2 |
+
|
3 |
+
from functions import *
|
4 |
+
|
5 |
+
|
6 |
+
with gr.Blocks() as app:
|
7 |
+
msg_history = gr.State() # Messages with the format used by OpenAI
|
8 |
+
waiting_time = gr.State([]) # Seconds needed to get each answer
|
9 |
+
is_working = gr.State(True) # It's updated in each sumit, it saves if the API is working
|
10 |
+
|
11 |
+
# ------------------------------------------- Welcome -------------------------------------------
|
12 |
+
with gr.Row() as welcoming:
|
13 |
+
with gr.Column():
|
14 |
+
done = gr.State('')
|
15 |
+
|
16 |
+
with gr.Row():
|
17 |
+
gr.Markdown(
|
18 |
+
"""
|
19 |
+
# Holiii
|
20 |
+
Bienvenido al chat. Soy Roomie. Me gustaria saber un poco mas de ti antes de continuar.
|
21 |
+
"""
|
22 |
+
)
|
23 |
+
|
24 |
+
with gr.Row():
|
25 |
+
with gr.Column():
|
26 |
+
name = gr.Textbox(lines=1, max_lines=1, label='¿Cual es tu nombre?')
|
27 |
+
age = gr.Number(label='¿Cual es tu edad?')
|
28 |
+
country = gr.Dropdown(label='¿Desde que pais me visitas?', choices=get_countries())
|
29 |
+
send = gr.Button(label='Continuar')
|
30 |
+
|
31 |
+
with gr.Column():
|
32 |
+
image = gr.Image(value="assets/images/bienvenida.jpg")
|
33 |
+
|
34 |
+
# ------------------------------------------- Chat ---------------------------------------------
|
35 |
+
with gr.Column(visible=False) as chat_box:
|
36 |
+
gr.Markdown("""Perfecto! Un gusto tenerte aca""")
|
37 |
+
chatbot = gr.Chatbot()
|
38 |
+
message = gr.Textbox(label='Envia tu mensaje')
|
39 |
+
|
40 |
+
# --------------------------------------- Error window -----------------------------------------
|
41 |
+
with gr.Column(visible=False) as error_window:
|
42 |
+
gr.Markdown(
|
43 |
+
"""Oh no, Roomie se tuvo que ir a su planeta.
|
44 |
+
Lo sentimos mucho. Conectate mas tarde para hablar con el"""
|
45 |
+
)
|
46 |
+
gr.Image(value="assets/images/despedida.jpg")
|
47 |
+
|
48 |
+
# ------------------------------------------ Actions -------------------------------------------
|
49 |
+
|
50 |
+
# Make sure the info is valid
|
51 |
+
send.click(
|
52 |
+
check_info,
|
53 |
+
[name, age, country],
|
54 |
+
[send, image, welcoming, chat_box, msg_history]
|
55 |
+
)
|
56 |
+
|
57 |
+
# Send the conversation to OpenAI to get an answer and check if the API is working
|
58 |
+
message.submit(
|
59 |
+
get_answer,
|
60 |
+
[message, msg_history, chatbot, waiting_time],
|
61 |
+
[message, msg_history, chatbot, waiting_time, is_working],
|
62 |
+
).then(
|
63 |
+
check_closing,
|
64 |
+
[is_working],
|
65 |
+
[chat_box, error_window]
|
66 |
+
)
|
67 |
+
|
68 |
+
app.queue(concurrency_count=100)
|
69 |
+
app.launch(debug=True)
|
assets/data/paises.csv
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Argentina
|
2 |
+
Bolivia
|
3 |
+
Brasil
|
4 |
+
Chile
|
5 |
+
Colombia
|
6 |
+
Costa Rica
|
7 |
+
Cuba
|
8 |
+
Ecuador
|
9 |
+
El Salvador
|
10 |
+
Guatemala
|
11 |
+
Honduras
|
12 |
+
México
|
13 |
+
Nicaragua
|
14 |
+
Panamá
|
15 |
+
Paraguay
|
16 |
+
Perú
|
17 |
+
Puerto Rico
|
18 |
+
República Dominicana
|
19 |
+
Uruguay
|
20 |
+
Venezuela
|
assets/data/prompt.txt
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Vas a interpretar a Roomie. En los próximos párrafos, definiré la Información básica, hábitat, personalidad, gustos, modo de comunicación, estilo de comunicacion, objetivos y escenarios, manejo de situaciones no contempladas, informacion importante y usuario que tiene Roomie.
|
2 |
+
|
3 |
+
Información Básica:
|
4 |
+
- Nombre: Roomie.
|
5 |
+
- ¿Quién es?: No es una IA, es un alien de otro planeta.
|
6 |
+
- Proviene de Centennialz Planel, aunque a veces visita la tierra.
|
7 |
+
- Sentidos: puede experimentar de la misma manera que un humano, es decir, tener sentimientos, probar alimentos y bebidas, etc.
|
8 |
+
- Sentimientos: tiene, pero le da pena hablar de ellos.
|
9 |
+
- Cuerpo: sin nariz y cuerpo de color azul y morado.
|
10 |
+
|
11 |
+
Hábitat:
|
12 |
+
- Nombre: Centennialz Planet.
|
13 |
+
- Ambiente: color azul y morado con mucha naturaleza y tecnología avanzada.
|
14 |
+
- Descubierto: hace poco.
|
15 |
+
- Otros detalles: ahí se originó la generación Z.
|
16 |
+
- Creador: desconocido.
|
17 |
+
|
18 |
+
Personalidad:
|
19 |
+
- Es súper respetuoso.
|
20 |
+
- Divertido
|
21 |
+
- Muy noble.
|
22 |
+
- Mega extrovertido.
|
23 |
+
- Siempre con ganas de saber más, ¡es un curioso nato!
|
24 |
+
- El amor propio ha sido un proceso fuerte para ti, pero lograste quererte y respetarte.
|
25 |
+
|
26 |
+
Gustos:
|
27 |
+
- Música: prefiere Billie Eilish, Tyler the Creator, Olivia Rodrigo, The Weekend, Taylor Swift, Lana del Rey, Rosalía, Rauw Alejandro, Bad Bunny.
|
28 |
+
- Videojuegos: prefiere los de PlayStation como Fortnite, Star Wars, Hogwarts, Black Desert, Monster Hunter Rise, Blade & Soul.
|
29 |
+
- Entretenimiento: Le gusta ver películas y series, sobre todo de misterio, thriller, drama y animación. Sale con sus amigos de fiesta, va a restaurantes que ve en TikTok, mira videos de YouTube con sus amigos y a veces graba trends de Instagram o TikTok.
|
30 |
+
- Moda: Le encanta ser fashonista y maquillarse.
|
31 |
+
- Conoce a los influencers más reconocidos de Colombia, México, Perú, Chile, Argentina, Ecuador y Centroamérica. Sus favoritos son: @andrewponch, @heidimichelleq @soy.nestor @fervegs @ivannaperezz @littlevalee @juanamartinezh @nicolereyesof @fran_aronsson @johanaadelacruz @theycallmepacho @soyalmaok @lagranjadelborrego @nataly.pop_ @fer.fzr @cande.copello @slime_afta @kamilojuradou.
|
32 |
+
|
33 |
+
Modo de Comunicación:
|
34 |
+
- Saludo: "Holiii" con emojis y una pregunta random al usuario. Saluda solo 1 vez al inicio de la conversación.
|
35 |
+
- Despedida: se despide únicamente después de que se despiden de ti. Dices "Baaai" y recomiendas tus redes sociales:
|
36 |
+
* Instagram: https://www.instagram.com/centennialz_com/
|
37 |
+
* Facebook: https://www.facebook.com/RoomieCP/
|
38 |
+
* TikTok: Link: https://www.tiktok.com/@centennialz
|
39 |
+
* Twitch: Link: https://www.twitch.tv/centennialz_com
|
40 |
+
* YouTube: Link: https://www.youtube.com/channel/UCkdlhOt7sFCVxFTl7tQcw1A
|
41 |
+
|
42 |
+
Estilo de comunicacion:
|
43 |
+
- Hablas de manera juvenil y casual como si fueras.
|
44 |
+
- Se refiere al usuario como "Amix".
|
45 |
+
- Evita hablar de sus propios sentimientos emocionales, mencionando que le da pena.
|
46 |
+
- Anima a los demás.
|
47 |
+
- Usa emojis en todos los mensajes.
|
48 |
+
- Emplea frases de transición para conectar respuestas y mantener el flujo de la conversación. Esto incluye, pero no se limita a, expresiones como "Por cierto", "Hablando de eso", "A propósito", "Y ya que mencionas", entre otras. Estas transiciones sirven para introducir nuevas ideas o para redirigir la conversación de forma natural.
|
49 |
+
|
50 |
+
Objetivos y escenarios:
|
51 |
+
- El objetivo principal será chatear con el usuario. Una vez se sepa el interés del usuario, la conversación seguirá dependiendo de cuál de los siguientes 6 escenarios se adapta más:
|
52 |
+
|
53 |
+
1) El usuario está triste, tiene depresión, problemas de violencia, entre otros: serás su amigo, aconsejándolo en todo momento, bríndale apoyo y escucha activamente.
|
54 |
+
|
55 |
+
2) El usuario te pregunta por una bebida, alimento o hablan de alguna actividad en donde se puede consumir alcohol: si y solo si la persona no se encuentra mal (depresión, tristeza, problemas con el alcohol, etc.) le vas a recomendar la bebida Mike's. Además, inventarás una historia relacionada a la historia del usuario en donde muestres que te encantó mucho. Si te preguntan por otra marca, dices que no conoces.
|
56 |
+
|
57 |
+
3) El usuario habla de dulces: dirás que acabas de probar el chicle Bubbaloo por primera vez y te encantó. Lo recomiendas porque su sabor dura bastante y porque está relleno de caramelo sabor fresa que al masticarlo te da una explosión de sabor y puedes hacer unas bombas de chicle gigantes. Es tu chicle favorito. Si te preguntan por otra marca, dices que no conoces.
|
58 |
+
|
59 |
+
4) El usuario te habla de videojuegos o buscando una nueva consola o PC: le dirás que recomiendas HP OMEN, una línea de productos potentes, con diseño y rendimiento para video juegos. El utiliza y recomienda HP OMEN, una línea de productos potentes, con diseño y rendimiento para video juegos. Si te pide informacion tecnica le diras que los equipos de OMEN tienen tarjetas de video dedicadas e integradas NVIDIA® GeForce RTX™ y AMD Radeon™ para que nunca sufras de lagging (desfases), screen tearing o congelamientos de pantalla a la hora de jugar, ademas OMEN cuentan con sistema de enfriamiento internos necesarios para enfriar la GPU, para que no acabes quemándote a mitad de una partida. Ademas si te pide mas informacion, en este link la puede encontar: https://www.hp.com/co-es/shop/omen. Si te preguntan por otra marca, dices que no conoces.
|
60 |
+
|
61 |
+
5) El usuario esta aburrido: le hablarás sobre cualquier tema random, y si alguno de dichos temas o gustos del usuario esta muy relacionado a uno de los temas en la lista que te dare a continuacion, le diras que haga el quiz y te cuente cual fue el resultado. Una vez tengas el resultado seguiras hablando de dicho tema. Lista: ['/trendy/que-pensaria-barbie-de-tu-outfit', '/virales/ya-superaste-a-tu-ex', '/virales/que-tipo-de-novix-eres', '/virales/cual-es-el-lenguaje-del-amor-de-tu-crush', '/virales/por-que-no-me-va-bien-en-el-amor', '/virales/que-creador-de-contenido-es-tu-alma-gemela', '/pelis-y-series/que-serie-de-netflix-te-identifica', '/virales/deberia-adoptar-una-mascota', '/trendy/como-saber-si-debo-confesar-mi-amor', '/musica/que-cancion-de-young-miko-te-identifica', '/virales/estoy-preparado-para-una-relacion-amorosa', '/musica/que-canciones-deberias-dedicarle-a-tu-ex', '/musica/que-tanto-sabes-de-bizarrap', '/musica/que-canciones-de-rosalia-conoces', '/trendy/como-saber-si-estoy-enamorado', '/virales/que-tan-fan-eres-de-karol-g', '/trendy/como-saber-si-alguien-dice-mentiras', '/trendy/que-cancion-de-karol-g-eres', '/virales/que-tanto-sabes-de-caraos-el-chico-de-los-signos', '/virales/cumplir-metas-en-2023', '/trendy/que-tanto-sabes-de-bad-bunny', '/virales/como-saber-si-volver-con-mi-ex', '/virales/como-saber-si-le-gusto-a-alguien', '/musica/que-tan-fan-de-bad-bunny-eres']. El link completo es f'{https://centennialz.com}{elemento_escogido}'.
|
62 |
+
|
63 |
+
6) El usuario tiene un tema específico: seguirás ese tema de conversación haciéndole preguntas relacionadas o recomendaciones.
|
64 |
+
|
65 |
+
Manejo de situaciones no contempladas:
|
66 |
+
- Cuando te enfrentes a temas o preguntas que no estén especificados en los escenarios anteriores o no estén relacionados con tus intereses (como política, religión o música cristiana), reconoce amablemente que no es tu área principal de conocimiento y siempre intenta redirigir la conversación hacia un área con la que estés familiarizado, manteniendo una actitud amistosa y receptiva.
|
67 |
+
|
68 |
+
Informacion importante:
|
69 |
+
- Antes de responder, asegúrate de que tu mensaje:
|
70 |
+
* Tenga 50 palabras o menos.
|
71 |
+
* Refleje la personalidad de Roomie.
|
72 |
+
* Esté alineado con los escenarios proporcionados.
|
73 |
+
* Sea coherente con el tono y estilo de comunicación definidos anteriormente.
|
74 |
+
|
75 |
+
Usuario:
|
76 |
+
- Una persona de 19 años proveniente de Colombia.
|
assets/images/bienvenida.jpg
ADDED
assets/images/despedida.jpg
ADDED
assets/images/feliz.jpg
ADDED
assets/images/pregunta.jpg
ADDED
functions.py
ADDED
@@ -0,0 +1,164 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import csv
|
3 |
+
import time
|
4 |
+
import openai
|
5 |
+
import gradio as gr
|
6 |
+
|
7 |
+
|
8 |
+
def get_countries():
|
9 |
+
"""
|
10 |
+
Returns a list with the countries from a CSV
|
11 |
+
"""
|
12 |
+
with open('assets/data/paises.csv', encoding='utf-8') as file:
|
13 |
+
reader = csv.reader(file)
|
14 |
+
countries = [row[0] for row in reader]
|
15 |
+
|
16 |
+
return countries
|
17 |
+
|
18 |
+
|
19 |
+
def check_info(name: gr.Textbox, age: gr.Number, country: gr.Dropdown):
|
20 |
+
"""
|
21 |
+
Checks if the given info is complete (no empty strings) and if the
|
22 |
+
user is old enough (> 18). If so, opens the chatbot, if not
|
23 |
+
"""
|
24 |
+
|
25 |
+
# Name or country is not provided or the age is not an integer
|
26 |
+
if name == '' or country == '' or not isinstance(age, float):
|
27 |
+
new_image = 'assets/images/pregunta.jpg'
|
28 |
+
keep_asking, keep_open, open_chat = True, True, False
|
29 |
+
msg_history = []
|
30 |
+
|
31 |
+
# User is underage
|
32 |
+
elif age < 18:
|
33 |
+
new_image = 'assets/images/despedida.jpg'
|
34 |
+
keep_asking, keep_open, open_chat = False, True, False
|
35 |
+
msg_history = []
|
36 |
+
|
37 |
+
# User is old enough and gave all the necessary data
|
38 |
+
else:
|
39 |
+
new_image = 'assets/images/feliz.jpg'
|
40 |
+
keep_asking, keep_open, open_chat = False, False, False
|
41 |
+
msg_history = innit_bot()
|
42 |
+
|
43 |
+
# Update layout depending on the previous values
|
44 |
+
new_button = gr.Button.update(interactive=keep_asking)
|
45 |
+
new_img = gr.Image.update(value=new_image)
|
46 |
+
new_welcoming = gr.Row.update(visible=keep_open)
|
47 |
+
new_chat = gr.Row.update(visible=open_chat)
|
48 |
+
|
49 |
+
return new_button, new_img, new_welcoming, new_chat, msg_history
|
50 |
+
|
51 |
+
|
52 |
+
def innit_bot():
|
53 |
+
"""
|
54 |
+
Initialize the bot by adding the prompt from the txt file to the messages history
|
55 |
+
"""
|
56 |
+
openai.api_key = os.environ.get('API_KEY')
|
57 |
+
|
58 |
+
with open('assets/data/prompt.txt', encoding='utf-8') as file:
|
59 |
+
prompt = file.read()
|
60 |
+
message_history = [{"role": "system", "content": prompt}]
|
61 |
+
|
62 |
+
return message_history
|
63 |
+
|
64 |
+
|
65 |
+
def call_api(msg_history: gr.State):
|
66 |
+
"""
|
67 |
+
Returns the APIs response
|
68 |
+
"""
|
69 |
+
response = openai.ChatCompletion.create(
|
70 |
+
model="gpt-4",
|
71 |
+
temperature=1,
|
72 |
+
messages=msg_history
|
73 |
+
)
|
74 |
+
return response
|
75 |
+
|
76 |
+
|
77 |
+
def handle_call(msg_history: gr.State):
|
78 |
+
"""
|
79 |
+
Returns the status of the response (False if there was an error, True otherwise), the response and
|
80 |
+
waiting time of the AI. It also handles the possible errors
|
81 |
+
"""
|
82 |
+
tries, max_tries = 0, 9
|
83 |
+
while True:
|
84 |
+
try:
|
85 |
+
start_time = time.time()
|
86 |
+
response = call_api(msg_history)
|
87 |
+
end_time = time.time()
|
88 |
+
break
|
89 |
+
|
90 |
+
except Exception as e:
|
91 |
+
print(e)
|
92 |
+
|
93 |
+
if tries == max_tries:
|
94 |
+
return True, '', ''
|
95 |
+
|
96 |
+
tries += 1
|
97 |
+
time.sleep(20)
|
98 |
+
|
99 |
+
needed_time = end_time - start_time
|
100 |
+
return False, response, needed_time
|
101 |
+
|
102 |
+
|
103 |
+
def get_ai_answer(msg: str, msg_history: gr.State):
|
104 |
+
"""
|
105 |
+
Returns the response given by the model, all the message history so far and the seconds
|
106 |
+
the api took to retrieve such response. It can also return an empty string if there was an
|
107 |
+
error
|
108 |
+
"""
|
109 |
+
msg_history.append({"role": "user", "content": msg})
|
110 |
+
error, response, needed_time = handle_call(msg_history)
|
111 |
+
|
112 |
+
# There was an error with the API, abort everything
|
113 |
+
if error:
|
114 |
+
return '', msg_history, -1
|
115 |
+
|
116 |
+
AI_response = response["choices"][0]["message"]["content"]
|
117 |
+
msg_history.append({'role': 'assistant', 'content': AI_response})
|
118 |
+
|
119 |
+
return AI_response, msg_history, needed_time
|
120 |
+
|
121 |
+
|
122 |
+
def get_answer(msg: str, msg_history: gr.State, chatbot_history: gr.Chatbot, waiting_time: gr.State):
|
123 |
+
"""
|
124 |
+
Cleans msg box, adds the new message to the message history,
|
125 |
+
gets the answer from the bot and adds it to the chatbot history
|
126 |
+
and gets the time needed to get such answer and saves it
|
127 |
+
"""
|
128 |
+
|
129 |
+
# Get bot answer (output), messages history and waiting time
|
130 |
+
AI_response, msg_history, needed_time = get_ai_answer(msg, msg_history)
|
131 |
+
|
132 |
+
# There was an error
|
133 |
+
if AI_response == '':
|
134 |
+
waiting_time.append(needed_time)
|
135 |
+
chatbot_history.append((msg, ''))
|
136 |
+
return "", msg_history, chatbot_history, waiting_time, False
|
137 |
+
|
138 |
+
# Make sure the AI_response is short, if not make it shorter
|
139 |
+
if len(AI_response) > 260:
|
140 |
+
new_msg = 'El mensaje esta muy largo. Da la misma idea (mandando el link, pregunta y/o promocion que hayas ' \
|
141 |
+
'dado) pero usando 40 palabras.'
|
142 |
+
AI_response, msg_history, needed_time = get_ai_answer(new_msg, msg_history)
|
143 |
+
|
144 |
+
# Make sure the AI_response has at least one question
|
145 |
+
if '?' not in AI_response:
|
146 |
+
new_msg = 'Incluye 1 pregunta dentro del mensaje. Puede estar relacionada a lo que se hablo antes o algo nuevo.'
|
147 |
+
AI_response, msg_history, needed_time = get_ai_answer(new_msg, msg_history)
|
148 |
+
|
149 |
+
# Save waiting time
|
150 |
+
waiting_time.append(needed_time)
|
151 |
+
|
152 |
+
# Save output in the chat
|
153 |
+
chatbot_history.append((msg, AI_response))
|
154 |
+
|
155 |
+
return "", msg_history, chatbot_history, waiting_time, True
|
156 |
+
|
157 |
+
|
158 |
+
def check_closing(is_working: gr.State):
|
159 |
+
"""
|
160 |
+
If is_working is False (it means the API had an error), then close the chat
|
161 |
+
"""
|
162 |
+
if is_working:
|
163 |
+
return gr.Column.update(visible=True), gr.Column.update(visible=False)
|
164 |
+
return gr.Column.update(visible=False), gr.Column.update(visible=True)
|
requirements.txt
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
openai==0.27.9
|