Einleitung
Dies ist nun der dritte Blogbeitrag zum Thema Fabric, einem praktischen Tool zur effizienten Nutzung von LLMs. Nachdem ich mich mit der grundsätzlichen Benutzung und Installation sowie der Integration in Workflows unter macOS mithilfe der Alfred App und Apple Kurzbefehlen beschäftigt habe, möchte ich nun zeigen, wie Fabric auf einem iPhone oder iPad in Kurzbefehlen integriert werden kann.
Da auf diesen Geräten weder Go noch die Kurzbefehl-Aktion Shell-Skript ausführen verfügbar ist, musste ich einen anderen Weg finden. Zum Glück gibt es jedoch die Aktion Skript über SSH ausführen, die es ermöglicht, eine Fabric-Installation auf einem anderen Computer auszuführen und diese dann in einen Kurzbefehls zu integrieren.
Dazu muss dieser Computer natürlich jederzeit erreichbar sein. Theoretisch könnte das in meinem Fall auch mit dem MacBook funktionieren, aber wenn der Deckel geschlossen ist, kann es keine Anfragen von meinem iPad bearbeiten. Daher wird ein Computer benötigt, der mehr oder weniger 24/7 erreichbar ist.
Als Beispiel für die Remote-Verwendung von Fabric in iOS/iPadOS-Kurzbefehlen nehme ich erneut das Erstellen einer Zusammenfassung einer Webseite, aus dem vorherigen Artikel.
Den richtigen Server finden
Ich beschränke mich hier auf mein lokales Netzwerk. Wer die Möglichkeit hat, kann mit dem gleichen Vorgehen auch einen Server in der Cloud ansprechen, falls auf diesem Go läuft, so kann der Kurzbefehl dann auch ausserhalb des heimischen Netzwerkes aufgerufen werden.
In meinem Netzwerk habe ich zwei Computer, die 24/7 laufen: ein Synology NAS und einen Raspberry Pi 4 mit 4 GB RAM und installiertem Ubuntu 24.04 LTS. Da ich mich im Moment weder an das Cross-Compiling von Go-Programmen noch an die Erstellung von Docker-Images heranwage, bleibt der Raspberry Pi der Computer der Wahl. Es könnte jedoch jeder andere Computer sein, auf dem Go installiert ist und der als SSH-Server eingerichtet werden kann. Da die LLMs – zumindest wie in meinem Fall – nur über einen API-Key auf OpenAI ausgeführt werden sollen, reicht die Leistung eines Raspberry Pi sicherlich aus. Wenn ein leistungsfähigerer Computer zur Verfügung steht, auf dem auch Ollama performant läuft, können auch lokale LLMs genutzt werden.
Voraussetzungen
Etwas Wissen im Umgang mit der Kommandozeile sollte auf jeden Fall vorhanden sein. Der ausgewählte Computer muss natürlich über SSH erreichbar sein. Dazu gibt es zahlreiche Tutorials im Netz, zum Beispiel den Artikel von nixCraft.
Neben Go muss auf dem Computer vor allem git installiert sein. Wenn YouTube-Videos mit dem Tool yt und Fabric analysiert werden sollen, wird auch ffmpeg benötigt. Nicht zwingend erforderlich, aber für eines meiner Experimente genutzt, ist wget.
Die Installation unter Ubuntu erfolgt über apt
:
sudo apt install git ffmpeg wget
Installation von Go und Fabric
Falls Go noch nicht installiert ist, muss dies nachgeholt werden. Es gibt verschiedene Möglichkeiten, dies zu tun, zum Beispiel über den Snap-Store. Ich habe mich an die Anleitung der offiziellen Go-Website gehalten:
- Stelle sicher, dass keine alte Version unter
/usr/local/go
installiert ist. Falls das der Fall ist, löschen den Ordner:sudo rm -rf /usr/local/go
. - Lade die neuste Version für den Raspberry, die arm64 Version herunter.
- Installiere Go in dem das Archiv mit dem Befehl
tar -C /usr/local -xzf $HOME/Downloads/go1.23.0.linux-amd64.tar.gz
in dem Verzeichnis/usr/local/go
entpackt wird. - Die Pfadinformationen müssen in der Shell-Konfiguration definiert werden, abhängig von der verwendeten Shell. In meinem Fall ist dies die Datei
<code data-enlighter-language="bash" class="EnlighterJSRAW">$HOME/.zshrc
. Für den Kurzbefehl nutze ich eine auf das Nötigste eingeschränkte Konfigurationsdatei.fabenv
, in der ebenfalls die Pfaddefinition hinzugefügt werden muss::export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin
- Nun kann Fabric direkt aus dem Guthub Repository installiert werden:
go install github.com/danielmiessler/fabric@latest
. - Bevor das Setup von Fabric mit
fabric --setup
folgt bitte kurz das nächste Kapitel lesen. - Nun noch
yt
installieren, falls gewünscht und er Youtube API-Key während des Setups angegeben wurde:go install github.com/danielmiessler/yt@latest
Problem beim Fabric Setup
Zum Zeitpunkt dieses Artikels endete das Setup mit einer Fehlermeldung: stream error: stream ID 3; CANCEL; received from peer happened
, nachdem die Angaben für das Kopieren der Pattern nur bestätigt wurden. Es scheint jedoch, dass bis auf das Kopieren des Pattern-Ordners und das Erstellen der Ordner contexts
und sessions
alle notwendigen Einstellungen vorgenommen wurden. Mit dem Kopieren des Pattern-Ordner von meiner macOS-Installation lief Fabric problemlos. Vielleicht hat ja jemand eine Lösung für das Problem. Im Repository gibt es bereits eine zweite Meldung dazu, wobei eine schon als erledigt markiert wurde. Weder auf meinem Mac noch auf einer anderen Installation unter Linux Mint trat der Fehler auf.
Update 23.09.2024: Nachdem ich den Raspi über ein Ethernetkabel angeschlossen hatte, könnte ich Fabric wieder installieren. Es scheinen irgendwelche Server auszusteigen, wenn die Antwort über das Netz zu langsam sind.
Überprüfung der Installation
Alles Weitere wird ausführlich in meinem Artikel Installation und erste Schritte mit Fabric – dem Prompt-Optimierer erklärt. Ein schneller Test, am besten über eine ssh
-Verbindung, zeigt jedoch, ob alles funktioniert. Zum Beispiel mit folgendem Aufruf:
echo "Zwei Papageien auf einem Hochhaus" | fabric --stream --pattern create_logo
Falls es nicht klappt, kontrolliere nochmals, ob im Ordner $HOME/.config/fabric
alle Ordner und Dateien vorhanden sind:
.rw-r--r-- 320 leifjp 27 Aug 01:00 .env drwxr-xr-t - leifjp 24 Aug 14:00 contexts drwxr-xr-t - leifjp 20 Aug 10:30 patterns drwxr-xr-t - leifjp 18 Aug 17:23 sessions
und ob in der Shell-Konfigurationsdatei der korrekte Suchpfad definiert ist:
export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin
Das Rätsel um die “Skript über SSH ausführen” Aktion
Wie ich schon in meinem Blogbeitrag Webseiten einfach zusammenfassen mit Fabric in Alfred und Apple Kurzbefehlen geschildert habe, verhält sich die Aktion „Shell-Skript ausführen“ auf dem Mac komisch, wenn es um die Übergabe von Variablen bzw. dem Inhalt der Variablen geht. So übergibt eine Variable, die innerhalb der „normalen“ Kurzbefehle die URL der aktiven Webseite beinhaltet, einen Pfad zu einer lokalen Kopie der Webseite. Nun, warum sollte es bei der Aktion „Skript über SSH ausführen“ anders sein?
Die URL übegeben
Zunächst habe ich auf dem Mac experimentiert, um eine Lösung für das Problem zu finden, dass die Übergabe eines Parameters als Argument bei der Aktion „Skript über SSH ausführen“ nicht klappt. Am Ende fand ich jedoch den Hinweis, dass es helfen könnte, die URL nicht als Argument an die Aktion zu übergeben, sondern sie direkt in das Skript einzufügen. Und siehe da, es funktionierte. Alternativ könnte man auch das gesamte Skript zunächst in einer Textbox erstellen und dann nur diese als Variable in den Skript-Bereich einfügen.
Hier nun ein Test-Kurzbefehl auf dem Mac, der über das Kurzbefehl-Menü auf einer aktiven Webseite aufgerufen werden muss:
Dies funktioniert sehr gut und kann den Workaround in meinem vorherigen Blogbeitrag ersetzen.
Die Vorstellung, damit auch eine Lösung für den Kurzbefehl auf iOS/iPad gefunden zu haben, war jedoch weit gefehlt. Auch hier musste ich wieder lange experimentieren, bis ich schließlich folgende Skript-Lösung fand:
Ich habe zwar nicht verstanden, warum dieses Konstrukt so funktioniert, vor allem weil das Kommando, wenn es im Terminal direkt aufgerufen wird (auch über eine SSH-Verbindung), durchaus das gewünschte Ergebnis brachte.
Trotzdem wollte ich dies noch einmal mit curl
, der moderneren Alternative zu wget
, probieren. Und siehe da, mit curl
brauchte man keine extra Variable definieren:
Meine jahrzehntealte Präferenz für wget
, werde ich wohl nun aufgeben müssen.
Um der Vollständigkeit willen, hier ist ein weiterer Ansatz. Während meiner Experimente machte ich einen kleinen Tippfehler, der zum folgenden Skript führte, das überraschenderweise ebenfalls funktionierte:
Mittlerweile vermute ich, dass die Variable URL
eher ein Array ist, aus dem je nach Kontext der passende Teil übergeben wird. Denn wenn man die Variable im Skript mit echo
ausgibt, erscheint tatsächlich nur die URL.
Der iOS/iPasOS Kurzbefehl
Folgendes Bild zeigt nun den vollständigen Kurzbefehl
Der Arbeitsablauf ist derselbe wie im macOS-Kurzbefehl:
- Verwende
Bildschirm empfangen
, um in allen Webbrowsern zu funktionieren. - Weise die URL der aktiven Webseite der Variable
URL
zu. - Weise den Titel der Variable
name
zu. - Lösche
:
und/
in der Variablename
, da diese Zeichen Probleme in Obsidian als Titel und als Dateinamen verursachen (dies könnte um andere Zeichen wie?
erweitert werden). - Verwende
Skript über SSH ausführen
mit der IP-Adresse oder dem Namen des Servers, dem Benutzer und Passwort sowie dem oben besprochenen Skript. - Lege das Ergebnis in der Variable
summary
ab. - Erstelle die Notiz für Obsidian in einem Textfeld, einschließlich des Properties-Bereiches und, falls erforderlich, eines Footers.
- Speichere diese Notiz mit der Aktion „Create Note“ von ActionForObsidian (AFO) ab.
- Verwende AFO, um die neu erstellte Notiz zu öffnen.
Ich nutze die Kurzbefehlerweiterung ActionForObsidian, um die Notiz in meinem Obsidian Vault zu speichern, da dies mit den zu Verfügung stehenden Befehlen sehr einfach geht. Es lohnt sich auf alle Fälle in diese App etwas Geld zu investieren, da sie die Lücker der mangelden Kurzbefehlfähigkeit von Obsidian schliesst. Alternativ kann man natürlich auch mit der Datei sichern
Aktion arbeiten oder das Ergebnis in der Notiz-App speichern.
Fazit
Ich hoffe, dass dieser Beitrag hilfreich ist, trotz der kleinen Unzulänglichkeiten im Fabric-Setup. Vielleicht gibt es ja jemanden, der einen Tipp geben kann, wie man diesen Fehler umgehen kann. Auch würde ich gerne verstehen, was die Kurzbefehle-App mit den Variablen anstellt.
Ich wollte an dieser Stelle nur eine Möglichkeit aufzeigen, wie Fabric trotz fehlender Shell auf dem iPhone oder iPad in einen Kurzbefehl integriert werden kann. Ich denke, dieser Ansatz bietet am Ende ein Universum an Möglichkeiten. Alles, was auf dem Remote-Computer läuft und mit Text auf der Kommandozeile arbeitet, kann potenziell in so einen Workflow eingebaut werden und Daten vom iPhone oder iPad konsumieren und weiterverarbeiten.
Wie immer Kritik, Lob, Ideen und was auch immer, gerne in die Kommentare schreiben.
Es gibt auch eine etwas kürzere englische Version dieses Artikels: Creating a Shortcut that Uses Fabric Remotely
Schreibe einen Kommentar