Ergebnis lesen

Die API bewertet jeden Satz einzeln. So liest du Urteil, Anteile und Positionen.

Urteil

WertBedeutung
noneKeine Hinweise auf KI gefunden.
someEinzelne Stellen sind auffällig.
mostlyMindestens die Hälfte des Textes liegt in den beiden oberen Stufen.

Eine Klasse „menschlich“ gibt es bewusst nicht: Ein Text ohne Markierung ist nicht nachweislich von einem Menschen geschrieben. Die API nennt auch keine Rohwahrscheinlichkeit.

Stufen

bandAnzeigeBedeutung
very_likely_aiSehr wahrscheinlich KIDer Satz trägt deutliche Muster eines Sprachmodells.
likely_aiWahrscheinlich KIMehrere Sätze in Folge wirken maschinell geschrieben.
possibly_aiMöglicherweise KIEin schwächerer Hinweis. Er zählt nicht in ai_share.
not_flaggedNicht markiertNur mit all_sentences: Der Satz trägt keine Markierung. Das sagt nichts darüber, wer ihn geschrieben hat.

Eine Markierung ist ein Hinweis, kein Beweis. Zeige sie deinen Nutzern als Anlass, die Stelle noch einmal anzusehen.

Alle Sätze

Mit "all_sentences": true enthält sentences jeden bewerteten Satz in der Reihenfolge des Textes. Leerraum zwischen den Sätzen und Bruchstücke unter drei Zeichen gehören zu keinem Eintrag. Sätze ohne Markierung tragen die Stufe not_flagged. Das heißt nicht, dass ein Mensch den Satz geschrieben hat: Die API markiert streng, einen einzelnen Satz nur bei sehr deutlichem Signal und sonst erst mehrere auffällige Sätze in Folge. Urteil, Anteile und Abrechnung bleiben gleich.

Ausschnitt
"sentences": [
  { "start": 0, "end": 118, "band": "not_flagged" },
  { "start": 119, "end": 247, "band": "likely_ai" },
  { "start": 248, "end": 391, "band": "likely_ai" },
  { "start": 392, "end": 470, "band": "not_flagged" }
]

Das passt, wenn du den ganzen Text Satz für Satz anzeigst oder mit derselben Satzteilung weiterarbeiten willst.

Positionen

start und end zählen ab 0, end liegt hinter dem letzten Zeichen. Die Einheit wählst du mit offset_unit:

WertZähltPasst zu
codepointUnicode-ZeichenPython, Go (Runen), Rust (chars)
utf16UTF-16-EinheitenJavaScript, Java, C#

Der Unterschied zeigt sich erst bei Zeichen außerhalb der Grundebene, etwa Emojis.

Stellen markieren

parts, last = [], 0
for s in result["sentences"]:
    parts.append(html.escape(text[last:s["start"]]))
    parts.append(f'<mark class="{s["band"]}">{html.escape(text[s["start"]:s["end"]])}</mark>')
    last = s["end"]
parts.append(html.escape(text[last:]))
marked_html = "".join(parts)
let out = "", last = 0;
for (const s of result.sentences) {            // request with offset_unit: "utf16"
  out += escapeHtml(text.slice(last, s.start));
  out += `<mark class="${s.band}">${escapeHtml(text.slice(s.start, s.end))}</mark>`;
  last = s.end;
}
out += escapeHtml(text.slice(last));