CVchat / app.py
Aitor's picture
Validate OpenAI key before executing anything
c68dfb5
raw
history blame
2.27 kB
import os
import gradio as gr
import requests
from langchain.chains import RetrievalQA
from langchain.document_loaders import PDFMinerLoader
from langchain.indexes import VectorstoreIndexCreator
from langchain.llms import OpenAI
def set_openai_key(raw_key):
# Check if the API is valid
headers = {"Authorization": f"Bearer {raw_key}"}
response = requests.get("https://api.openai.com/v1/engines", headers=headers)
if response.status_code != 200:
raise gr.Error("API key is not valid. Check the key and try again.")
os.environ["OPENAI_API_KEY"] = raw_key
return gr.File.update(interactive=True)
def create_langchain(pdf_object):
loader = PDFMinerLoader(pdf_object.name)
index_creator = VectorstoreIndexCreator()
docsearch = index_creator.from_loaders([loader])
chain = RetrievalQA.from_chain_type(
llm=OpenAI(),
chain_type="stuff",
retriever=docsearch.vectorstore.as_retriever(),
input_key="question",
verbose=True,
return_source_documents=True,
)
return chain, gr.Button.update(interactive=True)
def ask_question(chain, question_text):
return chain({"question": question_text})["result"]
with gr.Blocks() as demo:
# Layout
oai_token = gr.Textbox(
label="OpenAI Token",
placeholder="Lm-iIas452gaw3erGtPar26gERGSA5RVkFJQST23WEG524EWEl",
)
pdf_object = gr.File(
label="Upload your CV in PDF format",
file_count="single",
type="file",
interactive=False,
)
question_placeholder = """
Enumerate the candidate's top 5 hard skills and rate them by importance from 0 to 5.
Example:
- Algebra 5/5
"""
question_box = gr.Textbox(label="Question", value=question_placeholder)
qa_button = gr.Button(value="Submit question", interactive=False)
# Sate objects
chain_state = gr.State()
# Actions
oai_token.change(set_openai_key, inputs=oai_token, outputs=pdf_object)
lchain = pdf_object.change(
create_langchain, inputs=pdf_object, outputs=[chain_state, qa_button]
)
qa_button.click(
ask_question,
inputs=[chain_state, question_box],
outputs=gr.Textbox(label="Answer"),
)
demo.launch(debug=True)