# import gradio as gr | |
# import httpx | |
# import json | |
# from typing import Tuple, Any | |
# # Define the FastAPI endpoint URL | |
# FASTAPI_ENDPOINT = "http://localhost:8000/websearch" | |
# def query_api(query: str) -> Tuple[Any, Any]: | |
# try: | |
# # Send POST request to FastAPI endpoint with streaming enabled | |
# with httpx.Client() as client: | |
# with client.stream("POST", FASTAPI_ENDPOINT, json={"query": query}, timeout=60.0) as response: | |
# response.raise_for_status() # Raise an exception for 4xx or 5xx status codes | |
# # Process the streaming response | |
# response_data = "" | |
# for chunk in response.iter_text(): | |
# response_data += chunk | |
# # 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\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 timed out. Please try again later.", "" | |
# except httpx.HTTPStatusError as e: | |
# yield f"HTTP error occurred: {e}", "" | |
# except Exception as e: | |
# yield f"An error occurred: {e}", "" | |
# # Create Gradio interface | |
# with gr.Blocks(css=".gradio-container { background-color: #f5f5f5; padding: 20px; border-radius: 10px; }") as demo: | |
# gr.Markdown("# Web Search Application") | |
# with gr.Row(): | |
# with gr.Column(): | |
# 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(): | |
# output_content = gr.Textbox( | |
# label="Response Content", | |
# placeholder="Search results will appear here...", | |
# lines=10, | |
# max_lines=20, | |
# value="", | |
# elem_id="response-content" | |
# ) | |
# output_citations = gr.Textbox( | |
# label="Citations", | |
# placeholder="Citations will appear here...", | |
# lines=5, | |
# max_lines=10, | |
# value="", | |
# elem_id="response-citations" | |
# ) | |
# # 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() | |
import gradio as gr | |
import httpx | |
import json | |
# Define the FastAPI endpoint URL | |
FASTAPI_ENDPOINT = "http://localhost:8000/websearch" | |
def query_api(query: str) -> tuple: | |
try: | |
# Send POST request to FastAPI endpoint with streaming enabled | |
with httpx.Client() as client: | |
with client.stream("POST", FASTAPI_ENDPOINT, json={"query": query}, timeout=60.0) as response: | |
response.raise_for_status() # Raise an exception for 4xx or 5xx status codes | |
# Process the streaming response | |
response_data = "" | |
for chunk in response.iter_text(): | |
response_data += chunk | |
# 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() |