Hier ist der Code, um Pixtral Large (das europäische Flaggschiff-Modell von Mistral) direkt in deine Next.js App zu integrieren. Damit kannst du einen direkten "A/B-Test" gegen Gemini 3 Flash fahren. 1. Vorbereitung Du brauchst das Mistral SDK und einen API Key von console.mistral.ai. Bash npm install @mistralai/mistralai Füge deinen Key in die .env ein (nicht NEXT_PUBLIC_!): MISTRAL_API_KEY=dein_key_hier 2. Der Code (Server Action) Erstelle eine neue Datei, z.B. app/actions/scan-mistral.ts. TypeScript 'use server' import { Mistral } from '@mistralai/mistralai'; const client = new Mistral({ apiKey: process.env.MISTRAL_API_KEY }); export async function scanWithPixtral(base64Image: string, mimeType: string) { // Pixtral braucht das Bild als Data-URL const dataUrl = `data:${mimeType};base64,${base64Image}`; try { const chatResponse = await client.chat.complete({ model: 'pixtral-large-latest', // Das beste Modell (Stand Dez 2025) messages: [ { role: 'user', content: [ { type: 'text', text: `Du bist ein Whisky-Experte und OCR-Spezialist. Analysiere dieses Etikett präzise. Antworte AUSSCHLIESSLICH mit gültigem JSON (kein Markdown, kein Text davor/danach): { "distillery": "Name der Brennerei (z.B. Lagavulin)", "name": "Exakter Name/Edition (z.B. 16 Year Old)", "vintage": "Jahrgang oder null", "age": "Alter oder null (z.B. 16)", "abv": "Alkoholgehalt (z.B. 43%)", "search_query": "site:whiskybase.com [Brennerei] [Name] [Alter]" }` }, { type: 'image_url', imageUrl: dataUrl } ] } ], responseFormat: { type: 'json_object' }, // Erzwingt JSON (wichtig!) temperature: 0.1 // Niedrig = präziser, weniger Halluzinationen }); const rawContent = chatResponse.choices?.[0].message.content; if (!rawContent) throw new Error("Keine Antwort von Pixtral"); // JSON parsen return JSON.parse(rawContent as string); } catch (error) { console.error("Pixtral Error:", error); return null; // Fallback auslösen } } 3. Der "A/B-Switcher" (So nutzt du beides) In deiner Haupt-Logik (app/actions/scan.ts) kannst du jetzt einfach umschalten oder Pixtral als Fallback nutzen, wenn Gemini zickt (oder andersrum). TypeScript 'use server' import { scanWithGemini } from './scan-gemini'; // Deine bestehende Funktion import { scanWithPixtral } from './scan-mistral'; export async function scanBottle(formData: FormData) { // ... Bild zu Base64 konvertieren ... const base64 = "..."; const mime = "image/jpeg"; // STRATEGIE A: Der "Qualitäts-Check" // Wir nutzen standardmäßig Gemini, aber Pixtral als EU-Option let result; const useEuModel = process.env.USE_EU_MODEL === 'true'; // Schalter in .env if (useEuModel) { console.log("🇪🇺 Nutze Pixtral (Mistral AI)..."); result = await scanWithPixtral(base64, mime); } else { console.log("🇺🇸 Nutze Gemini 3 Flash..."); result = await scanWithGemini(base64, mime); } // Wenn das erste Modell versagt (null zurückgibt), versuche das andere if (!result) { console.log("⚠️ Erster Versuch fehlgeschlagen, starte Fallback..."); result = useEuModel ? await scanWithGemini(base64, mime) : await scanWithPixtral(base64, mime); } // ... weiter mit Supabase Caching & Brave Search ... return result; } Pixtral vs. Gemini 3 Flash (Dein Check) Achte beim Testen auf diese Feinheiten: Helle Schrift auf dunklem Grund: Hier ist Gemini oft aggressiver und liest besser. Pixtral ist manchmal vorsichtiger. Schreibschrift (Signatory Vintage Abfüllungen): Pixtral Large ist hier erstaunlich gut, fast besser als Gemini, da es Handschrift extrem gut kann. JSON-Struktur: Dank responseFormat: { type: 'json_object' } sollten beide Modelle sehr sauberen Code liefern. Wenn Pixtral Large für dich ähnlich gut funktioniert wie Gemini 3 Flash, hast du den großen Vorteil: Daten bleiben in Europa (Server in Frankreich/EU). Das ist ein starkes Marketing-Argument ("We love Whisky & Privacy").