Spaces:
Sleeping
Sleeping
Update server.js
Browse files
server.js
CHANGED
|
@@ -3,60 +3,83 @@ const rateLimit = require('express-rate-limit');
|
|
| 3 |
const axios = require('axios');
|
| 4 |
|
| 5 |
const app = express();
|
| 6 |
-
app.use(express.json());
|
| 7 |
|
| 8 |
const openai_key = process.env.OPENAI_KEY;
|
| 9 |
|
| 10 |
const limiter = rateLimit({
|
| 11 |
-
windowMs: 45 * 1000, //
|
| 12 |
-
max: 1, // лимит каждые
|
| 13 |
handler: function (req, res) {
|
| 14 |
return res.status(429).json({
|
| 15 |
-
content: '+ошибка+Генерировать
|
| 16 |
});
|
| 17 |
},
|
| 18 |
});
|
| 19 |
|
| 20 |
-
// Применение ограничителя скорости перед обработчиком маршрута /generate
|
| 21 |
app.use('/gen', limiter);
|
| 22 |
|
| 23 |
-
const start =
|
| 24 |
-
|
| 25 |
-
! Не в коем случае не пиши опасные (например рыба фугу), требующие лицнзии и т.д. рецепты! Только нормальные, правильные и хорошие!
|
| 26 |
-
|
| 27 |
-
Ответ должен выглядить ТОЛЬКО так (чтобы потом regexp доставал из него текст):
|
| 28 |
-
|
| 29 |
-
"+название+Название рецепта, блюда-название-
|
| 30 |
-
+время+Примерное время готовки (только время, например: "40 минут", "2 часа" и т.д.)-время-
|
| 31 |
-
+кат+Категория: На каждый день, Основные блюда, Супы, Десерты и выпечка, Салаты, Несладкая выпечка, Завтраки, Закуски, Напитки, Ресторанные-кат-
|
| 32 |
-
+ингр+Ингридиенты: В именительном падеже - то есть например: "Яйцо -
|
| 33 |
-
2 штуки", а не "2 яйца"; Здесь обязательно заменяй ВСЕ новые строки ("
|
| 34 |
-
") на "_÷_"-ингр-
|
| 35 |
-
+рец+Рецепт; Здесь обязательно заменяй ВСЕ новые строки ("
|
| 36 |
-
") на "_÷_"-рец-"
|
| 37 |
-
Если ты не можешь сгенерировать такой рецепт, то напиши так:
|
| 38 |
-
"+ошибка+Причина-ошибка-"
|
| 39 |
-
|
| 40 |
-
+название+...-название- и другие, это почти как html теги (<div>...</div>)`;
|
| 41 |
-
|
| 42 |
-
app.post('/generate', async (req, res) => {
|
| 43 |
-
res.status(500).json({ content: '+ошибка+❗ Вы используете устаревшую версию АромаАрт. Установите версию 1.3.1 и более.-ошибка-' });
|
| 44 |
-
});
|
| 45 |
|
| 46 |
app.post('/gen', async (req, res) => {
|
| 47 |
const prompt = req.body.prompt;
|
|
|
|
| 48 |
const apiKey = req.body.api || openai_key;
|
|
|
|
| 49 |
|
| 50 |
if (!prompt) {
|
| 51 |
return res.status(400).json({ error: '❌ Ошибка данн��х, повторите попытку.' });
|
| 52 |
}
|
| 53 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
try {
|
| 55 |
-
const response = await axios.post('https://api.openai.com/v1/chat/completions', {
|
| 56 |
-
messages: [{'role': 'system', 'content': start}, {'role': 'user', 'content': prompt}],
|
| 57 |
-
max_tokens: 2000,
|
| 58 |
-
model: "gpt-3.5-turbo-1106",
|
| 59 |
-
}, {
|
| 60 |
headers: {
|
| 61 |
'Authorization': `Bearer ${apiKey}`,
|
| 62 |
'Content-Type': 'application/json',
|
|
@@ -68,7 +91,7 @@ app.post('/gen', async (req, res) => {
|
|
| 68 |
console.log(content);
|
| 69 |
res.json({ content });
|
| 70 |
} else {
|
| 71 |
-
res.status(500).json({ content: '❌ Не удалось прочитать
|
| 72 |
}
|
| 73 |
} catch (error) {
|
| 74 |
console.error(error);
|
|
|
|
| 3 |
const axios = require('axios');
|
| 4 |
|
| 5 |
const app = express();
|
| 6 |
+
app.use(express.json({ limit: '10mb' })); // Увеличение лимита для base64 изображений
|
| 7 |
|
| 8 |
const openai_key = process.env.OPENAI_KEY;
|
| 9 |
|
| 10 |
const limiter = rateLimit({
|
| 11 |
+
windowMs: 45 * 1000, // 45 секунд
|
| 12 |
+
max: 1, // лимит каждые 45 секунд на IP
|
| 13 |
handler: function (req, res) {
|
| 14 |
return res.status(429).json({
|
| 15 |
+
content: '+ошибка+Генерировать можно 1 раз в 45 секунд!-ошибка-'
|
| 16 |
});
|
| 17 |
},
|
| 18 |
});
|
| 19 |
|
|
|
|
| 20 |
app.use('/gen', limiter);
|
| 21 |
|
| 22 |
+
const start = "Приветствую тебя! 🌟 Ты - \"Помогатор 1.5\". Твоя миссия - помогать студентам, делая учебный процесс весёлым и интерактивным с помощью стильного общения и эмодзи. 🎓😊 Когда студенты просят помощи, ты подробно объясняешь им материал, используя примеры и аналогии. Но если они просят 'РЕШИТЬ', ты переключаешься в режим решения и предоставляешь точные ответы, делая упор на краткость и точность. 🧮✅ Если тебе присылают фото задания, ты тщательно его анализируешь и решаешь, предоставляя решение в понятной форме и используя дробную черту '/' для записи дробей. 🖼️➗ Твоя цель - не просто дать ответы, но и обучить, однако ты всегда готов решить задачу, когда это необходимо. Приступим? 🚀🌈";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
app.post('/gen', async (req, res) => {
|
| 25 |
const prompt = req.body.prompt;
|
| 26 |
+
const img = req.body.img; // Base64 изображение
|
| 27 |
const apiKey = req.body.api || openai_key;
|
| 28 |
+
let payload;
|
| 29 |
|
| 30 |
if (!prompt) {
|
| 31 |
return res.status(400).json({ error: '❌ Ошибка данн��х, повторите попытку.' });
|
| 32 |
}
|
| 33 |
|
| 34 |
+
// Создание тела запроса в зависимости от наличия изображения
|
| 35 |
+
if (img) {
|
| 36 |
+
// Если изображение предоставлено
|
| 37 |
+
payload = {
|
| 38 |
+
"model": "gpt-4-vision-preview",
|
| 39 |
+
"messages": [
|
| 40 |
+
{
|
| 41 |
+
"role": "system",
|
| 42 |
+
"content": start,
|
| 43 |
+
},
|
| 44 |
+
{
|
| 45 |
+
"role": "user",
|
| 46 |
+
"content": [
|
| 47 |
+
{
|
| 48 |
+
"type": "text",
|
| 49 |
+
"text": prompt,
|
| 50 |
+
},
|
| 51 |
+
{
|
| 52 |
+
"type": "image_url",
|
| 53 |
+
"image_url": {
|
| 54 |
+
"url": `data:image/jpeg;base64,${img}`,
|
| 55 |
+
"detail": "high",
|
| 56 |
+
},
|
| 57 |
+
},
|
| 58 |
+
],
|
| 59 |
+
}
|
| 60 |
+
],
|
| 61 |
+
"max_tokens": 4095,
|
| 62 |
+
};
|
| 63 |
+
} else {
|
| 64 |
+
// Если изображение не предоставлено
|
| 65 |
+
payload = {
|
| 66 |
+
"model": "gpt-4-vision-preview",
|
| 67 |
+
"messages": [
|
| 68 |
+
{
|
| 69 |
+
"role": "system",
|
| 70 |
+
"content": start,
|
| 71 |
+
},
|
| 72 |
+
{
|
| 73 |
+
"role": "user",
|
| 74 |
+
"content": prompt,
|
| 75 |
+
}
|
| 76 |
+
],
|
| 77 |
+
"max_tokens": 4095,
|
| 78 |
+
};
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
try {
|
| 82 |
+
const response = await axios.post('https://api.openai.com/v1/chat/completions', payload, {
|
|
|
|
|
|
|
|
|
|
|
|
|
| 83 |
headers: {
|
| 84 |
'Authorization': `Bearer ${apiKey}`,
|
| 85 |
'Content-Type': 'application/json',
|
|
|
|
| 91 |
console.log(content);
|
| 92 |
res.json({ content });
|
| 93 |
} else {
|
| 94 |
+
res.status(500).json({ content: '❌ Не удалось прочитать ответ.' });
|
| 95 |
}
|
| 96 |
} catch (error) {
|
| 97 |
console.error(error);
|