ocr-ai 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -20
- package/dist/index.d.mts +15 -7
- package/dist/index.d.ts +15 -7
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ocr-ai
|
|
2
2
|
|
|
3
3
|
Multi-provider AI document extraction for Node.js. Extract text or structured JSON from documents using Gemini, OpenAI, Claude, Grok, or Vertex AI.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm install
|
|
8
|
+
npm install ocr-ai
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
## Quick Start
|
|
@@ -13,14 +13,14 @@ npm install extracta-ai
|
|
|
13
13
|
### Using Gemini
|
|
14
14
|
|
|
15
15
|
```typescript
|
|
16
|
-
import {
|
|
16
|
+
import { OcrAI } from 'ocr-ai';
|
|
17
17
|
|
|
18
|
-
const
|
|
18
|
+
const ocr = new OcrAI({
|
|
19
19
|
provider: 'gemini',
|
|
20
20
|
apiKey: 'YOUR_GEMINI_API_KEY',
|
|
21
21
|
});
|
|
22
22
|
|
|
23
|
-
const result = await
|
|
23
|
+
const result = await ocr.extract('./invoice.png');
|
|
24
24
|
|
|
25
25
|
if (result.success) {
|
|
26
26
|
const text = result.content;
|
|
@@ -31,14 +31,14 @@ if (result.success) {
|
|
|
31
31
|
### Using OpenAI
|
|
32
32
|
|
|
33
33
|
```typescript
|
|
34
|
-
import {
|
|
34
|
+
import { OcrAI } from 'ocr-ai';
|
|
35
35
|
|
|
36
|
-
const
|
|
36
|
+
const ocr = new OcrAI({
|
|
37
37
|
provider: 'openai',
|
|
38
38
|
apiKey: 'YOUR_OPENAI_API_KEY',
|
|
39
39
|
});
|
|
40
40
|
|
|
41
|
-
const result = await
|
|
41
|
+
const result = await ocr.extract('./document.pdf');
|
|
42
42
|
|
|
43
43
|
if (result.success) {
|
|
44
44
|
const text = result.content;
|
|
@@ -46,12 +46,31 @@ if (result.success) {
|
|
|
46
46
|
}
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
+
### Custom Model
|
|
50
|
+
|
|
51
|
+
You can specify a custom model for any provider:
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
const ocr = new OcrAI({
|
|
55
|
+
provider: 'gemini',
|
|
56
|
+
apiKey: 'YOUR_GEMINI_API_KEY',
|
|
57
|
+
model: 'gemini-2.0-flash', // Use a specific model
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Or with OpenAI
|
|
61
|
+
const ocrOpenAI = new OcrAI({
|
|
62
|
+
provider: 'openai',
|
|
63
|
+
apiKey: 'YOUR_OPENAI_API_KEY',
|
|
64
|
+
model: 'gpt-4o-mini', // Use a different model
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
49
68
|
### From URL
|
|
50
69
|
|
|
51
70
|
Extract directly from a URL:
|
|
52
71
|
|
|
53
72
|
```typescript
|
|
54
|
-
const result = await
|
|
73
|
+
const result = await ocr.extract('https://example.com/invoice.png');
|
|
55
74
|
|
|
56
75
|
if (result.success) {
|
|
57
76
|
console.log(result.content);
|
|
@@ -63,7 +82,7 @@ if (result.success) {
|
|
|
63
82
|
You can provide custom instructions to guide the extraction:
|
|
64
83
|
|
|
65
84
|
```typescript
|
|
66
|
-
const result = await
|
|
85
|
+
const result = await ocr.extract('./receipt.png', {
|
|
67
86
|
prompt: 'Extract only the total amount and date from this receipt',
|
|
68
87
|
});
|
|
69
88
|
|
|
@@ -79,7 +98,7 @@ By default, extraction returns text. You can also extract structured JSON:
|
|
|
79
98
|
|
|
80
99
|
```typescript
|
|
81
100
|
// Text output (default)
|
|
82
|
-
const textResult = await
|
|
101
|
+
const textResult = await ocr.extract('./invoice.png', {
|
|
83
102
|
format: 'text',
|
|
84
103
|
});
|
|
85
104
|
|
|
@@ -88,7 +107,7 @@ if (textResult.success) {
|
|
|
88
107
|
}
|
|
89
108
|
|
|
90
109
|
// JSON output with schema
|
|
91
|
-
const jsonResult = await
|
|
110
|
+
const jsonResult = await ocr.extract('./invoice.png', {
|
|
92
111
|
format: 'json',
|
|
93
112
|
schema: {
|
|
94
113
|
invoice_number: 'string',
|
|
@@ -173,7 +192,7 @@ const invoiceSchema = {
|
|
|
173
192
|
total: 'number',
|
|
174
193
|
};
|
|
175
194
|
|
|
176
|
-
const result = await
|
|
195
|
+
const result = await ocr.extract('./invoice.png', {
|
|
177
196
|
format: 'json',
|
|
178
197
|
schema: invoiceSchema,
|
|
179
198
|
prompt: 'Extract all invoice data from this document.',
|
|
@@ -186,7 +205,7 @@ You can pass model-specific parameters like temperature, max tokens, and more:
|
|
|
186
205
|
|
|
187
206
|
```typescript
|
|
188
207
|
// Gemini with model config
|
|
189
|
-
const result = await
|
|
208
|
+
const result = await ocr.extract('./invoice.png', {
|
|
190
209
|
modelConfig: {
|
|
191
210
|
temperature: 0.2,
|
|
192
211
|
maxTokens: 4096,
|
|
@@ -196,7 +215,7 @@ const result = await extracta.extract('./invoice.png', {
|
|
|
196
215
|
});
|
|
197
216
|
|
|
198
217
|
// OpenAI with model config
|
|
199
|
-
const result = await
|
|
218
|
+
const result = await ocr.extract('./invoice.png', {
|
|
200
219
|
modelConfig: {
|
|
201
220
|
temperature: 0,
|
|
202
221
|
maxTokens: 2048,
|
|
@@ -220,7 +239,7 @@ Available options:
|
|
|
220
239
|
Access token usage information from the metadata:
|
|
221
240
|
|
|
222
241
|
```typescript
|
|
223
|
-
const result = await
|
|
242
|
+
const result = await ocr.extract('./invoice.png');
|
|
224
243
|
|
|
225
244
|
if (result.success) {
|
|
226
245
|
console.log(result.content);
|
|
@@ -269,9 +288,9 @@ The `vertex` provider enables access to Google Cloud's AI infrastructure, which
|
|
|
269
288
|
Vertex AI uses Google Cloud authentication instead of API keys:
|
|
270
289
|
|
|
271
290
|
```typescript
|
|
272
|
-
import {
|
|
291
|
+
import { OcrAI } from 'ocr-ai';
|
|
273
292
|
|
|
274
|
-
const
|
|
293
|
+
const ocr = new OcrAI({
|
|
275
294
|
provider: 'vertex',
|
|
276
295
|
vertexConfig: {
|
|
277
296
|
project: 'your-gcp-project-id',
|
|
@@ -279,7 +298,7 @@ const extracta = new ExtractaAI({
|
|
|
279
298
|
},
|
|
280
299
|
});
|
|
281
300
|
|
|
282
|
-
const result = await
|
|
301
|
+
const result = await ocr.extract('./invoice.png');
|
|
283
302
|
```
|
|
284
303
|
|
|
285
304
|
**Requirements:**
|
|
@@ -313,7 +332,7 @@ For specialized document processing beyond what Gemini models offer, Google Clou
|
|
|
313
332
|
- Handwriting detection
|
|
314
333
|
- Simple integration, ~98% accuracy on clean documents
|
|
315
334
|
|
|
316
|
-
These services are separate from
|
|
335
|
+
These services are separate from ocr-ai but can complement it for enterprise document pipelines.
|
|
317
336
|
|
|
318
337
|
## License
|
|
319
338
|
|
package/dist/index.d.mts
CHANGED
|
@@ -25,11 +25,19 @@ interface VertexConfig$1 {
|
|
|
25
25
|
location: string;
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
|
-
* Main configuration for
|
|
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
|
@@ -827,8 +827,8 @@ async function loadFileFromUrl(url) {
|
|
|
827
827
|
};
|
|
828
828
|
}
|
|
829
829
|
|
|
830
|
-
// src/
|
|
831
|
-
var
|
|
830
|
+
// src/ocr.ts
|
|
831
|
+
var OcrAI = class {
|
|
832
832
|
provider;
|
|
833
833
|
config;
|
|
834
834
|
constructor(config) {
|
|
@@ -989,18 +989,18 @@ var ExtractaAI = class {
|
|
|
989
989
|
this.provider = this.createProvider(this.config);
|
|
990
990
|
}
|
|
991
991
|
};
|
|
992
|
-
function
|
|
993
|
-
return new
|
|
992
|
+
function createOcrAI(config) {
|
|
993
|
+
return new OcrAI(config);
|
|
994
994
|
}
|
|
995
995
|
|
|
996
996
|
exports.BaseProvider = BaseProvider;
|
|
997
997
|
exports.ClaudeProvider = ClaudeProvider;
|
|
998
|
-
exports.ExtractaAI = ExtractaAI;
|
|
999
998
|
exports.GeminiProvider = GeminiProvider;
|
|
1000
999
|
exports.GrokProvider = GrokProvider;
|
|
1000
|
+
exports.OcrAI = OcrAI;
|
|
1001
1001
|
exports.OpenAIProvider = OpenAIProvider;
|
|
1002
1002
|
exports.VertexProvider = VertexProvider;
|
|
1003
|
-
exports.
|
|
1003
|
+
exports.createOcrAI = createOcrAI;
|
|
1004
1004
|
exports.getSupportedExtensions = getSupportedExtensions;
|
|
1005
1005
|
exports.isExtensionSupported = isExtensionSupported;
|
|
1006
1006
|
exports.isUrl = isUrl;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/base.provider.ts","../src/providers/gemini.provider.ts","../src/providers/openai.provider.ts","../src/providers/claude.provider.ts","../src/providers/grok.provider.ts","../src/providers/vertex.provider.ts","../src/loaders/file.loader.ts","../src/extracta.ts"],"names":["GoogleGenerativeAI","DEFAULT_MODEL","OpenAI","Anthropic","GoogleGenAI","path","fs"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n AIProvider,\n ExtractionOptions,\n FileInfo,\n IAIProvider,\n ProviderResult,\n SupportedFileType,\n} from '../types';\n\n/**\n * Base class for AI providers with common functionality\n */\nexport abstract class BaseProvider implements IAIProvider {\n abstract readonly name: AIProvider;\n abstract readonly model: string;\n\n protected apiKey: string;\n\n constructor(apiKey: string) {\n if (!apiKey || apiKey.trim() === '') {\n throw new Error(`API key is required for ${this.constructor.name}`);\n }\n this.apiKey = apiKey;\n }\n\n abstract extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>>;\n\n abstract extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>>;\n\n supportsFileType(type: SupportedFileType): boolean {\n return ['pdf', 'image', 'text'].includes(type);\n }\n\n /**\n * Build the text extraction prompt\n */\n protected buildTextPrompt(options?: ExtractionOptions): string {\n const basePrompt = options?.prompt || 'Extract all text content from this document.';\n const languageHint =\n options?.language && options.language !== 'auto'\n ? ` Respond in ${options.language}.`\n : '';\n\n return `${basePrompt}${languageHint}\n\nPlease extract and return all the text content from the provided document.\nMaintain the original structure and formatting as much as possible.\nReturn only the extracted text, without any additional commentary or metadata.`;\n }\n\n /**\n * Build the JSON extraction prompt\n */\n protected buildJsonPrompt(\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): string {\n const basePrompt =\n options?.prompt || 'Extract structured data from this document.';\n const languageHint =\n options?.language && options.language !== 'auto'\n ? ` Text content should be in ${options.language}.`\n : '';\n\n return `${basePrompt}${languageHint}\n\nExtract data from the provided document and return it as a JSON object following this schema:\n\n${JSON.stringify(schema, null, 2)}\n\nImportant:\n- Return ONLY valid JSON, no additional text or markdown formatting\n- Follow the schema structure exactly\n- If a field cannot be extracted, use null\n- Do not include any explanation, just the JSON object`;\n }\n\n /**\n * Parse JSON response from AI, handling potential formatting issues\n */\n protected parseJsonResponse<T>(response: string): T {\n let cleaned = response.trim();\n\n // Remove markdown code blocks if present\n if (cleaned.startsWith('```json')) {\n cleaned = cleaned.slice(7);\n } else if (cleaned.startsWith('```')) {\n cleaned = cleaned.slice(3);\n }\n\n if (cleaned.endsWith('```')) {\n cleaned = cleaned.slice(0, -3);\n }\n\n cleaned = cleaned.trim();\n\n try {\n return JSON.parse(cleaned) as T;\n } catch {\n throw new Error(`Failed to parse JSON response: ${response.substring(0, 200)}...`);\n }\n }\n}\n","import { GoogleGenerativeAI, type GenerationConfig } from '@google/generative-ai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'gemini-1.5-flash';\n\nexport class GeminiProvider extends BaseProvider {\n readonly name: AIProvider = 'gemini';\n readonly model: string;\n\n private client: GoogleGenerativeAI;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new GoogleGenerativeAI(apiKey);\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const generationConfig = this.buildGenerationConfig(options?.modelConfig);\n const model = this.client.getGenerativeModel({\n model: this.model,\n generationConfig,\n });\n const prompt = this.buildTextPrompt(options);\n\n const content = this.buildContent(file, prompt);\n const result = await model.generateContent(content);\n const response = result.response;\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.text(),\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const generationConfig = this.buildGenerationConfig(options?.modelConfig, {\n responseMimeType: 'application/json',\n });\n const model = this.client.getGenerativeModel({\n model: this.model,\n generationConfig,\n });\n\n const prompt = this.buildJsonPrompt(schema, options);\n const content = this.buildContent(file, prompt);\n\n const result = await model.generateContent(content);\n const response = result.response;\n const text = response.text();\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildGenerationConfig(\n modelConfig?: ModelConfig,\n defaults?: Partial<GenerationConfig>\n ): GenerationConfig {\n const config: GenerationConfig = { ...defaults };\n\n if (modelConfig?.temperature !== undefined) {\n config.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n config.maxOutputTokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n config.topP = modelConfig.topP;\n }\n if (modelConfig?.topK !== undefined) {\n config.topK = modelConfig.topK;\n }\n if (modelConfig?.stopSequences !== undefined) {\n config.stopSequences = modelConfig.stopSequences;\n }\n\n return config;\n }\n\n private extractTokenUsage(response: { usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number } }): TokenUsage | undefined {\n const usage = response.usageMetadata;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.promptTokenCount || 0,\n outputTokens: usage.candidatesTokenCount || 0,\n totalTokens: usage.totalTokenCount || 0,\n };\n }\n\n private buildContent(\n file: FileInfo,\n prompt: string\n ): Parameters<ReturnType<GoogleGenerativeAI['getGenerativeModel']>['generateContent']>[0] {\n if (file.type === 'text') {\n return `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`;\n }\n\n // For images and PDFs, use inline data\n return [\n {\n inlineData: {\n mimeType: file.mimeType,\n data: file.base64 || file.content.toString('base64'),\n },\n },\n { text: prompt },\n ];\n }\n}\n","import OpenAI from 'openai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'gpt-4o';\n\nexport class OpenAIProvider extends BaseProvider {\n readonly name: AIProvider = 'openai';\n readonly model: string;\n\n private client: OpenAI;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new OpenAI({ apiKey });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n });\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.choices[0]?.message?.content || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n response_format: { type: 'json_object' },\n });\n\n const text = response.choices[0]?.message?.content || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildCompletionOptions(modelConfig?: ModelConfig): Record<string, unknown> {\n const options: Record<string, unknown> = {\n max_tokens: 16384,\n };\n\n if (modelConfig?.temperature !== undefined) {\n options.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n options.max_tokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n options.top_p = modelConfig.topP;\n }\n if (modelConfig?.stopSequences !== undefined) {\n options.stop = modelConfig.stopSequences;\n }\n\n return options;\n }\n\n private extractTokenUsage(response: OpenAI.Chat.Completions.ChatCompletion): TokenUsage | undefined {\n const usage = response.usage;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n }\n\n private buildMessages(\n file: FileInfo,\n prompt: string\n ): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\n if (file.type === 'text') {\n return [\n {\n role: 'user',\n content: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`,\n },\n ];\n }\n\n // For images and PDFs\n const base64 = file.base64 || file.content.toString('base64');\n const imageUrl = `data:${file.mimeType};base64,${base64}`;\n\n return [\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imageUrl,\n detail: 'high',\n },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n },\n ];\n }\n}\n","import Anthropic from '@anthropic-ai/sdk';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, SupportedFileType, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'claude-sonnet-4-20250514';\n\ntype ImageMediaType = 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp';\n\nexport class ClaudeProvider extends BaseProvider {\n readonly name: AIProvider = 'claude';\n readonly model: string;\n\n private client: Anthropic;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new Anthropic({ apiKey });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const messageOptions = this.buildMessageOptions(options?.modelConfig);\n\n const response = await this.client.messages.create({\n model: this.model,\n messages: [\n {\n role: 'user',\n content: this.buildContent(file, prompt),\n },\n ],\n max_tokens: messageOptions.max_tokens,\n temperature: messageOptions.temperature,\n top_p: messageOptions.top_p,\n top_k: messageOptions.top_k,\n stop_sequences: messageOptions.stop_sequences,\n });\n\n const textBlock = response.content.find((block) => block.type === 'text');\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: textBlock?.text || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const messageOptions = this.buildMessageOptions(options?.modelConfig);\n\n const response = await this.client.messages.create({\n model: this.model,\n messages: [\n {\n role: 'user',\n content: this.buildContent(file, prompt),\n },\n ],\n max_tokens: messageOptions.max_tokens,\n temperature: messageOptions.temperature,\n top_p: messageOptions.top_p,\n top_k: messageOptions.top_k,\n stop_sequences: messageOptions.stop_sequences,\n });\n\n const textBlock = response.content.find((block) => block.type === 'text');\n const text = textBlock?.text || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildMessageOptions(modelConfig?: ModelConfig): {\n max_tokens: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n stop_sequences?: string[];\n } {\n const options: {\n max_tokens: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n stop_sequences?: string[];\n } = {\n max_tokens: 16384,\n };\n\n if (modelConfig?.temperature !== undefined) {\n options.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n options.max_tokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n options.top_p = modelConfig.topP;\n }\n if (modelConfig?.topK !== undefined) {\n options.top_k = modelConfig.topK;\n }\n if (modelConfig?.stopSequences !== undefined) {\n options.stop_sequences = modelConfig.stopSequences;\n }\n\n return options;\n }\n\n supportsFileType(type: SupportedFileType): boolean {\n // Claude supports images and PDFs via vision\n return ['pdf', 'image', 'text'].includes(type);\n }\n\n private extractTokenUsage(response: Anthropic.Message): TokenUsage | undefined {\n return {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n totalTokens: response.usage.input_tokens + response.usage.output_tokens,\n };\n }\n\n private buildContent(file: FileInfo, prompt: string): Anthropic.MessageCreateParams['messages'][0]['content'] {\n if (file.type === 'text') {\n return `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`;\n }\n\n const base64 = file.base64 || file.content.toString('base64');\n\n // Handle PDF files - Claude supports PDFs via base64\n if (file.type === 'pdf') {\n // For PDFs, we use the document block type\n return [\n {\n type: 'document' as const,\n source: {\n type: 'base64' as const,\n media_type: 'application/pdf' as const,\n data: base64,\n },\n },\n {\n type: 'text' as const,\n text: prompt,\n },\n ] as Anthropic.MessageCreateParams['messages'][0]['content'];\n }\n\n // Handle images\n return [\n {\n type: 'image' as const,\n source: {\n type: 'base64' as const,\n media_type: this.getMediaType(file.mimeType),\n data: base64,\n },\n },\n {\n type: 'text' as const,\n text: prompt,\n },\n ];\n }\n\n private getMediaType(mimeType: string): ImageMediaType {\n const supportedTypes: ImageMediaType[] = [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n ];\n\n if (supportedTypes.includes(mimeType as ImageMediaType)) {\n return mimeType as ImageMediaType;\n }\n\n // Default to JPEG for unsupported image types\n return 'image/jpeg';\n }\n}\n","import OpenAI from 'openai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\n// Grok uses OpenAI-compatible API\nconst GROK_BASE_URL = 'https://api.x.ai/v1';\nconst DEFAULT_MODEL = 'grok-2-vision-1212';\n\nexport class GrokProvider extends BaseProvider {\n readonly name: AIProvider = 'grok';\n readonly model: string;\n\n private client: OpenAI;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new OpenAI({\n apiKey,\n baseURL: GROK_BASE_URL,\n });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n });\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.choices[0]?.message?.content || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n });\n\n const text = response.choices[0]?.message?.content || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildCompletionOptions(modelConfig?: ModelConfig): Record<string, unknown> {\n const options: Record<string, unknown> = {\n max_tokens: 16384,\n };\n\n if (modelConfig?.temperature !== undefined) {\n options.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n options.max_tokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n options.top_p = modelConfig.topP;\n }\n if (modelConfig?.stopSequences !== undefined) {\n options.stop = modelConfig.stopSequences;\n }\n\n return options;\n }\n\n private extractTokenUsage(response: OpenAI.Chat.Completions.ChatCompletion): TokenUsage | undefined {\n const usage = response.usage;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n }\n\n private buildMessages(\n file: FileInfo,\n prompt: string\n ): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\n if (file.type === 'text') {\n return [\n {\n role: 'user',\n content: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`,\n },\n ];\n }\n\n // For images and PDFs - Grok uses OpenAI-compatible format\n const base64 = file.base64 || file.content.toString('base64');\n const imageUrl = `data:${file.mimeType};base64,${base64}`;\n\n return [\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imageUrl,\n detail: 'high',\n },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n },\n ];\n }\n}\n","import { GoogleGenAI } from '@google/genai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'gemini-2.0-flash';\n\nexport interface VertexConfig {\n project: string;\n location: string;\n}\n\nexport class VertexProvider extends BaseProvider {\n readonly name: AIProvider = 'vertex';\n readonly model: string;\n\n private client: GoogleGenAI;\n\n constructor(config: VertexConfig, model?: string) {\n super('vertex');\n this.model = model || DEFAULT_MODEL;\n this.client = new GoogleGenAI({\n vertexai: true,\n project: config.project,\n location: config.location,\n });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const generationConfig = this.buildGenerationConfig(options?.modelConfig);\n\n const response = await this.client.models.generateContent({\n model: this.model,\n contents: this.buildContents(file, prompt),\n config: generationConfig,\n });\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.text || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const generationConfig = this.buildGenerationConfig(options?.modelConfig, {\n responseMimeType: 'application/json',\n });\n\n const response = await this.client.models.generateContent({\n model: this.model,\n contents: this.buildContents(file, prompt),\n config: generationConfig,\n });\n\n const text = response.text || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildGenerationConfig(\n modelConfig?: ModelConfig,\n defaults?: Record<string, unknown>\n ): Record<string, unknown> {\n const config: Record<string, unknown> = { ...defaults };\n\n if (modelConfig?.temperature !== undefined) {\n config.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n config.maxOutputTokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n config.topP = modelConfig.topP;\n }\n if (modelConfig?.topK !== undefined) {\n config.topK = modelConfig.topK;\n }\n if (modelConfig?.stopSequences !== undefined) {\n config.stopSequences = modelConfig.stopSequences;\n }\n\n return config;\n }\n\n private extractTokenUsage(response: { usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number } }): TokenUsage | undefined {\n const usage = response.usageMetadata;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.promptTokenCount || 0,\n outputTokens: usage.candidatesTokenCount || 0,\n totalTokens: usage.totalTokenCount || 0,\n };\n }\n\n private buildContents(file: FileInfo, prompt: string): Array<{ role: string; parts: Array<{ text?: string; inlineData?: { mimeType: string; data: string } }> }> {\n if (file.type === 'text') {\n return [\n {\n role: 'user',\n parts: [\n { text: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}` },\n ],\n },\n ];\n }\n\n // For images and PDFs\n const base64 = file.base64 || file.content.toString('base64');\n\n return [\n {\n role: 'user',\n parts: [\n {\n inlineData: {\n mimeType: file.mimeType,\n data: base64,\n },\n },\n { text: prompt },\n ],\n },\n ];\n }\n}\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { FileInfo, SupportedFileType } from '../types';\n\n/**\n * MIME type to file type mapping\n */\nconst MIME_TO_FILE_TYPE: Record<string, SupportedFileType> = {\n 'application/pdf': 'pdf',\n 'image/jpeg': 'image',\n 'image/png': 'image',\n 'image/gif': 'image',\n 'image/webp': 'image',\n 'image/bmp': 'image',\n 'image/tiff': 'image',\n 'text/plain': 'text',\n 'text/markdown': 'text',\n 'text/csv': 'text',\n 'application/json': 'text',\n 'application/xml': 'text',\n 'text/html': 'text',\n};\n\n/**\n * MIME type mappings for supported file types\n */\nconst MIME_TYPES: Record<string, string> = {\n // PDF\n '.pdf': 'application/pdf',\n\n // Images\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.bmp': 'image/bmp',\n '.tiff': 'image/tiff',\n '.tif': 'image/tiff',\n\n // Text files\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.csv': 'text/csv',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.html': 'text/html',\n '.htm': 'text/html',\n};\n\n/**\n * File type categories\n */\nconst FILE_TYPE_CATEGORIES: Record<string, SupportedFileType> = {\n '.pdf': 'pdf',\n '.jpg': 'image',\n '.jpeg': 'image',\n '.png': 'image',\n '.gif': 'image',\n '.webp': 'image',\n '.bmp': 'image',\n '.tiff': 'image',\n '.tif': 'image',\n '.txt': 'text',\n '.md': 'text',\n '.csv': 'text',\n '.json': 'text',\n '.xml': 'text',\n '.html': 'text',\n '.htm': 'text',\n};\n\n/**\n * Load a file from disk and prepare it for AI processing\n */\nexport async function loadFile(filePath: string): Promise<FileInfo> {\n const absolutePath = path.resolve(filePath);\n\n // Check if file exists\n try {\n await fs.access(absolutePath);\n } catch {\n throw new Error(`File not found: ${absolutePath}`);\n }\n\n // Get file stats\n const stats = await fs.stat(absolutePath);\n\n if (!stats.isFile()) {\n throw new Error(`Path is not a file: ${absolutePath}`);\n }\n\n // Get file extension and determine type\n const ext = path.extname(absolutePath).toLowerCase();\n const fileName = path.basename(absolutePath);\n\n const mimeType = MIME_TYPES[ext];\n const fileType = FILE_TYPE_CATEGORIES[ext];\n\n if (!mimeType || !fileType) {\n throw new Error(\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\n );\n }\n\n // Read file content\n const content = await fs.readFile(absolutePath);\n\n // Prepare base64 for non-text files\n const base64 = fileType !== 'text' ? content.toString('base64') : undefined;\n\n return {\n path: absolutePath,\n name: fileName,\n type: fileType,\n mimeType,\n size: stats.size,\n content,\n base64,\n };\n}\n\n/**\n * Load a file from a Buffer\n */\nexport function loadFileFromBuffer(\n buffer: Buffer,\n fileName: string,\n mimeType?: string\n): FileInfo {\n const ext = path.extname(fileName).toLowerCase();\n const detectedMimeType = mimeType || MIME_TYPES[ext];\n const fileType = FILE_TYPE_CATEGORIES[ext];\n\n if (!detectedMimeType || !fileType) {\n throw new Error(\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\n );\n }\n\n const base64 = fileType !== 'text' ? buffer.toString('base64') : undefined;\n\n return {\n path: '',\n name: fileName,\n type: fileType,\n mimeType: detectedMimeType,\n size: buffer.length,\n content: buffer,\n base64,\n };\n}\n\n/**\n * Load a file from base64 string\n */\nexport function loadFileFromBase64(\n base64: string,\n fileName: string,\n mimeType?: string\n): FileInfo {\n // Remove data URL prefix if present\n const base64Data = base64.includes(',') ? base64.split(',')[1] : base64;\n const buffer = Buffer.from(base64Data, 'base64');\n\n const ext = path.extname(fileName).toLowerCase();\n const detectedMimeType = mimeType || MIME_TYPES[ext];\n const fileType = FILE_TYPE_CATEGORIES[ext];\n\n if (!detectedMimeType || !fileType) {\n throw new Error(\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\n );\n }\n\n return {\n path: '',\n name: fileName,\n type: fileType,\n mimeType: detectedMimeType,\n size: buffer.length,\n content: buffer,\n base64: base64Data,\n };\n}\n\n/**\n * Save content to a file\n */\nexport async function saveToFile(filePath: string, content: string | Buffer): Promise<void> {\n const absolutePath = path.resolve(filePath);\n const dir = path.dirname(absolutePath);\n\n // Ensure directory exists\n await fs.mkdir(dir, { recursive: true });\n\n // Write file\n await fs.writeFile(absolutePath, content, typeof content === 'string' ? 'utf-8' : undefined);\n}\n\n/**\n * Get supported file extensions\n */\nexport function getSupportedExtensions(): string[] {\n return Object.keys(MIME_TYPES);\n}\n\n/**\n * Check if a file extension is supported\n */\nexport function isExtensionSupported(ext: string): boolean {\n const normalizedExt = ext.startsWith('.') ? ext.toLowerCase() : `.${ext.toLowerCase()}`;\n return normalizedExt in MIME_TYPES;\n}\n\n/**\n * Check if a string is a URL\n */\nexport function isUrl(str: string): boolean {\n return str.startsWith('http://') || str.startsWith('https://');\n}\n\n/**\n * Load a file from a URL\n */\nexport async function loadFileFromUrl(url: string): Promise<FileInfo> {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch URL: ${response.status} ${response.statusText}`);\n }\n\n const contentType = response.headers.get('content-type')?.split(';')[0] || '';\n const buffer = Buffer.from(await response.arrayBuffer());\n\n // Try to get filename from URL or Content-Disposition header\n const contentDisposition = response.headers.get('content-disposition');\n let fileName = '';\n\n if (contentDisposition) {\n const match = contentDisposition.match(/filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/);\n if (match) {\n fileName = match[1].replace(/['\"]/g, '');\n }\n }\n\n if (!fileName) {\n // Extract filename from URL path\n const urlPath = new URL(url).pathname;\n fileName = path.basename(urlPath) || 'download';\n }\n\n // Determine file type from content-type header or extension\n let fileType = MIME_TO_FILE_TYPE[contentType];\n let mimeType = contentType;\n\n if (!fileType) {\n // Try to determine from file extension\n const ext = path.extname(fileName).toLowerCase();\n mimeType = MIME_TYPES[ext];\n fileType = FILE_TYPE_CATEGORIES[ext];\n }\n\n if (!fileType || !mimeType) {\n throw new Error(\n `Unsupported file type from URL. Content-Type: ${contentType}, Filename: ${fileName}`\n );\n }\n\n const base64 = fileType !== 'text' ? buffer.toString('base64') : undefined;\n\n return {\n path: url,\n name: fileName,\n type: fileType,\n mimeType,\n size: buffer.length,\n content: buffer,\n base64,\n };\n}\n","import type {\n AIProvider,\n ExtractaConfig,\n ExtractionOptions,\n ExtractionResult,\n FileInfo,\n IAIProvider,\n JsonExtractionResult,\n TextExtractionResult,\n} from './types';\nimport {\n ClaudeProvider,\n GeminiProvider,\n GrokProvider,\n OpenAIProvider,\n VertexProvider,\n} from './providers';\nimport {\n loadFile,\n loadFileFromBase64,\n loadFileFromBuffer,\n loadFileFromUrl,\n isUrl,\n saveToFile,\n} from './loaders';\n\n/**\n * Main class for document extraction using AI\n */\nexport class ExtractaAI {\n private provider: IAIProvider;\n private config: ExtractaConfig;\n\n constructor(config: ExtractaConfig) {\n this.config = config;\n this.provider = this.createProvider(config);\n }\n\n /**\n * Create a provider instance based on configuration\n */\n private createProvider(config: ExtractaConfig): IAIProvider {\n switch (config.provider) {\n case 'gemini':\n if (!config.apiKey) throw new Error('API key is required for Gemini provider');\n return new GeminiProvider(config.apiKey, config.model);\n case 'openai':\n if (!config.apiKey) throw new Error('API key is required for OpenAI provider');\n return new OpenAIProvider(config.apiKey, config.model);\n case 'claude':\n if (!config.apiKey) throw new Error('API key is required for Claude provider');\n return new ClaudeProvider(config.apiKey, config.model);\n case 'grok':\n if (!config.apiKey) throw new Error('API key is required for Grok provider');\n return new GrokProvider(config.apiKey, config.model);\n case 'vertex':\n if (!config.vertexConfig) throw new Error('vertexConfig is required for Vertex AI provider');\n return new VertexProvider(config.vertexConfig, config.model);\n default:\n throw new Error(`Unsupported provider: ${config.provider}`);\n }\n }\n\n /**\n * Extract content from a file path or URL\n */\n async extract(\n source: string,\n options?: ExtractionOptions\n ): Promise<ExtractionResult> {\n const startTime = Date.now();\n\n try {\n const file = isUrl(source)\n ? await loadFileFromUrl(source)\n : await loadFile(source);\n return this.processExtraction(file, options, startTime);\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Extract content from a Buffer\n */\n async extractFromBuffer(\n buffer: Buffer,\n fileName: string,\n options?: ExtractionOptions\n ): Promise<ExtractionResult> {\n const startTime = Date.now();\n\n try {\n const file = loadFileFromBuffer(buffer, fileName);\n return this.processExtraction(file, options, startTime);\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Extract content from a base64 string\n */\n async extractFromBase64(\n base64: string,\n fileName: string,\n options?: ExtractionOptions\n ): Promise<ExtractionResult> {\n const startTime = Date.now();\n\n try {\n const file = loadFileFromBase64(base64, fileName);\n return this.processExtraction(file, options, startTime);\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Process the extraction based on format\n */\n private async processExtraction(\n file: FileInfo,\n options: ExtractionOptions | undefined,\n startTime: number\n ): Promise<ExtractionResult> {\n const format = options?.format || 'text';\n\n // Check if provider supports the file type\n if (!this.provider.supportsFileType(file.type)) {\n return {\n success: false,\n error: `Provider ${this.provider.name} does not support file type: ${file.type}`,\n code: 'UNSUPPORTED_FILE_TYPE',\n };\n }\n\n try {\n if (format === 'json') {\n if (!options?.schema) {\n return {\n success: false,\n error: 'Schema is required for JSON extraction',\n code: 'MISSING_SCHEMA',\n };\n }\n\n const providerResult = await this.provider.extractJson(file, options.schema, options);\n const result: JsonExtractionResult = {\n success: true,\n format: 'json',\n data: providerResult.content,\n metadata: {\n provider: this.provider.name,\n model: this.provider.model,\n fileType: file.type,\n fileName: file.name,\n processingTimeMs: Date.now() - startTime,\n tokens: providerResult.tokens,\n },\n };\n\n // Save to file if outputPath is specified\n if (options.outputPath) {\n await saveToFile(options.outputPath, JSON.stringify(providerResult.content, null, 2));\n }\n\n return result;\n } else {\n const providerResult = await this.provider.extractText(file, options);\n const result: TextExtractionResult = {\n success: true,\n format: 'text',\n content: providerResult.content,\n metadata: {\n provider: this.provider.name,\n model: this.provider.model,\n fileType: file.type,\n fileName: file.name,\n processingTimeMs: Date.now() - startTime,\n tokens: providerResult.tokens,\n },\n };\n\n // Save to file if outputPath is specified\n if (options?.outputPath) {\n await saveToFile(options.outputPath, providerResult.content);\n }\n\n return result;\n }\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Create an error result\n */\n private createErrorResult(error: unknown): ExtractionResult {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: message,\n code: 'EXTRACTION_ERROR',\n };\n }\n\n /**\n * Get current provider name\n */\n getProvider(): AIProvider {\n return this.provider.name;\n }\n\n /**\n * Get current model\n */\n getModel(): string {\n return this.provider.model;\n }\n\n /**\n * Change the AI provider\n */\n setProvider(provider: AIProvider, apiKey: string, model?: string): void {\n this.config = { provider, apiKey, model };\n this.provider = this.createProvider(this.config);\n }\n}\n\n/**\n * Factory function to create ExtractaAI instance\n */\nexport function createExtractaAI(config: ExtractaConfig): ExtractaAI {\n return new ExtractaAI(config);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/providers/base.provider.ts","../src/providers/gemini.provider.ts","../src/providers/openai.provider.ts","../src/providers/claude.provider.ts","../src/providers/grok.provider.ts","../src/providers/vertex.provider.ts","../src/loaders/file.loader.ts","../src/ocr.ts"],"names":["GoogleGenerativeAI","DEFAULT_MODEL","OpenAI","Anthropic","GoogleGenAI","path","fs"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n AIProvider,\n ExtractionOptions,\n FileInfo,\n IAIProvider,\n ProviderResult,\n SupportedFileType,\n} from '../types';\n\n/**\n * Base class for AI providers with common functionality\n */\nexport abstract class BaseProvider implements IAIProvider {\n abstract readonly name: AIProvider;\n abstract readonly model: string;\n\n protected apiKey: string;\n\n constructor(apiKey: string) {\n if (!apiKey || apiKey.trim() === '') {\n throw new Error(`API key is required for ${this.constructor.name}`);\n }\n this.apiKey = apiKey;\n }\n\n abstract extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>>;\n\n abstract extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>>;\n\n supportsFileType(type: SupportedFileType): boolean {\n return ['pdf', 'image', 'text'].includes(type);\n }\n\n /**\n * Build the text extraction prompt\n */\n protected buildTextPrompt(options?: ExtractionOptions): string {\n const basePrompt = options?.prompt || 'Extract all text content from this document.';\n const languageHint =\n options?.language && options.language !== 'auto'\n ? ` Respond in ${options.language}.`\n : '';\n\n return `${basePrompt}${languageHint}\n\nPlease extract and return all the text content from the provided document.\nMaintain the original structure and formatting as much as possible.\nReturn only the extracted text, without any additional commentary or metadata.`;\n }\n\n /**\n * Build the JSON extraction prompt\n */\n protected buildJsonPrompt(\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): string {\n const basePrompt =\n options?.prompt || 'Extract structured data from this document.';\n const languageHint =\n options?.language && options.language !== 'auto'\n ? ` Text content should be in ${options.language}.`\n : '';\n\n return `${basePrompt}${languageHint}\n\nExtract data from the provided document and return it as a JSON object following this schema:\n\n${JSON.stringify(schema, null, 2)}\n\nImportant:\n- Return ONLY valid JSON, no additional text or markdown formatting\n- Follow the schema structure exactly\n- If a field cannot be extracted, use null\n- Do not include any explanation, just the JSON object`;\n }\n\n /**\n * Parse JSON response from AI, handling potential formatting issues\n */\n protected parseJsonResponse<T>(response: string): T {\n let cleaned = response.trim();\n\n // Remove markdown code blocks if present\n if (cleaned.startsWith('```json')) {\n cleaned = cleaned.slice(7);\n } else if (cleaned.startsWith('```')) {\n cleaned = cleaned.slice(3);\n }\n\n if (cleaned.endsWith('```')) {\n cleaned = cleaned.slice(0, -3);\n }\n\n cleaned = cleaned.trim();\n\n try {\n return JSON.parse(cleaned) as T;\n } catch {\n throw new Error(`Failed to parse JSON response: ${response.substring(0, 200)}...`);\n }\n }\n}\n","import { GoogleGenerativeAI, type GenerationConfig } from '@google/generative-ai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'gemini-1.5-flash';\n\nexport class GeminiProvider extends BaseProvider {\n readonly name: AIProvider = 'gemini';\n readonly model: string;\n\n private client: GoogleGenerativeAI;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new GoogleGenerativeAI(apiKey);\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const generationConfig = this.buildGenerationConfig(options?.modelConfig);\n const model = this.client.getGenerativeModel({\n model: this.model,\n generationConfig,\n });\n const prompt = this.buildTextPrompt(options);\n\n const content = this.buildContent(file, prompt);\n const result = await model.generateContent(content);\n const response = result.response;\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.text(),\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const generationConfig = this.buildGenerationConfig(options?.modelConfig, {\n responseMimeType: 'application/json',\n });\n const model = this.client.getGenerativeModel({\n model: this.model,\n generationConfig,\n });\n\n const prompt = this.buildJsonPrompt(schema, options);\n const content = this.buildContent(file, prompt);\n\n const result = await model.generateContent(content);\n const response = result.response;\n const text = response.text();\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildGenerationConfig(\n modelConfig?: ModelConfig,\n defaults?: Partial<GenerationConfig>\n ): GenerationConfig {\n const config: GenerationConfig = { ...defaults };\n\n if (modelConfig?.temperature !== undefined) {\n config.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n config.maxOutputTokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n config.topP = modelConfig.topP;\n }\n if (modelConfig?.topK !== undefined) {\n config.topK = modelConfig.topK;\n }\n if (modelConfig?.stopSequences !== undefined) {\n config.stopSequences = modelConfig.stopSequences;\n }\n\n return config;\n }\n\n private extractTokenUsage(response: { usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number } }): TokenUsage | undefined {\n const usage = response.usageMetadata;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.promptTokenCount || 0,\n outputTokens: usage.candidatesTokenCount || 0,\n totalTokens: usage.totalTokenCount || 0,\n };\n }\n\n private buildContent(\n file: FileInfo,\n prompt: string\n ): Parameters<ReturnType<GoogleGenerativeAI['getGenerativeModel']>['generateContent']>[0] {\n if (file.type === 'text') {\n return `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`;\n }\n\n // For images and PDFs, use inline data\n return [\n {\n inlineData: {\n mimeType: file.mimeType,\n data: file.base64 || file.content.toString('base64'),\n },\n },\n { text: prompt },\n ];\n }\n}\n","import OpenAI from 'openai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'gpt-4o';\n\nexport class OpenAIProvider extends BaseProvider {\n readonly name: AIProvider = 'openai';\n readonly model: string;\n\n private client: OpenAI;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new OpenAI({ apiKey });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n });\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.choices[0]?.message?.content || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n response_format: { type: 'json_object' },\n });\n\n const text = response.choices[0]?.message?.content || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildCompletionOptions(modelConfig?: ModelConfig): Record<string, unknown> {\n const options: Record<string, unknown> = {\n max_tokens: 16384,\n };\n\n if (modelConfig?.temperature !== undefined) {\n options.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n options.max_tokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n options.top_p = modelConfig.topP;\n }\n if (modelConfig?.stopSequences !== undefined) {\n options.stop = modelConfig.stopSequences;\n }\n\n return options;\n }\n\n private extractTokenUsage(response: OpenAI.Chat.Completions.ChatCompletion): TokenUsage | undefined {\n const usage = response.usage;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n }\n\n private buildMessages(\n file: FileInfo,\n prompt: string\n ): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\n if (file.type === 'text') {\n return [\n {\n role: 'user',\n content: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`,\n },\n ];\n }\n\n // For images and PDFs\n const base64 = file.base64 || file.content.toString('base64');\n const imageUrl = `data:${file.mimeType};base64,${base64}`;\n\n return [\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imageUrl,\n detail: 'high',\n },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n },\n ];\n }\n}\n","import Anthropic from '@anthropic-ai/sdk';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, SupportedFileType, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'claude-sonnet-4-20250514';\n\ntype ImageMediaType = 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp';\n\nexport class ClaudeProvider extends BaseProvider {\n readonly name: AIProvider = 'claude';\n readonly model: string;\n\n private client: Anthropic;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new Anthropic({ apiKey });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const messageOptions = this.buildMessageOptions(options?.modelConfig);\n\n const response = await this.client.messages.create({\n model: this.model,\n messages: [\n {\n role: 'user',\n content: this.buildContent(file, prompt),\n },\n ],\n max_tokens: messageOptions.max_tokens,\n temperature: messageOptions.temperature,\n top_p: messageOptions.top_p,\n top_k: messageOptions.top_k,\n stop_sequences: messageOptions.stop_sequences,\n });\n\n const textBlock = response.content.find((block) => block.type === 'text');\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: textBlock?.text || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const messageOptions = this.buildMessageOptions(options?.modelConfig);\n\n const response = await this.client.messages.create({\n model: this.model,\n messages: [\n {\n role: 'user',\n content: this.buildContent(file, prompt),\n },\n ],\n max_tokens: messageOptions.max_tokens,\n temperature: messageOptions.temperature,\n top_p: messageOptions.top_p,\n top_k: messageOptions.top_k,\n stop_sequences: messageOptions.stop_sequences,\n });\n\n const textBlock = response.content.find((block) => block.type === 'text');\n const text = textBlock?.text || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildMessageOptions(modelConfig?: ModelConfig): {\n max_tokens: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n stop_sequences?: string[];\n } {\n const options: {\n max_tokens: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n stop_sequences?: string[];\n } = {\n max_tokens: 16384,\n };\n\n if (modelConfig?.temperature !== undefined) {\n options.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n options.max_tokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n options.top_p = modelConfig.topP;\n }\n if (modelConfig?.topK !== undefined) {\n options.top_k = modelConfig.topK;\n }\n if (modelConfig?.stopSequences !== undefined) {\n options.stop_sequences = modelConfig.stopSequences;\n }\n\n return options;\n }\n\n supportsFileType(type: SupportedFileType): boolean {\n // Claude supports images and PDFs via vision\n return ['pdf', 'image', 'text'].includes(type);\n }\n\n private extractTokenUsage(response: Anthropic.Message): TokenUsage | undefined {\n return {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n totalTokens: response.usage.input_tokens + response.usage.output_tokens,\n };\n }\n\n private buildContent(file: FileInfo, prompt: string): Anthropic.MessageCreateParams['messages'][0]['content'] {\n if (file.type === 'text') {\n return `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`;\n }\n\n const base64 = file.base64 || file.content.toString('base64');\n\n // Handle PDF files - Claude supports PDFs via base64\n if (file.type === 'pdf') {\n // For PDFs, we use the document block type\n return [\n {\n type: 'document' as const,\n source: {\n type: 'base64' as const,\n media_type: 'application/pdf' as const,\n data: base64,\n },\n },\n {\n type: 'text' as const,\n text: prompt,\n },\n ] as Anthropic.MessageCreateParams['messages'][0]['content'];\n }\n\n // Handle images\n return [\n {\n type: 'image' as const,\n source: {\n type: 'base64' as const,\n media_type: this.getMediaType(file.mimeType),\n data: base64,\n },\n },\n {\n type: 'text' as const,\n text: prompt,\n },\n ];\n }\n\n private getMediaType(mimeType: string): ImageMediaType {\n const supportedTypes: ImageMediaType[] = [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n ];\n\n if (supportedTypes.includes(mimeType as ImageMediaType)) {\n return mimeType as ImageMediaType;\n }\n\n // Default to JPEG for unsupported image types\n return 'image/jpeg';\n }\n}\n","import OpenAI from 'openai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\n// Grok uses OpenAI-compatible API\nconst GROK_BASE_URL = 'https://api.x.ai/v1';\nconst DEFAULT_MODEL = 'grok-2-vision-1212';\n\nexport class GrokProvider extends BaseProvider {\n readonly name: AIProvider = 'grok';\n readonly model: string;\n\n private client: OpenAI;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new OpenAI({\n apiKey,\n baseURL: GROK_BASE_URL,\n });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n });\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.choices[0]?.message?.content || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n });\n\n const text = response.choices[0]?.message?.content || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildCompletionOptions(modelConfig?: ModelConfig): Record<string, unknown> {\n const options: Record<string, unknown> = {\n max_tokens: 16384,\n };\n\n if (modelConfig?.temperature !== undefined) {\n options.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n options.max_tokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n options.top_p = modelConfig.topP;\n }\n if (modelConfig?.stopSequences !== undefined) {\n options.stop = modelConfig.stopSequences;\n }\n\n return options;\n }\n\n private extractTokenUsage(response: OpenAI.Chat.Completions.ChatCompletion): TokenUsage | undefined {\n const usage = response.usage;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n }\n\n private buildMessages(\n file: FileInfo,\n prompt: string\n ): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\n if (file.type === 'text') {\n return [\n {\n role: 'user',\n content: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`,\n },\n ];\n }\n\n // For images and PDFs - Grok uses OpenAI-compatible format\n const base64 = file.base64 || file.content.toString('base64');\n const imageUrl = `data:${file.mimeType};base64,${base64}`;\n\n return [\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imageUrl,\n detail: 'high',\n },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n },\n ];\n }\n}\n","import { GoogleGenAI } from '@google/genai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'gemini-2.0-flash';\n\nexport interface VertexConfig {\n project: string;\n location: string;\n}\n\nexport class VertexProvider extends BaseProvider {\n readonly name: AIProvider = 'vertex';\n readonly model: string;\n\n private client: GoogleGenAI;\n\n constructor(config: VertexConfig, model?: string) {\n super('vertex');\n this.model = model || DEFAULT_MODEL;\n this.client = new GoogleGenAI({\n vertexai: true,\n project: config.project,\n location: config.location,\n });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const generationConfig = this.buildGenerationConfig(options?.modelConfig);\n\n const response = await this.client.models.generateContent({\n model: this.model,\n contents: this.buildContents(file, prompt),\n config: generationConfig,\n });\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.text || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const generationConfig = this.buildGenerationConfig(options?.modelConfig, {\n responseMimeType: 'application/json',\n });\n\n const response = await this.client.models.generateContent({\n model: this.model,\n contents: this.buildContents(file, prompt),\n config: generationConfig,\n });\n\n const text = response.text || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildGenerationConfig(\n modelConfig?: ModelConfig,\n defaults?: Record<string, unknown>\n ): Record<string, unknown> {\n const config: Record<string, unknown> = { ...defaults };\n\n if (modelConfig?.temperature !== undefined) {\n config.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n config.maxOutputTokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n config.topP = modelConfig.topP;\n }\n if (modelConfig?.topK !== undefined) {\n config.topK = modelConfig.topK;\n }\n if (modelConfig?.stopSequences !== undefined) {\n config.stopSequences = modelConfig.stopSequences;\n }\n\n return config;\n }\n\n private extractTokenUsage(response: { usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number } }): TokenUsage | undefined {\n const usage = response.usageMetadata;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.promptTokenCount || 0,\n outputTokens: usage.candidatesTokenCount || 0,\n totalTokens: usage.totalTokenCount || 0,\n };\n }\n\n private buildContents(file: FileInfo, prompt: string): Array<{ role: string; parts: Array<{ text?: string; inlineData?: { mimeType: string; data: string } }> }> {\n if (file.type === 'text') {\n return [\n {\n role: 'user',\n parts: [\n { text: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}` },\n ],\n },\n ];\n }\n\n // For images and PDFs\n const base64 = file.base64 || file.content.toString('base64');\n\n return [\n {\n role: 'user',\n parts: [\n {\n inlineData: {\n mimeType: file.mimeType,\n data: base64,\n },\n },\n { text: prompt },\n ],\n },\n ];\n }\n}\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { FileInfo, SupportedFileType } from '../types';\n\n/**\n * MIME type to file type mapping\n */\nconst MIME_TO_FILE_TYPE: Record<string, SupportedFileType> = {\n 'application/pdf': 'pdf',\n 'image/jpeg': 'image',\n 'image/png': 'image',\n 'image/gif': 'image',\n 'image/webp': 'image',\n 'image/bmp': 'image',\n 'image/tiff': 'image',\n 'text/plain': 'text',\n 'text/markdown': 'text',\n 'text/csv': 'text',\n 'application/json': 'text',\n 'application/xml': 'text',\n 'text/html': 'text',\n};\n\n/**\n * MIME type mappings for supported file types\n */\nconst MIME_TYPES: Record<string, string> = {\n // PDF\n '.pdf': 'application/pdf',\n\n // Images\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.bmp': 'image/bmp',\n '.tiff': 'image/tiff',\n '.tif': 'image/tiff',\n\n // Text files\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.csv': 'text/csv',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.html': 'text/html',\n '.htm': 'text/html',\n};\n\n/**\n * File type categories\n */\nconst FILE_TYPE_CATEGORIES: Record<string, SupportedFileType> = {\n '.pdf': 'pdf',\n '.jpg': 'image',\n '.jpeg': 'image',\n '.png': 'image',\n '.gif': 'image',\n '.webp': 'image',\n '.bmp': 'image',\n '.tiff': 'image',\n '.tif': 'image',\n '.txt': 'text',\n '.md': 'text',\n '.csv': 'text',\n '.json': 'text',\n '.xml': 'text',\n '.html': 'text',\n '.htm': 'text',\n};\n\n/**\n * Load a file from disk and prepare it for AI processing\n */\nexport async function loadFile(filePath: string): Promise<FileInfo> {\n const absolutePath = path.resolve(filePath);\n\n // Check if file exists\n try {\n await fs.access(absolutePath);\n } catch {\n throw new Error(`File not found: ${absolutePath}`);\n }\n\n // Get file stats\n const stats = await fs.stat(absolutePath);\n\n if (!stats.isFile()) {\n throw new Error(`Path is not a file: ${absolutePath}`);\n }\n\n // Get file extension and determine type\n const ext = path.extname(absolutePath).toLowerCase();\n const fileName = path.basename(absolutePath);\n\n const mimeType = MIME_TYPES[ext];\n const fileType = FILE_TYPE_CATEGORIES[ext];\n\n if (!mimeType || !fileType) {\n throw new Error(\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\n );\n }\n\n // Read file content\n const content = await fs.readFile(absolutePath);\n\n // Prepare base64 for non-text files\n const base64 = fileType !== 'text' ? content.toString('base64') : undefined;\n\n return {\n path: absolutePath,\n name: fileName,\n type: fileType,\n mimeType,\n size: stats.size,\n content,\n base64,\n };\n}\n\n/**\n * Load a file from a Buffer\n */\nexport function loadFileFromBuffer(\n buffer: Buffer,\n fileName: string,\n mimeType?: string\n): FileInfo {\n const ext = path.extname(fileName).toLowerCase();\n const detectedMimeType = mimeType || MIME_TYPES[ext];\n const fileType = FILE_TYPE_CATEGORIES[ext];\n\n if (!detectedMimeType || !fileType) {\n throw new Error(\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\n );\n }\n\n const base64 = fileType !== 'text' ? buffer.toString('base64') : undefined;\n\n return {\n path: '',\n name: fileName,\n type: fileType,\n mimeType: detectedMimeType,\n size: buffer.length,\n content: buffer,\n base64,\n };\n}\n\n/**\n * Load a file from base64 string\n */\nexport function loadFileFromBase64(\n base64: string,\n fileName: string,\n mimeType?: string\n): FileInfo {\n // Remove data URL prefix if present\n const base64Data = base64.includes(',') ? base64.split(',')[1] : base64;\n const buffer = Buffer.from(base64Data, 'base64');\n\n const ext = path.extname(fileName).toLowerCase();\n const detectedMimeType = mimeType || MIME_TYPES[ext];\n const fileType = FILE_TYPE_CATEGORIES[ext];\n\n if (!detectedMimeType || !fileType) {\n throw new Error(\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\n );\n }\n\n return {\n path: '',\n name: fileName,\n type: fileType,\n mimeType: detectedMimeType,\n size: buffer.length,\n content: buffer,\n base64: base64Data,\n };\n}\n\n/**\n * Save content to a file\n */\nexport async function saveToFile(filePath: string, content: string | Buffer): Promise<void> {\n const absolutePath = path.resolve(filePath);\n const dir = path.dirname(absolutePath);\n\n // Ensure directory exists\n await fs.mkdir(dir, { recursive: true });\n\n // Write file\n await fs.writeFile(absolutePath, content, typeof content === 'string' ? 'utf-8' : undefined);\n}\n\n/**\n * Get supported file extensions\n */\nexport function getSupportedExtensions(): string[] {\n return Object.keys(MIME_TYPES);\n}\n\n/**\n * Check if a file extension is supported\n */\nexport function isExtensionSupported(ext: string): boolean {\n const normalizedExt = ext.startsWith('.') ? ext.toLowerCase() : `.${ext.toLowerCase()}`;\n return normalizedExt in MIME_TYPES;\n}\n\n/**\n * Check if a string is a URL\n */\nexport function isUrl(str: string): boolean {\n return str.startsWith('http://') || str.startsWith('https://');\n}\n\n/**\n * Load a file from a URL\n */\nexport async function loadFileFromUrl(url: string): Promise<FileInfo> {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch URL: ${response.status} ${response.statusText}`);\n }\n\n const contentType = response.headers.get('content-type')?.split(';')[0] || '';\n const buffer = Buffer.from(await response.arrayBuffer());\n\n // Try to get filename from URL or Content-Disposition header\n const contentDisposition = response.headers.get('content-disposition');\n let fileName = '';\n\n if (contentDisposition) {\n const match = contentDisposition.match(/filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/);\n if (match) {\n fileName = match[1].replace(/['\"]/g, '');\n }\n }\n\n if (!fileName) {\n // Extract filename from URL path\n const urlPath = new URL(url).pathname;\n fileName = path.basename(urlPath) || 'download';\n }\n\n // Determine file type from content-type header or extension\n let fileType = MIME_TO_FILE_TYPE[contentType];\n let mimeType = contentType;\n\n if (!fileType) {\n // Try to determine from file extension\n const ext = path.extname(fileName).toLowerCase();\n mimeType = MIME_TYPES[ext];\n fileType = FILE_TYPE_CATEGORIES[ext];\n }\n\n if (!fileType || !mimeType) {\n throw new Error(\n `Unsupported file type from URL. Content-Type: ${contentType}, Filename: ${fileName}`\n );\n }\n\n const base64 = fileType !== 'text' ? buffer.toString('base64') : undefined;\n\n return {\n path: url,\n name: fileName,\n type: fileType,\n mimeType,\n size: buffer.length,\n content: buffer,\n base64,\n };\n}\n","import type {\n AIProvider,\n OcrConfig,\n ExtractionOptions,\n ExtractionResult,\n FileInfo,\n IAIProvider,\n JsonExtractionResult,\n TextExtractionResult,\n} from './types';\nimport {\n ClaudeProvider,\n GeminiProvider,\n GrokProvider,\n OpenAIProvider,\n VertexProvider,\n} from './providers';\nimport {\n loadFile,\n loadFileFromBase64,\n loadFileFromBuffer,\n loadFileFromUrl,\n isUrl,\n saveToFile,\n} from './loaders';\n\n/**\n * Main class for document extraction using AI\n */\nexport class OcrAI {\n private provider: IAIProvider;\n private config: OcrConfig;\n\n constructor(config: OcrConfig) {\n this.config = config;\n this.provider = this.createProvider(config);\n }\n\n /**\n * Create a provider instance based on configuration\n */\n private createProvider(config: OcrConfig): IAIProvider {\n switch (config.provider) {\n case 'gemini':\n if (!config.apiKey) throw new Error('API key is required for Gemini provider');\n return new GeminiProvider(config.apiKey, config.model);\n case 'openai':\n if (!config.apiKey) throw new Error('API key is required for OpenAI provider');\n return new OpenAIProvider(config.apiKey, config.model);\n case 'claude':\n if (!config.apiKey) throw new Error('API key is required for Claude provider');\n return new ClaudeProvider(config.apiKey, config.model);\n case 'grok':\n if (!config.apiKey) throw new Error('API key is required for Grok provider');\n return new GrokProvider(config.apiKey, config.model);\n case 'vertex':\n if (!config.vertexConfig) throw new Error('vertexConfig is required for Vertex AI provider');\n return new VertexProvider(config.vertexConfig, config.model);\n default:\n throw new Error(`Unsupported provider: ${config.provider}`);\n }\n }\n\n /**\n * Extract content from a file path or URL\n */\n async extract(\n source: string,\n options?: ExtractionOptions\n ): Promise<ExtractionResult> {\n const startTime = Date.now();\n\n try {\n const file = isUrl(source)\n ? await loadFileFromUrl(source)\n : await loadFile(source);\n return this.processExtraction(file, options, startTime);\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Extract content from a Buffer\n */\n async extractFromBuffer(\n buffer: Buffer,\n fileName: string,\n options?: ExtractionOptions\n ): Promise<ExtractionResult> {\n const startTime = Date.now();\n\n try {\n const file = loadFileFromBuffer(buffer, fileName);\n return this.processExtraction(file, options, startTime);\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Extract content from a base64 string\n */\n async extractFromBase64(\n base64: string,\n fileName: string,\n options?: ExtractionOptions\n ): Promise<ExtractionResult> {\n const startTime = Date.now();\n\n try {\n const file = loadFileFromBase64(base64, fileName);\n return this.processExtraction(file, options, startTime);\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Process the extraction based on format\n */\n private async processExtraction(\n file: FileInfo,\n options: ExtractionOptions | undefined,\n startTime: number\n ): Promise<ExtractionResult> {\n const format = options?.format || 'text';\n\n // Check if provider supports the file type\n if (!this.provider.supportsFileType(file.type)) {\n return {\n success: false,\n error: `Provider ${this.provider.name} does not support file type: ${file.type}`,\n code: 'UNSUPPORTED_FILE_TYPE',\n };\n }\n\n try {\n if (format === 'json') {\n if (!options?.schema) {\n return {\n success: false,\n error: 'Schema is required for JSON extraction',\n code: 'MISSING_SCHEMA',\n };\n }\n\n const providerResult = await this.provider.extractJson(file, options.schema, options);\n const result: JsonExtractionResult = {\n success: true,\n format: 'json',\n data: providerResult.content,\n metadata: {\n provider: this.provider.name,\n model: this.provider.model,\n fileType: file.type,\n fileName: file.name,\n processingTimeMs: Date.now() - startTime,\n tokens: providerResult.tokens,\n },\n };\n\n // Save to file if outputPath is specified\n if (options.outputPath) {\n await saveToFile(options.outputPath, JSON.stringify(providerResult.content, null, 2));\n }\n\n return result;\n } else {\n const providerResult = await this.provider.extractText(file, options);\n const result: TextExtractionResult = {\n success: true,\n format: 'text',\n content: providerResult.content,\n metadata: {\n provider: this.provider.name,\n model: this.provider.model,\n fileType: file.type,\n fileName: file.name,\n processingTimeMs: Date.now() - startTime,\n tokens: providerResult.tokens,\n },\n };\n\n // Save to file if outputPath is specified\n if (options?.outputPath) {\n await saveToFile(options.outputPath, providerResult.content);\n }\n\n return result;\n }\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Create an error result\n */\n private createErrorResult(error: unknown): ExtractionResult {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: message,\n code: 'EXTRACTION_ERROR',\n };\n }\n\n /**\n * Get current provider name\n */\n getProvider(): AIProvider {\n return this.provider.name;\n }\n\n /**\n * Get current model\n */\n getModel(): string {\n return this.provider.model;\n }\n\n /**\n * Change the AI provider\n */\n setProvider(provider: AIProvider, apiKey: string, model?: string): void {\n this.config = { provider, apiKey, model };\n this.provider = this.createProvider(this.config);\n }\n}\n\n/**\n * Factory function to create OcrAI instance\n */\nexport function createOcrAI(config: OcrConfig): OcrAI {\n return new OcrAI(config);\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -800,8 +800,8 @@ async function loadFileFromUrl(url) {
|
|
|
800
800
|
};
|
|
801
801
|
}
|
|
802
802
|
|
|
803
|
-
// src/
|
|
804
|
-
var
|
|
803
|
+
// src/ocr.ts
|
|
804
|
+
var OcrAI = class {
|
|
805
805
|
provider;
|
|
806
806
|
config;
|
|
807
807
|
constructor(config) {
|
|
@@ -962,10 +962,10 @@ var ExtractaAI = class {
|
|
|
962
962
|
this.provider = this.createProvider(this.config);
|
|
963
963
|
}
|
|
964
964
|
};
|
|
965
|
-
function
|
|
966
|
-
return new
|
|
965
|
+
function createOcrAI(config) {
|
|
966
|
+
return new OcrAI(config);
|
|
967
967
|
}
|
|
968
968
|
|
|
969
|
-
export { BaseProvider, ClaudeProvider,
|
|
969
|
+
export { BaseProvider, ClaudeProvider, GeminiProvider, GrokProvider, OcrAI, OpenAIProvider, VertexProvider, createOcrAI, getSupportedExtensions, isExtensionSupported, isUrl, loadFile, loadFileFromBase64, loadFileFromBuffer, loadFileFromUrl, saveToFile };
|
|
970
970
|
//# sourceMappingURL=index.mjs.map
|
|
971
971
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.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":["DEFAULT_MODEL","OpenAI"],"mappings":";;;;;;;;AAYO,IAAe,eAAf,MAAmD;AAAA,EAI9C,MAAA;AAAA,EAEV,YAAY,MAAA,EAAgB;AAC1B,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,IAAA,OAAW,EAAA,EAAI;AACnC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,CAAE,CAAA;AAAA,IACpE;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAUA,iBAAiB,IAAA,EAAkC;AACjD,IAAA,OAAO,CAAC,KAAA,EAAO,OAAA,EAAS,MAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKU,gBAAgB,OAAA,EAAqC;AAC7D,IAAA,MAAM,UAAA,GAAa,SAAS,MAAA,IAAU,8CAAA;AACtC,IAAA,MAAM,YAAA,GACJ,SAAS,QAAA,IAAY,OAAA,CAAQ,aAAa,MAAA,GACtC,CAAA,YAAA,EAAe,OAAA,CAAQ,QAAQ,CAAA,CAAA,CAAA,GAC/B,EAAA;AAEN,IAAA,OAAO,CAAA,EAAG,UAAU,CAAA,EAAG,YAAY;;AAAA;AAAA;AAAA,8EAAA,CAAA;AAAA,EAKrC;AAAA;AAAA;AAAA;AAAA,EAKU,eAAA,CACR,QACA,OAAA,EACQ;AACR,IAAA,MAAM,UAAA,GACJ,SAAS,MAAA,IAAU,6CAAA;AACrB,IAAA,MAAM,YAAA,GACJ,SAAS,QAAA,IAAY,OAAA,CAAQ,aAAa,MAAA,GACtC,CAAA,2BAAA,EAA8B,OAAA,CAAQ,QAAQ,CAAA,CAAA,CAAA,GAC9C,EAAA;AAEN,IAAA,OAAO,CAAA,EAAG,UAAU,CAAA,EAAG,YAAY;;AAAA;;AAAA,EAIrC,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC;;AAAA;AAAA;AAAA;AAAA;AAAA,sDAAA,CAAA;AAAA,EAO/B;AAAA;AAAA;AAAA;AAAA,EAKU,kBAAqB,QAAA,EAAqB;AAClD,IAAA,IAAI,OAAA,GAAU,SAAS,IAAA,EAAK;AAG5B,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACjC,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AACpC,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,IAC3B;AAEA,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,MAAA,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,IAC/B;AAEA,IAAA,OAAA,GAAU,QAAQ,IAAA,EAAK;AAEvB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,MAAM,CAAA,+BAAA,EAAkC,QAAA,CAAS,UAAU,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAK,CAAA;AAAA,IACnF;AAAA,EACF;AACF;ACtGA,IAAM,aAAA,GAAgB,kBAAA;AAEf,IAAM,cAAA,GAAN,cAA6B,YAAA,CAAa;AAAA,EACtC,IAAA,GAAmB,QAAA;AAAA,EACnB,KAAA;AAAA,EAED,MAAA;AAAA,EAER,WAAA,CAAY,QAAgB,KAAA,EAAgB;AAC1C,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,QAAQ,KAAA,IAAS,aAAA;AACtB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,kBAAA,CAAmB,MAAM,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,WAAA,CAAY,IAAA,EAAgB,OAAA,EAA8D;AAC9F,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,qBAAA,CAAsB,OAAA,EAAS,WAAW,CAAA;AACxE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,kBAAA,CAAmB;AAAA,MAC3C,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ;AAAA,KACD,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAE3C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,eAAA,CAAgB,OAAO,CAAA;AAClD,IAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AAExB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,SAAS,IAAA,EAAK;AAAA,MACvB;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CACJ,IAAA,EACA,MAAA,EACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,qBAAA,CAAsB,OAAA,EAAS,WAAA,EAAa;AAAA,MACxE,gBAAA,EAAkB;AAAA,KACnB,CAAA;AACD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,kBAAA,CAAmB;AAAA,MAC3C,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ;AAAA,KACD,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AACnD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AAE9C,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,eAAA,CAAgB,OAAO,CAAA;AAClD,IAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,IAAA,MAAM,IAAA,GAAO,SAAS,IAAA,EAAK;AAE3B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA,CAAK,iBAAA,CAAqB,IAAI,CAAA;AAAA,MACvC;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,qBAAA,CACN,aACA,QAAA,EACkB;AAClB,IAAA,MAAM,MAAA,GAA2B,EAAE,GAAG,QAAA,EAAS;AAE/C,IAAA,IAAI,WAAA,EAAa,gBAAgB,MAAA,EAAW;AAC1C,MAAA,MAAA,CAAO,cAAc,WAAA,CAAY,WAAA;AAAA,IACnC;AACA,IAAA,IAAI,WAAA,EAAa,cAAc,MAAA,EAAW;AACxC,MAAA,MAAA,CAAO,kBAAkB,WAAA,CAAY,SAAA;AAAA,IACvC;AACA,IAAA,IAAI,WAAA,EAAa,SAAS,MAAA,EAAW;AACnC,MAAA,MAAA,CAAO,OAAO,WAAA,CAAY,IAAA;AAAA,IAC5B;AACA,IAAA,IAAI,WAAA,EAAa,SAAS,MAAA,EAAW;AACnC,MAAA,MAAA,CAAO,OAAO,WAAA,CAAY,IAAA;AAAA,IAC5B;AACA,IAAA,IAAI,WAAA,EAAa,kBAAkB,MAAA,EAAW;AAC5C,MAAA,MAAA,CAAO,gBAAgB,WAAA,CAAY,aAAA;AAAA,IACrC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,QAAA,EAA8I;AACtK,IAAA,MAAM,QAAQ,QAAA,CAAS,aAAA;AACvB,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,MAAM,gBAAA,IAAoB,CAAA;AAAA,MACvC,YAAA,EAAc,MAAM,oBAAA,IAAwB,CAAA;AAAA,MAC5C,WAAA,EAAa,MAAM,eAAA,IAAmB;AAAA,KACxC;AAAA,EACF;AAAA,EAEQ,YAAA,CACN,MACA,MAAA,EACwF;AACxF,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,MAAA,OAAO,GAAG,MAAM;;AAAA;AAAA,EAA0B,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAC,CAAA,CAAA;AAAA,IAC1E;AAGA,IAAA,OAAO;AAAA,MACL;AAAA,QACE,UAAA,EAAY;AAAA,UACV,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,MAAM,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,SAAS,QAAQ;AAAA;AACrD,OACF;AAAA,MACA,EAAE,MAAM,MAAA;AAAO,KACjB;AAAA,EACF;AACF;ACrHA,IAAMA,cAAAA,GAAgB,QAAA;AAEf,IAAM,cAAA,GAAN,cAA6B,YAAA,CAAa;AAAA,EACtC,IAAA,GAAmB,QAAA;AAAA,EACnB,KAAA;AAAA,EAED,MAAA;AAAA,EAER,WAAA,CAAY,QAAgB,KAAA,EAAgB;AAC1C,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,QAAQ,KAAA,IAASA,cAAAA;AACtB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO,EAAE,QAAQ,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,WAAA,CAAY,IAAA,EAAgB,OAAA,EAA8D;AAC9F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,MAAM,CAAA;AAChD,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,sBAAA,CAAuB,OAAA,EAAS,WAAW,CAAA;AAE1E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,MACzD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,SAAS,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAAA,MAClD;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CACJ,IAAA,EACA,MAAA,EACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,MAAM,CAAA;AAChD,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,sBAAA,CAAuB,OAAA,EAAS,WAAW,CAAA;AAE1E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,MACzD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA;AAAA,MACA,GAAG,iBAAA;AAAA,MACH,eAAA,EAAiB,EAAE,IAAA,EAAM,aAAA;AAAc,KACxC,CAAA;AAED,IAAA,MAAM,OAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,IAAA;AACtD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA,CAAK,iBAAA,CAAqB,IAAI,CAAA;AAAA,MACvC;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,uBAAuB,WAAA,EAAoD;AACjF,IAAA,MAAM,OAAA,GAAmC;AAAA,MACvC,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,IAAI,WAAA,EAAa,gBAAgB,MAAA,EAAW;AAC1C,MAAA,OAAA,CAAQ,cAAc,WAAA,CAAY,WAAA;AAAA,IACpC;AACA,IAAA,IAAI,WAAA,EAAa,cAAc,MAAA,EAAW;AACxC,MAAA,OAAA,CAAQ,aAAa,WAAA,CAAY,SAAA;AAAA,IACnC;AACA,IAAA,IAAI,WAAA,EAAa,SAAS,MAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,QAAQ,WAAA,CAAY,IAAA;AAAA,IAC9B;AACA,IAAA,IAAI,WAAA,EAAa,kBAAkB,MAAA,EAAW;AAC5C,MAAA,OAAA,CAAQ,OAAO,WAAA,CAAY,aAAA;AAAA,IAC7B;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,QAAA,EAA0E;AAClG,IAAA,MAAM,QAAQ,QAAA,CAAS,KAAA;AACvB,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,IAAA,OAAO;AAAA,MACL,aAAa,KAAA,CAAM,aAAA;AAAA,MACnB,cAAc,KAAA,CAAM,iBAAA;AAAA,MACpB,aAAa,KAAA,CAAM;AAAA,KACrB;AAAA,EACF;AAAA,EAEQ,aAAA,CACN,MACA,MAAA,EACsD;AACtD,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,MAAA,OAAO;AAAA,QACL;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS,GAAG,MAAM;;AAAA;AAAA,EAA0B,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAC,CAAA;AAAA;AAC5E,OACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,SAAS,QAAQ,CAAA;AAC5D,IAAA,MAAM,QAAA,GAAW,CAAA,KAAA,EAAQ,IAAA,CAAK,QAAQ,WAAW,MAAM,CAAA,CAAA;AAEvD,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,WAAA;AAAA,YACN,SAAA,EAAW;AAAA,cACT,GAAA,EAAK,QAAA;AAAA,cACL,MAAA,EAAQ;AAAA;AACV,WACF;AAAA,UACA;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF;AACF,KACF;AAAA,EACF;AACF;AC9HA,IAAMA,cAAAA,GAAgB,0BAAA;AAIf,IAAM,cAAA,GAAN,cAA6B,YAAA,CAAa;AAAA,EACtC,IAAA,GAAmB,QAAA;AAAA,EACnB,KAAA;AAAA,EAED,MAAA;AAAA,EAER,WAAA,CAAY,QAAgB,KAAA,EAAgB;AAC1C,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,QAAQ,KAAA,IAASA,cAAAA;AACtB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,SAAA,CAAU,EAAE,QAAQ,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,WAAA,CAAY,IAAA,EAAgB,OAAA,EAA8D;AAC9F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC3C,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,mBAAA,CAAoB,OAAA,EAAS,WAAW,CAAA;AAEpE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,MAAA,CAAO;AAAA,MACjD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAM;AAAA;AACzC,OACF;AAAA,MACA,YAAY,cAAA,CAAe,UAAA;AAAA,MAC3B,aAAa,cAAA,CAAe,WAAA;AAAA,MAC5B,OAAO,cAAA,CAAe,KAAA;AAAA,MACtB,OAAO,cAAA,CAAe,KAAA;AAAA,MACtB,gBAAgB,cAAA,CAAe;AAAA,KAChC,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,SAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,MAAM,CAAA;AACxE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,WAAW,IAAA,IAAQ,EAAA;AAAA,MAC5B;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CACJ,IAAA,EACA,MAAA,EACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AACnD,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,mBAAA,CAAoB,OAAA,EAAS,WAAW,CAAA;AAEpE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,MAAA,CAAO;AAAA,MACjD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,MAAM;AAAA;AACzC,OACF;AAAA,MACA,YAAY,cAAA,CAAe,UAAA;AAAA,MAC3B,aAAa,cAAA,CAAe,WAAA;AAAA,MAC5B,OAAO,cAAA,CAAe,KAAA;AAAA,MACtB,OAAO,cAAA,CAAe,KAAA;AAAA,MACtB,gBAAgB,cAAA,CAAe;AAAA,KAChC,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,SAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,MAAM,CAAA;AACxE,IAAA,MAAM,IAAA,GAAO,WAAW,IAAA,IAAQ,IAAA;AAChC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA,CAAK,iBAAA,CAAqB,IAAI,CAAA;AAAA,MACvC;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,oBAAoB,WAAA,EAM1B;AACA,IAAA,MAAM,OAAA,GAMF;AAAA,MACF,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,IAAI,WAAA,EAAa,gBAAgB,MAAA,EAAW;AAC1C,MAAA,OAAA,CAAQ,cAAc,WAAA,CAAY,WAAA;AAAA,IACpC;AACA,IAAA,IAAI,WAAA,EAAa,cAAc,MAAA,EAAW;AACxC,MAAA,OAAA,CAAQ,aAAa,WAAA,CAAY,SAAA;AAAA,IACnC;AACA,IAAA,IAAI,WAAA,EAAa,SAAS,MAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,QAAQ,WAAA,CAAY,IAAA;AAAA,IAC9B;AACA,IAAA,IAAI,WAAA,EAAa,SAAS,MAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,QAAQ,WAAA,CAAY,IAAA;AAAA,IAC9B;AACA,IAAA,IAAI,WAAA,EAAa,kBAAkB,MAAA,EAAW;AAC5C,MAAA,OAAA,CAAQ,iBAAiB,WAAA,CAAY,aAAA;AAAA,IACvC;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,iBAAiB,IAAA,EAAkC;AAEjD,IAAA,OAAO,CAAC,KAAA,EAAO,OAAA,EAAS,MAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,EAC/C;AAAA,EAEQ,kBAAkB,QAAA,EAAqD;AAC7E,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,SAAS,KAAA,CAAM,YAAA;AAAA,MAC5B,YAAA,EAAc,SAAS,KAAA,CAAM,aAAA;AAAA,MAC7B,WAAA,EAAa,QAAA,CAAS,KAAA,CAAM,YAAA,GAAe,SAAS,KAAA,CAAM;AAAA,KAC5D;AAAA,EACF;AAAA,EAEQ,YAAA,CAAa,MAAgB,MAAA,EAAyE;AAC5G,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,MAAA,OAAO,GAAG,MAAM;;AAAA;AAAA,EAA0B,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAC,CAAA,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,SAAS,QAAQ,CAAA;AAG5D,IAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AAEvB,MAAA,OAAO;AAAA,QACL;AAAA,UACE,IAAA,EAAM,UAAA;AAAA,UACN,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY,iBAAA;AAAA,YACZ,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA;AACR,OACF;AAAA,IACF;AAGA,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAAA,UAC3C,IAAA,EAAM;AAAA;AACR,OACF;AAAA,MACA;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM;AAAA;AACR,KACF;AAAA,EACF;AAAA,EAEQ,aAAa,QAAA,EAAkC;AACrD,IAAA,MAAM,cAAA,GAAmC;AAAA,MACvC,YAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,cAAA,CAAe,QAAA,CAAS,QAA0B,CAAA,EAAG;AACvD,MAAA,OAAO,QAAA;AAAA,IACT;AAGA,IAAA,OAAO,YAAA;AAAA,EACT;AACF;ACvLA,IAAM,aAAA,GAAgB,qBAAA;AACtB,IAAMA,cAAAA,GAAgB,oBAAA;AAEf,IAAM,YAAA,GAAN,cAA2B,YAAA,CAAa;AAAA,EACpC,IAAA,GAAmB,MAAA;AAAA,EACnB,KAAA;AAAA,EAED,MAAA;AAAA,EAER,WAAA,CAAY,QAAgB,KAAA,EAAgB;AAC1C,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,QAAQ,KAAA,IAASA,cAAAA;AACtB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAIC,MAAAA,CAAO;AAAA,MACvB,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAA,CAAY,IAAA,EAAgB,OAAA,EAA8D;AAC9F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,MAAM,CAAA;AAChD,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,sBAAA,CAAuB,OAAA,EAAS,WAAW,CAAA;AAE1E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,MACzD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,SAAS,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAAA,MAClD;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CACJ,IAAA,EACA,MAAA,EACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,MAAM,CAAA;AAChD,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,sBAAA,CAAuB,OAAA,EAAS,WAAW,CAAA;AAE1E,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,MACzD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,MAAM,OAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,IAAA;AACtD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA,CAAK,iBAAA,CAAqB,IAAI,CAAA;AAAA,MACvC;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,uBAAuB,WAAA,EAAoD;AACjF,IAAA,MAAM,OAAA,GAAmC;AAAA,MACvC,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,IAAI,WAAA,EAAa,gBAAgB,MAAA,EAAW;AAC1C,MAAA,OAAA,CAAQ,cAAc,WAAA,CAAY,WAAA;AAAA,IACpC;AACA,IAAA,IAAI,WAAA,EAAa,cAAc,MAAA,EAAW;AACxC,MAAA,OAAA,CAAQ,aAAa,WAAA,CAAY,SAAA;AAAA,IACnC;AACA,IAAA,IAAI,WAAA,EAAa,SAAS,MAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,QAAQ,WAAA,CAAY,IAAA;AAAA,IAC9B;AACA,IAAA,IAAI,WAAA,EAAa,kBAAkB,MAAA,EAAW;AAC5C,MAAA,OAAA,CAAQ,OAAO,WAAA,CAAY,aAAA;AAAA,IAC7B;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,QAAA,EAA0E;AAClG,IAAA,MAAM,QAAQ,QAAA,CAAS,KAAA;AACvB,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,IAAA,OAAO;AAAA,MACL,aAAa,KAAA,CAAM,aAAA;AAAA,MACnB,cAAc,KAAA,CAAM,iBAAA;AAAA,MACpB,aAAa,KAAA,CAAM;AAAA,KACrB;AAAA,EACF;AAAA,EAEQ,aAAA,CACN,MACA,MAAA,EACsD;AACtD,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,MAAA,OAAO;AAAA,QACL;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS,GAAG,MAAM;;AAAA;AAAA,EAA0B,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAC,CAAA;AAAA;AAC5E,OACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,SAAS,QAAQ,CAAA;AAC5D,IAAA,MAAM,QAAA,GAAW,CAAA,KAAA,EAAQ,IAAA,CAAK,QAAQ,WAAW,MAAM,CAAA,CAAA;AAEvD,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,WAAA;AAAA,YACN,SAAA,EAAW;AAAA,cACT,GAAA,EAAK,QAAA;AAAA,cACL,MAAA,EAAQ;AAAA;AACV,WACF;AAAA,UACA;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF;AACF,KACF;AAAA,EACF;AACF;AClIA,IAAMD,cAAAA,GAAgB,kBAAA;AAOf,IAAM,cAAA,GAAN,cAA6B,YAAA,CAAa;AAAA,EACtC,IAAA,GAAmB,QAAA;AAAA,EACnB,KAAA;AAAA,EAED,MAAA;AAAA,EAER,WAAA,CAAY,QAAsB,KAAA,EAAgB;AAChD,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,IAAA,CAAK,QAAQ,KAAA,IAASA,cAAAA;AACtB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,WAAA,CAAY;AAAA,MAC5B,QAAA,EAAU,IAAA;AAAA,MACV,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAA,CAAY,IAAA,EAAgB,OAAA,EAA8D;AAC9F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC3C,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,qBAAA,CAAsB,OAAA,EAAS,WAAW,CAAA;AAExE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,eAAA,CAAgB;AAAA,MACxD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA,EAAU,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,MAAM,CAAA;AAAA,MACzC,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,SAAS,IAAA,IAAQ,EAAA;AAAA,MAC1B;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CACJ,IAAA,EACA,MAAA,EACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AACnD,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,qBAAA,CAAsB,OAAA,EAAS,WAAA,EAAa;AAAA,MACxE,gBAAA,EAAkB;AAAA,KACnB,CAAA;AAED,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,eAAA,CAAgB;AAAA,MACxD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA,EAAU,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,MAAM,CAAA;AAAA,MACzC,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,IAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA,CAAK,iBAAA,CAAqB,IAAI,CAAA;AAAA,MACvC;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,qBAAA,CACN,aACA,QAAA,EACyB;AACzB,IAAA,MAAM,MAAA,GAAkC,EAAE,GAAG,QAAA,EAAS;AAEtD,IAAA,IAAI,WAAA,EAAa,gBAAgB,MAAA,EAAW;AAC1C,MAAA,MAAA,CAAO,cAAc,WAAA,CAAY,WAAA;AAAA,IACnC;AACA,IAAA,IAAI,WAAA,EAAa,cAAc,MAAA,EAAW;AACxC,MAAA,MAAA,CAAO,kBAAkB,WAAA,CAAY,SAAA;AAAA,IACvC;AACA,IAAA,IAAI,WAAA,EAAa,SAAS,MAAA,EAAW;AACnC,MAAA,MAAA,CAAO,OAAO,WAAA,CAAY,IAAA;AAAA,IAC5B;AACA,IAAA,IAAI,WAAA,EAAa,SAAS,MAAA,EAAW;AACnC,MAAA,MAAA,CAAO,OAAO,WAAA,CAAY,IAAA;AAAA,IAC5B;AACA,IAAA,IAAI,WAAA,EAAa,kBAAkB,MAAA,EAAW;AAC5C,MAAA,MAAA,CAAO,gBAAgB,WAAA,CAAY,aAAA;AAAA,IACrC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,QAAA,EAA8I;AACtK,IAAA,MAAM,QAAQ,QAAA,CAAS,aAAA;AACvB,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,MAAM,gBAAA,IAAoB,CAAA;AAAA,MACvC,YAAA,EAAc,MAAM,oBAAA,IAAwB,CAAA;AAAA,MAC5C,WAAA,EAAa,MAAM,eAAA,IAAmB;AAAA,KACxC;AAAA,EACF;AAAA,EAEQ,aAAA,CAAc,MAAgB,MAAA,EAA2H;AAC/J,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,MAAA,OAAO;AAAA,QACL;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,KAAA,EAAO;AAAA,YACL,EAAE,IAAA,EAAM,CAAA,EAAG,MAAM;;AAAA;AAAA,EAA0B,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAC,CAAA,CAAA;AAAG;AAC9E;AACF,OACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,SAAS,QAAQ,CAAA;AAE5D,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO;AAAA,UACL;AAAA,YACE,UAAA,EAAY;AAAA,cACV,UAAU,IAAA,CAAK,QAAA;AAAA,cACf,IAAA,EAAM;AAAA;AACR,WACF;AAAA,UACA,EAAE,MAAM,MAAA;AAAO;AACjB;AACF,KACF;AAAA,EACF;AACF;ACjIA,IAAM,iBAAA,GAAuD;AAAA,EAC3D,iBAAA,EAAmB,KAAA;AAAA,EACnB,YAAA,EAAc,OAAA;AAAA,EACd,WAAA,EAAa,OAAA;AAAA,EACb,WAAA,EAAa,OAAA;AAAA,EACb,YAAA,EAAc,OAAA;AAAA,EACd,WAAA,EAAa,OAAA;AAAA,EACb,YAAA,EAAc,OAAA;AAAA,EACd,YAAA,EAAc,MAAA;AAAA,EACd,eAAA,EAAiB,MAAA;AAAA,EACjB,UAAA,EAAY,MAAA;AAAA,EACZ,kBAAA,EAAoB,MAAA;AAAA,EACpB,iBAAA,EAAmB,MAAA;AAAA,EACnB,WAAA,EAAa;AACf,CAAA;AAKA,IAAM,UAAA,GAAqC;AAAA;AAAA,EAEzC,MAAA,EAAQ,iBAAA;AAAA;AAAA,EAGR,MAAA,EAAQ,YAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,YAAA;AAAA;AAAA,EAGR,MAAA,EAAQ,YAAA;AAAA,EACR,KAAA,EAAO,eAAA;AAAA,EACP,MAAA,EAAQ,UAAA;AAAA,EACR,OAAA,EAAS,kBAAA;AAAA,EACT,MAAA,EAAQ,iBAAA;AAAA,EACR,OAAA,EAAS,WAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAKA,IAAM,oBAAA,GAA0D;AAAA,EAC9D,MAAA,EAAQ,KAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,MAAA;AAAA,EACP,MAAA,EAAQ,MAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,MAAA,EAAQ,MAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAKA,eAAsB,SAAS,QAAA,EAAqC;AAClE,EAAA,MAAM,YAAA,GAAoB,aAAQ,QAAQ,CAAA;AAG1C,EAAA,IAAI;AACF,IAAA,MAAS,UAAO,YAAY,CAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,YAAY,CAAA,CAAE,CAAA;AAAA,EACnD;AAGA,EAAA,MAAM,KAAA,GAAQ,MAAS,EAAA,CAAA,IAAA,CAAK,YAAY,CAAA;AAExC,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAO,EAAG;AACnB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,YAAY,CAAA,CAAE,CAAA;AAAA,EACvD;AAGA,EAAA,MAAM,GAAA,GAAW,IAAA,CAAA,OAAA,CAAQ,YAAY,CAAA,CAAE,WAAA,EAAY;AACnD,EAAA,MAAM,QAAA,GAAgB,cAAS,YAAY,CAAA;AAE3C,EAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,qBAAqB,GAAG,CAAA;AAEzC,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU;AAC1B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,uBAAA,EAA0B,GAAG,CAAA,mBAAA,EAAsB,MAAA,CAAO,KAAK,UAAU,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACvF;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,MAAS,EAAA,CAAA,QAAA,CAAS,YAAY,CAAA;AAG9C,EAAA,MAAM,SAAS,QAAA,KAAa,MAAA,GAAS,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,GAAI,MAAA;AAElE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,QAAA;AAAA,IACA,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,kBAAA,CACd,MAAA,EACA,QAAA,EACA,QAAA,EACU;AACV,EAAA,MAAM,GAAA,GAAW,IAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,WAAA,EAAY;AAC/C,EAAA,MAAM,gBAAA,GAAmB,QAAA,IAAY,UAAA,CAAW,GAAG,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,qBAAqB,GAAG,CAAA;AAEzC,EAAA,IAAI,CAAC,gBAAA,IAAoB,CAAC,QAAA,EAAU;AAClC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,uBAAA,EAA0B,GAAG,CAAA,mBAAA,EAAsB,MAAA,CAAO,KAAK,UAAU,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACvF;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,QAAA,KAAa,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,GAAI,MAAA;AAEjE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,EAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,gBAAA;AAAA,IACV,MAAM,MAAA,CAAO,MAAA;AAAA,IACb,OAAA,EAAS,MAAA;AAAA,IACT;AAAA,GACF;AACF;AAKO,SAAS,kBAAA,CACd,MAAA,EACA,QAAA,EACA,QAAA,EACU;AAEV,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,GAAI,OAAO,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,MAAA;AACjE,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAE/C,EAAA,MAAM,GAAA,GAAW,IAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,WAAA,EAAY;AAC/C,EAAA,MAAM,gBAAA,GAAmB,QAAA,IAAY,UAAA,CAAW,GAAG,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,qBAAqB,GAAG,CAAA;AAEzC,EAAA,IAAI,CAAC,gBAAA,IAAoB,CAAC,QAAA,EAAU;AAClC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,uBAAA,EAA0B,GAAG,CAAA,mBAAA,EAAsB,MAAA,CAAO,KAAK,UAAU,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACvF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,EAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,gBAAA;AAAA,IACV,MAAM,MAAA,CAAO,MAAA;AAAA,IACb,OAAA,EAAS,MAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV;AACF;AAKA,eAAsB,UAAA,CAAW,UAAkB,OAAA,EAAyC;AAC1F,EAAA,MAAM,YAAA,GAAoB,aAAQ,QAAQ,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAW,aAAQ,YAAY,CAAA;AAGrC,EAAA,MAAS,EAAA,CAAA,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAGvC,EAAA,MAAS,aAAU,YAAA,EAAc,OAAA,EAAS,OAAO,OAAA,KAAY,QAAA,GAAW,UAAU,MAAS,CAAA;AAC7F;AAKO,SAAS,sBAAA,GAAmC;AACjD,EAAA,OAAO,MAAA,CAAO,KAAK,UAAU,CAAA;AAC/B;AAKO,SAAS,qBAAqB,GAAA,EAAsB;AACzD,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,GAAI,GAAA,CAAI,WAAA,EAAY,GAAI,CAAA,CAAA,EAAI,GAAA,CAAI,WAAA,EAAa,CAAA,CAAA;AACrF,EAAA,OAAO,aAAA,IAAiB,UAAA;AAC1B;AAKO,SAAS,MAAM,GAAA,EAAsB;AAC1C,EAAA,OAAO,IAAI,UAAA,CAAW,SAAS,CAAA,IAAK,GAAA,CAAI,WAAW,UAAU,CAAA;AAC/D;AAKA,eAAsB,gBAAgB,GAAA,EAAgC;AACpE,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAG,CAAA;AAEhC,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,MAAM,CAAA,qBAAA,EAAwB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,EAClF;AAEA,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,GAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAC3E,EAAA,MAAM,SAAS,MAAA,CAAO,IAAA,CAAK,MAAM,QAAA,CAAS,aAAa,CAAA;AAGvD,EAAA,MAAM,kBAAA,GAAqB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA;AACrE,EAAA,IAAI,QAAA,GAAW,EAAA;AAEf,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,KAAA,CAAM,wCAAwC,CAAA;AAC/E,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,SAAS,EAAE,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AAEb,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAC7B,IAAA,QAAA,GAAgB,IAAA,CAAA,QAAA,CAAS,OAAO,CAAA,IAAK,UAAA;AAAA,EACvC;AAGA,EAAA,IAAI,QAAA,GAAW,kBAAkB,WAAW,CAAA;AAC5C,EAAA,IAAI,QAAA,GAAW,WAAA;AAEf,EAAA,IAAI,CAAC,QAAA,EAAU;AAEb,IAAA,MAAM,GAAA,GAAW,IAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,WAAA,EAAY;AAC/C,IAAA,QAAA,GAAW,WAAW,GAAG,CAAA;AACzB,IAAA,QAAA,GAAW,qBAAqB,GAAG,CAAA;AAAA,EACrC;AAEA,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU;AAC1B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,8CAAA,EAAiD,WAAW,CAAA,YAAA,EAAe,QAAQ,CAAA;AAAA,KACrF;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,QAAA,KAAa,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,GAAI,MAAA;AAEjE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,GAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,QAAA;AAAA,IACA,MAAM,MAAA,CAAO,MAAA;AAAA,IACb,OAAA,EAAS,MAAA;AAAA,IACT;AAAA,GACF;AACF;;;AC3PO,IAAM,aAAN,MAAiB;AAAA,EACd,QAAA;AAAA,EACA,MAAA;AAAA,EAER,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,MAAA,EAAqC;AAC1D,IAAA,QAAQ,OAAO,QAAA;AAAU,MACvB,KAAK,QAAA;AACH,QAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAC7E,QAAA,OAAO,IAAI,cAAA,CAAe,MAAA,CAAO,MAAA,EAAQ,OAAO,KAAK,CAAA;AAAA,MACvD,KAAK,QAAA;AACH,QAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAC7E,QAAA,OAAO,IAAI,cAAA,CAAe,MAAA,CAAO,MAAA,EAAQ,OAAO,KAAK,CAAA;AAAA,MACvD,KAAK,QAAA;AACH,QAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAC7E,QAAA,OAAO,IAAI,cAAA,CAAe,MAAA,CAAO,MAAA,EAAQ,OAAO,KAAK,CAAA;AAAA,MACvD,KAAK,MAAA;AACH,QAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAC3E,QAAA,OAAO,IAAI,YAAA,CAAa,MAAA,CAAO,MAAA,EAAQ,OAAO,KAAK,CAAA;AAAA,MACrD,KAAK,QAAA;AACH,QAAA,IAAI,CAAC,MAAA,CAAO,YAAA,EAAc,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAC3F,QAAA,OAAO,IAAI,cAAA,CAAe,MAAA,CAAO,YAAA,EAAc,OAAO,KAAK,CAAA;AAAA,MAC7D;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,MAAA,CAAO,QAAQ,CAAA,CAAE,CAAA;AAAA;AAC9D,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJ,MAAA,EACA,OAAA,EAC2B;AAC3B,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAM,CAAA,GACrB,MAAM,gBAAgB,MAAM,CAAA,GAC5B,MAAM,QAAA,CAAS,MAAM,CAAA;AACzB,MAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,OAAA,EAAS,SAAS,CAAA;AAAA,IACxD,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CACJ,MAAA,EACA,QAAA,EACA,OAAA,EAC2B;AAC3B,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,MAAA,EAAQ,QAAQ,CAAA;AAChD,MAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,OAAA,EAAS,SAAS,CAAA;AAAA,IACxD,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CACJ,MAAA,EACA,QAAA,EACA,OAAA,EAC2B;AAC3B,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,MAAA,EAAQ,QAAQ,CAAA;AAChD,MAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,OAAA,EAAS,SAAS,CAAA;AAAA,IACxD,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAA,CACZ,IAAA,EACA,OAAA,EACA,SAAA,EAC2B;AAC3B,IAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,MAAA;AAGlC,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC9C,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,CAAA,SAAA,EAAY,IAAA,CAAK,SAAS,IAAI,CAAA,6BAAA,EAAgC,KAAK,IAAI,CAAA,CAAA;AAAA,QAC9E,IAAA,EAAM;AAAA,OACR;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACpB,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,wCAAA;AAAA,YACP,IAAA,EAAM;AAAA,WACR;AAAA,QACF;AAEA,QAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,YAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,OAAO,CAAA;AACpF,QAAA,MAAM,MAAA,GAA+B;AAAA,UACnC,OAAA,EAAS,IAAA;AAAA,UACT,MAAA,EAAQ,MAAA;AAAA,UACR,MAAM,cAAA,CAAe,OAAA;AAAA,UACrB,QAAA,EAAU;AAAA,YACR,QAAA,EAAU,KAAK,QAAA,CAAS,IAAA;AAAA,YACxB,KAAA,EAAO,KAAK,QAAA,CAAS,KAAA;AAAA,YACrB,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,gBAAA,EAAkB,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,YAC/B,QAAQ,cAAA,CAAe;AAAA;AACzB,SACF;AAGA,QAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,UAAA,MAAM,UAAA,CAAW,QAAQ,UAAA,EAAY,IAAA,CAAK,UAAU,cAAA,CAAe,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,QACtF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,MAAM,iBAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,MAAM,OAAO,CAAA;AACpE,QAAA,MAAM,MAAA,GAA+B;AAAA,UACnC,OAAA,EAAS,IAAA;AAAA,UACT,MAAA,EAAQ,MAAA;AAAA,UACR,SAAS,cAAA,CAAe,OAAA;AAAA,UACxB,QAAA,EAAU;AAAA,YACR,QAAA,EAAU,KAAK,QAAA,CAAS,IAAA;AAAA,YACxB,KAAA,EAAO,KAAK,QAAA,CAAS,KAAA;AAAA,YACrB,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,gBAAA,EAAkB,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,YAC/B,QAAQ,cAAA,CAAe;AAAA;AACzB,SACF;AAGA,QAAA,IAAI,SAAS,UAAA,EAAY;AACvB,UAAA,MAAM,UAAA,CAAW,OAAA,CAAQ,UAAA,EAAY,cAAA,CAAe,OAAO,CAAA;AAAA,QAC7D;AAEA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,KAAA,EAAkC;AAC1D,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAA0B;AACxB,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAmB;AACjB,IAAA,OAAO,KAAK,QAAA,CAAS,KAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,QAAA,EAAsB,MAAA,EAAgB,KAAA,EAAsB;AACtE,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAM;AACxC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA;AAAA,EACjD;AACF;AAKO,SAAS,iBAAiB,MAAA,EAAoC;AACnE,EAAA,OAAO,IAAI,WAAW,MAAM,CAAA;AAC9B","file":"index.mjs","sourcesContent":["import type {\n AIProvider,\n ExtractionOptions,\n FileInfo,\n IAIProvider,\n ProviderResult,\n SupportedFileType,\n} from '../types';\n\n/**\n * Base class for AI providers with common functionality\n */\nexport abstract class BaseProvider implements IAIProvider {\n abstract readonly name: AIProvider;\n abstract readonly model: string;\n\n protected apiKey: string;\n\n constructor(apiKey: string) {\n if (!apiKey || apiKey.trim() === '') {\n throw new Error(`API key is required for ${this.constructor.name}`);\n }\n this.apiKey = apiKey;\n }\n\n abstract extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>>;\n\n abstract extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>>;\n\n supportsFileType(type: SupportedFileType): boolean {\n return ['pdf', 'image', 'text'].includes(type);\n }\n\n /**\n * Build the text extraction prompt\n */\n protected buildTextPrompt(options?: ExtractionOptions): string {\n const basePrompt = options?.prompt || 'Extract all text content from this document.';\n const languageHint =\n options?.language && options.language !== 'auto'\n ? ` Respond in ${options.language}.`\n : '';\n\n return `${basePrompt}${languageHint}\n\nPlease extract and return all the text content from the provided document.\nMaintain the original structure and formatting as much as possible.\nReturn only the extracted text, without any additional commentary or metadata.`;\n }\n\n /**\n * Build the JSON extraction prompt\n */\n protected buildJsonPrompt(\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): string {\n const basePrompt =\n options?.prompt || 'Extract structured data from this document.';\n const languageHint =\n options?.language && options.language !== 'auto'\n ? ` Text content should be in ${options.language}.`\n : '';\n\n return `${basePrompt}${languageHint}\n\nExtract data from the provided document and return it as a JSON object following this schema:\n\n${JSON.stringify(schema, null, 2)}\n\nImportant:\n- Return ONLY valid JSON, no additional text or markdown formatting\n- Follow the schema structure exactly\n- If a field cannot be extracted, use null\n- Do not include any explanation, just the JSON object`;\n }\n\n /**\n * Parse JSON response from AI, handling potential formatting issues\n */\n protected parseJsonResponse<T>(response: string): T {\n let cleaned = response.trim();\n\n // Remove markdown code blocks if present\n if (cleaned.startsWith('```json')) {\n cleaned = cleaned.slice(7);\n } else if (cleaned.startsWith('```')) {\n cleaned = cleaned.slice(3);\n }\n\n if (cleaned.endsWith('```')) {\n cleaned = cleaned.slice(0, -3);\n }\n\n cleaned = cleaned.trim();\n\n try {\n return JSON.parse(cleaned) as T;\n } catch {\n throw new Error(`Failed to parse JSON response: ${response.substring(0, 200)}...`);\n }\n }\n}\n","import { GoogleGenerativeAI, type GenerationConfig } from '@google/generative-ai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'gemini-1.5-flash';\n\nexport class GeminiProvider extends BaseProvider {\n readonly name: AIProvider = 'gemini';\n readonly model: string;\n\n private client: GoogleGenerativeAI;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new GoogleGenerativeAI(apiKey);\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const generationConfig = this.buildGenerationConfig(options?.modelConfig);\n const model = this.client.getGenerativeModel({\n model: this.model,\n generationConfig,\n });\n const prompt = this.buildTextPrompt(options);\n\n const content = this.buildContent(file, prompt);\n const result = await model.generateContent(content);\n const response = result.response;\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.text(),\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const generationConfig = this.buildGenerationConfig(options?.modelConfig, {\n responseMimeType: 'application/json',\n });\n const model = this.client.getGenerativeModel({\n model: this.model,\n generationConfig,\n });\n\n const prompt = this.buildJsonPrompt(schema, options);\n const content = this.buildContent(file, prompt);\n\n const result = await model.generateContent(content);\n const response = result.response;\n const text = response.text();\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildGenerationConfig(\n modelConfig?: ModelConfig,\n defaults?: Partial<GenerationConfig>\n ): GenerationConfig {\n const config: GenerationConfig = { ...defaults };\n\n if (modelConfig?.temperature !== undefined) {\n config.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n config.maxOutputTokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n config.topP = modelConfig.topP;\n }\n if (modelConfig?.topK !== undefined) {\n config.topK = modelConfig.topK;\n }\n if (modelConfig?.stopSequences !== undefined) {\n config.stopSequences = modelConfig.stopSequences;\n }\n\n return config;\n }\n\n private extractTokenUsage(response: { usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number } }): TokenUsage | undefined {\n const usage = response.usageMetadata;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.promptTokenCount || 0,\n outputTokens: usage.candidatesTokenCount || 0,\n totalTokens: usage.totalTokenCount || 0,\n };\n }\n\n private buildContent(\n file: FileInfo,\n prompt: string\n ): Parameters<ReturnType<GoogleGenerativeAI['getGenerativeModel']>['generateContent']>[0] {\n if (file.type === 'text') {\n return `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`;\n }\n\n // For images and PDFs, use inline data\n return [\n {\n inlineData: {\n mimeType: file.mimeType,\n data: file.base64 || file.content.toString('base64'),\n },\n },\n { text: prompt },\n ];\n }\n}\n","import OpenAI from 'openai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'gpt-4o';\n\nexport class OpenAIProvider extends BaseProvider {\n readonly name: AIProvider = 'openai';\n readonly model: string;\n\n private client: OpenAI;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new OpenAI({ apiKey });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n });\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.choices[0]?.message?.content || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n response_format: { type: 'json_object' },\n });\n\n const text = response.choices[0]?.message?.content || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildCompletionOptions(modelConfig?: ModelConfig): Record<string, unknown> {\n const options: Record<string, unknown> = {\n max_tokens: 16384,\n };\n\n if (modelConfig?.temperature !== undefined) {\n options.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n options.max_tokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n options.top_p = modelConfig.topP;\n }\n if (modelConfig?.stopSequences !== undefined) {\n options.stop = modelConfig.stopSequences;\n }\n\n return options;\n }\n\n private extractTokenUsage(response: OpenAI.Chat.Completions.ChatCompletion): TokenUsage | undefined {\n const usage = response.usage;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n }\n\n private buildMessages(\n file: FileInfo,\n prompt: string\n ): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\n if (file.type === 'text') {\n return [\n {\n role: 'user',\n content: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`,\n },\n ];\n }\n\n // For images and PDFs\n const base64 = file.base64 || file.content.toString('base64');\n const imageUrl = `data:${file.mimeType};base64,${base64}`;\n\n return [\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imageUrl,\n detail: 'high',\n },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n },\n ];\n }\n}\n","import Anthropic from '@anthropic-ai/sdk';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, SupportedFileType, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'claude-sonnet-4-20250514';\n\ntype ImageMediaType = 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp';\n\nexport class ClaudeProvider extends BaseProvider {\n readonly name: AIProvider = 'claude';\n readonly model: string;\n\n private client: Anthropic;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new Anthropic({ apiKey });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const messageOptions = this.buildMessageOptions(options?.modelConfig);\n\n const response = await this.client.messages.create({\n model: this.model,\n messages: [\n {\n role: 'user',\n content: this.buildContent(file, prompt),\n },\n ],\n max_tokens: messageOptions.max_tokens,\n temperature: messageOptions.temperature,\n top_p: messageOptions.top_p,\n top_k: messageOptions.top_k,\n stop_sequences: messageOptions.stop_sequences,\n });\n\n const textBlock = response.content.find((block) => block.type === 'text');\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: textBlock?.text || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const messageOptions = this.buildMessageOptions(options?.modelConfig);\n\n const response = await this.client.messages.create({\n model: this.model,\n messages: [\n {\n role: 'user',\n content: this.buildContent(file, prompt),\n },\n ],\n max_tokens: messageOptions.max_tokens,\n temperature: messageOptions.temperature,\n top_p: messageOptions.top_p,\n top_k: messageOptions.top_k,\n stop_sequences: messageOptions.stop_sequences,\n });\n\n const textBlock = response.content.find((block) => block.type === 'text');\n const text = textBlock?.text || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildMessageOptions(modelConfig?: ModelConfig): {\n max_tokens: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n stop_sequences?: string[];\n } {\n const options: {\n max_tokens: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n stop_sequences?: string[];\n } = {\n max_tokens: 16384,\n };\n\n if (modelConfig?.temperature !== undefined) {\n options.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n options.max_tokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n options.top_p = modelConfig.topP;\n }\n if (modelConfig?.topK !== undefined) {\n options.top_k = modelConfig.topK;\n }\n if (modelConfig?.stopSequences !== undefined) {\n options.stop_sequences = modelConfig.stopSequences;\n }\n\n return options;\n }\n\n supportsFileType(type: SupportedFileType): boolean {\n // Claude supports images and PDFs via vision\n return ['pdf', 'image', 'text'].includes(type);\n }\n\n private extractTokenUsage(response: Anthropic.Message): TokenUsage | undefined {\n return {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n totalTokens: response.usage.input_tokens + response.usage.output_tokens,\n };\n }\n\n private buildContent(file: FileInfo, prompt: string): Anthropic.MessageCreateParams['messages'][0]['content'] {\n if (file.type === 'text') {\n return `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`;\n }\n\n const base64 = file.base64 || file.content.toString('base64');\n\n // Handle PDF files - Claude supports PDFs via base64\n if (file.type === 'pdf') {\n // For PDFs, we use the document block type\n return [\n {\n type: 'document' as const,\n source: {\n type: 'base64' as const,\n media_type: 'application/pdf' as const,\n data: base64,\n },\n },\n {\n type: 'text' as const,\n text: prompt,\n },\n ] as Anthropic.MessageCreateParams['messages'][0]['content'];\n }\n\n // Handle images\n return [\n {\n type: 'image' as const,\n source: {\n type: 'base64' as const,\n media_type: this.getMediaType(file.mimeType),\n data: base64,\n },\n },\n {\n type: 'text' as const,\n text: prompt,\n },\n ];\n }\n\n private getMediaType(mimeType: string): ImageMediaType {\n const supportedTypes: ImageMediaType[] = [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n ];\n\n if (supportedTypes.includes(mimeType as ImageMediaType)) {\n return mimeType as ImageMediaType;\n }\n\n // Default to JPEG for unsupported image types\n return 'image/jpeg';\n }\n}\n","import OpenAI from 'openai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\n// Grok uses OpenAI-compatible API\nconst GROK_BASE_URL = 'https://api.x.ai/v1';\nconst DEFAULT_MODEL = 'grok-2-vision-1212';\n\nexport class GrokProvider extends BaseProvider {\n readonly name: AIProvider = 'grok';\n readonly model: string;\n\n private client: OpenAI;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new OpenAI({\n apiKey,\n baseURL: GROK_BASE_URL,\n });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n });\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.choices[0]?.message?.content || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n });\n\n const text = response.choices[0]?.message?.content || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildCompletionOptions(modelConfig?: ModelConfig): Record<string, unknown> {\n const options: Record<string, unknown> = {\n max_tokens: 16384,\n };\n\n if (modelConfig?.temperature !== undefined) {\n options.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n options.max_tokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n options.top_p = modelConfig.topP;\n }\n if (modelConfig?.stopSequences !== undefined) {\n options.stop = modelConfig.stopSequences;\n }\n\n return options;\n }\n\n private extractTokenUsage(response: OpenAI.Chat.Completions.ChatCompletion): TokenUsage | undefined {\n const usage = response.usage;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n }\n\n private buildMessages(\n file: FileInfo,\n prompt: string\n ): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\n if (file.type === 'text') {\n return [\n {\n role: 'user',\n content: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`,\n },\n ];\n }\n\n // For images and PDFs - Grok uses OpenAI-compatible format\n const base64 = file.base64 || file.content.toString('base64');\n const imageUrl = `data:${file.mimeType};base64,${base64}`;\n\n return [\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imageUrl,\n detail: 'high',\n },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n },\n ];\n }\n}\n","import { GoogleGenAI } from '@google/genai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'gemini-2.0-flash';\n\nexport interface VertexConfig {\n project: string;\n location: string;\n}\n\nexport class VertexProvider extends BaseProvider {\n readonly name: AIProvider = 'vertex';\n readonly model: string;\n\n private client: GoogleGenAI;\n\n constructor(config: VertexConfig, model?: string) {\n super('vertex');\n this.model = model || DEFAULT_MODEL;\n this.client = new GoogleGenAI({\n vertexai: true,\n project: config.project,\n location: config.location,\n });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const generationConfig = this.buildGenerationConfig(options?.modelConfig);\n\n const response = await this.client.models.generateContent({\n model: this.model,\n contents: this.buildContents(file, prompt),\n config: generationConfig,\n });\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.text || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const generationConfig = this.buildGenerationConfig(options?.modelConfig, {\n responseMimeType: 'application/json',\n });\n\n const response = await this.client.models.generateContent({\n model: this.model,\n contents: this.buildContents(file, prompt),\n config: generationConfig,\n });\n\n const text = response.text || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildGenerationConfig(\n modelConfig?: ModelConfig,\n defaults?: Record<string, unknown>\n ): Record<string, unknown> {\n const config: Record<string, unknown> = { ...defaults };\n\n if (modelConfig?.temperature !== undefined) {\n config.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n config.maxOutputTokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n config.topP = modelConfig.topP;\n }\n if (modelConfig?.topK !== undefined) {\n config.topK = modelConfig.topK;\n }\n if (modelConfig?.stopSequences !== undefined) {\n config.stopSequences = modelConfig.stopSequences;\n }\n\n return config;\n }\n\n private extractTokenUsage(response: { usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number } }): TokenUsage | undefined {\n const usage = response.usageMetadata;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.promptTokenCount || 0,\n outputTokens: usage.candidatesTokenCount || 0,\n totalTokens: usage.totalTokenCount || 0,\n };\n }\n\n private buildContents(file: FileInfo, prompt: string): Array<{ role: string; parts: Array<{ text?: string; inlineData?: { mimeType: string; data: string } }> }> {\n if (file.type === 'text') {\n return [\n {\n role: 'user',\n parts: [\n { text: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}` },\n ],\n },\n ];\n }\n\n // For images and PDFs\n const base64 = file.base64 || file.content.toString('base64');\n\n return [\n {\n role: 'user',\n parts: [\n {\n inlineData: {\n mimeType: file.mimeType,\n data: base64,\n },\n },\n { text: prompt },\n ],\n },\n ];\n }\n}\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { FileInfo, SupportedFileType } from '../types';\n\n/**\n * MIME type to file type mapping\n */\nconst MIME_TO_FILE_TYPE: Record<string, SupportedFileType> = {\n 'application/pdf': 'pdf',\n 'image/jpeg': 'image',\n 'image/png': 'image',\n 'image/gif': 'image',\n 'image/webp': 'image',\n 'image/bmp': 'image',\n 'image/tiff': 'image',\n 'text/plain': 'text',\n 'text/markdown': 'text',\n 'text/csv': 'text',\n 'application/json': 'text',\n 'application/xml': 'text',\n 'text/html': 'text',\n};\n\n/**\n * MIME type mappings for supported file types\n */\nconst MIME_TYPES: Record<string, string> = {\n // PDF\n '.pdf': 'application/pdf',\n\n // Images\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.bmp': 'image/bmp',\n '.tiff': 'image/tiff',\n '.tif': 'image/tiff',\n\n // Text files\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.csv': 'text/csv',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.html': 'text/html',\n '.htm': 'text/html',\n};\n\n/**\n * File type categories\n */\nconst FILE_TYPE_CATEGORIES: Record<string, SupportedFileType> = {\n '.pdf': 'pdf',\n '.jpg': 'image',\n '.jpeg': 'image',\n '.png': 'image',\n '.gif': 'image',\n '.webp': 'image',\n '.bmp': 'image',\n '.tiff': 'image',\n '.tif': 'image',\n '.txt': 'text',\n '.md': 'text',\n '.csv': 'text',\n '.json': 'text',\n '.xml': 'text',\n '.html': 'text',\n '.htm': 'text',\n};\n\n/**\n * Load a file from disk and prepare it for AI processing\n */\nexport async function loadFile(filePath: string): Promise<FileInfo> {\n const absolutePath = path.resolve(filePath);\n\n // Check if file exists\n try {\n await fs.access(absolutePath);\n } catch {\n throw new Error(`File not found: ${absolutePath}`);\n }\n\n // Get file stats\n const stats = await fs.stat(absolutePath);\n\n if (!stats.isFile()) {\n throw new Error(`Path is not a file: ${absolutePath}`);\n }\n\n // Get file extension and determine type\n const ext = path.extname(absolutePath).toLowerCase();\n const fileName = path.basename(absolutePath);\n\n const mimeType = MIME_TYPES[ext];\n const fileType = FILE_TYPE_CATEGORIES[ext];\n\n if (!mimeType || !fileType) {\n throw new Error(\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\n );\n }\n\n // Read file content\n const content = await fs.readFile(absolutePath);\n\n // Prepare base64 for non-text files\n const base64 = fileType !== 'text' ? content.toString('base64') : undefined;\n\n return {\n path: absolutePath,\n name: fileName,\n type: fileType,\n mimeType,\n size: stats.size,\n content,\n base64,\n };\n}\n\n/**\n * Load a file from a Buffer\n */\nexport function loadFileFromBuffer(\n buffer: Buffer,\n fileName: string,\n mimeType?: string\n): FileInfo {\n const ext = path.extname(fileName).toLowerCase();\n const detectedMimeType = mimeType || MIME_TYPES[ext];\n const fileType = FILE_TYPE_CATEGORIES[ext];\n\n if (!detectedMimeType || !fileType) {\n throw new Error(\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\n );\n }\n\n const base64 = fileType !== 'text' ? buffer.toString('base64') : undefined;\n\n return {\n path: '',\n name: fileName,\n type: fileType,\n mimeType: detectedMimeType,\n size: buffer.length,\n content: buffer,\n base64,\n };\n}\n\n/**\n * Load a file from base64 string\n */\nexport function loadFileFromBase64(\n base64: string,\n fileName: string,\n mimeType?: string\n): FileInfo {\n // Remove data URL prefix if present\n const base64Data = base64.includes(',') ? base64.split(',')[1] : base64;\n const buffer = Buffer.from(base64Data, 'base64');\n\n const ext = path.extname(fileName).toLowerCase();\n const detectedMimeType = mimeType || MIME_TYPES[ext];\n const fileType = FILE_TYPE_CATEGORIES[ext];\n\n if (!detectedMimeType || !fileType) {\n throw new Error(\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\n );\n }\n\n return {\n path: '',\n name: fileName,\n type: fileType,\n mimeType: detectedMimeType,\n size: buffer.length,\n content: buffer,\n base64: base64Data,\n };\n}\n\n/**\n * Save content to a file\n */\nexport async function saveToFile(filePath: string, content: string | Buffer): Promise<void> {\n const absolutePath = path.resolve(filePath);\n const dir = path.dirname(absolutePath);\n\n // Ensure directory exists\n await fs.mkdir(dir, { recursive: true });\n\n // Write file\n await fs.writeFile(absolutePath, content, typeof content === 'string' ? 'utf-8' : undefined);\n}\n\n/**\n * Get supported file extensions\n */\nexport function getSupportedExtensions(): string[] {\n return Object.keys(MIME_TYPES);\n}\n\n/**\n * Check if a file extension is supported\n */\nexport function isExtensionSupported(ext: string): boolean {\n const normalizedExt = ext.startsWith('.') ? ext.toLowerCase() : `.${ext.toLowerCase()}`;\n return normalizedExt in MIME_TYPES;\n}\n\n/**\n * Check if a string is a URL\n */\nexport function isUrl(str: string): boolean {\n return str.startsWith('http://') || str.startsWith('https://');\n}\n\n/**\n * Load a file from a URL\n */\nexport async function loadFileFromUrl(url: string): Promise<FileInfo> {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch URL: ${response.status} ${response.statusText}`);\n }\n\n const contentType = response.headers.get('content-type')?.split(';')[0] || '';\n const buffer = Buffer.from(await response.arrayBuffer());\n\n // Try to get filename from URL or Content-Disposition header\n const contentDisposition = response.headers.get('content-disposition');\n let fileName = '';\n\n if (contentDisposition) {\n const match = contentDisposition.match(/filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/);\n if (match) {\n fileName = match[1].replace(/['\"]/g, '');\n }\n }\n\n if (!fileName) {\n // Extract filename from URL path\n const urlPath = new URL(url).pathname;\n fileName = path.basename(urlPath) || 'download';\n }\n\n // Determine file type from content-type header or extension\n let fileType = MIME_TO_FILE_TYPE[contentType];\n let mimeType = contentType;\n\n if (!fileType) {\n // Try to determine from file extension\n const ext = path.extname(fileName).toLowerCase();\n mimeType = MIME_TYPES[ext];\n fileType = FILE_TYPE_CATEGORIES[ext];\n }\n\n if (!fileType || !mimeType) {\n throw new Error(\n `Unsupported file type from URL. Content-Type: ${contentType}, Filename: ${fileName}`\n );\n }\n\n const base64 = fileType !== 'text' ? buffer.toString('base64') : undefined;\n\n return {\n path: url,\n name: fileName,\n type: fileType,\n mimeType,\n size: buffer.length,\n content: buffer,\n base64,\n };\n}\n","import type {\n AIProvider,\n ExtractaConfig,\n ExtractionOptions,\n ExtractionResult,\n FileInfo,\n IAIProvider,\n JsonExtractionResult,\n TextExtractionResult,\n} from './types';\nimport {\n ClaudeProvider,\n GeminiProvider,\n GrokProvider,\n OpenAIProvider,\n VertexProvider,\n} from './providers';\nimport {\n loadFile,\n loadFileFromBase64,\n loadFileFromBuffer,\n loadFileFromUrl,\n isUrl,\n saveToFile,\n} from './loaders';\n\n/**\n * Main class for document extraction using AI\n */\nexport class ExtractaAI {\n private provider: IAIProvider;\n private config: ExtractaConfig;\n\n constructor(config: ExtractaConfig) {\n this.config = config;\n this.provider = this.createProvider(config);\n }\n\n /**\n * Create a provider instance based on configuration\n */\n private createProvider(config: ExtractaConfig): IAIProvider {\n switch (config.provider) {\n case 'gemini':\n if (!config.apiKey) throw new Error('API key is required for Gemini provider');\n return new GeminiProvider(config.apiKey, config.model);\n case 'openai':\n if (!config.apiKey) throw new Error('API key is required for OpenAI provider');\n return new OpenAIProvider(config.apiKey, config.model);\n case 'claude':\n if (!config.apiKey) throw new Error('API key is required for Claude provider');\n return new ClaudeProvider(config.apiKey, config.model);\n case 'grok':\n if (!config.apiKey) throw new Error('API key is required for Grok provider');\n return new GrokProvider(config.apiKey, config.model);\n case 'vertex':\n if (!config.vertexConfig) throw new Error('vertexConfig is required for Vertex AI provider');\n return new VertexProvider(config.vertexConfig, config.model);\n default:\n throw new Error(`Unsupported provider: ${config.provider}`);\n }\n }\n\n /**\n * Extract content from a file path or URL\n */\n async extract(\n source: string,\n options?: ExtractionOptions\n ): Promise<ExtractionResult> {\n const startTime = Date.now();\n\n try {\n const file = isUrl(source)\n ? await loadFileFromUrl(source)\n : await loadFile(source);\n return this.processExtraction(file, options, startTime);\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Extract content from a Buffer\n */\n async extractFromBuffer(\n buffer: Buffer,\n fileName: string,\n options?: ExtractionOptions\n ): Promise<ExtractionResult> {\n const startTime = Date.now();\n\n try {\n const file = loadFileFromBuffer(buffer, fileName);\n return this.processExtraction(file, options, startTime);\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Extract content from a base64 string\n */\n async extractFromBase64(\n base64: string,\n fileName: string,\n options?: ExtractionOptions\n ): Promise<ExtractionResult> {\n const startTime = Date.now();\n\n try {\n const file = loadFileFromBase64(base64, fileName);\n return this.processExtraction(file, options, startTime);\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Process the extraction based on format\n */\n private async processExtraction(\n file: FileInfo,\n options: ExtractionOptions | undefined,\n startTime: number\n ): Promise<ExtractionResult> {\n const format = options?.format || 'text';\n\n // Check if provider supports the file type\n if (!this.provider.supportsFileType(file.type)) {\n return {\n success: false,\n error: `Provider ${this.provider.name} does not support file type: ${file.type}`,\n code: 'UNSUPPORTED_FILE_TYPE',\n };\n }\n\n try {\n if (format === 'json') {\n if (!options?.schema) {\n return {\n success: false,\n error: 'Schema is required for JSON extraction',\n code: 'MISSING_SCHEMA',\n };\n }\n\n const providerResult = await this.provider.extractJson(file, options.schema, options);\n const result: JsonExtractionResult = {\n success: true,\n format: 'json',\n data: providerResult.content,\n metadata: {\n provider: this.provider.name,\n model: this.provider.model,\n fileType: file.type,\n fileName: file.name,\n processingTimeMs: Date.now() - startTime,\n tokens: providerResult.tokens,\n },\n };\n\n // Save to file if outputPath is specified\n if (options.outputPath) {\n await saveToFile(options.outputPath, JSON.stringify(providerResult.content, null, 2));\n }\n\n return result;\n } else {\n const providerResult = await this.provider.extractText(file, options);\n const result: TextExtractionResult = {\n success: true,\n format: 'text',\n content: providerResult.content,\n metadata: {\n provider: this.provider.name,\n model: this.provider.model,\n fileType: file.type,\n fileName: file.name,\n processingTimeMs: Date.now() - startTime,\n tokens: providerResult.tokens,\n },\n };\n\n // Save to file if outputPath is specified\n if (options?.outputPath) {\n await saveToFile(options.outputPath, providerResult.content);\n }\n\n return result;\n }\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Create an error result\n */\n private createErrorResult(error: unknown): ExtractionResult {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: message,\n code: 'EXTRACTION_ERROR',\n };\n }\n\n /**\n * Get current provider name\n */\n getProvider(): AIProvider {\n return this.provider.name;\n }\n\n /**\n * Get current model\n */\n getModel(): string {\n return this.provider.model;\n }\n\n /**\n * Change the AI provider\n */\n setProvider(provider: AIProvider, apiKey: string, model?: string): void {\n this.config = { provider, apiKey, model };\n this.provider = this.createProvider(this.config);\n }\n}\n\n/**\n * Factory function to create ExtractaAI instance\n */\nexport function createExtractaAI(config: ExtractaConfig): ExtractaAI {\n return new ExtractaAI(config);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/providers/base.provider.ts","../src/providers/gemini.provider.ts","../src/providers/openai.provider.ts","../src/providers/claude.provider.ts","../src/providers/grok.provider.ts","../src/providers/vertex.provider.ts","../src/loaders/file.loader.ts","../src/ocr.ts"],"names":["DEFAULT_MODEL","OpenAI"],"mappings":"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","file":"index.mjs","sourcesContent":["import type {\n AIProvider,\n ExtractionOptions,\n FileInfo,\n IAIProvider,\n ProviderResult,\n SupportedFileType,\n} from '../types';\n\n/**\n * Base class for AI providers with common functionality\n */\nexport abstract class BaseProvider implements IAIProvider {\n abstract readonly name: AIProvider;\n abstract readonly model: string;\n\n protected apiKey: string;\n\n constructor(apiKey: string) {\n if (!apiKey || apiKey.trim() === '') {\n throw new Error(`API key is required for ${this.constructor.name}`);\n }\n this.apiKey = apiKey;\n }\n\n abstract extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>>;\n\n abstract extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>>;\n\n supportsFileType(type: SupportedFileType): boolean {\n return ['pdf', 'image', 'text'].includes(type);\n }\n\n /**\n * Build the text extraction prompt\n */\n protected buildTextPrompt(options?: ExtractionOptions): string {\n const basePrompt = options?.prompt || 'Extract all text content from this document.';\n const languageHint =\n options?.language && options.language !== 'auto'\n ? ` Respond in ${options.language}.`\n : '';\n\n return `${basePrompt}${languageHint}\n\nPlease extract and return all the text content from the provided document.\nMaintain the original structure and formatting as much as possible.\nReturn only the extracted text, without any additional commentary or metadata.`;\n }\n\n /**\n * Build the JSON extraction prompt\n */\n protected buildJsonPrompt(\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): string {\n const basePrompt =\n options?.prompt || 'Extract structured data from this document.';\n const languageHint =\n options?.language && options.language !== 'auto'\n ? ` Text content should be in ${options.language}.`\n : '';\n\n return `${basePrompt}${languageHint}\n\nExtract data from the provided document and return it as a JSON object following this schema:\n\n${JSON.stringify(schema, null, 2)}\n\nImportant:\n- Return ONLY valid JSON, no additional text or markdown formatting\n- Follow the schema structure exactly\n- If a field cannot be extracted, use null\n- Do not include any explanation, just the JSON object`;\n }\n\n /**\n * Parse JSON response from AI, handling potential formatting issues\n */\n protected parseJsonResponse<T>(response: string): T {\n let cleaned = response.trim();\n\n // Remove markdown code blocks if present\n if (cleaned.startsWith('```json')) {\n cleaned = cleaned.slice(7);\n } else if (cleaned.startsWith('```')) {\n cleaned = cleaned.slice(3);\n }\n\n if (cleaned.endsWith('```')) {\n cleaned = cleaned.slice(0, -3);\n }\n\n cleaned = cleaned.trim();\n\n try {\n return JSON.parse(cleaned) as T;\n } catch {\n throw new Error(`Failed to parse JSON response: ${response.substring(0, 200)}...`);\n }\n }\n}\n","import { GoogleGenerativeAI, type GenerationConfig } from '@google/generative-ai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'gemini-1.5-flash';\n\nexport class GeminiProvider extends BaseProvider {\n readonly name: AIProvider = 'gemini';\n readonly model: string;\n\n private client: GoogleGenerativeAI;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new GoogleGenerativeAI(apiKey);\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const generationConfig = this.buildGenerationConfig(options?.modelConfig);\n const model = this.client.getGenerativeModel({\n model: this.model,\n generationConfig,\n });\n const prompt = this.buildTextPrompt(options);\n\n const content = this.buildContent(file, prompt);\n const result = await model.generateContent(content);\n const response = result.response;\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.text(),\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const generationConfig = this.buildGenerationConfig(options?.modelConfig, {\n responseMimeType: 'application/json',\n });\n const model = this.client.getGenerativeModel({\n model: this.model,\n generationConfig,\n });\n\n const prompt = this.buildJsonPrompt(schema, options);\n const content = this.buildContent(file, prompt);\n\n const result = await model.generateContent(content);\n const response = result.response;\n const text = response.text();\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildGenerationConfig(\n modelConfig?: ModelConfig,\n defaults?: Partial<GenerationConfig>\n ): GenerationConfig {\n const config: GenerationConfig = { ...defaults };\n\n if (modelConfig?.temperature !== undefined) {\n config.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n config.maxOutputTokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n config.topP = modelConfig.topP;\n }\n if (modelConfig?.topK !== undefined) {\n config.topK = modelConfig.topK;\n }\n if (modelConfig?.stopSequences !== undefined) {\n config.stopSequences = modelConfig.stopSequences;\n }\n\n return config;\n }\n\n private extractTokenUsage(response: { usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number } }): TokenUsage | undefined {\n const usage = response.usageMetadata;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.promptTokenCount || 0,\n outputTokens: usage.candidatesTokenCount || 0,\n totalTokens: usage.totalTokenCount || 0,\n };\n }\n\n private buildContent(\n file: FileInfo,\n prompt: string\n ): Parameters<ReturnType<GoogleGenerativeAI['getGenerativeModel']>['generateContent']>[0] {\n if (file.type === 'text') {\n return `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`;\n }\n\n // For images and PDFs, use inline data\n return [\n {\n inlineData: {\n mimeType: file.mimeType,\n data: file.base64 || file.content.toString('base64'),\n },\n },\n { text: prompt },\n ];\n }\n}\n","import OpenAI from 'openai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'gpt-4o';\n\nexport class OpenAIProvider extends BaseProvider {\n readonly name: AIProvider = 'openai';\n readonly model: string;\n\n private client: OpenAI;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new OpenAI({ apiKey });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n });\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.choices[0]?.message?.content || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n response_format: { type: 'json_object' },\n });\n\n const text = response.choices[0]?.message?.content || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildCompletionOptions(modelConfig?: ModelConfig): Record<string, unknown> {\n const options: Record<string, unknown> = {\n max_tokens: 16384,\n };\n\n if (modelConfig?.temperature !== undefined) {\n options.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n options.max_tokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n options.top_p = modelConfig.topP;\n }\n if (modelConfig?.stopSequences !== undefined) {\n options.stop = modelConfig.stopSequences;\n }\n\n return options;\n }\n\n private extractTokenUsage(response: OpenAI.Chat.Completions.ChatCompletion): TokenUsage | undefined {\n const usage = response.usage;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n }\n\n private buildMessages(\n file: FileInfo,\n prompt: string\n ): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\n if (file.type === 'text') {\n return [\n {\n role: 'user',\n content: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`,\n },\n ];\n }\n\n // For images and PDFs\n const base64 = file.base64 || file.content.toString('base64');\n const imageUrl = `data:${file.mimeType};base64,${base64}`;\n\n return [\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imageUrl,\n detail: 'high',\n },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n },\n ];\n }\n}\n","import Anthropic from '@anthropic-ai/sdk';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, SupportedFileType, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'claude-sonnet-4-20250514';\n\ntype ImageMediaType = 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp';\n\nexport class ClaudeProvider extends BaseProvider {\n readonly name: AIProvider = 'claude';\n readonly model: string;\n\n private client: Anthropic;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new Anthropic({ apiKey });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const messageOptions = this.buildMessageOptions(options?.modelConfig);\n\n const response = await this.client.messages.create({\n model: this.model,\n messages: [\n {\n role: 'user',\n content: this.buildContent(file, prompt),\n },\n ],\n max_tokens: messageOptions.max_tokens,\n temperature: messageOptions.temperature,\n top_p: messageOptions.top_p,\n top_k: messageOptions.top_k,\n stop_sequences: messageOptions.stop_sequences,\n });\n\n const textBlock = response.content.find((block) => block.type === 'text');\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: textBlock?.text || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const messageOptions = this.buildMessageOptions(options?.modelConfig);\n\n const response = await this.client.messages.create({\n model: this.model,\n messages: [\n {\n role: 'user',\n content: this.buildContent(file, prompt),\n },\n ],\n max_tokens: messageOptions.max_tokens,\n temperature: messageOptions.temperature,\n top_p: messageOptions.top_p,\n top_k: messageOptions.top_k,\n stop_sequences: messageOptions.stop_sequences,\n });\n\n const textBlock = response.content.find((block) => block.type === 'text');\n const text = textBlock?.text || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildMessageOptions(modelConfig?: ModelConfig): {\n max_tokens: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n stop_sequences?: string[];\n } {\n const options: {\n max_tokens: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n stop_sequences?: string[];\n } = {\n max_tokens: 16384,\n };\n\n if (modelConfig?.temperature !== undefined) {\n options.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n options.max_tokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n options.top_p = modelConfig.topP;\n }\n if (modelConfig?.topK !== undefined) {\n options.top_k = modelConfig.topK;\n }\n if (modelConfig?.stopSequences !== undefined) {\n options.stop_sequences = modelConfig.stopSequences;\n }\n\n return options;\n }\n\n supportsFileType(type: SupportedFileType): boolean {\n // Claude supports images and PDFs via vision\n return ['pdf', 'image', 'text'].includes(type);\n }\n\n private extractTokenUsage(response: Anthropic.Message): TokenUsage | undefined {\n return {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n totalTokens: response.usage.input_tokens + response.usage.output_tokens,\n };\n }\n\n private buildContent(file: FileInfo, prompt: string): Anthropic.MessageCreateParams['messages'][0]['content'] {\n if (file.type === 'text') {\n return `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`;\n }\n\n const base64 = file.base64 || file.content.toString('base64');\n\n // Handle PDF files - Claude supports PDFs via base64\n if (file.type === 'pdf') {\n // For PDFs, we use the document block type\n return [\n {\n type: 'document' as const,\n source: {\n type: 'base64' as const,\n media_type: 'application/pdf' as const,\n data: base64,\n },\n },\n {\n type: 'text' as const,\n text: prompt,\n },\n ] as Anthropic.MessageCreateParams['messages'][0]['content'];\n }\n\n // Handle images\n return [\n {\n type: 'image' as const,\n source: {\n type: 'base64' as const,\n media_type: this.getMediaType(file.mimeType),\n data: base64,\n },\n },\n {\n type: 'text' as const,\n text: prompt,\n },\n ];\n }\n\n private getMediaType(mimeType: string): ImageMediaType {\n const supportedTypes: ImageMediaType[] = [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n ];\n\n if (supportedTypes.includes(mimeType as ImageMediaType)) {\n return mimeType as ImageMediaType;\n }\n\n // Default to JPEG for unsupported image types\n return 'image/jpeg';\n }\n}\n","import OpenAI from 'openai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\n// Grok uses OpenAI-compatible API\nconst GROK_BASE_URL = 'https://api.x.ai/v1';\nconst DEFAULT_MODEL = 'grok-2-vision-1212';\n\nexport class GrokProvider extends BaseProvider {\n readonly name: AIProvider = 'grok';\n readonly model: string;\n\n private client: OpenAI;\n\n constructor(apiKey: string, model?: string) {\n super(apiKey);\n this.model = model || DEFAULT_MODEL;\n this.client = new OpenAI({\n apiKey,\n baseURL: GROK_BASE_URL,\n });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n });\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.choices[0]?.message?.content || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const messages = this.buildMessages(file, prompt);\n const completionOptions = this.buildCompletionOptions(options?.modelConfig);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n ...completionOptions,\n });\n\n const text = response.choices[0]?.message?.content || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildCompletionOptions(modelConfig?: ModelConfig): Record<string, unknown> {\n const options: Record<string, unknown> = {\n max_tokens: 16384,\n };\n\n if (modelConfig?.temperature !== undefined) {\n options.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n options.max_tokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n options.top_p = modelConfig.topP;\n }\n if (modelConfig?.stopSequences !== undefined) {\n options.stop = modelConfig.stopSequences;\n }\n\n return options;\n }\n\n private extractTokenUsage(response: OpenAI.Chat.Completions.ChatCompletion): TokenUsage | undefined {\n const usage = response.usage;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n }\n\n private buildMessages(\n file: FileInfo,\n prompt: string\n ): OpenAI.Chat.Completions.ChatCompletionMessageParam[] {\n if (file.type === 'text') {\n return [\n {\n role: 'user',\n content: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}`,\n },\n ];\n }\n\n // For images and PDFs - Grok uses OpenAI-compatible format\n const base64 = file.base64 || file.content.toString('base64');\n const imageUrl = `data:${file.mimeType};base64,${base64}`;\n\n return [\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imageUrl,\n detail: 'high',\n },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n },\n ];\n }\n}\n","import { GoogleGenAI } from '@google/genai';\nimport type { AIProvider, ExtractionOptions, FileInfo, ModelConfig, ProviderResult, TokenUsage } from '../types';\nimport { BaseProvider } from './base.provider';\n\nconst DEFAULT_MODEL = 'gemini-2.0-flash';\n\nexport interface VertexConfig {\n project: string;\n location: string;\n}\n\nexport class VertexProvider extends BaseProvider {\n readonly name: AIProvider = 'vertex';\n readonly model: string;\n\n private client: GoogleGenAI;\n\n constructor(config: VertexConfig, model?: string) {\n super('vertex');\n this.model = model || DEFAULT_MODEL;\n this.client = new GoogleGenAI({\n vertexai: true,\n project: config.project,\n location: config.location,\n });\n }\n\n async extractText(file: FileInfo, options?: ExtractionOptions): Promise<ProviderResult<string>> {\n const prompt = this.buildTextPrompt(options);\n const generationConfig = this.buildGenerationConfig(options?.modelConfig);\n\n const response = await this.client.models.generateContent({\n model: this.model,\n contents: this.buildContents(file, prompt),\n config: generationConfig,\n });\n\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: response.text || '',\n tokens,\n };\n }\n\n async extractJson<T = Record<string, unknown>>(\n file: FileInfo,\n schema: Record<string, unknown>,\n options?: ExtractionOptions\n ): Promise<ProviderResult<T>> {\n const prompt = this.buildJsonPrompt(schema, options);\n const generationConfig = this.buildGenerationConfig(options?.modelConfig, {\n responseMimeType: 'application/json',\n });\n\n const response = await this.client.models.generateContent({\n model: this.model,\n contents: this.buildContents(file, prompt),\n config: generationConfig,\n });\n\n const text = response.text || '{}';\n const tokens = this.extractTokenUsage(response);\n\n return {\n content: this.parseJsonResponse<T>(text),\n tokens,\n };\n }\n\n private buildGenerationConfig(\n modelConfig?: ModelConfig,\n defaults?: Record<string, unknown>\n ): Record<string, unknown> {\n const config: Record<string, unknown> = { ...defaults };\n\n if (modelConfig?.temperature !== undefined) {\n config.temperature = modelConfig.temperature;\n }\n if (modelConfig?.maxTokens !== undefined) {\n config.maxOutputTokens = modelConfig.maxTokens;\n }\n if (modelConfig?.topP !== undefined) {\n config.topP = modelConfig.topP;\n }\n if (modelConfig?.topK !== undefined) {\n config.topK = modelConfig.topK;\n }\n if (modelConfig?.stopSequences !== undefined) {\n config.stopSequences = modelConfig.stopSequences;\n }\n\n return config;\n }\n\n private extractTokenUsage(response: { usageMetadata?: { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number } }): TokenUsage | undefined {\n const usage = response.usageMetadata;\n if (!usage) return undefined;\n\n return {\n inputTokens: usage.promptTokenCount || 0,\n outputTokens: usage.candidatesTokenCount || 0,\n totalTokens: usage.totalTokenCount || 0,\n };\n }\n\n private buildContents(file: FileInfo, prompt: string): Array<{ role: string; parts: Array<{ text?: string; inlineData?: { mimeType: string; data: string } }> }> {\n if (file.type === 'text') {\n return [\n {\n role: 'user',\n parts: [\n { text: `${prompt}\\n\\nDocument content:\\n${file.content.toString('utf-8')}` },\n ],\n },\n ];\n }\n\n // For images and PDFs\n const base64 = file.base64 || file.content.toString('base64');\n\n return [\n {\n role: 'user',\n parts: [\n {\n inlineData: {\n mimeType: file.mimeType,\n data: base64,\n },\n },\n { text: prompt },\n ],\n },\n ];\n }\n}\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type { FileInfo, SupportedFileType } from '../types';\n\n/**\n * MIME type to file type mapping\n */\nconst MIME_TO_FILE_TYPE: Record<string, SupportedFileType> = {\n 'application/pdf': 'pdf',\n 'image/jpeg': 'image',\n 'image/png': 'image',\n 'image/gif': 'image',\n 'image/webp': 'image',\n 'image/bmp': 'image',\n 'image/tiff': 'image',\n 'text/plain': 'text',\n 'text/markdown': 'text',\n 'text/csv': 'text',\n 'application/json': 'text',\n 'application/xml': 'text',\n 'text/html': 'text',\n};\n\n/**\n * MIME type mappings for supported file types\n */\nconst MIME_TYPES: Record<string, string> = {\n // PDF\n '.pdf': 'application/pdf',\n\n // Images\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.bmp': 'image/bmp',\n '.tiff': 'image/tiff',\n '.tif': 'image/tiff',\n\n // Text files\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.csv': 'text/csv',\n '.json': 'application/json',\n '.xml': 'application/xml',\n '.html': 'text/html',\n '.htm': 'text/html',\n};\n\n/**\n * File type categories\n */\nconst FILE_TYPE_CATEGORIES: Record<string, SupportedFileType> = {\n '.pdf': 'pdf',\n '.jpg': 'image',\n '.jpeg': 'image',\n '.png': 'image',\n '.gif': 'image',\n '.webp': 'image',\n '.bmp': 'image',\n '.tiff': 'image',\n '.tif': 'image',\n '.txt': 'text',\n '.md': 'text',\n '.csv': 'text',\n '.json': 'text',\n '.xml': 'text',\n '.html': 'text',\n '.htm': 'text',\n};\n\n/**\n * Load a file from disk and prepare it for AI processing\n */\nexport async function loadFile(filePath: string): Promise<FileInfo> {\n const absolutePath = path.resolve(filePath);\n\n // Check if file exists\n try {\n await fs.access(absolutePath);\n } catch {\n throw new Error(`File not found: ${absolutePath}`);\n }\n\n // Get file stats\n const stats = await fs.stat(absolutePath);\n\n if (!stats.isFile()) {\n throw new Error(`Path is not a file: ${absolutePath}`);\n }\n\n // Get file extension and determine type\n const ext = path.extname(absolutePath).toLowerCase();\n const fileName = path.basename(absolutePath);\n\n const mimeType = MIME_TYPES[ext];\n const fileType = FILE_TYPE_CATEGORIES[ext];\n\n if (!mimeType || !fileType) {\n throw new Error(\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\n );\n }\n\n // Read file content\n const content = await fs.readFile(absolutePath);\n\n // Prepare base64 for non-text files\n const base64 = fileType !== 'text' ? content.toString('base64') : undefined;\n\n return {\n path: absolutePath,\n name: fileName,\n type: fileType,\n mimeType,\n size: stats.size,\n content,\n base64,\n };\n}\n\n/**\n * Load a file from a Buffer\n */\nexport function loadFileFromBuffer(\n buffer: Buffer,\n fileName: string,\n mimeType?: string\n): FileInfo {\n const ext = path.extname(fileName).toLowerCase();\n const detectedMimeType = mimeType || MIME_TYPES[ext];\n const fileType = FILE_TYPE_CATEGORIES[ext];\n\n if (!detectedMimeType || !fileType) {\n throw new Error(\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\n );\n }\n\n const base64 = fileType !== 'text' ? buffer.toString('base64') : undefined;\n\n return {\n path: '',\n name: fileName,\n type: fileType,\n mimeType: detectedMimeType,\n size: buffer.length,\n content: buffer,\n base64,\n };\n}\n\n/**\n * Load a file from base64 string\n */\nexport function loadFileFromBase64(\n base64: string,\n fileName: string,\n mimeType?: string\n): FileInfo {\n // Remove data URL prefix if present\n const base64Data = base64.includes(',') ? base64.split(',')[1] : base64;\n const buffer = Buffer.from(base64Data, 'base64');\n\n const ext = path.extname(fileName).toLowerCase();\n const detectedMimeType = mimeType || MIME_TYPES[ext];\n const fileType = FILE_TYPE_CATEGORIES[ext];\n\n if (!detectedMimeType || !fileType) {\n throw new Error(\n `Unsupported file type: ${ext}. Supported types: ${Object.keys(MIME_TYPES).join(', ')}`\n );\n }\n\n return {\n path: '',\n name: fileName,\n type: fileType,\n mimeType: detectedMimeType,\n size: buffer.length,\n content: buffer,\n base64: base64Data,\n };\n}\n\n/**\n * Save content to a file\n */\nexport async function saveToFile(filePath: string, content: string | Buffer): Promise<void> {\n const absolutePath = path.resolve(filePath);\n const dir = path.dirname(absolutePath);\n\n // Ensure directory exists\n await fs.mkdir(dir, { recursive: true });\n\n // Write file\n await fs.writeFile(absolutePath, content, typeof content === 'string' ? 'utf-8' : undefined);\n}\n\n/**\n * Get supported file extensions\n */\nexport function getSupportedExtensions(): string[] {\n return Object.keys(MIME_TYPES);\n}\n\n/**\n * Check if a file extension is supported\n */\nexport function isExtensionSupported(ext: string): boolean {\n const normalizedExt = ext.startsWith('.') ? ext.toLowerCase() : `.${ext.toLowerCase()}`;\n return normalizedExt in MIME_TYPES;\n}\n\n/**\n * Check if a string is a URL\n */\nexport function isUrl(str: string): boolean {\n return str.startsWith('http://') || str.startsWith('https://');\n}\n\n/**\n * Load a file from a URL\n */\nexport async function loadFileFromUrl(url: string): Promise<FileInfo> {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch URL: ${response.status} ${response.statusText}`);\n }\n\n const contentType = response.headers.get('content-type')?.split(';')[0] || '';\n const buffer = Buffer.from(await response.arrayBuffer());\n\n // Try to get filename from URL or Content-Disposition header\n const contentDisposition = response.headers.get('content-disposition');\n let fileName = '';\n\n if (contentDisposition) {\n const match = contentDisposition.match(/filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/);\n if (match) {\n fileName = match[1].replace(/['\"]/g, '');\n }\n }\n\n if (!fileName) {\n // Extract filename from URL path\n const urlPath = new URL(url).pathname;\n fileName = path.basename(urlPath) || 'download';\n }\n\n // Determine file type from content-type header or extension\n let fileType = MIME_TO_FILE_TYPE[contentType];\n let mimeType = contentType;\n\n if (!fileType) {\n // Try to determine from file extension\n const ext = path.extname(fileName).toLowerCase();\n mimeType = MIME_TYPES[ext];\n fileType = FILE_TYPE_CATEGORIES[ext];\n }\n\n if (!fileType || !mimeType) {\n throw new Error(\n `Unsupported file type from URL. Content-Type: ${contentType}, Filename: ${fileName}`\n );\n }\n\n const base64 = fileType !== 'text' ? buffer.toString('base64') : undefined;\n\n return {\n path: url,\n name: fileName,\n type: fileType,\n mimeType,\n size: buffer.length,\n content: buffer,\n base64,\n };\n}\n","import type {\n AIProvider,\n OcrConfig,\n ExtractionOptions,\n ExtractionResult,\n FileInfo,\n IAIProvider,\n JsonExtractionResult,\n TextExtractionResult,\n} from './types';\nimport {\n ClaudeProvider,\n GeminiProvider,\n GrokProvider,\n OpenAIProvider,\n VertexProvider,\n} from './providers';\nimport {\n loadFile,\n loadFileFromBase64,\n loadFileFromBuffer,\n loadFileFromUrl,\n isUrl,\n saveToFile,\n} from './loaders';\n\n/**\n * Main class for document extraction using AI\n */\nexport class OcrAI {\n private provider: IAIProvider;\n private config: OcrConfig;\n\n constructor(config: OcrConfig) {\n this.config = config;\n this.provider = this.createProvider(config);\n }\n\n /**\n * Create a provider instance based on configuration\n */\n private createProvider(config: OcrConfig): IAIProvider {\n switch (config.provider) {\n case 'gemini':\n if (!config.apiKey) throw new Error('API key is required for Gemini provider');\n return new GeminiProvider(config.apiKey, config.model);\n case 'openai':\n if (!config.apiKey) throw new Error('API key is required for OpenAI provider');\n return new OpenAIProvider(config.apiKey, config.model);\n case 'claude':\n if (!config.apiKey) throw new Error('API key is required for Claude provider');\n return new ClaudeProvider(config.apiKey, config.model);\n case 'grok':\n if (!config.apiKey) throw new Error('API key is required for Grok provider');\n return new GrokProvider(config.apiKey, config.model);\n case 'vertex':\n if (!config.vertexConfig) throw new Error('vertexConfig is required for Vertex AI provider');\n return new VertexProvider(config.vertexConfig, config.model);\n default:\n throw new Error(`Unsupported provider: ${config.provider}`);\n }\n }\n\n /**\n * Extract content from a file path or URL\n */\n async extract(\n source: string,\n options?: ExtractionOptions\n ): Promise<ExtractionResult> {\n const startTime = Date.now();\n\n try {\n const file = isUrl(source)\n ? await loadFileFromUrl(source)\n : await loadFile(source);\n return this.processExtraction(file, options, startTime);\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Extract content from a Buffer\n */\n async extractFromBuffer(\n buffer: Buffer,\n fileName: string,\n options?: ExtractionOptions\n ): Promise<ExtractionResult> {\n const startTime = Date.now();\n\n try {\n const file = loadFileFromBuffer(buffer, fileName);\n return this.processExtraction(file, options, startTime);\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Extract content from a base64 string\n */\n async extractFromBase64(\n base64: string,\n fileName: string,\n options?: ExtractionOptions\n ): Promise<ExtractionResult> {\n const startTime = Date.now();\n\n try {\n const file = loadFileFromBase64(base64, fileName);\n return this.processExtraction(file, options, startTime);\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Process the extraction based on format\n */\n private async processExtraction(\n file: FileInfo,\n options: ExtractionOptions | undefined,\n startTime: number\n ): Promise<ExtractionResult> {\n const format = options?.format || 'text';\n\n // Check if provider supports the file type\n if (!this.provider.supportsFileType(file.type)) {\n return {\n success: false,\n error: `Provider ${this.provider.name} does not support file type: ${file.type}`,\n code: 'UNSUPPORTED_FILE_TYPE',\n };\n }\n\n try {\n if (format === 'json') {\n if (!options?.schema) {\n return {\n success: false,\n error: 'Schema is required for JSON extraction',\n code: 'MISSING_SCHEMA',\n };\n }\n\n const providerResult = await this.provider.extractJson(file, options.schema, options);\n const result: JsonExtractionResult = {\n success: true,\n format: 'json',\n data: providerResult.content,\n metadata: {\n provider: this.provider.name,\n model: this.provider.model,\n fileType: file.type,\n fileName: file.name,\n processingTimeMs: Date.now() - startTime,\n tokens: providerResult.tokens,\n },\n };\n\n // Save to file if outputPath is specified\n if (options.outputPath) {\n await saveToFile(options.outputPath, JSON.stringify(providerResult.content, null, 2));\n }\n\n return result;\n } else {\n const providerResult = await this.provider.extractText(file, options);\n const result: TextExtractionResult = {\n success: true,\n format: 'text',\n content: providerResult.content,\n metadata: {\n provider: this.provider.name,\n model: this.provider.model,\n fileType: file.type,\n fileName: file.name,\n processingTimeMs: Date.now() - startTime,\n tokens: providerResult.tokens,\n },\n };\n\n // Save to file if outputPath is specified\n if (options?.outputPath) {\n await saveToFile(options.outputPath, providerResult.content);\n }\n\n return result;\n }\n } catch (error) {\n return this.createErrorResult(error);\n }\n }\n\n /**\n * Create an error result\n */\n private createErrorResult(error: unknown): ExtractionResult {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n error: message,\n code: 'EXTRACTION_ERROR',\n };\n }\n\n /**\n * Get current provider name\n */\n getProvider(): AIProvider {\n return this.provider.name;\n }\n\n /**\n * Get current model\n */\n getModel(): string {\n return this.provider.model;\n }\n\n /**\n * Change the AI provider\n */\n setProvider(provider: AIProvider, apiKey: string, model?: string): void {\n this.config = { provider, apiKey, model };\n this.provider = this.createProvider(this.config);\n }\n}\n\n/**\n * Factory function to create OcrAI instance\n */\nexport function createOcrAI(config: OcrConfig): OcrAI {\n return new OcrAI(config);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ocr-ai",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Multi-provider AI document extraction library - Extract text or structured JSON from documents using Gemini, OpenAI, Grok, or Claude",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -39,16 +39,16 @@
|
|
|
39
39
|
"text-extraction",
|
|
40
40
|
"json-extraction"
|
|
41
41
|
],
|
|
42
|
-
"author": "",
|
|
42
|
+
"author": "remdph",
|
|
43
43
|
"license": "MIT",
|
|
44
44
|
"repository": {
|
|
45
45
|
"type": "git",
|
|
46
|
-
"url": "git+https://github.com/remdph/
|
|
46
|
+
"url": "git+https://github.com/remdph/ocr-ai.git"
|
|
47
47
|
},
|
|
48
48
|
"bugs": {
|
|
49
|
-
"url": "https://github.com/remdph/
|
|
49
|
+
"url": "https://github.com/remdph/ocr-ai/issues"
|
|
50
50
|
},
|
|
51
|
-
"homepage": "https://github.com/remdph/
|
|
51
|
+
"homepage": "https://github.com/remdph/ocr-ai#readme",
|
|
52
52
|
"engines": {
|
|
53
53
|
"node": ">=18.0.0"
|
|
54
54
|
},
|