feat: optimize scan OCR with sharp preprocessing and 1024px resizing

This commit is contained in:
2025-12-24 00:02:58 +01:00
parent 11275dd875
commit a1a91795d1

View File

@@ -6,6 +6,7 @@ import { createClient } from '@/lib/supabase/server';
import { createHash } from 'crypto'; import { createHash } from 'crypto';
import { trackApiUsage } from '@/services/track-api-usage'; import { trackApiUsage } from '@/services/track-api-usage';
import { checkCreditBalance, deductCredits } from '@/services/credit-service'; import { checkCreditBalance, deductCredits } from '@/services/credit-service';
import sharp from 'sharp';
// Native Schema Definition for Gemini API // Native Schema Definition for Gemini API
const metadataSchema = { const metadataSchema = {
@@ -100,14 +101,23 @@ export async function scanLabel(input: any): Promise<AnalysisResponse> {
}; };
} }
// Step 3: Base64 Encoding // Step 3: AI-Specific Image Optimization (Grayscale, Normalize, Resize)
const startOptimization = performance.now();
const optimizedBuffer = await sharp(buffer)
.resize(1024, 1024, { fit: 'inside', withoutEnlargement: true })
.grayscale()
.normalize()
.toBuffer();
const endOptimization = performance.now();
// Step 4: Base64 Encoding
const startEncoding = performance.now(); const startEncoding = performance.now();
const base64Data = buffer.toString('base64'); const base64Data = optimizedBuffer.toString('base64');
const mimeType = file.type || 'image/webp'; const mimeType = 'image/webp';
const uploadSize = buffer.length; const uploadSize = optimizedBuffer.length;
const endEncoding = performance.now(); const endEncoding = performance.now();
// Step 4: Model Initialization & Step 5: API Call // Step 5: Model Initialization & Step 6: API Call
const startAiTotal = performance.now(); const startAiTotal = performance.now();
let jsonData; let jsonData;
let validatedData; let validatedData;
@@ -164,6 +174,7 @@ export async function scanLabel(input: any): Promise<AnalysisResponse> {
data: validatedData, data: validatedData,
perf: { perf: {
imagePrep: endImagePrep - startImagePrep, imagePrep: endImagePrep - startImagePrep,
optimization: endOptimization - startOptimization,
cacheCheck: endCacheCheck - startCacheCheck, cacheCheck: endCacheCheck - startCacheCheck,
encoding: endEncoding - startEncoding, encoding: endEncoding - startEncoding,
modelInit: endModelInit - startModelInit, modelInit: endModelInit - startModelInit,