LangChain.js mit Claude Code: AI-Chains und Agents 2026

LangChain.js ist das führende TypeScript-Framework für den Aufbau produktionsreifer KI-Anwendungen. In Kombination mit Claude Code — Anthropics leistungsstarkem Coding-Assistenten — lassen sich komplexe AI-Pipelines, RAG-Systeme und autonome Agents in Stunden statt Wochen entwickeln. Dieser Guide zeigt dir den vollständigen Workflow: von der ersten Chain bis zur produktionsreifen RAG-Pipeline mit strukturierten Output-Parsern.

Voraussetzungen: Node.js 20+, TypeScript 5+, ein Anthropic API-Key (oder OpenAI-Key für die OpenAI-Beispiele) sowie grundlegende TypeScript-Kenntnisse.

1. LangChain.js Setup und erste Chain

Chain

Der Einstieg in LangChain.js ist denkbar einfach. Claude Code erkennt die Package-Struktur automatisch und schlägt die richtigen Importe vor. Eine LLMChain verbindet ein PromptTemplate mit einem Sprachmodell — das Herzstück jeder LangChain-Applikation.

// Installation
// npm install langchain @langchain/anthropic @langchain/openai

import { ChatAnthropic } from "@langchain/anthropic";
import { PromptTemplate } from "@langchain/core/prompts";
import { LLMChain } from "langchain/chains";

// Modell initialisieren
const model = new ChatAnthropic({
  model: "claude-opus-4-5",
  temperature: 0.3,
  maxTokens: 1024,
});

// PromptTemplate definieren
const prompt = PromptTemplate.fromTemplate(
  "Du bist ein {rolle}. Beantworte folgende Frage auf Deutsch: {frage}"
);

// LLMChain zusammenbauen
const chain = new LLMChain({ llm: model, prompt });

// Chain aufrufen
const result = await chain.invoke({
  rolle: "TypeScript-Experte",
  frage: "Was sind die Vorteile von LangChain.js?",
});

console.log(result.text);
// → "LangChain.js bietet modulare Bausteine für AI-Applikationen..."
Claude Code Tipp: Gib in deinem Prompt an, welches Modell du verwendest. Claude Code generiert automatisch den korrekten Import-Pfad für @langchain/anthropic vs. @langchain/openai — inklusive der richtigen API-Key-Umgebungsvariablen.

Mit der modernen LCEL-Syntax (LangChain Expression Language) lassen sich Chains noch eleganter per Pipe-Operator (|) verketten:

import { StringOutputParser } from "@langchain/core/output_parsers";

// LCEL-Syntax: prompt | model | parser
const chain = prompt
  .pipe(model)
  .pipe(new StringOutputParser());

const answer = await chain.invoke({
  rolle: "Senior Developer",
  frage: "Erkläre Dependency Injection kurz.",
});
console.log(answer); // direkt als String

2. Memory: Konversationsgedächtnis für AI-Agents

Memory

Ohne Memory ist jede Chat-Interaktion zustandslos. LangChain.js bietet drei Haupt-Memory-Typen für unterschiedliche Anforderungen:

  • ConversationBufferMemory — speichert den vollständigen Gesprächsverlauf
  • ConversationSummaryMemory — fasst lange Gespräche zusammen (LLM-Kosten sparen)
  • VectorStoreRetrieverMemory — semantische Suche über Konversationshistorie
import { ConversationBufferMemory } from "langchain/memory";
import { ConversationChain } from "langchain/chains";

const memory = new ConversationBufferMemory({
  returnMessages: true,
  memoryKey: "history",
});

const conversationChain = new ConversationChain({
  llm: model,
  memory,
});

// Erster Turn
await conversationChain.invoke({ input: "Ich heiße Max und lerne TypeScript." });

// Zweiter Turn — Memory ist aktiv!
const resp = await conversationChain.invoke({
  input: "Was ist mein Name?",
});
console.log(resp.response);
// → "Dein Name ist Max."

Für lange Gespräche empfiehlt sich ConversationSummaryMemory, das automatisch zusammenfasst und so Token-Kosten reduziert:

import { ConversationSummaryMemory } from "langchain/memory";

const summaryMemory = new ConversationSummaryMemory({
  llm: model,
  // fasst automatisch zusammen wenn History zu lang wird
  maxTokenLimit: 500,
});

// VectorStoreRetrieverMemory für semantischen Kontext
import { MemoryVectorStore } from "langchain/vectorstores/memory";
import { OpenAIEmbeddings } from "@langchain/openai";
import { VectorStoreRetrieverMemory } from "langchain/memory";

const vectorStore = new MemoryVectorStore(new OpenAIEmbeddings());
const vectorMemory = new VectorStoreRetrieverMemory({
  vectorStoreRetriever: vectorStore.asRetriever(1),
  memoryKey: "relevant_history",
});
Achtung: ConversationBufferMemory wächst unbegrenzt. Bei langen Sessions immer maxTokenLimit setzen oder auf ConversationSummaryMemory wechseln — sonst explodieren die API-Kosten.

3. Tools und Tool-Calling — externe APIs einbinden

Chain

Tools ermöglichen es LLMs, auf externe Daten zuzugreifen: Wikipedia, Suchmaschinen, eigene APIs oder Datenbanken. LangChain.js bietet fertige Tools und die Möglichkeit, eigene DynamicTool-Instanzen zu erstellen.

import { DynamicTool } from "@langchain/core/tools";
import { WikipediaQueryRun } from "@langchain/community/tools/wikipedia_query_run";
import { SerpAPI } from "@langchain/community/tools/serpapi";

// Wikipedia-Tool (out of the box)
const wikiTool = new WikipediaQueryRun({
  topKResults: 3,
  maxDocContentLength: 4000,
});

// SerpAPI für aktuelle Web-Suche
const searchTool = new SerpAPI(process.env.SERPAPI_KEY, {
  location: "Germany",
  hl: "de",
  gl: "de",
});

// Custom DynamicTool für eigene APIs
const weatherTool = new DynamicTool({
  name: "get_weather",
  description: "Gibt das aktuelle Wetter für eine Stadt zurück. Input: Stadtname",
  func: async (city: string) => {
    const res = await fetch(
      `https://api.weather.example.com/v1/current?city=${city}`
    );
    const data = await res.json();
    return `${data.temp}°C, ${data.description}`;
  },
});

const tools = [wikiTool, searchTool, weatherTool];
Claude Code Tipp: Beschreibe dein Custom Tool in natürlicher Sprache. Claude Code generiert automatisch den korrekten DynamicTool-Wrapper inklusive Fehlerbehandlung und Typisierung — einfach sagen "Erstelle ein LangChain Tool, das unsere /api/products-Endpoint aufruft."

4. Agents: AgentExecutor, ReAct und Tool-Calling Agents

Agent

Agents kombinieren Tools mit LLM-Reasoning: Das Modell entscheidet selbstständig, welche Tools in welcher Reihenfolge aufgerufen werden. LangChain.js bietet mehrere Agent-Typen — createReactAgent für flexibles Reasoning, createToolCallingAgent für native Function-Calling-Modelle.

import { createReactAgent, AgentExecutor } from "langchain/agents";
import { pull } from "langchain/hub";

// ReAct-Prompt vom LangChain Hub laden
const reactPrompt = await pull("hwchase17/react");

// ReAct Agent erstellen
const reactAgent = await createReactAgent({
  llm: model,
  tools,
  prompt: reactPrompt,
});

const executor = new AgentExecutor({
  agent: reactAgent,
  tools,
  verbose: true,       // zeigt Reasoning-Schritte
  maxIterations: 5,   // Endlos-Loops verhindern
});

const agentResult = await executor.invoke({
  input: "Was ist die Hauptstadt von Bayern und wie ist das Wetter dort?",
});
console.log(agentResult.output);

Für Modelle mit nativem Function-Calling (Claude 3.5+, GPT-4o) ist createToolCallingAgent effizienter — keine manuelle Prompt-Formatierung:

import { createToolCallingAgent } from "langchain/agents";
import { ChatPromptTemplate } from "@langchain/core/prompts";

const toolCallingPrompt = ChatPromptTemplate.fromMessages([
  ["system", "Du bist ein hilfreicher Assistent mit Zugriff auf Tools."],
  ["human", "{input}"],
  ["placeholder", "{agent_scratchpad}"],
]);

const toolAgent = await createToolCallingAgent({
  llm: model,
  tools,
  prompt: toolCallingPrompt,
});

// Streaming aktivieren
const streamExecutor = new AgentExecutor({ agent: toolAgent, tools });
const stream = await streamExecutor.stream({ input: "Recherchiere LangChain.js Neuigkeiten" });

for await (const chunk of stream) {
  process.stdout.write(chunk.output ?? "");
}
Achtung: Ohne maxIterations können Agents in Endlos-Schleifen geraten und enorme API-Kosten verursachen. Immer ein Limit setzen und in Production zusätzlich ein Timeout implementieren.

5. RAG-Pipeline: Embeddings, VectorStore und RetrievalQA

RAG

Retrieval-Augmented Generation (RAG) ist das Kernmuster für wissensintensive KI-Applikationen. Die Pipeline: Dokumente laden → chunken → embedden → in VectorStore speichern → bei Queries semantisch abrufen → LLM antwortet mit relevantem Kontext.

import { PDFLoader } from "langchain/document_loaders/fs/pdf";
import { RecursiveCharacterTextSplitter } from "langchain/text_splitter";
import { Chroma } from "@langchain/community/vectorstores/chroma";
import { OpenAIEmbeddings } from "@langchain/openai";
import { RetrievalQAChain } from "langchain/chains";

// 1. Dokument laden
const loader = new PDFLoader("./technische-dokumentation.pdf");
const docs = await loader.load();

// 2. Chunking
const splitter = new RecursiveCharacterTextSplitter({
  chunkSize: 1000,
  chunkOverlap: 200,
});
const chunks = await splitter.splitDocuments(docs);

// 3. Embeddings + VectorStore (Chroma lokal)
const embeddings = new OpenAIEmbeddings({ model: "text-embedding-3-small" });
const vectorStore = await Chroma.fromDocuments(chunks, embeddings, {
  collectionName: "technische-doku",
});

// 4. RetrievalQA Chain
const ragChain = RetrievalQAChain.fromLLM(model, vectorStore.asRetriever(4), {
  returnSourceDocuments: true,
});

const ragResult = await ragChain.invoke({
  query: "Wie wird die Authentifizierung implementiert?",
});
console.log(ragResult.text);
console.log("Quellen:", ragResult.sourceDocuments.map(d => d.metadata.source));

Für noch bessere Retrievalqualität empfiehlt sich der MultiQueryRetriever, der automatisch mehrere Varianten der Query generiert:

import { MultiQueryRetriever } from "langchain/retrievers/multi_query";

const multiRetriever = MultiQueryRetriever.fromLLM({
  llm: model,
  retriever: vectorStore.asRetriever(),
  queryCount: 3,
  // generiert 3 Query-Varianten → höhere Recall-Rate
});

const relevantDocs = await multiRetriever.invoke(
  "Authentifizierung und Sicherheit"
);
console.log(`${relevantDocs.length} relevante Dokumente gefunden`);
Pinecone für Production: Ersetze Chroma durch PineconeStore aus @langchain/pinecone für skalierbaren, verwalteten VectorStore. Die API ist identisch — nur der Import und die Initialisierung ändern sich.

6. Output-Parser: Strukturierte Antworten aus LLMs

Chain

LLMs geben rohen Text zurück — Output-Parser transformieren diesen in strukturierte, typisierte Objekte. Das ist essenziell für produktionsreife Applikationen, die mit den LLM-Outputs programmatisch weiterarbeiten.

import { StructuredOutputParser } from "langchain/output_parsers";
import { z } from "zod";

// 1. StructuredOutputParser mit Zod-Schema
const productParser = StructuredOutputParser.fromZodSchema(
  z.object({
    name: z.string().describe("Produktname"),
    preis: z.number().describe("Preis in Euro"),
    kategorie: z.enum(["Software", "Hardware", "Service"]),
    features: z.array(z.string()).describe("Liste der Features"),
  })
);

const structuredPrompt = PromptTemplate.fromTemplate(
  "Beschreibe folgendes Produkt strukturiert: {produkt}\n{format_instructions}"
);

const structuredChain = structuredPrompt
  .pipe(model)
  .pipe(productParser);

const product = await structuredChain.invoke({
  produkt: "Claude Code - AI-Coding-Assistent von Anthropic",
  format_instructions: productParser.getFormatInstructions(),
});
// product ist jetzt vollständig typisiert!
console.log(product.name, product.preis, product.features);

Für einfachere Fälle gibt es den CommaSeparatedListOutputParser:

import { CommaSeparatedListOutputParser } from "@langchain/core/output_parsers";

const listParser = new CommaSeparatedListOutputParser();

const listChain = PromptTemplate.fromTemplate(
  "Nenne 5 TypeScript-Frameworks. Antworte nur mit einer kommagetrennten Liste: {topic}"
).pipe(model).pipe(listParser);

const frameworks = await listChain.invoke({ topic: "TypeScript Web Frameworks" });
console.log(frameworks);
// → ["Next.js", "Remix", "Astro", "NestJS", "Hono"]

// ZodOutputParser für komplexe verschachtelte Objekte
import { JsonOutputParser } from "@langchain/core/output_parsers";

const jsonParser = new JsonOutputParser();
const jsonChain = PromptTemplate.fromTemplate(
  "Gib Nutzerstatistiken als JSON zurück für: {app}"
).pipe(model).pipe(jsonParser);

const stats = await jsonChain.invoke({ app: "Agentic Movers" });
console.log(stats.dailyActiveUsers);
Claude Code Tipp: Zeige Claude Code dein Zod-Schema und sage "Erstelle einen LangChain StructuredOutputParser und eine passende Chain dafür." Claude Code generiert automatisch den vollständigen Code — inklusive getFormatInstructions()-Integration im Prompt.
Production-Tipp: Verwende immer .withRetry() auf deiner Chain wenn du Output-Parser einsetzt. Bei malformatierten LLM-Antworten versucht LangChain es automatisch nochmal: chain.withRetry({ stopAfterAttempt: 3 })

Bereit für produktionsreife AI-Applikationen?

Starte heute mit Claude Code und baue deine eigenen LangChain.js-Pipelines — von der ersten Chain bis zum vollständigen RAG-System. 14 Tage kostenlos, keine Kreditkarte.

14 Tage kostenlos testen →