# Streaming (SSE)

En vez de esperar el resultado completo, puedes recibir el run **en vivo** a medida que el Met piensa y responde. Meteor lo entrega como un stream de **Server-Sent Events (SSE)**.

## Con el SDK

```ts
for await (const ev of met.runs.stream({ input: '¿Qué puedo automatizar?' })) {
  switch (ev.type) {
    case 'run.output':
      process.stdout.write(ev.data);   // texto incremental
      break;
    case 'run.completed':
      console.log('\nlisto');
      break;
  }
}
```

El SDK parsea el stream y te entrega objetos `{ type, data }` tipados. Bajo el capó es el mismo `POST /workspaces/:id/runs` con `stream: true` y `Accept: text/event-stream`.

## Esquema de eventos

El stream emite un conjunto **cerrado y versionado** de eventos:

| Evento | Cuándo |
|---|---|
| `run.started` | El run arrancó |
| `run.step` | Un paso del Met (proyección curada del trace) |
| `run.output` | Fragmento de la respuesta |
| `run.completed` | Terminó bien |
| `run.failed` | Terminó con error |

`run.step` es una vista **curada**: expone el tipo de paso, la iteración, el nombre de la tool y el actor — **nunca** prompts internos, inputs crudos de tools, costos de proveedor ni conteo de tokens.

## Con curl

```bash
curl -N https://api.met.meteor.com.co/api/v1/workspaces/7/runs \
  -H "Authorization: Bearer $MET_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -d '{"input":"Hola","stream":true}'
```

El flag `-N` desactiva el buffering para ver los eventos llegar.

> El streaming no reintenta automáticamente: un stream cortado a la mitad no es reanudable de forma transparente. Para lógica crítica, combina el stream con un `retrieve()` final del run.
