> ## Documentation Index
> Fetch the complete documentation index at: https://docs.markpdf.tech/llms.txt
> Use this file to discover all available pages before exploring further.

# Streaming y trabajos asincrónicos

> Consuma /convert/stream y maneje 202 (auto-asíncrono) con SDK de Python.

# Streaming y trabajos asincrónicos

Hay dos mecanismos "asincrónicos" diferentes en API y SDK los maneja por separado:

1. **Transmisión de respuesta** (`/convert/stream`, `/convert/stream-from-url`): el servidor genera el Markdown en fragmentos progresivos durante la conversión, para reducir el TTFB en documentos grandes.
2. **Trabajos de saturación** (`202`): cuando todos los servidores están ocupados, cualquier punto final de conversión pone en cola la solicitud y responde `202` con un `job_id` para realizar una consulta más tarde. Consulte [`GET /jobs/{id}`](/docs/public/es/api/jobs).

## Transmitiendo con `convert_stream`

```python theme={null}
import markpdf

client = markpdf.Client(api_key="YOUR_API_KEY")

for chunk in client.convert_stream("informe-grande.pdf"):
    print(chunk, end="", flush=True)
```

`convert_stream` devuelve un iterador `Iterator[str]`; cada elemento es un fragmento de Markdown, no necesariamente una línea o página completa. Concatenarlos para reconstruir el documento.

<CodeGroup>
  ```python Local file theme={null}
  for chunk in client.convert_stream("report.pdf", slim=True):
      handle(chunk)
  ```

  ```python Desde URL theme={null}
  for chunk in client.convert_stream(url="https://bucket.example.com/report.pdf?sig=...", slim=True):
      handle(chunk)
  ```

  ```python Async theme={null}
  async with markpdf.AsyncClient(api_key="YOUR_API_KEY") as client:
      async for chunk in client.convert_stream("report.pdf"):
          handle(chunk)
  ```
</CodeGroup>

### `stream_slim_strategy`

Controla cómo se limpian los encabezados y pies de página repetidos sin sacrificar demasiado TTFB:

```python theme={null}
client.convert_stream("report.pdf", slim=True, stream_slim_strategy="sampled")
```

* `"off"`: streaming puro por página, sin detección de ruido. TTFB mínimo.
* `"sampled"` (predeterminado): muestree las primeras páginas en busca de ruido y luego genere por página.
* `"full"`: materializa el documento completo antes de su emisión. Mejor limpieza, peor TTFB.

Consulte [Parámetros](/docs/public/es/api/parameters#streaming-only-parameters).

<Note />

## Empleos por saturación (202)

De forma predeterminada, `convert_file` y `convert_from_url` manejan `202` de forma transparente:

```python theme={null}
# auto_poll=True (default): SDK waits and polls for you
markdown = client.convert_file("report.pdf")
```

Internamente, si el servidor responde `202`, el SDK:

1. Lea `job_id` y `retry_after_seconds` de la respuesta.
2. Dormir `retry_after_seconds` (5 segundos por defecto).
3. Llama `GET /jobs/{job_id}`.
4. Repite mientras `status` sea `"queued"` o `"processing"`.
5. Devuelve `body` cuando `status == "completed"`, o arroja `MarkpdfJobFailedError` si `status == "failed"`.

### Manual de encuestas

Si prefieres controlar el bucle tú mismo (por ejemplo, para mostrar el progreso en una interfaz de usuario), desactiva la encuesta automática:

```python theme={null}
from markpdf import MarkpdfJobQueuedError

try:
    markdown = client.convert_file("report.pdf", auto_poll=Failedse)
except MarkpdfJobQueuedError as job:
    print(f"En cola: {job.job_id}")
    while True:
        status = client.get_job(job.job_id)
        if status.status == "completed":
            markdown = status.body
            break
        if status.status == "failed":
            raise RuntimeError(status.error)
        time.sleep(job.retry_after_seconds)
```

<Tip>
  En condiciones de carga normales, nunca verá `202`; solo sucede cuando todos los backends están saturados. No necesita diseñar su aplicación asumiendo que siempre sucederá; `auto_poll=True` (el valor predeterminado) ya lo cubre sin código adicional.
</Tip>

<Warning>
  Los resultados de los trabajos completados caducan en aproximadamente 1 hora. Si guarda `job_id` para referencia posterior y recibe `404`, reenvíe la conversión original.
</Warning>
