nb-cli – CLI für KI-Agenten und Notebook-Automatisierung
(blog.jupyter.org)- Ein experimentelles Open-Source-CLI-Tool, das so entwickelt wurde, dass KI-Coding-Agenten Jupyter-Notebooks als Artefakte behandeln können; implementiert in Rust, um schnelle und stabile Notebook-Manipulationen zu unterstützen
- Um das Problem zu lösen, dass die
.ipynb-JSON-Struktur für Automatisierung und LLM-Verarbeitung ungeeignet ist, bietet es unter Einhaltung der nbformat-Spezifikation Lese-, Schreib-, Ausführungs- und Suchfunktionen über die Kommandozeile - Funktioniert auch ohne Jupyter-Server; bei Verbindung mit einem Server wird kollaboratives Editieren in Echtzeit über dasselbe Y.js-CRDT-Protokoll unterstützt, das auch JupyterLab verwendet
- Für bessere LLM-Kontexteffizienz wurde ein neues sentinelbasiertes, KI-optimiertes Markdown-Format mit
@@cell,@@outputusw. entworfen - Vereint auf Agenten-Workflows zugeschnittene Funktionen wie Unix-Komponierbarkeit, stabile Zellreferenzen, leistungsfähige Suche, Batch-Manipulation mehrerer Zellen und umgebungsbewusste Ausführung
Hintergrund: das „Blackbox“-Problem von Notebooks
- Mit dem Aufstieg von KI-Coding-Agenten verändert sich die Definition von Entwickler-Tools; LLMs wie Claude und GPT wurden anhand umfangreicher CLI-Anwendungsfälle aus Dokumentation, Stack Overflow und GitHub trainiert und sind daher sehr geübt im Umgang mit Kommandozeilen-Interfaces
- Bisherige Tools konzentrierten sich darauf, Agenten innerhalb von Notebooks auszuführen, doch es fehlten Werkzeuge für Agenten, die das Notebook selbst als Artefakt behandeln
- Die
.ipynb-JSON-Struktur von Jupyter-Notebooks stellt in Shell-Skripten und LLMs einen Reibungspunkt für programmgesteuerte Verarbeitung dar - In den folgenden Szenarien, die Automatisierung und KI-Analyse erfordern, reichen bestehende Interfaces nicht aus
- Autonome Analyse: Ein KI-Agent, der Data-Science-Workflows auditiert, muss die Pipeline auf Zellebene verstehen
- Automatisierte Verifikation: CI/CD-Systeme müssen Notebooks ausführen, Ausgaben prüfen und Fehler frühzeitig erkennen
- Dokumentation im großen Maßstab: Notebook-Inhalte müssen automatisch in saubere Dokumentation umgewandelt werden
- Debugging in Produktionsumgebungen: Ausführungsfehler von Notebooks in Headless-Umgebungen müssen ohne manuelle Eingriffe diagnostiziert werden
- Notebooks als Daten: Notebooks werden wie strukturierte Datenbanken behandelt, um Berichte, Zusammenfassungen und Visualisierungen zu erzeugen
- Bisher war es üblich, die JupyterLab-UI manuell zu bedienen, fragile Python-Skripte zum Parsen komplexer JSON-Strukturen zu schreiben oder Ausführungstools ohne Echtzeit-Integration zu verwenden
- nb-cli nutzt ein CLI-first-Interface und Unix-Komponierbarkeit, damit Notebooks als erstklassiger Bestandteil des Software-Stacks behandelt werden können
Kernfunktionen
-
Funktioniert mit oder ohne Jupyter-Server
- Liest und schreibt standardmäßig direkt
.ipynb-Dateien und führt sie aus, indem es über ZeroMQ direkt mit dem Kernel kommuniziert - Geeignet für Skripte und CI-Pipelines, bei denen kein laufender Server erforderlich ist
- Mit
nb create analysis.ipynblässt sich ohne Server ein Notebook erstellen - Mit
nb cell add,nb executeundnb readkönnen Zellen hinzugefügt, ausgeführt und Ergebnisse abgerufen werden
- Mit
- Wenn mehrere Nutzer oder Agenten gleichzeitig dasselbe Notebook bearbeiten, ist eine Serververbindung nützlich; sie bietet konfliktfreie Synchronisierung in Echtzeit über dasselbe Y.js-CRDT-Protokoll, das JupyterLab intern verwendet
nb connecterkennt einen lokalen Server automatisch; mit der Option--serverlassen sich bestimmter Server und Token angeben- Die Option
--restart-kernelunterstützt Kernel-Neustarts zur Prüfung der Reproduzierbarkeit
- Bei bestehender Serververbindung erkennt das Tool, ob das Notebook in JupyterLab geöffnet ist, und fällt andernfalls nahtlos auf dateibasiertes Arbeiten zurück
- Liest und schreibt standardmäßig direkt
-
KI-optimiertes Markdown-Format
- Sprachmodelle parsen JSON nicht, sondern sagen Tokens voraus; deshalb ist tief verschachteltes Jupyter-JSON im Kontextfenster ineffizient
- Im Standardformat von Jupyter bestehen Quellen aus String-Arrays, Ausgaben aus base64-Blobs und Metadaten aus mehreren Verschachtelungsebenen; aus Sicht eines LLM werden dadurch 30–40 % der Tokens bedeutungslos für Strukturzeichen wie geschweifte Klammern, eckige Klammern und Escapes verbraucht
- Normales Markdown ist zwar tokeneffizient, aber mehrdeutig
- Es ist nicht unterscheidbar, ob
#eine Markdown-Überschrift oder ein Python-Kommentar ist - Es ist nicht unterscheidbar, ob ein Code-Fence eine Notebook-Zelle oder ein Beispiel im Dokument ist
- Wenn man sagt „Behebe den Fehler in Zelle 7“, fehlen strukturelle Marker, um die Zellposition stabil zu identifizieren
- Es ist nicht unterscheidbar, ob
- Um das zu lösen, wurde ein zeilenbasiertes Sentinel-Format entworfen
- Sentinels wie
@@notebook,@@cellund@@outputschaffen klare Strukturgrenzen - In den Sentinel-Zeilen werden Zelltyp, Index und Ausführungsanzahl als Inline-JSON-Metadaten angegeben, passend dazu, wie der Attention-Mechanismus Informationen findet
- Code-Fences mit Sprachhinweisen aktivieren das Syntaxwissen des Modells
- Jeder Zellblock ist in sich abgeschlossen und degradiert bei Abschneidung schrittweise, statt dass wie bei JSON bei einem einzelnen abgeschnittenen Teil die gesamte Struktur bricht
- Sentinels wie
-
Komponierbares Design
- Folgt den Unix-Konventionen und bietet Plain-Text-Ausgabe, stdin-Unterstützung und vorhersehbare Exit-Codes
- Aus Sicht eines Agenten kann ein einzelner Shell-Befehl mehrere Tool-Aufrufe und Zwischen-Parsing ersetzen
- Aufgaben wie „Füge dem Notebook einen Zusammenfassungsabschnitt hinzu und führe es aus“ können durch einen einzigen Shell-Aufruf mit Zellen hinzufügen, ausführen und Ergebnis lesen erledigt werden
- Verkettung in der Form
nb cell add ... && nb execute ... && nb read ... - Der Agent erhält nur die benötigten Ausgaben, ohne das gesamte Notebook erneut lesen zu müssen
- Verkettung in der Form
- Dasselbe Prinzip gilt für das Debugging
nb search analysis.ipynb --with-errorsgibt mit einem einzigen Aufruf nur fehlerhafte Zellen zurück, ohne Tokens für erfolgreiche Zellen zu verschwenden
-
Stabile Zellreferenzen
- Unterstützt zwei Arten der Zellreferenzierung
- Indexbasiert
--cell-index 0(mit negativer Indizierung;-1ist die letzte Zelle) - ID-basiert
--cell f68t57(bleibt auch dann unverändert, wenn die Zelle verschoben wird)
- Indexbasiert
- Referenzierung nach Position etwa mit
nb cell update ... --cell-index 0 --source "x = 42"oder - per stabiler ID mit
nb cell update ... --cell ce456 --source "print('Done')", sodass auch Zellumordnungen sicher sind
- Unterstützt zwei Arten der Zellreferenzierung
-
Leistungsfähige Suche
- Schnelles Auffinden nach Zellinhalt, Zelltyp und Ausführungsfehlern
- Standardmäßig werden Zellquellen durchsucht; mit einem Scope-Filter lässt sich die Suche auf Ausgaben erweitern
nb search analysis.ipynb "import pandas"sucht nach dem Musternb search analysis.ipynb --with-errorsextrahiert nur Fehlerzellennb search analysis.ipynb "KeyError" --scope outputsucht in Ausgabennb search analysis.ipynb "TODO" --cell-type markdownfiltert nach Zelltyp
- Agenten können mit
--with-errorsnur fehlgeschlagene Zellen erhalten und in Kombination mit--scope outputdirekt nach Error-Tracebacks suchen - Auch Menschen können damit deprecated APIs auditieren, Funktionen in großen Notebooks auffinden oder Muster vor einem Refactoring extrahieren
-
Batch-Manipulation mehrerer Zellen
- Das Hinzufügen von Zellsequenzen wie Markdown-Header → Konfigurationscode → Analyse ist ein häufiges Muster; beim Hinzufügen einzelner Zellen steigen Roundtrips und Verwaltungsaufwand für Indizes
- Unterstützt das Hinzufügen mehrerer Zellen in einem Aufruf über das Sentinel-Format
@@markdown- und@@code-Blöcke können per Heredoc gebündelt und auf einmal übergeben werden- Unterstützt auch das vollständige JSON-Format in der Form
@@cell {"cell_type": "..."}
- Kompatibel mit stdin und daher leicht in Skripten und Pipelines für den Zellenaufbau nutzbar
printf '@@markdown\n## Summary\n\n@@code\ndf.describe()\n' | nb cell add report.ipynb --source -
- Dieselbe Batch-Philosophie gilt auch für Ausführung und Löschung
nb execute analysis.ipynb --start 2 --end 5führt einen Bereich ausnb cell delete analysis.ipynb -i 0 -i 2löscht bestimmte Zellennb cell delete analysis.ipynb --range 0:3löscht einen Bereich
-
Umgebungsbewusste Ausführung
nb connect,nb executeundnb createunterstützen die Flags--uv,--pixi, um Jupyter-Server und Kernel über den jeweiligen Environment-Manager zu findennb status --pythongibt das Befehlspräfix zurück, mit dem Python in derselben Umgebung wie der verbundene Kernel ausgeführt wird- Beispiel-Rückgabewerte:
"uv run","pixi run"; im Fall von System-Python ein leerer Wert - Nutzbar in Pipelines in der Form
$(nb status --python) python -c "..."
- Beispiel-Rückgabewerte:
Praktische Anwendungsfälle
-
KI-Agenten-Workflows
- Fehlgeschlagene Zellen finden → Code korrigieren → erneut ausführen lässt sich per Befehl verknüpfen, sodass Notebook-Manipulation Teil des Analyse-Workflows wird
nb search data_analysis.ipynb --with-errorsnb cell update data_analysis.ipynb --cell-index 3 --source "df = pd.read_csv('data.csv', encoding='utf-8')"nb execute data_analysis.ipynb --cell-index 3
- Fehlgeschlagene Zellen finden → Code korrigieren → erneut ausführen lässt sich per Befehl verknüpfen, sodass Notebook-Manipulation Teil des Analyse-Workflows wird
-
CI/CD-Integration
- Führt automatisierte Tests und Validierung von Notebooks in Continuous-Integration-Pipelines aus
- Nach Ausführung mit
nb execute pipeline.ipynb --allow-errorsgibtnb search ... --with-errorsbei gefundenen Fehlern Exit-Code 1 zurück - Vor dem Commit können mit
nb output clearAusgaben bereinigt werden
- Nach Ausführung mit
- Führt automatisierte Tests und Validierung von Notebooks in Continuous-Integration-Pipelines aus
-
Programmgesteuerte Notebook-Erzeugung
- Automatische Erstellung von Dokumentation, Berichten und Analysen
- Mit
nb create report.ipynbwird ein Berichts-Notebook erzeugt - Mit einem Multi-Cell-Befehl lassen sich Titel, Einleitung und Analysecode auf einmal hinzufügen und anschließend mit
nb executemit Ausgaben füllen
- Mit
- Automatische Erstellung von Dokumentation, Berichten und Analysen
-
Debugging von Notebooks in Produktionsumgebungen
- Probleme in ausgerollten Notebooks schnell diagnostizieren
nb search failing_notebook.ipynb --with-errorsextrahiert Fehlerzellennb search analysis.ipynb "pandas.np"sucht nach Verwendung einer deprecated APInb search notebook.ipynb "eval("sucht nach sicherheitskritischen Musternnb read failing_notebook.ipynb --cell-index 5zeigt die vollständige Ausgabe einer bestimmten Zellenb execute failing_notebook.ipynb --restart-kernelprüft saubere Reproduzierbarkeit
- Probleme in ausgerollten Notebooks schnell diagnostizieren
Beispiele aus der Praxis
-
Beispiel 1: Mit Claude ein Trainings-Notebook für LLM-gestütztes Reinforcement Learning erstellen
- Nutzer-Prompt: Erstelle ein Notebook, das zentrale Konzepte wie Policy-Modell, Reward-Modell, KL-divergence-Strafe, PPO und GRPO behandelt und in jeder Zelle die Funktionsweise erklärt
- Verwendet ein kleines Toy-Modell mit kleinem Vokabular und GRU-Basis, damit alles ohne API-Key auf der CPU vollständig ausführbar ist
-
Beispiel 2: Mit Codex mehrere Bugs in einem Notebook beheben
- Nutzer-Prompt: Überarbeite
churn_analysis.ipynb, das seit 2023 nicht mehr aktualisiert wurde, so dass es bis zum Ende sauber ausführbar ist; identifiziere, behebe und validiere jede fehlerhafte Zelle und füge oberhalb der geänderten Zellen eine Markdown-Notiz hinzu, was das Problem war und wie es behoben wurde - Vier von Codex behobene Bugs
- hartkodierter Dateipfad
DataFrame.append(), entfernt in pandas 2.0sklearn.cross_validation, entfernt in sklearn 0.20plot_confusion_matrix, entfernt in sklearn 1.2
- Nach den Korrekturen wurde verifiziert, dass das Notebook End-to-End korrekt läuft
- Nutzer-Prompt: Überarbeite
Einstieg
- Drei Installationswege: Installationsskript,
cargo install nb-cliund Build aus dem Quellcode (cargo build --release) - Das Build erzeugt das Binärprogramm unter
target/release/nb - Damit KI-Agenten für alle Notebook-Aufgaben nb verwenden, wird der Skill-Installationsbefehl
npx skills install jupyter-ai-contrib/nb-cliunterstützt
Entwickler und Mitwirkung
- Drei Mitwirkende am Jupyter-Projekt bei AWS sind an der Entwicklung beteiligt
- Andrii Ieroshenko: AWS Software Development Engineer, langjähriger Mitwirkender an JupyterLab und Jupyter AI, Mitglied der Jupyter Media Strategy Working Group
- Brian Granger: AWS Senior Principal Technologist, Mitgründer von Project Jupyter, Vorstandsmitglied bei Jupyter und der PyTorch Foundation
- Piyush Jain: AWS Principal Engineer, zuständig für Jupyter und Agentic AI, Mitglied im Jupyter Server Council
- nb-cli befindet sich in einer frühen Phase; nach Installation und Nutzung werden Beiträge über GitHub-Issues, Diskussionen in
jupyter-ai-contrib, Bug-Reports, Feature-Requests und PRs erbeten
1 Kommentare
Danke, dass Sie den Beitrag anhand von Beispielen aufgebaut haben — da gibt es vieles, woran ich mich orientieren kann!