Lokale API
Was die lokale API tut
Audio Forge enthält einen kleinen, integrierten Server, der auf Ihrem Computer läuft. Er ermöglicht externen Tools, wie z. B. einem Elgato Stream Deck-Plugin, einem benutzerdefinierten Skript oder einer beliebigen App auf Ihrem PC, die Wiedergabe über HTTP oder WebSocket zu steuern, ohne dass zusätzliche Software erforderlich ist.
Wenn Sie bereits die MQTT-Integration verwenden, unterstützt die lokale API die gleichen Befehle. Der Unterschied besteht darin, dass sie vollständig auf Ihrem Computer ohne zusätzliche Einrichtung läuft: kein Broker muss installiert werden, kein Netzwerk muss konfiguriert werden.
Aktivieren der lokalen API
Gehen Sie zu Einstellungen → Externe Steuerung → Lokale API und stellen Sie sicher, dass die Funktion aktiviert ist (standardmäßig ist sie aktiviert).
Sie können konfigurieren:
- Aktiviert-Umschalter (Standard: aktiviert).
- Port-Nummer (Standard: 8329).
- Auf LAN hören-Umschalter (Standard: deaktiviert). Wenn aktiviert, können Geräte im lokalen Netzwerk auf die API zugreifen. Wenn deaktiviert, kann nur Software auf demselben Computer eine Verbindung herstellen.
- API-Schlüssel (automatisch generiert). Erforderlich, wenn eine Verbindung von einem anderen Gerät im Netzwerk hergestellt wird. Sie können ihn in den Einstellungen kopieren oder regenerieren.
Sobald die API aktiviert ist, lauscht Audio Forge auf http://localhost:8329. Wenn “Auf LAN hören” aktiviert ist, lauscht sie stattdessen auf allen Netzwerkschnittstellen.
Schnellstart
Öffnen Sie ein Terminal und versuchen Sie:
# See what's playing right now
curl http://localhost:8329/api/state
# List every library and category
curl http://localhost:8329/api/catalog
# List one-shot Echo sounds that are playing now
curl http://localhost:8329/api/echoes/active
# Play a category
curl -X POST http://localhost:8329/api/command ^
-H "Content-Type: application/json" ^
-d "{\"command\":\"play\",\"section\":\"Music\",\"categoryName\":\"Battle\"}"
Das ist alles, wenn Audio Forge mit der lokalen API aktiviert läuft, erhalten Sie sofort JSON-Antworten.
HTTP-Endpunkte
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/state | Aktueller Wiedergabezustand |
| GET | /api/catalog | Vollständiger Bibliotheks- und Kategoriekatalog |
| GET | /api/icon/{categoryUuid} | Rendern eines Kategorie-Symbols als Bilddaten |
| GET | /api/echoes/active | Aktuell abgespielte One-Shot Echo-Sounds |
| GET | /api/info | API-Version und verfügbare Funktionen (siehe Detecting features) |
| GET | /api/ai_director/status | KI-Director Status (siehe KI-Director) |
| POST | /api/command | Ausführen eines Befehls (JSON-Body) |
GET /api/state
Gibt einen JSON-Schnappschuss dessen zurück, was Audio Forge im Moment tut:
{
"libraryUuid": "...",
"libraryName": "[Default]",
"musicPlaying": true,
"ambiancePlaying": false,
"musicVolume": 0.75,
"ambianceVolume": 0.5,
"echoesVolume": 1.0,
"musicCategories": [{"uuid": "...", "name": "Battle"}],
"ambianceCategories": [{"uuid": "...", "name": "Rain"}],
"lastEcho": {"uuid": "...", "name": "Thunder", "at": "2025-06-01T12:34:56Z"},
"categoryVolume": {"<uuid>": 0.5}
}
Alle Lautstärke-Felder verwenden die Anzeigeskala der App von 0.0 bis 1.0.
Für Musik und Ambiente ist 0.5 die normale (Einheits-)Lautstärke und 1.0 die
maximale, verstärkte Lautstärke. Für Echoes ist 1.0 die normale Lautstärke.
categoryVolume enthält aktuelle Laufzeitwerte und kann spärlich sein. Verwenden Sie das volume-Feld für jede
Kategorie aus /api/catalog, wenn Sie einen vollständigen Wert für jede Kategorie benötigen, auch für Kategorien, die noch nicht verwendet wurden.
GET /api/catalog
Gibt jede Bibliothek mit ihren Musik- und Ambient-Kategorien zurück:
{
"activeLibraryUuid": "...",
"libraries": [
{
"uuid": "...",
"name": "[Default]",
"music": [{
"uuid": "...",
"name": "Battle",
"enabledInForge": true,
"trackCount": 3,
"volume": 0.5
}],
"ambiance": [{
"uuid": "...",
"name": "Rain",
"enabledInForge": false,
"trackCount": 0,
"volume": 0.5
}]
}
]
}
enabledInForgegibt an, ob die Kategorie in Forge sichtbar und aktiviert ist.trackCountist die Anzahl der aktuell installierten, abspielbaren Tracks für diese Kategorie.volumeist die effektive Lautstärke der Kategorie auf der0.0bis1.0-Skala. Sie ist für jede Kategorie vorhanden, auch für inaktive Kategorien.
Für eine aktive Kategorie meldet das Verzeichnis die aktuelle Laufzeitlautstärke. Für eine
inaktive Kategorie wird die konfigurierte Ziellautstärke gemeldet, oder 0.5, wenn kein
Ziel existiert. Laufzeit-Anpassungen ersetzen nicht die konfigurierte Ziellautstärke.
Wenn eine Kategorie erneut gestartet wird, wird ein expliziter Befehlswert verwendet, falls vorhanden;
andernfalls wird die konfigurierte Ziellautstärke verwendet. Die vorherige Laufzeit-Anpassung
wird nicht wiederverwendet. Das Wiederherstellen eines State Links wendet die im State Link
aufgezeichneten Laufzeitlautstärken an.
GET /api/echoes/active
Gibt einen Stichproben-Schnappschuss aller aktuell abgespielten One-Shot-Echo-Sounds zurück. Gleichzeitige Auslösungen werden als separate Einträge zurückgegeben, auch wenn sie dieselbe Kategorie oder die gleiche Sounddatei verwenden.
{
"count": 1,
"sampledAt": "2026-07-24T12:00:02.500Z",
"echoes": [
{
"playbackId": "7b304347-410f-4eaf-bad7-4e8488778302",
"categoryUuid": "2e4d51f1-11ce-46af-a411-0c6bc2c420cb",
"categoryName": "Thunder",
"fileName": "thunder-01.wav",
"startedAt": "2026-07-24T12:00:00.000Z",
"durationMs": 10000,
"positionMs": 2500,
"remainingMs": 7500,
"progress": 0.25,
"progressPercent": 25.0,
"playing": true,
"processingState": "ready"
}
]
}
playbackIdidentifiziert diese spezifische Auslösung eindeutig. Zwei überlappende Wiedergaben derselben Kategorie erhalten unterschiedliche IDs.sampledAtist der Zeitpunkt, zu dem Audio Forge den Schnappschuss erstellt hat. Positionswerte werden nicht kontinuierlich gestreamt, daher sollten Clients bei Bedarf einen neuen Schnappschuss anfordern.durationMs,remainingMs,progressundprogressPercentsindnull, wenn die Dauer des Sounds nicht verfügbar ist.progressverwendet eine0.0bis1.0-Skala.progressPercentverwendet0.0bis100.0.fileNameenthält nur den Dateinamen, niemals einen lokalen Dateisystempfad.- Beendete oder gestoppte Echo-Sounds werden aus der Liste entfernt.
Echoes teilen sich den globalen echoesVolume-Wert, der von /api/state zurückgegeben wird.
Es gibt keine Echo-Lautstärke pro Wiedergabe oder pro Kategorie.
POST /api/command
Senden Sie einen JSON-Befehl im Anfrage-Body. Bei Erfolg:
{"ok": true, "message": "play ok"}
Bei einem Fehler:
{"ok": false, "error": "category not found"}
GET /api/icon/{categoryUuid}
Gibt das Bild eines Kategoriesymbols zurück. Verwenden Sie die Kategorie-UUID aus
/api/catalog. Die Kategorie muss zu einer aktiven Bibliothek gehören. Der optionale
Query-Parameter size legt die angeforderte Größe für Schrift- und SVG-Symbole fest
und verwendet standardmäßig 144 Pixel.
- Schrift- und SVG-Symbole werden als PNG-Bilder gerendert und mit der Kategoriefarbe eingefärbt.
- Wenn eine benutzerdefinierte Datei fehlt oder ein SVG nicht gerastert werden kann, verwendet die API stattdessen das Schrift-Symbol.
- Benutzerdefinierte PNG-, JPG- und JPEG-Symbole werden unverändert zurückgegeben;
sizewird ignoriert. - Erfolgreiche Antworten verwenden
image/pngoderimage/jpegund können eine Stunde zwischengespeichert werden. - Wenn die Kategorie nicht gefunden wird, antwortet der Server mit
404und{"error":"category not found"}. - Wenn das Symbol nicht gerendert werden kann, antwortet der Server mit
500und{"error":"failed to render icon"}.
WebSocket
Für Tools, die Echtzeit-Updates wünschen (z. B. ein Stream Deck-Plugin, das den aktuellen Status anzeigen muss), verbinden Sie einen WebSocket mit:
ws://localhost:8329/ws
Befehle senden
Senden Sie dieselben JSON-Befehlobjekte, die Sie auch an /api/command POSTen würden:
{"command": "play", "section": "Music", "categoryName": "Battle"}
Der Server antwortet mit einer Ergebnis-Nachricht für jeden Befehl.
Updates empfangen
Der Server pusht automatisch Updates, sobald sich etwas ändert. Jede Nachricht hat ein type-Feld:
| Typ | Wann es gesendet wird | Was es enthält |
|---|---|---|
state | Beim Verbindungsaufbau + bei jeder Änderung der Wiedergabe | Wie GET /api/state |
catalog | Beim Verbindungsaufbau + wenn Bibliotheken geändert werden | Wie GET /api/catalog |
result | Nach jedem von Ihnen gesendeten Befehl | ok, message oder error, requestId |
echo | Wenn ein Echo-Sound ausgelöst wird | uuid, name, at |
hello | Beim Verbindungsaufbau, erste Nachricht | apiVersion und features, siehe Detecting features |
ai_director | Beim Verbindungsaufbau + wenn sich der KI-Director ändert | Wie GET /api/ai_director/status |
ai_director_log | Beim Verbindungsaufbau + während der KI-Director hört und handelt | Jüngste Aktivitätseinträge |
Zustandsupdates werden gedrosselt (250 ms), sodass Sie nicht während schneller Änderungen wie Lautstärke-Sweeps überflutet werden.
Nachrichten sind flache JSON-Objekte. Die Nutzlast ist nicht unter einem data oder
payload-Feld verschachtelt. Beispiele:
{"type": "state", "musicPlaying": true, "ambiancePlaying": false,
"musicVolume": 0.5, "ambianceVolume": 0.5,
"musicCategories": [], "ambianceCategories": [], "categoryVolume": {}}
{"type": "catalog", "activeLibraryUuid": "<uuid>", "libraries": []}
{"type": "result", "ok": true, "message": "play ok", "requestId": "request-1"}
{"type": "echo", "uuid": "<uuid>", "name": "Thunder",
"at": "2026-07-18T12:34:56Z"}
Befehle
Alle Befehle verwenden dasselbe JSON-Schema wie die MQTT-Integration. Jeder Befehl akzeptiert eine optionale requestId-Zeichenkette, die Sie verwenden können, um Antworten abzugleichen.
play
Wiedergabe oder Fortsetzung einer Sektion oder Auswahl einer bestimmten Kategorie.
{"command": "play", "section": "Music"}
{"command": "play", "section": "Music", "categoryName": "Battle"}
{"command": "play", "section": "Ambiance", "categoryUuid": "<uuid>"}
- Ohne Kategorie: setzt die gesamte Sektion fort.
- Mit Kategorie: wählt sie aus und spielt sie ab.
- Ambiente verwendet Toggle-Semantik. Das Abspielen einer bereits aktiven Ambient-Kategorie schaltet sie aus.
pause
{"command": "pause", "section": "Music"}
stop
{"command": "stop", "section": "Ambiance"}
setActiveLibrary
Umschalten der aktiven Bibliothek nach UUID oder Name.
{"command": "setActiveLibrary", "libraryName": "My Library"}
{"command": "setActiveLibrary", "libraryUuid": "<uuid>"}
setVolume
Festlegen der Lautstärke für eine ganze Sektion oder für eine bestimmte Kategorie innerhalb einer Sektion. Verwenden Sie value von 0,0 bis 1,0 oder von 0 bis 100 mit valueScale: percent.
{"command": "setVolume", "section": "Music", "value": 1.0}
{"command": "setVolume", "section": "Music", "value": 75, "valueScale": "percent"}
{"command": "setVolume", "section": "Echoes", "value": 0.5}
{"command": "setVolume", "section": "Ambiance", "value": 0.5,
"categoryName": "Rain", "transitionMs": 1000}
Der optionale transitionMs steuert, wie schnell die Lautstärke auf den neuen Pegel ausgeblendet wird (Standard: 500 ms).
Musik und Ambiente verwenden dieselbe Anzeigeskala wie die App: 0.5 ist die normale
(Einheits-)Lautstärke und 1.0 ist die maximale, verstärkte Lautstärke. Echoes haben
keinen verstärkten Bereich, sodass 1.0 die normale Lautstärke ist. Die API konvertiert
diese Anzeigewerte automatisch in den internen Wiedergabe-Gain.
nextTrack
Überspringen zum nächsten Track in einer aktiven Musik- oder Ambient-Kategorie. Die Kategorie muss bereits abgespielt werden.
{"command": "nextTrack", "section": "Music", "categoryUuid": "<uuid>"}
{"command": "nextTrack", "section": "Ambiance", "categoryName": "Rain"}
playEcho
Auslösen eines One-Shot-Echo-Sounds.
{"command": "playEcho", "categoryName": "Thunder"}
{"command": "playEcho", "section": "Ambiance", "categoryUuid": "<uuid>"}
Bei Erfolg wartet der Befehl, bis die Echo-Wiedergabe registriert ist, und gibt die zugehörigen Tracking- und Wiedergabefelder zurück:
{
"ok": true,
"message": "echo played",
"requestId": "play-thunder",
"playbackId": "<playback-id>",
"categoryUuid": "<category-uuid>",
"categoryName": "Thunder",
"fileName": "thunder-01.wav",
"startedAt": "2026-08-09T12:00:00.000Z",
"durationMs": 4000,
"positionMs": 0,
"remainingMs": 4000,
"progress": 0.0,
"progressPercent": 0.0,
"playing": true,
"processingState": "ready"
}
Verwenden Sie die zurückgegebene playbackId mit stopEcho, um nur diese
Wiedergabeinstanz zu stoppen. Aktuelle Werte können auch mit
GET /api/echoes/active abgerufen werden.
stopEcho
Stoppen der aktiven Echo-Wiedergabe mithilfe genau eines Selektors:
{"command": "stopEcho", "playbackId": "<playback-id>"}
{"command": "stopEcho", "categoryUuid": "<category-uuid>"}
{"command": "stopEcho", "categoryName": "Thunder"}
playbackIdstoppt nur diese Wiedergabeinstanz. Holen Sie sich Wiedergabe-IDs ausGET /api/echoes/active.categoryUuidstoppt alle aktiven Echoes aus dieser Kategorie.categoryNamestoppt alle aktiven Echoes, deren Kategorie genau diesen Namen hat. Wenn Kategorien in mehreren Bibliotheken denselben Namen haben, werden alle Übereinstimmungen gestoppt.- Die Antwort enthält
stoppedCount. Ein Selektor ohne aktive Übereinstimmungen ist erfolgreich mitstoppedCount: 0. - Um alle aktiven Echoes unabhängig von der Kategorie zu stoppen, verwenden Sie
{"command": "stop", "section": "Echoes"}.
setCategoryEnabled
Aktivieren oder Deaktivieren einer Kategorie in einer Sektion explizit.
{"command": "setCategoryEnabled", "section": "Ambiance",
"categoryName": "Rain", "enabled": true}
Sie können eine Kategorie aktivieren und gleichzeitig ihre Lautstärke festlegen, indem Sie value einschließen.
Wenn value weggelassen wird, wird die konfigurierte Ziellautstärke der Kategorie verwendet. Eine
vorherige Laufzeit-Anpassung wird nicht wiederverwendet.
{"command": "setCategoryEnabled", "section": "Ambiance",
"categoryName": "Rain", "enabled": true, "value": 0.5}
restoreState
Wiederherstellen eines zuvor gespeicherten Zustands aus einem Share-Link, der von der App erstellt wurde.
{"command": "restoreState", "link": "slashpaf://..."}
setConfig
Weiterleiten einer Konfigurationseinstellung an die MQTT-Integration (falls verbunden). Nützlich für erweiterte Automatisierung.
{"command": "setConfig", "key": "someKey", "value": "someValue"}
Funktionserkennung
Neuere Versionen von Audio Forge fügen Funktionen zur API hinzu. So kann ein Tool erkennen, welche Funktionen die laufende App unterstützt; der Server kündigt seine Version an. Es ist die erste WebSocket-Nachricht, und GET /api/info gibt das Gleiche zurück:
{"type": "hello", "apiVersion": 3,
"features": {"aiDirector": {"available": true, "enabled": true},
"roomControl": {"commands": ["play", "pause", "stop", "..."]}}}
| Feld | Bedeutung |
|---|---|
apiVersion | Beginnt bei 1. Version 2 (Audio Forge 1.5.18) fügte den KI-Director hinzu. Version 3 fügte die Raumsteuerung hinzu. |
features.aiDirector.available | Diese Plattform unterstützt den KI-Director. |
features.aiDirector.enabled | Der KI-Director ist in den Einstellungen dieser App aktiviert. |
features.roomControl.commands | Die Befehle, die ein Gast in einem Raum ausführen darf. |
Ältere Versionen von Audio Forge senden keine hello-Nachricht und haben keinen /api/info: behandeln Sie dies als apiVersion 1 und rufen Sie nichts Neueres auf. Zeigen Sie KI-Director-Funktionen nur an oder rufen Sie sie auf, wenn sowohl available als auch enabled true sind.
Raumsteuerung
Wenn Sie einen Online-Raum hosten, können Sie Gästen ermöglichen, Audio Forge von der Gastseite aus zu steuern. Zwei Befehle legen fest, wer welche Berechtigungen hat (sie funktionieren nur, während ein Raum geöffnet ist):
{"command": "setRoomDefaultPermission", "permission": "control"}
{"command": "setRoomGuestPermission", "clientId": "<guest clientId>", "permission": "listen"}
permission ist entweder "listen" (nur Sie steuern Audio Forge) oder "control". Der Raumstatus in GET /api/state (room) enthält dann defaultGuestPermission und eine permission für jeden Eintrag in guests (die effektive Berechtigung: mit "control" als Standard können Sie immer noch einen einzelnen Gast auf "listen" setzen). room.chatMessages listet auch auf, was steuernde Gäste getan haben, als Einträge mit kind: "activity", command und aufgelösten params; Chat-Einträge haben kind: "chat". Gäste, die beitreten oder den Raum verlassen, erscheinen als Aktivitätseinträge mit command guestJoined, guestLeft, guestRemoved oder guestReconnected. Während Gäste die Steuerung haben, lädt Audio Forge auch die Kategorie-Symbole auf den Raumserver hoch, damit die Gastseite sie anzeigen kann. Gäste mit Steuerung dürfen nur die in features.roomControl.commands aufgeführten Befehle ausführen; die Aufnahme, das Entfernen von Gästen, die Konfiguration, der KI-Director und die Berechtigungen verbleiben bei Ihnen.
KI-Director
Der KI-Director hört auf Ihre Tischrunde und ändert die Musik und die Atmosphäre für Sie. Über die Local API können Sie ihn starten und stoppen, auswählen, woher er sein Audio bezieht, ihn mit Text füttern und verfolgen, was er verstanden und getan hat. Er benötigt, dass der KI-Director in der App aktiviert ist und seine Modelle installiert sind.
Befehle
| Befehl | Felder | Was er tut |
|---|---|---|
aiDirectorStart | inputSource (optional), fresh (optional), extraReasoning (optional), device (optional), gpuLayers (optional), threads (optional), probe (optional), whisperGpu (optional) | Beginnt mit dem Abhören. Das Laden der Modelle dauert eine Weile, daher kommt die Antwort zuerst: beobachten Sie, wie state von activating zu listening wechselt. fresh: true vergisst die vorherige Szene. extraReasoning überschreibt die App-Einstellung für “Extra Reasoning” nur für diese Sitzung: true stellt dem Modell eine zweite, kurze Frage, um den Soundeffekt zu finden, was genauer, aber etwas langsamer ist. device (nur Android, für Tests) gibt an, wo das Modell ausgeführt wird: gpu, cpu oder auto; das Modell wird neu geladen, wenn es sich ändert. gpuLayers und threads (nur Android, für Tests, nur GGUF-Modelle) legen die Anzahl der GPU-Layer und die Anzahl der CPU-Threads fest; 0, der Standardwert, behält das Modell auf der CPU und lässt die Engine die Threads auswählen. probe: true (für die Feinabstimmung) protokolliert Blockierungen des Hauptthreads und langsame Frames, mit Build- und Rasterzeit getrennt, im Debug-Protokoll für diese Sitzung. whisperGpu (für Tests) führt die Spracherkennung auf der GPU (true) oder der CPU (false) für diese Sitzung aus; standardmäßig ist sie aktiviert; auf Android wird sie nur auf Adreno-GPUs verwendet. Wird mit einem Fehler abgelehnt, wenn die Funktion deaktiviert ist, nicht entsperrt ist oder die Modelle nicht installiert sind. |
aiDirectorStop | Beendet das Abhören und gibt die Modelle frei. | |
aiDirectorSetInput | inputSource | Wechselt die Audioquelle während der Ausführung. |
aiDirectorSendText | text | Gibt dem KI-Director Text als ob er gehört worden wäre, ohne Mikrofon und ohne Spracherkennung. Siehe unten. |
inputSource ist entweder "device" (das in Audio Forge ausgewählte Eingabegerät, Standard) oder "remote" (Audio, das von Ihrem Tool über WebSocket gesendet wird).
{"command": "aiDirectorStart", "inputSource": "remote", "fresh": true}
Text senden
aiDirectorSendText ist ein “Feuer-und-vergiss”-Befehl: die Antwort bestätigt nur, dass der Text in die Warteschlange gestellt wurde. Wie bei Sprache sammelt der KI-Director einige Sekunden lang das Gehörte und entscheidet dann, ob und was geändert werden soll. Er wird abgelehnt, wenn der KI-Director nicht ausgeführt wird.
{"command": "aiDirectorSendText", "text": "Heavy rain starts to fall on the old market square."}
Dies ist nützlich für Tools, die bereits eine Transkription haben, für textbasierte Sitzungen und zum Testen, wie der KI-Director auf eine Szene reagiert.
Status
GET /api/ai_director/status und die ai_director-WebSocket-Nachricht, die jedes Mal gepusht wird, wenn sich etwas ändert:
{"type": "ai_director", "available": true, "enabled": true, "entitled": true,
"modelsReady": true, "state": "listening", "inputSource": "device",
"sceneDescription": "Heavy rain over a market square", "lastTranscript": "...", "error": null}
| Feld | Bedeutung |
|---|---|
entitled | Der KI-Director ist für dieses Konto freigeschaltet. |
modelsReady | Die Spracherkennungs- und Sprachmodelle sind installiert. |
state | idle (ruhig), activating (aktiviert), listening (hört), processing (verarbeitet) oder paused (angehalten). |
inputSource | device (Gerät) oder remote (fern). |
extraReasoning | Ob die erweiterte Schlussfolgerung für diesen Durchlauf aktiviert ist. |
backend | Das Inferenz-Backend, mit dem das Sprachmodell geladen wurde (z. B. Vulkan oder CPU), oder null, wenn es nicht geladen ist. |
whisperGpu | Ob die Spracherkennung auf der GPU (Vulkan) läuft, wenn das System eine GPU hat; andernfalls wird automatisch auf die CPU zurückgegriffen. |
whisperBackend | Die Recheneinheiten, die die Spracherkennungsbibliothek verwenden kann, z. B. CPU; Vulkan0 Radeon 8060S Graphics (gpu), oder null vor dem ersten Start. Ein System ohne GPU-Backend listet nur die CPU auf. |
sceneDescription, lastTranscript | Was der KI-Director aktuell glaubt und das zuletzt gehörte. |
error | Der Grund, warum der Start fehlgeschlagen ist, falls vorhanden. |
Aktivitätsprotokoll
Die ai_director_log-WebSocket-Nachricht enthält, was der KI-Director gehört und getan hat. Sie wird vollständig gesendet, wenn Sie sich verbinden (reset: true, die letzten 100 Einträge), danach nur neue Einträge:
{"type": "ai_director_log", "reset": false,
"entries": [{"id": 42, "at": "2026-10-27T15:20:48Z", "kind": "transcript", "text": "..."}]}
kind ist transcript (das gehörte), action (die vorgenommene Aktion), error oder info.
Für eine detailliertere Untersuchung gibt GET /api/ai_director/debug?since=<id> jeden Eintrag nach id zurück, einschließlich des an das Sprachmodell gesendeten Prompts und seiner rohen Antwort. Dies ist für die Feinabstimmung gedacht, nicht für die Anzeige.
Senden Ihres eigenen Mikrofon-Audios
Wenn inputSource auf "remote" gesetzt ist, senden Sie binäre WebSocket-Frames mit rohem Audio: 16 kHz, Mono, vorzeichenbehaftet, 16-Bit, Little-Endian PCM. Audio Forge wendet seine übliche Stillerkennung an, sodass Sie kontinuierlich streamen können. Frames werden ignoriert, während die Quelle auf "device" eingestellt ist. Nur ein WebSocket-Client kann gleichzeitig Audio liefern; wenn er sich trennt, wechselt der KI-Director zurück zum Eingabegerät.
Fehlerbehandlung
Wenn ein Befehl nicht ausgeführt werden kann (z. B. wenn ein Kategoriename nicht existiert oder ein erforderliches Feld fehlt), enthält die Antwort "ok": false und eine error-Nachricht, die beschreibt, was schief gelaufen ist.
{"ok": false, "error": "category not found"}
{"ok": false, "error": "section required"}
{"ok": false, "error": "invalid json"}
Sicherheit
Standardmäßig bindet sich die lokale API an 127.0.0.1 (nur localhost) und ist nicht von anderen Geräten in Ihrem Netzwerk aus erreichbar.
Wenn Sie Auf LAN hören aktivieren, wird die API von anderen Geräten aus erreichbar. In diesem Fall ist ein API-Schlüssel für alle Anfragen von Nicht-localhost-Geräten erforderlich. Der Schlüssel wird automatisch generiert und in Einstellungen → Externe Steuerung → Lokale API angezeigt; übergeben Sie ihn mit jeder Anfrage mithilfe von:
- Header:
Authorization: Bearer <your-api-key> - Abfrageparameter:
?apiKey=<your-api-key>
Beispiele:
# Using the Authorization header
curl http://192.168.0.10:8329/api/state ^
-H "Authorization: Bearer your-api-key-here"
# Using the query parameter
curl "http://192.168.0.10:8329/api/state?apiKey=your-api-key-here"
# Sending a command from another device
curl -X POST http://192.168.0.10:8329/api/command ^
-H "Authorization: Bearer your-api-key-here" ^
-H "Content-Type: application/json" ^
-d "{\"command\":\"play\",\"section\":\"Music\",\"categoryName\":\"Battle\"}"
# WebSocket with API key
wscat -c "ws://192.168.0.10:8329/ws?apiKey=your-api-key-here"
localhost-Anfragen benötigen keinen Schlüssel, auch wenn LAN-Modus aktiviert ist.
Sie können den API-Schlüssel jederzeit in Einstellungen → Externe Steuerung → Lokale API regenerieren. Alle zuvor verbundenen Clients benötigen den neuen Schlüssel.
Verhalten im Hintergrund auf Mobilgeräten
Mobile Betriebssysteme können die Verarbeitung von HTTP- und WebSocket-Anfragen anhalten, wenn Audio Forge im Hintergrund ausgeführt wird oder das Gerät gesperrt ist, auch wenn die native Audio-Wiedergabe fortgesetzt wird. Die lokale API stoppt sich nicht absichtlich, kann aber die Verfügbarkeit im Hintergrund auf iOS oder Android nicht garantieren.
Für eine stabile Fernsteuerung während einer Sitzung halten Sie Audio Forge im Vordergrund und halten Sie den Bildschirm aktiv. Dadurch wird vermieden, dass Sie sich auf eine batterieintensive Hintergrundausführung verlassen, die mobile Plattformen jederzeit stoppen können.