Agente de IA

Un operador, no un chatbot

Panel del agente Reproducción

Redactar una descripción en inglés para el producto “DRILL001”

Hecho

-> GetProductBasic(main_id="DRILL001") -> 1 match

-> GetProductExtra(product_id=4182, tabs=["CORE", "TECH"]) -> 38 values

La ficha ya contiene todo lo necesario para redactar el párrafo: 18 V sin escobillas, portabrocas metálico de 13 mm, 60 Nm, dos velocidades, 1,7 kg con la batería de 2,0 Ah. Las demás descripciones marcan el tono:

Brushless power in a drill you can hold all day. 60 Nm through a two-speed gearbox and a 13 mm metal chuck, so masonry, timber and steel are the same job with a different bit.

No hay ninguna afirmación que no esté respaldada por la ficha. description_en está vacío, así que esto completa el campo sin sobrescribir nada.

¿Escribir esto en description_en de DRILL001?

Escribirlo Editarlo antes

respuesta del usuario

-> UpdateProducts(ids=[4182], changes={"description_en": "…"}) -> 1 updated, 0 errors

Hecho. La edición queda registrada en el historial del producto como una acción del agente.

11s · 6,4k entrada / 512 salida · 3 rondas · 3 herramientas

Panel del agente Reproducción

Leer todo el catálogo y proponer un árbol de categorías. No crear nada todavía.

Esperando respuesta

-> GetDashboardStats() -> 4,812 products · 148 fields · 0 categories

-> GetListProducts(offset=0, limit=200) -> 200 rows (× 25 pages)

El catálogo se organiza en torno a seis familias, y product_group junto con voltage determinan el tercer nivel. 41 nodos en tres niveles:

Herramientas eléctricas / Taladros / Sin cable  1.204
Herramientas eléctricas / Taladros / Con cable    318
Herramientas eléctricas / Sierras / Circulares    402
Herramientas eléctricas / Amoladoras              611
Herramientas manuales / Llaves                    488

En 1.204 productos no hay ningún dato que permita distinguir Sin cable de Con cable. Los dejaría en Taladros antes que inventarlo.

¿Crear las 41 categorías y asignar los 3.608 productos sin ambigüedad?

Crear el árbol Ver antes las asignaciones

En curso · 1m 12s · 61k entrada / 3,4k salida · 7 rondas · 27 herramientas

Panel del agente Reproducción

Mover todos los productos del proveedor NORTHFIELD a la pestaña POWER, convertir el par a Nm y anteponer NF- al identificador principal.

Hecho

-> GetListProducts(filter={"supplier": "NORTHFIELD"}) -> 412 rows

-> GetFields(codes=["torque", "main_id"]) -> 2 definitions

412 productos. torque es un campo NUMBER. En 388 el valor está en lb-ft, así que hay que multiplicarlo por 1,3558 y cambiar la unidad; 24 ya están en Nm. Tres identificadores principales ya empiezan por NF-.

¿Aplicar a 412 productos — pestaña POWER, torque → Nm (388 convertidos), identificador principal con prefijo NF- (409)?

Aplicar Cancelar

respuesta del usuario

-> UpdateProducts(ids=[…412 ids…], changes={"tab": "POWER", "torque": …, "main_id": …}) -> 412 updated, 0 errors

412 productos en un solo lote y una única entrada en el registro de auditoría. Si la conversión fuera incorrecta, se deshace en una sola operación, no en cuatrocientas.

24s · 18,2k entrada / 940 salida · 4 rondas · 3 herramientas

Panel del agente Reproducción

Importar supplier-q3.xlsx

Hecho

-> RunListSheets(file="supplier-q3.xlsx") -> 4 sheets

¿Qué hoja contiene los productos?

Products · 1.914 filas Precios Legende Changelog

respuesta del usuario

-> RunAnalyzeImport(file_id=1207, sheet="Products") -> shape=one_x_row

Un producto por fila. 41 columnas corresponden a campos existentes, 9 son dimensiones, 5 contienen nombres de archivo de imagen y 6 son nuevas. Las nuevas irán a una pestaña IMPORT.

Simulación: 1.742 actualizaciones, 172 productos nuevos, 6 campos nuevos. ¿Importar?

Importar Cambiar el mapeo

respuesta del usuario

-> RunImport(mapping_id=88, file_id=1207) -> 172 new · 1,742 updated · 0 errors

El mapeo queda vinculado al checksum de este archivo. Cuando llegue el libro del próximo trimestre, se comprobará antes de reutilizarlo.

2m 40s · 88k entrada / 5,1k salida · 9 rondas · 6 herramientas

Panel del agente Reproducción

Crear el mapeo de exportación para la plantilla de Grainger. Sus notas están en el canal.

Hecho

-> ListChannels() -> 6 channels

-> GetChannelHelperJson(channel_id=49) -> 74 column notes

-> GetExportDslReference()

74 columnas. 58 pueden salir directamente de un campo. 11 necesitan una transformación: Pack Qty exige un entero, pero aquí el valor se guarda como texto; Long Description está limitada a 4.000 caracteres. 3 son condicionales: Hazmat Code solo se exporta cuando un_number tiene valor. 2 no tienen una fuente disponible: UNSPSC y Country of Origin no existen en el esquema.

-> SaveExportMapping(channel_id=49, columns=74, unsourced=2)

-> RunExport(channel_id=49, preview=true) -> 50 rows

La vista previa está en la página de Canales. Las dos columnas sin origen se exportarán vacías hasta que existan esos campos. Si quieres, puedo crearlos y actualizar el mapeo.

1m 05s · 44k entrada / 7,8k salida · 6 rondas · 5 herramientas

Panel del agente Reproducción

La completitud de CORE es del 71%. Revisa los productos y completa los campos que puedas con los datos disponibles.

Hecho

-> GetProductCompleteness(tab="CORE") -> 1,383 products below 100%

-> GetListProducts(filter={"missing": "CORE"}, limit=200) -> 200 rows (× 7 pages)

El problema está concentrado en tres campos, no en mil productos: falta weight en 1.190, country_of_origin en 612 y hs_code en 415. Para esta demo, 508 de ellos tienen valores de país y código HS confirmados en los datos de origen — no deducidos solo de brand y factory, y sin inventar nada. El peso aparece en los PDF del proveedor; eso requiere otro paso.

¿Escribir country_of_origin y hs_code en los 508 casos que confirman los datos de origen?

Escribirlos Ver antes veinte

respuesta del usuario

-> UpdateProducts(ids=[…508 ids…], changes={"country_of_origin": …, "hs_code": …}) -> 508 updated, 0 errors

La completitud de CORE pasa del 71% al 88%. Los 875 productos restantes están en core-gaps.csv, agrupados según lo que falta. Nada lo confirma para esos, así que me detuve.

3m 18s · 121k entrada / 4,2k salida · 11 rondas · 10 herramientas

Panel del agente Reproducción
Dictado terminado en “adelante”

Pasar a inactivo todo lo de la categoría Discontinued… adelante

Hecho

-> GetListCategories(cat_name="Discontinued") -> 1 match(es)

-> GetListProducts(cat_id=77) -> 306 rows

La orden terminaba en “adelante”, así que no ha sido necesario pulsar Enviar. Aun así, la operación se detiene aquí para pedir confirmación: cambiar 306 productos de una vez tiene suficiente alcance, tanto si la instrucción se escribe como si se dicta.

¿Poner 306 productos en estado inactivo?

Sí No

respuesta del usuario

-> UpdateProducts(ids=[…306 ids…], changes={"status": "inactive"}) -> 306 updated, 0 errors

306 productos han pasado a estado inactivo. Seguirán apareciendo en las exportaciones que incluyan productos inactivos y quedarán fuera de las que no.

19s · 9,7k entrada / 380 salida · 3 rondas · 3 herramientas

Panel del agente Reproducción

Cada día laborable a las 9:00, dame una lista de los productos creados desde la última lista.

Hecho

Es una tarea recurrente, no una pregunta, así que la guardo como flujo de trabajo en lugar de ejecutarla una sola vez. Quedan dos cosas por decidir: a qué zona horaria corresponden las 9:00 y dónde debe entregarse la lista.

lun–vie, 09:00, Europe/Madrid — ¿dónde quieres recibir la lista?

En el panel del agente También por correo

respuesta del usuario

-> SaveWorkflow(name="New products since last run", cron="0 9 * * 1-5", tz="Europe/Madrid") -> workflow #12 armed

-> RunWorkflow(id=12, preview=true) -> GetListProducts(filter={"created_since": "last_run"}) -> 14 rows

DRILL-8842   Atornillador de impacto 18V 17:41  importación
NF-2201      Amoladora angular 125 mm    17:52  importación
HT-0916      Llave ajustable 250 mm      09:04  a mano
…y 11 más

La ejecución del lunes incluye viernes, sábado y domingo. Si una programación de días laborables buscara solo “ayer”, los productos creados durante el fin de semana no aparecerían nunca.

Este flujo solo lee e informa; no modifica nada. Si un flujo necesitara escribir, se detendría en el mismo punto de confirmación que cualquier otra ejecución y esperaría una respuesta. Ninguno puede cambiar el catálogo en silencio a las nueve de la mañana.

12s · 5,8k entrada / 420 salida · 3 rondas · 3 herramientas

Panel del agente Reproducción

Crear un correo para Bob con la ficha de especificaciones del producto ABC y adjuntar toda la documentación.

Hecho

-> GetProductBasic(main_id="ABC") -> 1 match

-> GetProductExtra(product_id=915, tabs=["CORE", "TECH"]) -> 44 values

-> GetAssets(product_id=915, roles=["doc"]) -> 3 files (2.7 MB)

La ficha de especificaciones sale de la pestaña TECH y va como tabla en el cuerpo del correo, no como un cuarto adjunto, porque es la parte que se leerá desde el móvil. Los otros tres documentos son la ficha técnica, la declaración de conformidad y el manual de mantenimiento.

-> CreateGmailDraft(to="[email protected]", attachments=3) -> draft created

Es un borrador guardado en el buzón, no un mensaje enviado. Nada se envía hasta que alguien pulse Enviar.

28s · 14,1k entrada / 1,1k salida · 4 rondas · 4 herramientas

Panel del agente Reproducción

Enviar a Marketing un correo con los productos que no tienen descripción.

Hecho

-> GetUsers(group="Marketing") -> 4 users

“Marketing” es un grupo de la lista de usuarios, así que el correo va a cuatro personas que ya tienen cuenta en este catálogo. La herramienta no permite introducir una dirección externa.

-> GetListProducts(filter={"missing": "description_en"}, limit=500) -> 318 rows

318 productos tienen description_en vacío. 47 están descatalogados y nadie va a escribir textos para ellos, así que aparecen por separado en lugar de engordar la cifra principal.

¿Enviar a las 4 personas de Marketing la lista con 271 productos pendientes y 47 descatalogados?

Enviarlo Ver antes el correo

respuesta del usuario

-> SendUserEmail(group="Marketing", subject="271 products still need a description", attachments=1) -> sent to 4

Enviado. La lista de destinatarios queda registrada en la ejecución. La misma instrucción puede programarse para la semana que viene en lugar de volver a pedirla.

26s · 12,6k entrada / 780 salida · 4 rondas · 3 herramientas

Panel del agente Reproducción

Ejecuta una orden para ver aquí el historial de la conversación.

Selecciona una tarea a la izquierda para ejecutarla aquí.

¿Cómo pregunta?

Cuando hay una duda, pregunta — dentro de la aplicación

El agente no intenta adivinar cuando una decisión necesita intervención humana. Pregunta en la propia interfaz: qué hoja usar, qué columna identifica el producto, si dos campos equivalen o si un cambio debe borrar realmente cientos de productos. Respondes y la ejecución continúa. Así puede trabajar de forma autónoma sin dejar de ser controlable y revisable.

  • Preguntas, no suposiciones

    Cuando algo es ambiguo, lo convierte en una pregunta con opciones concretas, en lugar de ocultar una suposición en el registro.

  • Confirmación antes de cambios críticos

    Las operaciones destructivas o de gran alcance se detienen y esperan siempre una confirmación explícita.

  • Vista previa antes de aplicar

    Las importaciones se simulan antes de ejecutarse, las exportaciones se previsualizan y las ediciones por lotes muestran qué cambiarían. Ves el alcance antes de aplicar nada.

¿Por qué puedes dejarlo trabajar?

Salvaguardas

Escrituras siempre por lotes
Las herramientas de escritura reciben un conjunto de registros y un conjunto de cambios. El agente no puede pasar una hora modificando productos uno a uno sin que quede claro el alcance total.
Todo queda registrado
Cada ejecución conserva las herramientas utilizadas, sus argumentos y sus resultados. Revisar lo que hizo el agente el martes pasado consiste en abrir una ejecución, no en buscar entre archivos de log.
La procedencia se verifica
Un mapeo de importación queda vinculado al archivo con el que se creó. El agente no puede reutilizar el mapeo del martes con la hoja de cálculo del jueves sin comprobar antes el archivo.
Las mismas reglas que una persona
Las restricciones, los campos obligatorios y los permisos se aplican al agente igual que a una persona. No tiene acceso privilegiado ni atajos para saltarse las reglas.
Proveedor propio, claves propias
Puedes conectarlo al proveedor de modelos con el que ya trabajas y usar tus propias claves. El catálogo no depende de que un proveedor concreto siga disponible o siga siendo asequible el año que viene.
Herramientas acotadas
Puedes configurar qué herramientas utiliza el agente y desactivar los grupos que no necesite.

La forma más directa de evaluarlo

Dale un trabajo real sobre un catálogo real y revisa después el registro de auditoría. Nosotros nos encargamos de prepararlo.