/** * El nodo Apify como AI toolkit: sus siete operaciones como herramientas que * un AI Node, un servidor MCP o un agente de voz pueden llamar. * * ## Qué pidió Ariel (2026-09-26) * * «Como si fuera single operation, pero en AI Toolkit»: cada herramienta lleva * TODOS los campos de su operación (`APIFY_OPERATION_SPECS`). Y como ejecutar * un actor cuesta créditos de Apify: el modelo nace pudiendo ejecutar SOLO el * actor o la task del nodo más una lista de permitidos que pone el dueño, y el * dueño lo puede abrir a «cualquier actor». Leer runs, datasets y registros es * libre. * * ## Decide el LLM (2026-09-27) * * El mismo criterio que RSS y Firecrawl: «que le diga al LLM lo que quiere y * el LLM resuelva». Hasta ese día el límite de items, el timeout y la memoria * de la single operation del nodo eran el TOPE de lo que el modelo podía * pedir, y el dueño los llenaba para eso. Ahora lo guardado en single * operation no cuenta en modo toolkit: los topes son fijos * ({@link APIFY_TOOLKIT_TOPES}) y lo que el modelo no dice es el defecto de * Apify (50 items, y el timeout y la memoria del actor). Lo que el dueño * sigue decidiendo es QUÉ actores se pueden ejecutar —cuesta créditos— y los * caracteres que vuelven al modelo. * * ## El esquema * * Sólo `string`, `number` y `boolean` (lo que admite MCP); el input del actor * va como JSON en un `string`, igual que el filtro de Mongo. `run_*` y * `start_*` no son verbos que `claseDeHerramienta` sepa leer — están en sus * excepciones como escritura; `abort_run`, como destructiva. */ import type { CampoDeToolkit } from './argumentos-de-toolkit.js'; export type ApifyToolkitOperation = 'runActorAndWait' | 'startRun' | 'runTask' | 'getRun' | 'abortRun' | 'getDatasetItems' | 'getKeyValueRecord'; export interface ApifyToolkitParameter { name: string; type: 'string' | 'number' | 'boolean'; description: string; required: boolean; } export interface ApifyToolkitSpec { operation: ApifyToolkitOperation; label: string; toolName: string; description: string; parameters: ApifyToolkitParameter[]; destructive?: boolean; bloqueadaPorDefecto?: boolean; } /** Los parámetros que el nodo puede traer configurados: el modelo los omite * y se usa el del nodo (el actor o la task de su single operation). */ export declare const APIFY_TOOLKIT_DEFAULTABLE: readonly ["actor_id", "task_id"]; /** * Lo más que puede pedir el modelo. Fijo desde el 2026-09-27 (antes, el valor * de la single operation del nodo, si lo tenía). * * - `limit` 200: cada item entra en el contexto, y con el tope de * caracteres de fábrica (20.000) no caben muchos más; para más, se pagina * con `get_dataset_items` y `offset`. * - `timeoutSecs` 3600: una hora, el máximo que ya admite la operación. * - `memoryMbytes` 8192: 8 GB bastan para los actores de navegador; por * encima se paga mucho más por lo mismo (la memoria multiplica el coste). */ export declare const APIFY_TOOLKIT_TOPES: Readonly>; export declare const APIFY_TOOLKIT_SPECS: ApifyToolkitSpec[]; export declare const APIFY_TOOLKIT_SPECS_BY_TOOL_NAME: Readonly>; export declare const APIFY_TOOLKIT_CAMPOS: Readonly>>>; /** Los items que vuelven si el modelo no dice cuántos: cada uno entra en su * contexto, y un dataset de Apify tiene fácilmente miles. */ export declare const APIFY_TOOLKIT_LIMITE_POR_DEFECTO = 50; /** Qué actores puede ejecutar el modelo. `node` (el de fábrica): el actor o * la task del nodo más `allowedActors`; `any`: cualquiera. */ export declare const APIFY_TOOLKIT_ALCANCES: readonly ["node", "any"]; export type ApifyToolkitAlcance = (typeof APIFY_TOOLKIT_ALCANCES)[number]; /** * El mismo actor (o task), se escriba como se escriba. * * Apify acepta `usuario~nombre`, su ID (17 caracteres, que distingue * mayúsculas) y — medido el 2026-09-26 contra `api.apify.com` — * `usuario/nombre` codificado. Los dos primeros nombran lo mismo si coinciden * con la barra cambiada por la tilde; el nombre no distingue mayúsculas, el * ID sí. */ export declare function mismoActorDeApify(a: string, b: string): boolean;