Spaces:
Sleeping
Sleeping
File size: 4,387 Bytes
c407aa4 |
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 138 139 140 141 142 143 144 145 146 |
from openai.types.beta.threads import Message, MessageDelta
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
OPENAI_API_KEY = os_getenv('OPENAI_API_KEY')
client = openai.OpenAI(api_key=OPENAI_API_KEY)
assistant_id = "asst_NHnYFIdpvioacAJqWYMchJHI"
vector_id = "vs_sqT4VRRTwkH7JPr3AT8CpoXV"
class EventHandler(openai.AssistantEventHandler):
# def on_event(self, event):
# print(f"event: {event.event}\n{event.data}\n\n")
def on_tool_call_created(self, tool_call):
print(f"\nassistant > {tool_call.type}\n", flush=True)
def on_tool_call_delta(self, delta, snapshot):
if delta.type == 'code_interpreter':
if delta.code_interpreter.input:
print(delta.code_interpreter.input, end="", flush=True)
if delta.code_interpreter.outputs:
print(f"\n\noutput >", flush=True)
for output in delta.code_interpreter.outputs:
if output.type == "logs":
print(f"\n{output.logs}", flush=True)
def chat(user_message, history, state):
if 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,
)
with client.beta.threads.runs.stream(
thread_id=thread.id,
assistant_id=assistant_id,
event_handler=EventHandler(),
) as stream:
total = ''
for delta in stream.text_deltas:
total += delta
yield total
def chat_nostream(user_message, history, state):
if state['user'] is None:
return
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") 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=[["Que diferencias hay entre el cuerpo y 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)
|