Adicionar interação no frontend a uma Tool
Algumas Tools só precisam ser executadas no servidor e não exigem uma interface personalizada. Outras precisam que o usuário confirme, selecione ou edite parâmetros; nesse caso, é possível registrar um cartão, um modal ou uma lógica de execução no navegador para a Tool de mesmo nome.
O cartão no frontend cuida apenas da exibição e da interação entre a pessoa e o ToolCall. Isso não significa que a lógica de negócio da Tool será necessariamente executada no navegador.
Se o objetivo for apenas exibir opções como em suggestions e continuar o invoke() do servidor depois que o usuário fizer uma escolha, mantenha o padrão execution: 'backend'. Defina execution: 'frontend' e implemente o invoke no frontend somente quando a lógica da Tool realmente precisar acessar a página atual do navegador, o FlowModel ou o estado do editor.
Primeiro, defina os parâmetros e a lógica de execução no servidor
A Tool integrada suggestions está em:
Seu schema contém tanto as opções disponíveis quanto a escolha final do usuário:
Conforme a descrição da Tool, na primeira chamada o modelo deve gerar apenas options. Como essa Tool não define defaultPermission: 'ALLOW', a permissão padrão é ASK, e o ToolCall fica pausado enquanto aguarda uma ação do usuário.
Depois que o usuário faz uma escolha, o frontend usa decisions.edit() para combinar option com os parâmetros originais e retoma o ToolCall. Por fim, o invoke() do servidor retorna o conteúdo selecionado:
A implementação integrada também grava o resultado da seleção novamente em aiMessages.toolCalls, para que as mensagens do histórico continuem mostrando a opção escolhida quando forem renderizadas outra vez.
Criar o cartão da Tool
O cartão no frontend recebe ToolsUIProperties:
Este componente apresenta o uso geral de decisions.edit() e trata cliques repetidos e parâmetros em strings JSON. Em produção, também é necessário considerar conversas somente leitura, a mensagem ativa atual e o estado das seleções no histórico conforme a interface de chat em que o componente aparece. Consulte a implementação completa em packages/plugins/@nocobase/plugin-ai/src/client-v2/ai-employees/tools/SuggestionsOptionsCard.tsx.
decisions fornece três operações:
A implementação integrada de SuggestionsOptionsCard.tsx também trata estes detalhes:
- Aceita
optionstanto como array quanto como string JSON - Exibe um loading enquanto o ToolCall ainda está sendo gerado
- Permite escolher somente em ToolCalls com estado
interrupted - Desabilita os botões imediatamente após um clique para evitar envios repetidos
- Mantém e destaca a opção já selecionada nas mensagens do histórico
- Permite que somente a conversa atualmente editável acione a operação
Registrar no plugin do cliente
O nome registrado no frontend deve ser exatamente igual ao nome da Tool no servidor:
Se o arquivo no servidor for src/ai/tools/developerChoice.ts, registre developerChoice aqui.
O processo de registro da Tool integrada suggestions segue a mesma abordagem:
Em seguida, PluginAIClientV2.load() chama registerPluginAIClientV2BuiltinTools(this.ai.toolsManager), que combina o cartão com a definição da Tool de mesmo nome retornada pelo servidor.
Escolher entre cartão, modal e execução no frontend
Abaixo estão apenas as configurações mais comuns de ToolsOptions no cliente. Consulte o tipo completo em packages/core/client-v2/src/ai/tools-manager/types.ts.
Usar um cartão
Use card por padrão. O cartão é adequado para exibir o estado da execução, botões de confirmação e poucas opções no local do ToolCall.
Usar um modal
Adicione um modal quando houver muito conteúdo, necessidade de uma visualização maior ou edição complexa de parâmetros.
Executar a Tool no navegador
Se a Tool no servidor definir execution: 'frontend', o cliente também precisará fornecer invoke. Esse tipo de Tool é adequado para ler o contexto da página atual, o conteúdo do editor ou o estado do FlowEngine, mas não para gravar dados que exijam proteção por permissões do servidor.
Exemplo completo: adicionar um cartão de seleção a um funcionário de IA integrado
Depois de concluir o exemplo completo: criar um funcionário de IA integrado, você pode transformar a pergunta de acompanhamento do Dev Helper em opções clicáveis. Para isso, defina também uma Tool developerChoice e registre seu cartão no frontend. Coloque o arquivo do servidor em:
Essa Tool declara as opções e recebe a escolha do usuário:
Como developerChoice.ts pertence à Skill welcome-developer e está em seu diretório tools/, ela é vinculada automaticamente à Skill atual. Porém, o vínculo significa apenas que o modelo pode usar essa Tool, não que necessariamente a chamará.
Também é necessário atualizar o fluxo de trabalho em SKILLS.md, substituindo as etapas 5–6 originais por:
Reutilize no frontend o DeveloperChoiceCard definido anteriormente e salve-o em:
Por fim, registre-o em src/client-v2/plugin.tsx:
Depois de registrar o cartão, faça um novo build do cliente. Quando a conversa chegar a developerChoice, o ToolCall será pausado e exibirá opções clicáveis.
Links relacionados
- Definir uma Tool no servidor — defina a Tool no servidor correspondente ao cartão no frontend
- Exemplo completo: criar um funcionário de IA integrado — conclua primeiro o exemplo básico sem código no frontend
- Internacionalização de plugins para funcionários de IA — traduza os textos de Tools e Skills na interface de administração
- Plugin cliente — conheça o ponto de entrada do plugin cliente e o método
load()

