# Ejecutar Mets (Runs)

Un **Run** es una ejecución del Met de tu workspace sobre un `input`. Es el corazón de "infraestructura agéntica como servicio": el mismo Met que responde en el chat, ahora disparado por código.

## Ejecución básica

```ts
const run = await met.runs.create({ input: 'Resume los leads de hoy' });

console.log(run.status);  // 'completed'
console.log(run.output);  // el resultado del Met
```
```python
run = met.runs.create("Resume los leads de hoy")

print(run["status"])  # 'completed'
print(run["output"])  # el resultado del Met
```
```bash
curl -X POST https://api.met.meteor.com.co/api/v1/workspaces/7/runs \
  -H "Authorization: Bearer $MET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":"Resume los leads de hoy"}'
```

El request es `POST /workspaces/:id/runs`. La respuesta es un recurso `run` con id opaco (`run_…`), `status`, `output`, `livemode` y `metadata`.

## Elegir el Met (bind determinístico)

Pasa `met` (nombre o id de un Met del workspace) para ejecutar **ese** Met directo, con sus Funciones y tools, sin pasar por el orquestador:

```ts
await met.runs.create({ met: 'Valeria', input: '¿Cuántos leads cerré?' });
```
```python
met.runs.create("¿Cuántos leads cerré?", met="Valeria")
```

El nombre se resuelve sin distinguir mayúsculas (coincidencia exacta y luego por prefijo). Si omites `met`, el **orquestador** del workspace auto-rutea al Met adecuado (igual que en el chat).

## Memoria: conversaciones

Sin `conversation_id`, el run corre en una **conversación efímera** (sin memoria previa). Para darle continuidad, pasa una conversación existente:

```ts
await met.runs.create({ input: 'Y el mes pasado?', conversation_id: 1234 });
```

Con `conversation_id`, el primer `met` que envías queda **fijado como default de la conversación**: los runs siguientes que omitan `met` corren ese mismo Met. Un `met` explícito siempre gana sobre el default.

## Visión: imágenes y archivos

Pasa adjuntos en `attachments` para que el Met "vea" una imagen o lea un documento (con OCR automático para el texto de una imagen):

```ts
await met.runs.create({
  met: 'Valeria',
  input: '¿Este rótulo instalado coincide con el diseño aprobado?',
  attachments: [{ url: 'https://…/foto.jpg', kind: 'image' }],
});
```

Cada adjunto es `{ url, mime_type?, name?, kind? }`, con `kind` = `image` · `document` · `audio` · `video` · `file`. Una URL suelta dentro del `input` **no** se "ve": tiene que ir en `attachments`.

## Leer runs

```ts
const run = await met.runs.retrieve('run_01J8…');   // estado + salida

for await (const r of met.runs.iterate()) {           // historial completo
  console.log(r.id, r.status);
}
```
```python
run = met.runs.retrieve("run_01J8…")   # estado + salida

for r in met.runs.iterate():           # historial completo
    print(r["id"], r["status"])
```

`iterate()` recorre todas las páginas por ti (ver [Errores y paginación](errores-e-idempotencia.html)).

## Costo

Cada run debita **Energía** por el mismo ledger de siempre, marcado `execution_type='api'` y atribuido a la key. En tu dashboard, el consumo por API aparece separado del chat interno.

> ¿Streaming? Si quieres procesar el resultado a medida que se genera, mira la guía de [Streaming](streaming.html).
