evaluate with ai car dirtiness by image

This commit is contained in:
RustamRu
2025-03-03 18:21:32 +03:00
parent 6794b01ac8
commit 69c280b266
4 changed files with 100 additions and 96 deletions

View File

@@ -273,6 +273,94 @@ const upload = multer({
}
})
const { v4: uuidv4 } = require("uuid")
const axios = require('axios')
const GIGA_CHAT_ACCESS_TOKEN = 'OGJmMDQ4MzAtNDIwNS00NzRmLTkwOTQtNTdmNGNlYzkxZjc0OjFiZDQ0MDM4LTkyYTktNDdiNy04N2M5LWIzNjAwNjBjZTVjNQ=='
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 rqUID = uuidv4()
const body = new URLSearchParams({
scope: "GIGACHAT_API_PERS",
})
const response = await fetch(GIGA_CHAT_OAUTH, {
method: "POST",
headers: {
Authorization: `Basic ${GIGA_CHAT_ACCESS_TOKEN}`,
"Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json",
RqUID: rqUID,
},
body,
})
if (!response.ok) {
const errorData = await response.json()
console.error("Ошибка запроса: ", errorData)
return res.status(response.status).json(errorData)
}
return await response.json()
}
const uploadImage = async (file, accessToken) => {
const formData = new FormData()
const blob = new Blob([file.buffer], { type: file.mimetype })
formData.append('file', blob, file.originalname)
formData.append('purpose', 'general')
const config = {
maxBodyLength: Infinity,
headers: {
'Content-Type': 'multipart/form-data',
'Accept': 'application/json',
'Authorization': `Bearer ${accessToken}`
}
}
try {
const response = await axios.post(`${GIGA_CHAT_API}/files`, formData, config)
return response.data.id
} catch (error) {
console.error(error)
}
}
const analyzeImage = async (fileId, token) => {
const response = await fetch(`${GIGA_CHAT_API}/chat/completions`, {
method: "POST",
headers: {
"Content-Type": "application/json",
Accept: "application/json",
Authorization: `Bearer ${token}`,
},
body: JSON.stringify({
model: "GigaChat-Max",
stream: false,
update_interval: 0,
messages: [
{
role: "user",
content:
`Ты эксперт по оценке степени загрязнения автомобилей. Твоя задача — анализировать фотографии машин и определять степень их загрязнения. Ответ должен содержать: 1. Оценку степени загрязнения в виде числа от 0 до 10, где 0 - без загрязнений, 10 - загрязнена на 100%. 2. Пояснение к оценке в виде абзаца текста с обоснованием выставленной оценки.
Ответ должен быть в виде объекта следующего вида:
{
"value": число от 0 до 10,
"description": "текст с обоснованием оценки"
}`,
attachments: [fileId],
},
],
}),
})
const data = await response.json()
return JSON.parse(data.choices[0].message.content)
}
const convertFileToBase64 = (file) => {
const base64Image = file.buffer.toString('base64')
return base64Image
@@ -292,8 +380,15 @@ 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)
const fileId = await uploadImage(req.file, access_token)
const { value, description } = await analyzeImage(fileId, access_token) ?? {}
const orderCarImg = await OrderCarImgModel.create({
file: convertFileToBase64(req.file),
image: convertFileToBase64(req.file),
imageRating: value,
imageDescription: description,
orderId,
created: new Date().toISOString(),
})
@@ -310,7 +405,7 @@ router.use((err, req, res, next) => {
return res.status(400).json({ success: false, error: err.message })
}
}
throw new Error(err.message)
})