Diensterkennung
- Normativ
- Entwurf 1.0
- Aktualisiert
- Als Markdown anzeigen
3.1 Erkennungsmethoden
Ein Client erkennt einen Dienst, indem er diese Methoden der Reihe nach versucht:
- Manuelle Konfiguration. Der Nutzer gibt die Adresse des Dienstes direkt ein.
- Prüfen üblicher lokaler Adressen. Der Client ruft
/.well-known/lmsp.jsonvon Kandidatenadressen ab. Die üblichen Kandidaten sindhttp://127.0.0.1:17832undhttp://[::1]:17832. - 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
versionswählen, die er ebenfalls unterstützt. - SOLLTE aus
interfacesdie 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.idmerken und nicht anhand seiner Adresse, weil sich Adressen ändern können.