File size: 4,157 Bytes
44198e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53a521c
 
 
 
 
44198e0
 
 
 
 
 
 
 
53a521c
44198e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53a521c
 
 
44198e0
 
53a521c
 
 
 
44198e0
53a521c
 
 
 
 
 
 
 
 
 
 
 
 
 
44198e0
 
 
 
 
 
53a521c
 
 
44198e0
 
 
 
 
 
 
 
 
53a521c
44198e0
 
 
53a521c
44198e0
53a521c
44198e0
53a521c
 
 
44198e0
 
 
 
 
 
 
53a521c
 
 
44198e0
53a521c
44198e0
53a521c
44198e0
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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()