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 expone a la IA (9):
buscar_clientesobtener_clienteconsultar_interacciones_clienteobtener_prospectoconsultar_metricas_conversioncrear_clienteactualizar_clienteagregar_contacto_clientecambiar_estatus_cliente
Ruta base en Nexus: /clientes-ms/v1/clientes
01 Herramienta de lectura: consulta el servicio y devuelve datos
Herramienta de lectura: consulta el servicio y devuelve datos.
@Tool(name = "obtener_cliente",
description = "Devuelve el detalle de un cliente por su identificador (UUID).")
public String obtenerCliente(
@ToolParam(description = "Identificador UUID del cliente", required = true) String id) {
RegistroHerramientasUsadas.registrar("obtener_cliente");
String cuerpo = gateway.get()
.uri(RUTA_BASE + "/{id}", id)
.retrieve()
.body(String.class);
return redactar(cuerpo);
}
Qué hace: Llama al gateway con la ruta del servicio y devuelve el resultado al modelo.
02 Herramienta de escritura: prepara la acción y NO la ejecuta
Herramienta de escritura: prepara la acción y NO la ejecuta.
@Tool(name = "crear_cliente",
description = "Prepara el alta de un cliente con su contacto principal. NO lo crea: devuelve un resumen y un accion_id. "
+ "El usuario debe confirmarlo en la aplicación. Solo ADMIN puede usarla.")
public String crearCliente(
@ToolParam(description = "Razón social del cliente", required = true) String razonSocial,
@ToolParam(description = "RFC del cliente, en mayúsculas", required = true) String rfc,
@ToolParam(description = "Nombre del contacto principal", required = true) String contactoNombre,
@ToolParam(description = "Correo electrónico del contacto principal", required = true) String contactoCorreo,
@ToolParam(description = "Rol del contacto: COMPRAS, PAGOS o ASISTENCIA", required = true) String contactoRol) {
RegistroHerramientasUsadas.registrar("crear_cliente");
if (acciones == null) {
return NO_DISPONIBLE;
}
if (vacio(razonSocial) || razonSocial.trim().length() > 250) {
return "La razón social es obligatoria y de hasta 250 caracteres.";
}
String rfcNormalizado = rfc == null ? "" : rfc.trim().toUpperCase();
if (!RFC.matcher(rfcNormalizado).matches()) {
return "El RFC no tiene un formato válido.";
}
String rol = normalizar(contactoRol);
if (!ROLES_CONTACTO.contains(rol)) {
return "El rol del contacto debe ser COMPRAS, PAGOS o ASISTENCIA.";
}
if (!correoValido(contactoCorreo)) {
return "El correo del contacto no es válido.";
}
if (vacio(contactoNombre) || contactoNombre.trim().length() > 200) {
return "El nombre del contacto es obligatorio y de hasta 200 caracteres.";
}
Map<String, Object> contacto = new LinkedHashMap<>();
contacto.put("nombre", contactoNombre.trim());
contacto.put("correo", contactoCorreo.trim());
contacto.put("rol", rol);
Map<String, Object> cuerpo = new LinkedHashMap<>();
cuerpo.put("razonSocial", razonSocial.trim());
cuerpo.put("rfc", rfcNormalizado);
cuerpo.put("contactoPrincipal", contacto);
String resumen = "Alta de cliente " + razonSocial.trim() + " (RFC " + rfcNormalizado + ")";
return guardarAccion(AccionesPendientes.TIPO_CLIENTE_CREAR, cuerpo, resumen, "Alta preparada, no creada.");
}
Qué hace: La acción queda pendiente hasta que la persona confirma con el código.
03 Ruta base del servicio dentro de Nexus
Ruta base del servicio dentro de Nexus.
static final String RUTA_BASE = "/clientes-ms/v1/clientes";
Qué hace: Todas las herramientas de este módulo se construyen sobre esta ruta.
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.