Spaces:
Build error
Build error
| import gradio as gr | |
| from rag_engine import RAGEngine | |
| import torch | |
| import os | |
| import logging | |
| import traceback | |
| # Configure logging | |
| logging.basicConfig( | |
| level=logging.INFO, | |
| format='%(asctime)s - %(levelname)s - %(message)s' | |
| ) | |
| logger = logging.getLogger(__name__) | |
| def safe_search(query, max_results): | |
| """Wrapper function to handle errors gracefully""" | |
| try: | |
| rag = RAGEngine() | |
| results = rag.search_and_process(query, max_results) | |
| if 'error' in results: | |
| return f"# β Error\nSorry, an error occurred while processing your search:\n```\n{results['error']}\n```" | |
| return format_results(results) | |
| except Exception as e: | |
| error_msg = f"An error occurred: {str(e)}\n\nTraceback:\n{traceback.format_exc()}" | |
| logger.error(error_msg) | |
| return f"# β Error\nSorry, an error occurred while processing your search:\n```\n{str(e)}\n```" | |
| def format_results(results): | |
| """Format search results for display""" | |
| if not results or not results.get('results'): | |
| return "# β οΈ No Results\nNo search results were found. Please try a different query." | |
| formatted = f"# π Search Results\n\n" | |
| # Add insights section | |
| if 'insights' in results: | |
| formatted += f"## π‘ Key Insights\n{results['insights']}\n\n" | |
| # Add follow-up questions | |
| if 'follow_up_questions' in results: | |
| formatted += "## β Follow-up Questions\n" | |
| for q in results['follow_up_questions']: | |
| if q and q.strip(): | |
| formatted += f"- {q.strip()}\n" | |
| formatted += "\n" | |
| # Add main results | |
| if 'results' in results: | |
| formatted += "## π Detailed Results\n\n" | |
| for i, result in enumerate(results['results'], 1): | |
| if not isinstance(result, dict): | |
| continue | |
| formatted += f"### {i}. " | |
| if 'url' in result: | |
| title = result.get('title', 'Untitled') | |
| formatted += f"[{title}]({result['url']})\n" | |
| if 'summary' in result: | |
| formatted += f"\n{result['summary']}\n\n" | |
| # Add similar chunks if available | |
| if 'similar_chunks' in results: | |
| formatted += "## π Related Content\n\n" | |
| for i, chunk in enumerate(results['similar_chunks'], 1): | |
| if not isinstance(chunk, dict): | |
| continue | |
| formatted += f"### Related {i}\n" | |
| if 'metadata' in chunk: | |
| meta = chunk['metadata'] | |
| if 'title' in meta and 'url' in meta: | |
| formatted += f"From [{meta['title']}]({meta['url']})\n" | |
| if 'content' in chunk: | |
| formatted += f"\n{chunk['content'][:200]}...\n\n" | |
| return formatted | |
| def create_demo(): | |
| """Create the Gradio interface""" | |
| with gr.Blocks(title="Web Search + RAG") as demo: | |
| gr.Markdown("# π Intelligent Web Search") | |
| gr.Markdown("Search the web with AI-powered insights and analysis.") | |
| with gr.Row(): | |
| with gr.Column(): | |
| query = gr.Textbox( | |
| label="Search Query", | |
| placeholder="Enter your search query...", | |
| lines=2 | |
| ) | |
| max_results = gr.Slider( | |
| minimum=1, | |
| maximum=10, | |
| value=5, | |
| step=1, | |
| label="Number of Results" | |
| ) | |
| search_button = gr.Button("π Search") | |
| output = gr.Markdown() | |
| search_button.click( | |
| fn=safe_search, | |
| inputs=[query, max_results], | |
| outputs=output | |
| ) | |
| gr.Examples( | |
| examples=[ | |
| ["What is RAG in AI?", 5], | |
| ["Latest developments in quantum computing", 3], | |
| ["How does BERT work?", 5] | |
| ], | |
| inputs=[query, max_results] | |
| ) | |
| return demo | |
| # Create the demo | |
| demo = create_demo() | |
| # Launch for Spaces | |
| demo.launch() | |