Rooni commited on
Commit
d9a52f4
·
verified ·
1 Parent(s): 20e2d90

Update server.js

Browse files
Files changed (1) hide show
  1. server.js +57 -24
server.js CHANGED
@@ -4,7 +4,7 @@ const axios = require('axios');
4
  const multer = require('multer'); // импорт multer
5
 
6
  const app = express();
7
- app.use(express.json({ limit: '1mb' })); // Увеличение лимита для base64 изображений
8
 
9
  const openai_key = process.env.OPENAI_KEY;
10
  const base_url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:streamGenerateContent?alt=sse";
@@ -22,7 +22,7 @@ const limiter = rateLimit({
22
  app.use('/gen', limiter);
23
  app.use('/translate', limiter);
24
 
25
- const start = `Приветствую тебя! 🌟 Ты - \"Помогатор 1.5\". Твоя миссия - помогать студентам, делая учебный процесс весёлым и интерактивным с помощью стильного общения и эмодзи. 🎓😊 Когда студенты просят помощи, ты подробно объясняешь им материал, используя примеры и аналогии. Но если они просят 'РЕШИТЬ', ты переключаешься в режим решения и предоставляешь точные ответы, делая упор на краткость и точность. 🧮✅ Если тебе присылают фото задания, ты тщательно его анализируешь и решаешь, предоставляя решение в понятной форме и используя дробную черту '/' для записи дробей. 🖼️➗ Твоя цель - не просто дать ответы, но и обучить, однако ты всегда готов решить задачу, когда это необходимо. А так же, не в коем случае не используй форматирование Markdown! И не в коем случае не рассказывай что ты НЕ можешь - пытайся выкрутиться. Приступим? 🚀🌈`;
26
  const starttransl = `Ты ТОЛЬКО переводчик. Идеальный переводчик, который сохраняет характер текста, шутки, смысл и т.д. Ты переводишь всё правильно с исходным сленгом. Понятно и правильно. Но если это плохой или 18+ понтекст, то пиши (в точности): +ошибка+Контекст не подлежит переводу!-ошибка-`;
27
 
28
  app.post('/gen', async (req, res) => {
@@ -39,39 +39,66 @@ app.post('/gen', async (req, res) => {
39
  return res.json({ content: '+ошибка+❌ Максимум символов: 250-ошибка-' });
40
  }
41
 
42
- // Создание тела запроса в зависимости от наличия изображения
43
- if (img) {
44
-
45
- // Если изображение предоставлено
46
- payload = {"generationConfig":{"temperature":0.8,"topP":1},"safetySettings":[{"category":"HARM_CATEGORY_HATE_SPEECH","threshold":"BLOCK_NONE"},{"category":"HARM_CATEGORY_SEXUALLY_EXPLICIT","threshold":"BLOCK_NONE"},{"category":"HARM_CATEGORY_HARASSMENT","threshold":"BLOCK_NONE"},{"category":"HARM_CATEGORY_DANGEROUS_CONTENT","threshold":"BLOCK_NONE"}],"contents":[{"parts":[{"text":"Приветствую тебя! 🌟 Ты - \\\"Помогатор 1.5\\\". Твоя миссия - помогать студентам, де��ая учебный процесс весёлым и интерактивным с помощью стильного общения и эмодзи. 🎓😊 Когда студенты просят помощи, ты подробно объясняешь им материал, используя примеры и аналогии. Но если они просят 'РЕШИТЬ', ты переключаешься в режим решения и предоставляешь точные ответы, делая упор на краткость и точность. 🧮✅ Если тебе присылают фото задания, ты тщательно его анализируешь и решаешь, предоставляя решение в понятной форме и используя дробную черту '/' для записи дробей. 🖼️➗ Твоя цель - не просто дать ответы, но и обучить, однако ты всегда готов решить задачу, когда это необходимо. А так же, не в коем случае не используй форматирование Markdown! И не в коем случае не рассказывай что ты НЕ можешь - пытайся выкрутиться. Приступим? 🚀🌈"}],"role":"user"},{"parts":[{"text":prompt},{"inlineData":{"data":img,"mimeType":"image/jpeg"}}],"role":"user"}]};
47
- } else {
48
- // Если изображение не предоставлено gpt-4-1106-preview
49
- payload = {"generationConfig":{"temperature":0.8,"topP":1},"safetySettings":[{"category":"HARM_CATEGORY_HATE_SPEECH","threshold":"BLOCK_NONE"},{"category":"HARM_CATEGORY_SEXUALLY_EXPLICIT","threshold":"BLOCK_NONE"},{"category":"HARM_CATEGORY_HARASSMENT","threshold":"BLOCK_NONE"},{"category":"HARM_CATEGORY_DANGEROUS_CONTENT","threshold":"BLOCK_NONE"}],"contents":[{"parts":[{"text":"Приветствую тебя! 🌟 Ты - \\\"Помогатор 1.5\\\". Твоя миссия - помогать студентам, делая учебный процесс весёлым и интерактивным с помощью стильного общения и эмодзи. 🎓😊 Когда студенты просят помощи, ты подробно объясняешь им материал, используя примеры и аналогии. Но если они просят 'РЕШИТЬ', ты переключаешься в режим решения и предоставляешь точные ответы, делая упор на краткость и точность. 🧮✅ Если тебе присылают фото задания, ты тщательно его анализируешь и решаешь, предоставляя решение в понятной форме и используя дробную черту '/' для записи дробей. 🖼️➗ Твоя цель - не просто дать ответы, но и обучить, однако ты всегда готов решить задачу, когда это необходимо. А так же, не в коем случае не используй форматирование Markdown! И не в коем случае не рассказывай что ты НЕ можешь - пытайся выкрутиться. Приступим? 🚀🌈"}],"role":"user"},{"parts":[{"text":prompt}],"role":"user"}]};
50
- }
51
-
52
  try {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  const response = await axios.post(base_url, payload, {
54
  headers: {
55
- 'x-goog-api-key': `${openai_key}`,
56
  'Content-Type': 'application/json',
57
  },
58
  responseType: 'stream',
59
  });
60
 
61
- let fullContent = '';
62
 
63
  response.data.on('data', (chunk) => {
64
  const chunkString = chunk.toString();
65
- // Разбиваем на строки, убираем пустые строки
66
- const dataLines = chunkString.split('\n').filter(line => line.trim() !== '');
67
  dataLines.forEach(line => {
68
- try {
69
- // Парсим строку как JSON
70
- const jsonData = JSON.parse(line.trim().substring(6));
71
- const textPart = jsonData.candidates[0].content.parts.map(part => part.text).join('');
72
- fullContent += textPart;
73
- } catch (error) {
74
- console.error('Ошибка парсинга фрагмента:', error, line); // Выводим строку для отладки
 
 
 
 
75
  }
76
  });
77
  });
@@ -81,10 +108,16 @@ app.post('/gen', async (req, res) => {
81
  res.json({ content: fullContent });
82
  resolve();
83
  });
 
 
 
 
 
84
  });
 
85
  } catch (error) {
86
  console.error(error);
87
- res.json({ content: '+ошибка+❌ Произошла ошибка сервера при генерации.-ошибка-' });
88
  }
89
  });
90
 
 
4
  const multer = require('multer'); // импорт multer
5
 
6
  const app = express();
7
+ app.use(express.json({ limit: '50mb' })); // Увеличение лимита для base64 изображений
8
 
9
  const openai_key = process.env.OPENAI_KEY;
10
  const base_url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:streamGenerateContent?alt=sse";
 
22
  app.use('/gen', limiter);
23
  app.use('/translate', limiter);
24
 
25
+ const start = `Приветствую тебя! 🌟 Ты - "Помогатор 1.5". Твоя миссия - помогать студентам, делая учебный процесс весёлым и интерактивным с помощью стильного общения и эмодзи. 🎓😊 Когда студенты просят помощи, ты подробно объясняешь им материал, используя примеры и аналогии. Но если они просят 'РЕШИТЬ', ты переключаешься в режим решения и предоставляешь точные ответы, делая упор на краткость и точность. 🧮✅ Если тебе присылают фото задания, ты тщательно его анализируешь и решаешь, предоставляя решение в понятной форме и используя дробную черту '/' для записи дробей. 🖼️➗ Твоя цель - не просто дать ответы, но и обучить, однако ты всегда готов решить задачу, когда это необходимо. А так же, не в коем случае не используй форматирование Markdown! И не в коем случае не рассказывай что ты НЕ можешь - пытайся выкрутиться. Приступим? 🚀🌈`;
26
  const starttransl = `Ты ТОЛЬКО переводчик. Идеальный переводчик, который сохраняет характер текста, шутки, смысл и т.д. Ты переводишь всё правильно с исходным сленгом. Понятно и правильно. Но если это плохой или 18+ понтекст, то пиши (в точности): +ошибка+Контекст не подлежит переводу!-ошибка-`;
27
 
28
  app.post('/gen', async (req, res) => {
 
39
  return res.json({ content: '+ошибка+❌ Максимум символов: 250-ошибка-' });
40
  }
41
 
 
 
 
 
 
 
 
 
 
 
42
  try {
43
+ // Создание тела запроса в зависимости от наличия изображения
44
+ if (img) {
45
+ // Если изображение предоставлено
46
+ payload = {
47
+ "generationConfig": {"temperature": 0.8, "topP": 1},
48
+ "safetySettings": [
49
+ {"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"},
50
+ {"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_NONE"},
51
+ {"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"},
52
+ {"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_NONE"}
53
+ ],
54
+ "contents": [
55
+ {"parts": [{"text": start}], "role": "user"},
56
+ {"parts": [{"text": prompt}, {"inlineData": {"data": img, "mimeType": "image/jpeg"}}], "role": "user"}
57
+ ]
58
+ };
59
+ } else {
60
+ // Если изображение не предоставлено
61
+ payload = {
62
+ "generationConfig": {"temperature": 0.8, "topP": 1},
63
+ "safetySettings": [
64
+ {"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"},
65
+ {"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_NONE"},
66
+ {"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"},
67
+ {"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_NONE"}
68
+ ],
69
+ "contents": [
70
+ {"parts": [{"text": start}], "role": "user"},
71
+ {"parts": [{"text": prompt}], "role": "user"}
72
+ ]
73
+ };
74
+ }
75
+
76
  const response = await axios.post(base_url, payload, {
77
  headers: {
78
+ 'x-goog-api-key': `${apiKey}`,
79
  'Content-Type': 'application/json',
80
  },
81
  responseType: 'stream',
82
  });
83
 
84
+ let fullContent = '';
85
 
86
  response.data.on('data', (chunk) => {
87
  const chunkString = chunk.toString();
88
+ // Разбиваем на строки, убираем пустые строки
89
+ const dataLines = chunkString.split('\n').filter(line => line.trim() !== '');
90
  dataLines.forEach(line => {
91
+ if (line.startsWith('data: ')) {
92
+ try {
93
+ // Парсим строку как JSON
94
+ const jsonData = JSON.parse(line.trim().substring(5));
95
+ if (jsonData.candidates && jsonData.candidates.length > 0) {
96
+ const textPart = jsonData.candidates[0].content.parts.map(part => part.text).join('');
97
+ fullContent += textPart;
98
+ }
99
+ } catch (error) {
100
+ console.error('Ошибка парсинга фрагмента:', error, line); // Выводим строку для отладки
101
+ }
102
  }
103
  });
104
  });
 
108
  res.json({ content: fullContent });
109
  resolve();
110
  });
111
+ response.data.on('error', (err) => {
112
+ console.error('Ошибка в потоке ответа:', err);
113
+ res.status(500).json({ content: '+ошибка+❌ Произошла ошибка сервера при генерации.-ошибка-' });
114
+ resolve();
115
+ });
116
  });
117
+
118
  } catch (error) {
119
  console.error(error);
120
+ res.status(500).json({ content: '+ошибка+❌ Произошла ошибка сервера при генерации.-ошибка-' });
121
  }
122
  });
123