From 68ed50978394db57c422debb6deb5159170bd297 Mon Sep 17 00:00:00 2001 From: Madhu Date: Sat, 15 Mar 2025 22:12:06 +0530 Subject: [PATCH] New Proj: OpenAI Agents SDK and Firecrawl Deep Research Endpoint --- .../ai_deep_research_agent/README.md | 74 +++++++ .../deep_research_openai.py | 187 ++++++++++++++++++ .../ai_deep_research_agent/requirements.txt | 4 + 3 files changed, 265 insertions(+) create mode 100644 ai_agent_tutorials/ai_deep_research_agent/README.md create mode 100644 ai_agent_tutorials/ai_deep_research_agent/deep_research_openai.py create mode 100644 ai_agent_tutorials/ai_deep_research_agent/requirements.txt diff --git a/ai_agent_tutorials/ai_deep_research_agent/README.md b/ai_agent_tutorials/ai_deep_research_agent/README.md new file mode 100644 index 0000000..ed64c17 --- /dev/null +++ b/ai_agent_tutorials/ai_deep_research_agent/README.md @@ -0,0 +1,74 @@ +# Deep Research Agent with OpenAI Agents SDK and Firecrawl + +A powerful research assistant that leverages OpenAI's Agents SDK and Firecrawl's deep research capabilities to perform comprehensive web research on any topic and any question. + +## Features + +- **Deep Web Research**: Automatically searches the web, extracts content, and synthesizes findings +- **Enhanced Analysis**: Uses OpenAI's Agents SDK to elaborate on research findings with additional context and insights +- **Interactive UI**: Clean Streamlit interface for easy interaction +- **Downloadable Reports**: Export research findings as markdown files + +## How It Works + +1. **Input Phase**: User provides a research topic and API credentials +2. **Research Phase**: The tool uses Firecrawl to search the web and extract relevant information +3. **Analysis Phase**: An initial research report is generated based on the findings +4. **Enhancement Phase**: A second agent elaborates on the initial report, adding depth and context +5. **Output Phase**: The enhanced report is presented to the user and available for download + +## Requirements + +- Python 3.8+ +- OpenAI API key +- Firecrawl API key +- Required Python packages (see `requirements.txt`) + +## Installation + +1. Clone this repository: + ```bash + git clone https://github.com/Shubhamsaboo/awesome-llm-apps.git + cd ai_agent_tutorials/ai_deep_research_agent + ``` + +2. Install the required packages: + ```bash + pip install -r requirements.txt + ``` + +## Usage + +1. Run the Streamlit app: + ```bash + streamlit run deep_research_openai.py + ``` + +2. Enter your API keys in the sidebar: + - OpenAI API key + - Firecrawl API key + +3. Enter your research topic in the main input field + +4. Click "Start Research" and wait for the process to complete + +5. View and download your enhanced research report + +## Example Research Topics + +- "Latest developments in quantum computing" +- "Impact of climate change on marine ecosystems" +- "Advancements in renewable energy storage" +- "Ethical considerations in artificial intelligence" +- "Emerging trends in remote work technologies" + +## Technical Details + +The application uses two specialized agents: + +1. **Research Agent**: Utilizes Firecrawl's deep research endpoint to gather comprehensive information from multiple web sources. + +2. **Elaboration Agent**: Enhances the initial research by adding detailed explanations, examples, case studies, and practical implications. + +The Firecrawl deep research tool performs multiple iterations of web searches, content extraction, and analysis to provide thorough coverage of the topic. + diff --git a/ai_agent_tutorials/ai_deep_research_agent/deep_research_openai.py b/ai_agent_tutorials/ai_deep_research_agent/deep_research_openai.py new file mode 100644 index 0000000..099ccf4 --- /dev/null +++ b/ai_agent_tutorials/ai_deep_research_agent/deep_research_openai.py @@ -0,0 +1,187 @@ +import asyncio +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 + +# Set page configuration +st.set_page_config( + page_title="Enhanced Research Assistant", + page_icon="🔍", + layout="wide" +) + +# Initialize session state for API keys if not exists +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 keys +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 content +st.title("🔍 Enhanced Deep Research Agent") +st.markdown("This OpenAI Agent from the OpenAI Agents SDK performs deep research on any topic using Firecrawl") + +# Research topic input +research_topic = st.text_input("Enter your research topic:", placeholder="e.g., Latest developments in AI") + +# Keep the original deep_research tool +@function_tool +async def deep_research(query: str, max_depth: int, time_limit: int, max_urls: int) -> Dict[str, Any]: + """ + Perform comprehensive web research using Firecrawl's deep research endpoint. + """ + try: + # Initialize FirecrawlApp with the API key from session state + firecrawl_app = FirecrawlApp(api_key=st.session_state.firecrawl_api_key) + + # Define research parameters + params = { + "maxDepth": max_depth, + "timeLimit": time_limit, + "maxUrls": max_urls + } + + # Set up a callback for real-time updates + def on_activity(activity): + st.write(f"[{activity['type']}] {activity['message']}") + + # Run deep research + with st.spinner("Performing deep research..."): + results = firecrawl_app.deep_research( + query=query, + params=params, + on_activity=on_activity + ) + + return { + "success": True, + "final_analysis": results['data']['finalAnalysis'], + "sources_count": len(results['data']['sources']), + "sources": results['data']['sources'] + } + except Exception as e: + st.error(f"Deep research error: {str(e)}") + return {"error": str(e), "success": False} + +# Keep the original agents +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 + """ +) + +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 explanations of complex concepts + - Including relevant examples, case studies, and real-world applications + - Expanding on key points with additional context and nuance + - Adding visual elements descriptions (charts, diagrams, infographics) + - Incorporating latest trends and future predictions + - Suggesting practical implications for different stakeholders + 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 + """ +) + +# Attach the deep research tool to the research agent +research_agent.tools.append(deep_research) + +async def run_research_process(topic: str): + """Run the complete research process.""" + # Step 1: Initial Research + with st.spinner("Conducting initial research..."): + research_result = await Runner.run(research_agent, topic) + initial_report = research_result.final_output + + # Display initial report in an expander + 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_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 in the sidebar.") + elif not research_topic: + st.warning("Please enter a research topic.") + else: + try: + # Create placeholder for the final report + report_placeholder = st.empty() + + # Run the research process + enhanced_report = asyncio.run(run_research_process(research_topic)) + + # Display the enhanced report + report_placeholder.markdown("## Enhanced Research Report") + report_placeholder.markdown(enhanced_report) + + # Add 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 Agents SDK and Firecrawl") \ No newline at end of file diff --git a/ai_agent_tutorials/ai_deep_research_agent/requirements.txt b/ai_agent_tutorials/ai_deep_research_agent/requirements.txt new file mode 100644 index 0000000..810e0d0 --- /dev/null +++ b/ai_agent_tutorials/ai_deep_research_agent/requirements.txt @@ -0,0 +1,4 @@ +openai-agents +firecrawl +streamlit +firecrawl-py \ No newline at end of file