@dltech/nestjs-langchain
v1.0.1
Published
NestJS-friendly LangChain utilities: decorator-based JSON Schema generation for tool/function calling, a streaming output parser for class-typed tool calls, LLM fallback chains, and an Observable adapter for LangChain streams.
Downloads
410
Maintainers
Readme
@dltech/nestjs-langchain
NestJS-friendly utilities for building on top of LangChain:
Ai*decorators +classToToolCall/ClassToolOutputParser— describe a tool/function call's arguments as a plain TypeScript class and get a JSON SchemaFunctionDefinitionplus a streaming output parser that validates and instantiates the result, instead of hand-writing JSON Schema.llmFallback— chain multipleRunnables as ordered fallbacks.streamToRxjs— adapt a LangChainIterableReadableStreamto an RxJSObservable.ChainProvider— a typed NestJSFactoryProvidershape for chains built fromRunnables.
Install
npm install @dltech/nestjs-langchainPeer dependencies you're expected to already have in your app: @langchain/core, langchain,
@nestjs/common, class-transformer, class-validator, reflect-metadata, rxjs, zod.
Usage
Describing a tool call as a class
import { AiToolCall, AiString, AiNumber, AiOptional, ClassToolOutputParser } from '@dltech/nestjs-langchain';
@AiToolCall({ description: 'Book a restaurant reservation' })
class BookReservationArgs {
@AiString('Name of the restaurant')
restaurant: string;
@AiNumber('Party size')
partySize: number;
@AiString('Requested time, ISO 8601')
@AiOptional
time?: string;
}
const parser = new ClassToolOutputParser(BookReservationArgs);
const { tool_choice, tools } = parser.bindLLM();
const modelWithTools = model.bind({ tools, tool_choice });
const result = await modelWithTools.pipe(parser).invoke(messages);
// result is a BookReservationArgs, validated with class-validatorFalling back between models
import { llmFallback } from '@dltech/nestjs-langchain';
const chain = llmFallback(primaryModel, secondaryModel, tertiaryModel);Streaming a LangChain stream into RxJS
import { streamToRxjs } from '@dltech/nestjs-langchain';
const stream = await chain.stream(input);
streamToRxjs(stream).subscribe((chunk) => sendToClient(chunk));