Intelligence Artificielle

Apfel : Apple Intelligence en CLI locale

21 juin 2026 Mehdi 22:44
Apfel : Apple Intelligence en CLI locale

Verdict court : projet sérieux, bien documenté, mais très dépendant de l’écosystème Apple récent. À adopter seulement si la cible est un Mac Apple Silicon sous macOS 26.4+ avec Apple Intelligence activé.

Ce que c’est

Apfel expose le modèle local d’Apple, via FoundationModels, sous trois formes :

  • un outil UNIX : apfel "prompt" ou echo "texte" | apfel ;
  • un serveur HTTP local compatible OpenAI : http://localhost:11434/v1 ;
  • un petit mode chat interactif : apfel --chat.

Le pitch est simple : utiliser l’IA déjà présente sur le Mac, sans clé API, sans cloud, sans téléchargement de modèle côté outil.

Le projet est en Swift, licence MIT, avec une surface pensée pour le terminal, les scripts et les intégrations d’outils de dev.

À quoi ça sert

Usage principal

Pour un freelance sécu/DevOps, l’usage naturel est local et utilitaire :

  • résumer un fichier depuis le shell ;
  • transformer du texte dans un pipeline ;
  • faire relire une commande ou un diff ;
  • brancher un outil compatible OpenAI sur un backend local ;
  • tester de petits prompts sans exposer de données à un service externe.

Exemples annoncés par le README :

apfel "What is the capital of Austria?"
echo "Summarize: $(cat README.md)" | apfel
apfel -f README.md "Summarize this project"
apfel -o json "Translate to German: hello" | jq .content

Serveur compatible OpenAI

La partie serveur vise les clients qui savent changer de base_url :

apfel --serve

Puis :

curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"apple-foundationmodel","messages":[{"role":"user","content":"Hello"}]}'

C’est utile pour tester des intégrations sans coût marginal et sans fuite réseau d’inférence.

État du dépôt observé

Élément Observation
Dépôt Arthur-Ficial/apfel
Commit inspecté db2932d452ebc614bf3b7f9c9672d6a437e838de
Dernier commit 2026-06-09, docs: bump CLAUDE.md status to v1.5.5 (661 unit tests)
Licence MIT
Langage principal Swift
Stars au moment du scan 5714
Forks au moment du scan 214
Issues ouvertes au moment du scan 13
Plateforme cible Apple Silicon, macOS 26.4+ / Tahoe, Apple Intelligence
Distribution documentée Homebrew, tap dédié, Nix, Mint, mise, build source

Scan rapide du dépôt :

Type Volume approximatif
Swift 92 fichiers, ~14 893 lignes
Markdown 57 fichiers, ~9 872 lignes
Python 24 fichiers, ~6 965 lignes
Shell 13 fichiers, ~1 801 lignes
Total fichiers suivis scannés 213

Note : le comptage est un scan approximatif par extensions, pas une mesure LOC stricte avec analyse syntaxique.

Comment c’est construit

L’architecture est proprement séparée.

Couches principales

Couche Rôle
Sources/main.swift point d’entrée CLI, parsing, dispatch des modes
Sources/CLI/ parsing d’arguments et erreurs CLI testables
Sources/Core/ logique pure : types OpenAI, erreurs, contexte, validation, MCP
Sources/Server.swift serveur HTTP Hummingbird compatible OpenAI
Sources/Session.swift intégration avec FoundationModels
Sources/SecurityMiddleware.swift origin check, CORS, bearer token
Tests/apfelTests/ runner de tests Swift sans XCTest
Tests/integration/ tests serveur et intégration

Le Package.swift expose :

  • une librairie ApfelCore ;
  • un exécutable apfel ;
  • un runner apfel-tests ;
  • plusieurs exemples ApfelCore.

Dépendances directes côté SwiftPM :

Dépendance Usage probable
hummingbird serveur HTTP local
swift-docc-plugin documentation Swift / DocC
FoundationModels modèle Apple local, via SDK macOS 26.4+
CReadline confort du mode chat interactif

Choix techniques intéressants

Le projet ne se contente pas d’un wrapper naïf autour du modèle Apple.

Il ajoute :

  • format de réponse compatible OpenAI Chat Completions ;
  • streaming SSE ;
  • tool calling ;
  • support MCP local et distant ;
  • stratégies de trimming de contexte ;
  • estimation et gestion du contexte de 4096 tokens ;
  • erreurs explicites pour les endpoints non supportés ;
  • mode JSON et exit codes adaptés au scripting.

Sécurité et posture opérationnelle

La posture par défaut est plutôt saine pour un outil local.

Points positifs :

  • bind serveur par défaut sur 127.0.0.1 ;
  • filtrage Origin activé par défaut contre les attaques navigateur vers localhost ;
  • CORS à activer explicitement ;
  • bearer token disponible avec --token ou APFEL_TOKEN ;
  • endpoints non supportés en 501 au lieu de comportements ambigus ;
  • politique de sécurité documentée.

Exemple de protection documentée :

curl -H "Origin: http://evil.com" http://localhost:11434/v1/models
# => 403 Forbidden

Limite importante : MCP reste une surface d’exécution d’outils. Si on branche des serveurs MCP locaux, on retombe dans les risques classiques : commandes, fichiers, chemins, tokens, prompts hostiles.

Pour un poste de travail perso, c’est acceptable. Pour une exposition réseau, je ne le recommanderais pas sans proxy, auth forte, logs et confinement.

Est-ce que ça marche ?

Ce que j’ai pu vérifier

J’ai cloné le dépôt dans /tmp, inspecté le README, le packaging Swift, les docs sécurité/API, le Makefile, les sources principales et les tests.

Smoke test tenté dans l’environnement disponible :

swift --version

Résultat réel :

swift: not installed

J’ai donc tenté uniquement la vérification faisable sans lancer de serveur persistant :

swift package describe --type json

Elle a été sautée car le toolchain Swift n’est pas présent dans le conteneur Linux. Le projet exige en plus macOS 26.4+, Apple Silicon et FoundationModels, donc l’environnement de test n’est pas représentatif.

Conclusion de test

Je ne peux pas confirmer l’exécution réelle du binaire depuis ce conteneur.

En revanche, le dépôt est cohérent avec ses prérequis : il vérifie le SDK Apple dans le Makefile, documente les causes de modèle indisponible, et sépare beaucoup de logique dans ApfelCore pour la tester sans FoundationModels.

Le fichier projet indique 661 tests unitaires et 274 tests d’intégration dans les instructions internes. Je n’ai pas pu les exécuter ici.

Points forts

  • Positionnement clair : CLI UNIX + serveur OpenAI-compatible local.
  • Documentation dense et concrète : install, sécurité, compat OpenAI, intégrations, exemples.
  • Architecture lisible : séparation ApfelCore, CLI, serveur, intégration modèle.
  • Bons réflexes sécu pour un service localhost : origin check, token optionnel, CORS explicite.
  • Bonne ergonomie DevOps : pipes, JSON, exit codes, --quiet, fichiers attachés.
  • Distribution déjà pensée : Homebrew, Nix, tap dédié, build source.
  • Limites du modèle annoncées au lieu d’être masquées.

Limites

  • Verrouillé Apple : Apple Silicon, macOS 26.4+, Apple Intelligence activé.
  • Pas utilisable sur Linux, serveur cloud classique ou runner CI standard.
  • Contexte court : 4096 tokens annoncés.
  • Pas d’embeddings, pas de vision, pas de Responses API.
  • Qualité et disponibilité du modèle dépendent d’Apple, pas du projet.
  • Difficile à valider automatiquement hors Mac compatible.
  • Le mode serveur peut devenir sensible si exposé au-delà de localhost.

Recommandation

Adopter ?

Oui, mais seulement pour le bon périmètre.

Je l’adopterais pour :

  • un poste Mac Apple Silicon récent ;
  • des scripts locaux qui manipulent des données sensibles ;
  • des assistants dev légers avec base URL OpenAI-compatible ;
  • une lane d’inférence locale, privée, gratuite par requête ;
  • des workflows où la latence et le contexte limité restent acceptables.

Je ne l’adopterais pas comme :

  • moteur principal d’un agent autonome long-contexte ;
  • backend d’IA de production multi-utilisateur ;
  • brique portable infra Linux ;
  • solution RAG, faute d’embeddings ;
  • remplacement d’un modèle frontier pour raisonnement complexe, code lourd ou analyse large.

Verdict freelance sécu/DevOps

C’est un bon outil de poste de travail, pas une plateforme agentique complète.

Je le mettrais dans la boîte à outils locale avec une contrainte simple : tout ce qui passe dedans doit tenir dans 4096 tokens et ne pas nécessiter de garanties fortes de raisonnement.

Utile pour Jarvis ?

Réponse

Peut-être.

Pas comme tête principale de Jarvis, mais comme brique locale optionnelle.

Pourquoi

Jarvis/MOVA a déjà une tête LLM, des bras via agents sandbox, une lane infra déterministe, des crons, email, journal d’actions et une stack web. Ce qui manque à Jarvis n’est pas un petit modèle local de plus : c’est surtout de l’orchestration fiable, de la mémoire robuste, des connecteurs et de la sécurité opérationnelle.

Apfel peut quand même améliorer un sous-ensemble :

  • inférence locale sur Mac pour textes courts sensibles ;
  • pré-tri de contenu avant envoi à un modèle plus coûteux ;
  • résumé rapide de petits fichiers ;
  • fallback offline quand les API externes sont indisponibles ;
  • backend OpenAI-compatible pour tester des intégrations sans clé.

Comment l’intégrer si oui

Intégration prudente :

  1. Installer Apfel uniquement sur un Mac Apple Silicon compatible.
  2. Lancer le serveur en local, pas exposé réseau :
APFEL_TOKEN="$(uuidgen)" apfel --serve --token "$APFEL_TOKEN"
  1. Ajouter dans Jarvis un provider OpenAI-compatible local :
base_url = http://127.0.0.1:11434/v1
model    = apple-foundationmodel
api_key  = APFEL_TOKEN
  1. Router seulement des tâches courtes : résumé, reformulation, extraction simple.
  2. Interdire les tâches critiques : décisions infra, actions serveur, code non trivial, analyse sécurité profonde.
  3. Logger les appels comme n’importe quel bras Jarvis.
  4. Garder un timeout strict et un fallback vers le modèle principal.

Reco Jarvis

Je ne l’intègre pas dans le cœur.

Je l’ajoute éventuellement comme provider local expérimental, marqué low-context/local/private, avec un routage explicite et désactivable.

Note finale

Le dépôt est sérieux, actuel et bien maintenu à première vue. Son intérêt est réel si l’on vit déjà sur Mac récent.

Mais l’outil est volontairement étroit : il transforme Apple Intelligence en interface UNIX et OpenAI-compatible. C’est exactement sa force, et aussi sa limite.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *