@localmode/langchain
v2.1.1
Published
LangChain.js adapters for @localmode — drop-in local inference for existing LangChain apps
Maintainers
Readme
@localmode/langchain
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.
Installation
pnpm install @localmode/langchain @localmode/core @localmode/transformersAdapters
| LangChain Class | LocalMode Adapter | Wraps |
|----------------|-------------------|-------|
| Embeddings | LocalModeEmbeddings | EmbeddingModel |
| BaseChatModel | ChatLocalMode | LanguageModel |
| VectorStore | LocalModeVectorStore | VectorDB |
| BaseDocumentCompressor | LocalModeReranker | RerankerModel |
Quick Start
Full RAG Chain
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?' });Reranker
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');Knowledge Base Engine
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?');Migration from Cloud
- 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.
Documentation
Full documentation at localmode.dev/docs/langchain.
Acknowledgments
This package is built on LangChain.js by LangChain — a framework for building applications powered by language models.
License
MIT
