File size: 4,008 Bytes
9cedcea
 
 
c6c3ae2
6ef65a3
 
9cedcea
6ef65a3
9cedcea
 
 
 
 
 
 
 
 
 
c6c3ae2
 
28bfd4b
c6c3ae2
28bfd4b
c6c3ae2
9cedcea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c6c3ae2
 
 
 
 
 
 
 
 
 
 
 
 
 
1fb2b15
c6c3ae2
 
9cedcea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c6c3ae2
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import os
import json
import asyncio
from datetime import datetime
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, website: str, after_date: str) -> tuple:
    if website:
        query = query + f" \"site:{website}\""
    if after_date:
        query = query + f" \"after:{after_date}\""
    print("query: ", query)
    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=20,
                value="",
                elem_id="query-input"
            )
            website = gr.Textbox(
                label="Single website search",
                placeholder="website url",
                lines=1,
                max_lines=20,
                value="",
                elem_id="query-input"
            )
            after_date = gr.Textbox(
                label="After date",
                placeholder="date format: YYYY-MM-DD",
                lines=1,
                max_lines=2,
                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, website, after_date], outputs=[output_content, output_citations])
    
    gr.Markdown("Powered by FastAPI and Gradio")

# Launch the Gradio application
demo.launch()