import OpenAI from 'openai'; import { logger } from '@/lib/logger'; const openai = new OpenAI(); // uses OPENAI_API_KEY from env interface ScanResult { establishment: string | null; date: string | null; amount: number | null; currency: string | null; lineItems: Array<{ description: string; amount: number }>; confidence: number; } export async function scanReceipt( imageBuffer: Buffer, mimeType: string, ): Promise { try { const base64 = imageBuffer.toString('base64'); const response = await openai.chat.completions.create({ model: 'gpt-4o', messages: [ { role: 'user', content: [ { type: 'text', text: 'Extract receipt data as JSON: { establishment, date (ISO), amount (number), currency (3-letter code), lineItems: [{ description, amount }], confidence (0-1) }. Return ONLY valid JSON.', }, { type: 'image_url', image_url: { url: `data:${mimeType};base64,${base64}` }, }, ], }, ], max_tokens: 1000, }); const content = response.choices[0]?.message?.content ?? '{}'; const cleaned = content.replace(/```json\n?|\n?```/g, '').trim(); return JSON.parse(cleaned) as ScanResult; } catch (err) { logger.error({ err }, 'Receipt scan failed'); return { establishment: null, date: null, amount: null, currency: null, lineItems: [], confidence: 0, }; } }