// netlify/functions/openai-token.js // Crée une clé temporaire (client_secret) pour la traduction temps réel OpenAI. // La vraie clé secrète reste côté serveur, via la variable Netlify : OPENAI_API_KEY // Le navigateur (translator.html) reçoit seulement une clé éphémère valable ~1 min. exports.handler = async function (event) { const headers = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Allow-Methods': 'POST, OPTIONS', 'Content-Type': 'application/json', }; // Requête preflight CORS if (event.httpMethod === 'OPTIONS') { return { statusCode: 200, headers, body: '' }; } if (event.httpMethod !== 'POST') { return { statusCode: 405, headers, body: JSON.stringify({ error: 'method_not_allowed', detail: 'Utilisez POST.' }), }; } try { // Langue cible envoyée par translator.html : { "targetLanguage": "fr" } let targetLanguage = 'en'; try { const body = JSON.parse(event.body || '{}'); if (body.targetLanguage) targetLanguage = body.targetLanguage; } catch (e) { // corps illisible : on garde la valeur par défaut } const apiKey = process.env.OPENAI_API_KEY; if (!apiKey) { return { statusCode: 500, headers, body: JSON.stringify({ error: 'server_misconfigured', detail: 'La variable OPENAI_API_KEY est absente sur Netlify.', }), }; } // Appel à l'endpoint dédié à la traduction temps réel d'OpenAI const response = await fetch( 'https://api.openai.com/v1/realtime/translations/client_secrets', { method: 'POST', headers: { 'Authorization': 'Bearer ' + apiKey, 'Content-Type': 'application/json', }, body: JSON.stringify({ session: { model: 'gpt-realtime-translate', audio: { output: { language: targetLanguage, }, }, }, }), } ); const data = await response.json(); // On renvoie tel quel la réponse d'OpenAI (qui contient client_secret). return { statusCode: response.status, headers, body: JSON.stringify(data), }; } catch (err) { return { statusCode: 500, headers, body: JSON.stringify({ error: 'openai_token_failed', detail: String(err.message || err) }), }; } };