gistillery / demo.py
Benjamin Bossan
Add pdf processor using pypdf
4c2b75c
import httpx
import gradio as gr
def submit(inputs):
if not inputs:
return
payload = {"content": inputs, "author": "anna nymous"}
try:
httpx.post("http://localhost:8080/submit/", json=payload)
except httpx.ConnectError:
pass
def check_status():
try:
response = httpx.get("http://localhost:8080/check_job_status/")
result = response.json()
except httpx.ConnectError:
result = "Server could not be reached"
return result
def check_tags():
url = "http://localhost:8080/tag_counts/"
try:
tag_counts = {
key.strip("#"): val
for key, val in httpx.get(url).json().items()
if key.strip("#")
}
sorted_tags = sorted(list(tag_counts.items()), key=lambda tup: -tup[1])
result = "Most common tags: " + ", ".join(
f"{t} ({c})" for t, c in sorted_tags[:5]
)
except httpx.ConnectError:
result = ""
return result
def get_results(inputs: list[str]):
if not inputs:
response = httpx.get("http://localhost:8080/recent/")
else:
tags = inputs.replace(",", " ").split()
tags = [tag.lstrip("#") for tag in tags]
response = httpx.get("http://localhost:8080/recent/" + ",".join(tags))
entries = response.json()
texts: list[str] = []
for i, entry in enumerate(entries, start=1):
texts.append(
f"## {i}. author: {entry['author']}\n\n"
f"Date: _{entry['date']}_\n\n"
f"Source: _{entry['source_snippet']}_\n\n"
f"**Summary**: {entry['summary']}\n\n"
f"tags: _{' '.join(entry['tags'])}_"
)
return "\n\n---\n\n".join(texts)
INPUT_DESCRIPTION = """# Gistillery
The no-fuss knowledge dump.
Paste information into the field below and submit, _Gistillery_ will create a
short summary and hashtags for it. Then show results for most recent entries,
optionally filtered by hashtag.
Input currently supports:
- plain text
- a URL to a webpage
- a URL to a youtube video (the video will be transcribed)
- a URL to an image (url ending in .png, .jpg, etc.; the image description will be used)
- a URL to a PDF (url ending in .pdf, e.g. https://arxiv.org/pdf/2108.12409.pdf)
Long inputs will be truncated.
"""
def get_demo():
with gr.Blocks() as demo:
# submit new input
gr.Markdown(INPUT_DESCRIPTION)
inputs = gr.Textbox(lines=3, label="Input")
btn_submit = gr.Button("Submit")
# clear text box
btn_submit.click(lambda x: gr.update(value=''), [], [inputs])
inputs.submit(lambda x: gr.update(value=''), [], [inputs])
# check job status
gr.Markdown(
"Processing can take a couple of minutes, the info box below gives an "
"update on how many jobs are in the queue."
)
gr.HTML(value=check_status, label="Status", every=3)
gr.HTML(value=check_tags, label="Status", every=9)
# check box of tags to filter on
msg = "Enter hashtags to filter on (comma separated if multiple)"
tags = gr.Textbox(label=msg)
# display output
btn_output = gr.Button("Show results")
output = gr.Markdown()
btn_submit.click(submit, inputs=inputs)
btn_output.click(get_results, inputs=[tags], outputs=[output])
return demo
if __name__ == "__main__":
demo = get_demo()
demo.queue()
demo.launch()