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") | |