ocr-ai 1.0.1 → 1.0.3

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/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
@@ -229,15 +229,13 @@ var OpenAIProvider = class extends BaseProvider {
229
229
  };
230
230
  }
231
231
  buildCompletionOptions(modelConfig) {
232
- const options = {
233
- max_tokens: 16384
234
- };
232
+ const options = {};
233
+ const useMaxCompletionTokens = this.model.startsWith("gpt-5") || this.model.startsWith("o1") || this.model.startsWith("o3");
234
+ const tokenParam = useMaxCompletionTokens ? "max_completion_tokens" : "max_tokens";
235
+ options[tokenParam] = modelConfig?.maxTokens ?? 16384;
235
236
  if (modelConfig?.temperature !== void 0) {
236
237
  options.temperature = modelConfig.temperature;
237
238
  }
238
- if (modelConfig?.maxTokens !== void 0) {
239
- options.max_tokens = modelConfig.maxTokens;
240
- }
241
239
  if (modelConfig?.topP !== void 0) {
242
240
  options.top_p = modelConfig.topP;
243
241
  }
@@ -827,8 +825,8 @@ async function loadFileFromUrl(url) {
827
825
  };
828
826
  }
829
827
 
830
- // src/extracta.ts
831
- var ExtractaAI = class {
828
+ // src/ocr.ts
829
+ var OcrAI = class {
832
830
  provider;
833
831
  config;
834
832
  constructor(config) {
@@ -989,18 +987,18 @@ var ExtractaAI = class {
989
987
  this.provider = this.createProvider(this.config);
990
988
  }
991
989
  };
992
- function createExtractaAI(config) {
993
- return new ExtractaAI(config);
990
+ function createOcrAI(config) {
991
+ return new OcrAI(config);
994
992
  }
995
993
 
996
994
  exports.BaseProvider = BaseProvider;
997
995
  exports.ClaudeProvider = ClaudeProvider;
998
- exports.ExtractaAI = ExtractaAI;
999
996
  exports.GeminiProvider = GeminiProvider;
1000
997
  exports.GrokProvider = GrokProvider;
998
+ exports.OcrAI = OcrAI;
1001
999
  exports.OpenAIProvider = OpenAIProvider;
1002
1000
  exports.VertexProvider = VertexProvider;
1003
- exports.createExtractaAI = createExtractaAI;
1001
+ exports.createOcrAI = createOcrAI;
1004
1002
  exports.getSupportedExtensions = getSupportedExtensions;
1005
1003
  exports.isExtensionSupported = isExtensionSupported;
1006
1004
  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 {\r\n AIProvider,\r\n ExtractionOptions,\r\n FileInfo,\r\n IAIProvider,\r\n ProviderResult,\r\n SupportedFileType,\r\n} from '../types';\r\n\r\n/**\r\n * Base class for AI providers with common functionality\r\n */\r\nexport abstract class BaseProvider implements IAIProvider {\r\n abstract readonly name: AIProvider;\r\n abstract readonly model: string;\r\n\r\n protected apiKey: string;\r\n\r\n constructor(apiKey: string) {\r\n if (!apiKey || apiKey.trim() === '') {\r\n throw new Error(`API key is required for ${this.constructor.name}`);\r\n }\r\n this.apiKey = apiKey;\r\n }\r\n\r\n abstract extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>>;\r\n\r\n abstract extractJson<T = Record<string, unknown>>(\r\n file: FileInfo,\r\n schema: Record<string, unknown>,\r\n options?: ExtractionOptions\r\n ): Promise<ProviderResult<T>>;\r\n\r\n supportsFileType(type: SupportedFileType): boolean {\r\n return ['pdf', 'image', 'text'].includes(type);\r\n }\r\n\r\n /**\r\n * Build the text extraction prompt\r\n */\r\n protected buildTextPrompt(options?: ExtractionOptions): string {\r\n const basePrompt = options?.prompt || 'Extract all text content from this document.';\r\n const languageHint =\r\n options?.language && options.language !== 'auto'\r\n ? ` Respond in ${options.language}.`\r\n : '';\r\n\r\n return `${basePrompt}${languageHint}\r\n\r\nPlease extract and return all the text content from the provided document.\r\nMaintain the original structure and formatting as much as possible.\r\nReturn only the extracted text, without any additional commentary or metadata.`;\r\n }\r\n\r\n /**\r\n * Build the JSON extraction prompt\r\n */\r\n protected buildJsonPrompt(\r\n schema: Record<string, unknown>,\r\n options?: ExtractionOptions\r\n ): string {\r\n const basePrompt =\r\n options?.prompt || 'Extract structured data from this document.';\r\n const languageHint =\r\n options?.language && options.language !== 'auto'\r\n ? ` Text content should be in ${options.language}.`\r\n : '';\r\n\r\n return `${basePrompt}${languageHint}\r\n\r\nExtract data from the provided document and return it as a JSON object following this schema:\r\n\r\n${JSON.stringify(schema, null, 2)}\r\n\r\nImportant:\r\n- Return ONLY valid JSON, no additional text or markdown formatting\r\n- Follow the schema structure exactly\r\n- If a field cannot be extracted, use null\r\n- Do not include any explanation, just the JSON object`;\r\n }\r\n\r\n /**\r\n * Parse JSON response from AI, handling potential formatting issues\r\n */\r\n protected parseJsonResponse<T>(response: string): T {\r\n let cleaned = response.trim();\r\n\r\n // Remove markdown code blocks if present\r\n if (cleaned.startsWith('```json')) {\r\n cleaned = cleaned.slice(7);\r\n } else if (cleaned.startsWith('```')) {\r\n cleaned = cleaned.slice(3);\r\n }\r\n\r\n if (cleaned.endsWith('```')) {\r\n cleaned = cleaned.slice(0, -3);\r\n }\r\n\r\n cleaned = cleaned.trim();\r\n\r\n try {\r\n return JSON.parse(cleaned) as T;\r\n } catch {\r\n throw new Error(`Failed to parse JSON response: ${response.substring(0, 200)}...`);\r\n }\r\n }\r\n}\r\n","import { GoogleGenerativeAI, type GenerationConfig } from '@google/generative-ai';\r\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\r\nimport { BaseProvider } from './base.provider';\r\n\r\nconst DEFAULT_MODEL = 'gemini-1.5-flash';\r\n\r\nexport class GeminiProvider extends BaseProvider {\r\n readonly name: AIProvider = 'gemini';\r\n readonly model: string;\r\n\r\n private client: GoogleGenerativeAI;\r\n\r\n constructor(apiKey: string, model?: string) {\r\n super(apiKey);\r\n this.model = model || DEFAULT_MODEL;\r\n this.client = new GoogleGenerativeAI(apiKey);\r\n }\r\n\r\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\r\n const generationConfig = this.buildGenerationConfig(options?.modelConfig);\r\n const model = this.client.getGenerativeModel({\r\n model: this.model,\r\n generationConfig,\r\n });\r\n const prompt = this.buildTextPrompt(options);\r\n\r\n const content = this.buildContent(file, prompt);\r\n const result = await model.generateContent(content);\r\n const response = result.response;\r\n\r\n const tokens = this.extractTokenUsage(response);\r\n\r\n return {\r\n content: response.text(),\r\n tokens,\r\n };\r\n }\r\n\r\n async extractJson<T = Record<string, unknown>>(\r\n file: FileInfo,\r\n schema: Record<string, unknown>,\r\n options?: ExtractionOptions\r\n ): Promise<ProviderResult<T>> {\r\n const generationConfig = this.buildGenerationConfig(options?.modelConfig, {\r\n responseMimeType: 'application/json',\r\n });\r\n const model = this.client.getGenerativeModel({\r\n model: this.model,\r\n generationConfig,\r\n });\r\n\r\n const prompt = this.buildJsonPrompt(schema, options);\r\n const content = this.buildContent(file, prompt);\r\n\r\n const result = await model.generateContent(content);\r\n const response = result.response;\r\n const text = response.text();\r\n\r\n const tokens = this.extractTokenUsage(response);\r\n\r\n return {\r\n content: this.parseJsonResponse<T>(text),\r\n tokens,\r\n };\r\n }\r\n\r\n private buildGenerationConfig(\r\n modelConfig?: ModelConfig,\r\n defaults?: Partial<GenerationConfig>\r\n ): GenerationConfig {\r\n const config: GenerationConfig = { ...defaults };\r\n\r\n if (modelConfig?.temperature !== undefined) {\r\n config.temperature = modelConfig.temperature;\r\n }\r\n if (modelConfig?.maxTokens !== undefined) {\r\n config.maxOutputTokens = modelConfig.maxTokens;\r\n }\r\n if (modelConfig?.topP !== undefined) {\r\n config.topP = modelConfig.topP;\r\n }\r\n if (modelConfig?.topK !== undefined) {\r\n config.topK = modelConfig.topK;\r\n }\r\n if (modelConfig?.stopSequences !== undefined) {\r\n config.stopSequences = modelConfig.stopSequences;\r\n }\r\n\r\n return config;\r\n }\r\n\r\n private extractTokenUsage(response: { usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number } }): TokenUsage | undefined {\r\n const usage = response.usageMetadata;\r\n if (!usage) return undefined;\r\n\r\n return {\r\n inputTokens: usage.promptTokenCount || 0,\r\n outputTokens: usage.candidatesTokenCount || 0,\r\n totalTokens: usage.totalTokenCount || 0,\r\n };\r\n }\r\n\r\n private buildContent(\r\n file: FileInfo,\r\n prompt: string\r\n ): Parameters<ReturnType<GoogleGenerativeAI['getGenerativeModel']>['generateContent']>[0] {\r\n if (file.type === 'text') {\r\n return `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`;\r\n }\r\n\r\n // For images and PDFs, use inline data\r\n return [\r\n {\r\n inlineData: {\r\n mimeType: file.mimeType,\r\n data: file.base64 || file.content.toString('base64'),\r\n },\r\n },\r\n { text: prompt },\r\n ];\r\n }\r\n}\r\n","import OpenAI from 'openai';\r\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\r\nimport { BaseProvider } from './base.provider';\r\n\r\nconst DEFAULT_MODEL = 'gpt-4o';\r\n\r\nexport class OpenAIProvider extends BaseProvider {\r\n readonly name: AIProvider = 'openai';\r\n readonly model: string;\r\n\r\n private client: OpenAI;\r\n\r\n constructor(apiKey: string, model?: string) {\r\n super(apiKey);\r\n this.model = model || DEFAULT_MODEL;\r\n this.client = new OpenAI({ apiKey });\r\n }\r\n\r\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\r\n const prompt = this.buildTextPrompt(options);\r\n const messages = this.buildMessages(file, prompt);\r\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\r\n\r\n const response = await this.client.chat.completions.create({\r\n model: this.model,\r\n messages,\r\n ...completionOptions,\r\n });\r\n\r\n const tokens = this.extractTokenUsage(response);\r\n\r\n return {\r\n content: response.choices[0]?.message?.content || '',\r\n tokens,\r\n };\r\n }\r\n\r\n async extractJson<T = Record<string, unknown>>(\r\n file: FileInfo,\r\n schema: Record<string, unknown>,\r\n options?: ExtractionOptions\r\n ): Promise<ProviderResult<T>> {\r\n const prompt = this.buildJsonPrompt(schema, options);\r\n const messages = this.buildMessages(file, prompt);\r\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\r\n\r\n const response = await this.client.chat.completions.create({\r\n model: this.model,\r\n messages,\r\n ...completionOptions,\r\n response_format: { type: 'json_object' },\r\n });\r\n\r\n const text = response.choices[0]?.message?.content || '{}';\r\n const tokens = this.extractTokenUsage(response);\r\n\r\n return {\r\n content: this.parseJsonResponse<T>(text),\r\n tokens,\r\n };\r\n }\r\n\r\n private buildCompletionOptions(modelConfig?: ModelConfig): Record<string, unknown> {\r\n const options: Record<string, unknown> = {};\r\n\r\n // GPT-5 and o1/o3 models use max_completion_tokens instead of max_tokens\r\n const useMaxCompletionTokens = this.model.startsWith('gpt-5') ||\r\n this.model.startsWith('o1') ||\r\n this.model.startsWith('o3');\r\n\r\n const tokenParam = useMaxCompletionTokens ? 'max_completion_tokens' : 'max_tokens';\r\n options[tokenParam] = modelConfig?.maxTokens ?? 16384;\r\n\r\n if (modelConfig?.temperature !== undefined) {\r\n options.temperature = modelConfig.temperature;\r\n }\r\n if (modelConfig?.topP !== undefined) {\r\n options.top_p = modelConfig.topP;\r\n }\r\n if (modelConfig?.stopSequences !== undefined) {\r\n options.stop = modelConfig.stopSequences;\r\n }\r\n\r\n return options;\r\n }\r\n\r\n private extractTokenUsage(response: OpenAI.Chat.Completions.ChatCompletion): TokenUsage | undefined {\r\n const usage = response.usage;\r\n if (!usage) return undefined;\r\n\r\n return {\r\n inputTokens: usage.prompt_tokens,\r\n outputTokens: usage.completion_tokens,\r\n totalTokens: usage.total_tokens,\r\n };\r\n }\r\n\r\n private buildMessages(\r\n file: FileInfo,\r\n prompt: string\r\n ): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\r\n if (file.type === 'text') {\r\n return [\r\n {\r\n role: 'user',\r\n content: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`,\r\n },\r\n ];\r\n }\r\n\r\n // For images and PDFs\r\n const base64 = file.base64 || file.content.toString('base64');\r\n const imageUrl = `data:${file.mimeType};base64,${base64}`;\r\n\r\n return [\r\n {\r\n role: 'user',\r\n content: [\r\n {\r\n type: 'image_url',\r\n image_url: {\r\n url: imageUrl,\r\n detail: 'high',\r\n },\r\n },\r\n {\r\n type: 'text',\r\n text: prompt,\r\n },\r\n ],\r\n },\r\n ];\r\n }\r\n}\r\n","import Anthropic from '@anthropic-ai/sdk';\r\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, SupportedFileType, TokenUsage } from '../types';\r\nimport { BaseProvider } from './base.provider';\r\n\r\nconst DEFAULT_MODEL = 'claude-sonnet-4-20250514';\r\n\r\ntype ImageMediaType = 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp';\r\n\r\nexport class ClaudeProvider extends BaseProvider {\r\n readonly name: AIProvider = 'claude';\r\n readonly model: string;\r\n\r\n private client: Anthropic;\r\n\r\n constructor(apiKey: string, model?: string) {\r\n super(apiKey);\r\n this.model = model || DEFAULT_MODEL;\r\n this.client = new Anthropic({ apiKey });\r\n }\r\n\r\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\r\n const prompt = this.buildTextPrompt(options);\r\n const messageOptions = this.buildMessageOptions(options?.modelConfig);\r\n\r\n const response = await this.client.messages.create({\r\n model: this.model,\r\n messages: [\r\n {\r\n role: 'user',\r\n content: this.buildContent(file, prompt),\r\n },\r\n ],\r\n max_tokens: messageOptions.max_tokens,\r\n temperature: messageOptions.temperature,\r\n top_p: messageOptions.top_p,\r\n top_k: messageOptions.top_k,\r\n stop_sequences: messageOptions.stop_sequences,\r\n });\r\n\r\n const textBlock = response.content.find((block) => block.type === 'text');\r\n const tokens = this.extractTokenUsage(response);\r\n\r\n return {\r\n content: textBlock?.text || '',\r\n tokens,\r\n };\r\n }\r\n\r\n async extractJson<T = Record<string, unknown>>(\r\n file: FileInfo,\r\n schema: Record<string, unknown>,\r\n options?: ExtractionOptions\r\n ): Promise<ProviderResult<T>> {\r\n const prompt = this.buildJsonPrompt(schema, options);\r\n const messageOptions = this.buildMessageOptions(options?.modelConfig);\r\n\r\n const response = await this.client.messages.create({\r\n model: this.model,\r\n messages: [\r\n {\r\n role: 'user',\r\n content: this.buildContent(file, prompt),\r\n },\r\n ],\r\n max_tokens: messageOptions.max_tokens,\r\n temperature: messageOptions.temperature,\r\n top_p: messageOptions.top_p,\r\n top_k: messageOptions.top_k,\r\n stop_sequences: messageOptions.stop_sequences,\r\n });\r\n\r\n const textBlock = response.content.find((block) => block.type === 'text');\r\n const text = textBlock?.text || '{}';\r\n const tokens = this.extractTokenUsage(response);\r\n\r\n return {\r\n content: this.parseJsonResponse<T>(text),\r\n tokens,\r\n };\r\n }\r\n\r\n private buildMessageOptions(modelConfig?: ModelConfig): {\r\n max_tokens: number;\r\n temperature?: number;\r\n top_p?: number;\r\n top_k?: number;\r\n stop_sequences?: string[];\r\n } {\r\n const options: {\r\n max_tokens: number;\r\n temperature?: number;\r\n top_p?: number;\r\n top_k?: number;\r\n stop_sequences?: string[];\r\n } = {\r\n max_tokens: 16384,\r\n };\r\n\r\n if (modelConfig?.temperature !== undefined) {\r\n options.temperature = modelConfig.temperature;\r\n }\r\n if (modelConfig?.maxTokens !== undefined) {\r\n options.max_tokens = modelConfig.maxTokens;\r\n }\r\n if (modelConfig?.topP !== undefined) {\r\n options.top_p = modelConfig.topP;\r\n }\r\n if (modelConfig?.topK !== undefined) {\r\n options.top_k = modelConfig.topK;\r\n }\r\n if (modelConfig?.stopSequences !== undefined) {\r\n options.stop_sequences = modelConfig.stopSequences;\r\n }\r\n\r\n return options;\r\n }\r\n\r\n supportsFileType(type: SupportedFileType): boolean {\r\n // Claude supports images and PDFs via vision\r\n return ['pdf', 'image', 'text'].includes(type);\r\n }\r\n\r\n private extractTokenUsage(response: Anthropic.Message): TokenUsage | undefined {\r\n return {\r\n inputTokens: response.usage.input_tokens,\r\n outputTokens: response.usage.output_tokens,\r\n totalTokens: response.usage.input_tokens + response.usage.output_tokens,\r\n };\r\n }\r\n\r\n private buildContent(file: FileInfo, prompt: string): Anthropic.MessageCreateParams['messages'][0]['content'] {\r\n if (file.type === 'text') {\r\n return `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`;\r\n }\r\n\r\n const base64 = file.base64 || file.content.toString('base64');\r\n\r\n // Handle PDF files - Claude supports PDFs via base64\r\n if (file.type === 'pdf') {\r\n // For PDFs, we use the document block type\r\n return [\r\n {\r\n type: 'document' as const,\r\n source: {\r\n type: 'base64' as const,\r\n media_type: 'application/pdf' as const,\r\n data: base64,\r\n },\r\n },\r\n {\r\n type: 'text' as const,\r\n text: prompt,\r\n },\r\n ] as Anthropic.MessageCreateParams['messages'][0]['content'];\r\n }\r\n\r\n // Handle images\r\n return [\r\n {\r\n type: 'image' as const,\r\n source: {\r\n type: 'base64' as const,\r\n media_type: this.getMediaType(file.mimeType),\r\n data: base64,\r\n },\r\n },\r\n {\r\n type: 'text' as const,\r\n text: prompt,\r\n },\r\n ];\r\n }\r\n\r\n private getMediaType(mimeType: string): ImageMediaType {\r\n const supportedTypes: ImageMediaType[] = [\r\n 'image/jpeg',\r\n 'image/png',\r\n 'image/gif',\r\n 'image/webp',\r\n ];\r\n\r\n if (supportedTypes.includes(mimeType as ImageMediaType)) {\r\n return mimeType as ImageMediaType;\r\n }\r\n\r\n // Default to JPEG for unsupported image types\r\n return 'image/jpeg';\r\n }\r\n}\r\n","import OpenAI from 'openai';\r\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\r\nimport { BaseProvider } from './base.provider';\r\n\r\n// Grok uses OpenAI-compatible API\r\nconst GROK_BASE_URL = 'https://api.x.ai/v1';\r\nconst DEFAULT_MODEL = 'grok-2-vision-1212';\r\n\r\nexport class GrokProvider extends BaseProvider {\r\n readonly name: AIProvider = 'grok';\r\n readonly model: string;\r\n\r\n private client: OpenAI;\r\n\r\n constructor(apiKey: string, model?: string) {\r\n super(apiKey);\r\n this.model = model || DEFAULT_MODEL;\r\n this.client = new OpenAI({\r\n apiKey,\r\n baseURL: GROK_BASE_URL,\r\n });\r\n }\r\n\r\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\r\n const prompt = this.buildTextPrompt(options);\r\n const messages = this.buildMessages(file, prompt);\r\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\r\n\r\n const response = await this.client.chat.completions.create({\r\n model: this.model,\r\n messages,\r\n ...completionOptions,\r\n });\r\n\r\n const tokens = this.extractTokenUsage(response);\r\n\r\n return {\r\n content: response.choices[0]?.message?.content || '',\r\n tokens,\r\n };\r\n }\r\n\r\n async extractJson<T = Record<string, unknown>>(\r\n file: FileInfo,\r\n schema: Record<string, unknown>,\r\n options?: ExtractionOptions\r\n ): Promise<ProviderResult<T>> {\r\n const prompt = this.buildJsonPrompt(schema, options);\r\n const messages = this.buildMessages(file, prompt);\r\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\r\n\r\n const response = await this.client.chat.completions.create({\r\n model: this.model,\r\n messages,\r\n ...completionOptions,\r\n });\r\n\r\n const text = response.choices[0]?.message?.content || '{}';\r\n const tokens = this.extractTokenUsage(response);\r\n\r\n return {\r\n content: this.parseJsonResponse<T>(text),\r\n tokens,\r\n };\r\n }\r\n\r\n private buildCompletionOptions(modelConfig?: ModelConfig): Record<string, unknown> {\r\n const options: Record<string, unknown> = {\r\n max_tokens: 16384,\r\n };\r\n\r\n if (modelConfig?.temperature !== undefined) {\r\n options.temperature = modelConfig.temperature;\r\n }\r\n if (modelConfig?.maxTokens !== undefined) {\r\n options.max_tokens = modelConfig.maxTokens;\r\n }\r\n if (modelConfig?.topP !== undefined) {\r\n options.top_p = modelConfig.topP;\r\n }\r\n if (modelConfig?.stopSequences !== undefined) {\r\n options.stop = modelConfig.stopSequences;\r\n }\r\n\r\n return options;\r\n }\r\n\r\n private extractTokenUsage(response: OpenAI.Chat.Completions.ChatCompletion): TokenUsage | undefined {\r\n const usage = response.usage;\r\n if (!usage) return undefined;\r\n\r\n return {\r\n inputTokens: usage.prompt_tokens,\r\n outputTokens: usage.completion_tokens,\r\n totalTokens: usage.total_tokens,\r\n };\r\n }\r\n\r\n private buildMessages(\r\n file: FileInfo,\r\n prompt: string\r\n ): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\r\n if (file.type === 'text') {\r\n return [\r\n {\r\n role: 'user',\r\n content: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`,\r\n },\r\n ];\r\n }\r\n\r\n // For images and PDFs - Grok uses OpenAI-compatible format\r\n const base64 = file.base64 || file.content.toString('base64');\r\n const imageUrl = `data:${file.mimeType};base64,${base64}`;\r\n\r\n return [\r\n {\r\n role: 'user',\r\n content: [\r\n {\r\n type: 'image_url',\r\n image_url: {\r\n url: imageUrl,\r\n detail: 'high',\r\n },\r\n },\r\n {\r\n type: 'text',\r\n text: prompt,\r\n },\r\n ],\r\n },\r\n ];\r\n }\r\n}\r\n","import { GoogleGenAI } from '@google/genai';\r\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\r\nimport { BaseProvider } from './base.provider';\r\n\r\nconst DEFAULT_MODEL = 'gemini-2.0-flash';\r\n\r\nexport interface VertexConfig {\r\n project: string;\r\n location: string;\r\n}\r\n\r\nexport class VertexProvider extends BaseProvider {\r\n readonly name: AIProvider = 'vertex';\r\n readonly model: string;\r\n\r\n private client: GoogleGenAI;\r\n\r\n constructor(config: VertexConfig, model?: string) {\r\n super('vertex');\r\n this.model = model || DEFAULT_MODEL;\r\n this.client = new GoogleGenAI({\r\n vertexai: true,\r\n project: config.project,\r\n location: config.location,\r\n });\r\n }\r\n\r\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\r\n const prompt = this.buildTextPrompt(options);\r\n const generationConfig = this.buildGenerationConfig(options?.modelConfig);\r\n\r\n const response = await this.client.models.generateContent({\r\n model: this.model,\r\n contents: this.buildContents(file, prompt),\r\n config: generationConfig,\r\n });\r\n\r\n const tokens = this.extractTokenUsage(response);\r\n\r\n return {\r\n content: response.text || '',\r\n tokens,\r\n };\r\n }\r\n\r\n async extractJson<T = Record<string, unknown>>(\r\n file: FileInfo,\r\n schema: Record<string, unknown>,\r\n options?: ExtractionOptions\r\n ): Promise<ProviderResult<T>> {\r\n const prompt = this.buildJsonPrompt(schema, options);\r\n const generationConfig = this.buildGenerationConfig(options?.modelConfig, {\r\n responseMimeType: 'application/json',\r\n });\r\n\r\n const response = await this.client.models.generateContent({\r\n model: this.model,\r\n contents: this.buildContents(file, prompt),\r\n config: generationConfig,\r\n });\r\n\r\n const text = response.text || '{}';\r\n const tokens = this.extractTokenUsage(response);\r\n\r\n return {\r\n content: this.parseJsonResponse<T>(text),\r\n tokens,\r\n };\r\n }\r\n\r\n private buildGenerationConfig(\r\n modelConfig?: ModelConfig,\r\n defaults?: Record<string, unknown>\r\n ): Record<string, unknown> {\r\n const config: Record<string, unknown> = { ...defaults };\r\n\r\n if (modelConfig?.temperature !== undefined) {\r\n config.temperature = modelConfig.temperature;\r\n }\r\n if (modelConfig?.maxTokens !== undefined) {\r\n config.maxOutputTokens = modelConfig.maxTokens;\r\n }\r\n if (modelConfig?.topP !== undefined) {\r\n config.topP = modelConfig.topP;\r\n }\r\n if (modelConfig?.topK !== undefined) {\r\n config.topK = modelConfig.topK;\r\n }\r\n if (modelConfig?.stopSequences !== undefined) {\r\n config.stopSequences = modelConfig.stopSequences;\r\n }\r\n\r\n return config;\r\n }\r\n\r\n private extractTokenUsage(response: { usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number } }): TokenUsage | undefined {\r\n const usage = response.usageMetadata;\r\n if (!usage) return undefined;\r\n\r\n return {\r\n inputTokens: usage.promptTokenCount || 0,\r\n outputTokens: usage.candidatesTokenCount || 0,\r\n totalTokens: usage.totalTokenCount || 0,\r\n };\r\n }\r\n\r\n private buildContents(file: FileInfo, prompt: string): Array<{ role: string; parts: Array<{ text?: string; inlineData?: { mimeType: string; data: string } }> }> {\r\n if (file.type === 'text') {\r\n return [\r\n {\r\n role: 'user',\r\n parts: [\r\n { text: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}` },\r\n ],\r\n },\r\n ];\r\n }\r\n\r\n // For images and PDFs\r\n const base64 = file.base64 || file.content.toString('base64');\r\n\r\n return [\r\n {\r\n role: 'user',\r\n parts: [\r\n {\r\n inlineData: {\r\n mimeType: file.mimeType,\r\n data: base64,\r\n },\r\n },\r\n { text: prompt },\r\n ],\r\n },\r\n ];\r\n }\r\n}\r\n","import * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\nimport type { FileInfo, SupportedFileType } from '../types';\r\n\r\n/**\r\n * MIME type to file type mapping\r\n */\r\nconst MIME_TO_FILE_TYPE: Record<string, SupportedFileType> = {\r\n 'application/pdf': 'pdf',\r\n 'image/jpeg': 'image',\r\n 'image/png': 'image',\r\n 'image/gif': 'image',\r\n 'image/webp': 'image',\r\n 'image/bmp': 'image',\r\n 'image/tiff': 'image',\r\n 'text/plain': 'text',\r\n 'text/markdown': 'text',\r\n 'text/csv': 'text',\r\n 'application/json': 'text',\r\n 'application/xml': 'text',\r\n 'text/html': 'text',\r\n};\r\n\r\n/**\r\n * MIME type mappings for supported file types\r\n */\r\nconst MIME_TYPES: Record<string, string> = {\r\n // PDF\r\n '.pdf': 'application/pdf',\r\n\r\n // Images\r\n '.jpg': 'image/jpeg',\r\n '.jpeg': 'image/jpeg',\r\n '.png': 'image/png',\r\n '.gif': 'image/gif',\r\n '.webp': 'image/webp',\r\n '.bmp': 'image/bmp',\r\n '.tiff': 'image/tiff',\r\n '.tif': 'image/tiff',\r\n\r\n // Text files\r\n '.txt': 'text/plain',\r\n '.md': 'text/markdown',\r\n '.csv': 'text/csv',\r\n '.json': 'application/json',\r\n '.xml': 'application/xml',\r\n '.html': 'text/html',\r\n '.htm': 'text/html',\r\n};\r\n\r\n/**\r\n * File type categories\r\n */\r\nconst FILE_TYPE_CATEGORIES: Record<string, SupportedFileType> = {\r\n '.pdf': 'pdf',\r\n '.jpg': 'image',\r\n '.jpeg': 'image',\r\n '.png': 'image',\r\n '.gif': 'image',\r\n '.webp': 'image',\r\n '.bmp': 'image',\r\n '.tiff': 'image',\r\n '.tif': 'image',\r\n '.txt': 'text',\r\n '.md': 'text',\r\n '.csv': 'text',\r\n '.json': 'text',\r\n '.xml': 'text',\r\n '.html': 'text',\r\n '.htm': 'text',\r\n};\r\n\r\n/**\r\n * Load a file from disk and prepare it for AI processing\r\n */\r\nexport async function loadFile(filePath: string): Promise<FileInfo> {\r\n const absolutePath = path.resolve(filePath);\r\n\r\n // Check if file exists\r\n try {\r\n await fs.access(absolutePath);\r\n } catch {\r\n throw new Error(`File not found: ${absolutePath}`);\r\n }\r\n\r\n // Get file stats\r\n const stats = await fs.stat(absolutePath);\r\n\r\n if (!stats.isFile()) {\r\n throw new Error(`Path is not a file: ${absolutePath}`);\r\n }\r\n\r\n // Get file extension and determine type\r\n const ext = path.extname(absolutePath).toLowerCase();\r\n const fileName = path.basename(absolutePath);\r\n\r\n const mimeType = MIME_TYPES[ext];\r\n const fileType = FILE_TYPE_CATEGORIES[ext];\r\n\r\n if (!mimeType || !fileType) {\r\n throw new Error(\r\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\r\n );\r\n }\r\n\r\n // Read file content\r\n const content = await fs.readFile(absolutePath);\r\n\r\n // Prepare base64 for non-text files\r\n const base64 = fileType !== 'text' ? content.toString('base64') : undefined;\r\n\r\n return {\r\n path: absolutePath,\r\n name: fileName,\r\n type: fileType,\r\n mimeType,\r\n size: stats.size,\r\n content,\r\n base64,\r\n };\r\n}\r\n\r\n/**\r\n * Load a file from a Buffer\r\n */\r\nexport function loadFileFromBuffer(\r\n buffer: Buffer,\r\n fileName: string,\r\n mimeType?: string\r\n): FileInfo {\r\n const ext = path.extname(fileName).toLowerCase();\r\n const detectedMimeType = mimeType || MIME_TYPES[ext];\r\n const fileType = FILE_TYPE_CATEGORIES[ext];\r\n\r\n if (!detectedMimeType || !fileType) {\r\n throw new Error(\r\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\r\n );\r\n }\r\n\r\n const base64 = fileType !== 'text' ? buffer.toString('base64') : undefined;\r\n\r\n return {\r\n path: '',\r\n name: fileName,\r\n type: fileType,\r\n mimeType: detectedMimeType,\r\n size: buffer.length,\r\n content: buffer,\r\n base64,\r\n };\r\n}\r\n\r\n/**\r\n * Load a file from base64 string\r\n */\r\nexport function loadFileFromBase64(\r\n base64: string,\r\n fileName: string,\r\n mimeType?: string\r\n): FileInfo {\r\n // Remove data URL prefix if present\r\n const base64Data = base64.includes(',') ? base64.split(',')[1] : base64;\r\n const buffer = Buffer.from(base64Data, 'base64');\r\n\r\n const ext = path.extname(fileName).toLowerCase();\r\n const detectedMimeType = mimeType || MIME_TYPES[ext];\r\n const fileType = FILE_TYPE_CATEGORIES[ext];\r\n\r\n if (!detectedMimeType || !fileType) {\r\n throw new Error(\r\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\r\n );\r\n }\r\n\r\n return {\r\n path: '',\r\n name: fileName,\r\n type: fileType,\r\n mimeType: detectedMimeType,\r\n size: buffer.length,\r\n content: buffer,\r\n base64: base64Data,\r\n };\r\n}\r\n\r\n/**\r\n * Save content to a file\r\n */\r\nexport async function saveToFile(filePath: string, content: string | Buffer): Promise<void> {\r\n const absolutePath = path.resolve(filePath);\r\n const dir = path.dirname(absolutePath);\r\n\r\n // Ensure directory exists\r\n await fs.mkdir(dir, { recursive: true });\r\n\r\n // Write file\r\n await fs.writeFile(absolutePath, content, typeof content === 'string' ? 'utf-8' : undefined);\r\n}\r\n\r\n/**\r\n * Get supported file extensions\r\n */\r\nexport function getSupportedExtensions(): string[] {\r\n return Object.keys(MIME_TYPES);\r\n}\r\n\r\n/**\r\n * Check if a file extension is supported\r\n */\r\nexport function isExtensionSupported(ext: string): boolean {\r\n const normalizedExt = ext.startsWith('.') ? ext.toLowerCase() : `.${ext.toLowerCase()}`;\r\n return normalizedExt in MIME_TYPES;\r\n}\r\n\r\n/**\r\n * Check if a string is a URL\r\n */\r\nexport function isUrl(str: string): boolean {\r\n return str.startsWith('http://') || str.startsWith('https://');\r\n}\r\n\r\n/**\r\n * Load a file from a URL\r\n */\r\nexport async function loadFileFromUrl(url: string): Promise<FileInfo> {\r\n const response = await fetch(url);\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch URL: ${response.status} ${response.statusText}`);\r\n }\r\n\r\n const contentType = response.headers.get('content-type')?.split(';')[0] || '';\r\n const buffer = Buffer.from(await response.arrayBuffer());\r\n\r\n // Try to get filename from URL or Content-Disposition header\r\n const contentDisposition = response.headers.get('content-disposition');\r\n let fileName = '';\r\n\r\n if (contentDisposition) {\r\n const match = contentDisposition.match(/filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/);\r\n if (match) {\r\n fileName = match[1].replace(/['\"]/g, '');\r\n }\r\n }\r\n\r\n if (!fileName) {\r\n // Extract filename from URL path\r\n const urlPath = new URL(url).pathname;\r\n fileName = path.basename(urlPath) || 'download';\r\n }\r\n\r\n // Determine file type from content-type header or extension\r\n let fileType = MIME_TO_FILE_TYPE[contentType];\r\n let mimeType = contentType;\r\n\r\n if (!fileType) {\r\n // Try to determine from file extension\r\n const ext = path.extname(fileName).toLowerCase();\r\n mimeType = MIME_TYPES[ext];\r\n fileType = FILE_TYPE_CATEGORIES[ext];\r\n }\r\n\r\n if (!fileType || !mimeType) {\r\n throw new Error(\r\n `Unsupported file type from URL. Content-Type: ${contentType}, Filename: ${fileName}`\r\n );\r\n }\r\n\r\n const base64 = fileType !== 'text' ? buffer.toString('base64') : undefined;\r\n\r\n return {\r\n path: url,\r\n name: fileName,\r\n type: fileType,\r\n mimeType,\r\n size: buffer.length,\r\n content: buffer,\r\n base64,\r\n };\r\n}\r\n","import type {\r\n AIProvider,\r\n OcrConfig,\r\n ExtractionOptions,\r\n ExtractionResult,\r\n FileInfo,\r\n IAIProvider,\r\n JsonExtractionResult,\r\n TextExtractionResult,\r\n} from './types';\r\nimport {\r\n ClaudeProvider,\r\n GeminiProvider,\r\n GrokProvider,\r\n OpenAIProvider,\r\n VertexProvider,\r\n} from './providers';\r\nimport {\r\n loadFile,\r\n loadFileFromBase64,\r\n loadFileFromBuffer,\r\n loadFileFromUrl,\r\n isUrl,\r\n saveToFile,\r\n} from './loaders';\r\n\r\n/**\r\n * Main class for document extraction using AI\r\n */\r\nexport class OcrAI {\r\n private provider: IAIProvider;\r\n private config: OcrConfig;\r\n\r\n constructor(config: OcrConfig) {\r\n this.config = config;\r\n this.provider = this.createProvider(config);\r\n }\r\n\r\n /**\r\n * Create a provider instance based on configuration\r\n */\r\n private createProvider(config: OcrConfig): IAIProvider {\r\n switch (config.provider) {\r\n case 'gemini':\r\n if (!config.apiKey) throw new Error('API key is required for Gemini provider');\r\n return new GeminiProvider(config.apiKey, config.model);\r\n case 'openai':\r\n if (!config.apiKey) throw new Error('API key is required for OpenAI provider');\r\n return new OpenAIProvider(config.apiKey, config.model);\r\n case 'claude':\r\n if (!config.apiKey) throw new Error('API key is required for Claude provider');\r\n return new ClaudeProvider(config.apiKey, config.model);\r\n case 'grok':\r\n if (!config.apiKey) throw new Error('API key is required for Grok provider');\r\n return new GrokProvider(config.apiKey, config.model);\r\n case 'vertex':\r\n if (!config.vertexConfig) throw new Error('vertexConfig is required for Vertex AI provider');\r\n return new VertexProvider(config.vertexConfig, config.model);\r\n default:\r\n throw new Error(`Unsupported provider: ${config.provider}`);\r\n }\r\n }\r\n\r\n /**\r\n * Extract content from a file path or URL\r\n */\r\n async extract(\r\n source: string,\r\n options?: ExtractionOptions\r\n ): Promise<ExtractionResult> {\r\n const startTime = Date.now();\r\n\r\n try {\r\n const file = isUrl(source)\r\n ? await loadFileFromUrl(source)\r\n : await loadFile(source);\r\n return this.processExtraction(file, options, startTime);\r\n } catch (error) {\r\n return this.createErrorResult(error);\r\n }\r\n }\r\n\r\n /**\r\n * Extract content from a Buffer\r\n */\r\n async extractFromBuffer(\r\n buffer: Buffer,\r\n fileName: string,\r\n options?: ExtractionOptions\r\n ): Promise<ExtractionResult> {\r\n const startTime = Date.now();\r\n\r\n try {\r\n const file = loadFileFromBuffer(buffer, fileName);\r\n return this.processExtraction(file, options, startTime);\r\n } catch (error) {\r\n return this.createErrorResult(error);\r\n }\r\n }\r\n\r\n /**\r\n * Extract content from a base64 string\r\n */\r\n async extractFromBase64(\r\n base64: string,\r\n fileName: string,\r\n options?: ExtractionOptions\r\n ): Promise<ExtractionResult> {\r\n const startTime = Date.now();\r\n\r\n try {\r\n const file = loadFileFromBase64(base64, fileName);\r\n return this.processExtraction(file, options, startTime);\r\n } catch (error) {\r\n return this.createErrorResult(error);\r\n }\r\n }\r\n\r\n /**\r\n * Process the extraction based on format\r\n */\r\n private async processExtraction(\r\n file: FileInfo,\r\n options: ExtractionOptions | undefined,\r\n startTime: number\r\n ): Promise<ExtractionResult> {\r\n const format = options?.format || 'text';\r\n\r\n // Check if provider supports the file type\r\n if (!this.provider.supportsFileType(file.type)) {\r\n return {\r\n success: false,\r\n error: `Provider ${this.provider.name} does not support file type: ${file.type}`,\r\n code: 'UNSUPPORTED_FILE_TYPE',\r\n };\r\n }\r\n\r\n try {\r\n if (format === 'json') {\r\n if (!options?.schema) {\r\n return {\r\n success: false,\r\n error: 'Schema is required for JSON extraction',\r\n code: 'MISSING_SCHEMA',\r\n };\r\n }\r\n\r\n const providerResult = await this.provider.extractJson(file, options.schema, options);\r\n const result: JsonExtractionResult = {\r\n success: true,\r\n format: 'json',\r\n data: providerResult.content,\r\n metadata: {\r\n provider: this.provider.name,\r\n model: this.provider.model,\r\n fileType: file.type,\r\n fileName: file.name,\r\n processingTimeMs: Date.now() - startTime,\r\n tokens: providerResult.tokens,\r\n },\r\n };\r\n\r\n // Save to file if outputPath is specified\r\n if (options.outputPath) {\r\n await saveToFile(options.outputPath, JSON.stringify(providerResult.content, null, 2));\r\n }\r\n\r\n return result;\r\n } else {\r\n const providerResult = await this.provider.extractText(file, options);\r\n const result: TextExtractionResult = {\r\n success: true,\r\n format: 'text',\r\n content: providerResult.content,\r\n metadata: {\r\n provider: this.provider.name,\r\n model: this.provider.model,\r\n fileType: file.type,\r\n fileName: file.name,\r\n processingTimeMs: Date.now() - startTime,\r\n tokens: providerResult.tokens,\r\n },\r\n };\r\n\r\n // Save to file if outputPath is specified\r\n if (options?.outputPath) {\r\n await saveToFile(options.outputPath, providerResult.content);\r\n }\r\n\r\n return result;\r\n }\r\n } catch (error) {\r\n return this.createErrorResult(error);\r\n }\r\n }\r\n\r\n /**\r\n * Create an error result\r\n */\r\n private createErrorResult(error: unknown): ExtractionResult {\r\n const message = error instanceof Error ? error.message : String(error);\r\n return {\r\n success: false,\r\n error: message,\r\n code: 'EXTRACTION_ERROR',\r\n };\r\n }\r\n\r\n /**\r\n * Get current provider name\r\n */\r\n getProvider(): AIProvider {\r\n return this.provider.name;\r\n }\r\n\r\n /**\r\n * Get current model\r\n */\r\n getModel(): string {\r\n return this.provider.model;\r\n }\r\n\r\n /**\r\n * Change the AI provider\r\n */\r\n setProvider(provider: AIProvider, apiKey: string, model?: string): void {\r\n this.config = { provider, apiKey, model };\r\n this.provider = this.createProvider(this.config);\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create OcrAI instance\r\n */\r\nexport function createOcrAI(config: OcrConfig): OcrAI {\r\n return new OcrAI(config);\r\n}\r\n"]}
package/dist/index.mjs CHANGED
@@ -202,15 +202,13 @@ var OpenAIProvider = class extends BaseProvider {
202
202
  };
203
203
  }
204
204
  buildCompletionOptions(modelConfig) {
205
- const options = {
206
- max_tokens: 16384
207
- };
205
+ const options = {};
206
+ const useMaxCompletionTokens = this.model.startsWith("gpt-5") || this.model.startsWith("o1") || this.model.startsWith("o3");
207
+ const tokenParam = useMaxCompletionTokens ? "max_completion_tokens" : "max_tokens";
208
+ options[tokenParam] = modelConfig?.maxTokens ?? 16384;
208
209
  if (modelConfig?.temperature !== void 0) {
209
210
  options.temperature = modelConfig.temperature;
210
211
  }
211
- if (modelConfig?.maxTokens !== void 0) {
212
- options.max_tokens = modelConfig.maxTokens;
213
- }
214
212
  if (modelConfig?.topP !== void 0) {
215
213
  options.top_p = modelConfig.topP;
216
214
  }
@@ -800,8 +798,8 @@ async function loadFileFromUrl(url) {
800
798
  };
801
799
  }
802
800
 
803
- // src/extracta.ts
804
- var ExtractaAI = class {
801
+ // src/ocr.ts
802
+ var OcrAI = class {
805
803
  provider;
806
804
  config;
807
805
  constructor(config) {
@@ -962,10 +960,10 @@ var ExtractaAI = class {
962
960
  this.provider = this.createProvider(this.config);
963
961
  }
964
962
  };
965
- function createExtractaAI(config) {
966
- return new ExtractaAI(config);
963
+ function createOcrAI(config) {
964
+ return new OcrAI(config);
967
965
  }
968
966
 
969
- export { BaseProvider, ClaudeProvider, ExtractaAI, GeminiProvider, GrokProvider, OpenAIProvider, VertexProvider, createExtractaAI, getSupportedExtensions, isExtensionSupported, isUrl, loadFile, loadFileFromBase64, loadFileFromBuffer, loadFileFromUrl, saveToFile };
967
+ export { BaseProvider, ClaudeProvider, GeminiProvider, GrokProvider, OcrAI, OpenAIProvider, VertexProvider, createOcrAI, getSupportedExtensions, isExtensionSupported, isUrl, loadFile, loadFileFromBase64, loadFileFromBuffer, loadFileFromUrl, saveToFile };
970
968
  //# sourceMappingURL=index.mjs.map
971
969
  //# sourceMappingURL=index.mjs.map