Añadir interacción frontend a una Tool
Algunas Tools solo necesitan ejecutarse en el servidor y no requieren una interfaz personalizada. Otras necesitan que el usuario confirme, seleccione o edite parámetros; en esos casos puedes registrar una tarjeta, un modal o lógica de ejecución en el navegador para la Tool del mismo nombre.
Una tarjeta frontend solo se ocupa de mostrar el ToolCall y gestionar la interacción entre la persona y la IA. No implica que la lógica de negocio de la Tool se ejecute necesariamente en el navegador.
Si solo muestras opciones como hace suggestions y continúas con el método invoke() del servidor después de que el usuario elija, conserva el valor predeterminado execution: 'backend'. Configura execution: 'frontend' e implementa el método invoke frontend únicamente cuando la lógica real de la Tool necesite acceder a la página actual del navegador, a un FlowModel o al estado del editor.
Define primero los parámetros y la lógica de ejecución en el servidor
La Tool integrada suggestions se encuentra en:
Su schema contiene tanto las opciones disponibles como la selección final del usuario:
Según la descripción de la Tool, en la primera llamada el modelo solo debe generar options. Como esta Tool no establece defaultPermission: 'ALLOW', el permiso predeterminado es ASK y el ToolCall se pausa a la espera de una acción del usuario.
Después de que el usuario seleccione una opción, el frontend utiliza decisions.edit() para combinar option con los parámetros originales y reanudar el ToolCall. Finalmente, el método invoke() del servidor devuelve el contenido seleccionado:
La implementación integrada también guarda el resultado de la selección en aiMessages.toolCalls, para que los mensajes históricos sigan mostrando qué opción eligió el usuario al volver a renderizarse.
Crear el componente de la tarjeta
La tarjeta frontend recibe ToolsUIProperties:
Este componente muestra el uso general de decisions.edit() y gestiona tanto los clics repetidos como los parámetros en forma de cadena JSON. Para usarlo en producción, también debes gestionar las conversaciones de solo lectura, el mensaje activo actual y el estado de las selecciones históricas según la interfaz de chat donde se encuentre. Consulta la implementación completa en packages/plugins/@nocobase/plugin-ai/src/client-v2/ai-employees/tools/SuggestionsOptionsCard.tsx.
decisions proporciona tres operaciones:
SuggestionsOptionsCard.tsx también gestiona estos detalles:
- Admite
optionstanto en forma de array como de cadena JSON - Muestra el estado loading mientras se sigue generando el ToolCall
- Solo permite seleccionar opciones en ToolCalls con estado
interrupted - Deshabilita inmediatamente los botones después de hacer clic para evitar envíos duplicados
- Conserva y resalta la opción ya seleccionada en los mensajes históricos
- Solo permite iniciar operaciones desde la conversación editable actual
Registrar la tarjeta en el plugin cliente
El nombre registrado en el frontend debe coincidir exactamente con el nombre de la Tool en el servidor:
Si el archivo del servidor es src/ai/tools/developerChoice.ts, registra aquí developerChoice.
La Tool integrada suggestions se registra de la misma forma:
Después, PluginAIClientV2.load() llama a registerPluginAIClientV2BuiltinTools(this.ai.toolsManager) para combinar la tarjeta con la definición de la Tool del mismo nombre devuelta por el servidor.
Elegir entre tarjeta, modal o ejecución frontend
A continuación solo se enumeran las opciones más habituales de ToolsOptions en el cliente. Consulta el tipo completo en packages/core/client-v2/src/ai/tools-manager/types.ts.
Usar una tarjeta
Utiliza primero card de forma predeterminada. Las tarjetas son adecuadas para mostrar el estado de ejecución, botones de confirmación y un número reducido de opciones en la posición del ToolCall.
Usar un modal
Añade un modal cuando haya mucho contenido o necesites una vista previa grande o una edición compleja de parámetros.
Ejecutar la Tool en el navegador
Si la Tool del servidor establece execution: 'frontend', el cliente también debe proporcionar invoke. Este tipo de Tool es adecuado para leer el contexto de la página actual, el contenido del editor o el estado de FlowEngine, pero no para realizar escrituras de datos que necesiten la protección de permisos del servidor.
Ejemplo completo: añadir una tarjeta de selección a un empleado de IA integrado
Después de completar Ejemplo completo: crear un empleado de IA integrado, puedes convertir la pregunta de seguimiento de Dev Helper en opciones en las que se pueda hacer clic. Para ello, define otra Tool llamada developerChoice y registra una tarjeta frontend. Coloca el archivo del servidor en:
Esta Tool declara las opciones y recibe la selección del usuario:
Como developerChoice.ts está dentro del directorio tools/ de la Skill welcome-developer, se vincula automáticamente con la Skill actual. Sin embargo, estar vinculada solo significa que el modelo puede utilizar esta Tool, no que vaya a llamarla necesariamente.
También debes modificar el flujo de trabajo de SKILLS.md y sustituir los pasos 5 y 6 originales por:
Reutiliza para la tarjeta frontend el componente DeveloperChoiceCard definido antes y guárdalo en:
Por último, regístralo en src/client-v2/plugin.tsx:
Después de registrar la tarjeta, vuelve a compilar el cliente. Cuando la conversación llegue a developerChoice, el ToolCall se pausará y mostrará las opciones en las que se puede hacer clic.
Enlaces relacionados
- Definir una Tool del servidor — Definir la Tool del servidor correspondiente a la tarjeta frontend
- Ejemplo completo: crear un empleado de IA integrado — Completar primero el ejemplo básico de Dev Helper
- Internacionalización de plugins para empleados de IA — Traducir los textos de la interfaz de administración de Tools y Skills
- Plugin cliente — Conocer el punto de entrada del plugin cliente y
load()

