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.
1. LangChain.js Setup und erste 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..."
@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
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", });
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
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];
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
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 ?? ""); }
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
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`);
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
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);
getFormatInstructions()-Integration im Prompt.
.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 →