File size: 2,188 Bytes
a2d89f5
0db6c4f
a2d89f5
0db6c4f
 
 
 
 
 
a2d89f5
 
 
 
0db6c4f
 
 
 
 
a2d89f5
0db6c4f
 
a2d89f5
 
 
 
0db6c4f
 
a2d89f5
 
0db6c4f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import json
import os
import gzip
import gradio as gr
import requests
import pandas as pd
from typing import Tuple


client_session = requests.Session()
client_session.keep_alive = 5


def search_stories(query: str, page: int) -> Tuple[pd.DataFrame, int]:
    """
    Search stories from local API and return results as DataFrame
    """
    try:
        response = client_session.post(
            url=os.environ.get("API_URL", "http://50.18.255.74:8600/search"),
            json={"query": query, "page": page},
            headers={
                "Content-Type": "application/json",
                "Accept-Encoding": "gzip",
            },
        )
        response.raise_for_status()
        data = response.content
        data = json.loads(data)["hits"]
        # Convert response data to DataFrame
        df = pd.DataFrame(data)

        # Reorder columns for better display
        columns = ["title", "author", "story_text", "created_at", "points"]
        df = df[columns]

        return df, page
    except requests.RequestException as e:
        print(e)
        return pd.DataFrame(), page


def next_page(query: str, current_page: int) -> Tuple[pd.DataFrame, int]:
    """
    Load next page of results
    """
    next_page = current_page + 1
    return search_stories(query, next_page)


# Create Gradio interface
with gr.Blocks() as app:
    gr.Markdown("# Story Search")

    # Input components
    with gr.Row():
        query_input = gr.Textbox(
            label="Search Query", placeholder="Enter search terms..."
        )
        page_state = gr.State(value=0)

    # Search button
    search_btn = gr.Button("Search")

    # Results display
    results_df = gr.DataFrame(label="Search Results", interactive=False, wrap=True)

    # Next page button
    next_btn = gr.Button("Next Page")

    # Handle search button click
    search_btn.click(
        fn=search_stories,
        inputs=[query_input, page_state],
        outputs=[results_df, page_state],
    )

    # Handle next page button click
    next_btn.click(
        fn=next_page, inputs=[query_input, page_state], outputs=[results_df, page_state]
    )

if __name__ == "__main__":
    app.launch()