Needle : un « modèle de fondation d'automatisation » embarqué de 8 à 29 Mo pour l'appel d'outils et l'extraction structurée sur mobiles, objets connectés et microcontrôleurs
cactus-compute/needle est un modèle monofichier de 8 à 29 Mo conçu pour trois tâches : choisir et remplir des appels d'outils à partir des fonctions exposées par une application, extraire des champs typés d'un texte désordonné et produire des plongements de phrases. Il repose sur le Laddered Simple Attention Network de Cactus Compute, dont chaque profondeur de 2 à 20 couches est déployable, et inclut Whistle, un modèle de reconnaissance vocale de 16,9 Mo. Licence Apache-2.0, environ 13,9 k étoiles. Les comparaisons de performance viennent du README du projet et attendent une reproduction indépendante.
Needle est un très petit modèle open source de l'équipe Cactus Compute : le modèle entier tient dans un binaire de 8 à 29 Mo, destiné aux téléphones, montres et objets portés, robots, maisons connectées, voitures et même microcontrôleurs. Le projet se présente comme un « modèle de fondation d'automatisation » et dit avoir échangé la capacité de chat généraliste contre des résultats : il prétend battre des modèles dix fois plus gros sur l'appel d'outils mobile et égaler des modèles deux à trois fois plus gros en extraction. Ces comparaisons viennent du README, sans reproduction par un tiers à notre connaissance : à lire comme des affirmations du projet. Au 13 octobre 2026, le dépôt compte environ 13 887 étoiles et 940 forks, une licence Apache-2.0, du code surtout en Python, et une dernière poussée le 11 octobre.
Ce qu'il fait est précis. D'abord l'appel d'outils : à partir des fonctions exposées par l'application, Needle choisit les bonnes et remplit chaque argument d'après les propos de l'utilisateur. Deux demandes donnent deux appels dans l'ordre ; une demande qu'aucun outil ne couvre donne une liste vide, pas une supposition. Ensuite l'extraction structurée : on déclare une forme (facture, réservation, notification, formulaire), on fournit un texte désordonné et on obtient des champs typés, une grammaire de décodage garantissant que la sortie est analysable ; l'extraction se généralise à la classification. Puis le plongement de texte : le même modèle renvoie un vecteur pour une phrase, ce qui permet recherche, appariement et routage en local. Enfin son jumeau Whistle, un modèle de reconnaissance vocale de 16,9 Mo, partage le conteneur et le moteur de Needle : une seule construction donne à Needle une entrée audio, le clip entre, les appels d'outils sortent.
Le ticket d'entrée est bas. Après pip install cactus-needle, on décore une fonction Python comme outil : la signature donne les types d'arguments, la docstring la description, et agent.run boucle en exécutant la fonction et en renvoyant les résultats. Chaque tour renvoie un objet JSON avec function_calls, le raisonnement du modèle et une confiance calibrée, ce qui permet d'agir, de demander confirmation ou de refuser selon la confiance. Pour déployer sur un appareil, une commande comme needle build --platform macos-arm64 récupère le moteur précompilé et place les poids needle3.cact à côté. Le dépôt liste des cibles macOS et Linux ARM64, avec des notes pour le navigateur et WASI.
L'architecture est ce qui diffère vraiment. Needle 3 est un « Laddered Simple Attention Network » : un MLP de Monarch Hadamard à la place de la couche feed-forward, une attention à requêtes groupées avec prises de convolution causale, une mémoire n-gramme « engram » lue par gather et des hyper-connexions multivoies, entraîné pour que chaque profondeur de 2 à 20 couches soit déployable. La plupart des paramètres se trouvent dans l'engram, si bien que le modèle de 121 M effectue le calcul d'un modèle de 50 M. Une grammaire au niveau de l'octet compilée à partir de vos schémas contraint chaque jeton, et chaque réponse porte un score de confiance calibré. La logique : sur des appareils de quelques dizaines de Mo, mieux vaut dépenser la capacité en mémoire de type consultation qu'en raisonnement général.
Le réglage fin est l'autre accent. Le README affirme que le réglage sur DroidCall améliore chaque sous-réseau de 18 à 36 points et que, dès 4 couches et 29 M de paramètres, le sous-réseau réglé dépasse DeepSeek V4 Flash. Le réglage local entraîne des adaptateurs LoRA sur les projections d'attention, base gelée, fusionnés à l'export, en 4 bits, sur votre machine avec JAX. Le réglage sur la plateforme entraîne le modèle complet en 2 bits, exige une clé d'API Cactus et peut renforcer vos données avec le jeu de données d'origine de Needle pour ne rien désapprendre. Pour Whistle : 8,6 fois plus petit que Whisper base et 6,6 fois plus rapide au premier jeton, devant sur LibriSpeech, SPGISpeech, Earnings-22 et la moyenne FLEURS, derrière sur TED-LIUM, AMI et la moyenne MLS, en anglais, allemand, français, espagnol, italien, néerlandais et polonais.
Notre lecture : Needle transforme un besoin très précis en un produit très petit. Si votre application possède déjà un ensemble clair de fonctions et doit relier de façon fiable langage ou voix à des appels, c'est bien moins cher qu'un grand modèle, et cela fonctionne hors ligne. Les risques sont précis aussi. Tous les benchmarks viennent du README du projet. La télémétrie est activée par défaut dans le binaire : pour les usages sensibles, définissez NEEDLE_TELEMETRY=0 et DO_NOT_TRACK=1. Et il ne converse pas et ne raisonne pas en domaine ouvert ; si votre ensemble de fonctions change souvent, pesez le coût du réglage fin et de la génération de données. Faites une petite évaluation avec votre vraie liste d'outils et de vrais échantillons parlés avant de remplacer des appels cloud.
Sources
FAQ
Que sait faire Needle, et que ne sait-il pas faire ?
Il fait trois choses : choisir des appels d'outils et remplir chaque argument à partir des fonctions exposées par une application, en renvoyant une liste vide quand aucun outil ne convient plutôt que de deviner ; extraire des champs typés d'un texte désordonné selon une forme déclarée ; et produire des plongements de phrases pour la recherche et le routage locaux. Le projet dit clairement sacrifier la capacité de chat généraliste.
Que gagne-t-on avec la conception « en échelle » ?
Chaque profondeur de 2 à 20 couches est un modèle déployable : les mêmes poids peuvent être découpés à la taille de l'appareil. Le README affirme que le réglage fin sur DroidCall améliore chaque sous-réseau de 18 à 36 points et que, dès 4 couches (29 M de paramètres), le sous-réseau réglé dépasse DeepSeek V4 Flash. Ce sont les résultats du projet lui-même.
À quoi faut-il faire attention ?
La télémétrie est activée par défaut dans le binaire ; il faut définir NEEDLE_TELEMETRY=0 et DO_NOT_TRACK=1 pour la couper. Les comparaisons viennent du README, sans évaluation indépendante. Le réglage fin local n'entraîne que des adaptateurs LoRA en 4 bits ; le réglage sur la plateforme entraîne le modèle complet et exige une clé d'API Cactus.