mini-me v1.0.6
Un client ACP peut prêter à l'agent ses propres fonctions comme outils, et mini-me tourne sur Kronk, le serveur d'inférence Go d'Ardan Labs.
Nouveautés
Des outils prêtés par un client ACP (#202)
En mode ACP, le programme qui pilote mm peut maintenant donner à l'agent ses propres outils. Par exemple les buffers ouverts d'un éditeur, les données d'une application ou un appareil. Le modèle les appelle comme bash ou read_file, sous le nom client_<nom>. mm transmet chaque appel au client sous forme de requête d'extension ACP et rend la réponse au modèle. ACP ne définit aucun moyen de décrire un tel outil : mm en définit donc un, sous son propre espace de noms, org.mini-me. Un client qui ne s'en sert pas n'envoie rien, et rien ne change.
- Deux façons d'annoncer les outils, réglées par
acp.clientTools.discovery.meta(par défaut) : le client liste ses outils dansinitialize.request: le client dit seulement qu'il a des outils, et mm demande la liste à chaque ouverture, chargement ou reprise de session. C'est pour des outils qui dépendent de la session.
- Permissions, réglées par
acp.clientTools.permissions.auto(par défaut) ne demande au client que siyolovautfalse.askdemande avant chaque appel.- Le défaut est
auto, là où celui de MCP estask: un outil client est une fonction du programme même qui a lancé mm.
- Les erreurs ne terminent jamais le tour. Un client qui échoue, ne répond pas dans
acp.clientTools.timeout(30s), ou répondMethod not founddonne au modèle un texte[client tool error: …]. Une entrée inutilisable de la liste est ignorée avec une ligne sur stderr. - Pour le couper :
acp.clientTools.enabled: false. Les outils n'existent qu'en mode ACP : le terminal et la fenêtre n'ont pas de client pour les prêter.
La spécification est écrite pour les auteurs de clients : le JSON exact de l'annonce, de la requête de liste, d'un appel et de sa réponse. Le paquet Go de demo.acp.sdk propose des outils avec Options.Tools et ToolDiscovery.
Vérifié avec Qwen3.5 4B sur llmman : l'exemple Go, dans les deux modes, et la démo Node.js, en meta, request et yolo: false. La démo Node.js a aussi tourné sur macOS.
Voir Proposer des outils depuis votre client ACP, la spécification et pourquoi elle a cette forme.
Fournisseur Kronk (#75)
provider: kronk fait tourner mini-me sur Kronk, le serveur d'inférence Go d'Ardan Labs. Kronk embarque llama.cpp sans processus llama-server. mm utilise son API compatible OpenAI sur http://127.0.0.1:11435/v1. Depuis une sandbox, mm se replie sur http://host.docker.internal:11435/v1.
- La fenêtre est connue dès le démarrage. C'est celle avec laquelle Kronk sert le modèle, lue auprès de Kronk que le modèle soit chargé ou non, par exemple
ctx: 131072 (/v1/kronk/models). autoPulltélécharge un modèle que Kronk n'a pas, et/unloadet l'outilunload_modellibèrent sa mémoire.- Le résumé d'une compaction coupe le raisonnement avec
chat_template_kwargs, que Kronk respecte ; Kronk ignorereasoning_effort: none. Pas de ligneReading the prompt …: Kronk n'envoie pas d'avancement pendant qu'il lit. - Un Kronk protégé (modes
authenticatedoufull-protected) prend son jeton dansKRONK_TOKEN. Un jeton refusé donne au démarrage un avertissement qui nomme la variable. mm init --provider kronkliste les modèles de Kronk et lit, auprès de Kronk, la fenêtre, l'échantillonnage du GGUF et l'interrupteur de raisonnement du chat template.- Les profils Kronk. Kronk liste aussi des profils de configuration,
provider/modelID/PROFIL(par exemple…/Qwopus3.5-4B-Coder.Q8_0/AGENT). Un profil, c'est le même modèle avec ses propres réglages dans lemodel_config.yamlde Kronk.mm initdit ce qu'est un profil, et recopie son échantillonnage dans le fichier. Sans cette copie, il ne s'appliquerait jamais : mm envoietemperature,top_petmax_tokensà chaque requête, même sans blocsampling:, et une valeur de la requête l'emporte sur celle du profil.- La fenêtre affiche un profil comme
Qwopus3.5-4B-Coder.Q8…/AGENTau lieu deAGENTseul.
Depuis un Docker Sandbox, lancez Kronk sur l'hôte avec kronk server start --api-host 0.0.0.0:11435 : par défaut, il n'écoute que sur la boucle locale. L'id sous lequel Kronk sert un modèle n'est pas toujours celui du téléchargement : unsloth/Qwen3.5-2B-GGUF:Q4_K_M est servi comme unsloth/Qwen3.5-2B-Q4_K_M. Prenez l'id que donne GET /v1/models.
Vérifié avec Kronk 1.33.2, Qwopus3.5 4B Coder et Qwen3.5 2B :
- un tour avec appels d'outils ;
/unload;mm init --provider kronk --check;- la fenêtre et l'échantillonnage d'un profil.
Pas essayé : un vrai téléchargement par autoPull (seule la réponse pour un modèle déjà installé a été lue), une compaction, et un Kronk protégé.
Voir Faire tourner mini-me sur Kronk.
Démos
demos/kronk/: un agent de code sur Kronk avecmradermacher/Qwopus3.5-4B-Coder.Q8_0, et la ligne à changer pour Qwen3.5 2B.demo.acp.sdk/client-tools-nodejs/: un client Node.js sans dépendance qui prête à l'agent un outil,host_info, le système, le CPU, la mémoire ou l'uptime de la machine du client. L'agent n'a pas de shell : cet outil est son seul moyen de savoir.demo.acp.sdk/go/:Options.Tools, etexamples/clienttools, une liste de tâches que l'agent remplit et lit.
Documentation
- Nouveau :
- Mis à jour pour Kronk et les outils client :
- les références de configuration, de la CLI et des outils ;
- les explications sur les fournisseurs,
mm initet les modèles qui réfléchissent ; - les guides pour couper le raisonnement, libérer la mémoire d'un modèle et tourner dans un Docker Sandbox.
- Le guide d'installation macOS montre comment vérifier la signature du binaire, avec
codesign, avant de l'installer.
Mise à jour
-
Les fichiers d'agent ne changent pas. Remplacez le binaire : voir les guides d'installation pour macOS, Linux et Windows.
-
Nouvelles clés :
acp.clientTools.enabled(true) ;acp.clientTools.discovery(meta) ;acp.clientTools.permissions(auto) ;acp.clientTools.timeout(30s).
Un client ACP qui n'annonce aucun outil ne voit aucune différence.
-
Nouvelle valeur de
provider:kronk.unknown providerliste maintenantdmr, kronk, llamacpp, llmman, ollama, openai.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
|