03Cómo empezar
Bibliotecas para Python y Node.jsNuevo
Los clientes ya hechos se encargan de la clave de idempotencia, de la espera del resultado y de la verificación de la firma del webhook. Los mismos cinco endpoints de la API, con menos código.
Este modelo no genera todas las resoluciones ni todas las relaciones de aspecto: los ejemplos usan las que tiene disponibles.
Instalación
# Python 3.11 y posteriores
$ pip install rendergrid# Node.js 22 y posteriores
$ npm install @rendergrid/sdkLa clave de la biblioteca se toma de la variable de entorno RENDERGRID_API_KEY. Puedes pasar otra fuente de forma explícita: Rendergrid(api_key=…).
La primera imagen
from rendergrid import Rendergrid client = Rendergrid() # la clave se toma de RENDERGRID_API_KEY creation = client.images.generate( model="nano-banana-pro", prompt="Taza de cerámica sobre mármol, luz suave de ventana", resolution="1K", aspect_ratio="4:5", ) print(creation.id, creation.status, creation.cost) result = creation.wait(timeout=180) # sondea como máximo una vez cada 5 segundos print(result.result_urls)
import { Rendergrid } from "@rendergrid/sdk"; // la clave se toma de RENDERGRID_API_KEY const client = new Rendergrid(); const creation = await client.images.generate({ model: "nano-banana-pro", prompt: "Taza de cerámica sobre mármol, luz suave de ventana", resolution: "1K", aspect_ratio: "4:5", }); console.log(creation.id, creation.status, creation.cost); // sondea como máximo una vez cada 5 segundos const result = await creation.wait({ timeoutMs: 180_000 }); console.log(result.result_urls);
generate envía la solicitud y devuelve la tarea aceptada. wait sondea la tarea hasta que pasa a completed o failed. Si en el tiempo fijado no hay resultado, recibirás un error con el id de la tarea: podrás continuar más tarde.
Lo que la biblioteca hace por ti
| Tarea | Qué hace la biblioteca | Más información |
|---|---|---|
| Clave de idempotencia | Crea X-Idempotency-Key por sí misma y la conserva en los reintentos | Reintentos sin doble cargo |
| Reintentos | Ante un corte de conexión, 429 y 5xx, repite la solicitud hasta tres veces y espera al menos Retry-After. Una respuesta que ya indica que no hace falta reintentar no se reintenta. La carga de una imagen de referencia (uploads.create) se reintenta solo cuando la solicitud con seguridad no llegó a la API: tras 429, 503 o una conexión rechazada | Límites |
| Espera | Sondea la tarea como máximo una vez cada 5 segundos y respeta min_interval_seconds | Tareas y estados |
| Errores | Convierte la respuesta en una excepción con los campos status, code, retryable y details | Códigos de error |
| Webhooks | Verifica la firma y la frescura de la marca de tiempo, y devuelve el evento ya analizado | Webhooks |
| Dinero | Entrega los importes como Decimal en Python y como cadenas en Node.js, no como números de coma flotante | Saldo |
Errores
import time import rendergrid try: creation = client.images.generate( model="nano-banana-pro", prompt="Taza de cerámica sobre mármol", ) except rendergrid.InsufficientBalance as e: need, have = e.details["required"], e.details["available"] print("Hace falta:", need, "disponible:", have) except rendergrid.RateLimited as e: time.sleep(e.retry_after) except rendergrid.APIError as e: print(e.status, e.code, e.retryable)
import { RendergridError } from "@rendergrid/sdk"; try { const creation = await client.images.generate({ model: "nano-banana-pro", prompt: "Taza de cerámica sobre mármol", }); } catch (error) { if (!(error instanceof RendergridError)) throw error; if (error.code === "ERR_INSUFFICIENT_BALANCE") { const { required, available } = error.details; console.log("Hace falta:", required, "disponible:", available); } else { console.log(error.status, error.code, error.retryable); } }
Las clases de error se nombran según el código de la API: ERR_INSUFFICIENT_BALANCE es InsufficientBalance y ERR_RATE_LIMIT, RateLimited. Todo lo demás es el APIError general.
Webhooks
import os from flask import Flask, request from rendergrid.webhooks import verify app = Flask(__name__) @app.post("/webhooks/rendergrid") def hook(): event = verify( secret=os.environ["RENDERGRID_WEBHOOK_SECRET"], headers=request.headers, body=request.get_data(), # los bytes originales, no request.json ) if not event.get("test"): save_result( event["id"], event["status"], event.get("result_urls") ) return "", 204
import express from "express"; import { verifyWebhook } from "@rendergrid/sdk/webhooks"; const app = express(); const raw = express.raw({ type: "application/json" }); app.post("/webhooks/rendergrid", raw, (req, res) => { const event = verifyWebhook({ secret: process.env.RENDERGRID_WEBHOOK_SECRET, headers: req.headers, body: req.body, // Buffer: los bytes originales del cuerpo }); if (!event.test) { saveResult(event.id, event.status, event.result_urls); } res.sendStatus(204); });
La firma se calcula sobre los bytes originales del cuerpo. Si el framework ya ha analizado el JSON y lo ha vuelto a montar, la firma no coincidirá.
Versiones y otros lenguajes
- Python
- 3.11 o posterior. El paquete
rendergridestá en PyPI. - Node.js
- 22 y posteriores. El paquete
@rendergrid/sdken npm; funciona también con TypeScript. - Versiones de la API
- Las bibliotecas trabajan con la API v1. Los campos nuevos en las respuestas no rompen las versiones antiguas de las bibliotecas.
La biblioteca no es obligatoria: todo lo que hace se puede hacer con solicitudes HTTPS normales, como en el «Inicio rápido». ¿No hay biblioteca para tu lenguaje? Toma la descripción OpenAPI y genera el cliente.