EMPRESA_JOSESAID · nexus-ms

Uso de IA · Nexus (asistente IA)

El servicio de IA. Usa Spring AI, recibe las preguntas, elige herramientas y prepara acciones.

Cómo se usa la IA aquí. Los fragmentos son código real del repositorio.

Usuario a ser usado: admin@empresa.mx (contraseña Demo2026!)

Herramientas que el modelo puede usar (71):

buscar_clientesobtener_clienteconsultar_interacciones_clienteobtener_prospectoconsultar_metricas_conversioncrear_clienteactualizar_clienteagregar_contacto_clientecambiar_estatus_clienteconsultar_proveedorconsultar_orden_comprabuscar_proveedoreslistar_ordenes_compracrear_proveedorcrear_orden_compraregistrar_recepcion_ordencancelar_orden_compraconsultar_polizaconsultar_estados_financieroslistar_polizasconsultar_catalogo_cuentassugerir_polizaconsultar_tipos_documentosolicitar_eliminacion_documentoconsultar_documentoconsultar_documentos_por_vencerbuscar_documentosconsultar_comprobantebuscar_comprobante_por_foliolistar_pagos_proveedorlistar_comprobantes_pendientes_cobroconsultar_cuenta_por_pagarregistrar_pago_comprobanteconsultar_existenciasconsultar_trazabilidad_lotelistar_articulos_bajo_minimolistar_movimientos_articulocrear_articuloregistrar_movimiento_inventariocrear_orden_operacioncrear_almacenconsultar_politicasconsultar_indicadoresconsultar_reporteregistrar_indicadorconsultar_usuariopreparar_alta_usuariolistar_usuariosconsultar_pedidosresumen_ventasobtener_cotizacionobtener_pedidoconsultar_tasas_ivaconsultar_monedaspreparar_pedido_borradorcrear_prospecto_borradorconfirmar_pedidocancelar_pedidoregistrar_entrega_pedidoenviar_cotizacionaceptar_cotizacionconvertir_cotizacion_en_pedidocrear_cotizacion_borradorreemplazar_lineas_pedidoregistrar_devolucion_pedidocambiar_estatus_prospectoconvertir_prospecto_en_clienteregistrar_interaccion_clienteconfirmar_accioncancelar_accionconsultar_estado_accion

01 Cliente de chat con advisors: filtro de datos sensibles y registro de tokens

Cliente de chat con advisors: filtro de datos sensibles y registro de tokens.

ClaudeAsistenteIA.java
        this.herramientas = ToolCallbacks.from(reportes, clientes, ventas, compras, finanzas, contabilidad,
                inventario, documentos, usuarios, politicas);
        PromptVersionado prompt = prompts.obtener(PROMPT);
        this.cliente = ChatClient.builder(modelo)
                .defaultSystem(prompt.texto())
                .defaultAdvisors(
                        new FiltroDatosSensiblesAdvisor(),
                        new RegistroTokensAdvisor(registro))
                .build();
Qué hace: Se juntan las herramientas de todos los módulos en un solo arreglo de ToolCallback.

02 Cada pregunta pasa por los advisors y solo llegan las herramientas permitidas al rol

Cada pregunta pasa por los advisors y solo llegan las herramientas permitidas al rol.

ClaudeAsistenteIA.java
        var solicitud = cliente.prompt()
                .user(pregunta.texto())
                .advisors(a -> a
                        .param(RegistroTokensAdvisor.CLAVE_SERVICIO, SERVICIO)
                        .param(RegistroTokensAdvisor.CLAVE_USUARIO, pregunta.usuario())
                        .param(FiltroDatosSensiblesAdvisor.CLAVE_CORREO_PERMITIDO, pideAltaDeAdmin(pregunta.texto())));
        ToolCallback[] permitidas = Arrays.stream(herramientas)
                .filter(h -> AlcanceHerramientas.puedeUsar(h.getToolDefinition().name()))
                .toArray(ToolCallback[]::new);
        if (permitidas.length > 0) {
            solicitud = solicitud.toolCallbacks(permitidas);
        }

        RegistroHerramientasUsadas.iniciar();
        try {
            ChatResponse respuesta = solicitud.call().chatResponse();
Qué hace: El filtro por rol (AlcanceHerramientas) decide qué herramientas ve el modelo.

03 Permiso por herramienta y rol

Permiso por herramienta y rol.

AlcanceHerramientas.java
    static boolean puedeUsar(String herramienta) {
        Set<String> roles = ROLES_POR_HERRAMIENTA.get(herramienta);
        return roles != null && tieneAlgunRol(roles);
    }
Qué hace: Si el rol no aparece en la lista, la herramienta no se ofrece al modelo.

04 La confirmación es una herramienta aparte, no un efecto de la lectura

La confirmación es una herramienta aparte, no un efecto de la lectura.

HerramientasAccionesMcp.java
    @Tool(name = "confirmar_accion",
          description = "Confirma una acción pendiente con su identificador y su código de confirmación. "
                  + "Solo funciona para la persona que la preparó y dentro de su vigencia. "
                  + "Un código incorrecto cancela la acción.")
    public String confirmarAccion(
            @ToolParam(description = "Identificador de la acción preparada", required = true) String accionId,
            @ToolParam(description = "Código de confirmación de 8 dígitos que devolvió la preparación", required = true) String codigo) {
        RegistroHerramientasUsadas.registrar("confirmar_accion");
        return confirmaciones.confirmarConCodigo(UUID.fromString(accionId), usuarioActual(), codigo);
    }
Qué hace: El modelo puede pedir confirmar, pero el cambio exige el código de 8 dígitos.
Regla del proyecto: la IA propone o prepara; la persona confirma con el código de 8 dígitos. Ninguna herramienta de escritura cambia datos por sí sola.