Rahatara's picture
Update app.py
8473368 verified
raw
history blame
3.2 kB
import os
import time
import mimetypes
import google.generativeai as genai
import gradio as gr
# Configure the Gemini API
api_key = os.getenv("GOOGLE_API_KEY")
if not api_key:
raise ValueError("GEMINI_API_KEY not found. Please set it in your environment variables.")
genai.configure(api_key=api_key)
def upload_to_gemini(file_data, mime_type):
"""Uploads the given file data to Gemini and returns the file object if successful."""
try:
file = genai.upload_file(file_data, mime_type=mime_type)
print(f"Uploaded file '{file.display_name}' as: {file.uri}")
return file
except Exception as e:
print(f"Error uploading file: {e}")
return None
def wait_for_files_active(files):
"""Waits for the uploaded files to be processed and become active."""
for file in files:
while file.state.name == "PROCESSING":
print(".", end="", flush=True)
time.sleep(10)
file = genai.get_file(file.name)
if file.state.name != "ACTIVE":
raise Exception(f"File {file.display_name} failed to process, current state: {file.state.name}")
print("All files ready.")
def gemini_interaction(input_text, *file_args):
"""Handles the interaction with Gemini API for both text and file inputs."""
files = []
for i in range(0, len(file_args), 2):
if file_args[i] is not None:
file_data = file_args[i].read()
mime_type = file_args[i + 1]
uploaded_file = upload_to_gemini(file_data, mime_type)
if uploaded_file:
files.append(uploaded_file)
# Wait for all files to be ready before proceeding
if files:
wait_for_files_active(files)
# Prepare the content for the Gemini API
contents = []
if input_text:
contents.append({"text": input_text})
contents.extend([{"file": file.uri} for file in files if file])
# Initialize model and generate content
model = genai.GenerativeModel("gemini-2.0-flash-exp")
try:
response_stream = model.generate_content(contents, stream=True)
return ''.join([chunk.text for chunk in response_stream])
except Exception as e:
return f"Gemini API error: {e}"
# Define the Gradio interface
iface = gr.Interface(
fn=gemini_interaction,
inputs=[
gr.Textbox(label="Enter your Prompt"),
gr.File(label="Upload File 1"), gr.Dropdown(label="MIME Type for File 1", choices=["image/png", "audio/ogg", "application/pdf", "video/mp4"]),
gr.File(label="Upload File 2"), gr.Dropdown(label="MIME Type for File 2", choices=["image/png", "audio/ogg", "application/pdf", "video/mp4"]),
gr.File(label="Upload File 3"), gr.Dropdown(label="MIME Type for File 3", choices=["image/png", "audio/ogg", "application/pdf", "video/mp4"]),
gr.File(label="Upload File 4"), gr.Dropdown(label="MIME Type for File 4", choices=["image/png", "audio/ogg", "application/pdf", "video/mp4"])
],
outputs=gr.Textarea(),
title="Interact with Gemini 2.0",
description="Upload files and enter text to interact with the Gemini 2.0 model."
)
if __name__ == "__main__":
iface.launch(debug=True)