# Imágenes

`met.images` genera, edita y anima imágenes desde tu código, por la **misma key** que el resto de la API. No necesitas contratar ni firmar contra un proveedor externo: Meteor corre el modelo, aloja el resultado y **debita Energía** a tu workspace por cada operación.

> Requiere una key **live** (`met_live_…`) con scope `integrations:execute`. Una key de test devuelve `403`. Además, tu workspace debe tener una **integración de imágenes ACTIVA** en el marketplace de MCPs; sin ella, la generación falla.

Como todas las operaciones con efectos, corre server-side:

```ts
import { Met } from '@meteor.ia/sdk';

const met = new Met(process.env.MET_KEY!, { workspaceId: 42 });
```

## Generar una imagen

```ts
const img = await met.images.generate({
  prompt: 'Mockup de una taza blanca con logo minimalista, fondo neutro',
  aspect_ratio: '1:1',
});

console.log(img.url);            // URL pública alojada por Meteor
console.log(img.format);         // 'png' | 'jpeg' | 'webp' | …
console.log(img.size_bytes);     // tamaño del archivo
console.log(img.model);          // modelo usado
console.log(img.energy_debited); // Energía debitada por esta operación
```

El resultado es una **URL pública alojada por Meteor**, no los bytes crudos. Guárdala o pásala directo a donde la necesites:

```ts
const mockup = await met.images.generate({ prompt: 'Empaque de café artesanal, luz de estudio' });
await met.contacts.update(310, { image: mockup.url });
```

`model` y `aspect_ratio` son opcionales. Si omites `model`, se usa el **modelo por defecto** de la integración activa. `aspect_ratio` acepta valores como `'1:1'`, `'16:9'`, `'9:16'` o `'3:4'`.

## Editar una imagen

Transforma una imagen existente pasándola en base64:

```ts
const edited = await met.images.edit({
  prompt: 'Cambia el fondo a azul degradado',
  image_base64: '...',   // la imagen base, en base64
});

console.log(edited.url);
```

Devuelve la misma forma que `generate` (`url`, `format`, `model`, `energy_debited`).

## Animar (video)

Genera un clip desde un prompt, opcionalmente animando una imagen inicial:

```ts
const clip = await met.images.video({
  prompt: 'La taza gira lentamente sobre la mesa',
  image_base64: '...',    // primer frame opcional (base64)
  duration_seconds: 4,
});

console.log(clip.url);              // URL del video alojado
console.log(clip.duration_seconds); // duración real del clip
console.log(clip.energy_debited);
```

`image_base64`, `duration_seconds` y `model` son opcionales.

## Costo

Cada `generate`, `edit` y `video` **debita Energía** a tu workspace y se atribuye a la key. El monto llega en `energy_debited` de la respuesta, y el consumo por API aparece separado del chat en tu dashboard. Si te faltan errores o paginación, mira [Errores e idempotencia](errores-e-idempotencia.html).
