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

# Cómo generar archivos en un chatbot con el AI SDK de Vercel

> Pasa doconda.tools() a streamText en tu ruta de Next.js: el bot crea Word, PowerPoint, Excel o PDF y responde con el enlace.

Instala `ai` y `@doconda/sdk`, convierte `doconda.tools()` en herramientas del AI SDK con `tool()` y `jsonSchema()`, y
pásalas a `streamText` en tu ruta de chat. Cuando el usuario pide un documento, el modelo llama a `create_document` y su
respuesta trae el enlace de descarga, que `useChat` pinta en la interfaz.

## Pasos

1. Guarda tu API key de Doconda (panel → **API keys**) en `DOCONDA_API_KEY` y la de tu proveedor de modelos (aquí,
   `ANTHROPIC_API_KEY`; vale cualquiera del AI SDK).
2. Instala las dependencias: `npm install ai @ai-sdk/anthropic @ai-sdk/react @doconda/sdk`.
3. Crea la ruta del chat (en el servidor) y la página:

<CodeGroup>
  ```ts app/api/chat/route.ts theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  import { anthropic } from "@ai-sdk/anthropic"
  import { convertToModelMessages, isStepCount, jsonSchema, streamText, tool, type UIMessage } 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>) }),
    ]),
  )

  export async function POST(req: Request) {
    const { messages }: { messages: UIMessage[] } = await req.json()
    const result = streamText({
      model: anthropic("claude-sonnet-5-5"),
      system: "Si el usuario pide un documento, créalo y dale el enlace de descarga.",
      messages: await convertToModelMessages(messages),
      tools,
      stopWhen: isStepCount(5),
    })
    return result.toUIMessageStreamResponse()
  }
  ```

  ```tsx app/page.tsx theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  "use client"

  import { useChat } from "@ai-sdk/react"
  import { useState } from "react"

  export default function Chat() {
    const { messages, sendMessage } = useChat()
    const [input, setInput] = useState("")

    return (
      <main>
        {messages.map((m) => (
          <p key={m.id}>
            <b>{m.role}:</b> {m.parts.map((p) => (p.type === "text" ? p.text : "")).join("")}
          </p>
        ))}
        <form
          onSubmit={(e) => {
            e.preventDefault()
            sendMessage({ text: input })
            setInput("")
          }}
        >
          <input value={input} onChange={(e) => setInput(e.target.value)} placeholder="Pide un documento…" />
        </form>
      </main>
    )
  }
  ```
</CodeGroup>

El agente llama a Doconda desde tu servidor, así que la API key nunca llega al navegador. Usa el SDK solo en el
servidor.

## Qué devuelve

La herramienta devuelve al modelo este resumen, y el modelo escribe el enlace en su respuesta:

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

* `links`: el archivo (`docx`, `pptx` o `xlsx`) y su PDF, o solo el PDF con `format: "pdf"`.
* Los enlaces caducan a los 5 minutos; si el usuario vuelve más tarde, el agente llama a `get_document` y obtiene otros.
* `status`: `ready`, `ready_with_warnings`, `needs_review` o `failed` (no se cobra).

## Preguntas frecuentes

<AccordionGroup>
  <Accordion title="¿Puedo enseñar el documento escribiéndose en la web?">
    Sí, sin exponer la key: mira [Ver el documento en directo](/sdk/stream).
  </Accordion>

  <Accordion title="¿Funciona con el cliente MCP del AI SDK?">
    Sí: `createMCPClient` de `@ai-sdk/mcp` contra `https://api.eu.doconda.com/mcp` con tu key en `Authorization`.
  </Accordion>

  <Accordion title="¿Funciona con OpenAI, Gemini o Bedrock?">
    Sí, cambia el `model`: las herramientas son las mismas con cualquier proveedor del AI SDK.
  </Accordion>

  <Accordion title="¿Cuánto cuesta?">
    Pagas por documento entregado. Ver [precios](/guides/account#precios).
  </Accordion>
</AccordionGroup>

## Sigue leyendo

* [AI SDK](/agents/ai-sdk): la guía completa.
* [Un chatbot con Vercel AI SDK que devuelve un Word](/tutorials/ai-sdk-chatbot-word): el tutorial paso a paso.
* [Quickstart](/quickstart).


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