File size: 2,543 Bytes
abed4cc
5d38af1
e6227e8
5669f71
abed4cc
5d38af1
 
587da90
 
2b60bab
bad8307
 
5d38af1
e6227e8
2b60bab
e6227e8
 
 
 
587da90
 
bad8307
5d38af1
587da90
5d38af1
 
 
587da90
5d38af1
7135754
2b60bab
7135754
2b60bab
587da90
 
 
5d38af1
 
587da90
2b60bab
 
 
 
 
 
 
 
587da90
5d38af1
6814fd7
587da90
 
 
abed4cc
 
5d38af1
abed4cc
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
const express = require('express');
const rateLimit = require('express-rate-limit');
const axios = require('axios');

const app = express();
app.use(express.json());

const openai_key = process.env.OPENAI_KEY;

const start = `Ты генератор рецептов. В этом чате, тебе будут присылать названия блюд или описывать их или присылать название категории, а ты должен будешь написать идеальный, понятный, подробный, лёгкий или сложный рецепт со всеми пропорциями, количествами и этапами готовки (этапы готовки должны быть разделены, например 1.1., 1.2., 2.1., 2.2. (Обязательно со звёздочками, это жирный шрифт) С эмодзи.`;

const generateLimiter = rateLimit({
  windowMs: 30 * 1000, // 30 секунд
  max: 1, // лимит: 1 запрос на IP
  handler: function (req, res) {
    return res.status(429).json({
      error: "Слишком много запросов с этого IP, пожалуйста, попробуйте позже. (Лимит 1 генерация в 30 секунд)"
    });
  }
});

app.post('/generate', generateLimiter, async (req, res) => {
  const prompt = req.body.prompt;

  if (!prompt) {
    return res.status(400).json({ error: 'Требуется параметр "prompt".' });
  }

  try {
    const response = await axios.post('https://api.openai.com/v1/chat/completions', {
      messages: [{'role': 'system', 'content': start}, {'role': 'user', 'content': prompt}],
      max_tokens: 2000,
      model: "gpt-3.5-turbo",
    }, {
      headers: {
        'Authorization': `Bearer ${openai_key}`,
        'Content-Type': 'application/json',
      },
    });

    if (response.data.choices && response.data.choices.length > 0 && response.data.choices[0].message) {
      const content = response.data.choices[0].message.content.trim();
      console.log(content);
      res.json({ content });
    } else {
      res.status(500).json({ error: 'OpenAI не вернул ожидаемых данных.' });
    }
  } catch (error) {
    console.error(error);
    res.status(500).json({ error: 'Произошла ошибка сервера при генерации.' });
  }
});

const port = 7860;
app.listen(port, () => {
  console.log(`API сервер запущен на порту ${port}`);
});