LLM-API-Meetingnotizen: Zusammenfassung aus Transkript in Python
Um LLM-API-Meetingnotizen zu erhalten, sendest du das Transkript an einen Chat-Completions-Endpunkt mit einem kurzen System-Prompt und liest die Antwort. Die Qualität hängt vom Prompt, einem festen Ausgabeformat und der Handhabung langer Aufnahmen ab.
Aktualisiert

Wichtige Punkte
- Ein einzelner Chat-Completion-Aufrwand wandelt ein Transkript in Notizen um; der JSON-Modus liefert ein festes Format.
- Ein 100,000-Token-Fenster fasst die meisten Meeting-Transkripte ohne Aufteilung in Chunks.
- Weise das Modell an, null für fehlende Verantwortliche und Daten zu schreiben, damit es diese nicht erfindet.
- Ein voller Schlüssel erlaubt 8 parallele Anfragen, genug, um einen ganzen Tag an Meetings parallel zu verarbeiten.
Die Pipeline in vier Schritten
- Aufnehmen und transkribieren. Nutze ein Speech-to-Text-Tool. Diese API ist textbasiert und akzeptiert kein Audio.
- Text vorbereiten. Füge einen Header mit Meeting-Titel, Datum und Teilnehmernamen hinzu. Sprecherkennungen helfen sehr.
- Modell aufrufen. Sende das Transkript mit einem System-Prompt, der die gewünschten Abschnitte definiert.
- Ergebnis speichern und teilen. Speichere das JSON, render es als Markdown oder HTML und poste es dort, wo das Team es liest.
Der Endpunkt ist POST /v1/chat/completions auf https://api.whisperapis.com/v1, die Modell-ID ist uncensored, und jedes OpenAI SDK funktioniert nach dem Ändern der Basis-URL und des Schlüssels. Wenn du zuerst die Spracherkennung einrichten musst, behandeln die Quickstart-Dokumente den Textteil, und jeder Whisper-kompatible Server kann das Transkript liefern.
Strukturierte Notizen mit JSON-Modus erhalten
Freie Zusammenfassungen sind zum Lesen okay, aber eine Pipeline braucht Felder, die sie speichern und filtern kann. Der JSON-Modus, aktiviert mit response_format auf {"type": "json_object"}, lässt das Modell ein einzelnes JSON-Objekt zurückgeben. Beschreibe die Schlüssel im System-Prompt und nenne dort das Wort JSON, denn der Prompt definiert die Struktur.
import json
from openai import OpenAI
client = OpenAI(base_url="https://api.whisperapis.com/v1", api_key="YOUR_KEY")
SYSTEM = """You write meeting notes from raw transcripts.
Use only what the transcript says. If an owner or a date is not stated, write null.
Reply with a JSON object with the keys: summary (string), decisions (array of strings),
action_items (array of objects with task, owner, due), open_questions (array of strings)."""
transcript = open("standup.txt", encoding="utf-8").read()
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": SYSTEM},
{"role": "user", "content": "Transcript:\n\n" + transcript},
],
response_format={"type": "json_object"},
temperature=0.2,
)
notes = json.loads(resp.choices[0].message.content)
for item in notes["action_items"]:
print(item["owner"], "->", item["task"], item["due"])Zwei Zeilen in diesem Prompt erledigen den Großteil der Arbeit. „Verwende nur das, was im Transkript steht“ hält das Modell davon ab, plausible Details hinzuzufügen. „Wenn ein Verantwortlicher oder ein Datum nicht genannt wird, schreibe null“ gibt ihm eine gültige Möglichkeit, auszudrücken, dass er es nicht weiß, was besser ist als ein erfundener Name. Eine niedrige Temperatur von 0,2 reduziert die Variation zwischen den Durchläufen, was du möchtest, wenn dasselbe Transkript möglicherweise zweimal verarbeitet wird.
Analysiere immer defensiv. Packe json.loads in einen try-Block und wiederhole den Aufruf bei einem Fehler einmal. Fehlgeschlagene Anfragen werden nicht berechnet, und ein einzelner Wiederholungsversuch behebt die meisten einmaligen Formatierungsfehler.
Das Ergebnis an die wartende Person streamen
Wenn jemand auf eine Schaltfläche klickt und auf die Notizen wartet, zeige Text an, wie er eintrifft. Setze stream auf true, und die API sendet Server-Sent Events; die Nutzungsdaten werden am Ende des Streams angegeben.
from openai import OpenAI
client = OpenAI(base_url="https://api.whisperapis.com/v1", api_key="YOUR_KEY")
transcript = open("standup.txt", encoding="utf-8").read()
stream = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "Write concise meeting notes in Markdown with headings: Summary, Decisions, Actions."},
{"role": "user", "content": transcript},
],
stream=True,
temperature=0.3,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)Streaming hat eine operative Besonderheit: Eine gestreamte Anfrage belegt ihren Concurrency-Slot, bis der Stream endet. Ein Voll-Key erlaubt 8 parallele Anfragen, ein Trial-Key 2. Wenn ein Browser-Tab schließt und dein Server weiterliest, bleibt der Slot belegt. Brich die Upstream-Anfrage ab, wenn der Client die Verbindung trennt.
Überspringe für Batch-Jobs, die niemand beobachtet, das Streaming. Eine normale Anfrage ist einfacher, und du erhältst die gesamte Antwort in einem Objekt.
Lange Meetings und das 100k-Fenster
Das Kontextfenster umfasst 100.000 Token, gezählt aus Prompt und Antwort zusammen. Ein einstündiges Meeting hat etwa 9.000 Wörter oder rund 12.000 Token, sodass selbst ein ganztägiger Workshop in eine Anfrage passt. Das eliminiert das übliche Map-and-Reduce-Design, bei dem du ein Transkript aufteilst, jeden Teil zusammenfasst und dann die Zusammenfassungen nochmals zusammenfasst. Jeder Durchgang dabei verliert Details, und eine Entscheidung aus Minute 5, die in Minute 50 revidiert wird, wird leicht falsch wiedergegeben.
Prüfe trotzdem die Größe vor dem Senden. Eine grobe Schätzung ist die Zeichenzahl geteilt durch vier für englischen Text. Wenn du nahe am Limit bist, gibt es zwei saubere Optionen:
- Teile an natürlichen Bruchstellen wie Tagesordnungspunkten, fasse jeden Teil zusammen und übergebe die Teilnotizen an einen abschließenden Aufruf, der sie zusammenführt.
- Entferne Inhalte, die nicht relevant sind, wie lange Phasen Smalltalk vor Beginn des Meetings.
Die maximale Anfragekörpergröße beträgt 8 MB, was für Text keine praktische Grenze ist. Prompts werden nicht zum Training verwendet, was relevant ist, wenn Aufnahmen interne Pläne oder Kundennamen enthalten.
Prompt-Details, die die Ausgabe ändern
Sage, wem die Notizen gelten
„Notizen für einen Ingenieur, der das Meeting verpasst hat“ liefert andere Details als „Ein einzeiliges Update für das Executive Team“. Schreibe den Leser in den System-Prompt.
Gib dem Modell die Teilnehmerliste
Speech-to-Text verwechselt oft Namen. Eine Zeile wie „Teilnehmer: Priya Nair (PM), Tom Ortiz (Backend), Lena Fischer (Design)“ ermöglicht es dem Modell, ein Transkript zu korrigieren, das „Tom Ortis“ sagt, und Aufgaben der richtigen Person zuzuordnen.
Frag nach Entscheidungen und Aktionen getrennt
Eine Entscheidung ist etwas, dem die Gruppe zugestimmt hat. Eine Aktion ist etwas, das eine Person erledigen wird. Wenn beides in einer Liste steht, überspringen Leser sie. Getrennte Schlüssel machen die Unterscheidung explizit, und das Modell hält sich daran.
Behalte sensible Inhalte im
Echte Meetings enthalten direkte Sprache, Beschwerden über namentlich genannte Personen, rechtliche Bedenken und hitzige Auseinandersetzungen. Das Modell hier ist darauf abgestimmt, ohne Inhaltsablehnungen für die rechtmäßige Nutzung durch Erwachsene zu antworten, also fasst es zusammen, statt abzulehnen. Du behältst die Ausgabe, also prüfe die Notizen, bevor sie an Personen gehen, die nicht im Raum waren.
Einen ganzen Tag Meetings verarbeiten
Ein Team, das sechs Meetings pro Tag aufzeichnet, kann sie parallel verarbeiten. Sende mit 8 parallelen Anfragen bis zu acht gleichzeitig; ein kleiner Worker-Pool mit einem Semaphore erledigt das. Das Ratenlimit pro Minute für einen Voll-Key beträgt 300 Anfragen, was eine Meeting-Pipeline nicht erreicht.
Node funktioniert genauso wie Python. Hier ist die nicht-gestreamte Version:
import OpenAI from "openai";
import { readFileSync } from "node:fs";
const client = new OpenAI({
baseURL: "https://api.whisperapis.com/v1",
apiKey: process.env.API_KEY,
});
const transcript = readFileSync("standup.txt", "utf8");
const resp = await client.chat.completions.create({
model: "uncensored",
messages: [
{ role: "system", content: "Summarize the meeting in five bullets, then list action items with owners." },
{ role: "user", content: transcript },
],
temperature: 0.2,
});
console.log(resp.choices[0].message.content);Wenn du HTTP 429 erhältst, lies den Fehlercode. concurrency bedeutet zu viele Anfragen gleichzeitig, also reduziere die Pool-Größe. rate_limited bedeutet zu viele pro Minute. Ein 429 mit einem Retry-After: 5-Header signalisiert eine temporäre Überlastung; warte fünf Sekunden und versuche es erneut.
Notizen prüfen, bevor du ihnen vertraust
Generierte Notizen klingen selbst bei Fehlern selbstbewusst, also baue einige günstige Prüfungen in die Pipeline ein, statt darauf zu vertrauen, dass ein Mensch es bemerkt.
- Zitatprüfung. Fordere für jede Aufgabe ein kurzes unterstützendes Zitat an und suche dann im Transkript danach. Ein Zitat, das nicht erscheint, ist ein Zeichen dafür, dass die Aufgabe erfunden wurde.
- Verantwortlichenprüfung. Vergleiche jeden Verantwortlichen mit deiner Teilnehmerliste und markiere Namen, die nicht darin stehen.
- Leer-Check. Ein Meeting ohne Entscheidungen ist möglich, aber ein Ergebnis mit allen leeren Arrays für ein 40-Minuten-Transkript bedeutet meist, dass der Input abgeschnitten wurde oder die falsche Datei verwendet wurde.
- Längen-Check. Notizen, die länger sind als etwa ein Fünftel des Transkripts, sind keine Notizen; verschärfe den Prompt oder setze
max_tokens.
Logge den X-Request-Id-Antwortheader neben jedem gespeicherten Ergebnis. Wenn jemand sagt, eine Aufgabe sei falsch, lässt sich mit dieser Kennung die Anfrage finden und mit dem Transkript vergleichen. Das ursprüngliche Transkript neben den Notizen zu speichern ist günstig und klärt die meisten Streitfälle schnell.
Kosten und ein erster Test
Der Preis beträgt 0,15 $ pro Million Input-Token und 0,50 $ pro Million Output-Token. Ein einstündiges Meeting mit einem 12.000-Token-Transkript und einem 800-Token-Notizsatz kostet 0,0018 $ für Input und 0,0004 $ für Output, also insgesamt 0,0022 $. Bei diesem Satz deckt 1 $ etwa 454 solche Meetings ab. Sieh dir die Preisseite für Aufladungen an, die ab 20 $ starten und mit Karte oder Krypto bezahlt werden können.
Um es auszuprobieren, melde dich an und öffne die API-Schlüssel-Seite. Ein Ein-Klick-Testguthaben von 0,50 $ ist einmal pro Person verfügbar, gültig für 7 Tage, keine Karte erforderlich. Führe das Python-Skript oben mit einem echten Transkript aus, lies das JSON und passe den Prompt an, bis die Aufgaben mit dem übereinstimmen, was in der Besprechung passiert ist. Dann wiederhole den Vorgang für den Rest.
Weitere Anleitungen
Fragen und Antworten
Kann ich Audioaufnahmen direkt senden?
Nein. Die API nimmt nur Text entgegen. Transkribiere die Aufnahme zuerst mit einem Spracherkennungs-Tool und sende dann das Transkript.
Wie stelle ich ein konsistentes Ausgabeformat sicher?
Verwende den JSON-Modus mit einem System-Prompt, der jeden Schlüssel benennt, und setze eine niedrige Temperatur. Analysiere das Ergebnis in einem try-Block und wiederhole bei einem Fehler einmal.
Wie lang darf ein Transkript für eine einzelne Anfrage sein?
Das Kontextfenster umfasst 100.000 Token für Prompt und Antwort. Das deckt in den meisten Fällen einen ganztägigen Workshop ab.
Werden meine Transkripte zum Training verwendet?
Nein, Prompts werden nicht für das Training verwendet.
Was kostet ein Meeting?
Ein einstündiges Meeting mit einem 12.000-Token-Transkript und einer 800-Token-Zusammenfassung kostet etwa $0,0022 bei $0,15 und $0,50 pro Million Input- und Output-Token.
Dein Schlüssel ist nur ein Formular entfernt
Erstelle ein Konto, kopiere den Schlüssel, ändere die Basis-URL. Das ist die gesamte Einrichtung.