import os import time import gradio as gr import google.generativeai as genai # 設定 Gemini API KEY def configure_api_key(api_key): genai.configure(api_key=api_key) print("API Key 已配置成功") # 上傳 PDF 並等待處理完成 def upload_and_process_pdf(file_path, mime_type="application/pdf"): print("上傳 PDF 中...") pdf_file = genai.upload_file(file_path, mime_type=mime_type) print(f"PDF '{pdf_file.display_name}' 上傳成功,URI 為: {pdf_file.uri}") # 等待 PDF 處理完成 while pdf_file.state.name == "PROCESSING": print("等待 PDF 處理中...") time.sleep(10) pdf_file = genai.get_file(pdf_file.name) if pdf_file.state.name == "FAILED": raise ValueError("PDF 處理失敗。") print(f"PDF 處理完成: {pdf_file.uri}") return pdf_file # 使用 PDF 的 URI 來生成描述 def generate_pdf_summary(api_key, pdf_file_path, prompt="仔細讀檔,彙整重點。繁體中文"): configure_api_key(api_key) # 上傳並處理 PDF try: pdf_file = upload_and_process_pdf(pdf_file_path) except Exception as e: return f"PDF 上傳或處理失敗:{e}", None # 設定模型 model = genai.GenerativeModel(model_name="models/gemini-1.5-pro-002") # 發送 LLM 推理請求 try: print("Making LLM inference request...") response = model.generate_content( [prompt, pdf_file], request_options={"timeout": 600} ) # 保存模型回應到文件 output_file_path = "/tmp/model_response.txt" with open(output_file_path, "w") as f: f.write(response.text) return response.text, output_file_path except Exception as e: return f"與模型對話時發生錯誤:{e}", None # Gradio 介面 with gr.Blocks() as demo: gr.Markdown("### 上傳 PDF 並生成摘要(Gemini)") # API Key 輸入 api_key_input = gr.Textbox( label="輸入 API Key", placeholder="請輸入您的 Gemini API Key", type="password" ) # PDF 上傳 pdf_input = gr.File( label="上傳 PDF", type="filepath", ) # 描述提示輸入 prompt = gr.Textbox( label="摘要提示", placeholder="默認為 '仔細讀檔,彙整重點。繁體中文'", lines=5 ) # 提交按鈕 submit_button = gr.Button("提交") # 輸出文字框和下載文件按鈕 output_text = gr.Textbox( label="模型回應", placeholder="模型的回應將出現在這裡", lines=10 ) download_button = gr.File( label="下載模型回應", interactive=False ) # 設置提交按鈕的函數調用 def handle_generate_summary(api_key, pdf_file, prompt): text_response, file_path = generate_pdf_summary(api_key, pdf_file, prompt) return text_response, file_path # 提交按鈕的處理 submit_button.click( handle_generate_summary, inputs=[api_key_input, pdf_input, prompt], outputs=[output_text, download_button] ) # 啟動 Gradio 介面 demo.launch()