Spaces:
Running
Running
/** | |
* | |
* Copyright 2023-2025 InspectorRAGet Team | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
* | |
**/ | |
function isValidModel(model): boolean { | |
if (!model.hasOwnProperty('modelId')) { | |
return false; | |
} | |
if (!model.hasOwnProperty('name')) { | |
return false; | |
} | |
if (!model.hasOwnProperty('owner')) { | |
return false; | |
} | |
return true; | |
} | |
function isValidMetricValue(mval): boolean { | |
if ( | |
!mval.hasOwnProperty('value') || | |
(typeof mval.value !== 'string' && typeof mval.value !== 'number') | |
) { | |
return false; | |
} | |
return true; | |
} | |
function isValidMetric(metric): boolean { | |
if (!metric.hasOwnProperty('name')) { | |
return false; | |
} | |
if ( | |
!metric.hasOwnProperty('author') || | |
(metric.author !== 'algorithm' && metric.author !== 'human') | |
) { | |
return false; | |
} | |
if ( | |
!metric.hasOwnProperty('type') || | |
(metric.type !== 'numerical' && | |
metric.type !== 'categorical' && | |
metric.type !== 'text') | |
) { | |
return false; | |
} | |
// Metric with type "numerical" cannot be aggregated with "majority" aggregator | |
if ( | |
metric.type === 'numerical' && | |
metric.hasOwnProperty('aggregator') && | |
metric.aggregator === 'majority' | |
) { | |
return false; | |
} | |
if ( | |
metric.type == 'categorical' && | |
(!metric.hasOwnProperty('values') || !metric.values.length) | |
) { | |
return false; | |
} | |
if ( | |
metric.hasOwnProperty('values') && | |
!metric.values.every((v) => isValidMetricValue(v)) | |
) { | |
return false; | |
} | |
return true; | |
} | |
function isValidDocument(document): boolean { | |
if (!document.hasOwnProperty('documentId')) { | |
return false; | |
} | |
return true; | |
} | |
function isValidTask(task): boolean { | |
if (!task.hasOwnProperty('taskId')) { | |
return false; | |
} | |
if ( | |
!task.hasOwnProperty('taskType') || | |
(task.taskType !== 'rag' && | |
task.taskType !== 'text_generation' && | |
task.taskType !== 'json_generation' && | |
task.taskType !== 'chat') | |
) { | |
return false; | |
} | |
if (!task.hasOwnProperty('contexts')) { | |
return false; | |
} | |
if (!task.hasOwnProperty('input')) { | |
return false; | |
} | |
return true; | |
} | |
export function validateInputData(data): { valid: boolean; reasons: string[] } { | |
let valid: boolean = true; | |
const reasons: string[] = []; | |
// Step : Validate models releated requirements | |
if (!data.hasOwnProperty('models')) { | |
valid = false; | |
reasons.push("Missing mandatory 'models' information."); | |
} | |
if ( | |
data.hasOwnProperty('models') && | |
!data.models.every((model) => isValidModel(model)) | |
) { | |
valid = false; | |
reasons.push( | |
"One or more models are incorrectly specified. Please refer to 'sample.json' on the format for a model.", | |
); | |
} | |
// Step : Validate metrics releated requirements | |
if (!data.hasOwnProperty('metrics')) { | |
valid = false; | |
reasons.push("Missing mandatory 'metrics' information."); | |
} | |
if ( | |
data.hasOwnProperty('metrics') && | |
!data.metrics.every((metric) => isValidMetric(metric)) | |
) { | |
valid = false; | |
reasons.push( | |
"One or more metrics are incorrectly specified. Please refer to 'sample.json' on the format for a metric.", | |
); | |
} | |
// Step : Validate documents releated requirements | |
if (!data.hasOwnProperty('documents')) { | |
valid = false; | |
reasons.push("Missing mandatory 'documents' information."); | |
} | |
if ( | |
data.hasOwnProperty('documents') && | |
!data.documents.every((document) => isValidDocument(document)) | |
) { | |
valid = false; | |
reasons.push( | |
"One or more documents are incorrectly specified. Please refer to 'sample.json' on the format for a document.", | |
); | |
} | |
// Step : Validate tasks releated requirements | |
if (!data.hasOwnProperty('tasks')) { | |
valid = false; | |
reasons.push("Missing mandatory 'tasks' information."); | |
} | |
if ( | |
data.hasOwnProperty('tasks') && | |
!data.tasks.every((task) => isValidTask(task)) | |
) { | |
valid = false; | |
reasons.push( | |
"One or more tasks are incorrectly specified. Please refer to 'sample.json' on the format for a task.", | |
); | |
} | |
// Step : Validate evaluations releated requirements | |
if (!data.hasOwnProperty('evaluations')) { | |
valid = false; | |
reasons.push("Missing mandatory 'evaluations' information."); | |
} | |
return { valid: valid, reasons: reasons }; | |
} | |