JeCabrera commited on
Commit
cb0053e
·
verified ·
1 Parent(s): c99083d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +111 -107
app.py CHANGED
@@ -1,128 +1,132 @@
1
- TITLE = """<h1 align="center">Gemini Playground ✨</h1>"""
2
- SUBTITLE = """<h2 align="center">Play with Gemini Pro and Gemini Pro Vision</h2>"""
3
 
 
 
4
  import os
5
  import time
6
- from typing import List, Tuple, Optional, Union
7
-
8
  import google.generativeai as genai
9
- import gradio as gr
10
- from dotenv import load_dotenv
11
-
12
- # Cargar las variables de entorno desde el archivo .env
13
- load_dotenv()
14
-
15
- # Obtener la clave de la API de las variables de entorno
16
- GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")
17
 
18
- # Verificar que la clave de la API esté configurada
19
- if not GOOGLE_API_KEY:
20
- raise ValueError("GOOGLE_API_KEY is not set in environment variables.")
21
 
22
- # Configurar la API
23
- genai.configure(api_key=GOOGLE_API_KEY)
24
-
25
- # Constantes
26
- IMAGE_WIDTH = 512
27
- CHAT_HISTORY = List[Tuple[Optional[Union[Tuple[str], str]], Optional[str]]]
28
 
29
- def user(text_prompt: str, chatbot: CHAT_HISTORY):
 
30
  """
31
- Maneja las entradas del usuario en el chatbot.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  """
33
- if text_prompt:
34
- chatbot.append((text_prompt, None))
35
- return "", chatbot
36
-
37
- def bot(
38
- model_choice: str,
39
- system_instruction: Optional[str],
40
- chatbot: CHAT_HISTORY
41
- ):
42
  """
43
- Maneja las respuestas del modelo generativo.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  """
45
- generation_config = genai.types.GenerationConfig(
46
- temperature=0.7,
47
- max_output_tokens=8192,
48
- top_k=10,
49
- top_p=0.9
 
 
 
 
50
  )
51
 
52
- # Usar un valor predeterminado si system_instruction está vacío
53
- if not system_instruction:
54
- system_instruction = "You are a helpful assistant."
55
 
56
- # Obtener el prompt más reciente del usuario
57
- text_prompt = [chatbot[-1][0]] if chatbot and chatbot[-1][0] else []
58
 
59
- # Crear y configurar el modelo generativo
60
- model = genai.GenerativeModel(
61
- model_name=model_choice,
62
- generation_config=generation_config,
63
- system_instruction=system_instruction,
64
- )
65
 
66
- # Generar contenido usando streaming
67
- response = model.generate_content(text_prompt, stream=True)
 
 
 
 
68
 
69
- # Preparar la respuesta para el chatbot
70
- chatbot[-1] = (chatbot[-1][0], "")
71
- for chunk in response:
72
- chatbot[-1] = (chatbot[-1][0], chatbot[-1][1] + chunk.text)
73
- yield chatbot
74
 
75
- # Componentes de la interfaz de usuario
76
- system_instruction_component = gr.Textbox(
77
- placeholder="Enter system instruction...",
78
- label="System Instruction",
79
- lines=2
80
- )
81
- chatbot_component = gr.Chatbot(label='Gemini', bubble_full_width=False, height=300)
82
- text_prompt_component = gr.Textbox(placeholder="Message...", show_label=False, autofocus=True)
83
- run_button_component = gr.Button(value="Run", variant="primary")
84
- model_choice_component = gr.Dropdown(
85
- choices=["gemini-1.5-flash", "gemini-2.0-flash-exp", "gemini-1.5-pro"],
86
- value="gemini-1.5-flash",
87
- label="Select Model"
88
- )
89
 
90
- user_inputs = [text_prompt_component, chatbot_component]
91
- bot_inputs = [model_choice_component, system_instruction_component, chatbot_component]
92
-
93
- # Definir la interfaz de usuario
94
- with gr.Blocks() as demo:
95
- gr.HTML(TITLE)
96
- gr.HTML(SUBTITLE)
97
- with gr.Column():
98
- # Campo de selección de modelo arriba
99
- model_choice_component.render()
100
- chatbot_component.render()
101
- with gr.Row():
102
- text_prompt_component.render()
103
- run_button_component.render()
104
-
105
- # Crear el acordeón para la instrucción del sistema al final
106
- with gr.Accordion("System Instruction", open=False):
107
- system_instruction_component.render()
108
-
109
- run_button_component.click(
110
- fn=user,
111
- inputs=user_inputs,
112
- outputs=[text_prompt_component, chatbot_component],
113
- queue=False
114
- ).then(
115
- fn=bot, inputs=bot_inputs, outputs=[chatbot_component],
116
- )
117
 
118
- text_prompt_component.submit(
119
- fn=user,
120
- inputs=user_inputs,
121
- outputs=[text_prompt_component, chatbot_component],
122
- queue=False
123
- ).then(
124
- fn=bot, inputs=bot_inputs, outputs=[chatbot_component],
125
- )
 
 
 
 
 
 
 
 
 
 
126
 
127
- # Lanzar la aplicación
128
- demo.queue(max_size=99).launch(debug=False, show_error=True)
 
 
 
 
 
 
1
+ Para procesar un archivo que puede ser una imagen, un PDF o un archivo de texto, es necesario modificar la función de subida para manejar varios tipos de archivos y verificar el MIME type automáticamente. A continuación, muestro cómo adaptar el código:
 
2
 
3
+ ### Código Adaptado con Funcionalidad para Procesar Diferentes Tipos de Archivos
4
+ ```python
5
  import os
6
  import time
 
 
7
  import google.generativeai as genai
8
+ from mimetypes import MimeTypes
 
 
 
 
 
 
 
9
 
10
+ # Configurar la API de Gemini
11
+ genai.configure(api_key=os.environ["GEMINI_API_KEY"])
 
12
 
13
+ def upload_and_process_file(path):
14
+ """
15
+ Sube y procesa un archivo para usarlo con el modelo de Gemini.
 
 
 
16
 
17
+ - Detecta automáticamente el tipo MIME del archivo.
18
+ - Procesa imágenes, PDFs y archivos de texto.
19
  """
20
+ # Detectar el tipo MIME del archivo
21
+ mime = MimeTypes()
22
+ mime_type, _ = mime.guess_type(path)
23
+
24
+ if not mime_type:
25
+ raise ValueError("No se pudo determinar el tipo MIME del archivo.")
26
+
27
+ # Subir el archivo a Gemini
28
+ print(f"Subiendo el archivo '{path}' con MIME type '{mime_type}'...")
29
+ file = genai.upload_file(path, mime_type=mime_type)
30
+ print(f"Archivo subido: {file.display_name}, URI: {file.uri}")
31
+
32
+ # Esperar a que el archivo esté activo
33
+ wait_for_files_active([file])
34
+ return file
35
+
36
+ def wait_for_files_active(files):
37
  """
38
+ Espera a que los archivos subidos a Gemini estén activos y listos para su uso.
 
 
 
 
 
 
 
 
39
  """
40
+ print("Esperando el procesamiento de los archivos...")
41
+ for file in files:
42
+ status = genai.get_file(file.name)
43
+ while status.state.name == "PROCESSING":
44
+ print(".", end="", flush=True)
45
+ time.sleep(5) # Intervalo de espera más corto para mejorar la experiencia del usuario
46
+ status = genai.get_file(file.name)
47
+
48
+ if status.state.name != "ACTIVE":
49
+ raise Exception(f"El archivo {file.name} no pudo procesarse correctamente.")
50
+ print("\nTodos los archivos están listos.")
51
+
52
+ # Configuración del modelo generativo
53
+ generation_config = {
54
+ "temperature": 1,
55
+ "top_p": 0.95,
56
+ "top_k": 40,
57
+ "max_output_tokens": 8192,
58
+ "response_mime_type": "text/plain",
59
+ }
60
+
61
+ model = genai.GenerativeModel(
62
+ model_name="gemini-1.5-flash",
63
+ generation_config=generation_config,
64
+ )
65
+
66
+ def start_chat_with_file(file, user_input):
67
  """
68
+ Inicia una conversación con el modelo utilizando un archivo como entrada.
69
+ """
70
+ chat_session = model.start_chat(
71
+ history=[
72
+ {
73
+ "role": "user",
74
+ "parts": [file],
75
+ },
76
+ ]
77
  )
78
 
79
+ # Enviar mensaje al modelo
80
+ response = chat_session.send_message(user_input)
81
+ return response.text
82
 
 
 
83
 
84
+ # Ejemplo de uso
85
+ if __name__ == "__main__":
86
+ # Ruta del archivo a subir
87
+ file_path = "ruta_al_archivo.pdf" # Cambiar por la ruta del archivo
 
 
88
 
89
+ # Subir y procesar el archivo
90
+ try:
91
+ processed_file = upload_and_process_file(file_path)
92
+ except Exception as e:
93
+ print(f"Error al procesar el archivo: {e}")
94
+ exit(1)
95
 
96
+ # Interactuar con el modelo usando el archivo procesado
97
+ user_input = "Por favor, analiza este documento y dame un resumen."
98
+ response = start_chat_with_file(processed_file, user_input)
 
 
99
 
100
+ # Mostrar la respuesta
101
+ print("Respuesta del modelo:")
102
+ print(response)
103
+ ```
 
 
 
 
 
 
 
 
 
 
104
 
105
+ ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
 
107
+ ### **Qué hace este código adaptado:**
108
+ 1. **Detección Automática del Tipo MIME**:
109
+ - Usa la librería `mimetypes` para identificar si el archivo es una imagen (`image/*`), PDF (`application/pdf`), o texto (`text/plain`).
110
+ - Esto elimina la necesidad de especificar manualmente el tipo MIME.
111
+
112
+ 2. **Subida de Archivos**:
113
+ - La función `upload_and_process_file` sube cualquier archivo compatible a Gemini y espera a que esté procesado y listo.
114
+
115
+ 3. **Espera Activa Mejorada**:
116
+ - Reduce el tiempo de espera a 5 segundos para mejorar la experiencia del usuario sin afectar el rendimiento.
117
+
118
+ 4. **Inicio de Chat**:
119
+ - Usa el archivo procesado como entrada inicial en la conversación con el modelo.
120
+
121
+ 5. **Respuesta Generada**:
122
+ - El modelo analiza el archivo y responde según la consulta del usuario.
123
+
124
+ ---
125
 
126
+ ### **Ampliaciones Posibles**:
127
+ - **Validación de Archivos**:
128
+ - Añadir comprobaciones para asegurarse de que solo se suben formatos soportados.
129
+ - **Manejo de Errores**:
130
+ - Implementar mejores mensajes de error y reintentos para los archivos que fallan al procesarse.
131
+ - **Interfaz Gráfica (opcional)**:
132
+ - Integrar este código en una aplicación de `Gradio` para permitir la carga de archivos directamente desde el navegador.