Spaces:
Running
Running
import streamlit as st | |
import asyncio | |
from research import deep_research | |
from PIL import Image | |
# Page configuration | |
st.set_page_config( | |
page_title="Open DeepResearch", | |
page_icon="π", | |
layout="wide", | |
initial_sidebar_state="expanded" | |
) | |
# Load images | |
logo = Image.open('logo.png') | |
banner = Image.open('banner.png') | |
# Display banner at top | |
# st.image(banner, use_container_width=True) | |
# Custom CSS | |
st.markdown(""" | |
<style> | |
.stImage > img { | |
border-radius: 10px; | |
margin-bottom: 2rem; | |
} | |
.api-container { | |
background-color: #f8f9fa; | |
padding: 1.5rem; | |
border-radius: 10px; | |
margin-bottom: 2rem; | |
border: 1px solid #e0e0e0; | |
} | |
.api-header { | |
color: #1E88E5; | |
font-size: 1.2rem; | |
margin-bottom: 1rem; | |
} | |
</style> | |
""", unsafe_allow_html=True) | |
# Initialize session state | |
if 'api_keys_configured' not in st.session_state: | |
st.session_state.api_keys_configured = False | |
# Sidebar configuration | |
with st.sidebar: | |
st.image(logo, width=200, use_container_width=True) | |
st.markdown("### βοΈ API Configuration") | |
with st.expander("Configure API Keys", expanded=not st.session_state.api_keys_configured): | |
api_form = st.form("api_keys_form") | |
with api_form: | |
openrouter_key = api_form.text_input( | |
"OpenRouter API Key", | |
type="password", | |
value=st.session_state.get('openrouter_key', ''), | |
help="Required for language model access" | |
) | |
serpapi_key = api_form.text_input( | |
"SerpAPI Key", | |
type="password", | |
value=st.session_state.get('serpapi_key', ''), | |
help="Required for web search functionality" | |
) | |
jina_key = api_form.text_input( | |
"Jina API Key", | |
type="password", | |
value=st.session_state.get('jina_key', ''), | |
help="Required for content extraction" | |
) | |
if api_form.form_submit_button("Save API Keys"): | |
if not all([openrouter_key, serpapi_key, jina_key]): | |
st.error("β All API keys are required!") | |
else: | |
st.session_state.openrouter_key = openrouter_key | |
st.session_state.serpapi_key = serpapi_key | |
st.session_state.jina_key = jina_key | |
st.session_state.api_keys_configured = True | |
st.success("β API keys saved successfully!") | |
st.rerun() | |
if st.session_state.api_keys_configured: | |
st.success("β API Keys configured") | |
st.markdown("### π Get API Keys") | |
st.markdown(""" | |
- [OpenRouter API Key](https://openrouter.ai/keys) | |
- [SerpAPI Key](https://serpapi.com/manage-api-key) | |
- [Jina API Key](https://jina.ai/api-key) | |
""") | |
def run_research(user_query, iteration_limit, search_limit): | |
deep_research.OPENROUTER_API_KEY = st.session_state.openrouter_key | |
deep_research.SERPAPI_API_KEY = st.session_state.serpapi_key | |
deep_research.JINA_API_KEY = st.session_state.jina_key | |
return asyncio.run(deep_research.research_flow(user_query, iteration_limit, search_limit)) | |
# Main content | |
st.title("π Open DeepResearch") | |
st.markdown(""" | |
<div style='background-color: #5dade2; padding: 1rem; border-radius: 10px; margin-bottom: 2rem;'> | |
<h4 style='color: #1565C0; margin-bottom: 0.5rem;'>Welcome to the Open DeepResearch!</h4> | |
<p style='color: #424242;'> | |
This application helps you conduct comprehensive research on any topic by: | |
<br> | |
β’ Generating relevant search queries<br> | |
β’ Analyzing multiple sources<br> | |
β’ Synthesizing information into a detailed report | |
</p> | |
</div> | |
""", unsafe_allow_html=True) | |
with st.container(): | |
col1, col2 = st.columns([2, 1]) | |
with col1: | |
with st.form("research_form", clear_on_submit=False): | |
st.markdown("### Research Parameters") | |
user_query = st.text_area( | |
"Research Query", | |
placeholder="Enter your research topic or question here...", | |
help="Be as specific as possible for better results", | |
height=100, | |
disabled=not st.session_state.api_keys_configured | |
) | |
col_a, col_b = st.columns(2) | |
with col_a: | |
iter_limit_input = st.number_input( | |
"Maximum Iterations", | |
min_value=1, | |
max_value=20, | |
value=10, | |
help="Higher values mean more thorough research but longer processing time", | |
disabled=not st.session_state.api_keys_configured | |
) | |
with col_b: | |
search_limit_input = st.number_input( | |
"Results Per Search", | |
min_value=1, | |
max_value=20, | |
value=5, | |
help="Number of results per search. Lower values reduce token usage", | |
disabled=not st.session_state.api_keys_configured | |
) | |
submitted = st.form_submit_button( | |
"π Start Research", | |
disabled=not st.session_state.api_keys_configured | |
) | |
with col2: | |
st.markdown("### Tips for Better Results") | |
st.info(""" | |
β’ Be specific in your query | |
β’ Use clear, focused questions | |
β’ Consider including relevant keywords | |
β’ Specify time periods if applicable | |
β’ Lower search results reduce token usage | |
""") | |
if not st.session_state.api_keys_configured: | |
st.warning("β οΈ Please configure your API keys in the sidebar to enable research.") | |
if submitted and st.session_state.api_keys_configured: | |
if not user_query.strip(): | |
st.error("β οΈ Please enter a research query before proceeding.") | |
else: | |
try: | |
with st.spinner("π Conducting research... This may take a few minutes..."): | |
final_report = run_research(user_query, int(iter_limit_input), int(search_limit_input)) | |
st.markdown(""" | |
<div class='report-container'> | |
<h3 style='color: #1E88E5; margin-bottom: 1rem;'>π Research Report</h3> | |
</div> | |
""", unsafe_allow_html=True) | |
tab1, tab2 = st.tabs(["π Formatted Report", "π Raw Text"]) | |
with tab1: | |
st.markdown(final_report) | |
with tab2: | |
st.text_area( | |
label="", | |
value=final_report, | |
height=500, | |
help="You can copy the raw text from here" | |
) | |
st.download_button( | |
label="π₯ Download Report", | |
data=final_report, | |
file_name="research_report.txt", | |
mime="text/plain" | |
) | |
except Exception as e: | |
st.error(f"β An error occurred during research: {str(e)}") | |
st.markdown(""" | |
<div style='background-color: #ffebee; padding: 1rem; border-radius: 10px;'> | |
<p style='color: #c62828;'>Please try again with a different query or contact support if the issue persists.</p> | |
</div> | |
""", unsafe_allow_html=True) | |
st.markdown(""" | |
<div style='text-align: center; color: #666; padding: 2rem;'> | |
<p>Built by GitsSaikat β€οΈ</p> | |
</div> | |
""", unsafe_allow_html=True) |