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)