add get token, fix prompt

This commit is contained in:
RustamRu 2025-03-03 19:49:11 +03:00
parent 69c280b266
commit c0883fc2bc
2 changed files with 60 additions and 21 deletions

View File

@ -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
}

View File

@ -5,6 +5,7 @@ const { MasterModel } = require('./model/master')
const { OrderModel } = require('./model/order') const { OrderModel } = require('./model/order')
const { OrderCarImgModel } = require('./model/order.car-img') const { OrderCarImgModel } = require('./model/order.car-img')
const { orderStatus } = require('./model/const') const { orderStatus } = require('./model/const')
const { getGigaToken } = require('./get-token')
const isValidPhoneNumber = (value) => /^(\+)?\d{9,15}/.test(value) const isValidPhoneNumber = (value) => /^(\+)?\d{9,15}/.test(value)
const isValidCarNumber = (value) => /^[авекмнорстух][0-9]{3}[авекмнорстух]{2}[0-9]{2,3}$/i.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 { v4: uuidv4 } = require("uuid")
const axios = require('axios') 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_OAUTH = 'https://ngw.devices.sberbank.ru:9443/api/v2/oauth'
const GIGA_CHAT_API = 'https://gigachat.devices.sberbank.ru/api/v1' const GIGA_CHAT_API = 'https://gigachat.devices.sberbank.ru/api/v1'
const getToken = async (req, res) => { const getToken = async (req, res) => {
const gigaToken = await getGigaToken()
const rqUID = uuidv4() const rqUID = uuidv4()
const body = new URLSearchParams({ const body = new URLSearchParams({
scope: "GIGACHAT_API_PERS", scope: "GIGACHAT_API_PERS",
@ -289,7 +292,7 @@ const getToken = async (req, res) => {
const response = await fetch(GIGA_CHAT_OAUTH, { const response = await fetch(GIGA_CHAT_OAUTH, {
method: "POST", method: "POST",
headers: { headers: {
Authorization: `Basic ${GIGA_CHAT_ACCESS_TOKEN}`, Authorization: `Basic ${gigaToken}`,
"Content-Type": "application/x-www-form-urlencoded", "Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json", Accept: "application/json",
RqUID: rqUID, RqUID: rqUID,
@ -343,14 +346,30 @@ const analyzeImage = async (fileId, token) => {
update_interval: 0, update_interval: 0,
messages: [ messages: [
{ {
role: "user", role: "system",
content: content:
`Ты эксперт по оценке степени загрязнения автомобилей. Твоя задача — анализировать фотографии машин и определять степень их загрязнения. Ответ должен содержать: 1. Оценку степени загрязнения в виде числа от 0 до 10, где 0 - без загрязнений, 10 - загрязнена на 100%. 2. Пояснение к оценке в виде абзаца текста с обоснованием выставленной оценки. `Ты эксперт по оценке степени загрязнения автомобилей. Твоя задача — анализировать фотографии машин и определять степень их загрязнения.
Ответ должен быть в виде объекта следующего вида: ВАЖНО: Твой ответ ДОЛЖЕН быть СТРОГО в формате JSON и содержать ТОЛЬКО следующие поля:
{ {
"value": число от 0 до 10, "value": число от 0 до 10 (целое или с одним знаком после запятой),
"description": "текст с обоснованием оценки" "description": "текстовое описание на русском языке"
}`, }
Правила:
1. Поле "value":
- Должно быть числом от 0 до 10
- 0 = машина абсолютно чистая
- 10 = машина максимально грязная
2. Поле "description":
- Должно содержать 2-3 предложения на русском языке
- Обязательно указать конкретные признаки загрязнения
- Объяснить почему выставлен именно такой балл
НЕ ДОБАВЛЯЙ никаких дополнительных полей или комментариев вне JSON структуры.
НЕ ИСПОЛЬЗУЙ markdown форматирование.
ОТВЕТ ДОЛЖЕН БЫТЬ ВАЛИДНЫМ JSON.`,
},
{
role: "user",
content: 'Дай оценку для приложенного файла изображения согласно структуре, ответ должен быть на русском языке',
attachments: [fileId], attachments: [fileId],
}, },
], ],
@ -358,7 +377,12 @@ const analyzeImage = async (fileId, token) => {
}) })
const data = await response.json() const data = await response.json()
try {
return JSON.parse(data.choices[0].message.content) return JSON.parse(data.choices[0].message.content)
} catch (error) {
console.error(error)
return { description: data.choices[0].message.content }
}
} }
const convertFileToBase64 = (file) => { const convertFileToBase64 = (file) => {
@ -366,6 +390,8 @@ const convertFileToBase64 = (file) => {
return base64Image return base64Image
} }
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = "0"
router.post('/:id/upload-car-img', upload.single('file'), async (req, res) => { router.post('/:id/upload-car-img', upload.single('file'), async (req, res) => {
const { id: orderId } = req.params const { id: orderId } = req.params
if (!mongoose.Types.ObjectId.isValid(orderId)) { if (!mongoose.Types.ObjectId.isValid(orderId)) {
@ -380,6 +406,7 @@ router.post('/:id/upload-car-img', upload.single('file'), async (req, res) => {
throw new Error(VALIDATION_MESSAGES.carImg.required) throw new Error(VALIDATION_MESSAGES.carImg.required)
} }
try {
const { access_token } = await getToken(req, res) const { access_token } = await getToken(req, res)
const fileId = await uploadImage(req.file, access_token) const fileId = await uploadImage(req.file, access_token)
@ -394,6 +421,9 @@ router.post('/:id/upload-car-img', upload.single('file'), async (req, res) => {
}) })
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) => { router.use((err, req, res, next) => {