Codemode
Codemode lässt das Modell Werkzeugaufrufe in einem JavaScript-Programm kombinieren, programmatische Ergebnisse prüfen und eine knappe Antwort ausgeben. Es verwendet aufrufbare Werkzeuge und Zugriffsumfang der aktuellen Sitzung. Es bietet weder Node.js noch direkten Dateisystemzugriff, Netzwerk-Globals oder Timer; diese Operationen erfordern ein geeignetes Hostwerkzeug.
Aktivieren und einen Modus wählen
Öffnen Sie Dashboard → Werkzeuge → Integriert → codemode, um Profilvorgaben zu setzen oder eine reine Codemode-Änderung auf eine untätige Sitzung ohne ausstehende Eingabe anzuwenden. Speichern im Profil wählt eine vorhandene Sitzung nicht neu aus. Siehe Dashboard-Einstellungen.
Für eine neue oder untätig fortgesetzte Sitzung kann die Werkzeugauswahl Codemode enthalten:
anyy --tools '+codemode,+tool_search'
anyy --resume SESSION_ID --tools '+codemode,+tool_search'
Die +-Regeln ändern die Standardauswahl des Profils, nicht die aktuell aktive Liste der fortgesetzten Sitzung. Sie schreiben keine config.yaml. MCP-Erkennung kann Codemode ebenfalls automatisch aktivieren, sofern keine explizite Regel es ausschließt.
codemode.mode: on behält direkte Werkzeuge neben Codemode. only verbirgt skriptaufrufbare direkte Deklarationen aus Modellanfragen, während diese Werkzeuge über Codemode aufrufbar bleiben. Der Modus aktiviert weder Codemode noch zusätzliche Werkzeuge und ändert keine Rolle. codemode.inline_budget steuert den Umfang eingebetteter Werkzeugdokumentation in seiner Deklaration (standardmäßig etwa 3000 geschätzte Token); aus dieser Liste ausgelassene Werkzeuge bleiben erkennbar. Siehe Werkzeuggruppen.
Ein Skript schreiben
Die öffentliche Argumentform ist ein Objekt mit erforderlicher Zeichenfolge code:
{"code":"const result = await tools.bash({command: \"pwd\"}); text(result);"}
Weist das ausgewählte native Modell compat.supportsOpenAIGrammarTools aus und unterstützt der Anbieter diesen Anfrageweg, kann Anyy rohe JavaScript-Grammatikeingabe senden. Andere Modelle verwenden die obige JSON-Form. Beide Wege speichern dieselben kanonischen Argumente.
Das Skript ist ein asynchroner Funktionsrumpf; await und return auf oberster Ebene funktionieren daher. Geben Sie Quelltext ohne Markdown-Codezäune an. Beispiel mit verfügbarem read:
const page = await tools.read({path: "README.md", offset: 1, limit: 60});
text(page);
Alle gestarteten Aufrufe sollten abgewartet werden. Beim Skriptende noch ausstehende Aufrufe werden abgebrochen. Für jeden Aufruf werden neue VM und Globals erstellt; verwenden Sie store für Werte, die einen weiteren Codemode-Aufruf überdauern sollen.
Eine optionale erste Zeile setzt Ausgabe- und Ausführungsgrenzen:
// @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);
Dies sind zwei unabhängige Lesevorgänge; führen Sie Operationen nacheinander aus, wenn eine von einer anderen abhängt. timeout_ms muss eine positive Ganzzahl bis höchstens 2147483647 sein und umfasst VM-Laden/Start. Ohne Angabe gibt es kein zusätzliches Skriptzeitlimit, doch übergeordneter Abbruch und Hostwerkzeuglimits gelten weiterhin. max_output_tokens ist eine nicht negative Ganzzahl, standardmäßig 10000, als ungefähres Textbudget.
Werkzeuge entdecken und aufrufen
Verwenden Sie die von der Erkennung gelieferten exakten Kennungen, statt MCP-Namen zu erraten:
| API | Verhalten |
|---|---|
ALL_TOOLS | Aktuelle aufrufbare Namen und Beschreibungen |
await searchTools(query, {limit, namespace}) | Diesen Schnappschuss durchsuchen; Standardlimit 8, optionaler Namespace |
await describeTool(name) | Deklaration oder undefined liefern; akzeptiert kanonischen Namen oder Skriptkennung |
await describeNamespace(name) | Namespace-Beschreibung/-Anweisungen und Werkzeugkennungen oder undefined liefern |
await tools.name({...}) | Ein vorhandenes aufrufbares Werkzeug über den normalen Hostweg ausführen |
Namen werden zu JavaScript-Kennungen normalisiert. Satzzeichen werden _; bei Namenskollisionen ist die aktuelle Deklaration maßgeblich. Namespace-Metadaten gruppieren Werkzeuge zur Erkennung; sie gewähren keinen Zugriff. Verborgene Werkzeuge und reine Modelldeklarationen sind nicht skriptaufrufbar.
searchTools durchsucht nur vorhandene aufrufbare Metadaten. Es ruft weder einen weiteren Serverkatalog ab noch aktiviert es Deklarationen für eine spätere Modellanfrage. Das separate Modellwerkzeug tool_search führt diese Aktivierung aus.
Ein verschachtelter Aufruf weist bei Fehler normalerweise zurück. Ein Werkzeug mit deklarierter strukturierter Rückgabe kann stattdessen ein Fehlerobjekt liefern: Prüfen Sie bash.exit_code, den Status eines Produktergebnisses oder MCPs isError, statt jeden erfüllten Promise als Erfolg anzusehen. Strukturierte Ergebnisse sind zur Skriptprüfung gedacht; geben Sie nützliche Teile mit text aus, statt eine vollständige Remote-Antwort auszugeben.
Ausgabe und zweiglokale Werte
| Global | Verwendung |
|---|---|
text(value) | Text hinzufügen; Objekte werden JSON-kodiert |
image(dataURLOrBlock) | Base64-PNG/JPEG/GIF/WebP hinzufügen und temporäre Bilddatei speichern; Remote-URLs werden abgelehnt |
console.log(...) | Diagnosen zum Konsolenausgabeblock hinzufügen |
return value | Rückgabewert zur Ausgabe hinzufügen |
exit() | Skript erfolgreich beenden |
store(key, value) / load(key) | JSON-serialisierbaren Wert unter Zeichenfolgenschlüssel speichern/lesen; undefined löscht ihn |
Erfolgreiche Speicheränderungen werden im ausgewählten Gesprächszweig festgeschrieben. Das Laden eines anderen Zweigs wählt dessen eigene festgeschriebene Werte; sie bleiben beim erneuten Öffnen der Datenbank erhalten. Fehler, Abbruch oder Zeitüberschreitung verwerfen die vorbereiteten Änderungen des aktuellen Skripts. Bereits vollendete Werkzeugwirkungen werden nicht rückgängig gemacht.
Jeder gespeicherte JSON-Wert darf höchstens 262144 Zeichen enthalten; Schlüssel und serialisierte Werte zusammen höchstens 1048576. Speichern Sie kompakten Zustand, keine vollständigen Dateien oder Zugangsdaten. Die VM hat ein Speicherlimit von 256 MiB. Harte Ausgabegrenzen sind 16777216 JavaScript-Zeichen oder 100000 Ausgabe-/Konsolenaufrufe; Überschreiten einer Grenze lässt das Skript scheitern.
Ein fehlgeschlagenes Skript kann Teilausgabe samt Fehler zurückgeben. Das Textbudget kürzt Ausgabe auf Anfangs-/Endauszüge und nennt den temporären Vollausgabepfad; verwenden Sie read mit offset/limit, solange die Datei existiert. Ein temporärer Ausgabepfad verspricht keinen dauerhaften Anhang. Gespeicherte logische Ergebnisreferenzen und Kontextbudgets sind unter Werkzeugergebnisse beschrieben.
Klassifizierer- und Bildmodell-APIs
Anyy stellt in Codemode auch folgende asynchrone Modell-APIs bereit. Die Werkzeugbeschreibung verweist auf die mitgelieferte lesbare Referenz <ProfileHome>/system/docs/pi-v1.2.0/codemode.md; lesen Sie vor der Verwendung die vollständigen Schemas.
| API | Argumente |
|---|---|
models.getModelsOfType(type, provider?) | Konfigurierte Modelle auflisten |
models.getAvailableOfType(type, provider?) | Nach aktiviertem Anbieter und lokal auflösbaren Zugangsdaten filtern; kein Remote-Zustandstest |
models.getModelOfType(type, provider, id) | Ein Modell mit drei getrennten Zeichenfolgen suchen; unbekanntes Modell liefert undefined |
models.classify(model, context) | Konfiguriertes Klassifizierermodell verwenden |
models.generateImages(model, context) | Konfiguriertes Bildmodell verwenden |
Typen sind chat, image und classifier. Das Auflisten von Chatmodellen bietet keine Chatgenerierungsfunktion. Die Ausführung benötigt ein Modellobjekt mit provider und id aus dem Katalog, keine kombinierte Zeichenfolge provider/id und keinen eigenen Endpunkt.
Für Klassifizierung ist context.state ein Objekt; optionale images enthalten Base64-Bildblöcke. questions ist ein nicht leeres Objekt. Jede Frage hat instructions, type und criteria: choice ordnet Labels Bedeutungen zu, score listet Stufen von niedrig nach hoch und bool liefert Zeichenfolgenbedeutungen für true und 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);
Übergeben Sie zur Generierung {input: [{type: "text", text: "..."}]}; Base64-Bildblöcke können Referenzen liefern. Beispiel:
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);
}
Innerhalb eines Skripts laufen höchstens vier Klassifizierer-/Bildoperationen gleichzeitig. Anbieterfehler liefern Ergebnisse mit stopReason: "error" oder "aborted" und errorMessage; ungültige Argumente können vor Beginn eines Anbieteraufrufs zurückgewiesen werden. Modellverbrauch wird im Codemode-Ergebnis summiert. Verfügbarkeit, Abrechnung und akzeptierte Bildeingaben hängen weiterhin vom konfigurierten Anbieter ab.