ocr-ai 1.0.1 → 1.0.2

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/README.md CHANGED
@@ -13,14 +13,14 @@ npm install ocr-ai
13
13
  ### Using Gemini
14
14
 
15
15
  ```typescript
16
- import { ExtractaAI } from 'ocr-ai';
16
+ import { OcrAI } from 'ocr-ai';
17
17
 
18
- const extracta = new ExtractaAI({
18
+ const ocr = new OcrAI({
19
19
  provider: 'gemini',
20
20
  apiKey: 'YOUR_GEMINI_API_KEY',
21
21
  });
22
22
 
23
- const result = await extracta.extract('./invoice.png');
23
+ const result = await ocr.extract('./invoice.png');
24
24
 
25
25
  if (result.success) {
26
26
  const text = result.content;
@@ -31,14 +31,14 @@ if (result.success) {
31
31
  ### Using OpenAI
32
32
 
33
33
  ```typescript
34
- import { ExtractaAI } from 'ocr-ai';
34
+ import { OcrAI } from 'ocr-ai';
35
35
 
36
- const extracta = new ExtractaAI({
36
+ const ocr = new OcrAI({
37
37
  provider: 'openai',
38
38
  apiKey: 'YOUR_OPENAI_API_KEY',
39
39
  });
40
40
 
41
- const result = await extracta.extract('./document.pdf');
41
+ const result = await ocr.extract('./document.pdf');
42
42
 
43
43
  if (result.success) {
44
44
  const text = result.content;
@@ -46,12 +46,31 @@ if (result.success) {
46
46
  }
47
47
  ```
48
48
 
49
+ ### Custom Model
50
+
51
+ You can specify a custom model for any provider:
52
+
53
+ ```typescript
54
+ const ocr = new OcrAI({
55
+ provider: 'gemini',
56
+ apiKey: 'YOUR_GEMINI_API_KEY',
57
+ model: 'gemini-2.0-flash', // Use a specific model
58
+ });
59
+
60
+ // Or with OpenAI
61
+ const ocrOpenAI = new OcrAI({
62
+ provider: 'openai',
63
+ apiKey: 'YOUR_OPENAI_API_KEY',
64
+ model: 'gpt-4o-mini', // Use a different model
65
+ });
66
+ ```
67
+
49
68
  ### From URL
50
69
 
51
70
  Extract directly from a URL:
52
71
 
53
72
  ```typescript
54
- const result = await extracta.extract('https://example.com/invoice.png');
73
+ const result = await ocr.extract('https://example.com/invoice.png');
55
74
 
56
75
  if (result.success) {
57
76
  console.log(result.content);
@@ -63,7 +82,7 @@ if (result.success) {
63
82
  You can provide custom instructions to guide the extraction:
64
83
 
65
84
  ```typescript
66
- const result = await extracta.extract('./receipt.png', {
85
+ const result = await ocr.extract('./receipt.png', {
67
86
  prompt: 'Extract only the total amount and date from this receipt',
68
87
  });
69
88
 
@@ -79,7 +98,7 @@ By default, extraction returns text. You can also extract structured JSON:
79
98
 
80
99
  ```typescript
81
100
  // Text output (default)
82
- const textResult = await extracta.extract('./invoice.png', {
101
+ const textResult = await ocr.extract('./invoice.png', {
83
102
  format: 'text',
84
103
  });
85
104
 
@@ -88,7 +107,7 @@ if (textResult.success) {
88
107
  }
89
108
 
90
109
  // JSON output with schema
91
- const jsonResult = await extracta.extract('./invoice.png', {
110
+ const jsonResult = await ocr.extract('./invoice.png', {
92
111
  format: 'json',
93
112
  schema: {
94
113
  invoice_number: 'string',
@@ -173,7 +192,7 @@ const invoiceSchema = {
173
192
  total: 'number',
174
193
  };
175
194
 
176
- const result = await extracta.extract('./invoice.png', {
195
+ const result = await ocr.extract('./invoice.png', {
177
196
  format: 'json',
178
197
  schema: invoiceSchema,
179
198
  prompt: 'Extract all invoice data from this document.',
@@ -186,7 +205,7 @@ You can pass model-specific parameters like temperature, max tokens, and more:
186
205
 
187
206
  ```typescript
188
207
  // Gemini with model config
189
- const result = await extracta.extract('./invoice.png', {
208
+ const result = await ocr.extract('./invoice.png', {
190
209
  modelConfig: {
191
210
  temperature: 0.2,
192
211
  maxTokens: 4096,
@@ -196,7 +215,7 @@ const result = await extracta.extract('./invoice.png', {
196
215
  });
197
216
 
198
217
  // OpenAI with model config
199
- const result = await extracta.extract('./invoice.png', {
218
+ const result = await ocr.extract('./invoice.png', {
200
219
  modelConfig: {
201
220
  temperature: 0,
202
221
  maxTokens: 2048,
@@ -220,7 +239,7 @@ Available options:
220
239
  Access token usage information from the metadata:
221
240
 
222
241
  ```typescript
223
- const result = await extracta.extract('./invoice.png');
242
+ const result = await ocr.extract('./invoice.png');
224
243
 
225
244
  if (result.success) {
226
245
  console.log(result.content);
@@ -269,9 +288,9 @@ The `vertex` provider enables access to Google Cloud's AI infrastructure, which
269
288
  Vertex AI uses Google Cloud authentication instead of API keys:
270
289
 
271
290
  ```typescript
272
- import { ExtractaAI } from 'ocr-ai';
291
+ import { OcrAI } from 'ocr-ai';
273
292
 
274
- const extracta = new ExtractaAI({
293
+ const ocr = new OcrAI({
275
294
  provider: 'vertex',
276
295
  vertexConfig: {
277
296
  project: 'your-gcp-project-id',
@@ -279,7 +298,7 @@ const extracta = new ExtractaAI({
279
298
  },
280
299
  });
281
300
 
282
- const result = await extracta.extract('./invoice.png');
301
+ const result = await ocr.extract('./invoice.png');
283
302
  ```
284
303
 
285
304
  **Requirements:**
@@ -313,7 +332,7 @@ For specialized document processing beyond what Gemini models offer, Google Clou
313
332
  - Handwriting detection
314
333
  - Simple integration, ~98% accuracy on clean documents
315
334
 
316
- These services are separate from extracta-ai but can complement it for enterprise document pipelines.
335
+ These services are separate from ocr-ai but can complement it for enterprise document pipelines.
317
336
 
318
337
  ## License
319
338
 
package/dist/index.d.mts CHANGED
@@ -25,11 +25,19 @@ interface VertexConfig$1 {
25
25
  location: string;
26
26
  }
27
27
  /**
28
- * Main configuration for ExtractaAI
28
+ * Main configuration for OcrAI
29
29
  */
30
- interface ExtractaConfig {
30
+ interface OcrConfig {
31
31
  provider: AIProvider;
32
32
  apiKey?: string;
33
+ /**
34
+ * Model to use for extraction. If not specified, uses provider defaults:
35
+ * - gemini: 'gemini-1.5-flash'
36
+ * - openai: 'gpt-4o'
37
+ * - claude: 'claude-sonnet-4-20250514'
38
+ * - grok: 'grok-2-vision-1212'
39
+ * - vertex: 'gemini-2.0-flash'
40
+ */
33
41
  model?: string;
34
42
  /**
35
43
  * Vertex AI configuration (required when provider is 'vertex')
@@ -182,10 +190,10 @@ interface IAIProvider {
182
190
  /**
183
191
  * Main class for document extraction using AI
184
192
  */
185
- declare class ExtractaAI {
193
+ declare class OcrAI {
186
194
  private provider;
187
195
  private config;
188
- constructor(config: ExtractaConfig);
196
+ constructor(config: OcrConfig);
189
197
  /**
190
198
  * Create a provider instance based on configuration
191
199
  */
@@ -224,9 +232,9 @@ declare class ExtractaAI {
224
232
  setProvider(provider: AIProvider, apiKey: string, model?: string): void;
225
233
  }
226
234
  /**
227
- * Factory function to create ExtractaAI instance
235
+ * Factory function to create OcrAI instance
228
236
  */
229
- declare function createExtractaAI(config: ExtractaConfig): ExtractaAI;
237
+ declare function createOcrAI(config: OcrConfig): OcrAI;
230
238
 
231
239
  /**
232
240
  * Load a file from disk and prepare it for AI processing
@@ -352,4 +360,4 @@ declare class VertexProvider extends BaseProvider {
352
360
  private buildContents;
353
361
  }
354
362
 
355
- export { type AIProvider, BaseProvider, ClaudeProvider, ExtractaAI, type ExtractaConfig, type ExtractionError, type ExtractionMetadata, type ExtractionOptions, type ExtractionResult, type FileInfo, GeminiProvider, GrokProvider, type IAIProvider, type JsonExtractionResult, type ModelConfig, OpenAIProvider, type OutputFormat, type ProviderConfig, type SupportedFileType, type TextExtractionResult, type TokenUsage, type VertexConfig$1 as VertexConfig, VertexProvider, createExtractaAI, getSupportedExtensions, isExtensionSupported, isUrl, loadFile, loadFileFromBase64, loadFileFromBuffer, loadFileFromUrl, saveToFile };
363
+ export { type AIProvider, BaseProvider, ClaudeProvider, type ExtractionError, type ExtractionMetadata, type ExtractionOptions, type ExtractionResult, type FileInfo, GeminiProvider, GrokProvider, type IAIProvider, type JsonExtractionResult, type ModelConfig, OcrAI, type OcrConfig, OpenAIProvider, type OutputFormat, type ProviderConfig, type SupportedFileType, type TextExtractionResult, type TokenUsage, type VertexConfig$1 as VertexConfig, VertexProvider, createOcrAI, getSupportedExtensions, isExtensionSupported, isUrl, loadFile, loadFileFromBase64, loadFileFromBuffer, loadFileFromUrl, saveToFile };
package/dist/index.d.ts CHANGED
@@ -25,11 +25,19 @@ interface VertexConfig$1 {
25
25
  location: string;
26
26
  }
27
27
  /**
28
- * Main configuration for ExtractaAI
28
+ * Main configuration for OcrAI
29
29
  */
30
- interface ExtractaConfig {
30
+ interface OcrConfig {
31
31
  provider: AIProvider;
32
32
  apiKey?: string;
33
+ /**
34
+ * Model to use for extraction. If not specified, uses provider defaults:
35
+ * - gemini: 'gemini-1.5-flash'
36
+ * - openai: 'gpt-4o'
37
+ * - claude: 'claude-sonnet-4-20250514'
38
+ * - grok: 'grok-2-vision-1212'
39
+ * - vertex: 'gemini-2.0-flash'
40
+ */
33
41
  model?: string;
34
42
  /**
35
43
  * Vertex AI configuration (required when provider is 'vertex')
@@ -182,10 +190,10 @@ interface IAIProvider {
182
190
  /**
183
191
  * Main class for document extraction using AI
184
192
  */
185
- declare class ExtractaAI {
193
+ declare class OcrAI {
186
194
  private provider;
187
195
  private config;
188
- constructor(config: ExtractaConfig);
196
+ constructor(config: OcrConfig);
189
197
  /**
190
198
  * Create a provider instance based on configuration
191
199
  */
@@ -224,9 +232,9 @@ declare class ExtractaAI {
224
232
  setProvider(provider: AIProvider, apiKey: string, model?: string): void;
225
233
  }
226
234
  /**
227
- * Factory function to create ExtractaAI instance
235
+ * Factory function to create OcrAI instance
228
236
  */
229
- declare function createExtractaAI(config: ExtractaConfig): ExtractaAI;
237
+ declare function createOcrAI(config: OcrConfig): OcrAI;
230
238
 
231
239
  /**
232
240
  * Load a file from disk and prepare it for AI processing
@@ -352,4 +360,4 @@ declare class VertexProvider extends BaseProvider {
352
360
  private buildContents;
353
361
  }
354
362
 
355
- export { type AIProvider, BaseProvider, ClaudeProvider, ExtractaAI, type ExtractaConfig, type ExtractionError, type ExtractionMetadata, type ExtractionOptions, type ExtractionResult, type FileInfo, GeminiProvider, GrokProvider, type IAIProvider, type JsonExtractionResult, type ModelConfig, OpenAIProvider, type OutputFormat, type ProviderConfig, type SupportedFileType, type TextExtractionResult, type TokenUsage, type VertexConfig$1 as VertexConfig, VertexProvider, createExtractaAI, getSupportedExtensions, isExtensionSupported, isUrl, loadFile, loadFileFromBase64, loadFileFromBuffer, loadFileFromUrl, saveToFile };
363
+ export { type AIProvider, BaseProvider, ClaudeProvider, type ExtractionError, type ExtractionMetadata, type ExtractionOptions, type ExtractionResult, type FileInfo, GeminiProvider, GrokProvider, type IAIProvider, type JsonExtractionResult, type ModelConfig, OcrAI, type OcrConfig, OpenAIProvider, type OutputFormat, type ProviderConfig, type SupportedFileType, type TextExtractionResult, type TokenUsage, type VertexConfig$1 as VertexConfig, VertexProvider, createOcrAI, getSupportedExtensions, isExtensionSupported, isUrl, loadFile, loadFileFromBase64, loadFileFromBuffer, loadFileFromUrl, saveToFile };
package/dist/index.js CHANGED
@@ -827,8 +827,8 @@ async function loadFileFromUrl(url) {
827
827
  };
828
828
  }
829
829
 
830
- // src/extracta.ts
831
- var ExtractaAI = class {
830
+ // src/ocr.ts
831
+ var OcrAI = class {
832
832
  provider;
833
833
  config;
834
834
  constructor(config) {
@@ -989,18 +989,18 @@ var ExtractaAI = class {
989
989
  this.provider = this.createProvider(this.config);
990
990
  }
991
991
  };
992
- function createExtractaAI(config) {
993
- return new ExtractaAI(config);
992
+ function createOcrAI(config) {
993
+ return new OcrAI(config);
994
994
  }
995
995
 
996
996
  exports.BaseProvider = BaseProvider;
997
997
  exports.ClaudeProvider = ClaudeProvider;
998
- exports.ExtractaAI = ExtractaAI;
999
998
  exports.GeminiProvider = GeminiProvider;
1000
999
  exports.GrokProvider = GrokProvider;
1000
+ exports.OcrAI = OcrAI;
1001
1001
  exports.OpenAIProvider = OpenAIProvider;
1002
1002
  exports.VertexProvider = VertexProvider;
1003
- exports.createExtractaAI = createExtractaAI;
1003
+ exports.createOcrAI = createOcrAI;
1004
1004
  exports.getSupportedExtensions = getSupportedExtensions;
1005
1005
  exports.isExtensionSupported = isExtensionSupported;
1006
1006
  exports.isUrl = isUrl;
package/dist/index.js.map CHANGED
@@ -1 +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":["GoogleGenerativeAI","DEFAULT_MODEL","OpenAI","Anthropic","GoogleGenAI","path","fs"],"mappings":"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","file":"index.js","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"]}
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/ocr.ts"],"names":["GoogleGenerativeAI","DEFAULT_MODEL","OpenAI","Anthropic","GoogleGenAI","path","fs"],"mappings":"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","file":"index.js","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 OcrConfig,\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 OcrAI {\n private provider: IAIProvider;\n private config: OcrConfig;\n\n constructor(config: OcrConfig) {\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: OcrConfig): 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 OcrAI instance\n */\nexport function createOcrAI(config: OcrConfig): OcrAI {\n return new OcrAI(config);\n}\n"]}
package/dist/index.mjs CHANGED
@@ -800,8 +800,8 @@ async function loadFileFromUrl(url) {
800
800
  };
801
801
  }
802
802
 
803
- // src/extracta.ts
804
- var ExtractaAI = class {
803
+ // src/ocr.ts
804
+ var OcrAI = class {
805
805
  provider;
806
806
  config;
807
807
  constructor(config) {
@@ -962,10 +962,10 @@ var ExtractaAI = class {
962
962
  this.provider = this.createProvider(this.config);
963
963
  }
964
964
  };
965
- function createExtractaAI(config) {
966
- return new ExtractaAI(config);
965
+ function createOcrAI(config) {
966
+ return new OcrAI(config);
967
967
  }
968
968
 
969
- export { BaseProvider, ClaudeProvider, ExtractaAI, GeminiProvider, GrokProvider, OpenAIProvider, VertexProvider, createExtractaAI, getSupportedExtensions, isExtensionSupported, isUrl, loadFile, loadFileFromBase64, loadFileFromBuffer, loadFileFromUrl, saveToFile };
969
+ export { BaseProvider, ClaudeProvider, GeminiProvider, GrokProvider, OcrAI, OpenAIProvider, VertexProvider, createOcrAI, getSupportedExtensions, isExtensionSupported, isUrl, loadFile, loadFileFromBase64, loadFileFromBuffer, loadFileFromUrl, saveToFile };
970
970
  //# sourceMappingURL=index.mjs.map
971
971
  //# sourceMappingURL=index.mjs.map
@@ -1 +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"]}
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/ocr.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 OcrConfig,\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 OcrAI {\n private provider: IAIProvider;\n private config: OcrConfig;\n\n constructor(config: OcrConfig) {\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: OcrConfig): 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 OcrAI instance\n */\nexport function createOcrAI(config: OcrConfig): OcrAI {\n return new OcrAI(config);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ocr-ai",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Multi-provider AI document extraction library - Extract text or structured JSON from documents using Gemini, OpenAI, Grok, or Claude",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",