LangChain.js adapters for LocalMode — drop-in local inference for existing LangChain applications. Swap 3 imports and go fully local.
See it live: the RAG Chat block at localmode.ai has a LangChain engine toggle that runs
LocalModeEmbeddings,LocalModeVectorStore, andChatLocalModeend-to-end in the browser — ingest, semantic search, and grounded answers through the real adapters, behind the same UI as the core pipeline.
pnpm install @localmode/langchain @localmode/core @localmode/transformers| LangChain Class | LocalMode Adapter | Wraps |
|---|---|---|
Embeddings |
LocalModeEmbeddings |
EmbeddingModel |
BaseChatModel |
ChatLocalMode |
LanguageModel |
VectorStore |
LocalModeVectorStore |
VectorDB |
BaseDocumentCompressor |
LocalModeReranker |
RerankerModel |
import { LocalModeEmbeddings, ChatLocalMode, LocalModeVectorStore } from '@localmode/langchain';
import { transformers } from '@localmode/transformers';
import { webllm } from '@localmode/webllm';
import { createVectorDB } from '@localmode/core';
import { RetrievalQAChain } from 'langchain/chains';
const embeddings = new LocalModeEmbeddings({
model: transformers.embedding('Xenova/bge-small-en-v1.5'),
});
const llm = new ChatLocalMode({
model: webllm.languageModel('Qwen3-1.7B-q4f16_1-MLC'),
});
const db = await createVectorDB({ name: 'docs', dimensions: 384 });
const store = new LocalModeVectorStore(embeddings, { db });
// Add documents
await store.addDocuments([
{ pageContent: 'LocalMode runs AI in the browser', metadata: { source: 'docs' } },
]);
// Query
const chain = RetrievalQAChain.fromLLM(llm, store.asRetriever());
const result = await chain.call({ query: 'What is LocalMode?' });import { LocalModeReranker } from '@localmode/langchain';
import { transformers } from '@localmode/transformers';
const reranker = new LocalModeReranker({
model: transformers.reranker('Xenova/ms-marco-MiniLM-L-6-v2'),
topK: 5,
});
const reranked = await reranker.compressDocuments(documents, 'search query');createLangChainKnowledgeBaseEngine() returns a kind: 'langchain' engine implementing the frozen KnowledgeBaseEngine contract from @localmode/core (chunk → embed → store, vector search, grounded ask) through the LocalModeEmbeddings / LocalModeVectorStore / ChatLocalMode adapters. It is result-equivalent to @localmode/core's createKnowledgeBaseEngine, so a knowledge base UI can toggle engines over one shared corpus. Because the models are injected, apps that never toggle the LangChain engine never pull this package.
import { createLangChainKnowledgeBaseEngine, ChatLocalMode } from '@localmode/langchain';
import { transformers } from '@localmode/transformers';
const engine = createLangChainKnowledgeBaseEngine({
embeddingModel: transformers.embedding('Xenova/bge-small-en-v1.5'),
getChatModel: () =>
new ChatLocalMode({
model: transformers.languageModel('onnx-community/granite-4.0-350m-ONNX-web'),
maxTokens: 512,
}),
});
await engine.ingest(docs, { chunking: 'recursive', chunkSize: 500 });
const hits = await engine.search('privacy and encryption', { topK: 10 });
const { answer, sources } = await engine.ask('How is data encrypted?');- import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai';
- import { PineconeStore } from '@langchain/pinecone';
+ import { ChatLocalMode, LocalModeEmbeddings, LocalModeVectorStore } from '@localmode/langchain';
+ import { transformers } from '@localmode/transformers';
+ import { webllm } from '@localmode/webllm';
- const llm = new ChatOpenAI({ modelName: 'gpt-4o-mini' });
- const embeddings = new OpenAIEmbeddings();
- const store = await PineconeStore.fromExistingIndex(embeddings, { pineconeIndex });
+ const llm = new ChatLocalMode({ model: webllm.languageModel('Qwen3-1.7B-q4f16_1-MLC') });
+ const embeddings = new LocalModeEmbeddings({ model: transformers.embedding('Xenova/bge-small-en-v1.5') });
+ const db = await createVectorDB({ name: 'docs', dimensions: 384 });
+ const store = new LocalModeVectorStore(embeddings, { db });The chain code (RetrievalQAChain.fromLLM) is identical. Only provider instantiation changes.
Full documentation at localmode.dev/docs/langchain.
This package is built on LangChain.js by LangChain — a framework for building applications powered by language models.
MIT