SyedHasanCronosPMC commited on
Commit
2d4da20
Β·
verified Β·
1 Parent(s): 3680ae3

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +74 -0
app.py ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import tempfile
3
+ import gradio as gr
4
+ from langchain.document_loaders import PyPDFLoader, YoutubeLoader
5
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
6
+ from langchain_openai import OpenAIEmbeddings
7
+ from langchain_community.vectorstores import FAISS
8
+ from langchain.chains import RetrievalQA
9
+ from langchain.chat_models import init_chat_model
10
+
11
+ # --- API KEY HANDLING ---
12
+ OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") or os.getenv("openai")
13
+ if not OPENAI_API_KEY:
14
+ raise ValueError("❌ OPENAI API Key not found. Please add it to secrets as 'OPENAI_API_KEY' or 'openai'.")
15
+
16
+ # --- GRADIO PIPELINE FUNCTION ---
17
+ def process_inputs(pdf_file, youtube_url, query):
18
+ docs = []
19
+
20
+ # Load PDF
21
+ try:
22
+ with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp:
23
+ tmp.write(pdf_file.read())
24
+ pdf_path = tmp.name
25
+ pdf_loader = PyPDFLoader(pdf_path)
26
+ docs.extend(pdf_loader.load())
27
+ except Exception as e:
28
+ return f"❌ Failed to load PDF: {e}"
29
+
30
+ # Load YouTube transcript
31
+ try:
32
+ yt_loader = YoutubeLoader.from_youtube_url(youtube_url, add_video_info=False)
33
+ docs.extend(yt_loader.load())
34
+ except Exception as e:
35
+ return f"❌ Failed to load YouTube video: {e}"
36
+
37
+ if not docs:
38
+ return "❌ No documents could be loaded from the PDF or YouTube URL."
39
+
40
+ # Split
41
+ splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=150)
42
+ splits = splitter.split_documents(docs)
43
+
44
+ # Embed + Vectorstore
45
+ embedding = OpenAIEmbeddings(model="text-embedding-3-large", api_key=OPENAI_API_KEY)
46
+ db = FAISS.from_documents(splits, embedding)
47
+
48
+ # QA Chain
49
+ llm = init_chat_model("gpt-4o-mini", model_provider="openai", api_key=OPENAI_API_KEY)
50
+ qa = RetrievalQA.from_chain_type(llm, retriever=db.as_retriever())
51
+
52
+ # Query
53
+ try:
54
+ result = qa.invoke({"query": query})
55
+ return result["result"]
56
+ except Exception as e:
57
+ return f"❌ Error during retrieval: {e}"
58
+
59
+ # --- GRADIO UI ---
60
+ with gr.Blocks() as demo:
61
+ gr.Markdown("## πŸ“š Ask Questions from PDF + YouTube Transcript")
62
+
63
+ with gr.Row():
64
+ pdf_input = gr.File(label="Upload PDF", file_types=[".pdf"])
65
+ yt_input = gr.Textbox(label="YouTube URL", placeholder="https://www.youtube.com/watch?v=...")
66
+
67
+ query_input = gr.Textbox(label="Your Question", placeholder="What did the video/PDF say about X?")
68
+ output = gr.Textbox(label="Answer")
69
+
70
+ run_button = gr.Button("Get Answer")
71
+ run_button.click(fn=process_inputs, inputs=[pdf_input, yt_input, query_input], outputs=output)
72
+
73
+ if __name__ == "__main__":
74
+ demo.launch()