Signatur
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
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
}
}
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.');
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);
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