Signatur
Beschreibung
Die Methode prompt() gehört zur Prompt API und wird auf einer Sitzung aufgerufen, die du vorher mit LanguageModel.create() erzeugt hast. Sie schickt Text oder eine Liste von Nachrichten an das lokal im Browser laufende Sprachmodell (in Chrome z. B. Gemini Nano) und wartet, bis das Modell fertig ist. Erst dann wird das Promise mit der ganzen Antwort erfüllt.
Eine Sitzung merkt sich den Gesprächsverlauf. Jeder Aufruf von prompt() hängt Eingabe und Antwort an den Kontext an, sodass Folgefragen sich auf frühere Antworten beziehen können. Der Kontext ist durch session.inputQuota begrenzt; wie viel schon belegt ist, zeigt session.inputUsage.
Nimm prompt(), wenn du die Antwort komplett brauchst, bevor du weitermachst, etwa bei Einordnung, Zusammenfassung oder strukturiertem JSON über responseConstraint. Bei langen Texten, die der Nutzer schon während der Erzeugung sehen soll, ist promptStreaming() besser geeignet.
Die Eingabe kann ein einfacher String sein oder ein Array von Nachrichten der Form { role, content } mit den Rollen "user", "assistant" oder "system". Bei multimodalen Sitzungen, also mit expectedInputs in create(), darf content auch Bilder oder Audio enthalten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $input Pflicht | string | Array<{role: string, content: string | Array<{type: string, value: any}>}> | Die Eingabe für das Modell: entweder ein String oder ein Array von Nachrichten mit role ("user", "assistant", "system") und content. Das Präfixieren einer Antwort ist mit prefix: true bei einer assistant-Nachricht möglich. |
|
| $options | object | {} | Optionale Einstellungen für diesen einen Aufruf. |
| $options.signal | AbortSignal | Bricht die Anfrage ab. Das Promise wird dann mit einer AbortError-DOMException abgelehnt. |
|
| $options.responseConstraint | object | RegExp | Ein JSON-Schema oder ein regulärer Ausdruck. Die Antwort muss dieser Struktur entsprechen (strukturierte Ausgabe). | |
| $options.omitResponseConstraintInput | boolean | false | Ist der Wert true, wird das Schema aus responseConstraint nicht zusätzlich als Text in den Kontext geschrieben. Das spart Kontingent, dann solltest du das gewünschte Format aber im Prompt selbst beschreiben. |
Rückgabewert
responseConstraint ist das ein JSON-String, den du mit JSON.parse() umwandelst.Beispiele
Einfache Frage mit Verfügbarkeitsprüfung
const frageModell = async (frage) => {
if (!('LanguageModel' in self)) {
throw new Error('Prompt API wird nicht unterstützt');
}
const status = await LanguageModel.availability();
if (status === 'unavailable') {
throw new Error('Kein Modell verfügbar');
}
const session = await LanguageModel.create({
initialPrompts: [
{ role: 'system', content: 'Du antwortest knapp und auf Deutsch.' }
]
});
try {
return await session.prompt(frage);
} finally {
session.destroy(); // Ressourcen freigeben
}
};
console.log(await frageModell('Was ist ein Promise in JavaScript?'));
Strukturierte Ausgabe per JSON-Schema
const schema = {
type: 'object',
properties: {
stimmung: { type: 'string', enum: ['positiv', 'neutral', 'negativ'] },
begruendung: { type: 'string' }
},
required: ['stimmung', 'begruendung']
};
const session = await LanguageModel.create();
const antwort = await session.prompt(
'Bewerte diese Kundenrezension: "Lieferung kam zu spät, aber das Produkt ist super."',
{ responseConstraint: schema }
);
const ergebnis = JSON.parse(antwort);
console.log(ergebnis.stimmung);
Folgefragen im selben Kontext und Abbruch per Timeout
const session = await LanguageModel.create();
await session.prompt('Merke dir: Mein Lieblingsframework ist Svelte.');
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), 10_000);
try {
const antwort = await session.prompt(
[{ role: 'user', content: 'Welches Framework mag ich am liebsten?' }],
{ signal: controller.signal }
);
console.log(antwort);
console.log(`Kontext: ${session.inputUsage} / ${session.inputQuota}`);
} catch (err) {
if (err.name === 'AbortError') console.warn('Zeitüberschreitung');
else throw err;
} finally {
clearTimeout(timer);
}
// Wichtig · Fallstricke
- Experimentell: Die Prompt API ist bisher nur in Chromium-Browsern verfügbar (Chrome-Erweiterungen, Origin Trial für Webseiten) und hängt von Hardware und Betriebssystem ab. Firefox und Safari unterstützen sie nicht. Prüfe deshalb immer mit
'LanguageModel' in selfundLanguageModel.availability(), ob sie nutzbar ist. - Modell-Download: Liefert
availability()den Wert"downloadable", wird das Modell beim erstencreate()heruntergeladen (mehrere GB). Dafür ist eine Nutzeraktivierung nötig, etwa ein Klick. Den Fortschritt verfolgst du mit demmonitor-Callback und dem Eventdownloadprogress. - Fehler: Das Promise wird z. B. abgelehnt mit
QuotaExceededError, wenn die Eingabe den Kontext sprengt, mitInvalidStateError, wenn die Sitzung schon mitdestroy()beendet wurde, mitNotSupportedErrorbei nicht unterstützten Eingabetypen oder Sprachen und mitAbortErrornach einem Abbruch. - Kontextüberlauf: Wird der Kontext zu voll, verwirft der Browser ältere Nachrichten (nicht aber den System-Prompt) und löst das Event
quotaoverflowaus. Den Platzbedarf einer Eingabe kannst du vorher mitmeasureInputUsage()messen. - Nicht deterministisch: Die Antworten können von Aufruf zu Aufruf verschieden sein. Auch mit
responseConstraintsolltest du das Ergebnis prüfen, bevor du es verwendest. - Sicherheit: Gib Modellausgaben niemals ungeprüft über
innerHTMLaus, sonst droht XSS. NutzetextContentoder bereinige die Ausgabe. Nutzereingaben können außerdem eine Prompt-Injection enthalten, verlasse dich also bei sicherheitskritischen Entscheidungen nicht auf das Modell. - Die Verarbeitung läuft lokal auf dem Gerät. Große Prompts können trotzdem mehrere Sekunden dauern, deshalb zeigst du am besten eine Ladeanzeige an.