import { createFlow, parse, extract, split, combine, categorize } from '@docloai/flows';
import { createVLMProvider, createOCRProvider } from '@docloai/providers-llm';
export function buildInvoiceFlow(config: {
vlmApiKey: string;
ocrEndpoint: string;
ocrApiKey: string;
}) {
const vlmProvider = createVLMProvider({
provider: 'google',
model: 'google/gemini-flash-2.5',
apiKey: config.vlmApiKey,
via: 'openrouter'
});
const ocrProvider = createOCRProvider({
provider: 'surya',
endpoint: config.ocrEndpoint,
apiKey: config.ocrApiKey
});
const invoiceSchema = {
type: 'object',
properties: {
invoiceNumber: { type: 'string' },
date: { type: 'string' },
vendor: { type: 'string' },
total: { type: 'number' },
lineItems: {
type: 'array',
items: {
type: 'object',
properties: {
description: { type: 'string' },
quantity: { type: 'number' },
unitPrice: { type: 'number' },
amount: { type: 'number' }
}
}
}
}
};
return createFlow()
.acceptFormats(['application/pdf', 'image/jpeg', 'image/png'])
.step('parse', parse({ provider: ocrProvider }))
.step('extract', extract({
provider: vlmProvider,
schema: invoiceSchema,
consensus: { runs: 3, strategy: 'majority' }
}))
.build();
}
// Usage
const invoiceFlow = buildInvoiceFlow({
vlmApiKey: process.env.OPENROUTER_API_KEY!,
ocrEndpoint: process.env.SURYA_ENDPOINT!,
ocrApiKey: process.env.SURYA_API_KEY!
});
const result = await invoiceFlow.run({ base64: invoicePdf });