Ir para o conteúdo
Trilha

Um chat de IA dentro do app

O chat da receita, sobre o registro de que ele fala. O componente, o cliente de streaming e o contexto que a página envia são os reais; só a resposta do modelo é determinística e roda no navegador — por isso 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 o que quiser sobre este pedido — onde está, quando chega, quanto custou.

app/api/chat/route.go
// app/api/chat/route.go
func POST(c *trilha.Ctx) error {
	who := AIChatWho(c)
	if ok, after := AIChatLimit.Allow(who); !ok {
		c.Header("Retry-After", strconv.Itoa(after))
		return trilha.Errorf(http.StatusTooManyRequests, "too many questions")
	}
	c.Audit("ai.chat.asked", who)
	return ai.ServeOpts{
		HTML:    ui.ChatHTML,
		Context: AIChatContext,
		Page:    AIChatAnswerPage,
	}.Serve(c, AIChatClient, AIChatAgent())
}

// the page
ui.Chat(c, ui.ChatOpts{
	Action:  "/api/chat",
	History: AIChatLog.Read(AIChatWho(c)),
	Context: map[string]string{"order_id": o.ID},
})
ui.ChatScript(c)

O que está fingindo

Só a resposta. Não há servidor atrás desta página: o site da documentação é estático, e o script responde os mesmos eventos que o ai.Serve emite. Num aplicativo o formulário também funciona com o JavaScript desligado — a mesma rota responde tudo de uma vez e a página volta com a resposta dentro.

Ler a receita: Chat de IA