Spaces:
Sleeping
Sleeping
import asyncio # this will help us handle tasks without blocking execution | |
import streamlit as st | |
from typing import Dict, Any, List | |
from agents import Agent, Runner, trace | |
from agents import set_default_openai_key | |
from firecrawl import FirecrawlApp | |
from agents.tool import function_tool | |
## setiing up page configuration | |
st.set_page_config( | |
page_title= "Greg's Personal Deep Research AI Agent", | |
page_icon= "π", | |
layout= "wide" | |
) | |
## initialize session state for API key | |
if "OPENAI_API_KEY" not in st.session_state: | |
st.session_state.openai_api_key= "" | |
if "firecrawl_api_key" not in st.session_state: | |
st.session_state.firecrawl_api_key= "" | |
## sidebar for api key | |
with st.sidebar: | |
st.title("API Configuration") | |
openai_api_key= st.text_input( | |
"OPENAI API Key", | |
value= st.session_state.openai_api_key, | |
type= "password" | |
) | |
firecrawl_api_key= st.text_input( | |
"FIRECRAWL API KEY", | |
value= st.session_state.firecrawl_api_key, | |
type= "password" | |
) | |
if openai_api_key: | |
st.session_state.openai_api_key= openai_api_key | |
set_default_openai_key(openai_api_key) | |
if firecrawl_api_key: | |
st.session_state.firecrawl_api_key= firecrawl_api_key | |
## Main application and Input Field | |
st.title("π Greg's Personal Deep Research AI Agent") | |
st.markdown("This Agent from OpenAI Agent SDK Performs Deep Research On Any Topic") | |
#take the user input | |
research_topic= st.text_input("Enter research topic: ", placeholder= "e.g: Research on the top 10 jobs in 2025 and their salary expectations") | |
## working with the deep research tool | |
#This function tools help us to register the function to the agent | |
async def deep_research(query: str, max_depth: int, time_limit: int, max_urls: int): | |
""" | |
Performs comprehensive web research using Firecrawl's deep research endpoint. | |
""" | |
try: | |
firecrawl_app= FirecrawlApp(api_key= st.session_state.firecrawl_api_key) | |
params= { | |
"max_depth": max_depth, | |
"time_limit": time_limit, | |
"max_urls": max_urls | |
} | |
def on_activity(activity): | |
st.write(f"[{activity['type']}] {activity['message']}") ##helps us track realtime updates | |
## Run the deep research with firecrawl | |
with st.spinner("Performing Deep Research..."): | |
resp= firecrawl_app.deep_research( | |
query= query, | |
on_activity= on_activity, | |
**params | |
) | |
return { | |
"success": True, | |
"final_analysis": resp["data"]["finalAnalysis"], | |
"sources_count": len(resp["data"]["sources"]), | |
"sources": resp["data"]["sources"] | |
} | |
except Exception as e: | |
st.error(f"Deep Research Error: {str(e)}") | |
return{ | |
"error":str(e), | |
"success": False | |
} | |
## defining agents for specific task | |
research_agent= Agent( | |
name= "research_agent", | |
instructions= """ you are a research assistant that can perform deep web research on any topic. When given a research topic, or question: | |
1. Use the deep_research tool to gather comprehensive information | |
- Always use these parameters: | |
- max_depth: 3 (for moderate depth) | |
- time_limit: 180 (3 minutes) | |
- max_urls: 10 (sufficient resources) | |
2. The tool will search the web, analyze multiple sources and provide a synthesis | |
3. Review the research result and organize them into a well-structured report | |
4. Include proper citations for all sources | |
5.highlight key findings and insights | |
""", | |
tools= [deep_research] | |
) | |
elaboration_agent= Agent( | |
name= "elaboration_agent", | |
instructions= """ You are an expert content enhancer specializing in research elaboration. | |
When given a research report: | |
1. Analyze the structure and content of the report | |
2. Enhance the report by: | |
- Adding more detailed explanation of complex concepts | |
- Include relevant examples, case studies, and real world application. | |
- Expanding on key points with additional context and nuance | |
- Adding visual elements descriptions (charts, diagrams, infographics) | |
- Incorporating the latest trends and future predictions | |
- Suggesting practical implications for different stakeholders | |
3.Maintain academic rigor and factually accuracy | |
4. Preserve the original structure as well while making it more comprehensive | |
5. Ensure all additions are relevant and valuable to topic. | |
""" | |
) | |
## creating another asynchronous function | |
async def run_research_process(topic: str): | |
"""Run the complete research process. """ | |
## Step 1- Initial Research | |
with st.spinner("Conducting initial research..."): | |
research_results = await Runner.run(research_agent, topic) | |
initial_report = research_results.final_output | |
##displaying the initial report | |
with st.expander("View Initial Research Report: "): | |
st.markdown(initial_report) | |
## Step 2- Enchance the report | |
with st.spinner("Enhancing the report with additional information..."): | |
elaboration_input= f""" | |
RESEARCH_TOPIC= {topic} | |
INITIAL RESEARCH REPORT: {initial_report} | |
Please enchance this research report with additional information, examples,case studies, deeper insights while maintaining its academic rigor and factual accuracy | |
""" | |
elaboration_result= await Runner.run(elaboration_agent, elaboration_input) | |
enhanced_report= elaboration_result.final_output | |
return enhanced_report | |
## Main Research Process | |
if st.button("Start Research", disabled= not (openai_api_key and firecrawl_api_key and research_topic)): | |
if not openai_api_key or not firecrawl_api_key: | |
st.warning("Please enter both API keys to start the research!") | |
elif not research_topic: | |
st.warning("No topic provided! Please enter a research topic") | |
else: | |
try: | |
## create a placeholder for final report | |
report_placeholder= st.empty() | |
# Run the research process | |
enhanced_report = asyncio.run(run_research_process(research_topic)) | |
# Display the results | |
report_placeholder.markdown(f"## {research_topic} Report") | |
report_placeholder.markdown(enhanced_report) | |
## Add a download button | |
st.download_button( | |
"Download Report", | |
enhanced_report, | |
file_name= f"{research_topic.replace(' ','_')}_report.md", | |
mime= "text/markdown" | |
) | |
except Exception as e: | |
st.error(f"An error occurred: {str(e)}") | |
## Footer | |
st.markdown("----------") | |
st.markdown("Powered by OpenAI SDK and Firecrawl") | |