Spaces:
Sleeping
Sleeping
File size: 6,170 Bytes
25333ad aea1c12 25333ad aea1c12 25333ad |
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 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
import streamlit as st
import requests
import uuid
from datetime import datetime
# Backend URL configuration
BACKEND_URL = "http://localhost:8000"
# Initialize session state
if "session_id" not in st.session_state:
st.session_state.session_id = str(uuid.uuid4())
if "current_file" not in st.session_state:
st.session_state.current_file = None
if "challenge_questions" not in st.session_state:
st.session_state.challenge_questions = []
if "user_answers" not in st.session_state:
st.session_state.user_answers = {}
if "feedback" not in st.session_state:
st.session_state.feedback = {}
# Page setup
st.set_page_config(page_title="Research Assistant", layout="wide")
st.title("π Smart Research Assistant")
# Document management sidebar
with st.sidebar:
st.header("Document Management")
# Document upload
uploaded_file = st.file_uploader("Upload Document (PDF/TXT)", type=["pdf", "txt"])
if uploaded_file:
if st.button("Upload Document"):
response = requests.post(
f"{BACKEND_URL}/upload-doc",
files={"file": (uploaded_file.name, uploaded_file, "application/octet-stream")},
data={"session_id": st.session_state.session_id}
)
if response.status_code == 200:
data = response.json()
st.session_state.current_file = data["file_id"]
st.success(f"Document uploaded successfully! ID: {data['file_id']}")
with st.expander("Document Summary"):
st.write(data["summary"])
else:
st.error("Failed to upload document")
# List documents
st.subheader("Uploaded Documents")
try:
documents = requests.get(f"{BACKEND_URL}/list-docs", params={"session_id": st.session_state.session_id}).json()
for doc in documents:
doc_id = doc["id"]
with st.container(border=True):
st.write(f"**{doc['filename']}**")
st.caption(f"Uploaded: {datetime.fromisoformat(doc['upload_timestamp']).strftime('%Y-%m-%d %H:%M')}")
st.caption(f"ID: {doc_id}")
# Document selection
if st.button(f"Select", key=f"select_{doc_id}"):
st.session_state.current_file = doc_id
# Document deletion
if st.button(f"Delete", key=f"del_{doc_id}"):
del_response = requests.post(
f"{BACKEND_URL}/delete-doc",
json={"file_id": doc_id}
)
if del_response.status_code == 200:
st.rerun()
else:
st.error("Deletion failed")
except:
st.warning("No documents available")
# Main interaction tabs
ask_tab, challenge_tab = st.tabs(["Ask Anything", "Challenge Me"])
with ask_tab:
st.subheader("Document Q&A")
if st.session_state.current_file:
# Chat interface
user_question = st.text_input("Ask a question about the document:")
if user_question:
response = requests.post(
f"{BACKEND_URL}/chat",
json={
"question": user_question,
"session_id": st.session_state.session_id,
"model": "gpt-4o-mini"
}
)
if response.status_code == 200:
data = response.json()
st.divider()
st.subheader("Answer")
st.write(data["answer"])
st.caption(f"Session ID: {data['session_id']}")
else:
st.error("Failed to get response")
else:
st.warning("Please select a document first")
with challenge_tab:
st.subheader("Document Comprehension Challenge")
if st.session_state.current_file:
# Generate questions
if st.button("Generate Challenge Questions"):
response = requests.post(
f"{BACKEND_URL}/challenge-me",
json={"file_id": st.session_state.current_file}
)
if response.status_code == 200:
st.session_state.challenge_questions = response.json()
else:
st.error("Failed to generate questions")
# Display questions and answer inputs
if st.session_state.challenge_questions:
for i, question in enumerate(st.session_state.challenge_questions):
st.subheader(f"Question {i+1}")
st.write(question)
user_answer = st.text_input(
f"Your answer for question {i+1}:",
key=f"answer_{i}"
)
# Store answers
st.session_state.user_answers[i] = user_answer
# Evaluate answer
if st.button(f"Evaluate Answer {i+1}", key=f"eval_{i}"):
response = requests.post(
f"{BACKEND_URL}/evaluate-response",
json={
"file_id": st.session_state.current_file,
"question": question,
"user_answer": user_answer
}
)
if response.status_code == 200:
feedback = response.json()
st.session_state.feedback[i] = feedback
st.success("Answer evaluated!")
else:
st.error("Evaluation failed")
# Show feedback
if i in st.session_state.feedback:
with st.expander(f"Feedback for Question {i+1}"):
st.write(st.session_state.feedback[i]["feedback"])
else:
st.warning("Please select a document first")
# Session info
st.sidebar.divider()
st.sidebar.caption(f"Session ID: `{st.session_state.session_id}`")
|