Start · Sprachen · JavaScript · Referenz · LanguageModel.promptStreaming()

LanguageModel.promptStreaming()

Methode

Sendet eine Eingabe an das im Browser laufende Sprachmodell und liefert die Antwort als <code>ReadableStream</code>, dessen Textteile nacheinander eintreffen, während das Modell sie erzeugt.

seit JavaScript Experimentell: Chrome 138+ (Erweiterungen, Origin Kategorie: webapi

Signatur

LanguageModel.prototype.promptStreaming(input, options)

Beschreibung

promptStreaming() gehört zur Prompt API (LanguageModel). Die Methode schickt einen Prompt an eine vorher mit LanguageModel.create() erzeugte Sitzung. Anders als prompt() wartet sie nicht auf die fertige Antwort, sondern gibt sofort einen ReadableStream zurück. Aus diesem Stream kommen die Textteile (Chunks), sobald das Modell sie erzeugt hat.

Diese Methode eignet sich überall, wo Nutzer die Antwort während des Schreibens sehen sollen, etwa in Chat-Oberflächen, bei Zusammenfassungen oder bei langen Texten. Die Wartezeit fühlt sich dadurch deutlich kürzer an, weil der erste Text oft schon nach Bruchteilen einer Sekunde erscheint, obwohl die ganze Antwort mehrere Sekunden braucht.

Als Eingabe geht ein einfacher String oder ein Array von Nachrichten mit role ("user", "assistant", "system") und content. Die Sitzung merkt sich den Gesprächsverlauf: Jeder Aufruf erweitert den Kontext und belegt Platz im Kontextfenster (inputUsage bzw. inputQuota). Über options.signal lässt sich eine laufende Erzeugung abbrechen, und mit options.responseConstraint kann die Ausgabe an ein JSON-Schema oder einen regulären Ausdruck gebunden werden.

Den Stream liest man am einfachsten mit for await...of aus. Alternativ geht es über stream.getReader() oder, per pipeThrough()/pipeTo(), in andere Streams hinein.

Parameter

Name Typ Default Beschreibung
$input Pflicht string | Array<{role: string, content: string | Array<object>}> Der Prompt: entweder ein Text oder ein Array von Nachrichten mit role ("user", "assistant", "system") und content. Wenn die Sitzung mit expectedInputs angelegt wurde, darf content auch Bild- oder Audio-Teile enthalten.
$options object {} Optionale Einstellungen für diesen einen Aufruf.
$options.signal AbortSignal Bricht die Erzeugung ab. Der Stream wird dann mit einem AbortError beendet.
$options.responseConstraint object | RegExp JSON-Schema oder regulärer Ausdruck, an den sich die Ausgabe halten muss (strukturierte Ausgabe).
$options.omitResponseConstraintInput boolean false Bei true wird das Schema aus responseConstraint nicht zusätzlich in den Prompt geschrieben. Das spart Token, dann sollte das gewünschte Format aber im Prompt selbst beschrieben sein.

Rückgabewert

Typ
ReadableStream<string>
Beschreibung
Ein Stream aus Textteilen. Jeder Chunk ist ein neues Stück der Antwort. Zusammengesetzt ergeben alle Chunks die vollständige Antwort. Bei einem Fehler oder Abbruch endet der Stream mit einer Exception (z. B. AbortError, QuotaExceededError, NotSupportedError).

Beispiele

Antwort schrittweise in der Seite anzeigen

const output = document.querySelector('#antwort');

const availability = await LanguageModel.availability();
if (availability === 'unavailable') {
  output.textContent = 'Kein lokales Sprachmodell verfügbar.';
} else {
  const session = await LanguageModel.create();
  const stream = session.promptStreaming(
    'Erkläre in drei Sätzen, was ein Promise in JavaScript ist.'
  );

  output.textContent = '';
  for await (const chunk of stream) {
    output.textContent += chunk; // Chunks sind Teilstücke, deshalb anhängen
  }
}
Der Text erscheint Stück für Stück im Element #antwort.

Chat mit Systemanweisung und Abbrechen-Button

const session = await LanguageModel.create({
  initialPrompts: [
    { role: 'system', content: 'Du bist ein hilfsbereiter Assistent und antwortest kurz auf Deutsch.' }
  ]
});

const controller = new AbortController();
document.querySelector('#stop').addEventListener('click', () => controller.abort());

const ask = async (frage) => {
  let antwort = '';
  try {
    const stream = session.promptStreaming(frage, { signal: controller.signal });
    for await (const chunk of stream) {
      antwort += chunk;
      document.querySelector('#chat').textContent = antwort;
    }
  } catch (err) {
    if (err.name === 'AbortError') {
      console.log('Erzeugung abgebrochen, Teilantwort:', antwort);
    } else {
      throw err;
    }
  }
  console.log(`Kontext belegt: ${session.inputUsage}/${session.inputQuota}`);
  return antwort;
};

await ask('Nenne drei Vorteile von Web Workers.');
Kontext belegt: 142/6144

Strukturierte JSON-Ausgabe streamen

const session = await LanguageModel.create();

const schema = {
  type: 'object',
  properties: {
    stimmung: { type: 'string', enum: ['positiv', 'neutral', 'negativ'] },
    begruendung: { type: 'string' }
  },
  required: ['stimmung', 'begruendung']
};

const stream = session.promptStreaming(
  'Bewerte die Stimmung: "Die Lieferung kam schnell, aber das Produkt ist beschädigt."',
  { responseConstraint: schema }
);

let json = '';
for await (const chunk of stream) {
  json += chunk;
}

// Erst parsen, wenn der Stream vollständig ist
const result = JSON.parse(json);
console.log(result.stimmung);
negativ

Stream manuell mit getReader() lesen

const session = await LanguageModel.create();
const reader = session.promptStreaming('Schreibe ein Haiku über Herbst.').getReader();

let text = '';
while (true) {
  const { done, value } = await reader.read();
  if (done) break;
  text += value;
}
console.log(text);
session.destroy(); // Ressourcen freigeben
(ein dreizeiliges Haiku)