ocr-ai 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +320 -0
- package/dist/index.d.mts +355 -0
- package/dist/index.d.ts +355 -0
- package/dist/index.js +1013 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +971 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/base.provider.ts","../src/providers/gemini.provider.ts","../src/providers/openai.provider.ts","../src/providers/claude.provider.ts","../src/providers/grok.provider.ts","../src/providers/vertex.provider.ts","../src/loaders/file.loader.ts","../src/extracta.ts"],"names":["DEFAULT_MODEL","OpenAI"],"mappings":"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","file":"index.mjs","sourcesContent":["import type {\n AIProvider,\n ExtractionOptions,\n FileInfo,\n IAIProvider,\n ProviderResult,\n SupportedFileType,\n} from '../types';\n\n/**\n * Base class for AI providers with common functionality\n */\nexport abstract class BaseProvider implements IAIProvider {\n abstract readonly name: AIProvider;\n abstract readonly model: string;\n\n protected apiKey: string;\n\n constructor(apiKey: string) {\n if (!apiKey || apiKey.trim() === '') {\n throw new Error(`API key is required for ${this.constructor.name}`);\n }\n this.apiKey = apiKey;\n }\n\n abstract extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>>;\n\n abstract extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>>;\n\n supportsFileType(type: SupportedFileType): boolean {\n return ['pdf', 'image', 'text'].includes(type);\n }\n\n /**\n * Build the text extraction prompt\n */\n protected buildTextPrompt(options?: ExtractionOptions): string {\n const basePrompt = options?.prompt || 'Extract all text content from this document.';\n const languageHint =\n options?.language && options.language !== 'auto'\n ? ` Respond in ${options.language}.`\n : '';\n\n return `${basePrompt}${languageHint}\n\nPlease extract and return all the text content from the provided document.\nMaintain the original structure and formatting as much as possible.\nReturn only the extracted text, without any additional commentary or metadata.`;\n }\n\n /**\n * Build the JSON extraction prompt\n */\n protected buildJsonPrompt(\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): string {\n const basePrompt =\n options?.prompt || 'Extract structured data from this document.';\n const languageHint =\n options?.language && options.language !== 'auto'\n ? ` Text content should be in ${options.language}.`\n : '';\n\n return `${basePrompt}${languageHint}\n\nExtract data from the provided document and return it as a JSON object following this schema:\n\n${JSON.stringify(schema, null, 2)}\n\nImportant:\n- Return ONLY valid JSON, no additional text or markdown formatting\n- Follow the schema structure exactly\n- If a field cannot be extracted, use null\n- Do not include any explanation, just the JSON object`;\n }\n\n /**\n * Parse JSON response from AI, handling potential formatting issues\n */\n protected parseJsonResponse<T>(response: string): T {\n let cleaned = response.trim();\n\n // Remove markdown code blocks if present\n if (cleaned.startsWith('```json')) {\n cleaned = cleaned.slice(7);\n } else if (cleaned.startsWith('```')) {\n cleaned = cleaned.slice(3);\n }\n\n if (cleaned.endsWith('```')) {\n cleaned = cleaned.slice(0, -3);\n }\n\n cleaned = cleaned.trim();\n\n try {\n return JSON.parse(cleaned) as T;\n } catch {\n throw new Error(`Failed to parse JSON response: ${response.substring(0, 200)}...`);\n }\n }\n}\n","import { GoogleGenerativeAI, type GenerationConfig } from '@google/generative-ai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'gemini-1.5-flash';\n\nexport class GeminiProvider extends BaseProvider {\n readonly name: AIProvider = 'gemini';\n readonly model: string;\n\n private client: GoogleGenerativeAI;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new GoogleGenerativeAI(apiKey);\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const generationConfig = this.buildGenerationConfig(options?.modelConfig);\n const model = this.client.getGenerativeModel({\n model: this.model,\n generationConfig,\n });\n const prompt = this.buildTextPrompt(options);\n\n const content = this.buildContent(file, prompt);\n const result = await model.generateContent(content);\n const response = result.response;\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.text(),\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const generationConfig = this.buildGenerationConfig(options?.modelConfig, {\n responseMimeType: 'application/json',\n });\n const model = this.client.getGenerativeModel({\n model: this.model,\n generationConfig,\n });\n\n const prompt = this.buildJsonPrompt(schema, options);\n const content = this.buildContent(file, prompt);\n\n const result = await model.generateContent(content);\n const response = result.response;\n const text = response.text();\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildGenerationConfig(\n modelConfig?: ModelConfig,\n defaults?: Partial<GenerationConfig>\n ): GenerationConfig {\n const config: GenerationConfig = { ...defaults };\n\n if (modelConfig?.temperature !== undefined) {\n config.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n config.maxOutputTokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n config.topP = modelConfig.topP;\n }\n if (modelConfig?.topK !== undefined) {\n config.topK = modelConfig.topK;\n }\n if (modelConfig?.stopSequences !== undefined) {\n config.stopSequences = modelConfig.stopSequences;\n }\n\n return config;\n }\n\n private extractTokenUsage(response: { usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number } }): TokenUsage | undefined {\n const usage = response.usageMetadata;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.promptTokenCount || 0,\n outputTokens: usage.candidatesTokenCount || 0,\n totalTokens: usage.totalTokenCount || 0,\n };\n }\n\n private buildContent(\n file: FileInfo,\n prompt: string\n ): Parameters<ReturnType<GoogleGenerativeAI['getGenerativeModel']>['generateContent']>[0] {\n if (file.type === 'text') {\n return `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`;\n }\n\n // For images and PDFs, use inline data\n return [\n {\n inlineData: {\n mimeType: file.mimeType,\n data: file.base64 || file.content.toString('base64'),\n },\n },\n { text: prompt },\n ];\n }\n}\n","import OpenAI from 'openai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'gpt-4o';\n\nexport class OpenAIProvider extends BaseProvider {\n readonly name: AIProvider = 'openai';\n readonly model: string;\n\n private client: OpenAI;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new OpenAI({ apiKey });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n });\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.choices[0]?.message?.content || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n response_format: { type: 'json_object' },\n });\n\n const text = response.choices[0]?.message?.content || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildCompletionOptions(modelConfig?: ModelConfig): Record<string, unknown> {\n const options: Record<string, unknown> = {\n max_tokens: 16384,\n };\n\n if (modelConfig?.temperature !== undefined) {\n options.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n options.max_tokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n options.top_p = modelConfig.topP;\n }\n if (modelConfig?.stopSequences !== undefined) {\n options.stop = modelConfig.stopSequences;\n }\n\n return options;\n }\n\n private extractTokenUsage(response: OpenAI.Chat.Completions.ChatCompletion): TokenUsage | undefined {\n const usage = response.usage;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n }\n\n private buildMessages(\n file: FileInfo,\n prompt: string\n ): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\n if (file.type === 'text') {\n return [\n {\n role: 'user',\n content: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`,\n },\n ];\n }\n\n // For images and PDFs\n const base64 = file.base64 || file.content.toString('base64');\n const imageUrl = `data:${file.mimeType};base64,${base64}`;\n\n return [\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imageUrl,\n detail: 'high',\n },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n },\n ];\n }\n}\n","import Anthropic from '@anthropic-ai/sdk';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, SupportedFileType, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'claude-sonnet-4-20250514';\n\ntype ImageMediaType = 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp';\n\nexport class ClaudeProvider extends BaseProvider {\n readonly name: AIProvider = 'claude';\n readonly model: string;\n\n private client: Anthropic;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new Anthropic({ apiKey });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const messageOptions = this.buildMessageOptions(options?.modelConfig);\n\n const response = await this.client.messages.create({\n model: this.model,\n messages: [\n {\n role: 'user',\n content: this.buildContent(file, prompt),\n },\n ],\n max_tokens: messageOptions.max_tokens,\n temperature: messageOptions.temperature,\n top_p: messageOptions.top_p,\n top_k: messageOptions.top_k,\n stop_sequences: messageOptions.stop_sequences,\n });\n\n const textBlock = response.content.find((block) => block.type === 'text');\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: textBlock?.text || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const messageOptions = this.buildMessageOptions(options?.modelConfig);\n\n const response = await this.client.messages.create({\n model: this.model,\n messages: [\n {\n role: 'user',\n content: this.buildContent(file, prompt),\n },\n ],\n max_tokens: messageOptions.max_tokens,\n temperature: messageOptions.temperature,\n top_p: messageOptions.top_p,\n top_k: messageOptions.top_k,\n stop_sequences: messageOptions.stop_sequences,\n });\n\n const textBlock = response.content.find((block) => block.type === 'text');\n const text = textBlock?.text || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildMessageOptions(modelConfig?: ModelConfig): {\n max_tokens: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n stop_sequences?: string[];\n } {\n const options: {\n max_tokens: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n stop_sequences?: string[];\n } = {\n max_tokens: 16384,\n };\n\n if (modelConfig?.temperature !== undefined) {\n options.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n options.max_tokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n options.top_p = modelConfig.topP;\n }\n if (modelConfig?.topK !== undefined) {\n options.top_k = modelConfig.topK;\n }\n if (modelConfig?.stopSequences !== undefined) {\n options.stop_sequences = modelConfig.stopSequences;\n }\n\n return options;\n }\n\n supportsFileType(type: SupportedFileType): boolean {\n // Claude supports images and PDFs via vision\n return ['pdf', 'image', 'text'].includes(type);\n }\n\n private extractTokenUsage(response: Anthropic.Message): TokenUsage | undefined {\n return {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n totalTokens: response.usage.input_tokens + response.usage.output_tokens,\n };\n }\n\n private buildContent(file: FileInfo, prompt: string): Anthropic.MessageCreateParams['messages'][0]['content'] {\n if (file.type === 'text') {\n return `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`;\n }\n\n const base64 = file.base64 || file.content.toString('base64');\n\n // Handle PDF files - Claude supports PDFs via base64\n if (file.type === 'pdf') {\n // For PDFs, we use the document block type\n return [\n {\n type: 'document' as const,\n source: {\n type: 'base64' as const,\n media_type: 'application/pdf' as const,\n data: base64,\n },\n },\n {\n type: 'text' as const,\n text: prompt,\n },\n ] as Anthropic.MessageCreateParams['messages'][0]['content'];\n }\n\n // Handle images\n return [\n {\n type: 'image' as const,\n source: {\n type: 'base64' as const,\n media_type: this.getMediaType(file.mimeType),\n data: base64,\n },\n },\n {\n type: 'text' as const,\n text: prompt,\n },\n ];\n }\n\n private getMediaType(mimeType: string): ImageMediaType {\n const supportedTypes: ImageMediaType[] = [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n ];\n\n if (supportedTypes.includes(mimeType as ImageMediaType)) {\n return mimeType as ImageMediaType;\n }\n\n // Default to JPEG for unsupported image types\n return 'image/jpeg';\n }\n}\n","import OpenAI from 'openai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\n// Grok uses OpenAI-compatible API\nconst GROK_BASE_URL = 'https://api.x.ai/v1';\nconst DEFAULT_MODEL = 'grok-2-vision-1212';\n\nexport class GrokProvider extends BaseProvider {\n readonly name: AIProvider = 'grok';\n readonly model: string;\n\n private client: OpenAI;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new OpenAI({\n apiKey,\n baseURL: GROK_BASE_URL,\n });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n });\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.choices[0]?.message?.content || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n });\n\n const text = response.choices[0]?.message?.content || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildCompletionOptions(modelConfig?: ModelConfig): Record<string, unknown> {\n const options: Record<string, unknown> = {\n max_tokens: 16384,\n };\n\n if (modelConfig?.temperature !== undefined) {\n options.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n options.max_tokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n options.top_p = modelConfig.topP;\n }\n if (modelConfig?.stopSequences !== undefined) {\n options.stop = modelConfig.stopSequences;\n }\n\n return options;\n }\n\n private extractTokenUsage(response: OpenAI.Chat.Completions.ChatCompletion): TokenUsage | undefined {\n const usage = response.usage;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n }\n\n private buildMessages(\n file: FileInfo,\n prompt: string\n ): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\n if (file.type === 'text') {\n return [\n {\n role: 'user',\n content: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`,\n },\n ];\n }\n\n // For images and PDFs - Grok uses OpenAI-compatible format\n const base64 = file.base64 || file.content.toString('base64');\n const imageUrl = `data:${file.mimeType};base64,${base64}`;\n\n return [\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imageUrl,\n detail: 'high',\n },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n },\n ];\n }\n}\n","import { GoogleGenAI } from '@google/genai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'gemini-2.0-flash';\n\nexport interface VertexConfig {\n project: string;\n location: string;\n}\n\nexport class VertexProvider extends BaseProvider {\n readonly name: AIProvider = 'vertex';\n readonly model: string;\n\n private client: GoogleGenAI;\n\n constructor(config: VertexConfig, model?: string) {\n super('vertex');\n this.model = model || DEFAULT_MODEL;\n this.client = new GoogleGenAI({\n vertexai: true,\n project: config.project,\n location: config.location,\n });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const generationConfig = this.buildGenerationConfig(options?.modelConfig);\n\n const response = await this.client.models.generateContent({\n model: this.model,\n contents: this.buildContents(file, prompt),\n config: generationConfig,\n });\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.text || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const generationConfig = this.buildGenerationConfig(options?.modelConfig, {\n responseMimeType: 'application/json',\n });\n\n const response = await this.client.models.generateContent({\n model: this.model,\n contents: this.buildContents(file, prompt),\n config: generationConfig,\n });\n\n const text = response.text || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildGenerationConfig(\n modelConfig?: ModelConfig,\n defaults?: Record<string, unknown>\n ): Record<string, unknown> {\n const config: Record<string, unknown> = { ...defaults };\n\n if (modelConfig?.temperature !== undefined) {\n config.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n config.maxOutputTokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n config.topP = modelConfig.topP;\n }\n if (modelConfig?.topK !== undefined) {\n config.topK = modelConfig.topK;\n }\n if (modelConfig?.stopSequences !== undefined) {\n config.stopSequences = modelConfig.stopSequences;\n }\n\n return config;\n }\n\n private extractTokenUsage(response: { usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number } }): TokenUsage | undefined {\n const usage = response.usageMetadata;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.promptTokenCount || 0,\n outputTokens: usage.candidatesTokenCount || 0,\n totalTokens: usage.totalTokenCount || 0,\n };\n }\n\n private buildContents(file: FileInfo, prompt: string): Array<{ role: string; parts: Array<{ text?: string; inlineData?: { mimeType: string; data: string } }> }> {\n if (file.type === 'text') {\n return [\n {\n role: 'user',\n parts: [\n { text: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}` },\n ],\n },\n ];\n }\n\n // For images and PDFs\n const base64 = file.base64 || file.content.toString('base64');\n\n return [\n {\n role: 'user',\n parts: [\n {\n inlineData: {\n mimeType: file.mimeType,\n data: base64,\n },\n },\n { text: prompt },\n ],\n },\n ];\n }\n}\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { FileInfo, SupportedFileType } from '../types';\n\n/**\n * MIME type to file type mapping\n */\nconst MIME_TO_FILE_TYPE: Record<string, SupportedFileType> = {\n 'application/pdf': 'pdf',\n 'image/jpeg': 'image',\n 'image/png': 'image',\n 'image/gif': 'image',\n 'image/webp': 'image',\n 'image/bmp': 'image',\n 'image/tiff': 'image',\n 'text/plain': 'text',\n 'text/markdown': 'text',\n 'text/csv': 'text',\n 'application/json': 'text',\n 'application/xml': 'text',\n 'text/html': 'text',\n};\n\n/**\n * MIME type mappings for supported file types\n */\nconst MIME_TYPES: Record<string, string> = {\n // PDF\n '.pdf': 'application/pdf',\n\n // Images\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.bmp': 'image/bmp',\n '.tiff': 'image/tiff',\n '.tif': 'image/tiff',\n\n // Text files\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.csv': 'text/csv',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.html': 'text/html',\n '.htm': 'text/html',\n};\n\n/**\n * File type categories\n */\nconst FILE_TYPE_CATEGORIES: Record<string, SupportedFileType> = {\n '.pdf': 'pdf',\n '.jpg': 'image',\n '.jpeg': 'image',\n '.png': 'image',\n '.gif': 'image',\n '.webp': 'image',\n '.bmp': 'image',\n '.tiff': 'image',\n '.tif': 'image',\n '.txt': 'text',\n '.md': 'text',\n '.csv': 'text',\n '.json': 'text',\n '.xml': 'text',\n '.html': 'text',\n '.htm': 'text',\n};\n\n/**\n * Load a file from disk and prepare it for AI processing\n */\nexport async function loadFile(filePath: string): Promise<FileInfo> {\n const absolutePath = path.resolve(filePath);\n\n // Check if file exists\n try {\n await fs.access(absolutePath);\n } catch {\n throw new Error(`File not found: ${absolutePath}`);\n }\n\n // Get file stats\n const stats = await fs.stat(absolutePath);\n\n if (!stats.isFile()) {\n throw new Error(`Path is not a file: ${absolutePath}`);\n }\n\n // Get file extension and determine type\n const ext = path.extname(absolutePath).toLowerCase();\n const fileName = path.basename(absolutePath);\n\n const mimeType = MIME_TYPES[ext];\n const fileType = FILE_TYPE_CATEGORIES[ext];\n\n if (!mimeType || !fileType) {\n throw new Error(\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\n );\n }\n\n // Read file content\n const content = await fs.readFile(absolutePath);\n\n // Prepare base64 for non-text files\n const base64 = fileType !== 'text' ? content.toString('base64') : undefined;\n\n return {\n path: absolutePath,\n name: fileName,\n type: fileType,\n mimeType,\n size: stats.size,\n content,\n base64,\n };\n}\n\n/**\n * Load a file from a Buffer\n */\nexport function loadFileFromBuffer(\n buffer: Buffer,\n fileName: string,\n mimeType?: string\n): FileInfo {\n const ext = path.extname(fileName).toLowerCase();\n const detectedMimeType = mimeType || MIME_TYPES[ext];\n const fileType = FILE_TYPE_CATEGORIES[ext];\n\n if (!detectedMimeType || !fileType) {\n throw new Error(\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\n );\n }\n\n const base64 = fileType !== 'text' ? buffer.toString('base64') : undefined;\n\n return {\n path: '',\n name: fileName,\n type: fileType,\n mimeType: detectedMimeType,\n size: buffer.length,\n content: buffer,\n base64,\n };\n}\n\n/**\n * Load a file from base64 string\n */\nexport function loadFileFromBase64(\n base64: string,\n fileName: string,\n mimeType?: string\n): FileInfo {\n // Remove data URL prefix if present\n const base64Data = base64.includes(',') ? base64.split(',')[1] : base64;\n const buffer = Buffer.from(base64Data, 'base64');\n\n const ext = path.extname(fileName).toLowerCase();\n const detectedMimeType = mimeType || MIME_TYPES[ext];\n const fileType = FILE_TYPE_CATEGORIES[ext];\n\n if (!detectedMimeType || !fileType) {\n throw new Error(\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\n );\n }\n\n return {\n path: '',\n name: fileName,\n type: fileType,\n mimeType: detectedMimeType,\n size: buffer.length,\n content: buffer,\n base64: base64Data,\n };\n}\n\n/**\n * Save content to a file\n */\nexport async function saveToFile(filePath: string, content: string | Buffer): Promise<void> {\n const absolutePath = path.resolve(filePath);\n const dir = path.dirname(absolutePath);\n\n // Ensure directory exists\n await fs.mkdir(dir, { recursive: true });\n\n // Write file\n await fs.writeFile(absolutePath, content, typeof content === 'string' ? 'utf-8' : undefined);\n}\n\n/**\n * Get supported file extensions\n */\nexport function getSupportedExtensions(): string[] {\n return Object.keys(MIME_TYPES);\n}\n\n/**\n * Check if a file extension is supported\n */\nexport function isExtensionSupported(ext: string): boolean {\n const normalizedExt = ext.startsWith('.') ? ext.toLowerCase() : `.${ext.toLowerCase()}`;\n return normalizedExt in MIME_TYPES;\n}\n\n/**\n * Check if a string is a URL\n */\nexport function isUrl(str: string): boolean {\n return str.startsWith('http://') || str.startsWith('https://');\n}\n\n/**\n * Load a file from a URL\n */\nexport async function loadFileFromUrl(url: string): Promise<FileInfo> {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch URL: ${response.status} ${response.statusText}`);\n }\n\n const contentType = response.headers.get('content-type')?.split(';')[0] || '';\n const buffer = Buffer.from(await response.arrayBuffer());\n\n // Try to get filename from URL or Content-Disposition header\n const contentDisposition = response.headers.get('content-disposition');\n let fileName = '';\n\n if (contentDisposition) {\n const match = contentDisposition.match(/filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/);\n if (match) {\n fileName = match[1].replace(/['\"]/g, '');\n }\n }\n\n if (!fileName) {\n // Extract filename from URL path\n const urlPath = new URL(url).pathname;\n fileName = path.basename(urlPath) || 'download';\n }\n\n // Determine file type from content-type header or extension\n let fileType = MIME_TO_FILE_TYPE[contentType];\n let mimeType = contentType;\n\n if (!fileType) {\n // Try to determine from file extension\n const ext = path.extname(fileName).toLowerCase();\n mimeType = MIME_TYPES[ext];\n fileType = FILE_TYPE_CATEGORIES[ext];\n }\n\n if (!fileType || !mimeType) {\n throw new Error(\n `Unsupported file type from URL. Content-Type: ${contentType}, Filename: ${fileName}`\n );\n }\n\n const base64 = fileType !== 'text' ? buffer.toString('base64') : undefined;\n\n return {\n path: url,\n name: fileName,\n type: fileType,\n mimeType,\n size: buffer.length,\n content: buffer,\n base64,\n };\n}\n","import type {\n AIProvider,\n ExtractaConfig,\n ExtractionOptions,\n ExtractionResult,\n FileInfo,\n IAIProvider,\n JsonExtractionResult,\n TextExtractionResult,\n} from './types';\nimport {\n ClaudeProvider,\n GeminiProvider,\n GrokProvider,\n OpenAIProvider,\n VertexProvider,\n} from './providers';\nimport {\n loadFile,\n loadFileFromBase64,\n loadFileFromBuffer,\n loadFileFromUrl,\n isUrl,\n saveToFile,\n} from './loaders';\n\n/**\n * Main class for document extraction using AI\n */\nexport class ExtractaAI {\n private provider: IAIProvider;\n private config: ExtractaConfig;\n\n constructor(config: ExtractaConfig) {\n this.config = config;\n this.provider = this.createProvider(config);\n }\n\n /**\n * Create a provider instance based on configuration\n */\n private createProvider(config: ExtractaConfig): IAIProvider {\n switch (config.provider) {\n case 'gemini':\n if (!config.apiKey) throw new Error('API key is required for Gemini provider');\n return new GeminiProvider(config.apiKey, config.model);\n case 'openai':\n if (!config.apiKey) throw new Error('API key is required for OpenAI provider');\n return new OpenAIProvider(config.apiKey, config.model);\n case 'claude':\n if (!config.apiKey) throw new Error('API key is required for Claude provider');\n return new ClaudeProvider(config.apiKey, config.model);\n case 'grok':\n if (!config.apiKey) throw new Error('API key is required for Grok provider');\n return new GrokProvider(config.apiKey, config.model);\n case 'vertex':\n if (!config.vertexConfig) throw new Error('vertexConfig is required for Vertex AI provider');\n return new VertexProvider(config.vertexConfig, config.model);\n default:\n throw new Error(`Unsupported provider: ${config.provider}`);\n }\n }\n\n /**\n * Extract content from a file path or URL\n */\n async extract(\n source: string,\n options?: ExtractionOptions\n ): Promise<ExtractionResult> {\n const startTime = Date.now();\n\n try {\n const file = isUrl(source)\n ? await loadFileFromUrl(source)\n : await loadFile(source);\n return this.processExtraction(file, options, startTime);\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Extract content from a Buffer\n */\n async extractFromBuffer(\n buffer: Buffer,\n fileName: string,\n options?: ExtractionOptions\n ): Promise<ExtractionResult> {\n const startTime = Date.now();\n\n try {\n const file = loadFileFromBuffer(buffer, fileName);\n return this.processExtraction(file, options, startTime);\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Extract content from a base64 string\n */\n async extractFromBase64(\n base64: string,\n fileName: string,\n options?: ExtractionOptions\n ): Promise<ExtractionResult> {\n const startTime = Date.now();\n\n try {\n const file = loadFileFromBase64(base64, fileName);\n return this.processExtraction(file, options, startTime);\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Process the extraction based on format\n */\n private async processExtraction(\n file: FileInfo,\n options: ExtractionOptions | undefined,\n startTime: number\n ): Promise<ExtractionResult> {\n const format = options?.format || 'text';\n\n // Check if provider supports the file type\n if (!this.provider.supportsFileType(file.type)) {\n return {\n success: false,\n error: `Provider ${this.provider.name} does not support file type: ${file.type}`,\n code: 'UNSUPPORTED_FILE_TYPE',\n };\n }\n\n try {\n if (format === 'json') {\n if (!options?.schema) {\n return {\n success: false,\n error: 'Schema is required for JSON extraction',\n code: 'MISSING_SCHEMA',\n };\n }\n\n const providerResult = await this.provider.extractJson(file, options.schema, options);\n const result: JsonExtractionResult = {\n success: true,\n format: 'json',\n data: providerResult.content,\n metadata: {\n provider: this.provider.name,\n model: this.provider.model,\n fileType: file.type,\n fileName: file.name,\n processingTimeMs: Date.now() - startTime,\n tokens: providerResult.tokens,\n },\n };\n\n // Save to file if outputPath is specified\n if (options.outputPath) {\n await saveToFile(options.outputPath, JSON.stringify(providerResult.content, null, 2));\n }\n\n return result;\n } else {\n const providerResult = await this.provider.extractText(file, options);\n const result: TextExtractionResult = {\n success: true,\n format: 'text',\n content: providerResult.content,\n metadata: {\n provider: this.provider.name,\n model: this.provider.model,\n fileType: file.type,\n fileName: file.name,\n processingTimeMs: Date.now() - startTime,\n tokens: providerResult.tokens,\n },\n };\n\n // Save to file if outputPath is specified\n if (options?.outputPath) {\n await saveToFile(options.outputPath, providerResult.content);\n }\n\n return result;\n }\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Create an error result\n */\n private createErrorResult(error: unknown): ExtractionResult {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: message,\n code: 'EXTRACTION_ERROR',\n };\n }\n\n /**\n * Get current provider name\n */\n getProvider(): AIProvider {\n return this.provider.name;\n }\n\n /**\n * Get current model\n */\n getModel(): string {\n return this.provider.model;\n }\n\n /**\n * Change the AI provider\n */\n setProvider(provider: AIProvider, apiKey: string, model?: string): void {\n this.config = { provider, apiKey, model };\n this.provider = this.createProvider(this.config);\n }\n}\n\n/**\n * Factory function to create ExtractaAI instance\n */\nexport function createExtractaAI(config: ExtractaConfig): ExtractaAI {\n return new ExtractaAI(config);\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ocr-ai",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Multi-provider AI document extraction library - Extract text or structured JSON from documents using Gemini, OpenAI, Grok, or Claude",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsup",
|
|
20
|
+
"dev": "tsup --watch",
|
|
21
|
+
"test": "vitest",
|
|
22
|
+
"test:run": "vitest run",
|
|
23
|
+
"test:gemini": "npx tsx test/simple-gemini-flash/index.ts",
|
|
24
|
+
"test:gemini:url": "npx tsx test/simple-gemini-url/index.ts",
|
|
25
|
+
"test:openai": "npx tsx test/simple-openai/index.ts",
|
|
26
|
+
"lint": "eslint src --ext .ts",
|
|
27
|
+
"prepublishOnly": "npm run build"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"ai",
|
|
31
|
+
"extraction",
|
|
32
|
+
"document",
|
|
33
|
+
"pdf",
|
|
34
|
+
"ocr",
|
|
35
|
+
"gemini",
|
|
36
|
+
"openai",
|
|
37
|
+
"claude",
|
|
38
|
+
"grok",
|
|
39
|
+
"text-extraction",
|
|
40
|
+
"json-extraction"
|
|
41
|
+
],
|
|
42
|
+
"author": "",
|
|
43
|
+
"license": "MIT",
|
|
44
|
+
"repository": {
|
|
45
|
+
"type": "git",
|
|
46
|
+
"url": "git+https://github.com/remdph/extracta-ai-nodejs.git"
|
|
47
|
+
},
|
|
48
|
+
"bugs": {
|
|
49
|
+
"url": "https://github.com/remdph/extracta-ai-nodejs/issues"
|
|
50
|
+
},
|
|
51
|
+
"homepage": "https://github.com/remdph/extracta-ai-nodejs#readme",
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=18.0.0"
|
|
54
|
+
},
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"@anthropic-ai/sdk": "^0.32.0",
|
|
57
|
+
"@google/genai": "^1.34.0",
|
|
58
|
+
"@google/generative-ai": "^0.21.0",
|
|
59
|
+
"openai": "^4.73.0"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@types/node": "^22.10.2",
|
|
63
|
+
"tsup": "^8.3.5",
|
|
64
|
+
"tsx": "^4.21.0",
|
|
65
|
+
"typescript": "^5.7.2",
|
|
66
|
+
"vitest": "^2.1.8"
|
|
67
|
+
}
|
|
68
|
+
}
|