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()