import gradio as gr from markitdown import MarkItDown import google.generativeai as genai import tempfile import os from pathlib import Path # Initialize MarkItDown md = MarkItDown() # Configure Gemini AI genai.configure(api_key=os.getenv('GEMINI_KEY')) model = genai.GenerativeModel('gemini-2.0-flash-exp') def process_with_markitdown(input_path): """Process file or URL with MarkItDown and return text content""" try: result = md.convert(input_path) return result.text_content except Exception as e: return f"Error processing input: {str(e)}" def save_uploaded_file(uploaded_file): """Saves an uploaded file to a temporary location.""" if uploaded_file is None: return "No file uploaded." try: # Extract filename and file object from the tuple filename, file_object = uploaded_file temp_dir = tempfile.gettempdir() temp_filename = os.path.join(temp_dir, filename) with open(temp_filename, 'wb') as f: f.write(file_object.read()) print("****",filename, temp_filename) return temp_filename except Exception as e: return f"An error occurred: {str(e)}" async def summarize_text(text): """Summarize the input text using Gemini AI""" try: prompt = f"""Please provide a concise summary of the following text. Focus on the main points and key takeaways: {text} Summary:""" response = await model.generate_content_async(prompt) return response.text except Exception as e: return f"Error generating summary: {str(e)}" async def process_input(input_text, uploaded_file=None): """Main function to process either URL or uploaded file""" try: if uploaded_file is not None: # Handle file upload temp_path = save_uploaded_file(uploaded_file) if temp_path.startswith('Error'): return temp_path text = process_with_markitdown(temp_path) # Clean up temporary file try: os.remove(temp_path) except: pass elif input_text.startswith(('http://', 'https://')): # Handle URL text = process_with_markitdown(input_text) else: # Handle direct text input text = input_text if text.startswith('Error'): return text # Generate summary using Gemini AI summary = await summarize_text(text) return summary except Exception as e: return f"Error processing input: {str(e)}" def clear_inputs(): return ["", None, ""] # Create Gradio interface with drag-and-drop with gr.Blocks(theme=gr.themes.Soft()) as iface: gr.Markdown( """ # Summarizeit > Summarize any document! Enter a URL, paste text, or drag & drop a file to get a summary. """ ) with gr.Row(): input_text = gr.Textbox( label="Enter URL or text", placeholder="Enter a URL or paste text here...", scale=2 ) with gr.Row(): file_upload = gr.File( label="Drop files here or click to upload", file_types=[ ".pdf", ".docx", ".xlsx", ".csv", ".txt", ".md", ".html", ".htm", ".xml", ".json" ], file_count="single", scale=2 ) with gr.Row(): submit_btn = gr.Button("Summarize", variant="primary") clear_btn = gr.Button("Clear") output_text = gr.Textbox( label="Summary", lines=10, show_copy_button=True ) # Set up event handlers submit_btn.click( fn=process_input, inputs=[input_text, file_upload], outputs=output_text ) clear_btn.click( fn=clear_inputs, outputs=[input_text, file_upload, output_text] ) # Add examples gr.Examples( examples=[ ["https://h3manth.com"], ["https://www.youtube.com/watch?v=bSHp7WVpPgc"], ["https://en.wikipedia.org/wiki/Three-body_problem"] ], inputs=input_text ) if __name__ == "__main__": iface.launch()