Spaces:
Sleeping
Sleeping
File size: 6,944 Bytes
abed4cc 5d38af1 e6227e8 af867cd 5669f71 abed4cc 2927323 5d38af1 587da90 5491496 587da90 4bbe8d3 34f6a21 4bbe8d3 79a2685 34f6a21 4bbe8d3 dd171b1 60d7c6b 4bbe8d3 205949e b3f06bc e542f78 dd171b1 6c8079a d87b712 cb7383c 0c9e027 5d38af1 0c9e027 7d1620b 2927323 587da90 5d38af1 79a2685 662dd32 fa87bc3 662dd32 79a2685 5d38af1 587da90 2927323 eedf466 2927323 205949e 2927323 205949e 2927323 b39ccb4 0c9e027 b39ccb4 2927323 eedf466 2927323 fa87bc3 2927323 5d38af1 8f6b7be 587da90 7d1620b 5d38af1 587da90 2b60bab 79a2685 2b60bab 587da90 5d38af1 79a2685 587da90 60d7c6b b3f06bc 60d7c6b 8f6b7be 60d7c6b 0a7b874 fa87bc3 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 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
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.file.path; // Путь к загруженному изображению
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": "text",
"text": prompt,
},
{
"type": "image_url",
"image_url": {
"url": `http://${req.headers.host}/uploads/${img}`,
},
},
],
}
],
};
} 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: '+ошибка+❌ Произошла ошибка сервера при генерации.-ошибка-' });
}
});
app.post('/translate', async (req, res) => {
const prompt = req.body.prompt;
const lang = req.body.lang;
const apiKey = req.body.api || openai_key;
let payload;
if (!prompt) {
return res.json({ content: '+ошибка+❌ Ошибка данных, повторите попытку.-ошибка-' });
}
payload = {
"model": "gpt-3.5-turbo-16k",
"messages": [
{
"role": "system",
"content": starttransl,
},
{
"role": "user",
"content": `На ${lang}: ${prompt}`,
}
],
"max_tokens": 9000,
};
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}`);
}); |