@@ -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 )
@@ -273,11 +274,124 @@ const upload = multer({
}
} )
const { v4 : uuidv4 } = require ( "uuid" )
const axios = require ( 'axios' )
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" ,
} )
const response = await fetch ( GIGA _CHAT _OAUTH , {
method : "POST" ,
headers : {
Authorization : ` Basic ${ gigaToken } ` ,
"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 : "system" ,
content :
` Ты эксперт по оценке степени загрязнения автомобилей. Твоя задача — анализировать фотографии машин и определять степень их загрязнения.
ВАЖНО: Твой ответ ДОЛЖЕН быть СТРОГО в формате JSON и содержать ТОЛЬКО следующие поля:
{
"value": число от 0 до 10 (целое или с одним знаком после запятой),
"description": "текстовое описание на русском языке"
}
Правила:
1. Поле "value":
- Должно быть числом от 0 до 10
- 0 = машина абсолютно чистая
- 10 = машина максимально грязная
2. Поле "description":
- Должно содержать 2-3 предложения на русском языке
- Обязательно указать конкретные признаки загрязнения
- Объяснить почему выставлен именно такой балл
Н Е ДОБАВЛЯЙ никаких дополнительных полей или комментариев вне JSON структуры.
Н Е ИСПОЛЬЗУЙ markdown форматирование.
О Т В Е Т ДОЛЖЕН БЫТЬ ВАЛИДНЫМ JSON.` ,
} ,
{
role : "user" ,
content : 'Дай оценку для приложенного файла изображения согласно структуре, ответ должен быть на русском языке' ,
attachments : [ fileId ] ,
} ,
] ,
} ) ,
} )
const data = await response . json ( )
try {
return JSON . parse ( data . choices [ 0 ] . message . content )
} catch ( error ) {
console . error ( error )
return { description : data . choices [ 0 ] . message . content }
}
}
const convertFileToBase64 = ( file ) => {
const base64Image = file . buffer . toString ( 'base64' )
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 ) ) {
@@ -292,13 +406,24 @@ router.post('/:id/upload-car-img', upload.single('file'), async (req, res) => {
throw new Error ( VALIDATION _MESSAGES . carImg . required )
}
const orderCarImg = await OrderCarImgModel . create ( {
file : convertFileToBase64 ( req . file ) ,
orderId ,
created : new Date ( ) . toISOString ( ) ,
} )
try {
const { access _token } = await getToken ( req , res )
res . status ( 200 ) . send ( { su ccess: true , body : orderCarImg } )
const fileId = await uploadImage ( req . file , a ccess_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 ( ) ,
} )
res . status ( 200 ) . send ( { success : true , body : orderCarImg } )
} catch ( error ) {
console . error ( error )
}
} )
router . use ( ( err , req , res , next ) => {
@@ -310,7 +435,7 @@ router.use((err, req, res, next) => {
return res . status ( 400 ) . json ( { success : false , error : err . message } )
}
}
throw new Error ( err . message )
} )