File size: 4,864 Bytes
44198e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53a521c
 
 
 
 
44198e0
 
 
 
 
 
 
 
53a521c
44198e0
 
ae8bccc
 
44198e0
ae8bccc
 
 
 
 
44198e0
ae8bccc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44198e0
 
 
ae8bccc
 
 
 
44198e0
53a521c
 
 
ae8bccc
44198e0
53a521c
ae8bccc
53a521c
ae8bccc
44198e0
53a521c
 
ae8bccc
 
 
 
53a521c
 
 
 
ae8bccc
53a521c
 
 
ae8bccc
53a521c
ae8bccc
44198e0
ae8bccc
44198e0
 
 
 
53a521c
 
 
44198e0
 
 
 
 
 
 
 
 
53a521c
44198e0
 
 
53a521c
44198e0
53a521c
44198e0
ae8bccc
 
 
 
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
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."
    
    insights = results.get('insights', {})
    output = []
    
    # Main Summary
    output.append("πŸ“ Executive Summary")
    output.append("-" * 50)
    output.append(insights.get('main_summary', ''))
    output.append("\n")
    
    # Key Findings
    output.append("πŸ”‘ Key Findings")
    output.append("-" * 50)
    for i, point in enumerate(insights.get('key_findings', []), 1):
        output.append(f"{i}. {point}")
    output.append("\n")
    
    # Sources
    output.append("πŸ“š Sources")
    output.append("-" * 50)
    for source in insights.get('sources', []):
        output.append(f"β€’ {source.get('title', '')}")
        output.append(f"  {source.get('url', '')}")
    output.append("\n")
    
    # Follow-up Questions
    output.append("❓ Suggested Questions")
    output.append("-" * 50)
    for question in results.get('follow_up_questions', []):
        output.append(f"β€’ {question}")
    
    # Add main results
    if 'results' in results:
        output.append("\n")
        output.append("πŸ“„ Detailed Results")
        output.append("-" * 50)
        output.append("\n")
        for i, result in enumerate(results['results'], 1):
            if not isinstance(result, dict):
                continue
                
            output.append(f"### {i}. ")
            if 'url' in result:
                title = result.get('title', 'Untitled')
                output.append(f"[{title}]({result['url']})\n")
            if 'summary' in result:
                output.append(f"\n{result['summary']}\n\n")
                
    # Add similar chunks if available
    if 'similar_chunks' in results:
        output.append("\n")
        output.append("πŸ” Related Content")
        output.append("-" * 50)
        output.append("\n")
        for i, chunk in enumerate(results['similar_chunks'], 1):
            if not isinstance(chunk, dict):
                continue
                
            output.append(f"### Related {i}\n")
            if 'metadata' in chunk:
                meta = chunk['metadata']
                if 'title' in meta and 'url' in meta:
                    output.append(f"From [{meta['title']}]({meta['url']})\n")
            if 'content' in chunk:
                output.append(f"\n{chunk['content'][:200]}...\n\n")
    
    return "\n".join(output)

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.Textbox(
            label="Search Results",
            lines=20
        )
        
        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()