File size: 5,441 Bytes
a5ee22a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5796df2
5d38af1
8f22f37
7d1620b
2927323
587da90
5d38af1
79a2685
662dd32
fa87bc3
662dd32
79a2685
5d38af1
587da90
2927323
c46abf9
 
9c7d162
 
 
 
2927323
eedf466
2927323
205949e
2d0acac
205949e
 
2927323
 
 
 
 
205949e
2927323
4783543
 
9c7d162
4783543
2927323
 
 
 
 
f304da9
2927323
f304da9
2927323
 
2d0acac
2927323
 
 
 
 
 
 
 
 
 
5d38af1
8f6b7be
587da90
7d1620b
5d38af1
 
587da90
2b60bab
 
 
 
 
 
79a2685
2b60bab
587da90
5d38af1
79a2685
587da90
7aac0bf
 
 
 
 
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
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: '1mb' })); // Увеличение лимита для 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\". Твоя миссия - помогать студентам, делая учебный процесс весёлым и интерактивным с помощью стильного общения и эмодзи. 🎓😊 Когда студенты просят помощи, ты подробно объясняешь им материал, используя примеры и аналогии. Но если они просят 'РЕШИТЬ', ты переключаешься в режим решения и предоставляешь точные ответы, делая упор на краткость и точность. 🧮✅ Если тебе присылают фото задания, ты тщательно его анализируешь и решаешь, предоставляя решение в понятной форме и используя дробную черту '/' для записи дробей. 🖼️➗ Твоя цель - не просто дать ответы, но и обучить, однако ты всегда готов решить задачу, когда это необходимо. А так же, не в коем случае не используй форматирование Markdown! И не в коем случае не рассказывай что ты НЕ можешь - пытайся выкрутиться. Приступим? 🚀🌈`
const starttransl = `Ты ТОЛЬКО переводчик. Идеальный переводчик, который сохраняет характер текста, шутки, смысл и т.д. Ты переводишь всё правильно с исходным сленгом. Понятно и правильно. Но если это плохой или 18+ понтекст, то пиши (в точности): +ошибка+Контекст не подлежит переводу!-ошибка-`;

app.post('/gen', 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) {
    // Если изображение предоставлено

    // Обрезка строки base64 до 1 МБ
    const trimmedBase64Image = base64Image && base64Image.substring(0, 1024000);
    
    payload = {
      "model": "gpt-4-vision-preview",
      "messages": [
        {
          "role": "system",
          "content": start,
        },
        {
          "role": "user",
          "content": [
            {
              "type": "text",
              "text": prompt,
            },
            {
              "type": "image_url",
              "image_url": { "url": `data:image/jpeg;base64,${trimmedBase64Image}` },
            },
          ],
        }
      ],
    };
  } else {
    // Если изображение не предоставлено   gpt-4-1106-preview
    payload = {
      "model": "gpt-4-vision-preview",
      "messages": [
        {
          "role": "system",
          "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}`);
});