Zurück zum BlogIntegrationen

Build an AI YouTube Video Summarizer with LangChain and Next.js

A working YouTube summarizer built with LangChain and Next.js: fetch the transcript, chunk it with a text splitter, summarize each chunk, then combine the results into one final summary - full code for every step.

00:08:00 · SEP 26, 2026

Kurzantwort

Das Transkript über eine gehostete API abrufen, mit LangChains Text-Splitter in Abschnitte teilen, jeden Abschnitt zusammenfassen und die Abschnittszusammenfassungen dann zu einer finalen Zusammenfassung kombinieren - dasselbe Map-Reduce-Muster, das auch bei einem 3-Stunden-Video funktioniert, nicht nur bei einem 5-Minuten-Video.
01

LangChain installieren

Dieses Tutorial nutzt die aktuelle Paketaufteilung von LangChain JS - Kern-Primitiven, die OpenAI-Integration und Text-Splitter leben jeweils in ihrem eigenen Paket:

npm install langchain @langchain/core @langchain/openai @langchain/textsplitters
02

Das Transkript abrufen

Hol dir einen Schlüssel im Dashboard (100 kostenlose Credits, keine Kreditkarte nötig), und rufe dann den Transkript-Endpoint aus einem Next.js-Route-Handler auf:

// app/api/summarize/route.ts
import { NextResponse } from 'next/server';

async function fetchTranscript(videoId: string) {
  const res = await fetch(
    `https://getyoutubetranscript.com/api/v1/transcript?v=${videoId}`,
    { headers: { Authorization: `Bearer ${process.env.GETYOUTUBETRANSCRIPT_API_KEY}` } }
  );
  const json = await res.json();
  if (!json.success) throw new Error(json.message);
  // json.data.transcript is the full plain-text transcript,
  // json.data.word_count is its length in words.
  return json.data as { transcript: string; word_count: number; title: string };
}

transcript ist das vollständige Klartext-Transkript und word_count seine Länge - nützlich, um zu entscheiden, ob der Chunking-Schritt bei einem kurzen Video ganz übersprungen werden kann.

03

Das Transkript in Abschnitte aufteilen

Ein langes Transkript kann leicht überschreiten, was bequem in einem einzigen Prompt an ein LLM passt, also zuerst aufteilen. RecursiveCharacterTextSplitter versucht zuerst an Absätzen, dann an Sätzen, dann an Wörtern zu trennen, damit die Abschnitte lesbar bleiben, statt mitten im Satz abzuschneiden:

import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters';

const splitter = new RecursiveCharacterTextSplitter({
  chunkSize: 4000,
  chunkOverlap: 200,
});

const chunks = await splitter.splitText(transcript);
// A 20-minute video is usually 1-2 chunks; a 2-hour one might be 8-10.

chunkOverlap behält etwas Kontext vom Ende eines Abschnitts am Anfang des nächsten - so geht ein an der Grenze geteilter Satz für keinen der beiden verloren.

04

Jeden Abschnitt zusammenfassen

ChatPromptTemplate + ein Modell + StringOutputParser miteinander verkettet (LangChains Expression Language, LCEL) ist die aktuelle, stabile Art, eine Chain zu bauen - jeder Abschnitt bekommt parallel seine eigene kurze Zusammenfassung:

import { ChatOpenAI } from '@langchain/openai';
import { ChatPromptTemplate } from '@langchain/core/prompts';
import { StringOutputParser } from '@langchain/core/output_parsers';

const model = new ChatOpenAI({ model: 'gpt-4.1-mini', temperature: 0 });

const chunkPrompt = ChatPromptTemplate.fromTemplate(
  'Summarize this part of a video transcript in 3-4 sentences, keeping any concrete facts, numbers, or names:\n\n{chunk}'
);
const chunkChain = chunkPrompt.pipe(model).pipe(new StringOutputParser());

const chunkSummaries = await Promise.all(
  chunks.map((chunk) => chunkChain.invoke({ chunk }))
);

Diese parallel mit Promise.all auszuführen zählt für die Latenz: ein in 10 Abschnitten zusammengefasstes Transkript, einzeln nacheinander verarbeitet, dauert 10-mal so lange wie alle 10 gleichzeitig.

05

Die Abschnittszusammenfassungen zu einer kombinieren

Die Abschnittszusammenfassungen sind jetzt kurz genug, um zusammen in einen einzigen Prompt zu passen, also kombiniert eine zweite Chain sie zum Endergebnis:

const finalPrompt = ChatPromptTemplate.fromTemplate(
  'These are summaries of consecutive parts of the same video transcript, titled "{title}".\n' +
  'Combine them into one coherent summary (a short paragraph, then 3-5 key takeaways as bullet points):\n\n{summaries}'
);
const finalChain = finalPrompt.pipe(model).pipe(new StringOutputParser());

const summary = await finalChain.invoke({
  title,
  summaries: chunkSummaries.join('\n\n'),
});

return NextResponse.json({ summary });

Diese zweistufige Struktur (erst Abschnitte zusammenfassen, dann die Zusammenfassungen zusammenfassen) ist genau das, was LangChains eigenes Map-Reduce-Muster im Hintergrund macht - hier explizit ausgeschrieben statt eine veraltete Hilfs-Chain zu nutzen, da sich die APIs der Summarization-Chains über LangChain-Versionen hinweg geändert haben und einfache LCEL-Primitiven die stabilere Grundlage zum Aufbauen sind.

06

Warum das Transkript über eine API holen statt selbst zu scrapen

Der obige Schritt zum Abrufen des Transkripts ist der einzige Teil dieser Pipeline, der in Produktion wirklich schwieriger wird - selbst gehostete Scraping-Bibliotheken werden nach dem Deployment auf einem Cloud-Server häufig blockiert. Eine gehostete YouTube-Transkript-API ist speziell dafür gebaut, dass dieser Schritt weiter funktioniert, ohne dass sich der Rest dieser Pipeline darum kümmern muss.

Die vollständige Endpoint-Referenz, Authentifizierung und Rate-Limits stehen in der API-Dokumentation. Hol dir einen Schlüssel mit 100 kostenlosen Credits im Dashboard, um das komplett durchzutesten.

LangChain-Zusammenfasser FAQ

Q01

Muss ich auch kurze Videos in Abschnitte aufteilen?

Nicht unbedingt - prüfe zuerst word_count aus der Transkript-Antwort. Das Transkript eines 10-minütigen Videos passt meist locker in einen einzigen modernen LLM-Prompt, also kannst du direkt zu einem einzigen Zusammenfassungs-Aufruf gehen und die Chunking-/Kombinierschritte ganz überspringen.

Q02

Warum RecursiveCharacterTextSplitter statt eines festen Zeichen-Splits?

Ein fester Split schneidet dort, wo die Zeichenanzahl gerade landet, möglicherweise mitten im Satz oder Wort. RecursiveCharacterTextSplitter versucht zuerst Absatzumbrüche, dann Sätze, dann Wörter, und greift nur im Notfall auf einen harten Schnitt zurück - so bleiben die Abschnitte für das Modell zusammenhängend zusammenfassbar.

Q03

Kann ich einen anderen LLM-Anbieter statt OpenAI verwenden?

Ja - LangChains Chat-Model-Klassen teilen sich dieselbe Schnittstelle, ChatOpenAI gegen die LangChain-Integration eines anderen Anbieters (Anthropic, Google usw.) auszutauschen ändert sonst nichts an der Pipeline.

Q04

Warum Prompt, Modell und Output-Parser verketten statt LLMChain zu verwenden?

LLMChain ist LangChains ältere API zum Bauen von Chains. Der verkettete/LCEL-Stil (prompt.pipe(model).pipe(parser)) ist das aktuell empfohlene Muster - er lässt sich vorhersehbarer zusammensetzen und darauf baut LangChains neuere Dokumentation auf.

Q05

Was kostet die Ausführung?

Zwei Kosten: die LLM-Aufrufe (einer pro Abschnitt, plus einer zum Kombinieren - abgerechnet von deinem Modellanbieter), und 1 Credit pro Transkript-Abruf über die API. 100 kostenlose Credits decken die Abrufseite während des Testens ab.

Q06

Was passiert, wenn das Video gar kein Transkript hat?

Der Transkript-Endpoint gibt einen klaren Fehlercode zurück (TRANSCRIPT_DISABLED oder TRANSCRIPT_NOT_FOUND) statt eines leeren Strings - prüfe success: false, bevor du irgendetwas an den Text-Splitter übergibst, da das Zusammenfassen eines leeren Transkripts einen LLM-Aufruf umsonst verschwendet.

Verwandte Themen