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

# Agent Studio

> Inspecciona un agente, prueba la working copy en un sandbox, publica solo cuando lo dices en serio.

URL: `https://mcp.chatsailer.com/mcp/studio`

Inspecciona y prueba agentes de Sailer AI. Las ediciones aplican a la
**working copy**. Las conversaciones en vivo siguen corriendo la versión
publicada hasta que alguien publique.

Conecta este servidor solo si realmente editas agentes. Es un audience OAuth
separado — un token de CRM es 401 aquí, no "scope faltante". Vuelve a
conectar; no reintentes.

<Note>
  La primera conexión es [solo lectura](/es/mcp/auth). `publish_agent` y el
  sandbox no van a aparecer hasta que vuelvas a conectar con `agents:publish`
  y `sandbox:run`.
</Note>

`whoami` también está montado aquí. La misma tool que en CRM: qué workspace,
quién autorizó, qué scopes.

## Inspeccionar

### `list_agents`

Scope: `agents:read`. Más nuevos primero, `limit` 1–100 (default 25).
Devuelve `id`, `name`, `is_published`. Úsalo para obtener un `agent_id`.

> Which agents are in this workspace?

### `get_agent_graph`

Scope: `agents:read`. Nodos y connections de la working copy. Los nodos se
dirigen por una key estable (con fallback al name) — habla en esas keys, no
en ids internos. El resultado incluye un `head_hash`; pásalo de vuelta en
cualquier write para que una edición concurrente se detecte en vez de
sobrescribirse en silencio.

> Show me this agent's graph.

### `validate_agent`

Scope: `agents:read`. Cada problema de una vez, dirigido por node key. Una
lista vacía significa que el graph publicaría limpio.

> Is this agent's graph valid?

### `diff_agent_vs_production`

Scope: `agents:read`. Qué cambiaría si publicaras ahora mismo, más el
`head_hash` y el `change_count` que `publish_agent` exige.

> What would change if I published this agent?

Llama esto antes de hacer ship. Publicar sin haber leído el diff recién se
rechaza.

## Publicar

### `publish_agent`

Scope: `agents:publish`. Destructivo. Las conversaciones en vivo de clientes
empiezan a usar la working copy **de inmediato**. Envia todos los cambios no
publicados, no un subconjunto seleccionado.

Required, y verificado del lado del servidor:

* `expected_head_hash` — de `get_agent_graph` o `diff_agent_vs_production`
* `acknowledged_change_count` — de `diff_agent_vs_production`

Si alguien más editó el agente en el medio, la llamada falla y te dice que
hagas diff de nuevo. `version_name` / `version_description` opcionales
aterrizan en el historial de versiones.

`agents:publish` está separado de read a propósito: puedes entregar una
conexión que itera sobre un draft y no puede hacerle ship.

> Diff this agent against production, then publish it.

## Sandbox

El sandbox corre la working copy. Nada aquí toca clientes reales. Un turno
toma decenas de segundos, así que son dos tools en vez de una: una llamada
bloqueante moriría en el load balancer después de que el trabajo ya se
hubiera committed.

### `start_sandbox_turn`

Scope: `sandbox:run`. Envía un mensaje (máximo 4,000 caracteres). Devuelve
de inmediato un `turn_id`.

| Argumento          | Qué hace                                                                       |
| ------------------ | ------------------------------------------------------------------------------ |
| `message`          | Lo que dice el contacto simulado                                               |
| `agent_id`         | Qué agente responde. Omítelo para dejar que la cola decida — eso es production |
| `queue_id`         | Enruta a una cola específica                                                   |
| `conversation_key` | Continúa una conversación de sandbox anterior. Omítelo para empezar de cero    |

El comportamiento multi-turno depende del historial. Un graph que solo se
porta mal en el tercer turno no se reproduce un mensaje a la vez — pasa el
mismo `conversation_key` de vuelta.

> In the sandbox, say hi to this agent as a new contact.

### `get_sandbox_turn`

Scope: `sandbox:run`. Haz poll con el `turn_id`. Mientras `settled` sea
false, el agente todavía puede responder — eso no es silencio. Una vez
settled, `outcome` dice qué pasó y `remedy` dice qué hacer al respecto. "No
reply" tiene varias causas; no son el mismo arreglo.

> Has that sandbox turn finished?

### `get_turn_trace`

Scopes: `sandbox:run` **y** `inference:read`. Llama después de que el turno
se haya settled. Qué edges se evaluaron, cuál se tomó, y por cada uno que
perdió, qué condición falló y qué valor tenía realmente el campo comparado.

Esta es la tool para "¿por qué no avanzó?". Suele ser un gate que comparó un
campo que nunca se recolectó — `actual` es null y `likely_cause` nombra el
campo. No incluye prompts ni completions del modelo.

> Why didn't the agent leave that node?
