veilletech.fr
26 août Feed du jour
#06 IA Article

Exécuter le code d'un agent sans tout lui ouvrir

Un agent qui écrit du code a besoin d'un endroit où le faire tourner.

Vercel publie le Run SDK, un paquet qui exécute du JavaScript ou du TypeScript non fiable dans un contexte QuickJS isolé, sans accès à Node ni au réseau. L'application n'expose que des fonctions hôtes choisies, et l'exécution peut s'interrompre pour une authentification ou une validation humaine avant de reprendre où elle en était.

3 min de lecturevidéo 1:16
Partager
Sommaire6 sections
  1. Ce qui se passe
  2. Comment ça marche
  3. Interruption et reprise
  4. Le conseil de conception, qui vaut sans le SDK
  5. Ce que ça change
  6. À retenir

Ce qui se passe

Vercel publie le Run SDK, un paquet qui exécute du JavaScript ou du TypeScript non fiable sans lui donner accès à l'application qui l'entoure.

Terminal
pnpm add run

Le contexte : les agents écrivent de plus en plus un programme plutôt qu'une suite d'appels d'outils un par un. Une seule réponse du modèle décrit plusieurs appels et la logique qui les relie. Reste à exécuter ce programme — et le passer à eval lui accorde exactement les mêmes droits qu'au code de l'application : secrets, services internes, réseau. Sans compter qu'il n'offre aucun endroit propre où s'interrompre pour demander une validation.

Comment ça marche

Le code est évalué dans un contexte QuickJS neuf, à l'intérieur d'un worker thread, sans route directe vers Node.js ni vers le réseau. L'application choisit ce qu'elle expose, via hostFunctions : des fonctions ordinaires, qui apparaissent comme des globales appelables à l'intérieur du bac à sable.

TypeScript
import { run } from 'run';

const result = await run({
  source: `
    const orders = await store.listOrders("customer_123");
    const total = orders.reduce((sum, order) => sum + order.amount, 0);
    return { count: orders.length, total };
  `,
  hostFunctions: {
    store: {
      listOrders: async (customerId: string) => {
        return database.orders.findMany({ customerId });
      },
    },
  },
});

Le programme généré connaît store.listOrders(). Le client de base de données et ses identifiants, eux, ne franchissent jamais la frontière : les appels la traversent par sérialisation. Une fonction hôte peut renvoyer une promesse, ce qui permet de placer des clients de service existants derrière cette interface sans les exposer.

Le bénéfice secondaire est le volume de contexte. Un agent de support peut inspecter un compte et ne renvoyer que le résultat utile, au lieu de faire transiter une réponse de facturation entière dans sa fenêtre de contexte.

Interruption et reprise

C'est la partie la plus intéressante. Lire des factures et émettre un remboursement ne demandent pas la même confiance. Quand le code généré atteint une opération sensible, la fonction hôte peut interrompre l'exécution pour réclamer une authentification ou l'accord d'un humain — puis reprendre après la décision, sans rejouer le travail déjà accompli.

C'est ce qui manque à un eval : un point d'arrêt durable au bon endroit.

Le conseil de conception, qui vaut sans le SDK

Le billet insiste sur un point qui dépasse l'outil : exposez des actions de votre produit, pas une fonction générique.

orders.refund(id) donne à l'application un endroit clair pour vérifier l'utilisateur et la commande. Une fonction request() générique, elle, rend l'autorité impossible à raisonner : on ne sait plus, en lisant le code, ce que le bac à sable peut réellement déclencher.

C'est la même règle que pour la définition d'outils MCP, ou pour une API interne exposée à un tiers : la granularité de l'interface est la politique de sécurité.

Ce que ça change

Le Run SDK est le module qui alimente déjà le code mode de l'AI SDK — ce n'est donc pas un prototype isolé. Il répond à un problème que rencontre tout le monde en écrivant un agent un peu sérieux, et propose un modèle mental réutilisable même si vous choisissez une autre isolation (conteneur, microVM, isolated-vm).

À évaluer selon votre menace : QuickJS dans un worker isole le code, mais un paquet récent reste un paquet récent, et le durcissement se juge à l'usage.

À retenir

Un agent qui écrit du code a besoin d'un endroit où le faire tourner. La question n'est pas « comment l'empêcher d'écrire n'importe quoi », c'est « que peut-il atteindre depuis l'endroit où il tourne ».

Source : Vercel