Remote-Nutzung von Fabric – Integration in iOS- und iPadOS-Kurzbefehle

Das Titelbild zeigt eine stilisierte Darstellung einer modernen, vernetzten Welt mit verschiedenen technischen Geräten und Symbolen. Im Vordergrund sind ein Smartphone und ein Tablet zu sehen, die eine Verbindung zu einem kleinen Einplatinencomputer (wie einem Raspberry Pi) haben. Auf den Bildschirmen der Geräte sind Codezeilen und Diagramme dargestellt, die auf Programmierung und Datenanalyse hinweisen. Im Hintergrund sind Gebäude und Wolken abgebildet, was möglicherweise eine urbane Umgebung symbolisiert. Außerdem sind Symbole wie eine Uhr und eine Netzwerkverbindung zu sehen

Einleitung

Dies ist nun der drit­te Blogbeitrag zum Thema Fabric, einem prak­ti­schen Tool zur effi­zi­en­ten Nutzung von LLMs. Nachdem ich mich mit der grund­sätz­li­chen Benutzung und Installation sowie der Integration in Workflows unter macOS mit­hil­fe der Alfred App und Apple Kurzbefehlen beschäf­tigt habe, möch­te ich nun zei­gen, wie Fabric auf einem iPhone oder iPad in Kurzbefehlen inte­griert wer­den kann.

Da auf die­sen Geräten weder Go noch die Kurzbefehl-Aktion Shell-Skript aus­füh­ren ver­füg­bar ist, muss­te ich einen ande­ren Weg fin­den. Zum Glück gibt es jedoch die Aktion Skript über SSH aus­füh­ren, die es ermög­licht, eine Fabric-Installation auf einem ande­ren Computer aus­zu­füh­ren und die­se dann in einen Kurzbefehls zu inte­grie­ren.

Dazu muss die­ser Computer natür­lich jeder­zeit erreich­bar sein. Theoretisch könn­te das in mei­nem Fall auch mit dem MacBook funk­tio­nie­ren, aber wenn der Deckel geschlos­sen ist, kann es kei­ne Anfragen von mei­nem iPad bear­bei­ten. Daher wird ein Computer benö­tigt, der mehr oder weni­ger 24/7 erreich­bar ist.

Als Beispiel für die Remote-Verwendung von Fabric in iOS/iPadOS-Kurzbefehlen neh­me ich erneut das Erstellen einer Zusammenfassung einer Webseite, aus dem vor­he­ri­gen Artikel.

Den richtigen Server finden

Ich beschrän­ke mich hier auf mein loka­les Netzwerk. Wer die Möglichkeit hat, kann mit dem glei­chen Vorgehen auch einen Server in der Cloud anspre­chen, falls auf die­sem Go läuft, so kann der Kurzbefehl dann auch aus­ser­halb des hei­mi­schen Netzwerkes auf­ge­ru­fen wer­den.

In mei­nem Netzwerk habe ich zwei Computer, die 24/7 lau­fen: ein Synology NAS und einen Raspberry Pi 4 mit 4 GB RAM und instal­lier­tem Ubuntu 24.04 LTS. Da ich mich im Moment weder an das Cross-Compiling von Go-Programmen noch an die Erstellung von Docker-Images her­an­wa­ge, bleibt der Raspberry Pi der Computer der Wahl. Es könn­te jedoch jeder ande­re Computer sein, auf dem Go instal­liert ist und der als SSH-Server ein­ge­rich­tet wer­den kann. Da die LLMs – zumin­dest wie in mei­nem Fall – nur über einen API-Key auf OpenAI aus­ge­führt wer­den sol­len, reicht die Leistung eines Raspberry Pi sicher­lich aus. Wenn ein leis­tungs­fä­hi­ge­rer Computer zur Verfügung steht, auf dem auch Ollama per­for­mant läuft, kön­nen auch loka­le LLMs genutzt wer­den.

Voraussetzungen

Etwas Wissen im Umgang mit der Kommandozeile soll­te auf jeden Fall vor­han­den sein. Der aus­ge­wähl­te Computer muss natür­lich über SSH erreich­bar sein. Dazu gibt es zahl­rei­che Tutorials im Netz, zum Beispiel den Artikel von nixCraft.

Neben Go muss auf dem Computer vor allem git instal­liert sein. Wenn YouTube-Videos mit dem Tool yt und Fabric ana­ly­siert wer­den sol­len, wird auch ffmpeg benö­tigt. Nicht zwin­gend erfor­der­lich, aber für eines mei­ner 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 instal­liert ist, muss dies nach­ge­holt wer­den. Es gibt ver­schie­de­ne Möglichkeiten, dies zu tun, zum Beispiel über den Snap-Store. Ich habe mich an die Anleitung der offi­zi­el­len Go-Website gehal­ten:

  1. Stelle sicher, dass kei­ne alte Version unter /usr/local/go instal­liert ist. Falls das der Fall ist, löschen den Ordner: sudo rm -rf /usr/local/go.
  2. Lade die neus­te Version für den Raspberry, die  arm64 Version her­un­ter.
  3. 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 ent­packt wird.
  4. Die Pfadinformationen müs­sen in der Shell-Konfiguration defi­niert wer­den, abhän­gig von der ver­wen­de­ten Shell. In mei­nem Fall ist dies die Datei <code data-enlighter-language="bash" class="EnlighterJSRAW">$HOME/.zshrc. Für den Kurzbefehl nut­ze ich eine auf das Nötigste ein­ge­schränk­te Konfigurationsdatei .fabenv, in der eben­falls die Pfaddefinition hin­zu­ge­fügt wer­den muss::
    export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin
  5. Nun kann Fabric direkt aus dem Guthub Repository instal­liert wer­den:
    go install github.com/danielmiessler/fabric@latest.
  6. Bevor das Setup von Fabric mit fabric --setup folgt bit­te kurz das nächs­te Kapitel lesen.
  7. Nun noch yt instal­lie­ren, falls gewünscht und er Youtube API-Key wäh­rend des Setups ange­ge­ben wur­de: go install github.com/danielmiessler/yt@latest

Problem beim Fabric Setup

Zum Zeitpunkt die­ses Artikels ende­te das Setup mit einer Fehlermeldung: stream error: stream ID 3; CANCEL; received from peer happened, nach­dem die Angaben für das Kopieren der Pattern nur bestä­tigt wur­den. Es scheint jedoch, dass bis auf das Kopieren des Pattern-Ordners und das Erstellen der Ordner contexts und sessions alle not­wen­di­gen Einstellungen vor­ge­nom­men wur­den. Mit dem Kopieren des Pattern-Ordner von mei­ner macOS-Installation lief Fabric pro­blem­los. Vielleicht hat ja jemand eine Lösung für das Problem. Im Repository gibt es bereits eine zwei­te Meldung dazu, wobei eine schon als erle­digt mar­kiert wur­de. Weder auf mei­nem Mac noch auf einer ande­ren Installation unter Linux Mint trat der Fehler auf.

Update 23.09.2024: Nachdem ich den Raspi über ein Ethernetkabel ange­schlos­sen hat­te, könn­te ich Fabric wie­der instal­lie­ren. Es schei­nen irgend­wel­che Server aus­zu­stei­gen, wenn die Antwort über das Netz zu lang­sam sind.

Überprüfung der Installation

Alles Weitere wird aus­führ­lich in mei­nem Artikel Installation und ers­te Schritte mit Fabric – dem Prompt-Optimierer erklärt. Ein schnel­ler Test, am bes­ten über eine ssh-Verbindung, zeigt jedoch, ob alles funk­tio­niert. Zum Beispiel mit fol­gen­dem Aufruf:

echo "Zwei Papageien auf einem Hochhaus" | fabric --stream --pattern create_logo

Falls es nicht klappt, kon­trol­lie­re noch­mals, ob im Ordner $HOME/.config/fabric alle Ordner und Dateien vor­han­den 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 kor­rek­te Suchpfad defi­niert 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 mei­nem Blogbeitrag Webseiten ein­fach zusam­men­fas­sen mit Fabric in Alfred und Apple Kurzbefehlen geschil­dert habe, ver­hält sich die Aktion „Shell-Skript aus­füh­ren“ auf dem Mac komisch, wenn es um die Übergabe von Variablen bzw. dem Inhalt der Variablen geht. So über­gibt eine Variable, die inner­halb der „nor­ma­len“ Kurzbefehle die URL der akti­ven Webseite beinhal­tet, einen Pfad zu einer loka­len Kopie der Webseite. Nun, war­um soll­te es bei der Aktion „Skript über SSH aus­füh­ren“ anders sein?

Die URL übegeben

Zunächst habe ich auf dem Mac expe­ri­men­tiert, um eine Lösung für das Problem zu fin­den, dass die Übergabe eines Parameters als Argument bei der Aktion „Skript über SSH aus­füh­ren“ nicht klappt. Am Ende fand ich jedoch den Hinweis, dass es hel­fen könn­te, die URL nicht als Argument an die Aktion zu über­ge­ben, son­dern sie direkt in das Skript ein­zu­fü­gen. Und sie­he da, es funk­tio­nier­te. Alternativ könn­te man auch das gesam­te Skript zunächst in einer Textbox erstel­len und dann nur die­se als Variable in den Skript-Bereich ein­fü­gen.

Hier nun ein Test-Kurzbefehl auf dem Mac, der über das Kurzbefehl-Menü auf einer akti­ven Webseite auf­ge­ru­fen wer­den muss:

Ein Screenshot der Kurzbefehl-App auf einem Mac zeigt einen Kurzbefehl zur Ausführung eines Skripts über SSH, um eine URL zu verarbeiten und das Ergebnis anzuzeigen. detaillierte Beschreibung im Text

Dies funk­tio­niert sehr gut und kann den Workaround in mei­nem vor­he­ri­gen Blogbeitrag erset­zen.

Die Vorstellung, damit auch eine Lösung für den Kurzbefehl auf iOS/iPad gefun­den zu haben, war jedoch weit gefehlt. Auch hier muss­te ich wie­der lan­ge expe­ri­men­tie­ren, bis ich schließ­lich fol­gen­de Skript-Lösung fand:

Zeigt die Lösung in der Skript-Box von der Aktion "Skript über SSH ausführen":
source ~/.fabenv 
output=$(wget -q0- URL )
echo $output | fabric -sp summarize

Ich habe zwar nicht ver­stan­den, war­um die­ses Konstrukt so funk­tio­niert, vor allem weil das Kommando, wenn es im Terminal direkt auf­ge­ru­fen wird (auch über eine SSH-Verbindung), durch­aus das gewünsch­te Ergebnis brach­te.

Trotzdem woll­te ich dies noch ein­mal mit curl, der moder­ne­ren Alternative zu wget, pro­bie­ren. Und sie­he da, mit curl brauch­te man kei­ne extra Variable defi­nie­ren:

Zeigt die Lösung in der Skript-Box von der Aktion "Skript über SSH ausführen":
source ~/.fabenv
curl URL | fabric -sp summarize

Meine jahr­zehn­te­al­te Präferenz für wget, wer­de ich wohl nun auf­ge­ben müs­sen.

Um der Vollständigkeit wil­len, hier ist ein wei­te­rer Ansatz. Während mei­ner Experimente mach­te ich einen klei­nen Tippfehler, der zum fol­gen­den Skript führ­te, das über­ra­schen­der­wei­se eben­falls funk­tio­nier­te:

Zeigt die Lösung in der Skript-Box von der Aktion "Skript über SSH ausführen":
source ~/.fabenv
echo URL | fabric -sp summarize

Mittlerweile ver­mu­te ich, dass die Variable URL eher ein Array ist, aus dem je nach Kontext der pas­sen­de Teil über­ge­ben wird. Denn wenn man die Variable im Skript mit echo aus­gibt, erscheint tat­säch­lich nur die URL.

Der iOS/iPasOS Kurzbefehl

Folgendes Bild zeigt nun den voll­stän­di­gen Kurzbefehl

Ein Screenshot der iOS-Kurzbefehle-App zeigt einen Workflow zur Zusammenfassung von Webseiteninhalten mithilfe eines SSH-Skripts und der Speicherung der Ergebnisse in Obsidian Notes.

Der Arbeitsablauf ist der­sel­be wie im macOS-Kurzbefehl:

  1. Verwende Bildschirm empfangen, um in allen Webbrowsern zu funk­tio­nie­ren.
  2. Weise die URL der akti­ven Webseite der Variable URL zu.
  3. Weise den Titel der Variable name zu.
  4. Lösche : und / in der Variable name, da die­se Zeichen Probleme in Obsidian als Titel und als Dateinamen ver­ur­sa­chen (dies könn­te um ande­re Zeichen wie ? erwei­tert wer­den).
  5. Verwende Skript über SSH ausführen mit der IP-Adresse oder dem Namen des Servers, dem Benutzer und Passwort sowie dem oben bespro­che­nen Skript.
  6. Lege das Ergebnis in der Variable summary ab.
  7. Erstelle die Notiz für Obsidian in einem Textfeld, ein­schließ­lich des Properties-Bereiches und, falls erfor­der­lich, eines Footers.
  8. Speichere die­se Notiz mit der Aktion „Create Note“ von ActionForObsidian (AFO) ab.
  9. Verwende AFO, um die neu erstell­te Notiz zu öff­nen.

Ich nut­ze die Kurzbefehlerweiterung ActionForObsidian, um die Notiz in mei­nem Obsidian Vault zu spei­chern, da dies mit den zu Verfügung ste­hen­den Befehlen sehr ein­fach geht. Es lohnt sich auf alle Fälle in die­se App etwas Geld zu inves­tie­ren, da sie die Lücker der man­gel­den Kurzbefehlfähigkeit von Obsidian schliesst. Alternativ kann man natür­lich auch mit der Datei sichernAktion arbei­ten oder das Ergebnis in der Notiz-App spei­chern.

Fazit

Ich hof­fe, dass die­ser Beitrag hilf­reich ist, trotz der klei­nen Unzulänglichkeiten im Fabric-Setup. Vielleicht gibt es ja jeman­den, der einen Tipp geben kann, wie man die­sen Fehler umge­hen kann. Auch wür­de ich ger­ne ver­ste­hen, was die Kurzbefehle-App mit den Variablen anstellt.

Ich woll­te an die­ser Stelle nur eine Möglichkeit auf­zei­gen, wie Fabric trotz feh­len­der Shell auf dem iPhone oder iPad in einen Kurzbefehl inte­griert wer­den kann. Ich den­ke, die­ser Ansatz bie­tet am Ende ein Universum an Möglichkeiten. Alles, was auf dem Remote-Computer läuft und mit Text auf der Kommandozeile arbei­tet, kann poten­zi­ell in so einen Workflow ein­ge­baut wer­den und Daten vom iPhone oder iPad kon­su­mie­ren und wei­ter­ver­ar­bei­ten.

Wie immer Kritik, Lob, Ideen und was auch immer, ger­ne in die Kommentare schrei­ben.
Es gibt auch eine etwas kür­ze­re eng­li­sche Version die­ses Artikels: Creating a Shortcut that Uses Fabric Remotely

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert