Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from pdf_processor import PDFProcessor | |
| from utils import AI_MODELS, TRANSLATIONS | |
| class PDFProcessorUI: | |
| def __init__(self): | |
| self.processor = PDFProcessor() | |
| self.current_language = "English" | |
| self.current_ai_model = "Huggingface / IBM granite granite 3.1 8b Instruct" | |
| self.current_type_model = "Api Key" | |
| def change_language(self, language): | |
| self.current_language = language | |
| self.processor.set_language(language) | |
| # Retornamos todos los textos que necesitan ser actualizados | |
| return [ | |
| TRANSLATIONS[language]["title"], | |
| gr.update(label=TRANSLATIONS[language]["upload_pdf"]), | |
| gr.update(label=TRANSLATIONS[language]["chunk_size"]), | |
| gr.update(label=TRANSLATIONS[language]["chunk_overlap"]), | |
| gr.update(value=TRANSLATIONS[language]["process_btn"]), | |
| gr.update(label=TRANSLATIONS[language]["processing_status"]), | |
| gr.update(label=TRANSLATIONS[language]["qa_tab"]), | |
| gr.update(label=TRANSLATIONS[language]["summary_tab"]), | |
| gr.update(label=TRANSLATIONS[language]["specialist_tab"]), | |
| gr.update(label=TRANSLATIONS[language]["mini_summary_title"]), | |
| gr.update(label=TRANSLATIONS[language]["mini_analysis_title"]), | |
| gr.update(placeholder=TRANSLATIONS[language]["chat_placeholder"]), | |
| TRANSLATIONS[language]["chat_title"], | |
| gr.update(value=TRANSLATIONS[language]["chat_btn"]), | |
| gr.update(value=TRANSLATIONS[language]["generate_summary"]), | |
| gr.update(label=TRANSLATIONS[language]["summary_label"]), | |
| gr.update(label=TRANSLATIONS[language]["ai_model"]), | |
| TRANSLATIONS[language]["specialist_title"], | |
| gr.update(label=TRANSLATIONS[language]["specialist_label"]), | |
| gr.update(label=TRANSLATIONS[language]["specialist_output"]), | |
| gr.update(value=TRANSLATIONS[language]["specialist_btn"]) | |
| ] | |
| def change_ai_model(self, ai_model): | |
| self.current_ai_model = ai_model | |
| if ai_model == "IBM Granite3.1 dense / Ollama local": | |
| return gr.update(visible=True), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False, maximum=2048), gr.update(visible=False, maximum=200) | |
| elif ai_model == "Open AI / GPT-4o-mini": | |
| return gr.update(visible=False), gr.update(visible=True), gr.update(visible=False), gr.update(visible=False, maximum=2048), gr.update(visible=False, maximum=200) | |
| else: | |
| return gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False, maximum=500), gr.update(visible=False, maximum=100) | |
| def change_type_model(self, type_model): | |
| self.current_type_model = type_model | |
| if type_model == "Api Key": | |
| if self.current_ai_model == "IBM Granite3.1 dense / Ollama local": | |
| return gr.update(visible=False), gr.update(visible=False) | |
| else: | |
| return gr.update(visible=True), gr.update(visible=False) | |
| else: | |
| return gr.update(visible=False), gr.update(visible=False) | |
| def process_pdf(self, vectorstore, pdf_file, chunk_size, chunk_overlap, ai_model, type_model, api_key, project_id_watsonx): | |
| return self.processor.process_pdf(vectorstore, pdf_file, chunk_size, chunk_overlap, ai_model, type_model, api_key, project_id_watsonx) | |
| def qa_interface(self, vectorstore, message, history, ai_model, type_model, api_key, project_id_watsonx): | |
| return self.processor.get_qa_response(vectorstore, message, history, ai_model, type_model, api_key, project_id_watsonx) | |
| def summarize_interface(self, vectorstore, ai_model, type_model, api_key, project_id_watsonx): | |
| return self.processor.get_summary(vectorstore, ai_model, type_model, api_key, project_id_watsonx) | |
| def specialist_opinion(self, vectorstore, ai_model, type_model, api_key, project_id_watsonx, specialist_prompt): | |
| return self.processor.get_specialist_opinion(vectorstore, ai_model, type_model, api_key, project_id_watsonx, specialist_prompt) | |
| def upload_file(files): | |
| file_paths = [file.name for file in files] | |
| return file_paths[0] | |
| def create_ui(self): | |
| with gr.Blocks() as demo: | |
| vectorstore = gr.State() | |
| title = gr.Markdown(TRANSLATIONS[self.current_language]["title"]) | |
| with gr.Row(): | |
| language_dropdown = gr.Dropdown( | |
| choices=list(TRANSLATIONS.keys()), | |
| value=self.current_language, | |
| label="Language/Idioma/Sprache/Langue/Língua", | |
| key="language_dropdown" | |
| ) | |
| ai_model_dropdown = gr.Dropdown( | |
| choices=list(AI_MODELS.keys()), | |
| value=self.current_ai_model, | |
| label= TRANSLATIONS[self.current_language]["ai_model"], | |
| key="ai_model_dropdown" | |
| ) | |
| with gr.Row(): | |
| with gr.Column(): | |
| with gr.Row(): | |
| pdf_file = gr.File( | |
| label=TRANSLATIONS[self.current_language]["upload_pdf"], | |
| file_types=[".pdf"] | |
| ) | |
| with gr.Column(): | |
| type_model=gr.Radio(choices=["Local", "Api Key"], label=TRANSLATIONS[self.current_language]["model_type"], visible=False, value="Api Key") | |
| api_key_input = gr.Textbox(label="Api Key", placeholder=TRANSLATIONS[self.current_language]["api_key_placeholder"], visible=False) | |
| project_id_watsonx = gr.Textbox(label="Project ID", placeholder=TRANSLATIONS[self.current_language]["project_id_placeholder"], visible=False) | |
| chunk_size = gr.Slider( | |
| value=250, | |
| label=TRANSLATIONS[self.current_language]["chunk_size"], | |
| minimum=100, | |
| maximum=500, | |
| step=10, | |
| visible=False | |
| ) | |
| chunk_overlap = gr.Slider( | |
| value=25, | |
| label=TRANSLATIONS[self.current_language]["chunk_overlap"], | |
| minimum=10, | |
| maximum=100, | |
| step=5, | |
| visible=False | |
| ) | |
| process_btn = gr.Button( | |
| TRANSLATIONS[self.current_language]["process_btn"] | |
| ) | |
| process_output = gr.Textbox( | |
| label=TRANSLATIONS[self.current_language]["processing_status"] | |
| ) | |
| with gr.Tabs() as tabs: | |
| qa_tab = gr.Tab(TRANSLATIONS[self.current_language]["qa_tab"]) | |
| summary_tab = gr.Tab(TRANSLATIONS[self.current_language]["summary_tab"]) | |
| specialist_tab = gr.Tab(TRANSLATIONS[self.current_language]["specialist_tab"]) | |
| with qa_tab: | |
| chat_title = gr.Markdown(TRANSLATIONS[self.current_language]["chat_title"]) | |
| chat_placeholder = gr.Textbox( | |
| placeholder=TRANSLATIONS[self.current_language]["chat_placeholder"], | |
| container=False, | |
| show_label=False | |
| ) | |
| chat_btn = gr.Button(TRANSLATIONS[self.current_language]["chat_btn"]) | |
| chatbot = gr.Markdown(height=400) | |
| with summary_tab: | |
| with gr.Accordion(TRANSLATIONS[self.current_language]["mini_analysis_title"], open=False, visible=False): | |
| minisummaries_output = gr.Textbox( | |
| label=TRANSLATIONS[self.current_language]["mini_analysis_title"], | |
| lines=10 | |
| ) | |
| summary_output = gr.Textbox( | |
| label=TRANSLATIONS[self.current_language]["summary_label"], | |
| lines=10 | |
| ) | |
| summarize_btn = gr.Button( | |
| TRANSLATIONS[self.current_language]["generate_summary"] | |
| ) | |
| with specialist_tab: | |
| specialist_title = gr.Markdown(TRANSLATIONS[self.current_language]["specialist_title"]) | |
| specialist_placeholder = gr.Textbox( | |
| label=TRANSLATIONS[self.current_language]["specialist_label"], | |
| lines=10 | |
| ) | |
| with gr.Accordion(TRANSLATIONS[self.current_language]["mini_analysis_title"], open=False, visible=False): | |
| minianalysis_output = gr.Textbox( | |
| label=TRANSLATIONS[self.current_language]["mini_analysis_title"], | |
| lines=10 | |
| ) | |
| specialist_btn = gr.Button(TRANSLATIONS[self.current_language]["specialist_btn"]) | |
| specialist_output = gr.Textbox(label=TRANSLATIONS[self.current_language]["specialist_output"], lines=20) | |
| language_dropdown.change( | |
| fn=self.change_language, | |
| inputs=[language_dropdown], | |
| outputs=[ | |
| title, | |
| pdf_file, | |
| chunk_size, | |
| chunk_overlap, | |
| process_btn, | |
| process_output, | |
| qa_tab, | |
| summary_tab, | |
| specialist_tab, | |
| minisummaries_output, | |
| minianalysis_output, | |
| chat_placeholder, | |
| chat_title, | |
| chat_btn, | |
| summarize_btn, | |
| summary_output, | |
| ai_model_dropdown, | |
| specialist_title, | |
| specialist_placeholder, | |
| specialist_output, | |
| specialist_btn | |
| ] | |
| ) | |
| ai_model_dropdown.change( | |
| fn=self.change_ai_model, | |
| inputs=[ai_model_dropdown], | |
| outputs=[type_model, api_key_input, project_id_watsonx, chunk_size, chunk_overlap] | |
| ) | |
| type_model.change( | |
| fn=self.change_type_model, | |
| inputs=[type_model], | |
| outputs=[api_key_input,project_id_watsonx] | |
| ) | |
| chat_placeholder.submit( | |
| fn=self.qa_interface, | |
| inputs=[vectorstore, chat_placeholder, chatbot, ai_model_dropdown, type_model, api_key_input, project_id_watsonx], | |
| outputs=[chatbot] | |
| ) | |
| process_btn.click( | |
| fn=self.process_pdf, | |
| inputs=[vectorstore, pdf_file, chunk_size, chunk_overlap, ai_model_dropdown, type_model, api_key_input, project_id_watsonx], | |
| outputs=[process_output, vectorstore] | |
| ) | |
| summarize_btn.click( | |
| fn=self.summarize_interface, | |
| inputs=[vectorstore, ai_model_dropdown, type_model, api_key_input, project_id_watsonx], | |
| outputs=[summary_output] | |
| ) | |
| specialist_btn.click( | |
| fn=self.specialist_opinion, | |
| inputs=[vectorstore, ai_model_dropdown, type_model, api_key_input, project_id_watsonx, specialist_placeholder], | |
| outputs=[specialist_output] | |
| ) | |
| chat_btn.click( | |
| fn=self.qa_interface, | |
| inputs=[vectorstore, chat_placeholder, chatbot, ai_model_dropdown, type_model, api_key_input, project_id_watsonx], | |
| outputs=[chatbot] | |
| ) | |
| return demo | |
| if __name__ == "__main__": | |
| ui = PDFProcessorUI() | |
| demo = ui.create_ui() | |
| demo.launch() | |