Confirmation
Prompt de aprovação human-in-the-loop para chamadas de tool, com estados de request, aprovado e rejeitado orientados pelo estado da tool.
Visão geral
Confirmation bloqueia uma chamada de tool até que o usuário aprove ou rejeite. Ele envolve um Alert e expõe três componentes de slot (ConfirmationRequest, ConfirmationAccepted, ConfirmationRejected) que se mostram ou ocultam automaticamente com base no estado do ToolUIPart do AI SDK e no veredito de aprovação.
Use para operações irreversíveis (deletes, pagamentos, deploys, write-to-prod) onde o usuário precisa confirmar antes da tool executar.
Preview
Solicitando aprovação
'use client';import { Confirmation, ConfirmationRequest, ConfirmationTitle,} from '@gremorie/rx-ai';import { Button } from '@gremorie/rx-forms';export function ConfirmationRequestPreview() { return ( <Confirmation approval={{ id: '1' }} state="approval-requested" className="border" > <ConfirmationTitle> Approve file write to /tmp/output.txt? </ConfirmationTitle> <ConfirmationRequest> <div className="mt-2 flex gap-2"> <Button size="sm">Approve</Button> <Button size="sm" variant="outline"> Reject </Button> </div> </ConfirmationRequest> </Confirmation> );}Aprovado
'use client';import { Confirmation, ConfirmationAccepted, ConfirmationTitle,} from '@gremorie/rx-ai';export function ConfirmationApprovedPreview() { return ( <Confirmation approval={{ id: '1', approved: true }} state="approval-responded" className="border" > <ConfirmationTitle>File written</ConfirmationTitle> <ConfirmationAccepted>Approved by user.</ConfirmationAccepted> </Confirmation> );}Rejeitado
Anatomia
Confirmation
├─ ConfirmationTitle
├─ ConfirmationRequest mostrado enquanto pendente
├─ ConfirmationActions
│ └─ ConfirmationAction botões de aceitar / rejeitar
├─ ConfirmationAccepted mostrado quando aprovado
└─ ConfirmationRejected mostrado quando rejeitadoInstalação
bash npx gremorie@latest add rx-confirmation bash pnpm dlx gremorie@latest add rx-confirmation
bash yarn dlx gremorie@latest add rx-confirmation
bash bunx --bun gremorie@latest add rx-confirmation
Uso
import {
Confirmation,
ConfirmationTitle,
ConfirmationRequest,
ConfirmationAccepted,
ConfirmationRejected,
ConfirmationActions,
ConfirmationAction,
} from "@gremorie/rx-ai";
export function Example({ state, approval, approve, reject }) {
return (
<Confirmation state={state} approval={approval}>
<ConfirmationTitle>Run delete_records on production?</ConfirmationTitle>
<ConfirmationRequest>
<ConfirmationActions>
<ConfirmationAction variant="outline" onClick={reject}>
Reject
</ConfirmationAction>
<ConfirmationAction onClick={approve}>Approve</ConfirmationAction>
</ConfirmationActions>
</ConfirmationRequest>
<ConfirmationAccepted>Tool executed.</ConfirmationAccepted>
<ConfirmationRejected>Tool blocked.</ConfirmationRejected>
</Confirmation>
);
}A edição Angular deste componente é distribuída a partir do source hoje (veja o workbench para o lado a lado); sua entrada no registry vem a seguir.
API
<Confirmation>
| Prop | Type | Default | Description |
|---|---|---|---|
state | ToolUIPart["state"] | - | Estado obrigatório da chamada de tool vindo do AI SDK. O componente retorna null enquanto o estado é input-streaming ou input-available. |
approval | { id: string; approved?: boolean; reason?: string } | - | Payload de aprovação obrigatório. Determina qual slot é renderizado. |
Estende ComponentProps<typeof Alert>.
<ConfirmationTitle>
Renderiza um AlertDescription inline. Use para o texto do prompt.
<ConfirmationRequest> / <ConfirmationAccepted> / <ConfirmationRejected>
| Component | Renderiza quando |
|---|---|
ConfirmationRequest | state === "approval-requested" |
ConfirmationAccepted | approval.approved === true e o estado é approval-responded, output-denied ou output-available |
ConfirmationRejected | approval.approved === false e o estado é approval-responded, output-denied ou output-available |
Cada um aceita children: ReactNode.
<ConfirmationActions> / <ConfirmationAction>
| Prop | Type | Default | Description |
|---|---|---|---|
children | ReactNode | - | Botões de ação. O container só renderiza durante approval-requested. |
ConfirmationAction estende as props de Button com um size padrão menor (h-8 px-3 text-sm).
useConfirmation()
Hook que retorna { approval, state }. Lança erro quando usado fora de <Confirmation>. Útil para slots customizados.
Composição
<Confirmation>envolve umAlerte provê o context de estado.<ConfirmationTitle>é a pergunta em destaque.<ConfirmationRequest>mostra apenas enquanto a aprovação está pendente. Coloque as ações dentro.<ConfirmationActions>+<ConfirmationAction>são os botões de Approve / Reject.<ConfirmationAccepted>/<ConfirmationRejected>mostram o resultado resolvido.
Variações
Alert de três estados
Renderize cada slot para que o mesmo JSX sirva todo o ciclo de vida.
<Confirmation state={state} approval={approval}>
<ConfirmationTitle>Charge $499 to the saved card?</ConfirmationTitle>
<ConfirmationRequest>
<ConfirmationActions>
<ConfirmationAction variant="outline" onClick={reject}>
Cancel
</ConfirmationAction>
<ConfirmationAction onClick={approve}>Charge</ConfirmationAction>
</ConfirmationActions>
</ConfirmationRequest>
<ConfirmationAccepted>Card charged successfully.</ConfirmationAccepted>
<ConfirmationRejected>Charge cancelled.</ConfirmationRejected>
</Confirmation>Variant destrutiva
Use variants de Alert e um botão de ação destrutivo para sinalizar severidade.
<Confirmation state={state} approval={approval} variant="destructive">
<ConfirmationTitle>Permanently delete 1,204 records?</ConfirmationTitle>
<ConfirmationRequest>
<ConfirmationActions>
<ConfirmationAction variant="outline" onClick={reject}>
Keep them
</ConfirmationAction>
<ConfirmationAction variant="destructive" onClick={approve}>
Delete
</ConfirmationAction>
</ConfirmationActions>
</ConfirmationRequest>
</Confirmation>Aprovação com motivo
Exiba o motivo da rejeição capturado em approval.reason.
<Confirmation state={state} approval={approval}>
<ConfirmationTitle>Deploy to production?</ConfirmationTitle>
<ConfirmationRejected>
<p>Deploy blocked. Reason: {approval?.reason ?? 'no reason given'}.</p>
</ConfirmationRejected>
</Confirmation>Acessibilidade
- Teclado: botões de ação participam da ordem de tab e respondem a Enter / Space.
- ARIA: o
Alertsubjacente expõerole="alert"para que leitores de tela anunciem o prompt quando ele aparece. - Leitores de tela: cada slot usa texto semântico, então o texto de request, aceito e rejeitado é lido sequencialmente conforme o estado transiciona.
- Gestão de foco: quando o prompt monta, mova o foco programaticamente para a ação primária para que usuários de teclado possam confirmar sem procurar por ela.