Um agente que age sobre os dados do app
O mesmo chat, com os passos do agente na tela. Cada ferramenta chamada é uma linha que dá para ler, e a única que muda alguma coisa não muda: ela abre um pedido na fila abaixo, onde uma pessoa decide. Só o modelo é roteirizado, no navegador — esta página não precisa de chave de API.
Pedido nº 1043
Ada Lovelace
- Cliente
- Ada Lovelace
- Situação
- Enviado
- Total
- R$ 32,90
- Feito em
- 1º de setembro de 2026
Pergunte onde está o pedido 1043 — ou peça para cancelar, e veja o que o agente faz em vez disso.
Experimente: “onde está meu pedido?”, “quanto custou?”, “cancelar o pedido 1043”.
O que está esperando uma pessoa
A ferramenta de escrita abre um pedido aqui e responde ao modelo que pediu. Aprove e o pedido muda — é o único caminho da conversa até os dados.
| Subject | Kind | State | Due | |
|---|---|---|---|---|
| Cancelar o pedido 1043 | order.cancel | Pending | no deadline |
// The tool that does not do what it says: cancelling is not the
// model's to do. It opens a request and tells the model so.
func AIAgentCancelTool(c *trilha.Ctx) *ai.Tool {
return ai.NewTool("cancel_order",
"Ask a person to cancel an order. This does not cancel anything.",
ai.Schema(`{"type":"object","properties":{"order_id":{"type":"string"},"reason":{"type":"string"}},"required":["order_id","reason"]}`),
ai.Typed(func(ctx context.Context, in struct {
OrderID string `json:"order_id"`
Reason string `json:"reason"`
}) (string, error) {
o, ok := AIAgentOrders.Find(AIAgentWho(c), in.OrderID)
if !ok {
return "there is no order " + in.OrderID + " on this account", nil
}
id, err := trilha.Use[*approval.Approvals](c).Open(c, approval.Request{
Kind: AIAgentCancelKind,
Subject: "Cancel order " + o.ID,
Target: "/orders/" + o.ID,
Assign: approval.Role("support"),
Due: time.Now().Add(AIAgentCancelDue),
Data: map[string]string{"order_id": o.ID, "reason": in.Reason},
})
if err != nil {
return "", err
}
return "request " + id + " is waiting for a person to decide; " +
"the order has not changed", nil
}))
}O que está fingindo
Só o modelo. O componente, os passos, a fila e os botões são os reais; não há servidor atrás desta página, porque o site da documentação é estático. O script responde os mesmos eventos que o ai.Serve emite, chamadas de ferramenta incluídas.