#!/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( """

Papers Leaderboard

Explore the latest papers and filter by date, title, or abstract keywords.

""" ) # 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)