> ## 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.

# Generar un Excel desde un agente de Amazon Bedrock

> Cómo hacer que un agente de Amazon Bedrock cree un archivo Excel (.xlsx) y devuelva el enlace de descarga.

Vas a hacer un agente con Amazon Bedrock que, cuando le pides una hoja de cálculo, crea un Excel de verdad y te da el
enlace para descargarlo. El modelo decide cuándo llamar a Doconda; tú solo conectas las herramientas.

## Qué necesitas

* Una cuenta de AWS con un modelo de Bedrock activado y su id en `BEDROCK_MODEL_ID`.
* Las credenciales de AWS en tu entorno (`AWS_REGION`, `AWS_ACCESS_KEY_ID`…), como en el resto de tu código.
* Una API key de Doconda en `DOCONDA_API_KEY`. Créala en el panel, en **API keys**.
* Python 3.9+ o Node 20+.

## 1. Instala las dependencias

<CodeGroup>
  ```bash Python theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  pip install boto3 doconda
  ```

  ```bash TypeScript theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  npm install ai @ai-sdk/amazon-bedrock @doconda/sdk
  ```
</CodeGroup>

## 2. Conecta las herramientas y pide el Excel

`tools()` devuelve las herramientas de Doconda (crear, subir, revisar, editar, consultar…) con su nombre, su
descripción y su JSON Schema. Bedrock las recibe como `toolSpec`. El agente llama a `create_document` con `format: "xlsx"`, espera a que el archivo esté listo y responde con los
enlaces.

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

  import boto3
  from doconda import Doconda

  bedrock = boto3.client("bedrock-runtime")
  tools = Doconda().tools()
  tool_config = {"tools": [{"toolSpec": {"name": t.name, "description": t.description, "inputSchema": {"json": t.input_schema}}} for t in tools]}
  messages = [{"role": "user", "content": [{"text": "Hazme un Excel con el presupuesto del evento: sala, catering, sonido y viajes"}]}]

  while True:
      res = bedrock.converse(modelId=os.environ["BEDROCK_MODEL_ID"], messages=messages, toolConfig=tool_config)
      message = res["output"]["message"]
      messages.append(message)
      if res["stopReason"] != "tool_use":
          break
      results = []
      for block in message["content"]:
          if "toolUse" in block:
              use = block["toolUse"]
              out = next(t for t in tools if t.name == use["name"]).run(use["input"])
              results.append({"toolResult": {"toolUseId": use["toolUseId"], "content": [{"text": json.dumps(out)}]}})
      messages.append({"role": "user", "content": results})

  print("".join(block.get("text", "") for block in message["content"]))
  ```

  ```ts TypeScript theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  import { bedrock } from "@ai-sdk/amazon-bedrock"
  import { generateText, isStepCount, jsonSchema, tool } from "ai"
  import { Doconda } from "@doconda/sdk"

  const doconda = new Doconda()
  const tools = Object.fromEntries(
    doconda.tools().map((t) => [
      t.name,
      tool({ description: t.description, inputSchema: jsonSchema(t.inputSchema), execute: (input) => t.run(input as Record<string, unknown>) }),
    ]),
  )

  const { text } = await generateText({
    model: bedrock(process.env.BEDROCK_MODEL_ID!),
    tools,
    stopWhen: isStepCount(5),
    prompt: "Hazme un Excel con el presupuesto del evento: sala, catering, sonido y viajes",
  })

  console.log(text)
  ```
</CodeGroup>

El bucle de Python es el de la API Converse: mientras el modelo pida una herramienta (`stopReason == "tool_use"`), la
ejecutas y le devuelves el resultado. En TypeScript, el AI SDK hace ese bucle por ti.

## Resultado

La herramienta devuelve al modelo algo así, y el modelo se lo pasa al usuario en su respuesta:

```json theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
{
  "id": "doc_01JAB3…",
  "format": "xlsx",
  "status": "ready",
  "links": { "xlsx": "https://…", "pdf": "https://…" },
  "links_note": "Links expire in 5 minutes: call get_document for fresh ones."
}
```

Tienes el Excel (`.xlsx`) y su versión en PDF. Los enlaces caducan a los 5 minutos; si el usuario los pide más tarde,
el agente llama a `get_document` y obtiene otros nuevos.

## Siguientes pasos

* [Amazon Bedrock](/agents/bedrock): la guía completa, también con la API Converse en TypeScript.
* [SDK de Python](/sdk/python): todos los métodos, por si quieres llamar a Doconda sin agente.
* [Ejemplos completos en GitHub](https://github.com/B-C-Software/doconda-examples).


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