File size: 2,170 Bytes
20d33c7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import express from "express";

const app = express();
app.use(express.json());
app.use(express.static("public"));

const ENV_API_KEY = process.env.OPENAI_API_KEY ?? null;

const SUPPORTED_LANGUAGES = {
  en: "English", pl: "Polish",  de: "German",  fr: "French",
  es: "Spanish", it: "Italian", ja: "Japanese", zh: "Chinese",
  uk: "Ukrainian", ru: "Russian",
};

app.post("/session", async (req, res) => {
  const targetLanguage = req.body.targetLanguage ?? "en";
  const inputLanguage  = req.body.inputLanguage  ?? null;

  // Klucz z env Secrets ma priorytet; fallback na klucz wpisany przez użytkownika w UI
  const apiKey = ENV_API_KEY ?? req.body.apiKey ?? null;

  if (!apiKey || !apiKey.startsWith("sk-")) {
    return res.status(401).json({ error: "Brak lub nieprawidłowy klucz API OpenAI." });
  }

  if (!SUPPORTED_LANGUAGES[targetLanguage]) {
    return res.status(400).json({ error: `Nieobsługiwany język: ${targetLanguage}` });
  }

  try {
    const session = {
      model: "gpt-realtime-translate",
      audio: { output: { language: targetLanguage } },
    };

    if (inputLanguage && SUPPORTED_LANGUAGES[inputLanguage]) {
      session.audio.input = { language: inputLanguage };
    }

    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 }),
      }
    );

    if (!response.ok) {
      const err = await response.text();
      console.error("OpenAI error:", err);
      return res.status(response.status).json({ error: "Błąd OpenAI API", details: err });
    }

    res.json(await response.json());
  } catch (err) {
    console.error("Fetch error:", err);
    res.status(500).json({ error: "Błąd serwera", details: err.message });
  }
});

const PORT = process.env.PORT ?? 7860;
app.listen(PORT, "0.0.0.0", () => {
  console.log(`Serwer działa na porcie ${PORT}`);
  if (!ENV_API_KEY) {
    console.log("INFO: OPENAI_API_KEY nie ustawiony — użytkownicy podają klucz przez UI.");
  }
});