Skip to main content

Introducción

El nodo Código te permite ejecutar código JavaScript personalizado dentro de tus flujos de conversación, dándote la flexibilidad de realizar operaciones complejas, transformaciones de datos y lógica personalizada que no pueden ser realizadas con los nodos estándar.

Acceso a variables

Dentro del nodo código puedes acceder y modificar diferentes tipos de variables usando métodos específicos:

Contexto

El contexto guarda variables que persisten únicamente durante la ejecución actual del flujo. Usa estos métodos:
// Obtener una variable del contexto
const nombre = $context.get('nombre')

// Obtener con valor por defecto si no existe
const nombre = $context.get('nombre', 'Juan')

// Guardar una variable en el contexto
$context.set('ultimoPedido.estado', 'entregado')

// Guardar un objeto completo
const usuario = { nombre: 'Juan', plan: 'gold' }
$context.set('usuario', usuario)

// Guardar un array
const pedidos = ['PED-123', 'PED-456']
$context.set('pedidos', pedidos)

Memoria

La memoria permite persistir datos entre skills, tools y nodos. Con Memory puedes controlar el tiempo de vida (TTL) de cada variable y almacenar diferentes tipos de datos.

Conceptos clave

TérminoDescripción
KeyNombre de la variable de memoria (ej.: idioma)
ValueDato a almacenar: string, number, boolean, object o file
TTLTiempo de vida en segundos. Transcurrido el TTL, la clave se elimina automáticamente

Tipos de datos admitidos

TipoTamaño máximoTTLTTL máximo
String255 caracteresOpcional-
Number15 dígitosOpcional-
Boolean-Opcional-
JSON5KBRequerido86.400s (1 día)
File10MBRequerido604.800s (1 semana)

Escritura

// Primitivos (string, number, boolean) - TTL opcional
$memory.set('nombre', 'Juan')
$memory.set('intentos', 3, 3600) // expira en 1 hora

// JSON - TTL requerido (en segundos)
$memory.setJson('usuario', { nombre: 'Juan', plan: 'gold' }, 86400)

// Archivos - async, TTL requerido, tipo MIME requerido
await $memory.setFile('comprobante', base64String, 604800, 'application/pdf')

Lectura

// Primitivos
const nombre = $memory.get('nombre')
const nombre = $memory.get('nombre', 'Juan') // con valor por defecto

// JSON
const usuario = $memory.getJson('usuario')
const usuario = $memory.getJson('usuario', {}) // con valor por defecto

// Archivos - devuelve FileHandle
const url = $memory.getFile('comprobante').toUrl()           // URL temporal (S3)
const base64 = await $memory.getFile('comprobante').toBase64() // string base-64
const buffer = await $memory.getFile('comprobante').toRaw()    // Buffer/Uint8Array

Eliminación

// Eliminar una clave
$memory.delete('temporal')

// Eliminar múltiples claves
$memory.delete(['tmp1', 'tmp2', 'cache'])
Tipos MIME permitidos para setFile:
CategoríaTipos MIME
Textotext/plain
JSONapplication/json
XMLapplication/xml, text/xml
Imágenesimage/jpeg, image/png, image/gif
Videosvideo/mp4, video/ogg, video/webm, video/x-msvideo, video/mpeg
Audiosaudio/mpeg, audio/wav, audio/ogg, audio/aac, audio/flac
Documentosapplication/pdf
Los métodos $memory.setFile(), $memory.getFile().toBase64() y $memory.getFile().toRaw() son asincrónicos. Debes usar await al llamarlos.

Usuario

Accede a información del contacto que está interactuando con tu flujo:
// Obtener el ID del usuario
const userId = $user.get('id')

// Obtener el nombre del usuario
const userName = $user.get('names')

Mensaje

Accede al último mensaje que envió el usuario:
// Obtener el texto del mensaje
const texto = $message.get('text')

// Obtener el tipo de mensaje (TEXT, IMAGE, AUDIO, VIDEO, LOCATION, FILE)
const tipo = $message.get('type')

// Obtener la URL del archivo adjunto
const urlAdjunto = $message.get('mediaUrl')

// Obtener coordenadas de ubicación
const lat = $message.get('lat')
const lng = $message.get('lng')

Input/Output

Cuando trabajas con tools, puedes recibir inputs y retornar outputs:
// Obtener un input
const ciudad = $input.get('ciudad')

// Obtener un input con valor por defecto
const ciudad = $input.get('ciudad', 'Quito')

// Establecer un output
const data = $memory.get('apiResponse')
$output.set('data', data)

Respuestas HTTP

Si guardaste una respuesta de un nodo API, puedes accederla y manipularla:
// Obtener la respuesta HTTP guardada
let apiResponse = $context.getHttpResponse('apiResponse')

// Convertir a JSON si es necesario
apiResponse = apiResponse.json()

// Manipular los datos
let usuarioNombre = apiResponse.data.usuario.nombre
let status = apiResponse.status

// Guardar en memoria
$memory.set('usuarioNombre', usuarioNombre);
$memory.set('status', status);
La llave que uses en $context.getHttpResponse('apiResponse') debe coincidir exactamente con la que especificaste en el nodo API en el campo “guardar respuesta”.

Utilidades disponibles

El nodo código incluye varias utilidades que puedes usar en tu código:

Logger

El logger es muy útil para loggear variables dentro de un flujo y facilitar el debugging:
$utils.logger.log('nombreUsuario', nombreUsuario)
$utils.logger.log('resultado', resultado)
$utils.logger.log('datos', { id: 123, estado: 'activo' })

Crypto

Crypto proporciona funcionalidades criptográficas comunes como hash y cifrado:
// Crear un hash
$utils.crypto.createHash(algorithm)

// Crear un HMAC
$utils.crypto.createHmac(algorithm, key)

// Generar bytes aleatorios
$utils.crypto.randomBytes(size)

// Derivación de clave basada en contraseña
$utils.crypto.pbkdf2(password, salt, iterations, keylen, digest)

// Cifrado
$utils.crypto.createCipheriv(algorithm, key, iv)

// Descifrado
$utils.crypto.createDecipheriv(algorithm, key, iv)

// Generar par de claves
$utils.crypto.generateKeyPair(type, options)

// Firmar datos
$utils.crypto.sign(algorithm, data, privateKey)

// Verificar firma
$utils.crypto.verify(algorithm, data, publicKey, signature)

Lodash

Lodash es una biblioteca moderna de utilidades JavaScript que ofrece modularidad, rendimiento y extras, facilitando el trabajo con arrays, números, objetos, cadenas, etc.
// Dividir array en chunks
$utils._.chunk(array, size)

// Debounce de funciones
$utils._.debounce(func, wait)

// Clonar profundamente
$utils._.cloneDeep(value)

// Fusionar objetos
$utils._.merge(object, sources)

// Obtener valor de objeto por path
$utils._.get(object, path, [defaultValue])

// Obtener valores únicos de un array
$utils._.uniq(array)

// Filtrar colección
$utils._.filter(collection, predicate)

// Mapear colección
$utils._.map(collection, iteratee)