Wenn ein Streaming-Aufruf danebengeht, halten Sie eine Wand aus Event- und Datenzeilen in der Hand, und die drei Dinge, die Sie wissen wollen, sind darin verstreut: was das Modell tatsächlich gesagt hat, warum es aufgehört hat und was es verbraucht hat. Der Text kommt in Fragmenten, Werkzeugargumente als partielles JSON, das erst mit dem letzten Stück parst, und der Verbrauch verteilt sich auf das erste und das letzte Ereignis. Hier wird alles wieder zusammengesetzt. Beide gängigen Stream-Formen werden verarbeitet, weil in der Praxis beide eingefügt werden, und Ereignisse, die nicht parsen, werden gemeldet statt still übersprungen.
Funktionen
Text aus den Deltas zusammengesetzt, in der Reihenfolge
Werkzeugargumente aus partiellem JSON rekonstruiert und formatiert
Stoppgrund, Modell und Verbrauch herausgezogen
Verarbeitet die Block-Delta-Form und die choices/delta-Form
Wiederholte data-Zeilen verbunden, wie die Spezifikation es verlangt
Keep-Alive-Kommentare ignoriert statt als Ereignis gezählt
Klappen Sie einzelne Ereignisse auf, wenn etwas offen bleibt
Beispiel
Eingabe
delta: {"type":"text_delta","text":"Order 4471 "}
Ausgabe
Order 4471 shipped on 30 August.
Fragmente über sechs Ereignisse, in der Reihenfolge zusammengesetzt.
Häufige Fehler & Fehlerbehebung
Es kommt kein Text heraus. — Der Stream endete möglicherweise vor jedem Inhalt — sehen Sie in die Ereignisliste und den Stoppgrund. Eine Ablehnung oder ein Fehlerereignis ergeben einen gültigen, leeren Stream.
Werkzeugargumente sind abgeschnitten. — Sie kommen als partielles JSON über mehrere Ereignisse. Wurde der Stream gekappt, schließt das JSON nie, und das rohe Fragment wird gezeigt.
Manche Ereignisse parsen nicht. — Meist ein beim Kopieren mitten im Ereignis abgeschnittener Stream. Diese werden mit ihrem Index gemeldet statt verworfen.
Die Verbrauchszahlen wirken unvollständig. — Sie verteilen sich über den Stream: Eingabetoken am Anfang, Ausgabetoken am Ende. Einem Stream ohne die letzten Ereignisse fehlt die Hälfte.
Häufig gestellte Fragen
Was sind Server-Sent Events?
Ein einfaches Streaming-Format: Zeilen aus Feld und Wert, Ereignisse durch Leerzeilen getrennt. Streaming-API-Antworten nutzen es, und deshalb lässt Sie ein gescheiterter Aufruf mit einer Wand davon zurück.
Welche Stream-Formen werden unterstützt?
Die Block-Form, bei der Text als typisierte Deltas in Inhaltsblöcken kommt, und die choices/delta-Form. Beide werden automatisch erkannt, weil Menschen einfügen, was ihr Client protokolliert hat.
Warum kommen Argumente in Stücken?
Sie werden als partielles JSON gestreamt, damit der Client zeichnen kann, bevor der Aufruf vollständig ist. Deshalb parsen die Fragmente erst mit dem letzten Stück, und ein abgeschnittener Stream hinterlässt ungültiges JSON.
Kann ich sehen, was es gekostet hat?
Der Verbrauchsblock wird herausgezogen, wenn vorhanden, samt Cache-Lesungen. Er sagt, was der Aufruf verbraucht hat; danach übernehmen die Kostenwerkzeuge.
Wird der Stream irgendwohin geschickt?
Nein. Ein Stream enthält die ganze Antwort und oft den erzeugenden Prompt, und das gesamte Parsen geschieht im Browser.
Verwandte Tools
Transkript-Konverter — Machen Sie aus einem Nachrichten-Array ein lesbares Transkript – und zurück.