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

Ambil transkrip lewat API yang di-hosting, pecah menjadi potongan dengan text splitter LangChain, ringkas tiap potongan, lalu gabungkan ringkasan-ringkasan itu menjadi satu ringkasan akhir - pola map-reduce yang sama yang tetap berfungsi pada video 3 jam, bukan cuma video 5 menit.
01

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/textsplitters
02

Ambil 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.

03

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.

04

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.

05

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.

06

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

Q01

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.

Q02

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.

Q03

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.

Q04

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.

Q05

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.

Q06

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