rag-doc-code / app.py
Saana2005's picture
Create app.py
20e5327 verified
import subprocess
import time
# start backend
subprocess.Popen(
["uvicorn", "backend.main:app", "--host", "0.0.0.0", "--port", "8000"]
)
# small delay so backend boots
time.sleep(2)
import streamlit as st
import requests
import time
API_URL = "http://0.0.0.0:8000"
st.set_page_config(page_title="GenAI RAG App (Docs + Code)", layout="wide")
st.title("🧠 GenAI RAG App (Docs + Code)")
# ---------------- Chat Memory ----------------
if "history" not in st.session_state:
st.session_state["history"] = []
# ---------------- Sidebar Settings ----------------
with st.sidebar:
st.header("Settings")
domain = st.radio("Knowledge Base:", ["doc", "code"])
if st.button("Clear Chat"):
st.session_state["history"] = []
# ---------------- Tabs ----------------
upload_tab, query_tab = st.tabs(["⬆ Upload", "💬 Chat"])
# ---------------- Upload Tab ----------------
with upload_tab:
st.subheader("Upload File")
file = st.file_uploader("Upload PDF / TXT / Python code", type=["pdf", "txt", "md", "py", "js", "ts"])
if file:
ext = file.name.split(".")[-1]
if ext in ["pdf", "txt", "md"]:
endpoint = "/upload/doc"
else:
endpoint = "/upload/code"
files = {"file": (file.name, file.getvalue())}
with st.spinner("Indexing file..."):
r = requests.post(API_URL + endpoint, files=files)
if r.status_code == 200:
st.success("File Indexed!")
st.json(r.json())
else:
st.error("Upload Failed! Check FastAPI backend.")
# ---------------- Helper: Streaming Output ----------------
def stream_text(text, delay=0.025):
"""Yield tokens to simulate streaming."""
for token in text.split():
yield token + " "
time.sleep(delay)
# ---------------- Query / Chat Tab ----------------
with query_tab:
st.subheader("Ask a Question")
# Show chat history
for msg in st.session_state["history"]:
role = "You" if msg["role"] == "user" else "AI"
st.markdown(f"**{role}:** {msg['text']}")
# Mode selection based on domain
if domain == "code":
mode = st.selectbox("Mode:", [
"Explain",
"Debug",
"Fix",
"Refactor",
"Add Comments",
"Complexity"
])
else:
mode = st.selectbox("Mode:", [
"Answer",
"Summarize",
"Bullet Points",
"Keywords"
])
question = st.text_input("Enter your question")
if st.button("Ask"):
if not question.strip():
st.warning("Enter a question before submitting.")
else:
payload = {"question": question, "domain": domain, "mode": mode}
with st.spinner("Thinking..."):
r = requests.post(API_URL + "/query", json=payload)
if r.status_code == 200:
data = r.json()
answer = data["answer"]
context = data["context"]
# Save history
st.session_state["history"].append({"role": "user", "text": question})
st.session_state["history"].append({"role": "assistant", "text": answer})
# Stream output
st.success("AI:")
placeholder = st.empty()
stream = stream_text(answer)
full = ""
for token in stream:
full += token
placeholder.markdown(full + "▌")
# RAG Context section
with st.expander("🔍 Retrieved Context (RAG)"):
if domain == "code":
st.code(context)
else:
st.text(context)
else:
st.error("Query Failed! Check backend or logs.")