Skip to content

Commit 13bc5d3

Browse files
committed
feat(sdk): add synonym field mapping for experiment evaluator inputs
1 parent 0a8d91a commit 13bc5d3

File tree

2 files changed

+40
-10
lines changed

2 files changed

+40
-10
lines changed

packages/traceloop-sdk/src/lib/client/experiment/experiment.ts

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ import {
66
validateAndNormalizeTaskOutput,
77
type EvaluatorWithRequiredFields,
88
} from "../evaluator/field-mapping";
9+
import {
10+
EVALUATOR_SCHEMAS,
11+
isValidEvaluatorSlug,
12+
} from "../../generated/evaluators/registry";
913
import type {
1014
ExperimentTaskFunction,
1115
ExperimentRunOptions,
@@ -423,12 +427,23 @@ export class Experiment {
423427
private getEvaluatorsForFieldsValidation(
424428
evaluators: EvaluatorDetails[],
425429
): EvaluatorWithRequiredFields[] {
426-
return evaluators.filter(
427-
(e): e is EvaluatorWithConfig =>
428-
typeof e === "object" &&
429-
Array.isArray((e as EvaluatorWithConfig).requiredInputFields) &&
430-
((e as EvaluatorWithConfig).requiredInputFields as string[]).length > 0,
431-
);
430+
return evaluators
431+
.filter((e) => typeof e === "object")
432+
.map((e) => {
433+
const evaluator = e as EvaluatorWithConfig;
434+
const schema = isValidEvaluatorSlug(evaluator.name)
435+
? EVALUATOR_SCHEMAS[evaluator.name]
436+
: undefined;
437+
return {
438+
name: evaluator.name,
439+
requiredInputFields: schema?.requiredInputFields,
440+
};
441+
})
442+
.filter(
443+
(e): e is { name: string; requiredInputFields: string[] } =>
444+
Array.isArray(e.requiredInputFields) &&
445+
e.requiredInputFields.length > 0,
446+
);
432447
}
433448

434449
/**

scripts/codegen/generate-evaluator-models.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import type { OpenAPI, OpenAPIV2, OpenAPIV3 } from "openapi-types";
1717
interface EvaluatorDefinition {
1818
slug: string;
1919
requestSchemaName?: string;
20+
requestSchemaInSpec?: boolean;
2021
requestSchema?: OpenAPIV3.SchemaObject;
2122
description?: string;
2223
}
@@ -237,10 +238,16 @@ export function isValidEvaluatorSlug(slug: string): slug is EvaluatorSlug {
237238
function generateMbtEvaluatorsFile(
238239
evaluators: EvaluatorDefinition[],
239240
isSwagger2: boolean,
241+
availableSchemas: Record<string, unknown>,
240242
): string {
241243
// Generate type aliases for configs
242244
const typeAliases = evaluators
243-
.filter((e) => hasConfigFields(e) && e.requestSchemaName)
245+
.filter(
246+
(e) =>
247+
hasConfigFields(e) &&
248+
e.requestSchemaName &&
249+
availableSchemas[e.requestSchemaName],
250+
)
244251
.map((e) => {
245252
const typeName = `${slugToClassName(e.slug)}Config`;
246253
const typePath = isSwagger2
@@ -255,8 +262,12 @@ function generateMbtEvaluatorsFile(
255262
.map((e) => {
256263
const methodName = slugToCamelCase(e.slug);
257264
const className = slugToClassName(e.slug);
258-
const hasConfig = hasConfigFields(e) && e.requestSchemaName;
259-
const configType = hasConfig ? `${className}Config` : null;
265+
const hasConfig = hasConfigFields(e);
266+
const configType = hasConfig
267+
? e.requestSchemaName && availableSchemas[e.requestSchemaName]
268+
? `${className}Config`
269+
: "Record<string, unknown>"
270+
: null;
260271

261272
const { requiredInputFields } = e.requestSchema
262273
? extractFieldsFromSchema(e.requestSchema)
@@ -590,9 +601,13 @@ async function main(): Promise<void> {
590601
);
591602
console.log(` - registry.ts`);
592603

604+
const filteredSchemas = (
605+
filteredSpec as { components: { schemas: Record<string, unknown> } }
606+
).components.schemas;
607+
593608
fs.writeFileSync(
594609
path.join(outputDir, "mbt-evaluators.ts"),
595-
generateMbtEvaluatorsFile(evaluators, isSwagger2),
610+
generateMbtEvaluatorsFile(evaluators, isSwagger2, filteredSchemas),
596611
);
597612
console.log(` - mbt-evaluators.ts`);
598613

0 commit comments

Comments
 (0)