/** * La tarea Extract del AI Node: sacar de un texto los campos que se definen * [2026-09-29]. * * ## De dónde sale * * Es la réplica del «Information Extractor» de n8n que pidió Ariel. Allí los * campos se definen de tres formas —una lista de atributos, un JSON de * ejemplo o un JSON Schema— y el nodo trae unas instrucciones por defecto * editables. Aquí igual. Lo que cambia es la tubería: n8n pide JSON con * instrucciones de formato y lo arregla con otra llamada si sale roto; aquí el * esquema lo FUERZA el proveedor (decodificación restringida), la misma que * usan Structured JSON, Classifier y Sentiment. * * ## Por qué aquí * * Lo leen el dashboard (las instrucciones por defecto que enseña, qué nombres * acepta) y los dos motores (el esquema que mandan). Todo es puro y sin * dependencias. * * ## Obligatorio u opcional, con decodificación estricta * * En n8n un atributo no obligatorio se puede omitir. El modo estricto de los * proveedores exige que TODAS las propiedades estén en `required`, así que un * campo opcional se declara `[tipo, "null"]`: siempre llega, y llega `null` * cuando el texto no lo dice. Uno obligatorio no admite `null`: el modelo * tiene que poner algo. */ export declare const EXTRACT_FIELD_TYPES: readonly ["string", "number", "boolean", "date"]; export type ExtractFieldType = (typeof EXTRACT_FIELD_TYPES)[number]; /** El nombre que ve la persona, por tipo. */ export declare const EXTRACT_FIELD_TYPE_LABEL: Record; export declare const EXTRACT_SOURCES: readonly ["fields", "example", "schema"]; export type ExtractSource = (typeof EXTRACT_SOURCES)[number]; export interface CampoDeExtraccion { name: string; type: ExtractFieldType; description?: string; required?: boolean; } export interface EntidadDeExtraccion { extractSource?: string | null; extractFields?: ReadonlyArray> | null; /** El JSON Schema cuando la fuente es un ejemplo o un esquema. */ extractSchema?: Record | null; extractInstructions?: string | null; } /** * Las instrucciones cuando el nodo no trae otras. Parten de las de n8n * («You are an expert extraction algorithm…»), con `null` en vez de «omitir» * por lo dicho arriba. */ export declare const DEFAULT_EXTRACT_INSTRUCTIONS = "You are an expert extraction algorithm. Only extract information that is in the text. If a field is not in the text, leave it empty (null) \u2014 never guess."; /** * Un nombre de campo: acaba siendo una clave del payload y un camino de * plantilla (`{{payload.company}}`), así que letras, dígitos y guion bajo, sin * empezar por dígito. Un espacio o un punto partirían el camino. */ export declare const EXTRACT_FIELD_NAME: RegExp; /** La fuente efectiva: lo que no se reconoce es la lista de campos. */ export declare function fuenteDeExtraccion(entidad: EntidadDeExtraccion | null | undefined): ExtractSource; /** * Los campos utilizables, limpios: sin nombre válido fuera, sin repetidos * (gana el primero), y un tipo desconocido cuenta como texto. */ export declare function camposDeExtraccion(entidad: EntidadDeExtraccion | null | undefined): CampoDeExtraccion[]; /** * El JSON Schema que se le da al modelo, o `null` si no hay nada que extraer * (sin campos, o sin esquema en las fuentes de ejemplo y esquema). * * Una fecha es texto con la forma escrita en la descripción: `format: date` no * lo aceptan todos los proveedores en modo estricto, y una descripción sí. */ export declare function esquemaDeExtraccion(entidad: EntidadDeExtraccion | null | undefined): Record | null; /** * Lo que se le dice al modelo además del esquema: qué campo es cuál. El * esquema ya lleva las descripciones, pero no todos los proveedores las leen * igual —Ollama va por instrucciones—, y una lista corta no cuesta nada. */ export declare function guiaDeExtraccion(entidad: EntidadDeExtraccion | null | undefined): string; /** Las instrucciones que se mandan: las del nodo, o las de por defecto. */ export declare function instruccionesDeExtraccion(entidad: EntidadDeExtraccion | null | undefined): string;