Signatur
Beschreibung
Die Methode measureInputUsage() gehört zur Summarizer API, einer der eingebauten KI-APIs des Browsers. Das Sprachmodell läuft lokal auf dem Gerät. Bevor du einen Text mit summarize() oder summarizeStreaming() verarbeitest, kannst du mit dieser Methode messen, wie viele Einheiten (in der Regel Token) die Eingabe belegen würde. Die Zusammenfassung selbst wird dabei nicht ausgeführt.
Jede Summarizer-Instanz hat eine feste Obergrenze, die in der Eigenschaft inputQuota steht. Überschreitet eine Eingabe diese Grenze, schlägt summarize() mit einer QuotaExceededError-DOMException fehl. Mit measureInputUsage() kannst du das vorher prüfen und lange Texte gezielt in Abschnitte aufteilen, kürzen oder dem Nutzer einen Hinweis anzeigen.
Wichtig: Das Ergebnis berücksichtigt auch die gemeinsamen Einstellungen der Instanz (sharedContext, type, format, length) und einen optional übergebenen context. Deshalb solltest du beim Messen dieselben Optionen verwenden wie später beim eigentlichen Aufruf von summarize().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $input Pflicht | string | Der Text, dessen Quota-Verbrauch gemessen werden soll. | |
| $options | object | {} | Optionales Objekt mit den Eigenschaften, die auch summarize() annimmt. |
| $options.context | string | Zusätzlicher Kontext für genau diese Eingabe, z. B. „Artikel für ein Fachpublikum“. Er zählt zum Verbrauch dazu. | |
| $options.signal | AbortSignal | Signal, mit dem sich die Messung abbrechen lässt. Das Promise wird dann mit einer AbortError-DOMException abgelehnt. |
Beispiele
Vor dem Zusammenfassen prüfen, ob der Text passt
const text = document.querySelector('article').innerText;
if ('Summarizer' in self && (await Summarizer.availability()) !== 'unavailable') {
const summarizer = await Summarizer.create({ type: 'tldr', length: 'short' });
const usage = await summarizer.measureInputUsage(text);
console.log(`Verbrauch: ${usage} / ${summarizer.inputQuota}`);
if (usage <= summarizer.inputQuota) {
const summary = await summarizer.summarize(text);
console.log(summary);
} else {
console.warn('Text ist zu lang für eine einzelne Zusammenfassung.');
}
}
Lange Texte in passende Abschnitte aufteilen
const splitToQuota = async (summarizer, text) => {
const paragraphs = text.split(/\n\s*\n/);
const chunks = [];
let current = '';
for (const p of paragraphs) {
const candidate = current ? `${current}\n\n${p}` : p;
const usage = await summarizer.measureInputUsage(candidate);
if (usage > summarizer.inputQuota && current) {
chunks.push(current);
current = p;
} else {
current = candidate;
}
}
if (current) chunks.push(current);
return chunks;
};
const summarizer = await Summarizer.create({ type: 'key-points', format: 'markdown' });
const chunks = await splitToQuota(summarizer, longText);
const parts = [];
for (const chunk of chunks) {
parts.push(await summarizer.summarize(chunk));
}
console.log(`${chunks.length} Abschnitte zusammengefasst`);
Messung mit Kontext und Abbruch-Signal
const controller = new AbortController();
setTimeout(() => controller.abort(), 2000);
const summarizer = await Summarizer.create({
sharedContext: 'Kundenbewertungen eines Onlineshops'
});
try {
const usage = await summarizer.measureInputUsage(reviewText, {
context: 'Bewertung zu einem Smartphone',
signal: controller.signal
});
const percent = Math.round((usage / summarizer.inputQuota) * 100);
console.log(`Eingabe belegt ${percent} % der Quota`);
} catch (err) {
if (err.name === 'AbortError') console.log('Messung abgebrochen');
else throw err;
}
// Wichtig · Fallstricke
- Kompatibilität: Die Summarizer API gibt es bisher nur in Chromium-Browsern (Chrome ab 138, Desktop). Sie braucht einen sicheren Kontext (HTTPS) und genug Hardware für das lokale Modell. Prüfe vorher mit
'Summarizer' in selfundSummarizer.availability(), ob sie verfügbar ist. Firefox und Safari unterstützen sie derzeit nicht. - Gleiche Optionen verwenden: Miss mit demselben
context, den du später ansummarize()übergibst. Sonst weicht das Ergebnis ab. - Kein Zeichenzähler: Der Verbrauch hängt vom Tokenizer des Modells ab und lässt sich nicht verlässlich aus
text.lengthableiten. Die Werte können sich ändern, wenn der Browser ein neues Modell lädt. - Leistung: Jeder Aufruf ist asynchron und kostet Rechenzeit. Beim Aufteilen sehr langer Texte (siehe Beispiel 2) nicht für jedes einzelne Wort messen, sondern in größeren Einheiten wie Absätzen.
- Nach
summarizer.destroy()wird das Promise mit einerInvalidStateError-DOMExceptionabgelehnt.