Dr-Chiozza / app.py
gera
send emails on new thread
2cc6fd0
raw
history blame
4.16 kB
from os import getenv as os_getenv, path as os_path
from time import sleep
from json import loads as json_loads
import gradio as gr
import openai
import yagmail
client = openai.OpenAI()
assistant_id = "asst_NHnYFIdpvioacAJqWYMchJHI"
vector_id = "vs_sqT4VRRTwkH7JPr3AT8CpoXV"
def send_email(thread):
mail_from = os_getenv("MAIL_FROM")
mail=yagmail.SMTP(
mail_from,
os_getenv("MAIL_PASS"),
host=os_getenv("MAIL_HOST"),
port=int(os_getenv("MAIL_PORT"))
)
mail.send(mail_from,f"New thread {thread.id}")
def chat(user_message, history, state):
if (state is None) or (not state['user']):
gr.Warning("You need to authenticate first")
yield
else:
thread = state['thread']
if thread is None:
thread = client.beta.threads.create(
tool_resources={
"file_search": {
"vector_store_ids": [vector_id]
}
}
)
state['thread'] = thread
send_email(thread)
client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content=user_message,
)
with client.beta.threads.runs.stream(
thread_id=thread.id,
assistant_id=assistant_id,
) as stream:
total = ''
for delta in stream.text_deltas:
total += delta
yield total
def chat_nostream(user_message, history, state):
if (state is None) or (not state['user']):
gr.Warning("You need to authenticate first")
yield
else:
thread = state['thread']
if thread is None:
thread = client.beta.threads.create(
tool_resources={
"file_search": {
"vector_store_ids": [vector_id]
}
}
)
state['thread'] = thread
# Add the user's message to the thread
client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content=user_message,
)
# Run the Assistant
run = client.beta.threads.runs.create(thread_id=thread.id,
assistant_id=assistant_id)
while True:
run_status = client.beta.threads.runs.retrieve(thread_id=thread.id,
run_id=run.id)
print(f"Run status: {run_status.status}")
if run_status.status == 'completed':
break
sleep(5)
messages = client.beta.threads.messages.list(thread_id=thread.id)
response = messages.data[0].content[0].text.value
yield response
def new_state():
return gr.State({
"user": None,
"thread": None,
})
def auth(token, state):
tokens=os_getenv("APP_TOKENS", None)
if tokens is None:
state["user"] = "anonymous"
else:
tokens=json_loads(tokens)
state["user"] = tokens.get(token, None)
return "", state
AUTH_JS = """function auth_js(token, state) {
if (!!document.location.hash) {
token = document.location.hash
document.location.hash=""
}
return [token, state]
}
"""
with gr.Blocks(title="Dr. Luis Chiozza - Medicina y Psicoanalisis", fill_height=True) as demo:
state = new_state()
gr.ChatInterface(
chat,
title="Dr. Luis Chiozza - Medicina y Psicoanalisis",
description="Habla con la colección de Medicina y Psicoanalisis del Dr. Luis Chiozza",
additional_inputs=[state],
examples=[
["Qué diferencias hay entre el cuerpo y el Alma?"],
["Cuáles son las distintas funciones de los órganos del cuerpo y su relación con el alma?"],
],
)
token = gr.Textbox(visible=False)
demo.load(auth,
[token,state],
[token,state],
js=AUTH_JS)
demo.launch(
height=700,
allowed_paths=["."])
# auth_dependency=authenticate) #auth=authenticate)