Diensterkennung

3.1 Erkennungsmethoden

Ein Client erkennt einen Dienst, indem er diese Methoden der Reihe nach versucht:

  1. Manuelle Konfiguration. Der Nutzer gibt die Adresse des Dienstes direkt ein.
  2. Prüfen üblicher lokaler Adressen. Der Client ruft /.well-known/lmsp.json von Kandidatenadressen ab. Die üblichen Kandidaten sind http://127.0.0.1:17832 und http://[::1]:17832.
  3. LAN-Erkennung. Der Client sucht mit mDNS und DNS-SD nach _lmsp._tcp.local..

Eine Methode ist erfolgreich, wenn sie eine gültige Dienstbeschreibung liefert (Abschnitt 3.3). Eine vom Nutzer manuell eingegebene Adresse hat immer Vorrang vor gefundenen.

3.2 LAN-Ankündigung

DNS-SD nutzt PTR-Einträge, um Dienstinstanzen zu finden, SRV-Einträge, um Host und Port zu erhalten, und TXT-Einträge, um eine kleine Menge zusätzlicher Informationen zu transportieren. Zusammen mit mDNS ermöglicht es die konfigurationsfreie Erkennung in einem lokalen Netzwerk (RFC 6763, RFC 6762).

Ein Beispiel für eine Ankündigung:

Service type:   _lmsp._tcp.local.
Instance name:  Workstation LMSP._lmsp._tcp.local.

TXT record:
  v=1
  id=svc_01J8M4Y8K6M5E6K6Z7Z0Y8W3M2
  path=/
  auth=pairing
TXT-Schlüssel Bedeutung
v Version des Ankündigungsformats. 1 für LMSP 1.0.
id Die Dienst-ID, gleich service.id in der Dienstbeschreibung.
path URL-Pfad der Dienstwurzel. Clients rufen {path}.well-known/lmsp.json ab.
auth Hinweis zur Authentifizierung. pairing bedeutet, dass sich ein Client koppeln muss, bevor er den Dienst nutzt.

Regeln:

  • Ein Dienst DARF NICHT Zugriffstokens, Modelllisten, Dateipfade oder andere sensible Informationen in den TXT-Eintrag schreiben. Der Eintrag lokalisiert den Dienst nur. Die tatsächlichen Fähigkeiten MÜSSEN aus der Dienstbeschreibung gelesen werden.
  • Ein Dienst MUSS die mDNS-Ankündigung standardmäßig deaktiviert lassen. Sie wird nur aktiviert, wenn der Nutzer die LAN-Erkennung ausdrücklich einschaltet. Ein Dienst, der nur auf dem lokalen Rechner genutzt wird, kündigt sich nicht an.
  • Ein Dienst, der sich im LAN ankündigt, muss über Loopback hinaus lauschen, was nur im LAN-Modus erlaubt ist (Abschnitt 10.5).
  • Ein Client MUSS den TXT-Eintrag als ungeprüften Hinweis behandeln und den Dienst bestätigen, indem er seine Beschreibung liest.

3.3 Dienstbeschreibung

GET /.well-known/lmsp.json

Ein Dienst MUSS dieses Dokument als application/json ausliefern, ohne eine Authentifizierung zu verlangen.

{
  "protocol": "lmsp",
  "versions": ["1.0"],
  "service": {
    "id": "svc_01J8M4Y8K6M5E6K6Z7Z0Y8W3M2",
    "name": "Workstation Local Models",
    "version": "1.0.0"
  },
  "interfaces": [
    {
      "kind": "lmsp",
      "version": "1.0",
      "url": "http://127.0.0.1:17832/lmsp/v1",
      "transport": "http+json"
    },
    {
      "kind": "openai",
      "version": "responses+chat",
      "url": "http://127.0.0.1:17832/v1",
      "transport": "http+json"
    }
  ],
  "capabilities": {
    "streaming": true,
    "tasks": true,
    "event_resume": true,
    "conversations": true,
    "model_management": true
  },
  "authentication": {
    "type": "bearer",
    "pairing_url": "http://127.0.0.1:17832/lmsp/v1/pair"
  },
  "openapi": "http://127.0.0.1:17832/lmsp/v1/openapi.json"
}
Feld Bedeutung
protocol Immer "lmsp".
versions Die vom Dienst unterstützten LMSP-Versionen als major.minor-Zeichenfolgen.
service id ist eine stabile Dienstkennung, name ein Anzeigename und version die Version der Dienstsoftware.
interfaces Die angebotenen Schnittstellen. Jede hat ein kind (lmsp, openai oder ollama), eine version, eine Basis-url und einen transport. Bei openai nennt version die bereitgestellten API-Familien, etwa responses+chat.
capabilities Boolesche Funktionsschalter, unten aufgeführt.
authentication type ist bearer. pairing_url ist die Adresse, unter der Clients einen Kopplungscode gegen ein Token eintauschen (Abschnitt 10.2).
openapi URL des OpenAPI-Dokuments, das die LMSP-Schnittstelle beschreibt.

Capability-Schalter:

Schalter Bedeutung
streaming Antworten können als Server-Sent Events gestreamt werden. MUSS in 1.0 true sein.
tasks Asynchrone Aufgaben sind verfügbar. MUSS in 1.0 true sein.
event_resume Ereignisströme von Aufgaben können abonniert und fortgesetzt werden (GET /lmsp/v1/tasks/{task_id}/events).
conversations Der Dienst speichert Antworten, sodass store und previous_response_id funktionieren und GET /lmsp/v1/responses/{response_id} verfügbar ist.
model_management Modelle können explizit geladen und entladen werden.

3.4 Verhalten des Clients

Ein Client:

  • SOLLTE die höchste Version aus versions wählen, die er ebenfalls unterstützt.
  • SOLLTE aus interfaces die LMSP- oder die OpenAI-Schnittstelle wählen, je nachdem, was er sprechen kann.
  • MUSS nur die Fähigkeiten verwenden, die die Beschreibung deklariert. Ein fehlender Schalter bedeutet false.
  • MUSS Erweiterungsfelder ignorieren, die er nicht kennt.
  • SOLLTE die Dienstbeschreibung regelmäßig und bei einer fehlgeschlagenen Anfrage erneut lesen, statt sie ewig zwischenzuspeichern.
  • SOLLTE sich einen gewählten Dienst anhand von service.id merken und nicht anhand seiner Adresse, weil sich Adressen ändern können.