2025-01-31 12:12:20 +03:00
|
|
|
|
const axios = require('axios');
|
|
|
|
|
const https = require('https');
|
2025-01-29 23:10:44 +03:00
|
|
|
|
const fs = require('fs');
|
|
|
|
|
const qs = require('querystring');
|
|
|
|
|
const uuid = require('uuid');
|
|
|
|
|
|
|
|
|
|
const router = require('express').Router();
|
|
|
|
|
|
2025-01-31 12:12:20 +03:00
|
|
|
|
// vercel/ai package
|
|
|
|
|
const ai = require('./ai');
|
2025-01-29 23:10:44 +03:00
|
|
|
|
// gigachat provider for vercel/ai
|
2025-01-31 12:12:20 +03:00
|
|
|
|
const gigachatProvider = require('./gigachat');
|
2025-01-29 23:10:44 +03:00
|
|
|
|
|
|
|
|
|
module.exports = router;
|
|
|
|
|
|
2025-01-31 12:12:20 +03:00
|
|
|
|
const path = require('path');
|
|
|
|
|
//process.env.NODE_EXTRA_CA_CERTS= path.resolve(__dirname, 'certs')
|
|
|
|
|
//process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
|
2025-01-29 23:10:44 +03:00
|
|
|
|
|
2025-01-31 12:12:20 +03:00
|
|
|
|
process.env.GIGACHAT_AUTH =
|
|
|
|
|
'NWVjYTczYjctNWRkYi00NzExLTg0YTEtMjhlOWVmODM2MjI4OjlmMTBkMGVkLWZjZjktNGZhOS1hNDZjLTc5ZWU1YzExOGExMw==';
|
|
|
|
|
|
|
|
|
|
const agent = new https.Agent({
|
|
|
|
|
rejectUnauthorized: false
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const gigachat = gigachatProvider.createGigachat({
|
2025-01-29 23:10:44 +03:00
|
|
|
|
headers: {
|
|
|
|
|
'Content-Type': 'application/json',
|
2025-01-31 12:12:20 +03:00
|
|
|
|
Accept: 'text/event-stream'
|
|
|
|
|
},
|
|
|
|
|
fetch: (url, options) => {
|
|
|
|
|
return axios({
|
|
|
|
|
method: 'post',
|
|
|
|
|
maxBodyLength: Infinity,
|
|
|
|
|
url: url,
|
|
|
|
|
headers: options.headers,
|
|
|
|
|
httpsAgent: agent,
|
|
|
|
|
data: options.body
|
|
|
|
|
}).then((response) => {
|
|
|
|
|
return new Response(response.data, {
|
|
|
|
|
status: response.status,
|
|
|
|
|
statusText: response.statusText,
|
|
|
|
|
headers: response.headers,
|
|
|
|
|
body: response.data
|
|
|
|
|
});
|
|
|
|
|
}).catch((error) => {
|
|
|
|
|
return new Response(error.message, {
|
|
|
|
|
status: error.response.status,
|
|
|
|
|
statusText: error.response.statusText,
|
|
|
|
|
headers: error.response.headers,
|
|
|
|
|
body: error.response.data
|
|
|
|
|
});
|
|
|
|
|
});
|
2025-01-29 23:10:44 +03:00
|
|
|
|
}
|
2025-01-31 12:12:20 +03:00
|
|
|
|
});
|
2025-01-29 23:10:44 +03:00
|
|
|
|
|
2025-01-31 12:12:20 +03:00
|
|
|
|
router.use(async (req, res, next) => {
|
2025-01-29 23:10:44 +03:00
|
|
|
|
const hasToken = process.env.GIGACHAT_ACCESS_TOKEN && process.env.GIGACHAT_EXPIRES_AT != null;
|
|
|
|
|
const hasExpired = new Date(process.env.GIGACHAT_EXPIRES_AT) <= new Date();
|
|
|
|
|
if (!hasToken || hasExpired) {
|
|
|
|
|
let auth = process.env.GIGACHAT_AUTH;
|
|
|
|
|
let rquid = uuid.v4();
|
2025-01-31 12:12:20 +03:00
|
|
|
|
|
|
|
|
|
let config = {
|
|
|
|
|
method: 'post',
|
|
|
|
|
maxBodyLength: Infinity,
|
|
|
|
|
url: 'https://ngw.devices.sberbank.ru:9443/api/v2/oauth',
|
|
|
|
|
headers: {
|
2025-01-29 23:10:44 +03:00
|
|
|
|
'Content-Type': 'application/x-www-form-urlencoded',
|
2025-01-31 12:12:20 +03:00
|
|
|
|
Accept: 'application/json',
|
|
|
|
|
RqUID: rquid,
|
|
|
|
|
Authorization: 'Basic ' + auth
|
2025-01-29 23:10:44 +03:00
|
|
|
|
},
|
2025-01-31 12:12:20 +03:00
|
|
|
|
httpsAgent: agent,
|
|
|
|
|
data: qs.stringify({
|
|
|
|
|
scope: 'GIGACHAT_API_PERS'
|
|
|
|
|
})
|
2025-01-29 23:10:44 +03:00
|
|
|
|
};
|
2025-01-31 12:12:20 +03:00
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const response = await axios(config);
|
|
|
|
|
const json = response.data;
|
|
|
|
|
process.env.GIGACHAT_ACCESS_TOKEN = json.access_token;
|
|
|
|
|
process.env.GIGACHAT_EXPIRES_AT = json.expires_at;
|
|
|
|
|
console.log(JSON.stringify(response.data));
|
|
|
|
|
} catch {
|
|
|
|
|
console.log(error);
|
|
|
|
|
}
|
2025-01-29 23:10:44 +03:00
|
|
|
|
}
|
2025-01-31 12:12:20 +03:00
|
|
|
|
next();
|
2025-01-29 23:10:44 +03:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
router.post('/chat', async (req, res) => {
|
|
|
|
|
const { messages } = req.body;
|
|
|
|
|
|
|
|
|
|
const result = ai.streamText({
|
|
|
|
|
model: gigachat('GigaChat'),
|
|
|
|
|
system: 'You are a helpful assistant.',
|
|
|
|
|
messages,
|
|
|
|
|
stream: true,
|
2025-01-31 12:12:20 +03:00
|
|
|
|
update_interval: 0.2
|
2025-01-29 23:10:44 +03:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
result.pipeDataStreamToResponse(res);
|
2025-01-31 12:12:20 +03:00
|
|
|
|
});
|
2025-01-29 23:10:44 +03:00
|
|
|
|
|
|
|
|
|
router.post('/new-unit', async (req, res) => {
|
|
|
|
|
const { prompt } = req.body;
|
|
|
|
|
|
2025-01-31 12:12:20 +03:00
|
|
|
|
const systemMessage = `
|
2025-01-29 23:10:44 +03:00
|
|
|
|
Я хочу, чтобы вы выступали в роли помощника для создания продвинутых текстовых уроков английского языка. Я буду указывать тему и уровень сложности (начинающий, средний, продвинутый), а вы будете предоставлять структурированный план урока в формате Markdown. Урок должен включать только текстовые элементы (без видео, картинок, аудио) и содержать следующие разделы:
|
|
|
|
|
-Цель урока — конкретный навык или знание, которое освоят студенты.
|
|
|
|
|
-Лексика
|
|
|
|
|
-Базовые термины: 5-7 слов/фраз с примерами употребления.
|
|
|
|
|
-Расширенная лексика: 3-5 идиом, фразовых глаголов или сложных выражений (для среднего/продвинутого уровня).
|
|
|
|
|
-Грамматический фокус
|
|
|
|
|
-Правило с пояснением и 3-5 примерами.
|
|
|
|
|
-Типичные ошибки и как их избежать.
|
|
|
|
|
-Контекстуализация
|
|
|
|
|
-Короткий текст (диалог, статья, описание) для анализа с использованием лексики и грамматики урока.
|
|
|
|
|
-Упражнения
|
|
|
|
|
-Письменное задание: например, составить предложения/эссе по теме.
|
|
|
|
|
-Устная практика: ролевые диалоги (текстовые сценарии), описание ситуаций.
|
|
|
|
|
-Аналитическое задание: исправление ошибок в предложениях, перевод сложных конструкций.
|
|
|
|
|
-Домашнее задание
|
|
|
|
|
Текстовые задачи: написание текста, грамматические тесты, поиск синонимов/антонимов.
|
|
|
|
|
Ответ должен быть оформлен в Markdown, лаконичным, без лишних комментариев, если пишешь блок кода, начинай его с новой строки.
|
2025-01-31 12:12:20 +03:00
|
|
|
|
`;
|
2025-01-29 23:10:44 +03:00
|
|
|
|
|
2025-01-31 12:12:20 +03:00
|
|
|
|
try {
|
|
|
|
|
const result = ai.streamText({
|
|
|
|
|
model: gigachat('GigaChat'),
|
|
|
|
|
system: systemMessage,
|
|
|
|
|
prompt,
|
|
|
|
|
stream: true,
|
|
|
|
|
update_interval: 0.3
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
result.pipeTextStreamToResponse(res);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.log(e);
|
|
|
|
|
}
|
2025-01-29 23:10:44 +03:00
|
|
|
|
});
|