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/LICENSE +21 -21
- package/README.md +458 -320
- package/dist/index.d.mts +15 -7
- package/dist/index.d.ts +15 -7
- package/dist/index.js +10 -12
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +9 -11
- package/dist/index.mjs.map +1 -1
- package/package.json +68 -68
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
|
|
28
|
+
* Main configuration for OcrAI
|
|
29
29
|
*/
|
|
30
|
-
interface
|
|
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
|
|
193
|
+
declare class OcrAI {
|
|
186
194
|
private provider;
|
|
187
195
|
private config;
|
|
188
|
-
constructor(config:
|
|
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
|
|
235
|
+
* Factory function to create OcrAI instance
|
|
228
236
|
*/
|
|
229
|
-
declare function
|
|
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,
|
|
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
|
|
28
|
+
* Main configuration for OcrAI
|
|
29
29
|
*/
|
|
30
|
-
interface
|
|
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
|
|
193
|
+
declare class OcrAI {
|
|
186
194
|
private provider;
|
|
187
195
|
private config;
|
|
188
|
-
constructor(config:
|
|
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
|
|
235
|
+
* Factory function to create OcrAI instance
|
|
228
236
|
*/
|
|
229
|
-
declare function
|
|
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,
|
|
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
|
-
|
|
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/
|
|
831
|
-
var
|
|
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
|
|
993
|
-
return new
|
|
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.
|
|
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
|
-
|
|
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/
|
|
804
|
-
var
|
|
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
|
|
966
|
-
return new
|
|
963
|
+
function createOcrAI(config) {
|
|
964
|
+
return new OcrAI(config);
|
|
967
965
|
}
|
|
968
966
|
|
|
969
|
-
export { BaseProvider, ClaudeProvider,
|
|
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
|