-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathapp.py
More file actions
98 lines (90 loc) · 3.59 KB
/
Copy pathapp.py
File metadata and controls
98 lines (90 loc) · 3.59 KB
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
"""
En este ejemplo, se utiliza la API de OpenAI para analizar imágenes.
Se envía una solicitud con un texto y una imagen, y se obtiene una respuesta que describe lo que se ve en la imagen.
El código utiliza la biblioteca `openai` para interactuar con la API y `dotenv` para cargar las variables de entorno.
Asegúrate de tener las variables de entorno `ENDPOINT_URL`, `API_KEY` y `MODEL_FOR_VISION` configuradas correctamente en tu archivo `.env`.
"""
import os
import time
import base64
from dotenv import load_dotenv
from openai import OpenAI
from rich.console import Console
from rich.panel import Panel
from rich.progress import Progress, SpinnerColumn, TextColumn, TimeElapsedColumn
# Constantes de rutas de imagen
IMAGE_URL = "https://i0.wp.com/www.returngis.net/wp-content/uploads/2025/04/Ollama-con-Prompty.png"
IMAGE_PATH_BASE64 = os.path.join(os.path.dirname(__file__), "../../samples/partida_de_ajedrez.jpg")
# Cargar las variables de entorno desde el archivo .env
load_dotenv()
console = Console()
# Crear cliente de OpenAI
client = OpenAI(
base_url=os.getenv("ENDPOINT_URL"),
api_key=os.getenv("API_KEY")
)
# Función para codificar una imagen a base64
def encode_image_to_base64(image_path):
"""Convierte una imagen a base64."""
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode("utf-8")
# Función para analizar una imagen usando el endpoint /v1/responses
def analyze_image_openai(description, input_data):
"""Analiza una imagen usando la API de OpenAI y muestra un spinner con tiempo transcurrido."""
with Progress(
SpinnerColumn(),
TextColumn("[progress.description]{task.description}"),
TimeElapsedColumn(),
transient=True,
console=console
) as progress:
progress.add_task(description=description, total=None)
start_time = time.time()
response = client.responses.create(
model=os.getenv("MODEL_FOR_VISION"),
input=input_data,
)
elapsed = time.time() - start_time
return response.output_text, elapsed
# Función para mostrar el resultado en un panel de Rich
def show_result_panel(text, elapsed_time, title, color):
"""Muestra el resultado en un panel de Rich."""
console.print(
Panel.fit(
f":hourglass_flowing_sand: [green]Tiempo de respuesta:[/green] {elapsed_time:.2f} segundos\n\n"
f":sparkles: [bold yellow]Descripción generada:[/bold yellow]\n"
f"{text}",
title=title,
border_style=color
)
)
# --- Análisis por URL ---
input_url = [{
"role": "user",
"content": [
{"type": "input_text", "text": "¿Qué ves en esta imagen?"},
{
"type": "input_image",
"image_url": IMAGE_URL,
"detail": "auto"
},
],
}]
description_url = "🔍 Analizando la imagen..."
text_url, elapsed_url = analyze_image_openai(description_url, input_url)
show_result_panel(text_url, elapsed_url, "Resultado Imagen por URL", "bright_blue")
# --- Análisis por base64 ---
base64_image = encode_image_to_base64(IMAGE_PATH_BASE64)
input_base64 = [{
"role": "user",
"content": [
{"type": "input_text", "text": "¿Qué ves en esta imagen?"},
{
"type": "input_image",
"image_url": f"data:image/jpeg;base64,{base64_image}",
},
],
}]
description_base64 = "🔍 Analizando la imagen en base64..."
text_base64, elapsed_base64 = analyze_image_openai(description_base64, input_base64)
show_result_panel(text_base64, elapsed_base64, "Resultado Imagen Base64", "bright_magenta")