Signatur
Beschreibung
Die Methode summarize() einer Summarizer-Instanz schickt einen Text an das lokal im Browser laufende Sprachmodell (in Chrome z. B. Gemini Nano). Das Promise wird erst erfüllt, wenn die ganze Zusammenfassung fertig ist, und liefert sie dann als String. Art, Format und Länge der Ausgabe legst du nicht hier fest, sondern schon beim Erzeugen der Instanz mit Summarizer.create() über die Optionen type, format und length.
Die Methode passt gut für kurze bis mittellange Texte, bei denen du das Ergebnis am Stück anzeigst, etwa eine TL;DR-Zeile über einem Artikel, Stichpunkte zu einem Support-Ticket oder einen Titelvorschlag (type: "headline"). Bei langen Texten oder wenn die Oberfläche die Ausgabe nach und nach anzeigen soll, nimmst du besser summarizeStreaming(). Diese Methode liefert einen ReadableStream mit Teilergebnissen.
Über options.context kannst du für genau diesen Aufruf Zusatzinformationen mitgeben, zum Beispiel „Zielgruppe: Entwickler“. Dieser Kontext kommt zum sharedContext hinzu, der bei create() festgelegt wurde. Mit options.signal kannst du eine laufende Zusammenfassung über einen AbortController abbrechen.
Die Verarbeitung läuft lokal auf dem Gerät. Der Text verlässt den Browser also nicht. Allerdings muss das Modell beim ersten Mal eventuell heruntergeladen werden, und die Ausgabe hängt vom Modell ab. Sie ist nicht deterministisch.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $input Pflicht | string | Der Text, der zusammengefasst werden soll. Er muss in das Kontingent summarizer.inputQuota passen. |
|
| $options | object | {} | Optionale Einstellungen für diesen einen Aufruf. |
| $options.context | string | Zusätzliche Hintergrundinformation nur für diesen Aufruf, z. B. zu Zielgruppe oder Quelle. | |
| $options.signal | AbortSignal | Signal zum Abbrechen der laufenden Zusammenfassung. Nach dem Abbruch wird das Promise mit dem Grund aus signal.reason abgelehnt, standardmäßig ein AbortError. |
Rückgabewert
format der Instanz: "markdown" (Standard) oder "plain-text".Beispiele
Einfache TL;DR-Zusammenfassung mit Verfügbarkeitsprüfung
const text = document.querySelector('article').innerText;
if (!('Summarizer' in self)) {
console.log('Summarizer API wird nicht unterstützt.');
} else {
const availability = await Summarizer.availability();
if (availability === 'unavailable') {
console.log('Modell auf diesem Gerät nicht verfügbar.');
} else {
// create() muss bei "downloadable" nach einer Nutzeraktion aufgerufen werden
const summarizer = await Summarizer.create({
type: 'tldr',
format: 'plain-text',
length: 'short'
});
const summary = await summarizer.summarize(text);
console.log(summary);
summarizer.destroy(); // Ressourcen freigeben
}
}
Stichpunkte mit Kontext und Download-Fortschritt
const button = document.querySelector('#summarize');
const output = document.querySelector('#result');
button.addEventListener('click', async () => {
const summarizer = await Summarizer.create({
type: 'key-points',
format: 'markdown',
length: 'medium',
sharedContext: 'Kundenanfragen an einen Software-Support',
monitor(m) {
m.addEventListener('downloadprogress', (e) => {
output.textContent = `Modell lädt: ${Math.round(e.loaded * 100)} %`;
});
}
});
const ticket = document.querySelector('#ticket').value;
output.textContent = await summarizer.summarize(ticket, {
context: 'Die Zusammenfassung ist für einen Entwickler im 2nd-Level-Support.'
});
});
Abbrechen und Eingabelänge vorher prüfen
const summarizer = await Summarizer.create({ type: 'headline', length: 'short' });
const controller = new AbortController();
const longText = 'Die Stadtverwaltung hat heute neue Regeln für den Radverkehr vorgestellt. '.repeat(50);
// Passt der Text ins Kontingent?
const usage = await summarizer.measureInputUsage(longText);
if (usage > summarizer.inputQuota) {
console.log('Text zu lang – bitte kürzen oder in Abschnitte teilen.');
} else {
setTimeout(() => controller.abort(), 5000); // Zeitlimit 5 s
try {
const headline = await summarizer.summarize(longText, { signal: controller.signal });
console.log(headline);
} catch (err) {
if (err.name === 'AbortError') console.log('Zusammenfassung abgebrochen.');
else if (err.name === 'QuotaExceededError') console.log('Eingabe zu groß.');
else throw err;
}
}
// Wichtig · Fallstricke
- Experimentell und nur in Chromium verfügbar: Stabil gibt es die Methode ab Chrome 138 auf dem Desktop. Das Gerät braucht genug Speicher und eine passende GPU/CPU. Firefox und Safari unterstützen die API bisher nicht. Prüfe deshalb immer mit
'Summarizer' in selfundSummarizer.availability(), ob sie nutzbar ist, und biete eine Alternative an. - Nutzeraktion nötig: Wenn das Modell erst heruntergeladen werden muss (
"downloadable"), mussSummarizer.create()durch eine Nutzeraktion wie einen Klick ausgelöst werden. In iframes muss die Permissions-Policysummarizererlaubt sein, sonst gibt es einenNotAllowedError. - Mögliche Fehler beim Aufruf:
QuotaExceededError, wenn die Eingabe größer alsinputQuotaist.InvalidStateError, wenn das Dokument nicht aktiv ist oderdestroy()schon aufgerufen wurde.AbortErrornach einem Abbruch.NotReadableError, wenn die Ausgabe gefiltert wurde.UnknownErrorbei sonstigen Fehlern des Modells. - Ausgabe nicht deterministisch: Derselbe Text kann unterschiedliche Zusammenfassungen ergeben. Verlass dich nicht auf ein exaktes Format, und prüfe inhaltlich wichtige Ergebnisse.
- Sicherheit: Standardmäßig ist die Ausgabe Markdown. Füge sie nie ungefiltert per
innerHTMLein. NutzetextContentoder einen Markdown-Renderer mit Bereinigung (Sanitizer), sonst droht XSS, wenn Nutzereingaben das Modell beeinflussen (Prompt-Injection). - Leistung: Verwende eine Instanz für mehrere Aufrufe wieder, statt jedes Mal
create()aufzurufen. Gib sie mitdestroy()frei, wenn du sie nicht mehr brauchst. Bei langen Texten sorgtsummarizeStreaming()für ein reaktionsfähigeres Interface.