import streamlit as st from gpt_researcher import GPTResearcher import asyncio import nest_asyncio import os # Access secrets openai_api_key = st.secrets["OPENAI_API_KEY"] tavily_api_key = st.secrets["TAVILY_API_KEY"] # Apply the asyncio patch from nest_asyncio if required nest_asyncio.apply() # Set the document path environment variable os.environ["DOC_PATH"] = "./local" # Path to the folder with documents # Constants REPORT_TYPE = "research_report" # Define the asynchronous function to fetch the report async def fetch_report(query, report_type): """ Fetch a research report based on the provided query and report type. Research is conducted on a local document related to Google Search Algorithm Leak. """ try: researcher = GPTResearcher( query=query, report_type=report_type, report_source="local" ) await researcher.conduct_research() return await researcher.write_report() except Exception as e: return f"Error during research: {str(e)}" # Function to run the asynchronous function in a separate thread def run_async(coroutine): loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) return loop.run_until_complete(coroutine) # Streamlit interface st.title("Google Leak Reporting Tool") # User input for the query using a text area query = st.text_area( "Enter your research query:", "Extract all the information about how the ranking for internal links works.", height=150, # Adjustable height ) # Start the report generation process if st.button("Generate Report"): if not query: st.warning("Please enter a query to generate a report.") else: with st.spinner("Generating report..."): # Submit the task to the ThreadPoolExecutor future = executor.submit(run_async, fetch_report(query, REPORT_TYPE)) # Wait for the result report = future.result() # Display the report or error message if report and not report.startswith("Error"): st.success("Report generated successfully!") st.write(report) # Display the report in the app # Create a download button for the report st.download_button( label="Download Report as Text File", data=report, file_name="research_report.txt", mime="text/plain", ) else: st.error(report) # Show the error message if any