openfree's picture
Update app.py
7de46c8 verified
#!/usr/bin/env python
import datetime
import gradio as gr
import pandas as pd
from apscheduler.schedulers.background import BackgroundScheduler
from gradio_calendar import Calendar
from papers import PaperList, get_df
DESCRIPTION = "# Papers Leaderboard\nExplore the latest papers and filter by date, title, or abstract keywords."
FOOT_NOTE = "Community: https://discord.gg/openfreeai"
paper_list = PaperList(get_df())
def update_paper_list() -> None:
global paper_list
paper_list = PaperList(get_df())
scheduler = BackgroundScheduler()
scheduler.add_job(func=update_paper_list, trigger="cron", hour="*", timezone="UTC", misfire_grace_time=60)
scheduler.start()
def update_df() -> gr.Dataframe:
return gr.Dataframe(value=paper_list.df_prettified)
def update_num_papers(df: pd.DataFrame) -> str:
return f"{len(df)} / {len(paper_list.df_raw)}"
def search(
start_date: datetime.datetime,
end_date: datetime.datetime,
search_title: str,
search_abstract: str,
max_num_to_retrieve: int,
) -> pd.DataFrame:
return paper_list.search(start_date, end_date, search_title, search_abstract, max_num_to_retrieve)
# ------------------------------------------------------------------
# CSS
# ------------------------------------------------------------------
css = """
body {
margin: 0;
padding: 0;
background: linear-gradient(135deg, #eef2ff 0%, #fdfdfd 100%);
font-family: "Helvetica Neue", Arial, sans-serif;
}
#hero-section {
background: linear-gradient(135deg, #3b82f6 0%, #9333ea 100%);
padding: 2rem;
border-radius: 0.5rem;
margin-bottom: 1rem;
color: white;
}
#hero-section h1 {
font-size: 2.2rem;
margin-bottom: 0.5rem;
}
.search-container {
background-color: #ffffffdd;
backdrop-filter: blur(6px);
border-radius: 0.75rem;
padding: 1rem 1.5rem;
box-shadow: 0 3px 5px rgba(0,0,0,0.1);
margin-bottom: 1rem;
}
.card {
background-color: #fff;
border-radius: 0.75rem;
padding: 1.5rem;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
margin-bottom: 1rem;
}
#table table {
border-collapse: collapse;
width: 100%;
background: #fafafa;
}
#table th, #table td {
border: 1px solid #e5e7eb;
padding: 0.5rem;
text-align: left;
}
#table thead {
background-color: #f3f4f6;
font-weight: 600;
}
.footer {
color: #6b7280;
font-size: 0.9rem;
text-align: center;
margin-top: 2rem;
}
"""
with gr.Blocks(css=css) as demo:
# Hero 섹션
gr.HTML(
"""
<div id="hero-section">
<h1>Papers Leaderboard</h1>
<p>Explore the latest papers and filter by date, title, or abstract keywords.</p>
</div>
"""
)
# Search & Filter 헤더 및 외부 링크
gr.Markdown(
"[Exp] AI‑Powered Research Impact Predictor ↗](https://huggingface.co/spaces/VIDraft/PapersImpact)",
elem_classes="search-container"
)
# 검색 입력
with gr.Group():
search_title = gr.Textbox(label="Search title")
with gr.Row():
with gr.Column(scale=4):
search_abstract = gr.Textbox(
label="Search abstract",
info="Search within abstracts (may not be fully accurate).",
)
with gr.Column(scale=1):
max_num_to_retrieve = gr.Slider(
label="Max number to retrieve",
info="Applies only to abstract-based searching",
minimum=1,
maximum=len(paper_list.df_raw),
step=1,
value=100,
)
with gr.Row():
start_date = Calendar(label="Start date", type="datetime", value="2023-05-05")
end_date = Calendar(label="End date", type="datetime")
# 결과: 통계 및 테이블
with gr.Group(elem_id="results-section"):
with gr.Group(elem_classes="card"):
num_papers = gr.Textbox(
label="Number of papers",
value=update_num_papers(paper_list.df_raw),
interactive=False
)
df = gr.Dataframe(
value=paper_list.df_prettified,
datatype=paper_list.column_datatype,
type="pandas",
interactive=False,
max_height=800,
elem_id="table",
column_widths=["10%", "10%", "60%", "10%", "5%", "5%"],
wrap=True,
)
gr.Markdown(FOOT_NOTE, elem_classes="footer")
# 이벤트 연결
gr.on(
triggers=[start_date.change, end_date.change, search_title.submit, search_abstract.submit],
fn=search,
inputs=[start_date, end_date, search_title, search_abstract, max_num_to_retrieve],
outputs=df,
api_name=False,
).then(
fn=update_num_papers,
inputs=df,
outputs=num_papers,
queue=False,
api_name=False,
)
demo.load(
fn=update_df,
outputs=df,
queue=False,
api_name=False,
).then(
fn=update_num_papers,
inputs=df,
outputs=num_papers,
queue=False,
api_name=False,
)
if __name__ == "__main__":
demo.queue(api_open=False).launch(show_api=False)