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
Jawaban singkat
Instal LangChain
Tutorial ini menggunakan pembagian paket LangChain JS saat ini - primitif inti, integrasi OpenAI, dan text splitter masing-masing berada di paketnya sendiri:
npm install langchain @langchain/core @langchain/openai @langchain/textsplittersAmbil transkrip
Dapatkan kunci dari dashboard (100 kredit gratis, tanpa kartu), lalu panggil endpoint transkrip dari route handler Next.js:
// 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 adalah transkrip teks polos lengkap dan word_count adalah panjangnya - berguna untuk memutuskan apakah langkah chunking bisa dilewati sepenuhnya pada video pendek.
Pecah transkrip menjadi potongan
Transkrip yang panjang bisa dengan mudah melebihi apa yang nyaman dikirim ke LLM dalam satu prompt, jadi pecah dulu. RecursiveCharacterTextSplitter mencoba memecah di paragraf, lalu kalimat, lalu kata, dalam urutan itu, agar potongan tetap terbaca alih-alih terpotong di tengah kalimat:
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 menyimpan sedikit konteks dari akhir satu potongan ke awal potongan berikutnya, agar kalimat yang terbelah di batas tidak hilang dari kedua potongan.
Ringkas setiap potongan
ChatPromptTemplate + model + StringOutputParser yang di-pipe bersama (bahasa ekspresi LangChain, LCEL) adalah cara terkini dan stabil untuk membangun sebuah chain - setiap potongan mendapat ringkasan singkatnya sendiri secara paralel:
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 }))
);Menjalankannya secara paralel dengan Promise.all penting untuk latensi: transkrip 10 potongan yang diringkas satu per satu makan waktu 10 kali lebih lama daripada meringkas ke-10 nya sekaligus.
Gabungkan ringkasan potongan menjadi satu
Ringkasan potongan sekarang cukup singkat untuk muat bersama dalam satu prompt, jadi chain kedua menggabungkannya menjadi hasil akhir:
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 });Struktur dua tahap ini (meringkas potongan, lalu meringkas ringkasan-ringkasan itu) adalah persis yang dilakukan pola map-reduce bawaan LangChain di baliknya - ditulis eksplisit di sini alih-alih memakai chain bantuan lama, karena API summarization-chain bantuan telah berubah antar versi LangChain, dan primitif LCEL polos adalah fondasi yang lebih stabil untuk dibangun.
Mengapa mengambil transkrip dari API alih-alih men-scrape sendiri
Langkah pengambilan transkrip di atas adalah satu-satunya bagian dari pipeline ini yang benar-benar menjadi lebih sulit di produksi - pustaka scraping yang di-hosting sendiri sering terblokir begitu di-deploy ke server cloud. YouTube Transcript API yang di-hosting dibangun khusus untuk menjaga langkah itu tetap berfungsi, sehingga sisa pipeline ini tidak perlu memikirkannya.
Referensi endpoint lengkap, autentikasi, dan batas laju ada di dokumentasi API. Dapatkan kunci dengan 100 kredit gratis dari dashboard untuk mencoba ini dari awal sampai akhir.
FAQ peringkas LangChain
Apakah saya perlu memecah video pendek juga?
Tidak selalu - cek dulu word_count dari respons transkrip. Transkrip video 10 menit biasanya jauh di bawah kapasitas satu prompt LLM modern, jadi Anda bisa langsung ke satu panggilan ringkasan dan lewati sepenuhnya langkah chunking/penggabungan.
Mengapa RecursiveCharacterTextSplitter alih-alih pemotongan karakter tetap?
Pemotongan tetap memotong di mana pun hitungan karakter jatuh, mungkin di tengah kalimat atau kata. RecursiveCharacterTextSplitter mencoba jeda paragraf dulu, lalu kalimat, lalu kata, baru kembali ke potongan keras jika terpaksa - jadi potongan tetap koheren untuk diringkas model.
Bisakah saya memakai penyedia LLM lain selain OpenAI?
Bisa - kelas chat model LangChain berbagi antarmuka yang sama, jadi mengganti ChatOpenAI dengan integrasi LangChain penyedia lain (Anthropic, Google, dll.) tidak mengubah apa pun di bagian lain pipeline.
Mengapa menggabungkan prompt, model, dan output parser lewat pipe alih-alih memakai LLMChain?
LLMChain adalah API pembangunan chain lama milik LangChain. Gaya pipe/LCEL (prompt.pipe(model).pipe(parser)) adalah pola yang direkomendasikan saat ini - lebih terprediksi saat disusun dan menjadi dasar dokumentasi terbaru LangChain.
Berapa biaya menjalankan ini?
Dua biaya: panggilan LLM (satu per potongan, plus satu untuk menggabungkan - ditagih oleh penyedia model Anda), dan 1 kredit per pengambilan transkrip dari API. 100 kredit gratis menutupi sisi pengambilan selama pengujian.
Apa yang terjadi jika video sama sekali tidak punya transkrip?
Endpoint transkrip mengembalikan kode error yang jelas (TRANSCRIPT_DISABLED atau TRANSCRIPT_NOT_FOUND) alih-alih string kosong - cek success: false sebelum menyerahkan apa pun ke text splitter, karena meringkas transkrip kosong membuang panggilan LLM percuma.
Terkait
- YouTube API Quota Exceeded: Causes and Fixes
- YouTube Transcript API Rate Limit: What It Is and How to Handle 429s
- YouTube Transcript MCP Server: Setup Guide for Claude and Other AI Tools
- YouTube Transcripts in n8n: HTTP Request Workflow Guide
- Migrating from Supadata: A Field Guide
- How to Get YouTube Transcripts in Python
- Migrating from TranscriptAPI.com: A Field Guide
- GetYouTubeTranscript vs TranscriptAPI
- GetYouTubeTranscript vs youtubetotranscript.com
- GetYouTubeTranscript vs youtube-transcript.io
- GetYouTubeTranscript vs NoteGPT