Tool Calls
Mostre o que um agente faz, uma linha por etapa. Leituras e buscas se dobram em um resumo curto, enquanto edições, comandos, aprovações e erros permanecem à vista. Cada etapa se abre em uma visão real: o arquivo, o diff, o terminal ou os resultados. Todos os estados de ferramenta do AI SDK são cobertos, incluindo aprovações com a opção de dar um motivo.
Agentes podem dar dezenas de pequenos passos antes de responder. Mostrar todos eles enterra a resposta, e escondê-los faz o agente parecer uma caixa-preta. O Tool Calls dá a cada etapa uma linha discreta que se lê como uma frase, como "Leu components/search.tsx" ou "Buscou por useResults, 3 resultados".
Leituras, buscas e consultas que ocorrem em sequência se dobram em um único resumo como "Explorou 6 arquivos". Tudo o que altera algo, exige uma decisão ou falha permanece em sua própria linha, com um cronômetro ao vivo enquanto roda. Abra qualquer etapa para ver o trabalho real: o arquivo, o diff, o terminal ou os resultados.
Todo estado de ferramenta do AI SDK tem sua própria aparência e redação, inclusive as aprovações. Aprovar oferece Allow, Deny, Always allow e "Tell it what to do instead", que envia suas palavras de volta como o motivo, com ⌘↵ e ⌘⌫ pelo teclado. getToolPartStatus mapeia as partes de ferramenta para você, e visões prontas cobrem resultados de busca, listas de arquivos, perguntas de múltipla escolha e JSON bruto.
Adicione o registro Pro ao components.json
components.json Adicione seu token
Crie um token na sua página de conta e coloque-o em
.env.localcomoHEXTAUI_PRO_TOKEN.Adicione o bloco
pnpm dlx shadcn@latest add @hextaui-pro/tool-calls
Com o AI SDK
Transforme as partes de ferramenta em passos com getToolPartStatus e escolha um kind e uma view para cada ferramenta. Passe stopped quando o chat parar de transmitir, para que uma chamada interrompida no meio exiba Cancelled em vez de girar para sempre.
Aprovando comandos
Marque uma ferramenta com needsApproval no servidor e responda com addToolApprovalResponse. Always allow memoriza o programa, e uma negação pode levar o que fazer em seu lugar como motivo. ⌘↵ e ⌘⌫ funcionam enquanto a etapa tem o foco.
Perguntando ao usuário
Uma ferramenta do cliente sem função execute aguarda uma resposta. Mostre as opções com AskUser e envie a escolha de volta com addToolOutput.
Anatomia
As partes que você compõe, de fora para dentro.
| Parte | Descrição |
|---|---|
ToolCalls | A lista. Agrupa execuções silenciosas e compartilha o tempo entre os passos. |
ToolCall | Uma etapa: ícone, frase, meta, cronômetro e seu conteúdo quando aberta. |
ToolGroup | Uma sequência dobrada de etapas discretas com uma linha de resumo. |
ToolApproval | O card de aprovar, negar e redirecionar, exibido dentro de um passo que aguarda aprovação. |
SearchResults, FileList, AskUser, ToolJson | Views para passar como conteúdo de um passo. |
ToolCalls
Também aceita todas as props de ol, exceto children.
| Prop | Tipo | Padrão |
|---|---|---|
callsOs passos na ordem em que foram executados. | ToolCallProps[] | – |
groupDobra sequências de etapas discretas. Defina false para mostrar todas as etapas. | boolean | true |
| Prop | Tipo | Padrão |
|---|---|---|
idId estável, geralmente o toolCallId. O tempo é mantido por id. | string | – |
statusstreaming, running, waiting, approval, done, error, denied ou cancelled. | ToolStatus | – |
kindread, search, list, edit, write, run, web, fetch, ask ou other. Define o ícone e o verbo. | ToolKind | "other" |
subjectSobre o que atuou: um caminho, consulta, URL ou comando. | string | – |
nameNome da ferramenta, usado na frase quando kind é other. | string | – |
titleSubstitui totalmente a frase gerada. | string | – |
metaResultado curto após a frase, como "3 resultados" ou "+12 −3". | ReactNode | – |
contentExibido quando a etapa é aberta. | ReactNode | – |
exitCodePara etapas de execução. Um valor diferente de zero marca a etapa como falha e a abre. | number | – |
errorMensagem exibida para o status de erro. | string | – |
durationDuração armazenada em segundos, para o histórico. | number | – |
approvalMotivo, resultado e rótulo de always-allow para as aprovações. | ToolCallApproval | – |
defaultOpenSubstitui se a etapa começa aberta. | boolean | – |
onApproveChamado por Allow ou Always allow. | (options: { always: boolean }) => void | – |
onDenyChamado por Deny, ou com o texto de "Tell it what to do instead". | (reason?: string) => void | – |
| Prop | Tipo | Padrão |
|---|---|---|
reasonPor que a aprovação é necessária, exibido acima dos botões. | string | – |
approvedA resposta, depois de dada. | boolean | – |
automaticAprovado por uma regra, então nenhum card é exibido. | boolean | – |
denialReasonO que a pessoa pediu em vez disso, exibido nos passos negados. | string | – |
alwaysLabelMostra "Always allow …" com este rótulo, por exemplo o nome do programa. | string | – |
getToolPartStatus(part, options)
Mapeia uma parte de ferramenta do AI SDK para um ToolStatus.
| Prop | Tipo | Padrão |
|---|---|---|
partA parte vinda de message.parts. | ToolUIPart | DynamicToolUIPart | – |
options.stoppedO chat foi interrompido, então chamadas inacabadas exibem Cancelled em vez de ficarem girando. | boolean | false |
options.waitingUma ferramenta do cliente está aguardando a pessoa, por exemplo AskUser. | boolean | false |
| Prop | Tipo | Padrão |
|---|---|---|
questionA pergunta. | string | – |
optionsAs opções. | { value, label, description? }[] | – |
answerO valor escolhido, depois de respondido. | string | – |
onAnswerEnvie de volta com addToolOutput. | (value: string) => void | – |
| Prop | Tipo | Padrão |
|---|---|---|
queryDestacado dentro de cada correspondência. | string | – |
matchesOs resultados. | { path, line, text }[] | – |
limitExibido antes de "Show all". | number | 6 |
| Tecla | Ação |
|---|---|
| EnterSpace | Abre ou fecha uma etapa ou um grupo dobrado. |
| ⌘↵ | Permite uma etapa que aguarda aprovação enquanto o foco está dentro dela. |
| ⌘⌫ | Nega uma etapa que aguarda aprovação enquanto o foco está dentro dela. |
| Esc | Sai de "Tell it what to do instead" sem enviar. |
- Os passos formam uma lista ordenada, então os leitores de tela anunciam quantos passos existem e em qual posição cada um está.
- Passos que precisam da pessoa são anunciados por uma região live educada (polite), como “Aprovação necessária: Run pnpm test”, junto com perguntas e erros. Passos de rotina ficam em silêncio para não sobrecarregar os leitores de tela.
- O status nunca é só cor: cada estado tem seu próprio ícone e redação.
- Os atalhos de aprovação são ignorados enquanto você digita em um campo, e o campo de redirecionamento se foca sozinho ao abrir e devolve o foco ao fechar.
Construído com
Os componentes gratuitos do HextaUI de que Tool Calls é feito. Cada um é instalado separadamente.
Código
8 arquivos, adicionados a components/blocks/tool-calls.