Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 0 additions & 23 deletions src/assets/evaluators/autoevals-lambda/README.md

This file was deleted.

15 changes: 0 additions & 15 deletions src/assets/evaluators/autoevals-lambda/execution-role-policy.json

This file was deleted.

37 changes: 0 additions & 37 deletions src/assets/evaluators/autoevals-lambda/lambda_function.py

This file was deleted.

23 changes: 0 additions & 23 deletions src/assets/evaluators/autoevals-lambda/pyproject.toml

This file was deleted.

23 changes: 0 additions & 23 deletions src/assets/evaluators/deepeval-lambda/README.md

This file was deleted.

15 changes: 0 additions & 15 deletions src/assets/evaluators/deepeval-lambda/execution-role-policy.json

This file was deleted.

29 changes: 0 additions & 29 deletions src/assets/evaluators/deepeval-lambda/lambda_function.py

This file was deleted.

22 changes: 0 additions & 22 deletions src/assets/evaluators/deepeval-lambda/pyproject.toml

This file was deleted.

6 changes: 5 additions & 1 deletion src/assets/evaluators/python-lambda/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,11 @@ with your own logic.
- `pyproject.toml` — Python dependencies, managed with
[uv](https://docs.astral.sh/uv/).
- `execution-role-policy.json` — extra IAM the evaluator Lambda gets at runtime.
Add statements here for anything your logic calls (DynamoDB, S3, …).
Add statements here for anything your logic calls (Bedrock, DynamoDB, S3, …).

Third-party evaluation libraries are ordinary application dependencies. Add
them to `pyproject.toml`, configure them in `lambda_function.py`, and grant any
required permissions in `execution-role-policy.json`.

## Write your evaluator

Expand Down
40 changes: 6 additions & 34 deletions src/core/project/templates/evaluator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,12 @@ import type { AssetSource } from "../source";
import type { Evaluator } from "../../../projectSchemas/evaluator";
import type { TemplateRenderer, TemplateResolver } from "./types";
import { toPythonPackageName } from "../fsUtils";
import type {
EvaluatorLibrary,
ManagedEvaluatorScaffoldInput,
} from "../../../handlers/project/types";
import type { ManagedEvaluatorScaffoldInput } from "../../../handlers/project/types";

const DEFAULT_TIMEOUT = 60;

const EVALUATOR_ASSETS: Record<
EvaluatorLibrary,
{ assetDir: string; defaultTimeoutSeconds: number }
> = {
deepeval: { assetDir: "evaluators/deepeval-lambda", defaultTimeoutSeconds: 300 },
autoevals: { assetDir: "evaluators/autoevals-lambda", defaultTimeoutSeconds: DEFAULT_TIMEOUT },
};

const EMPTY_ASSET_DIR = "evaluators/python-lambda";
const ASSET_DIR = "evaluators/python-lambda";

function buildManagedEvaluatorSpec(input: ManagedEvaluatorScaffoldInput): Evaluator {
const timeoutSeconds =
input.timeoutSeconds ??
(input.metric ? EVALUATOR_ASSETS[input.metric.library].defaultTimeoutSeconds : DEFAULT_TIMEOUT);
return {
name: input.name,
level: input.level,
Expand All @@ -33,7 +18,7 @@ function buildManagedEvaluatorSpec(input: ManagedEvaluatorScaffoldInput): Evalua
managed: {
codeLocation: `app/${input.name}`,
entrypoint: "lambda_function.handler",
timeoutSeconds,
timeoutSeconds: input.timeoutSeconds ?? DEFAULT_TIMEOUT,
additionalPolicies: ["execution-role-policy.json"],
},
},
Expand All @@ -43,17 +28,6 @@ function buildManagedEvaluatorSpec(input: ManagedEvaluatorScaffoldInput): Evalua
};
}

function buildRenderContext(input: ManagedEvaluatorScaffoldInput): Record<string, unknown> {
const context: Record<string, unknown> = { Name: toPythonPackageName(input.name) };
if (input.metric) {
context["EvaluatorClass"] = input.metric.metricClass;
context["Model"] = input.model ?? "";
context["ModelProviderBedrock"] = input.model !== undefined;
context["EvaluatorParams"] = "";
}
return context;
}

type GetEvaluatorTemplateResolverConfig = {
assetSource: AssetSource;
templateRenderer: TemplateRenderer;
Expand All @@ -64,15 +38,13 @@ export function getEvaluatorTemplateResolver(
): TemplateResolver<ManagedEvaluatorScaffoldInput> {
return {
async resolve(input) {
const assetDir = input.metric
? EVALUATOR_ASSETS[input.metric.library].assetDir
: EMPTY_ASSET_DIR;
const tree = await FsTreeNode.fromAssetSource(
{ assetSource: config.assetSource },
{ assetDir },
{ assetDir: ASSET_DIR },
{
rootDirName: input.name,
transformContent: (raw) => config.templateRenderer.render(raw, buildRenderContext(input)),
transformContent: (raw) =>
config.templateRenderer.render(raw, { Name: toPythonPackageName(input.name) }),
},
);
return { tree, spec: { evaluators: [buildManagedEvaluatorSpec(input)] } };
Expand Down
Loading
Loading