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.
pnpm add runLe 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.
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