mayank1101's picture
Update app.py
28bfd4b verified
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()