Spaces:
Sleeping
Sleeping
| # Set environment variables before any other imports | |
| import os | |
| import tempfile | |
| # Create app-specific temp directories | |
| temp_base = tempfile.gettempdir() | |
| os.environ['HF_HOME'] = os.path.join(temp_base, 'huggingface_home') | |
| os.environ['GRADIO_TEMP_DIR'] = os.path.join(temp_base, 'gradio_tmp') | |
| # Create directories with appropriate permissions | |
| for dir_path in [os.environ['HF_HOME'], | |
| os.environ['GRADIO_TEMP_DIR']]: | |
| try: | |
| os.makedirs(dir_path, mode=0o777, exist_ok=True) | |
| except Exception as e: | |
| print(f"Warning: Could not create directory {dir_path}: {e}") | |
| # Now import the rest of the dependencies | |
| import gradio as gr | |
| from typing import Optional, Tuple, Union | |
| from pathlib import Path | |
| # Import summarizer components | |
| from summarizer.summarizer import process_text | |
| from summarizer.utils import extract_from_url | |
| class SummaryMaker: | |
| def __init__(self): | |
| """Initialize the SummaryMaker application.""" | |
| pass # Environment setup is now handled at module level | |
| def summarize_text( | |
| self, | |
| choice: str, | |
| url: str, | |
| file_path: Optional[str], | |
| text: str, | |
| model_name: str, | |
| max_length: int | |
| ) -> str: | |
| """ | |
| Summarize text based on the input type chosen (URL, File, or direct Text). | |
| Args: | |
| choice: Input type ("URL", "File", or "Text") | |
| url: URL to extract text from | |
| file_path: Path to uploaded file | |
| text: Direct input text | |
| model_name: Name of the summarization model to use | |
| max_length: Maximum length of the summary | |
| Returns: | |
| str: Generated summary or error message | |
| """ | |
| try: | |
| input_text = self._get_input_text(choice, url, file_path, text) | |
| if not input_text or len(input_text.strip()) < 50: | |
| return "Error: Not enough text content to summarize (minimum 50 characters)" | |
| summary = process_text( | |
| input_text, | |
| model=model_name, | |
| max_length=max_length | |
| ) | |
| return summary | |
| except Exception as e: | |
| return f"Summarization failed: {str(e)}" | |
| def _get_input_text( | |
| self, | |
| choice: str, | |
| url: str, | |
| file_path: Optional[str], | |
| text: str | |
| ) -> str: | |
| """ | |
| Extract text content based on the chosen input method. | |
| Args: | |
| choice: Input type ("URL", "File", or "Text") | |
| url: URL to extract text from | |
| file_path: Path to uploaded file | |
| text: Direct input text | |
| Returns: | |
| str: Extracted text content | |
| Raises: | |
| ValueError: If text extraction fails | |
| """ | |
| if choice == "URL": | |
| if not url: | |
| raise ValueError("No URL provided") | |
| return extract_from_url(url) | |
| elif choice == "File": | |
| if not file_path: | |
| raise ValueError("No file uploaded") | |
| return Path(file_path.name).read_text(encoding='utf-8') | |
| elif choice == "Text": | |
| return text | |
| raise ValueError(f"Invalid choice: {choice}") | |
| def update_visibility( | |
| self, | |
| choice: str | |
| ) -> Tuple[gr.update, gr.update, gr.update, gr.update]: | |
| """ | |
| Update the visibility of input components based on the selected choice | |
| and clear the summary output. | |
| Args: | |
| choice: Selected input type | |
| Returns: | |
| Tuple of Gradio updates for URL, File, Text, and Summary components | |
| """ | |
| return ( | |
| gr.update(visible=(choice == "URL"), value=""), # URL input | |
| gr.update(visible=(choice == "File"), value=None), # File input | |
| gr.update(visible=(choice == "Text"), value=""), # Text input | |
| gr.update(value="") # Summary output | |
| ) | |
| def create_interface(self): | |
| """Create and configure the Gradio interface.""" | |
| with gr.Blocks(title="SummaryMaker") as demo: | |
| gr.Markdown("# SummaryMaker") | |
| gr.Markdown( | |
| """A simple tool to generate summaries from text, URLs, or files. | |
| Choose your input method and adjust the settings below.""" | |
| ) | |
| # Input method selection | |
| choice = gr.Dropdown( | |
| choices=["Text", "URL", "File"], | |
| label="Choose input type", | |
| value="Text" | |
| ) | |
| # Input components | |
| url = gr.Textbox( | |
| label="URL to Summarize", | |
| placeholder="Enter URL here...", | |
| visible=False | |
| ) | |
| file = gr.File( | |
| label="Upload File", | |
| file_types=[".txt", ".md", ".doc", ".docx"], | |
| visible=False | |
| ) | |
| text = gr.Textbox( | |
| label="Text to Summarize", | |
| placeholder="Enter or paste your text here...", | |
| lines=10, | |
| visible=True | |
| ) | |
| # Model settings | |
| with gr.Row(): | |
| model = gr.Textbox( | |
| label="Model Name", | |
| value="t5-base", | |
| placeholder="Enter model name..." | |
| ) | |
| max_length = gr.Slider( | |
| label="Maximum Summary Length", | |
| minimum=50, | |
| maximum=500, | |
| value=180, | |
| step=10 | |
| ) | |
| # Output | |
| summary = gr.Textbox( | |
| label="Generated Summary", | |
| lines=5 | |
| ) | |
| # Event handlers | |
| choice.change( | |
| fn=self.update_visibility, | |
| inputs=choice, | |
| outputs=[url, file, text, summary] # Added summary to outputs | |
| ) | |
| gr.Button("Generate Summary").click( | |
| fn=self.summarize_text, | |
| inputs=[choice, url, file, text, model, max_length], | |
| outputs=summary | |
| ) | |
| return demo | |
| def main(): | |
| """Initialize and launch the application.""" | |
| app = SummaryMaker() | |
| demo = app.create_interface() | |
| demo.launch( | |
| server_name="0.0.0.0", | |
| server_port=7860, | |
| share=False # Set to True to create a public URL | |
| ) | |
| if __name__ == "__main__": | |
| main() |