File size: 4,108 Bytes
abed4cc
5d38af1
e6227e8
5669f71
abed4cc
5d38af1
 
587da90
 
4bbe8d3
 
 
 
 
ea5d932
4bbe8d3
 
 
 
 
 
 
12ec664
 
6749812
a3fc701
10fbdf7
a3fc701
d59fd13
 
a3fc701
d59fd13
a3fc701
d59fd13
a3fc701
d59fd13
a3fc701
d59fd13
 
a3fc701
 
 
d59fd13
a3fc701
587da90
4bbe8d3
5d38af1
587da90
5d38af1
10fbdf7
5d38af1
587da90
5d38af1
7135754
2b60bab
7135754
46a7e8f
587da90
 
 
5d38af1
 
587da90
2b60bab
 
 
 
 
 
ea5d932
2b60bab
587da90
5d38af1
ea5d932
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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 limiter = rateLimit({
  windowMs: 30 * 1000, // 30 секунд
  max: 1, // лимит каждые 30 секунд на IP
  handler: function (req, res) {
    return res.status(429).json({
      content: '+ошибка+Генерировать рецепт можно 1 раз в 30 секунд!-ошибка-'
    });
  },
});

// Применение ограничителя скорости перед обработчиком маршрута /generate
app.use('/generate', limiter);

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

! Не в коем случае не пиши опасные (например рыба фугу), требующие лицнзии и т.д. рецепты! Только нормальные, правильные и хорошие!!

Ответ должен выглядить ТОЛЬКО так (чтобы потом regexp доставал из него текст):
"
+название+(Название рецепта, блюда)-название-
+время+(Примерное время готовки (только время, например: "40 минут", "2 часа" и т.д.))-время-

+кат+(Категория: На каждый день, Основные блюда, Супы, Десерты и выпечка, Салаты, Несладкая выпечка, Завтраки, Закуски, Напитки, Ресторанные)-кат-

+ингр+(Ингридиенты: В именительном падеже - то есть например: "Яйцо -
2 штуки", а не "2 яйца"; Здесь обязательно заменяй ВСЕ новые строки ("
") на "_÷_")-ингр-

+рец+(Рецепт; Здесь обязательно заменяй ВСЕ новые строки ("
") на "_÷_")-рец-"

Если ты не можешь сгенерировать такой рецепт, то напиши так:
"
+ошибка+(Причина)-ошибка-
"`;

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

  if (!prompt) {
    return res.status(400).json({ error: '❌ Ошибка данных, повторите попытку.' });
  }

  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-16k",
    }, {
      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({ content: '❌ Не удалось прочитать рецепт.' });
    }
  } catch (error) {
    console.error(error);
    res.status(500).json({ content: '❌ Произошла ошибка сервера при генерации.' });
  }
});

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