File size: 3,197 Bytes
b41af6a
 
 
 
 
 
 
8473368
b41af6a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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)