File size: 2,912 Bytes
3987ef0 978c4cf 3987ef0 978c4cf 3987ef0 978c4cf 3987ef0 978c4cf 3987ef0 978c4cf 3987ef0 978c4cf 3987ef0 978c4cf 3987ef0 978c4cf 3987ef0 |
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 |
# app.py
import os
import streamlit as st
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from mcp.orchestrator import orchestrate_search, answer_ai_question
from mcp.schemas import UnifiedSearchInput, UnifiedSearchResult
# Initialize FastAPI app for API users
api = FastAPI(title="MCP Research Server", version="2.0")
api.add_middleware(CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"])
@api.post("/unified_search", response_model=UnifiedSearchResult)
async def unified_search_endpoint(data: UnifiedSearchInput):
return await orchestrate_search(data.query)
@api.post("/ask_ai")
async def ask_ai_endpoint(question: str, context: str = ""):
return await answer_ai_question(question, context)
# Streamlit UI for Hugging Face Space
def render_ui():
st.set_page_config(page_title="Ultimate Research Assistant", page_icon=":microscope:", layout="wide")
st.image("assets/logo.png", width=100)
st.title("🔬 Next-Gen AI-Powered Biomedical Research Assistant")
st.markdown(
"""
*Combine the power of ArXiv, PubMed, UMLS, OpenFDA, and OpenAI.
Get instant, unified, semantically-ranked answers—plus drug safety, concept enrichment, and expert Q&A!*
"""
)
query = st.text_input("Enter your research question or topic:", value="What are the latest treatments for Alzheimer's disease?")
if st.button("Run Unified Search 🚀"):
with st.spinner("Retrieving and synthesizing knowledge..."):
results = orchestrate_search(query)
st.success("Here are the results!")
for i, paper in enumerate(results['papers'], 1):
st.markdown(f"**{i}. [{paper['title']}]({paper['link']})** \n*{paper['authors']}*")
st.write(paper['summary'])
st.subheader("UMLS Concept Enrichment")
for c in results['umls']:
st.write(f"**{c['name']}** (CUI: {c['cui']}): {c['definition']}")
st.subheader("Drug & Safety Insights")
for d in results['drug_safety']:
st.write(d)
st.subheader("AI-Generated Synthesis")
st.info(results['ai_summary'])
st.markdown("#### 📚 Suggested Reading")
for link in results['suggested_reading']:
st.write(f"- {link}")
st.markdown("---")
st.subheader("🤖 Ask a follow-up (AI Q&A):")
follow_up = st.text_input("Type your question here:")
if st.button("Ask AI"):
with st.spinner("AI is thinking..."):
answer = answer_ai_question(follow_up, context=query)
st.success("AI says:")
st.write(answer['answer'])
if __name__ == "__main__":
import sys
if "runserver" in sys.argv:
import uvicorn
uvicorn.run(api, host="0.0.0.0", port=7860)
else:
render_ui()
|