> ## 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](/es/guides/events) según ocurren.

<CodeGroup>
  ```ts TypeScript theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  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)
    }
  }
  ```

  ```python Python theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  import sys

  for event in doconda.documents.stream(format="docx", prompt="Informe sobre el teletrabajo"):
      if event["type"] == "content.block_delta":
          print(event["data"]["text"], end="", flush=True)  # el texto según se escribe
      elif event["type"] == "preview.page_ready":
          print(f"\npágina {event['data']['page']} de {event['data']['total']}")
      elif event["type"] == "document.ready":
          print("\n¡listo!")
      elif event["type"] == "document.failed":
          print(event["data"]["error"], file=sys.stderr)
  ```
</CodeGroup>

Muchos eventos traen `display`, un texto corto en español y en inglés (`display.es`: "Revisando…"; `display.en`:
"Reviewing…") pensado para enseñarlo tal cual en tu interfaz. Es opcional: otros, como `content.block_delta`, no lo
llevan.

## 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 (`app/api/informe/route.ts`) o de FastAPI:

<CodeGroup>
  ```ts TypeScript theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  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" } })
  }
  ```

  ```python Python theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  import json

  from doconda import Doconda
  from fastapi import FastAPI, Request
  from fastapi.responses import StreamingResponse

  app = FastAPI()
  doconda = Doconda()


  @app.post("/api/informe")
  async def informe(req: Request):
      prompt = (await req.json())["prompt"]
      events = doconda.documents.stream(format="docx", prompt=prompt)
      body = (f"data: {json.dumps(event)}\n\n" for event in events)
      return StreamingResponse(body, media_type="text/event-stream")
  ```
</CodeGroup>

Si el usuario cierra la página, `signal` corta el stream (en Python no hay `signal`: basta con dejar de leer el
generador). 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:

<CodeGroup>
  ```ts TypeScript theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  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
  }
  ```

  ```python Python theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  last = 0
  for event in doconda.documents.events(doc["id"], after=last):
      last = event["sequence"]  # guárdalo: con él se retoma sin perder ni repetir eventos
  ```
</CodeGroup>

## Cancelar

<CodeGroup>
  ```ts TypeScript theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  await doconda.documents.cancel(doc.id) // en cola o en curso; si ya terminó, no hace nada
  ```

  ```python Python theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  doconda.documents.cancel(doc["id"])  # en cola o en curso; si ya terminó, no hace nada
  ```
</CodeGroup>


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