| | import os |
| |
|
| | from all_rag_fns import do_rag |
| | import gradio as gr |
| |
|
| |
|
| | def create_video_html(video_info: list) -> str: |
| | html = """ |
| | <style> |
| | .video-container { |
| | display: flex; |
| | flex-wrap: wrap; |
| | justify-content: space-around; |
| | } |
| | .video-item { |
| | width: 30%; |
| | min-width: 300px; |
| | margin-bottom: 20px; |
| | } |
| | @media (max-width: 1200px) { |
| | .video-item { |
| | width: 45%; |
| | } |
| | } |
| | @media (max-width: 768px) { |
| | .video-item { |
| | width: 100%; |
| | } |
| | } |
| | </style> |
| | <div class="video-container"> |
| | """ |
| |
|
| | for vid_info in video_info: |
| | yt_id = vid_info["VideoURL"].split("/")[-1].split("=")[-1] |
| | yt_url = f"https://www.youtube.com/embed/{yt_id}" |
| | html += f""" |
| | <div class="video-item"> |
| | <h3>{vid_info["Title"]}</h3> |
| | <p><em>{vid_info["Speaker"]}</em></p> |
| | <p>Year: {vid_info["Year"]}</p> |
| | <p>Similarity Score: {100 * vid_info["score"]:.0f}/100</p> |
| | <iframe width="100%" height="215" src="{yt_url}" frameborder="0" allowfullscreen></iframe> |
| | <details> |
| | <summary>Transcript</summary> |
| | <p>{vid_info["transcript"]}</p> |
| | </details> |
| | </div> |
| | """ |
| | html += "</div>" |
| | return html |
| |
|
| |
|
| | def gr_ch_if(user_input: str, model_radio: str): |
| | model_name = "gpt-4o-mini" if model_radio == "Cheaper" else "gpt-4o" |
| | oai_api_key = os.getenv("OPENAI_API_KEY") |
| | response, retrieved_docs = do_rag( |
| | user_input, |
| | stream=False, |
| | n_results=3, |
| | oai_api_key=oai_api_key, |
| | model_name=model_name, |
| | ) |
| | video_html = create_video_html(retrieved_docs) |
| |
|
| | return response, video_html |
| |
|
| |
|
| | |
| | with gr.Blocks() as iface: |
| | gr.Markdown("# RAG on R/Gov Talks") |
| | gr.Markdown("Use Gradio to Run RAG on the previous R/Gov Talks") |
| |
|
| | with gr.Row(): |
| | with gr.Column(scale=1): |
| | model_radio = gr.Radio( |
| | choices=["Cheaper", "More Accurate"], |
| | value=0, |
| | label="Model", |
| | info="Choose the model to use", |
| | type="value", |
| | interactive=True, |
| | ) |
| |
|
| | with gr.Column(scale=3): |
| | query_input = gr.Textbox(label="Enter your question:") |
| |
|
| | response_output = gr.Textbox(label="Response", interactive=False) |
| | video_output = gr.HTML(label="Relevant Videos") |
| |
|
| | query_input.submit( |
| | fn=gr_ch_if, |
| | inputs=[query_input, model_radio], |
| | outputs=[response_output, video_output], |
| | ) |
| |
|
| | |
| | gr.Markdown("""This Gradio app was created for Alan Feder's [talk at the 2024 R/Gov Conference](https://rstats.ai/gov.html). \n\n The Github repository that houses all the code is [here](https://github.com/AlanFeder/rgov-2024) -- feel free to fork it and use it on your own!""" |
| | ) |
| | gr.Markdown("***") |
| | gr.Markdown("### Contact me!") |
| | gr.Image("https://raw.githubusercontent.com/AlanFeder/rgov-2024/refs/heads/main/AJF_Headshot.jpg", width=40, show_share_button=False, show_fullscreen_button=False, show_download_button=False, show_label=False) |
| | gr.Markdown( |
| | """ |
| | [Email](mailto:AlanFeder@gmail.com) | [Website](https://www.alanfeder.com/) | [LinkedIn](https://www.linkedin.com/in/alanfeder/) | [GitHub](https://github.com/AlanFeder) |
| | """ |
| | ) |
| |
|
| |
|
| | |
| | if __name__ == "__main__": |
| | iface.launch() |
| |
|