import streamlit as st import requests import os API_URL = os.getenv("API_URL", "http://127.0.0.1:8000") st.set_page_config(page_title="GeneSeek V2", page_icon="🧬", layout="wide") st.title("GeneSeek V2: Clinical Trial Assistant") with st.sidebar: st.header("Data Ingestion") uploaded_file = st.file_uploader("Upload Protocol (PDF/TXT)", type=["pdf", "txt"]) if uploaded_file and st.button("Ingest Document"): with st.spinner("Indexing..."): files = {"file": (uploaded_file.name, uploaded_file, uploaded_file.type)} try: res = requests.post(f"{API_URL}/upload", files=files) if res.status_code == 200: st.success("File Indexed!") else: st.error(f"Error: {res.text}") except Exception as e: st.error(f"Connection Failed: {e}") if "messages" not in st.session_state: st.session_state.messages = [] for msg in st.session_state.messages: with st.chat_message(msg["role"]): st.markdown(msg["content"]) if prompt := st.chat_input("Ask a clinical question..."): st.chat_message("user").markdown(prompt) st.session_state.messages.append({"role": "user", "content": prompt}) with st.chat_message("assistant"): with st.spinner("Thinking..."): try: res = requests.post(f"{API_URL}/chat", json={"question": prompt}) if res.status_code == 200: data = res.json() st.markdown(data["answer"]) with st.expander("View Citations"): for i, ctx in enumerate(data["contexts"]): st.markdown(f"**Ref {i+1}:** {ctx['metadata']}") st.caption(ctx['content']) st.divider() st.session_state.messages.append({"role": "assistant", "content": data["answer"]}) else: st.error(f"Backend Error: {res.text}") except Exception as e: st.error(f"Connection Error: {e}")