Aller au contenu
TYPENouvelle primitive
ÉTAPEGain rapide
DIFFICULTÉModéré
MÉTIEREmbarquer un outil
POURCréateurs d'IA
POURDevs backend
POURPower users productivité
SERVICESExec
SERVICESAgent
SERVICESCode
SERVICESFiles
POURQUOI HOODYHTTP-natif
POURQUOI HOODYEmbarquabilité
TYPENouvelle primitive
ÉTAPEGain rapide
DIFFICULTÉModéré
MÉTIEREmbarquer un outil
POURCréateurs d'IA
POURDevs backend
POURPower users productivité
SERVICESExec
SERVICESAgent
SERVICESCode
SERVICESFiles
POURQUOI HOODYHTTP-natif
POURQUOI HOODYEmbarquabilité
TYPENouvelle primitive
ÉTAPEGain rapide
DIFFICULTÉModéré
MÉTIEREmbarquer un outil
POURCréateurs d'IA
POURDevs backend
POURPower users productivité
SERVICESExec
SERVICESAgent
SERVICESCode
SERVICESFiles
POURQUOI HOODYHTTP-natif
POURQUOI HOODYEmbarquabilité
TYPENouvelle primitive
ÉTAPEGain rapide
DIFFICULTÉModéré
MÉTIEREmbarquer un outil
POURCréateurs d'IA
POURDevs backend
POURPower users productivité
SERVICESExec
SERVICESAgent
SERVICESCode
SERVICESFiles
POURQUOI HOODYHTTP-natif
POURQUOI HOODYEmbarquabilité
EXEC · HTTP AI-NATIVE

Des endpoints API qui se matérialisent à la demande

Tapez une URL qui n'existe pas. Un script exec en wildcard intercepte l'appel, demande à un LLM d'écrire le handler, l'exécute dans un sandbox V8, et répond. L'appel suivant est natif — la route existe maintenant.

Lire la doc exec

Comment une URL devient un endpoint

Hoody Exec laisse un seul fichier TypeScript servir n'importe quelle route HTTP, y compris un catch-all. Avec ai true, le script reçoit aussi un handle de modèle injecté. Composez les deux et la requête elle-même devient le déclencheur pour écrire le handler.

Catch-all wildcard5 ÉTAPES · UN SEUL FICHIER EXEC
01

La requête arrive

GET /api/...

N'importe quel path sous le catch-all touche un seul script.

02

Le catch-all se réveille

[...slug].ts

metadata.parameters.slug porte les segments du path.

03

Le LLM écrit un handler

generateText([ model ])

ai true injecte le modèle. Par défaut, gemini-2.5-flash-lite.

04

Exécution dans un sandbox V8

isolate.eval

Chaque script tourne dans son propre isolate V8, conçu pour du code de confiance.

05

Sauvegarder la route

fs.write vers scripts/N

L'appel suivant tape directement sur le fichier sauvegardé. Pas de LLM, vitesse native.

scripts/1/api/[...slug].ts
// @mode serverless
// @ai true
// @ai-model anthropic/claude-sonnet-4.5

const path = '/' + (metadata.parameters.slug ?? []).join('/');
const body = req.body ?? []'';

// Déjà sauvegardé ? Passer la main à la route en cache.
const saved = await fs.exists('scripts/1/api' + path + '.ts');
if (saved) return fetch(path, [ method: metadata.method, body ]);

// Sinon : demander un handler, le sandboxer, le sauvegarder.
const [ text: handler ] = await generateText([
  model,
  system: 'Return a JS handler body. No imports. Return JSON.',
  prompt: `URL $[metadata.method] $[path]\nQuery $[JSON.stringify(metadata.query)]\nBody $[JSON.stringify(body)]`,
]);

const result = await isolate.eval(handler, [ req, res, fetch ]);
await fs.write('scripts/1/api' + path + '.ts', '// @mode serverless\n' + handler);
return result;

Deux commentaires magiques et un fetch qui retombe dans la route. Le wildcard est dans scripts/1/api/[...slug].ts. Le fichier sauvegardé atterrit un répertoire au-dessus. Les deux parlent HTTP — le script peut donc appeler ses voisins pendant la génération.

Trois lectures, un seul pattern

Le mécanisme se lit de trois façons selon qui vous êtes. Toutes se tressent dans le même argument.

POUR L'INGÉ SENIOR FAINÉANT

Arrêtez de coder l'endpoint que vous utilisez deux fois par an

L'outil admin, le script d'intégration, le rapport que vous comptez câbler depuis toujours. Tapez l'URL quand vous en avez besoin. Le handler apparaît. Sauvegardé avant que vous rafraîchissiez.

POUR LE COLLABORATEUR D'AGENT

L'agent ne code pas l'API, il l'appelle

votre agent a besoin d'une route qui n'existe pas. Partout ailleurs, il faudrait coder, déployer, attendre, puis appeler. Ici, il appelle. L'API arrive avec la réponse.

POUR LE FUTUR RADICAL

Les APIs ne sont plus conçues, elles sont découvertes

Et si chaque endpoint que vous avez livré n'était que la traînée d'URLs que vous avez réellement appelées ? La documentation s'effondre dans le log d'accès. Les specs s'effondrent dans le trafic.

La documentation devient le log d'accès.

appelé lundidocumenté mardi
access.logdésormais un endpoint
  • 09:14GET/api/analytics/dashboardactif
  • 11:02POST/api/exports/users.csvactif
  • 13:48GET/api/admin/seats/auditactif
  • 16:22POST/api/agent/tools/refundactif

Ce que ça remplace

Les patterns vers lesquels les devs se tournent quand il faut ajouter un endpoint vite. Chacun facture du scaffolding par route. Le wildcard le paie une fois.

  • AWS Lambda + API GatewayScaffolding par endpoint, cold starts
  • Hasura / PostgREST autogenSchema-first, retourne des données pas du comportement
  • Vercel / Cloudflare functionsEndpoint ponctuel, cycle de déploiement complet
  • Scaffolds Express / FastifyBoilerplate par route, runtime à entretenir
  • Plugins Kong / TykGateway lourde pour une seule règle
  • Microservices BFFService à maintenir pour chaque caprice d'UI

La documentation cesse d'être un plan. C'est la traînée d'URLs que vous avez appelées.

Lis les autres