File size: 4,643 Bytes
1e9d8aa 3454584 1e9d8aa 3454584 1e9d8aa 3454584 1e9d8aa 3454584 aad31df 3454584 bcac0d3 3454584 1e9d8aa 3454584 faaca54 3454584 15503bb 3b1a51d 1e9d8aa 3454584 8e199b9 b51b657 8e199b9 b51b657 8e199b9 b51b657 8e199b9 b51b657 8e199b9 3b1a51d 3454584 3b1a51d 788f0fa 3454584 7bd22f2 3454584 1e9d8aa 3454584 5d81b4c 3454584 1e9d8aa 3454584 1e9d8aa 3454584 1e9d8aa 3454584 |
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 |
"""
Gradio UI entry‑point for the WellBe+ Assistant.
This file focuses *exclusively* on building and launching the UI. Business
logic remains in ``wellbe_agent.py`` so that the web interface stays lean and
maintainable.
"""
from __future__ import annotations
import gradio as gr
from wellbe_agent import answer_sync
DESCRIPTION_MD = (
"WellBe+ AI Agent is a multi‑context assistant built with the Agents SDK framework "
"from OpenAI. It orchestrates **three secure MCP servers**: a public drug‑knowledge FDA "
"service, PubMed and WHOOP biometric feed.\n\n"
"Ask how medications, habits or workouts influence your sleep and recovery – the agent "
"combines **medical knowledge** with your **personal Whoop data** to craft evidence‑backed "
"answers.\n\n"
"### Example questions\n"
"- *What are the adverse effects of Tamoxifen?*\n"
"- *I started taking Prozac three months ago. Have you noticed any trends in my sleep quality? Also, what are its most common side effects?*\n\n"
"### MCP Servers in use\n"
"- [Whoop](https://huggingface.co/spaces/Agents-MCP-Hackathon/whoop-mcp-server)\n"
"- [Healthcare MCP with PubMed, FDA and other APIs](https://huggingface.co/spaces/Agents-MCP-Hackathon/healthcare-mcp-public)\n"
)
logo_html = """
<img src="https://raw.githubusercontent.com/Alea4jacta6est/drug-interaction-checker-agent/main/docs/images/logo.png"
alt="WellBe+" width="80">
<h1>WellBe+ Assistant</h1>
"""
def build_interface() -> gr.Blocks:
"""Construct and return the Gradio interface for the WellBe+ Assistant."""
custom_css = """
@import url('https://fonts.googleapis.com/css2?family=Nunito:wght@400;600&display=swap');
* {
font-family: 'Nunito', sans-serif;
}
/* Set the background for the credentials and chat sections */
#credentials-box, #chat-box {
background-color: #36c4e4;
padding: 20px;
border-radius: 12px;
}
/* Make the button dark blue */
.gr-button-primary {
background-color: #0b65b3 !important;
color: white !important;
border: none !important;
border-radius: 6px;
}
.gr-button-primary:hover {
background-color: #094e91 !important;
}
"""
with gr.Blocks(title="WellBe+ Assistant", css=custom_css) as app:
gr.HTML(logo_html) # Logo and title together
gr.Markdown("")
with gr.Row():
with gr.Column(scale=2):
gr.Markdown(DESCRIPTION_MD)
with gr.Column(scale=1):
gr.Markdown("### How to use")
gr.Video(value="docs/demo.mp4", autoplay=True)
with gr.Row():
# -----------------------------------------------------------------
# Left column – credential inputs
# -----------------------------------------------------------------
with gr.Column(scale=1):
gr.Markdown("### Credentials")
openai_key_box = gr.Textbox(
label="OpenAI API Key",
type="password",
placeholder="sk‑…",
)
whoop_email_box = gr.Textbox(label="Whoop e‑mail", type="password")
whoop_pass_box = gr.Textbox(label="Whoop password", type="password")
# -----------------------------------------------------------------
# Right column – chat interface
# -----------------------------------------------------------------
with gr.Column(scale=2):
gr.Markdown("### Chat")
question_box = gr.Textbox(
label="Question",
lines=3,
placeholder="e.g. How has my sleep changed since starting Prozac last month?",
)
answer_box = gr.Textbox(label="Assistant", lines=8, interactive=False)
ask_btn = gr.Button("Explore Insights", variant="primary")
ask_btn.click(
fn=answer_sync,
inputs=[
question_box,
openai_key_box,
whoop_email_box,
whoop_pass_box,
],
outputs=answer_box,
)
gr.Markdown(
"---\nBuilt by [Natalia B.](https://www.linkedin.com/in/natalia-bobkova/), [Victoria L.](https://www.linkedin.com/in/victoria-latynina/)"
)
return app
if __name__ == "__main__":
build_interface().launch()
|