Lokales Plugin mit LM Studio

Lokales Plugin mit LM Studio

LM Studio erlaubt die Integration von Plugins/Tool, um die Fertigkeiten eines Modells zu erweitern. In den öffentlichen Quellen ist nur rudimentäres Wissen hierzu zu finden. Hier meine Erkenntnisse und Lösungen.

Voraussetzungen

Neben "LM Studio" werden auf dem System "Node.js" und "npm" benötigt. Natürlich sollte auch ein Sprachmodell geladen werden, welches Plugins/Tools verwenden kann. Aber das ist ja selbstverständlich in diesem Szenario.

Plugins können von der lmstudio.ai Seite heruntergeladen werden, wenn man weiß, welchen LM Studio Hub Account man ansprechen kann, z.B. https://lmstudio.ai/lmstudio.

Die Plugins werden im Arbeitsverzeichnis von LM Studio im Unterpfad /extensions/plugins/ nach Herausgebername (Owner/Vendor) und Plugin-Name gespeichert.

Grundlegend braucht es nicht viel für ein einfaches Plugin.

/manifest.json
/package.json
/src/index.ts
/src/toolsProvider.ts

Damit kann es auch schon los gehen. Ein einfaches Code-Beispiel bietet die LM Studio Dokumentation zum Thema Plugins / Tools Provider / Single Tool.

Plugin nutzbar machen

Sind die Programmierarbeiten am Quellcode abgeschlossen, möchte das Plugin zur normalen Laufzeit von LM Studio verwendet werden. Dies ist besonders dann wichtig, wenn ein Sprachmodell über die REST API angesprochen werden soll.

Nach dem Ausführen von lms dev (im Plugin-Ordner) wird das Plugin für LM Studio "kompiliert". Es werden intern Befehle wie npm install und andere ausgeführt. Das fertige Plugin liegt dann im Unterordner /.lmstudio/ bereit.

Für mich war mein erstes Dummy-Plugin nur im "DEV"-Kontext nutzbar und stand außerhalb der LM Studio internen Chats nicht zur Verfügung. Also habe ich mich gefragt: Was unterscheidet die über das LM Studio Hub installierten Plugins von meinem?

Unterschiede erkennen

Im Ordner /.lmstudio/ befindet sich eine dev.js, keine production.js, wie bei den "echten" Plugins.

Ein "echtes" Plugin verfügt auch über einen Installations-Status, der in der /install-state.json-Datei dokumentiert ist. Diese hatte mein Dummy-Plugin auch nicht. Am Ende ist es nur ein JSON-Objekt mit der Quellenangabe und dem Zeitstempel der Installation:

{"by":"node-plugin-installer-v1","at":12345678}

Also habe ich im Ordner /.lmstudio/ die Datei dev.js in production.js umbenannt und eine /install-state.json mit passendem Zeitstempel in der Wurzel des Plugin-Ordners angelegt. Nach dem Neustart von LM Studio stand mein Dummy-Plugin dann zur normalen Laufzeit zur Verfügung. Perfekt! 🚀

Helferlein

Für die Kopier- und Einfüge-Arbeiten habe ich ein kleines Skript (/scripts/install.sh) erstellt, welches mittels npm run install-Kommando ausgeführt werden kann :

#!/usr/bin/env bash
if [ ! -f ./.lmstudio/dev.js ]; then
    echo "File './.lmstudio/dev.js' not found!"
    echo "Please run \"lms dev\" to create the file."
    echo 
    exit
fi
cp ./.lmstudio/dev.js ./.lmstudio/production.js
TIMESTAMP=$(date +%s) 
TEMPLATE='{"by":"node-plugin-installer-v1","at":PLACEHOLDER}'
RESULT=${TEMPLATE/PLACEHOLDER/$TIMESTAMP}
echo $RESULT > install-state.json

In der /package.json wird darauf als "scripts": {"install" :"scripts/install.sh"} verwiesen.