> ## 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 devolver documentos desde un agente de LangGraph

> Convierte doconda.tools() en StructuredTool y pásalas a tu grafo: el agente crea Word, PowerPoint, Excel o PDF y devuelve los enlaces.

Instala `langgraph` y `doconda`, convierte cada herramienta de `doconda.tools()` en un `StructuredTool` (su JSON Schema
vale como `args_schema`) y pásalas al agente o a un `ToolNode`. El agente llama a `create_document` y su último mensaje
trae los enlaces al Word, PowerPoint, Excel o PDF.

## Pasos

1. Guarda tu API key de Doconda (panel → **API keys**) en `DOCONDA_API_KEY` y la de tu proveedor de modelos (aquí,
   `OPENAI_API_KEY`).
2. Instala las dependencias: `pip install langgraph "langchain[openai]" doconda`.
3. Monta el grafo con las herramientas:

```python theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
from doconda import Doconda
from langchain.chat_models import init_chat_model
from langchain_core.tools import StructuredTool
from langgraph.graph import START, MessagesState, StateGraph
from langgraph.prebuilt import ToolNode, tools_condition


def as_langchain_tool(t):
    return StructuredTool(name=t.name, description=t.description, args_schema=t.input_schema, func=lambda **args: t.run(args))


tools = [as_langchain_tool(t) for t in Doconda().tools()]
model = init_chat_model("openai:gpt-5").bind_tools(tools)


def call_model(state: MessagesState):
    return {"messages": [model.invoke(state["messages"])]}


graph = (
    StateGraph(MessagesState)
    .add_node("model", call_model)
    .add_node("tools", ToolNode(tools))
    .add_edge(START, "model")
    .add_conditional_edges("model", tools_condition)
    .add_edge("tools", "model")
    .compile()
)

result = graph.invoke({"messages": [{"role": "user", "content": "Redacta un informe trimestral de ventas en Word"}]})
print(result["messages"][-1].content)
```

Si no necesitas tu propio grafo, `create_agent("openai:gpt-5", tools)` de `langchain.agents` es el agente ReAct
prebuilt de LangGraph y devuelve un grafo compilado igual: con `checkpointer`, streaming e interrupciones.

## Qué devuelve

El nodo `tools` añade al estado un `ToolMessage` con el resumen de la herramienta:

```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."
}
```

* Guarda el `id` en el estado del grafo si un paso posterior tiene que editar el documento (`edit_document`) o pedir
  enlaces nuevos (`get_document`): los enlaces caducan a los 5 minutos.
* `status`: `ready`, `ready_with_warnings`, `needs_review` o `failed` (no se cobra).

## Preguntas frecuentes

<AccordionGroup>
  <Accordion title="¿Puedo usar MCP en vez del SDK de Python?">
    Sí: las herramientas salen de `langchain-mcp-adapters` contra `https://api.eu.doconda.com/mcp`, como en
    [LangChain](/agents/langchain).
  </Accordion>

  <Accordion title="¿Puedo pedir una aprobación humana antes de enviar el documento?">
    Sí. Es un grafo compilado normal: pon una interrupción después del nodo `tools` y revisa el `status` y el informe
    (`get_report`) antes de seguir.
  </Accordion>

  <Accordion title="¿Qué formatos crea?">
    Word, PDF, PowerPoint, Excel y artifacts (una página web con sus datos). Word, PowerPoint y Excel llegan con su PDF.
  </Accordion>

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

## Sigue leyendo

* [LangGraph](/agents/langgraph): la guía completa.
* [Quickstart](/quickstart).


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