File size: 3,245 Bytes
9cedcea
 
 
6ef65a3
 
9cedcea
6ef65a3
9cedcea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import json
import asyncio
import gradio as gr
import httpx

from websearch import PerplexityClient, parse_perplexity_response

# load .env file
from dotenv import load_dotenv
load_dotenv()

# Initialize Perplexity client
perplexity_client = PerplexityClient(
    api_key=os.environ["PERPLEXITY_AUTH_TOKEN"]
    )

async def query_api(query: str) -> tuple:
    try:
        # Fetch response from Perplexity
        response = await perplexity_client.generate_response(query)
        
        # Parse the response
        parsed_response = parse_perplexity_response(response)
        
        response_data = json.dumps(parsed_response)
                
        # Parse the accumulated response data as JSON
        response_json = json.loads(response_data)
        
        # Extract content and citations from the response JSON
        content = response_json.get("content", "")
        citations = response_json.get("citations", [])
        
        # Beautify content using Markdown formatting
        beautified_content = f"# Search Results\n\n{content}"
        
        # Beautify citations by adding Markdown links
        beautified_citations = "# Citations/Sources\n\n"
        for i, citation in enumerate(citations, start=1):
            beautified_citations += f"{i}. [{citation}]({citation})\n"
        
        # Yield the beautified content and citations
        yield beautified_content, beautified_citations
    except httpx.TimeoutException:
        yield "# Request Timeout\n\nRequest timed out. Please try again later.", ""
    except httpx.HTTPStatusError as e:
        yield f"# HTTP Error\n\nHTTP error occurred: {e}", ""
    except Exception as e:
        yield f"# Error\n\nAn error occurred: {e}", ""

# Create Gradio interface
with gr.Blocks(css=".gradio-container { background-color: #f5f5f5; padding: 20px; border-radius: 10px; }", theme=gr.themes.Citrus()) as demo:
    gr.Markdown("# Web Search Application")
    
    with gr.Row():
        with gr.Column(
            render=True,
            show_progress=True
        ):
            query = gr.Textbox(
                label="Enter your query",
                placeholder="Type your search query here...",
                lines=2,
                max_lines=4,
                value="",
                elem_id="query-input"
            )
            submit_button = gr.Button("Search")
        
        with gr.Column(
            render=True,
            show_progress=True
        ):
            output_content = gr.Markdown(
                label="Response Content",
                value="",
                elem_id="response-content",
                height="600px",
                visible=True,
                show_label=True
                
            )
            output_citations = gr.Markdown(
                label="Citations",
                value="",
                elem_id="response-citations",
                height="200px",
                visible=True,
                show_label=True
            )
    
    # Set up event listener
    submit_button.click(query_api, inputs=query, outputs=[output_content, output_citations])
    
    gr.Markdown("Powered by FastAPI and Gradio")

# Launch the Gradio application
demo.launch()