feat: Track inputs and outputs in Evaluations (#17404)

This commit is contained in:
Mutasem Aldmour
2025-07-24 18:58:37 +02:00
committed by GitHub
parent 3f2e43e919
commit c18fabb419
20 changed files with 1431 additions and 60 deletions

View File

@@ -1,5 +1,5 @@
import { Column, Entity, ManyToOne, OneToOne } from '@n8n/typeorm';
import type { IDataObject } from 'n8n-workflow';
import type { IDataObject, JsonObject } from 'n8n-workflow';
import { WithStringId, DateTimeColumn, JsonColumn } from './abstract-entity';
import type { ExecutionEntity } from './execution-entity';
@@ -54,4 +54,10 @@ export class TestCaseExecution extends WithStringId {
@JsonColumn({ nullable: true })
metrics: TestCaseRunMetrics;
@JsonColumn({ nullable: true })
inputs: JsonObject | null;
@JsonColumn({ nullable: true })
outputs: JsonObject | null;
}

View File

@@ -0,0 +1,11 @@
import type { MigrationContext, ReversibleMigration } from '../migration-types';
export class AddInputsOutputsToTestCaseExecution1752669793000 implements ReversibleMigration {
async up({ schemaBuilder: { addColumns, column } }: MigrationContext) {
await addColumns('test_case_execution', [column('inputs').json, column('outputs').json]);
}
async down({ schemaBuilder: { dropColumns } }: MigrationContext) {
await dropColumns('test_case_execution', ['inputs', 'outputs']);
}
}

View File

@@ -88,6 +88,7 @@ import { AddWorkflowArchivedColumn1745934666076 } from '../common/1745934666076-
import { DropRoleTable1745934666077 } from '../common/1745934666077-DropRoleTable';
import { AddProjectDescriptionColumn1747824239000 } from '../common/1747824239000-AddProjectDescriptionColumn';
import { AddLastActiveAtColumnToUser1750252139166 } from '../common/1750252139166-AddLastActiveAtColumnToUser';
import { AddInputsOutputsToTestCaseExecution1752669793000 } from '../common/1752669793000-AddInputsOutputsToTestCaseExecution';
import type { Migration } from '../migration-types';
import { UpdateParentFolderIdColumn1740445074052 } from '../mysqldb/1740445074052-UpdateParentFolderIdColumn';
@@ -183,4 +184,5 @@ export const mysqlMigrations: Migration[] = [
ClearEvaluation1745322634000,
AddProjectDescriptionColumn1747824239000,
AddLastActiveAtColumnToUser1750252139166,
AddInputsOutputsToTestCaseExecution1752669793000,
];

View File

@@ -1,4 +1,5 @@
import { AddMfaColumns1690000000030 } from './../common/1690000000040-AddMfaColumns';
import { AddInputsOutputsToTestCaseExecution1752669793000 } from './../common/1752669793000-AddInputsOutputsToTestCaseExecution';
import { InitialMigration1587669153312 } from './1587669153312-InitialMigration';
import { WebhookModel1589476000887 } from './1589476000887-WebhookModel';
import { CreateIndexStoppedAt1594828256133 } from './1594828256133-CreateIndexStoppedAt';
@@ -181,4 +182,5 @@ export const postgresMigrations: Migration[] = [
ClearEvaluation1745322634000,
AddProjectDescriptionColumn1747824239000,
AddLastActiveAtColumnToUser1750252139166,
AddInputsOutputsToTestCaseExecution1752669793000,
];

View File

@@ -85,7 +85,9 @@ import { AddWorkflowArchivedColumn1745934666076 } from '../common/1745934666076-
import { DropRoleTable1745934666077 } from '../common/1745934666077-DropRoleTable';
import { AddProjectDescriptionColumn1747824239000 } from '../common/1747824239000-AddProjectDescriptionColumn';
import { AddLastActiveAtColumnToUser1750252139166 } from '../common/1750252139166-AddLastActiveAtColumnToUser';
import { AddInputsOutputsToTestCaseExecution1752669793000 } from '../common/1752669793000-AddInputsOutputsToTestCaseExecution';
import type { Migration } from '../migration-types';
const sqliteMigrations: Migration[] = [
InitialMigration1588102412422,
WebhookModel1592445003908,
@@ -174,6 +176,7 @@ const sqliteMigrations: Migration[] = [
ClearEvaluation1745322634000,
AddProjectDescriptionColumn1747824239000,
AddLastActiveAtColumnToUser1750252139166,
AddInputsOutputsToTestCaseExecution1752669793000,
];
export { sqliteMigrations };

View File

@@ -22,7 +22,7 @@ export class TestRunRepository extends Repository<TestRun> {
super(TestRun, dataSource.manager);
}
async createTestRun(workflowId: string) {
async createTestRun(workflowId: string): Promise<TestRun> {
const testRun = this.create({
status: 'new',
workflow: {