File size: 5,558 Bytes
abed4cc
5d38af1
e6227e8
c46abf9
5669f71
abed4cc
2927323
5d38af1
587da90
5491496
587da90
4bbe8d3
34f6a21
 
4bbe8d3
79a2685
34f6a21
4bbe8d3
 
 
 
dd171b1
60d7c6b
4bbe8d3
205949e
b3f06bc
e542f78
dd171b1
6c8079a
d87b712
cb7383c
c46abf9
 
 
 
 
 
 
 
 
 
5d38af1
8f22f37
7d1620b
2927323
587da90
5d38af1
79a2685
662dd32
fa87bc3
662dd32
79a2685
5d38af1
587da90
2927323
c46abf9
 
2927323
eedf466
2927323
205949e
 
 
 
 
 
 
 
2927323
 
 
a1e7d71
3b77fbc
ac0af4b
a1e7d71
2927323
 
205949e
2927323
 
 
 
 
 
 
 
eedf466
2927323
 
fa87bc3
2927323
 
 
 
 
 
 
 
 
 
5d38af1
8f6b7be
587da90
7d1620b
5d38af1
 
587da90
2b60bab
 
 
 
 
 
79a2685
2b60bab
587da90
5d38af1
79a2685
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
const express = require('express');
const rateLimit = require('express-rate-limit');
const axios = require('axios');
const multer = require('multer'); // импорт multer

const app = express();
app.use(express.json({ limit: '10mb' })); // Увеличение лимита для base64 изображений

const openai_key = process.env.OPENAI_KEY;
const base_url = process.env.BASE_URL;

const limiter = rateLimit({
  windowMs: 40 * 1000, // 40 секунд
  max: 1, // лимит каждые 40 секунд на IP
  handler: function (req, res) {
    return res.json({
      content: '+ошибка+Генерировать можно только 1 раз в 40 секунд! YUFI-ошибка-'
    });
  },
});

app.use('/gen', limiter);
app.use('/translate', limiter);

const start = `Приветствую тебя! 🌟 Ты - \"Помогатор 1.5\". Твоя миссия - помогать студентам, делая учебный процесс весёлым и интерактивным с помощью стильного общения и эмодзи. 🎓😊 Когда студенты просят помощи, ты подробно объясняешь им материал, используя примеры и аналогии. Но если они просят 'РЕШИТЬ', ты переключаешься в режим решения и предоставляешь точные ответы, делая упор на краткость и точность. 🧮✅ Если тебе присылают фото задания, ты тщательно его анализируешь и решаешь, предоставляя решение в понятной форме и используя дробную черту '/' для записи дробей. 🖼️➗ Твоя цель - не просто дать ответы, но и обучить, однако ты всегда готов решить задачу, когда это необходимо. Приступим? 🚀🌈`
const starttransl = `Ты ТОЛЬКО переводчик. Идеальный переводчик, который сохраняет характер текста, шутки, смысл и т.д. Ты переводишь всё правильно с исходным сленгом. Понятно и правильно. Но если это плохой или 18+ понтекст, то пиши (в точности): +ошибка+Контекст не подлежит переводу!-ошибка-`;

app.post('/gener', async (req, res) => {
  return res.json({ content: '+ошибка+❗ Проект закрыт и больше не функционирует из-за отсутствия финансирования!-ошибка-' });
});

const storage = multer.diskStorage({
  destination: './uploads',
  filename: (req, file, cb) => {
    cb(null, Date.now() + '-' + file.originalname);
  },
});

const upload = multer({ storage });

app.post('/gen', upload.single('image'), async (req, res) => {
  const prompt = req.body.prompt;
  const img = req.body.img; // Проверка на существование файла перед доступом к его пути
  const apiKey = req.body.api || openai_key;
  let payload;

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

  if (prompt.replace(/[\s\n]/g, '').length > 250) {
    return res.json({ content: '+ошибка+❌ Максимум символов: 250-ошибка-' });
  }

  // Создание тела запроса в зависимости от наличия изображения
  if (img) {
    // Если изображение предоставлено
    payload = {
      "model": "gpt-4-vision-preview",
      "messages": [
        {
          "role": "user",
          "content": start,
        },
        {
          "role": "assistant",
          "content": "Хорошо 😊",
        },
        {
          "role": "user",
          "content": [
            {
              "type": "image_url",
              "image_url": { "url": `${img}` },
            },
            {
              "type": "text",
              "text": prompt,
            },
          ],
        }
      ],
    };
  } else {
    // Если изображение не предоставлено
    payload = {
      "model": "gpt-4-1106-preview",
      "messages": [
        {
          "role": "user",
          "content": start,
        },
        {
          "role": "user",
          "content": prompt,
        }
      ],
    };
  }

  try {
    const response = await axios.post(base_url, payload, {
      headers: {
        'Authorization': `Bearer ${apiKey}`,
        '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.json({ content: '+ошибка+❌ Не удалось прочитать ответ.-ошибка-' });
    }
  } catch (error) {
    console.error(error);
    res.json({ content: '+ошибка+❌ Произошла ошибка сервера при генерации.-ошибка-' });
  }
});

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