Dr-Chiozza / app.py
gera
apametrized ASSISTANT and VECTOR ID
4baeaea
raw
history blame
4.82 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
from openai import OpenAI
client = OpenAI()
assistant_id = os_getenv("OPENAI_ASSISTANT_ID")
vector_id = os_getenv("OPENAI_VECTOR_ID")
ANS_SHORT = "Resumida"
ANS_REGULAR = "Normal"
ANS_LONG = "Detallada"
def chat(user_message, history, state, long_or_short):
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
client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content=user_message,
)
details = ""
if state["user"] != "anonymous":
details += f"User's name is {state['user']}."
if long_or_short == ANS_SHORT:
details = "Please make a complete but short answer"
elif long_or_short == ANS_LONG:
details = "Please make complete and detailed answer. Long is better than short. Use tables and lists if you need it"
with client.beta.threads.runs.stream(
thread_id=thread.id,
assistant_id=assistant_id,
additional_instructions=details,
) 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,
theme=gr.themes.Base()) as demo:
state = new_state()
gr.HTML("""
<h1>Dr. Luis Chiozza - Medicina y Psicoanalisis</h1>
<p>Habla con la colección de Medicina y Psicoanalisis del Dr. Luis Chiozza</p>
""")
with gr.Row(variant="compact"):
gr.HTML("Largo de la respuesta")
long_or_short = gr.Radio(
choices = [ANS_SHORT, ANS_REGULAR, ANS_LONG],
value = ANS_REGULAR,
show_label=False,
container=False,
label = "Largo de la respuesta",
scale=3)
gr.ChatInterface(
chat,
additional_inputs=[state, long_or_short],
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=["."])