skills-templates/langchainjs/SKILL.md
LangChain.js - TypeScript framework for building LLM-powered applications with agents, chains, RAG, tools, memory, and integrations for OpenAI, Anthropic, Google, and hundreds of other providers
npx skillsauth add enuno/claude-command-and-control langchainjsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
LangChain.js is a comprehensive TypeScript framework for building applications powered by large language models. It provides standardized interfaces for connecting LLMs with diverse data sources, tools, and external systems through a modular architecture.
Autonomous entities that use LLMs to decide which actions to take. Agents can call tools, access memory, and orchestrate complex workflows.
Sequences of operations that process inputs through multiple steps. Chains can combine prompts, LLM calls, and post-processing.
Functions that agents can call to interact with external systems (APIs, databases, web search, etc.).
Short-term and long-term context management for maintaining conversation state and persistent information.
Integration with vector stores and retrievers for finding relevant documents and context.
Structured communication format for chat-based interactions (system, human, AI, tool messages).
Constraining LLM responses to specific formats and schemas using Zod or JSON Schema.
# Install core packages
npm install langchain @langchain/core
# Or with other package managers
pnpm install langchain @langchain/core
yarn add langchain @langchain/core
bun add langchain @langchain/core
Requirement: Node.js 20+
Install provider-specific packages as needed:
# OpenAI
npm install @langchain/openai
# Anthropic
npm install @langchain/anthropic
# Google
npm install @langchain/google-genai
# AWS Bedrock
npm install @langchain/aws
# Azure OpenAI
npm install @langchain/azure-openai
# Mistral
npm install @langchain/mistralai
# Cohere
npm install @langchain/cohere
# Ollama (local models)
npm install @langchain/ollama
LangChain.js is organized as a monorepo with specialized packages:
| Package | Purpose |
|---------|---------|
| langchain | Main entry point, high-level abstractions |
| @langchain/core | Base interfaces and foundational abstractions |
| @langchain/community | Community-contributed integrations |
| @langchain/textsplitters | Text chunking utilities |
| @langchain/openai | OpenAI integration |
| @langchain/anthropic | Anthropic Claude integration |
| @langchain/google-genai | Google AI integration |
| @langchain/mcp-adapters | Model Context Protocol adapters |
import { ChatOpenAI } from "@langchain/openai";
// Initialize chat model
const model = new ChatOpenAI({
modelName: "gpt-4",
temperature: 0.7,
});
// Simple invocation
const response = await model.invoke("What is the capital of France?");
console.log(response.content);
// With message array
import { HumanMessage, SystemMessage } from "@langchain/core/messages";
const messages = [
new SystemMessage("You are a helpful assistant."),
new HumanMessage("What is the capital of France?"),
];
const result = await model.invoke(messages);
import { ChatAnthropic } from "@langchain/anthropic";
const model = new ChatAnthropic({
modelName: "claude-sonnet-4-20250514",
temperature: 0,
});
const response = await model.invoke("Explain quantum computing in simple terms.");
import { ChatOpenAI } from "@langchain/openai";
const model = new ChatOpenAI({
modelName: "gpt-4",
streaming: true,
});
// Stream tokens
const stream = await model.stream("Write a poem about coding.");
for await (const chunk of stream) {
process.stdout.write(chunk.content);
}
import { ChatPromptTemplate } from "@langchain/core/prompts";
// Create template
const prompt = ChatPromptTemplate.fromMessages([
["system", "You are a {role} expert."],
["human", "{question}"],
]);
// Format with variables
const formattedPrompt = await prompt.format({
role: "Python",
question: "How do I read a file?",
});
// Or chain with model
const chain = prompt.pipe(model);
const response = await chain.invoke({
role: "Python",
question: "How do I read a file?",
});
import { PromptTemplate } from "@langchain/core/prompts";
const template = PromptTemplate.fromTemplate(
"Translate the following to {language}: {text}"
);
const result = await template.format({
language: "Spanish",
text: "Hello, world!",
});
import { ChatOpenAI } from "@langchain/openai";
import { z } from "zod";
const model = new ChatOpenAI({
modelName: "gpt-4",
});
// Define schema
const Person = z.object({
name: z.string().describe("The person's name"),
age: z.number().describe("The person's age"),
occupation: z.string().describe("The person's job"),
});
// Use withStructuredOutput
const structuredModel = model.withStructuredOutput(Person);
const result = await structuredModel.invoke(
"Extract info: John is a 30 year old software engineer."
);
console.log(result);
// { name: "John", age: 30, occupation: "software engineer" }
const model = new ChatOpenAI({
modelName: "gpt-4-turbo",
modelKwargs: { response_format: { type: "json_object" } },
});
import { tool } from "@langchain/core/tools";
import { z } from "zod";
// Define a tool with Zod schema
const weatherTool = tool(
async ({ location }) => {
// Actual API call would go here
return `The weather in ${location} is sunny, 72°F`;
},
{
name: "get_weather",
description: "Get the current weather for a location",
schema: z.object({
location: z.string().describe("The city and state, e.g. San Francisco, CA"),
}),
}
);
// Bind tools to model
const modelWithTools = model.bindTools([weatherTool]);
import { ChatOpenAI } from "@langchain/openai";
import { createReactAgent } from "@langchain/langgraph/prebuilt";
const model = new ChatOpenAI({ modelName: "gpt-4" });
const tools = [weatherTool, searchTool, calculatorTool];
// Create ReAct agent
const agent = createReactAgent({
llm: model,
tools: tools,
});
// Run agent
const result = await agent.invoke({
messages: [{ role: "user", content: "What's the weather in NYC?" }],
});
import { ChatOpenAI } from "@langchain/openai";
import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { TavilySearchResults } from "@langchain/community/tools/tavily_search";
const model = new ChatOpenAI({ modelName: "gpt-4" });
const tools = [new TavilySearchResults()];
const agent = createReactAgent({ llm: model, tools });
const response = await agent.invoke({
messages: [{ role: "user", content: "Search for LangChain news" }],
});
import { MemorySaver } from "@langchain/langgraph";
const memory = new MemorySaver();
const agent = createReactAgent({
llm: model,
tools: tools,
checkpointSaver: memory,
});
// First conversation
const config = { configurable: { thread_id: "conversation-1" } };
await agent.invoke(
{ messages: [{ role: "user", content: "My name is Alice" }] },
config
);
// Agent remembers context
await agent.invoke(
{ messages: [{ role: "user", content: "What's my name?" }] },
config
);
// Response: "Your name is Alice"
import { ChatOpenAI } from "@langchain/openai";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";
const model = new ChatOpenAI();
const prompt = ChatPromptTemplate.fromTemplate("Tell me a joke about {topic}");
const outputParser = new StringOutputParser();
// Create chain using pipe
const chain = prompt.pipe(model).pipe(outputParser);
const result = await chain.invoke({ topic: "programming" });
import { RunnableSequence } from "@langchain/core/runnables";
const chain = RunnableSequence.from([
{
topic: (input) => input.topic,
language: (input) => input.language,
},
prompt,
model,
outputParser,
]);
const result = await chain.invoke({
topic: "cats",
language: "French",
});
import { RunnableParallel } from "@langchain/core/runnables";
const parallel = RunnableParallel.from({
joke: jokeChain,
poem: poemChain,
fact: factChain,
});
const results = await parallel.invoke({ topic: "space" });
// { joke: "...", poem: "...", fact: "..." }
import { TextLoader } from "langchain/document_loaders/fs/text";
import { PDFLoader } from "@langchain/community/document_loaders/fs/pdf";
import { WebLoader } from "langchain/document_loaders/web/cheerio";
// Load text file
const textLoader = new TextLoader("./document.txt");
const textDocs = await textLoader.load();
// Load PDF
const pdfLoader = new PDFLoader("./document.pdf");
const pdfDocs = await pdfLoader.load();
// Load web page
const webLoader = new WebLoader("https://example.com/article");
const webDocs = await webLoader.load();
import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters";
const splitter = new RecursiveCharacterTextSplitter({
chunkSize: 1000,
chunkOverlap: 200,
});
const chunks = await splitter.splitDocuments(docs);
import { OpenAIEmbeddings } from "@langchain/openai";
import { MemoryVectorStore } from "langchain/vectorstores/memory";
const embeddings = new OpenAIEmbeddings();
// Create vector store
const vectorStore = await MemoryVectorStore.fromDocuments(
chunks,
embeddings
);
// Search for similar documents
const results = await vectorStore.similaritySearch(
"What is the main topic?",
3 // Return top 3 results
);
import { ChatOpenAI } from "@langchain/openai";
import { createStuffDocumentsChain } from "langchain/chains/combine_documents";
import { createRetrievalChain } from "langchain/chains/retrieval";
const model = new ChatOpenAI();
// Create retriever from vector store
const retriever = vectorStore.asRetriever();
// Create RAG prompt
const ragPrompt = ChatPromptTemplate.fromTemplate(`
Answer the question based on the following context:
Context: {context}
Question: {input}
`);
// Build RAG chain
const combineDocsChain = await createStuffDocumentsChain({
llm: model,
prompt: ragPrompt,
});
const ragChain = await createRetrievalChain({
retriever,
combineDocsChain,
});
// Query
const response = await ragChain.invoke({
input: "What is discussed in the document?",
});
console.log(response.answer);
import { BufferMemory } from "langchain/memory";
import { ConversationChain } from "langchain/chains";
const memory = new BufferMemory();
const chain = new ConversationChain({
llm: model,
memory: memory,
});
await chain.call({ input: "Hi, I'm Bob" });
await chain.call({ input: "What's my name?" });
// Remembers: "Your name is Bob"
import { ChatMessageHistory } from "@langchain/community/stores/message/in_memory";
const messageHistory = new ChatMessageHistory();
await messageHistory.addUserMessage("Hello!");
await messageHistory.addAIMessage("Hi there! How can I help?");
const messages = await messageHistory.getMessages();
import { BaseCallbackHandler } from "@langchain/core/callbacks/base";
class MyHandler extends BaseCallbackHandler {
name = "MyHandler";
async handleLLMStart(llm, prompts) {
console.log("LLM starting with prompts:", prompts);
}
async handleLLMEnd(output) {
console.log("LLM finished:", output);
}
async handleLLMError(error) {
console.error("LLM error:", error);
}
}
const model = new ChatOpenAI({
callbacks: [new MyHandler()],
});
const model = new ChatOpenAI({
streaming: true,
callbacks: [
{
handleLLMNewToken(token) {
process.stdout.write(token);
},
},
],
});
await model.invoke("Write a story about a robot.");
import { StringOutputParser } from "@langchain/core/output_parsers";
const parser = new StringOutputParser();
const chain = prompt.pipe(model).pipe(parser);
import { JsonOutputParser } from "@langchain/core/output_parsers";
const parser = new JsonOutputParser();
import { CommaSeparatedListOutputParser } from "@langchain/core/output_parsers";
const parser = new CommaSeparatedListOutputParser();
const chain = prompt.pipe(model).pipe(parser);
const result = await chain.invoke({ topic: "colors" });
// ["red", "blue", "green", ...]
LangChain agents are built on top of LangGraph for advanced orchestration:
import { StateGraph, END } from "@langchain/langgraph";
// Define state
interface AgentState {
messages: BaseMessage[];
next: string;
}
// Create graph
const graph = new StateGraph<AgentState>({
channels: {
messages: { value: (a, b) => [...a, ...b] },
next: { value: (_, b) => b },
},
});
// Add nodes
graph.addNode("agent", agentNode);
graph.addNode("tools", toolsNode);
// Add edges
graph.addEdge("agent", "tools");
graph.addConditionalEdges("tools", shouldContinue);
// Compile
const app = graph.compile();
Monitor and debug LLM applications:
// Set environment variables
process.env.LANGCHAIN_TRACING_V2 = "true";
process.env.LANGCHAIN_API_KEY = "your-api-key";
process.env.LANGCHAIN_PROJECT = "my-project";
// All LangChain operations are now traced
const result = await chain.invoke({ input: "Hello" });
// View traces at smith.langchain.com
// Pinecone
import { Pinecone } from "@pinecone-database/pinecone";
import { PineconeStore } from "@langchain/pinecone";
// Chroma
import { Chroma } from "@langchain/community/vectorstores/chroma";
// Supabase
import { SupabaseVectorStore } from "@langchain/community/vectorstores/supabase";
// Weaviate
import { WeaviateStore } from "@langchain/weaviate";
// Qdrant
import { QdrantVectorStore } from "@langchain/qdrant";
// File loaders
import { TextLoader } from "langchain/document_loaders/fs/text";
import { JSONLoader } from "langchain/document_loaders/fs/json";
import { CSVLoader } from "@langchain/community/document_loaders/fs/csv";
// Web loaders
import { CheerioWebBaseLoader } from "@langchain/community/document_loaders/web/cheerio";
import { PlaywrightWebBaseLoader } from "@langchain/community/document_loaders/web/playwright";
// API loaders
import { NotionLoader } from "@langchain/community/document_loaders/web/notion";
import { GitHubLoader } from "@langchain/community/document_loaders/web/github";
// Search
import { TavilySearchResults } from "@langchain/community/tools/tavily_search";
import { SerpAPI } from "@langchain/community/tools/serpapi";
// Code execution
import { PythonREPL } from "@langchain/community/tools/python";
// APIs
import { WikipediaQueryRun } from "@langchain/community/tools/wikipedia";
import { Calculator } from "@langchain/community/tools/calculator";
# OpenAI
OPENAI_API_KEY=sk-...
# Anthropic
ANTHROPIC_API_KEY=sk-ant-...
# Google
GOOGLE_API_KEY=...
# LangSmith (tracing)
LANGCHAIN_TRACING_V2=true
LANGCHAIN_API_KEY=...
LANGCHAIN_PROJECT=my-project
# Vector stores
PINECONE_API_KEY=...
PINECONE_ENVIRONMENT=...
gpt-4 or claude-sonnet-4-20250514 for complex reasoninggpt-3.5-turbo or claude-haiku for simple tasks (cost-effective)MemorySaver for conversation persistencetry {
const result = await chain.invoke(input);
} catch (error) {
if (error.message.includes("rate limit")) {
// Implement retry with backoff
} else if (error.message.includes("context length")) {
// Reduce input size
}
}
// Use LangSmith for evaluation
import { evaluate } from "langsmith/evaluation";
await evaluate(
(input) => chain.invoke(input),
{
data: "my-dataset",
evaluators: [accuracy, relevance],
}
);
export OPENAI_API_KEY=sk-...
# Or set in code
const model = new ChatOpenAI({ openAIApiKey: "sk-..." });
# Install specific provider package
npm install @langchain/openai
# Or community package
npm install @langchain/community
tools
MemPalace local-first AI memory system. Use when setting up persistent memory for Claude Code sessions, mining project files or conversation transcripts, querying past context, configuring MCP tools, managing the knowledge graph, or troubleshooting palace operations.
tools
LangSmith Python SDK — trace, evaluate, and monitor LLM applications. Covers @traceable decorator, trace context manager, Client API, evaluate() / aevaluate(), comparative evaluation, custom evaluators, dataset management, prompt caching, ASGI middleware, and pytest plugin.
development
LangGraph (Python) — build stateful, controllable agent graphs with checkpointing, streaming, persistence, interrupts, fault tolerance, and durable execution. Covers both Graph API (StateGraph) and Functional API (@entrypoint/@task).
development
LangGraph Graph API (Python) — build explicit DAG agent workflows with StateGraph, typed state, nodes, edges, Command routing, Send fan-out, checkpointers, interrupts, and streaming. Use when you need explicit control flow and graph topology.