Codemode
Codemode permet au modèle de combiner des appels d’outils dans un programme JavaScript, d’inspecter leurs résultats programmatiques et d’émettre une réponse concise. Il utilise les outils appelables et le périmètre d’accès de la session actuelle. Il ne fournit ni Node.js, ni accès direct aux fichiers, ni variables globales réseau, ni minuteries ; ces opérations exigent un outil hôte admissible.
Activer et choisir un mode
Ouvrez Dashboard → Tools → Built-in → codemode pour définir les valeurs par défaut du profil ou appliquer uniquement Codemode à une session inactive sans entrée en attente. L’enregistrement du profil ne resélectionne pas une session existante. Consultez les paramètres Dashboard.
Pour une session nouvelle ou reprise inactive, la sélection peut inclure Codemode :
anyy --tools '+codemode,+tool_search'
anyy --resume SESSION_ID --tools '+codemode,+tool_search'
Les règles + modifient la sélection par défaut du profil, pas la liste active de la session reprise. Elles n’écrivent pas config.yaml. La découverte MCP peut aussi activer Codemode automatiquement, sauf exclusion explicite.
codemode.mode: on conserve les outils directs à côté de Codemode. only masque les déclarations directes appelables par script dans les requêtes, tout en les gardant appelables via Codemode. Le mode n’active pas Codemode, n’accorde pas d’outils et ne change pas le rôle. codemode.inline_budget contrôle la documentation des outils imbriqués incluse dans sa déclaration, environ 3 000 tokens estimés par défaut ; les outils omis restent découvrables. Consultez Ensembles d’outils.
Écrire un script
L’argument public est un objet avec une chaîne code obligatoire :
{"code":"const result = await tools.bash({command: \"pwd\"}); text(result);"}
Si le modèle natif sélectionné déclare compat.supportsOpenAIGrammarTools et que le fournisseur prend en charge cette voie, Anyy peut envoyer une entrée grammaticale JavaScript brute. Les autres modèles utilisent le JSON ci-dessus. Les deux voies enregistrent les mêmes arguments canoniques.
Le script est le corps d’une fonction asynchrone : await et return fonctionnent au niveau supérieur. Fournissez la source sans balises Markdown. Par exemple, avec read disponible :
const page = await tools.read({path: "README.md", offset: 1, limit: 60});
text(page);
Attendez tous les appels démarrés. Ceux encore en attente à la fin sont annulés. Chaque appel crée une nouvelle VM et de nouvelles variables globales ; utilisez store pour conserver des valeurs entre appels Codemode.
Une première ligne facultative définit les limites de sortie et d’exécution :
// @options: {"max_output_tokens": 2000, "timeout_ms": 30000}
const results = await Promise.all([
tools.bash({command: "git status --short"}),
tools.read({path: "README.md", limit: 40})
]);
for (const result of results) text(result);
Ces deux lectures sont indépendantes ; séquencez les opérations dépendantes. timeout_ms doit être un entier positif inférieur ou égal à 2147483647 et inclut chargement et démarrage de la VM. Sans valeur, aucun délai de script supplémentaire ne s’applique, mais l’annulation du parent et les limites des outils hôtes restent actives. max_output_tokens est un entier non négatif, égal à 10000 par défaut, utilisé comme budget textuel approximatif.
Découvrir et appeler des outils
Utilisez les identifiants exacts découverts sans deviner les noms MCP :
| API | Comportement |
|---|---|
ALL_TOOLS | Noms et descriptions appelables actuels |
await searchTools(query, {limit, namespace}) | Recherche dans cet instantané ; limite 8 par défaut, espace de noms facultatif |
await describeTool(name) | Retourne la déclaration ou undefined ; accepte nom canonique ou identifiant de script |
await describeNamespace(name) | Retourne description/instructions et identifiants d’outils de l’espace de noms, ou undefined |
await tools.name({...}) | Appelle un outil existant par la voie hôte normale |
Les noms sont normalisés en identifiants JavaScript. La ponctuation devient _ ; la déclaration active fait autorité en cas de collision. Les métadonnées d’espace de noms organisent la découverte sans accorder d’accès. Les outils cachés et déclarations réservées au modèle ne sont pas appelables par script.
searchTools recherche uniquement dans les métadonnées appelables existantes. Il ne récupère pas un autre catalogue serveur et n’active pas de déclarations pour une requête ultérieure. L’outil modèle distinct tool_search effectue cette activation.
Un appel imbriqué rejette généralement en cas d’échec. Un outil à retour structuré déclaré peut toutefois résoudre un objet d’erreur : inspectez bash.exit_code, l’état d’un résultat produit ou isError de MCP au lieu de supposer toute Promise résolue réussie. Les résultats structurés servent au script ; émettez les parties utiles avec text plutôt que toute la réponse distante.
Sortie et valeurs locales à la branche
| Variable globale | Utilisation |
|---|---|
text(value) | Ajoute du texte ; les objets sont encodés en JSON |
image(dataURLOrBlock) | Ajoute une image PNG/JPEG/GIF/WebP base64 et enregistre un fichier temporaire ; URL distantes refusées |
console.log(...) | Ajoute des diagnostics dans le bloc console |
return value | Ajoute la valeur retournée à la sortie |
exit() | Termine le script avec succès |
store(key, value) / load(key) | Enregistre/lit une valeur sérialisable en JSON sous une clé chaîne ; undefined la supprime |
Les changements de stockage réussis sont validés dans la branche sélectionnée. Charger une autre branche sélectionne ses valeurs propres ; rouvrir la base les conserve. Erreur, annulation ou délai dépassé abandonne les changements préparés du script. Les effets d’outils déjà achevés ne sont pas annulés.
Chaque valeur JSON stockée contient au maximum 262144 caractères ; clés et valeurs sérialisées réunies, 1048576. Stockez un état compact, sans fichiers entiers ni identifiants. La VM est limitée à 256 Mio de mémoire. Les plafonds de sortie sont 16777216 caractères JavaScript ou 100000 appels sortie/console ; les dépasser fait échouer le script.
Un script en échec peut retourner une sortie partielle avec l’erreur. Le budget textuel raccourcit la sortie avec des extraits début/fin et indique le chemin temporaire complet ; utilisez read avec offset/limit tant que le fichier existe. Ce chemin temporaire n’est pas une promesse de pièce jointe durable. Pour les références logiques enregistrées et budgets, consultez Résultats d’outils.
API des modèles de classification et d’image
Anyy expose aussi les API asynchrones suivantes dans Codemode. La description d’outil renvoie à la référence lisible fournie dans <ProfileHome>/system/docs/pi-v1.2.0/codemode.md ; lisez-la pour les schémas complets avant utilisation.
| API | Arguments |
|---|---|
models.getModelsOfType(type, provider?) | Liste les modèles configurés |
models.getAvailableOfType(type, provider?) | Filtre selon fournisseur activé et identifiants résolvables localement ; ce n’est pas une sonde distante |
models.getModelOfType(type, provider, id) | Cherche un modèle avec trois chaînes distinctes ; retourne undefined s’il est inconnu |
models.classify(model, context) | Utilise un modèle de classification configuré |
models.generateImages(model, context) | Utilise un modèle d’image configuré |
Les types sont chat, image et classifier. Lister les modèles chat n’expose aucune fonction de génération de conversation. L’exécution exige un objet modèle contenant provider et id du catalogue, sans chaîne combinée provider/id ni point d’accès personnalisé.
Pour la classification, context.state est un objet ; images facultatif contient des blocs image base64. questions est un objet non vide. Chaque question a instructions, type et criteria : choice associe des étiquettes à des significations, score liste les niveaux croissants et bool donne les significations textuelles de true et false.
const available = await models.getAvailableOfType("classifier");
if (!available.length) { text("No configured classifier is available"); exit(); }
const result = await models.classify(available[0], {
state: {subject: "Move tomorrow's meeting to Friday"},
questions: {
scheduling: {
type: "bool", instructions: "Does this request change a meeting?",
criteria: {true: "A meeting change is requested", false: "No meeting change"}
}
}
});
if (result.stopReason !== "stop") throw new Error(result.errorMessage || result.stopReason);
text(result);
Pour générer, passez {input: [{type: "text", text: "..."}]} ; des blocs image base64 peuvent servir de références. Par exemple :
const available = await models.getAvailableOfType("image");
if (!available.length) { text("No configured image model is available"); exit(); }
const result = await models.generateImages(available[0], {
input: [{type: "text", text: "A simple blue bird icon on white"}]
});
if (result.stopReason !== "stop") throw new Error(result.errorMessage || result.stopReason);
for (const part of result.output) {
if (part.type === "image") image(part);
else if (part.type === "text") text(part.text);
}
Quatre opérations de classification/image peuvent s’exécuter simultanément par script au maximum. Les échecs fournisseur retournent stopReason: "error" ou "aborted" et errorMessage ; des arguments invalides peuvent rejeter avant l’appel. L’utilisation du modèle est accumulée dans le résultat Codemode. Disponibilité, facturation et entrées image acceptées dépendent toujours du fournisseur configuré.