Start · Sprachen · JavaScript · Referenz · Summarizer.measureInputUsage()

Summarizer.measureInputUsage()

Methode

Ermittelt, wie viel der <code>inputQuota</code> eines <code>Summarizer</code> eine Zusammenfassung des übergebenen Textes verbrauchen würde, ohne sie auszuführen.

seit JavaScript Chrome/Edge 138+ (experimentell, keine Baseline) Kategorie: webapi

Signatur

Summarizer.prototype.measureInputUsage(input, options)

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.');
  }
}
Verbrauch: 1830 / 6000 (Zusammenfassung des Artikels)

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`);
3 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;
}
Eingabe belegt 12 % der Quota

// 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 self und Summarizer.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 an summarize() ü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.length ableiten. 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 einer InvalidStateError-DOMException abgelehnt.