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

# Ver el documento en directo

> Recibe cada párrafo mientras se escribe, las páginas según se generan y el final.

`documents.stream` crea el documento y te da sus [eventos](/guides/events) según ocurren.

```ts theme={null}
for await (const event of doconda.documents.stream({ format: "docx", prompt: "Informe sobre el teletrabajo" })) {
  switch (event.type) {
    case "content.block_delta":
      process.stdout.write(String(event.data.text)) // el texto según se escribe
      break
    case "preview.page_ready":
      console.log(`\npágina ${event.data.page} de ${event.data.total}`)
      break
    case "document.ready":
      console.log("\n¡listo!")
      break
    case "document.failed":
      console.error(event.data.error)
  }
}
```

Cada evento trae `display.es`: un texto corto ("Revisando…", "¡Listo!") pensado para enseñarlo tal cual en tu interfaz.

## En tu web

La API key no puede ir al navegador, así que tu servidor hace de puente: recibe los eventos con el SDK y se los
reenvía a tu página. Por ejemplo, con una ruta de Next.js:

```ts app/api/informe/route.ts theme={null}
import { Doconda } from "@doconda/sdk"

const doconda = new Doconda()

export async function POST(req: Request) {
  const { prompt } = await req.json()
  const encoder = new TextEncoder()
  const body = new ReadableStream({
    async start(controller) {
      for await (const event of doconda.documents.stream({ format: "docx", prompt }, { signal: req.signal })) {
        controller.enqueue(encoder.encode(`data: ${JSON.stringify(event)}\n\n`))
      }
      controller.close()
    },
  })
  return new Response(body, { headers: { "content-type": "text/event-stream" } })
}
```

Si el usuario cierra la página, `signal` corta el stream. El documento sigue creándose igualmente; lo tienes en
`documents.get(id)`.

## Seguir un documento que ya existe

Si lo creaste en segundo plano, o se cortó la conexión, sigue sus eventos desde donde ibas:

```ts theme={null}
let last = 0
for await (const event of doconda.documents.events(doc.id, { after: last })) {
  last = event.sequence // guárdalo: con él se retoma sin perder ni repetir eventos
}
```

## Cancelar

```ts theme={null}
await doconda.documents.cancel(doc.id) // en cola o en curso; si ya terminó, no hace nada
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.