Spaces:
Sleeping
Sleeping
import asyncio # This will helpus to handle tasks without blocking execution | |
import streamlit as st # Build the web application | |
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 | |
# Setup the page configuration (done using streamlit) | |
st.set_page_config( | |
page_title = "OpenAI based Deep Research Agent", | |
page_icon = "π", | |
layout = "wide" | |
) | |
# Initialize session state for API Key if don't exist | |
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("π OpenAI Deep Research Agent") | |
st.markdown("This OpenAI Agent from OpenAI Agent SDK performs deep research on any topic using Firecrawl") | |
# This takes the input from the user for the specific research related concern | |
research_topic = st.text_input("Enter research topic: ", placeholder = "e.g., Latest Development in AI") | |
# This function tools help us to register this function | |
# as a tool to the agent | |
async def deep_research(query: str, max_depth: int, time_limit: int, max_urls: int): | |
""" | |
Perform comprehensive web research using Firecrawl's deep research endpoint. | |
""" | |
try: | |
# Initialize the firecrawl using the saved API key | |
firecrawl_app = FirecrawlApp(api_key = st.session_state.firecrawl_api_key) | |
params = { | |
"maxDepth": max_depth, | |
"timeLimit": time_limit, | |
"maxUrls": max_urls | |
} | |
# Callback Setup for real-time update | |
def on_activity(activity): | |
st.write(f"[{activity['type']}]{activity['message']}") | |
# Run the deep research using firecrawl | |
with st.spinner("Performing Deep Research..."): | |
resp = firecrawl_app.deep_research( | |
query = query, | |
params = params, | |
on_activity = on_activity | |
) | |
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 sources) | |
2. The tool will search the web, analyze multiple sources, and provide a synthesis | |
3. Review the research results 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. | |
- Including 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 latest trends and future predictions | |
- Suggesting pratical implications for different stackholders | |
3. Maintain academic rigor and factual accuracy | |
4. Preserve the original structure while making it more comprehensive | |
5. Ensure all additions are relevant and valuable to the topic. | |
""" | |
) | |
async def run_research_process(topic : str): | |
"""Run the complete research process""" | |
# Step 1 - Intial Research | |
with st.spinner("Conducting initial research..."): | |
research_results = await Runner.run(research_agent, topic) | |
initial_report = research_results.final_output | |
# Display initial report | |
with st.expander("View Initial Research Report"): | |
st.markdown(initial_report) | |
# Step 2 - Enhance the report | |
with st.spinner("Enhancing the report with additional information..."): | |
elaboration_input = f""" | |
RESEARCH_TOPIC = {topic} | |
INITIAL RESEARCH REPORT: | |
{initial_report} | |
Please enhance this research report with additional information, | |
examples, case studies, and deeper insights while maintaining its | |
academic rigor and factual accuracy. | |
""" | |
elaboration_results = await Runner.run(elaboration_agent, elaboration_input) | |
enhanced_report = elaboration_results.final_output | |
return enhanced_report | |