diff --git a/server/routers/dry-wash/get-token.js b/server/routers/dry-wash/get-token.js new file mode 100644 index 0000000..8543dc6 --- /dev/null +++ b/server/routers/dry-wash/get-token.js @@ -0,0 +1,9 @@ +const getGigaToken = async () => { + const response = await fetch('https://admin.bro-js.ru/api/config/v1/dev') + const data = await response.json() + return data.features['dry-wash-bh'].GIGA_TOKEN.value +} + +module.exports = { + getGigaToken +} \ No newline at end of file diff --git a/server/routers/dry-wash/order.js b/server/routers/dry-wash/order.js index 6ee245f..8244900 100644 --- a/server/routers/dry-wash/order.js +++ b/server/routers/dry-wash/order.js @@ -5,6 +5,7 @@ const { MasterModel } = require('./model/master') const { OrderModel } = require('./model/order') const { OrderCarImgModel } = require('./model/order.car-img') const { orderStatus } = require('./model/const') +const { getGigaToken } = require('./get-token') const isValidPhoneNumber = (value) => /^(\+)?\d{9,15}/.test(value) const isValidCarNumber = (value) => /^[авекмнорстух][0-9]{3}[авекмнорстух]{2}[0-9]{2,3}$/i.test(value) @@ -276,11 +277,13 @@ const upload = multer({ const { v4: uuidv4 } = require("uuid") const axios = require('axios') -const GIGA_CHAT_ACCESS_TOKEN = 'OGJmMDQ4MzAtNDIwNS00NzRmLTkwOTQtNTdmNGNlYzkxZjc0OjFiZDQ0MDM4LTkyYTktNDdiNy04N2M5LWIzNjAwNjBjZTVjNQ==' +const GIGA_CHAT_ACCESS_TOKEN = 'MTQwMmNmZjgtZjA5OC00OGMxLWI0OTUtNWU3ZTU4YzMzZjdjOmU5OGFiYmNiLThmMDItNGVmOC1hNjhhLTA4Y2QxYjVmOGRmMA==' const GIGA_CHAT_OAUTH = 'https://ngw.devices.sberbank.ru:9443/api/v2/oauth' const GIGA_CHAT_API = 'https://gigachat.devices.sberbank.ru/api/v1' const getToken = async (req, res) => { + const gigaToken = await getGigaToken() + const rqUID = uuidv4() const body = new URLSearchParams({ scope: "GIGACHAT_API_PERS", @@ -289,7 +292,7 @@ const getToken = async (req, res) => { const response = await fetch(GIGA_CHAT_OAUTH, { method: "POST", headers: { - Authorization: `Basic ${GIGA_CHAT_ACCESS_TOKEN}`, + Authorization: `Basic ${gigaToken}`, "Content-Type": "application/x-www-form-urlencoded", Accept: "application/json", RqUID: rqUID, @@ -343,14 +346,30 @@ const analyzeImage = async (fileId, token) => { update_interval: 0, messages: [ { - role: "user", + role: "system", content: - `Ты эксперт по оценке степени загрязнения автомобилей. Твоя задача — анализировать фотографии машин и определять степень их загрязнения. Ответ должен содержать: 1. Оценку степени загрязнения в виде числа от 0 до 10, где 0 - без загрязнений, 10 - загрязнена на 100%. 2. Пояснение к оценке в виде абзаца текста с обоснованием выставленной оценки. - Ответ должен быть в виде объекта следующего вида: - { - "value": число от 0 до 10, - "description": "текст с обоснованием оценки" - }`, + `Ты эксперт по оценке степени загрязнения автомобилей. Твоя задача — анализировать фотографии машин и определять степень их загрязнения. +ВАЖНО: Твой ответ ДОЛЖЕН быть СТРОГО в формате JSON и содержать ТОЛЬКО следующие поля: +{ +"value": число от 0 до 10 (целое или с одним знаком после запятой), +"description": "текстовое описание на русском языке" +} +Правила: +1. Поле "value": +- Должно быть числом от 0 до 10 +- 0 = машина абсолютно чистая +- 10 = машина максимально грязная +2. Поле "description": +- Должно содержать 2-3 предложения на русском языке +- Обязательно указать конкретные признаки загрязнения +- Объяснить почему выставлен именно такой балл +НЕ ДОБАВЛЯЙ никаких дополнительных полей или комментариев вне JSON структуры. +НЕ ИСПОЛЬЗУЙ markdown форматирование. +ОТВЕТ ДОЛЖЕН БЫТЬ ВАЛИДНЫМ JSON.`, + }, + { + role: "user", + content: 'Дай оценку для приложенного файла изображения согласно структуре, ответ должен быть на русском языке', attachments: [fileId], }, ], @@ -358,7 +377,12 @@ const analyzeImage = async (fileId, token) => { }) const data = await response.json() - return JSON.parse(data.choices[0].message.content) + try { + return JSON.parse(data.choices[0].message.content) + } catch (error) { + console.error(error) + return { description: data.choices[0].message.content } + } } const convertFileToBase64 = (file) => { @@ -366,6 +390,8 @@ const convertFileToBase64 = (file) => { return base64Image } +process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = "0" + router.post('/:id/upload-car-img', upload.single('file'), async (req, res) => { const { id: orderId } = req.params if (!mongoose.Types.ObjectId.isValid(orderId)) { @@ -380,20 +406,24 @@ router.post('/:id/upload-car-img', upload.single('file'), async (req, res) => { throw new Error(VALIDATION_MESSAGES.carImg.required) } - const { access_token } = await getToken(req, res) + try { + const { access_token } = await getToken(req, res) - const fileId = await uploadImage(req.file, access_token) - const { value, description } = await analyzeImage(fileId, access_token) ?? {} + const fileId = await uploadImage(req.file, access_token) + const { value, description } = await analyzeImage(fileId, access_token) ?? {} - const orderCarImg = await OrderCarImgModel.create({ - image: convertFileToBase64(req.file), - imageRating: value, - imageDescription: description, - orderId, - created: new Date().toISOString(), - }) + const orderCarImg = await OrderCarImgModel.create({ + image: convertFileToBase64(req.file), + imageRating: value, + imageDescription: description, + orderId, + created: new Date().toISOString(), + }) - res.status(200).send({ success: true, body: orderCarImg }) + res.status(200).send({ success: true, body: orderCarImg }) + } catch (error) { + console.error(error) + } }) router.use((err, req, res, next) => {