feat: add gigachat api
This commit is contained in:
120
server/routers/kfu-m-24-1/eng-it-lean/gigachat/index.js
Normal file
120
server/routers/kfu-m-24-1/eng-it-lean/gigachat/index.js
Normal file
@@ -0,0 +1,120 @@
|
||||
const https = require('follow-redirects').https;
|
||||
const fs = require('fs');
|
||||
const qs = require('querystring');
|
||||
const uuid = require('uuid');
|
||||
|
||||
const router = require('express').Router();
|
||||
|
||||
// vercel/ai package - https://github.com/vercel/ai
|
||||
const ai = require('./ai')
|
||||
// gigachat provider for vercel/ai
|
||||
const gigachatProvider = require('./gigachat')
|
||||
|
||||
module.exports = router;
|
||||
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
|
||||
process.env.GIGACHAT_AUTH = 'NWVjYTczYjctNWRkYi00NzExLTg0YTEtMjhlOWVmODM2MjI4OjlmMTBkMGVkLWZjZjktNGZhOS1hNDZjLTc5ZWU1YzExOGExMw=='
|
||||
|
||||
const gigachat = gigachatProvider.createGigachat( {
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Accept': 'application/json',
|
||||
}
|
||||
})
|
||||
|
||||
router.use((req, res, next) => {
|
||||
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();
|
||||
let options = {
|
||||
'method': 'POST',
|
||||
'hostname': 'ngw.devices.sberbank.ru',
|
||||
'port': 9443,
|
||||
'path': '/api/v2/oauth',
|
||||
'headers': {
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
'Accept': 'application/json',
|
||||
'RqUID': rquid,
|
||||
'Authorization': 'Basic ' + auth
|
||||
},
|
||||
'maxRedirects': 20
|
||||
};
|
||||
|
||||
const req = https.request(options, (response) => {
|
||||
let chunks = [];
|
||||
|
||||
response.on("data", (chunk) => {
|
||||
chunks.push(chunk);
|
||||
});
|
||||
|
||||
response.on("end", (chunk) => {
|
||||
let body = Buffer.concat(chunks);
|
||||
console.log(body.toString());
|
||||
let json = JSON.parse(body.toString());
|
||||
process.env.GIGACHAT_ACCESS_TOKEN = json.access_token;
|
||||
process.env.GIGACHAT_EXPIRES_AT = json.expires_at;
|
||||
});
|
||||
|
||||
response.on("error", (error) => {
|
||||
console.error(error);
|
||||
res.status(500).send(error);
|
||||
});
|
||||
});
|
||||
|
||||
let postData = qs.stringify({
|
||||
'scope': 'GIGACHAT_API_PERS'
|
||||
});
|
||||
|
||||
req.write(postData);
|
||||
req.end();
|
||||
}
|
||||
next()
|
||||
});
|
||||
|
||||
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,
|
||||
update_interval: 0.2,
|
||||
});
|
||||
|
||||
result.pipeDataStreamToResponse(res);
|
||||
})
|
||||
|
||||
router.post('/new-unit', async (req, res) => {
|
||||
const { prompt } = req.body;
|
||||
|
||||
const result = ai.streamText({
|
||||
model: gigachat('GigaChat'),
|
||||
system:`
|
||||
Я хочу, чтобы вы выступали в роли помощника для создания продвинутых текстовых уроков английского языка. Я буду указывать тему и уровень сложности (начинающий, средний, продвинутый), а вы будете предоставлять структурированный план урока в формате Markdown. Урок должен включать только текстовые элементы (без видео, картинок, аудио) и содержать следующие разделы:
|
||||
-Цель урока — конкретный навык или знание, которое освоят студенты.
|
||||
-Лексика
|
||||
-Базовые термины: 5-7 слов/фраз с примерами употребления.
|
||||
-Расширенная лексика: 3-5 идиом, фразовых глаголов или сложных выражений (для среднего/продвинутого уровня).
|
||||
-Грамматический фокус
|
||||
-Правило с пояснением и 3-5 примерами.
|
||||
-Типичные ошибки и как их избежать.
|
||||
-Контекстуализация
|
||||
-Короткий текст (диалог, статья, описание) для анализа с использованием лексики и грамматики урока.
|
||||
-Упражнения
|
||||
-Письменное задание: например, составить предложения/эссе по теме.
|
||||
-Устная практика: ролевые диалоги (текстовые сценарии), описание ситуаций.
|
||||
-Аналитическое задание: исправление ошибок в предложениях, перевод сложных конструкций.
|
||||
-Домашнее задание
|
||||
Текстовые задачи: написание текста, грамматические тесты, поиск синонимов/антонимов.
|
||||
Ответ должен быть оформлен в Markdown, лаконичным, без лишних комментариев, если пишешь блок кода, начинай его с новой строки.
|
||||
`,
|
||||
prompt,
|
||||
stream: true,
|
||||
update_interval: 0.3,
|
||||
});
|
||||
|
||||
result.pipeDataStreamToResponse(res);
|
||||
});
|
||||
Reference in New Issue
Block a user