Cómo se usa la IA aquí. Los fragmentos son código real del repositorio.
Usuario a ser usado: legal@demo.empresa.mx (contraseña Demo2026!)
Herramientas que expone a la IA (5):
consultar_tipos_documentosolicitar_eliminacion_documentoconsultar_documentoconsultar_documentos_por_vencerbuscar_documentos
Ruta base en Nexus: /documentos-cumplimiento-ms/v1
01 Herramienta de lectura: consulta el servicio y devuelve datos
Herramienta de lectura: consulta el servicio y devuelve datos.
@Tool(name = "consultar_documentos_por_vencer",
description = "Lista los documentos que vencen en los próximos N días.")
public String consultarDocumentosPorVencer(
@ToolParam(description = "Número de días hacia adelante, por ejemplo 30", required = true) int dias) {
RegistroHerramientasUsadas.registrar("consultar_documentos_por_vencer");
String cuerpo = gateway.get()
.uri(constructor -> constructor.path(RUTA_BASE + "/documentos/por-vencer")
.queryParam("dias", dias)
.build())
.retrieve()
.body(String.class);
return FiltroDatosSensibles.redactar(cuerpo).texto();
}
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 = "solicitar_eliminacion_documento",
description = "Prepara la eliminación de un documento legal. NO lo elimina: devuelve un resumen y un accion_id. "
+ "El usuario debe confirmarlo en la aplicación. No se puede eliminar un documento dentro de su "
+ "periodo de retención ni uno ya eliminado; en esos casos la aplicación lo rechaza al confirmar.")
public String solicitarEliminacionDocumento(
@ToolParam(description = "Identificador UUID del documento", required = true) String documentoId,
@ToolParam(description = "Motivo de la eliminación, obligatorio, de hasta 300 caracteres",
required = true) String motivo) {
RegistroHerramientasUsadas.registrar("solicitar_eliminacion_documento");
if (acciones == null) {
return NO_DISPONIBLE;
}
UUID id;
try {
id = UUID.fromString(documentoId.trim());
} catch (IllegalArgumentException | NullPointerException e) {
return "El identificador del documento no es válido.";
}
String motivoLimpio = motivo == null ? "" : motivo.trim();
if (motivoLimpio.isEmpty()) {
return "El motivo de la eliminación es obligatorio.";
}
if (motivoLimpio.length() > LIMITE_MOTIVO) {
return "El motivo no puede tener más de " + LIMITE_MOTIVO + " caracteres.";
}
if (!existe(id)) {
return "No encontré ese documento.";
}
Map<String, Object> cuerpo = new LinkedHashMap<>();
cuerpo.put("documentoId", id.toString());
cuerpo.put("motivo", motivoLimpio);
String resumen = "Eliminar documento " + id + " (motivo: " + motivoLimpio + ")";
AccionPendiente accion = acciones.preparar(usuarioActual(), AccionesPendientes.TIPO_DOCUMENTO_ELIMINAR,
aJson(cuerpo), resumen);
return FiltroDatosSensibles.redactar("Eliminación preparada, no ejecutada. " + resumen
+ ". accion_id: " + accion.id() + ". Vence en 10 minutos; el usuario debe confirmarlo en la aplicación.")
.texto();
}
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 = "/documentos-cumplimiento-ms/v1";
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.