@robypag/langchain-splitter
Version:
A small wrapper module to simplify files and buffers tokenization using langchain
1 lines • 18.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/lib/pdf.ts","../src/lib/utils/errors.ts","../src/lib/plaintext.ts","../src/lib/utils/index.ts","../src/lib/word.ts","../src/index.ts","../src/lib/csv.ts","../src/lib/powerpoint.ts"],"sourcesContent":["import { PDFLoader } from \"@langchain/community/document_loaders/fs/pdf\";\nimport { RecursiveCharacterTextSplitter } from \"langchain/text_splitter\";\nimport { PdfLoadingError } from \"./utils/errors.js\";\nimport { Document } from \"langchain/document\";\n\nexport async function tokenizePDF(\n filePath: string,\n chunkSize: number = 1000,\n chunkOverlap: number = 200,\n options?: Record<string, any>,\n): Promise<Document[]> {\n try {\n // Load the PDF\n const pdfLoader = new PDFLoader(filePath, { splitPages: options?.splitByPage || false });\n const document = await pdfLoader.load();\n const splitter = new RecursiveCharacterTextSplitter({\n chunkSize: chunkSize,\n chunkOverlap: chunkOverlap,\n });\n const fullText = document.map((d) => d.pageContent).join(\"\\n\\n\");\n\n const totalChars = fullText.length;\n const estimatedChunks = Math.ceil((totalChars - chunkOverlap) / (chunkSize - chunkOverlap));\n console.log(`Total chars: ${totalChars}`);\n console.log(`Estimated chunks: ~${estimatedChunks}`);\n\n return await splitter.createDocuments([fullText]);\n } catch (error: any) {\n console.error(\"Error tokenizing PDF:\", error);\n if (error instanceof Error) {\n throw new PdfLoadingError(error.message);\n } else throw new PdfLoadingError(`An error occurred while loading the PDF file at ${filePath}`);\n }\n}\n\nasync function splitByPage(splitter: RecursiveCharacterTextSplitter, pages: Document<Record<string, any>>[]) {\n const allChunks = [];\n for (const page of pages) {\n const chunks = await splitter.createDocuments([page.pageContent]);\n chunks.forEach((c) => (c.metadata = { ...c.metadata, pageNumber: page.metadata?.pageNumber }));\n allChunks.push(...chunks);\n }\n return allChunks;\n}\n","export class PdfLoadingError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PdfLoadingError\";\n }\n}\n\nexport class TextLoadingError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"TextLoadingError\";\n }\n}\n\nexport class CsvLoadingError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CsvLoadingError\";\n }\n }\n\nexport class WordLoadingError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"WordLoadingError\";\n }\n}\n\nexport class PowerpointLoadingError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PowerpointLoadingError\";\n }\n }\n\nexport class UnrecognizableFileType extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"UnrecognizableFileType\";\n }\n}\n\nexport class UnsupportedFileType extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"UnsupportedFileType\";\n }\n}\n","import { RecursiveCharacterTextSplitter } from \"langchain/text_splitter\";\nimport { TextLoader } from \"langchain/document_loaders/fs/text\";\nimport { TextLoadingError } from \"./utils/errors.js\";\nimport { Document } from \"langchain/document\";\n\nexport async function tokenizePlaintextFile(\n filePath: string,\n chunkSize: number = 1000,\n chunkOverlap: number = 200,\n options?: Record<string, any>,\n): Promise<Document[]> {\n try {\n // Read the file\n const textLoader = new TextLoader(filePath);\n const document = await textLoader.load();\n const splitter = new RecursiveCharacterTextSplitter({\n chunkSize: chunkSize,\n chunkOverlap: chunkOverlap,\n });\n const fullContent = document.map((d) => d.pageContent).join(\"\\n\");\n return await splitter.createDocuments([fullContent]);\n } catch (error: any) {\n console.error(\"Error tokenizing file:\", error);\n if (error instanceof Error) {\n throw new TextLoadingError(error.message);\n } else throw new TextLoadingError(`An error occurred while loading the file at ${filePath}`);\n }\n}\n","import * as fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport { Readable } from \"stream\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { pipeline } from 'stream/promises';\n\nexport async function writeTempFile(content: string | Buffer | Readable, extension: string): Promise<string> {\n const tempDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), \"tokenize-\"));\n const tempFilePath = path.join(tempDir, `temp-${uuidv4()}.${extension}`);\n\n // Write the content to the temporary file\n if (typeof content === \"string\") {\n await fs.promises.writeFile(tempFilePath, content, \"utf8\");\n } else if (content instanceof Buffer) {\n await fs.promises.writeFile(tempFilePath, content);\n } else if (content instanceof Readable) {\n const writeStream = fs.createWriteStream(tempFilePath);\n await pipeline(content, writeStream);\n }\n return tempFilePath;\n}\n\nexport async function removeTempFile(filePath: string): Promise<void> {\n try {\n await fs.promises.unlink(filePath);\n await fs.promises.rmdir(path.dirname(filePath));\n } catch (cleanupError) {\n console.error(\"Error cleaning up temporary file:\", cleanupError);\n }\n}\n","import { Document } from \"langchain/document\";\nimport { DocxLoader } from \"@langchain/community/document_loaders/fs/docx\";\nimport { RecursiveCharacterTextSplitter } from \"langchain/text_splitter\";\nimport { WordLoadingError } from \"./utils/errors.js\";\n\nexport async function tokenizeWordDocument(\n filePath: string,\n chunkSize: number = 1000,\n chunkOverlap: number = 200,\n options?: Record<string, any>,\n): Promise<Document[]> {\n try {\n // Step 1: Read the Word document\n const docxBuffer = new DocxLoader(filePath);\n const document = await docxBuffer.load();\n const splitter = new RecursiveCharacterTextSplitter({\n chunkSize: chunkSize,\n chunkOverlap: chunkOverlap,\n });\n return options?.splitByPage\n ? await splitter.splitDocuments(document)\n : await splitter.createDocuments([document.map((d) => d.pageContent).join(\"\\n\\n\")]);\n } catch (error) {\n console.error(\"Error tokenizing Word document:\", error);\n if (error instanceof Error) {\n throw new WordLoadingError(error.message);\n } else throw new WordLoadingError(`An error occurred while loading the PDF file at ${filePath}`);\n }\n}\n","import { tokenizePDF } from \"./lib/pdf.js\";\nimport { tokenizePlaintextFile } from \"./lib/plaintext.js\";\nimport { removeTempFile, writeTempFile } from \"./lib/utils/index.js\";\nimport { UnrecognizableFileType, UnsupportedFileType } from \"./lib/utils/errors.js\";\nimport { tokenizeWordDocument } from \"./lib/word.js\";\nimport { lookup } from \"mime-types\";\nimport { Document } from \"langchain/document\";\nimport { tokenizeCsvFile } from \"./lib/csv.js\";\nimport { Readable } from \"node:stream\";\nimport { tokenizePowerpointDocument } from \"./lib/powerpoint.js\";\n\nexport interface DocumentChunk {\n id?: string | undefined;\n metadata: Record<string, any>;\n content: string;\n}\n\nexport type TokenizeFunction = (\n filePath: string,\n chunkSize: number,\n chunkOverlap: number,\n options?: Record<string, any>,\n) => Promise<Document[]>;\n\nconst fileHandlers: Record<string, TokenizeFunction> = {\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": tokenizeWordDocument,\n \"application/msword\": tokenizeWordDocument,\n \"application/vnd.ms-powerpoint\": tokenizePowerpointDocument,\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\": tokenizePowerpointDocument,\n \"application/pdf\": tokenizePDF,\n \"text/csv\": tokenizeCsvFile,\n};\n\nconst defaultHandler: TokenizeFunction = tokenizePlaintextFile;\n\nconst streamToBuffer = async (stream: Readable): Promise<Buffer> => {\n const chunks = [];\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n return Buffer.concat(chunks);\n};\n\nexport async function tokenizeFile(\n filePath: string,\n chunkOverlap: number = 200,\n chunkSize: number = 1000,\n options?: Record<string, any>,\n): Promise<DocumentChunk[]> {\n // Determine the mime type of the given filepath:\n let mimeType = lookup(filePath);\n if (mimeType === false) {\n throw new UnrecognizableFileType(`The filetype provided at path ${filePath} is unrecognizable`);\n }\n\n const handler = fileHandlers[mimeType] || (mimeType.startsWith(\"text/\") ? defaultHandler : null);\n if (!handler) {\n throw new UnsupportedFileType(\n `The filetype provided at path ${filePath} is not supported (mime type: ${mimeType})`,\n );\n }\n const document = await handler(filePath, chunkSize, chunkOverlap, options);\n\n // * Convert Langchain dependency to a common structure:\n return document.map((doc: Document, index: number) => {\n return {\n id: doc.id ?? `idx-${index}`,\n metadata: doc.metadata,\n content: doc.pageContent,\n };\n });\n}\n\nexport async function tokenizeFromBufferOrString(\n content: Buffer | string | Readable,\n extension: string,\n chunkOverlap: number = 200,\n chunkSize: number = 1000,\n options?: Record<string, any>,\n): Promise<DocumentChunk[]> {\n let tempFilePath: string | null = null;\n try {\n // Convert streams to buffers:\n const fileData: Buffer | string = content instanceof Readable ? await streamToBuffer(content) : content;\n // Create a temporary file\n tempFilePath = await writeTempFile(fileData, extension);\n // Tokenize the file using the existing tokenizeFile function\n return await tokenizeFile(tempFilePath, chunkOverlap, chunkSize, options);\n } catch (error) {\n console.error(\"Error during tokenization:\", error);\n throw error;\n } finally {\n // Clean up: delete the temporary file\n if (tempFilePath) {\n await removeTempFile(tempFilePath);\n }\n }\n}\n","import { RecursiveCharacterTextSplitter } from \"langchain/text_splitter\";\nimport { CSVLoader } from \"@langchain/community/document_loaders/fs/csv\";\nimport { CsvLoadingError } from \"./utils/errors.js\";\nimport { Document } from \"langchain/document\";\n\nexport async function tokenizeCsvFile(\n filePath: string,\n chunkSize: number = 1000,\n chunkOverlap: number = 200,\n options?: Record<string, any>,\n): Promise<Document[]> {\n try {\n // Read the file\n const textLoader = new CSVLoader(filePath);\n const document = await textLoader.load();\n const splitter = new RecursiveCharacterTextSplitter({\n chunkSize: chunkSize,\n chunkOverlap: chunkOverlap,\n });\n const fullContent = document.map((d) => d.pageContent).join(\"\\n\");\n return await splitter.createDocuments([fullContent]);\n } catch (error: any) {\n console.error(\"Error tokenizing file:\", error);\n if (error instanceof Error) {\n throw new CsvLoadingError(error.message);\n } else throw new CsvLoadingError(`An error occurred while loading the file at ${filePath}`);\n }\n}\n","import { Document } from \"langchain/document\";\nimport { PPTXLoader } from \"@langchain/community/document_loaders/fs/pptx\";\nimport { RecursiveCharacterTextSplitter } from \"langchain/text_splitter\";\nimport { PowerpointLoadingError } from \"./utils/errors.js\";\n\nexport async function tokenizePowerpointDocument(\n filePath: string,\n chunkSize: number = 1000,\n chunkOverlap: number = 200,\n options?: Record<string, any>,\n): Promise<Document[]> {\n try {\n // Step 1: Read the Word document\n const pptxBuffer = new PPTXLoader(filePath);\n const document = await pptxBuffer.load();\n const splitter = new RecursiveCharacterTextSplitter({\n chunkSize: chunkSize,\n chunkOverlap: chunkOverlap,\n });\n return options?.splitByPage\n ? await splitter.splitDocuments(document)\n : await splitter.createDocuments([document.map((d) => d.pageContent).join(\"\\n\\n\")]);\n } catch (error) {\n console.error(\"Error tokenizing Powerpoint document:\", error);\n if (error instanceof Error) {\n throw new PowerpointLoadingError(error.message);\n } else throw new PowerpointLoadingError(`An error occurred while loading the Powerpoint file at ${filePath}`);\n }\n}\n"],"mappings":"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","names":["RecursiveCharacterTextSplitter","RecursiveCharacterTextSplitter","RecursiveCharacterTextSplitter","RecursiveCharacterTextSplitter","RecursiveCharacterTextSplitter","RecursiveCharacterTextSplitter","Readable","RecursiveCharacterTextSplitter","RecursiveCharacterTextSplitter","Readable"]}