anpord 0.1.21 → 0.1.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api-context.d.cts +1 -1
- package/dist/api-context.d.mts +1 -1
- package/dist/{api-mocks-BenVx0e8.d.cts → api-mocks-ofqP55P_.d.cts} +2 -2
- package/dist/{api-mocks-BenVx0e8.d.mts → api-mocks-ofqP55P_.d.mts} +2 -2
- package/dist/api-runtime.d.cts +1 -1
- package/dist/api-runtime.d.mts +1 -1
- package/dist/api.d.cts +1 -1
- package/dist/api.d.mts +1 -1
- package/dist/bin.cjs +51 -40
- package/dist/bin.mjs +51 -40
- package/dist/{client-CsGxLUZq.d.cts → client-B3LQU8cc.d.cts} +576 -280
- package/dist/{client-BZDftC1x.cjs → client-CWVAt_wk.cjs} +1 -1
- package/dist/{client-D0l3kwWV.mjs → client-CfPf0hIc.mjs} +1 -1
- package/dist/{client-C7iEhiDm.d.mts → client-Cg1qFD01.d.mts} +576 -280
- package/dist/{compiler-Cy85vNbp.cjs → compiler-B1UrHfCL.cjs} +18 -1
- package/dist/{compiler-DSQRHvXS.mjs → compiler-D9jidpZ0.mjs} +13 -2
- package/dist/config.cjs +1 -1
- package/dist/config.d.cts +1 -1
- package/dist/config.d.mts +1 -1
- package/dist/config.mjs +1 -1
- package/dist/eval.cjs +1 -1
- package/dist/eval.d.cts +1 -1
- package/dist/eval.d.mts +1 -1
- package/dist/eval.mjs +1 -1
- package/dist/{evals-api-CNoLlXL5.cjs → evals-api-DUiZWsyC.cjs} +54 -1
- package/dist/{evals-api-CK3F1KoI.mjs → evals-api-NLUUV9tM.mjs} +54 -1
- package/dist/index.cjs +3 -2
- package/dist/index.d.cts +4 -3
- package/dist/index.d.mts +4 -3
- package/dist/index.mjs +3 -3
- package/dist/{types-Dvd_z5ge.d.cts → types-BnCBSiXY.d.cts} +12 -3
- package/dist/{types-D-h67MVJ.d.mts → types-DiNkJRDh.d.mts} +12 -3
- package/dist/validator-runtime.d.cts +1 -1
- package/dist/validator-runtime.d.mts +1 -1
- package/package.json +1 -1
package/dist/api-context.d.cts
CHANGED
package/dist/api-context.d.mts
CHANGED
|
@@ -57,11 +57,11 @@ declare const ApiCall_base: Schema.Class<ApiCall, {
|
|
|
57
57
|
truncated: typeof Schema.Boolean;
|
|
58
58
|
}>>>;
|
|
59
59
|
}>, never, {
|
|
60
|
+
readonly api: string;
|
|
61
|
+
} & {
|
|
60
62
|
readonly status: number;
|
|
61
63
|
} & {
|
|
62
64
|
readonly startedAt: number;
|
|
63
|
-
} & {
|
|
64
|
-
readonly api: string;
|
|
65
65
|
} & {
|
|
66
66
|
readonly path: string;
|
|
67
67
|
} & {
|
|
@@ -57,11 +57,11 @@ declare const ApiCall_base: Schema.Class<ApiCall, {
|
|
|
57
57
|
truncated: typeof Schema.Boolean;
|
|
58
58
|
}>>>;
|
|
59
59
|
}>, never, {
|
|
60
|
+
readonly api: string;
|
|
61
|
+
} & {
|
|
60
62
|
readonly status: number;
|
|
61
63
|
} & {
|
|
62
64
|
readonly startedAt: number;
|
|
63
|
-
} & {
|
|
64
|
-
readonly api: string;
|
|
65
65
|
} & {
|
|
66
66
|
readonly path: string;
|
|
67
67
|
} & {
|
package/dist/api-runtime.d.cts
CHANGED
package/dist/api-runtime.d.mts
CHANGED
package/dist/api.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as ApiCall } from "./api-mocks-
|
|
1
|
+
import { t as ApiCall } from "./api-mocks-ofqP55P_.cjs";
|
|
2
2
|
import { a as endpoint, i as api, n as ApiHandlerContext, r as EndpointDefinition, t as ApiDefinition } from "./define-NZvmQuIv.cjs";
|
|
3
3
|
import { withApi } from "./api-runtime.cjs";
|
|
4
4
|
export { type ApiCall, type ApiDefinition, type ApiHandlerContext, type EndpointDefinition, api, endpoint, withApi };
|
package/dist/api.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as ApiCall } from "./api-mocks-
|
|
1
|
+
import { t as ApiCall } from "./api-mocks-ofqP55P_.mjs";
|
|
2
2
|
import { a as endpoint, i as api, n as ApiHandlerContext, r as EndpointDefinition, t as ApiDefinition } from "./define-NZvmQuIv.mjs";
|
|
3
3
|
import { withApi } from "./api-runtime.mjs";
|
|
4
4
|
export { type ApiCall, type ApiDefinition, type ApiHandlerContext, type EndpointDefinition, api, endpoint, withApi };
|
package/dist/bin.cjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
const require_eval_validations = require("./eval-validations-CZm7vVtQ.cjs");
|
|
3
3
|
const require_api_mocks = require("./api-mocks-CgiC7T9U.cjs");
|
|
4
|
-
const require_client = require("./client-
|
|
5
|
-
const require_evals_api = require("./evals-api-
|
|
4
|
+
const require_client = require("./client-CWVAt_wk.cjs");
|
|
5
|
+
const require_evals_api = require("./evals-api-DUiZWsyC.cjs");
|
|
6
6
|
const require_eval_turns = require("./eval-turns-DcJ8_1qr.cjs");
|
|
7
7
|
const require_errors = require("./errors-BX1wry8K.cjs");
|
|
8
8
|
const require_config = require("./config.cjs");
|
|
9
|
-
const require_compiler = require("./compiler-
|
|
9
|
+
const require_compiler = require("./compiler-B1UrHfCL.cjs");
|
|
10
10
|
let effect = require("effect");
|
|
11
11
|
let _effect_platform = require("@effect/platform");
|
|
12
12
|
let node_fs_promises = require("node:fs/promises");
|
|
@@ -19,7 +19,7 @@ let yaml = require("yaml");
|
|
|
19
19
|
let node_crypto = require("node:crypto");
|
|
20
20
|
let node_child_process = require("node:child_process");
|
|
21
21
|
//#region package.json
|
|
22
|
-
var version$1 = "0.1.
|
|
22
|
+
var version$1 = "0.1.23";
|
|
23
23
|
//#endregion
|
|
24
24
|
//#region ../template/src/extract.ts
|
|
25
25
|
/** Reads escapes too, so text the renderer leaves literal is never reported as
|
|
@@ -653,6 +653,31 @@ const importEval = _effect_cli.Command.make("import", {
|
|
|
653
653
|
return yield* note(summaryOf(suite.tally));
|
|
654
654
|
}).pipe(effect.Effect.withSpan("Cli.evalImport"))).pipe(_effect_cli.Command.withDescription("Turn a case file a team already wrote into a suite"));
|
|
655
655
|
//#endregion
|
|
656
|
+
//#region ../eval/src/credentials/errors.ts
|
|
657
|
+
var CredentialError = class extends effect.Data.TaggedError("CredentialError") {};
|
|
658
|
+
//#endregion
|
|
659
|
+
//#region ../eval/src/credentials/resolver.ts
|
|
660
|
+
var CredentialResolver = class extends effect.Context.Tag("@anpord/eval/CredentialResolver")() {};
|
|
661
|
+
//#endregion
|
|
662
|
+
//#region ../eval/src/credentials/env-resolver.ts
|
|
663
|
+
const environment = () => Object.fromEntries(Object.entries(process.env).flatMap(([name, value]) => value === void 0 ? [] : [[name, value]]));
|
|
664
|
+
const resolved = (integrationId, values) => effect.Redacted.make({
|
|
665
|
+
authMethodId: "env",
|
|
666
|
+
connectionId: "local",
|
|
667
|
+
integrationId,
|
|
668
|
+
revision: 0,
|
|
669
|
+
values
|
|
670
|
+
});
|
|
671
|
+
const credentialResolverFrom = (values) => effect.Layer.succeed(CredentialResolver, CredentialResolver.of({
|
|
672
|
+
persist: () => effect.Effect.void,
|
|
673
|
+
resolve: ({ integrationId }) => effect.Effect.succeed(resolved(integrationId, values)),
|
|
674
|
+
resolveBound: ({ connectionId }) => effect.Effect.fail(new CredentialError({
|
|
675
|
+
code: "not-found",
|
|
676
|
+
message: `a local run has no stored connection, so ${connectionId} cannot be read`
|
|
677
|
+
}))
|
|
678
|
+
}));
|
|
679
|
+
const CredentialResolverFromEnv = effect.Layer.suspend(() => credentialResolverFrom(environment()));
|
|
680
|
+
//#endregion
|
|
656
681
|
//#region ../eval/src/domain/harness-profile.ts
|
|
657
682
|
const profileOfRequest = (profile) => profile === void 0 ? null : {
|
|
658
683
|
env: profile.env ?? null,
|
|
@@ -3244,9 +3269,6 @@ const modelAccessFor = (credentials, organizationId) => effect.Effect.gen(functi
|
|
|
3244
3269
|
})));
|
|
3245
3270
|
});
|
|
3246
3271
|
//#endregion
|
|
3247
|
-
//#region ../eval/src/credentials/resolver.ts
|
|
3248
|
-
var CredentialResolver = class extends effect.Context.Tag("@anpord/eval/CredentialResolver")() {};
|
|
3249
|
-
//#endregion
|
|
3250
3272
|
//#region ../eval/src/ports/simulated-user.ts
|
|
3251
3273
|
var SimulatedUser = class extends effect.Context.Tag("@anpord/eval/SimulatedUser")() {};
|
|
3252
3274
|
effect.Layer.succeed(SimulatedUser, { reply: () => effect.Effect.succeedNone });
|
|
@@ -3300,26 +3322,6 @@ const makeLlmUser = effect.Effect.gen(function* () {
|
|
|
3300
3322
|
});
|
|
3301
3323
|
const SimulatedUserLive = effect.Layer.effect(SimulatedUser, makeLlmUser);
|
|
3302
3324
|
//#endregion
|
|
3303
|
-
//#region ../eval/src/credentials/errors.ts
|
|
3304
|
-
var CredentialError = class extends effect.Data.TaggedError("CredentialError") {};
|
|
3305
|
-
//#endregion
|
|
3306
|
-
//#region ../eval/src/credentials/env-resolver.ts
|
|
3307
|
-
const resolved = (integrationId) => effect.Redacted.make({
|
|
3308
|
-
authMethodId: "env",
|
|
3309
|
-
connectionId: "local",
|
|
3310
|
-
integrationId,
|
|
3311
|
-
revision: 0,
|
|
3312
|
-
values: Object.fromEntries(Object.entries(process.env).flatMap(([name, value]) => value === void 0 ? [] : [[name, value]]))
|
|
3313
|
-
});
|
|
3314
|
-
const CredentialResolverFromEnv = effect.Layer.succeed(CredentialResolver, CredentialResolver.of({
|
|
3315
|
-
persist: () => effect.Effect.void,
|
|
3316
|
-
resolve: ({ integrationId }) => effect.Effect.succeed(resolved(integrationId)),
|
|
3317
|
-
resolveBound: ({ connectionId }) => effect.Effect.fail(new CredentialError({
|
|
3318
|
-
code: "not-found",
|
|
3319
|
-
message: `a local run has no stored connection, so ${connectionId} cannot be read`
|
|
3320
|
-
}))
|
|
3321
|
-
}));
|
|
3322
|
-
//#endregion
|
|
3323
3325
|
//#region ../eval/src/ports/sandbox.ts
|
|
3324
3326
|
var SandboxProvider = class extends effect.Context.Tag("@anpord/eval/SandboxProvider")() {};
|
|
3325
3327
|
var SandboxAdapters = class extends effect.Context.Tag("@anpord/eval/SandboxAdapters")() {};
|
|
@@ -4483,7 +4485,8 @@ const SandboxProviderLive = effect.Layer.effect(SandboxProvider, effect.Effect.g
|
|
|
4483
4485
|
//#endregion
|
|
4484
4486
|
//#region ../eval/src/local-layer.ts
|
|
4485
4487
|
const LocalAdaptersLive = effect.Layer.effect(SandboxAdapters, effect.Effect.map(effect.Effect.cached(makeLocalAdapter), (local) => SandboxAdapters.of({ resolve: (provider) => provider === "local" ? local : effect.Effect.dieMessage(`a local run cannot open a ${provider} sandbox`) })));
|
|
4486
|
-
const
|
|
4488
|
+
const evalLocalWith = (credentials) => LocalTrialsLive.pipe(effect.Layer.provide(AgentTrialJudgedLive.pipe(effect.Layer.provide(AgentTrialLive.pipe(effect.Layer.provide(ScorerChecksLive.pipe(effect.Layer.provide(ScorerGroundTruthLive))), effect.Layer.provide(SuspenderSleeping), effect.Layer.provide(SimulatedUserLive.pipe(effect.Layer.provide(_effect_platform.FetchHttpClient.layer))))), effect.Layer.provide(JudgeModelLive.pipe(effect.Layer.provide(_effect_platform.FetchHttpClient.layer))), effect.Layer.provide(effect.Layer.mergeAll(HarnessesLive, HarnessVersionsLive)))), effect.Layer.provide(credentials), effect.Layer.provide(SandboxProviderLive.pipe(effect.Layer.provide(LocalAdaptersLive))), effect.Layer.provideMerge(HarnessVersionsLive));
|
|
4489
|
+
const EvalLocalLive = evalLocalWith(CredentialResolverFromEnv);
|
|
4487
4490
|
//#endregion
|
|
4488
4491
|
//#region src/cli/local-env.ts
|
|
4489
4492
|
const FILES = [".env.local", ".env"];
|
|
@@ -4509,25 +4512,27 @@ const read = (directory, file) => {
|
|
|
4509
4512
|
const localEnv = (directory) => Object.assign({}, ...FILES.map((file) => read(directory, file)).reverse(), parse(Object.entries(process.env).map(([name, value]) => `${name}=${value ?? ""}`).join("\n")));
|
|
4510
4513
|
//#endregion
|
|
4511
4514
|
//#region src/cli/eval-local.ts
|
|
4512
|
-
const runLocally = (request,
|
|
4515
|
+
const runLocally = (request, options = {}) => effect.Effect.gen(function* () {
|
|
4513
4516
|
const trials = yield* LocalTrials;
|
|
4517
|
+
const versions = yield* HarnessVersions;
|
|
4514
4518
|
const forwarded = localEnv(process.cwd());
|
|
4515
4519
|
const task = request.tasks[0];
|
|
4516
4520
|
if (task === void 0) return [];
|
|
4521
|
+
const harnessVersion = yield* versions.version(task.harness);
|
|
4517
4522
|
return yield* effect.Effect.forEach(request.cases, (subject) => trials.run({
|
|
4518
4523
|
caseName: subject.name,
|
|
4519
4524
|
forwarded,
|
|
4520
4525
|
harness: task.harness,
|
|
4521
|
-
harnessVersion
|
|
4526
|
+
harnessVersion,
|
|
4522
4527
|
model: task.model,
|
|
4523
4528
|
prepare: subject.prepare ?? null,
|
|
4524
4529
|
profile: profileOfRequest(task.profile),
|
|
4525
4530
|
prompt: request.prompt,
|
|
4526
|
-
source: { kind: "empty" },
|
|
4531
|
+
source: subject.source ?? { kind: "empty" },
|
|
4527
4532
|
user: subject.user ?? null,
|
|
4528
4533
|
validator: subject.validator ?? null,
|
|
4529
4534
|
verifyCommand: subject.verify
|
|
4530
|
-
}).pipe(effect.Effect.tap((outcome) => onTrial?.({
|
|
4535
|
+
}).pipe(effect.Effect.tap((outcome) => options.onTrial?.({
|
|
4531
4536
|
caseName: subject.name,
|
|
4532
4537
|
events: outcome.events,
|
|
4533
4538
|
ordinal: 0,
|
|
@@ -4540,7 +4545,7 @@ const runLocally = (request, onTrial) => effect.Effect.gen(function* () {
|
|
|
4540
4545
|
name: subject.name,
|
|
4541
4546
|
status: outcome.outcome.status
|
|
4542
4547
|
}))), { concurrency: 1 });
|
|
4543
|
-
}).pipe(effect.Effect.provide(EvalLocalLive), effect.Effect.scoped, effect.Effect.withConfigProvider(effect.ConfigProvider.fromEnv().pipe(effect.ConfigProvider.orElse(() => effect.ConfigProvider.fromMap(/* @__PURE__ */ new Map([["ANPORD_LOCAL_SANDBOX", "true"]]))))));
|
|
4548
|
+
}).pipe(effect.Effect.provide(options.credentials === void 0 ? EvalLocalLive : evalLocalWith(credentialResolverFrom(options.credentials))), effect.Effect.scoped, effect.Effect.withConfigProvider(effect.ConfigProvider.fromEnv().pipe(effect.ConfigProvider.orElse(() => effect.ConfigProvider.fromMap(/* @__PURE__ */ new Map([["ANPORD_LOCAL_SANDBOX", "true"]]))))));
|
|
4544
4549
|
const seconds = (ms) => `${(ms / 1e3).toFixed(1)}s`;
|
|
4545
4550
|
const reportLocal = (file, cases) => effect.Effect.forEach([`${file}: ${cases.length} case(s) on this machine`, ...cases.map((one) => ` ${one.status} ${one.name} ${seconds(one.durationMs)}`)], note);
|
|
4546
4551
|
const localProblems = (cases) => cases.flatMap((one) => one.status === "passed" ? [] : [`${one.name} ${one.status}`]);
|
|
@@ -4819,13 +4824,19 @@ const recordedLocally = (file) => effect.Effect.gen(function* () {
|
|
|
4819
4824
|
trigger
|
|
4820
4825
|
} });
|
|
4821
4826
|
yield* reportStarted(file, started.id);
|
|
4822
|
-
|
|
4823
|
-
|
|
4824
|
-
|
|
4825
|
-
|
|
4826
|
-
|
|
4827
|
-
return
|
|
4828
|
-
|
|
4827
|
+
yield* effect.Effect.addFinalizer(() => api.evals.finishRun({ payload: { id: started.id } }).pipe(effect.Effect.ignore));
|
|
4828
|
+
const leased = yield* api.evals.credentials({ payload: {
|
|
4829
|
+
harness: payload.tasks[0]?.harness ?? "codex",
|
|
4830
|
+
id: started.id
|
|
4831
|
+
} }).pipe(effect.Effect.map((lease) => lease.values), effect.Effect.catchAll(() => effect.Effect.succeed(void 0)));
|
|
4832
|
+
return yield* runLocally(payload, {
|
|
4833
|
+
credentials: leased,
|
|
4834
|
+
onTrial: (trial) => api.evals.reportTrial({ payload: {
|
|
4835
|
+
id: started.id,
|
|
4836
|
+
trial
|
|
4837
|
+
} }).pipe(effect.Effect.ignore)
|
|
4838
|
+
});
|
|
4839
|
+
}).pipe(effect.Effect.scoped, effect.Effect.provide(require_config.ClientLayer));
|
|
4829
4840
|
const runOneEvalLocally = (file) => require_config.apiKeyConfig.pipe(effect.Effect.matchEffect({
|
|
4830
4841
|
onFailure: () => require_compiler.compileEvalEffect(file).pipe(effect.Effect.flatMap((payload) => runLocally(payload))),
|
|
4831
4842
|
onSuccess: () => recordedLocally(file)
|
package/dist/bin.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { c as validationExecution, i as VALIDATION_TEXT_LIMIT, l as validationSnapshot, r as VALIDATION_FRAME, s as validationCapture, t as EvalValidation } from "./eval-validations-DNO-qwkU.mjs";
|
|
3
3
|
import { a as ApiCall, i as API_READY, o as ApiManifest, r as API_PROGRAM, s as ApiProgram, t as API_JOURNAL } from "./api-mocks-BYWvJp9v.mjs";
|
|
4
|
-
import { a as ChannelName, o as PromptId, s as VersionNumber, t as AnpordApi } from "./client-
|
|
5
|
-
import { a as EvalSandbox, i as EvalRun, p as EvalTrigger, r as HarnessEvent } from "./evals-api-
|
|
4
|
+
import { a as ChannelName, o as PromptId, s as VersionNumber, t as AnpordApi } from "./client-CfPf0hIc.mjs";
|
|
5
|
+
import { a as EvalSandbox, i as EvalRun, p as EvalTrigger, r as HarnessEvent } from "./evals-api-NLUUV9tM.mjs";
|
|
6
6
|
import { t as DEFAULT_USER_MODEL } from "./eval-turns-BC-GMHD-.mjs";
|
|
7
7
|
import { i as tokenMatcher, r as asAnpordError } from "./errors-B0YknR5V.mjs";
|
|
8
8
|
import { ClientLayer, apiKeyConfig, webUrlConfig } from "./config.mjs";
|
|
9
|
-
import { r as compileEvalEffect } from "./compiler-
|
|
9
|
+
import { r as compileEvalEffect } from "./compiler-D9jidpZ0.mjs";
|
|
10
10
|
import { Array as Array$1, Cause, Chunk, Clock, Config, ConfigProvider, Console, Context, Data, Deferred, Duration, Effect, Fiber, JSONSchema, Layer, Option, ParseResult, Random, Redacted, Ref, Schedule, Schema, Stream, pipe } from "effect";
|
|
11
11
|
import { FetchHttpClient, FileSystem, HttpClient, HttpClientError, HttpClientRequest, HttpClientResponse } from "@effect/platform";
|
|
12
12
|
import { cp, mkdir, mkdtemp, readFile, rm, stat, writeFile } from "node:fs/promises";
|
|
@@ -19,7 +19,7 @@ import { parseDocument } from "yaml";
|
|
|
19
19
|
import { createHash } from "node:crypto";
|
|
20
20
|
import { spawn } from "node:child_process";
|
|
21
21
|
//#region package.json
|
|
22
|
-
var version$1 = "0.1.
|
|
22
|
+
var version$1 = "0.1.23";
|
|
23
23
|
//#endregion
|
|
24
24
|
//#region ../template/src/extract.ts
|
|
25
25
|
/** Reads escapes too, so text the renderer leaves literal is never reported as
|
|
@@ -653,6 +653,31 @@ const importEval = Command.make("import", {
|
|
|
653
653
|
return yield* note(summaryOf(suite.tally));
|
|
654
654
|
}).pipe(Effect.withSpan("Cli.evalImport"))).pipe(Command.withDescription("Turn a case file a team already wrote into a suite"));
|
|
655
655
|
//#endregion
|
|
656
|
+
//#region ../eval/src/credentials/errors.ts
|
|
657
|
+
var CredentialError = class extends Data.TaggedError("CredentialError") {};
|
|
658
|
+
//#endregion
|
|
659
|
+
//#region ../eval/src/credentials/resolver.ts
|
|
660
|
+
var CredentialResolver = class extends Context.Tag("@anpord/eval/CredentialResolver")() {};
|
|
661
|
+
//#endregion
|
|
662
|
+
//#region ../eval/src/credentials/env-resolver.ts
|
|
663
|
+
const environment = () => Object.fromEntries(Object.entries(process.env).flatMap(([name, value]) => value === void 0 ? [] : [[name, value]]));
|
|
664
|
+
const resolved = (integrationId, values) => Redacted.make({
|
|
665
|
+
authMethodId: "env",
|
|
666
|
+
connectionId: "local",
|
|
667
|
+
integrationId,
|
|
668
|
+
revision: 0,
|
|
669
|
+
values
|
|
670
|
+
});
|
|
671
|
+
const credentialResolverFrom = (values) => Layer.succeed(CredentialResolver, CredentialResolver.of({
|
|
672
|
+
persist: () => Effect.void,
|
|
673
|
+
resolve: ({ integrationId }) => Effect.succeed(resolved(integrationId, values)),
|
|
674
|
+
resolveBound: ({ connectionId }) => Effect.fail(new CredentialError({
|
|
675
|
+
code: "not-found",
|
|
676
|
+
message: `a local run has no stored connection, so ${connectionId} cannot be read`
|
|
677
|
+
}))
|
|
678
|
+
}));
|
|
679
|
+
const CredentialResolverFromEnv = Layer.suspend(() => credentialResolverFrom(environment()));
|
|
680
|
+
//#endregion
|
|
656
681
|
//#region ../eval/src/domain/harness-profile.ts
|
|
657
682
|
const profileOfRequest = (profile) => profile === void 0 ? null : {
|
|
658
683
|
env: profile.env ?? null,
|
|
@@ -3244,9 +3269,6 @@ const modelAccessFor = (credentials, organizationId) => Effect.gen(function* ()
|
|
|
3244
3269
|
})));
|
|
3245
3270
|
});
|
|
3246
3271
|
//#endregion
|
|
3247
|
-
//#region ../eval/src/credentials/resolver.ts
|
|
3248
|
-
var CredentialResolver = class extends Context.Tag("@anpord/eval/CredentialResolver")() {};
|
|
3249
|
-
//#endregion
|
|
3250
3272
|
//#region ../eval/src/ports/simulated-user.ts
|
|
3251
3273
|
var SimulatedUser = class extends Context.Tag("@anpord/eval/SimulatedUser")() {};
|
|
3252
3274
|
Layer.succeed(SimulatedUser, { reply: () => Effect.succeedNone });
|
|
@@ -3300,26 +3322,6 @@ const makeLlmUser = Effect.gen(function* () {
|
|
|
3300
3322
|
});
|
|
3301
3323
|
const SimulatedUserLive = Layer.effect(SimulatedUser, makeLlmUser);
|
|
3302
3324
|
//#endregion
|
|
3303
|
-
//#region ../eval/src/credentials/errors.ts
|
|
3304
|
-
var CredentialError = class extends Data.TaggedError("CredentialError") {};
|
|
3305
|
-
//#endregion
|
|
3306
|
-
//#region ../eval/src/credentials/env-resolver.ts
|
|
3307
|
-
const resolved = (integrationId) => Redacted.make({
|
|
3308
|
-
authMethodId: "env",
|
|
3309
|
-
connectionId: "local",
|
|
3310
|
-
integrationId,
|
|
3311
|
-
revision: 0,
|
|
3312
|
-
values: Object.fromEntries(Object.entries(process.env).flatMap(([name, value]) => value === void 0 ? [] : [[name, value]]))
|
|
3313
|
-
});
|
|
3314
|
-
const CredentialResolverFromEnv = Layer.succeed(CredentialResolver, CredentialResolver.of({
|
|
3315
|
-
persist: () => Effect.void,
|
|
3316
|
-
resolve: ({ integrationId }) => Effect.succeed(resolved(integrationId)),
|
|
3317
|
-
resolveBound: ({ connectionId }) => Effect.fail(new CredentialError({
|
|
3318
|
-
code: "not-found",
|
|
3319
|
-
message: `a local run has no stored connection, so ${connectionId} cannot be read`
|
|
3320
|
-
}))
|
|
3321
|
-
}));
|
|
3322
|
-
//#endregion
|
|
3323
3325
|
//#region ../eval/src/ports/sandbox.ts
|
|
3324
3326
|
var SandboxProvider = class extends Context.Tag("@anpord/eval/SandboxProvider")() {};
|
|
3325
3327
|
var SandboxAdapters = class extends Context.Tag("@anpord/eval/SandboxAdapters")() {};
|
|
@@ -4483,7 +4485,8 @@ const SandboxProviderLive = Layer.effect(SandboxProvider, Effect.gen(function* (
|
|
|
4483
4485
|
//#endregion
|
|
4484
4486
|
//#region ../eval/src/local-layer.ts
|
|
4485
4487
|
const LocalAdaptersLive = Layer.effect(SandboxAdapters, Effect.map(Effect.cached(makeLocalAdapter), (local) => SandboxAdapters.of({ resolve: (provider) => provider === "local" ? local : Effect.dieMessage(`a local run cannot open a ${provider} sandbox`) })));
|
|
4486
|
-
const
|
|
4488
|
+
const evalLocalWith = (credentials) => LocalTrialsLive.pipe(Layer.provide(AgentTrialJudgedLive.pipe(Layer.provide(AgentTrialLive.pipe(Layer.provide(ScorerChecksLive.pipe(Layer.provide(ScorerGroundTruthLive))), Layer.provide(SuspenderSleeping), Layer.provide(SimulatedUserLive.pipe(Layer.provide(FetchHttpClient.layer))))), Layer.provide(JudgeModelLive.pipe(Layer.provide(FetchHttpClient.layer))), Layer.provide(Layer.mergeAll(HarnessesLive, HarnessVersionsLive)))), Layer.provide(credentials), Layer.provide(SandboxProviderLive.pipe(Layer.provide(LocalAdaptersLive))), Layer.provideMerge(HarnessVersionsLive));
|
|
4489
|
+
const EvalLocalLive = evalLocalWith(CredentialResolverFromEnv);
|
|
4487
4490
|
//#endregion
|
|
4488
4491
|
//#region src/cli/local-env.ts
|
|
4489
4492
|
const FILES = [".env.local", ".env"];
|
|
@@ -4509,25 +4512,27 @@ const read = (directory, file) => {
|
|
|
4509
4512
|
const localEnv = (directory) => Object.assign({}, ...FILES.map((file) => read(directory, file)).reverse(), parse(Object.entries(process.env).map(([name, value]) => `${name}=${value ?? ""}`).join("\n")));
|
|
4510
4513
|
//#endregion
|
|
4511
4514
|
//#region src/cli/eval-local.ts
|
|
4512
|
-
const runLocally = (request,
|
|
4515
|
+
const runLocally = (request, options = {}) => Effect.gen(function* () {
|
|
4513
4516
|
const trials = yield* LocalTrials;
|
|
4517
|
+
const versions = yield* HarnessVersions;
|
|
4514
4518
|
const forwarded = localEnv(process.cwd());
|
|
4515
4519
|
const task = request.tasks[0];
|
|
4516
4520
|
if (task === void 0) return [];
|
|
4521
|
+
const harnessVersion = yield* versions.version(task.harness);
|
|
4517
4522
|
return yield* Effect.forEach(request.cases, (subject) => trials.run({
|
|
4518
4523
|
caseName: subject.name,
|
|
4519
4524
|
forwarded,
|
|
4520
4525
|
harness: task.harness,
|
|
4521
|
-
harnessVersion
|
|
4526
|
+
harnessVersion,
|
|
4522
4527
|
model: task.model,
|
|
4523
4528
|
prepare: subject.prepare ?? null,
|
|
4524
4529
|
profile: profileOfRequest(task.profile),
|
|
4525
4530
|
prompt: request.prompt,
|
|
4526
|
-
source: { kind: "empty" },
|
|
4531
|
+
source: subject.source ?? { kind: "empty" },
|
|
4527
4532
|
user: subject.user ?? null,
|
|
4528
4533
|
validator: subject.validator ?? null,
|
|
4529
4534
|
verifyCommand: subject.verify
|
|
4530
|
-
}).pipe(Effect.tap((outcome) => onTrial?.({
|
|
4535
|
+
}).pipe(Effect.tap((outcome) => options.onTrial?.({
|
|
4531
4536
|
caseName: subject.name,
|
|
4532
4537
|
events: outcome.events,
|
|
4533
4538
|
ordinal: 0,
|
|
@@ -4540,7 +4545,7 @@ const runLocally = (request, onTrial) => Effect.gen(function* () {
|
|
|
4540
4545
|
name: subject.name,
|
|
4541
4546
|
status: outcome.outcome.status
|
|
4542
4547
|
}))), { concurrency: 1 });
|
|
4543
|
-
}).pipe(Effect.provide(EvalLocalLive), Effect.scoped, Effect.withConfigProvider(ConfigProvider.fromEnv().pipe(ConfigProvider.orElse(() => ConfigProvider.fromMap(/* @__PURE__ */ new Map([["ANPORD_LOCAL_SANDBOX", "true"]]))))));
|
|
4548
|
+
}).pipe(Effect.provide(options.credentials === void 0 ? EvalLocalLive : evalLocalWith(credentialResolverFrom(options.credentials))), Effect.scoped, Effect.withConfigProvider(ConfigProvider.fromEnv().pipe(ConfigProvider.orElse(() => ConfigProvider.fromMap(/* @__PURE__ */ new Map([["ANPORD_LOCAL_SANDBOX", "true"]]))))));
|
|
4544
4549
|
const seconds = (ms) => `${(ms / 1e3).toFixed(1)}s`;
|
|
4545
4550
|
const reportLocal = (file, cases) => Effect.forEach([`${file}: ${cases.length} case(s) on this machine`, ...cases.map((one) => ` ${one.status} ${one.name} ${seconds(one.durationMs)}`)], note);
|
|
4546
4551
|
const localProblems = (cases) => cases.flatMap((one) => one.status === "passed" ? [] : [`${one.name} ${one.status}`]);
|
|
@@ -4819,13 +4824,19 @@ const recordedLocally = (file) => Effect.gen(function* () {
|
|
|
4819
4824
|
trigger
|
|
4820
4825
|
} });
|
|
4821
4826
|
yield* reportStarted(file, started.id);
|
|
4822
|
-
|
|
4823
|
-
|
|
4824
|
-
|
|
4825
|
-
|
|
4826
|
-
|
|
4827
|
-
return
|
|
4828
|
-
|
|
4827
|
+
yield* Effect.addFinalizer(() => api.evals.finishRun({ payload: { id: started.id } }).pipe(Effect.ignore));
|
|
4828
|
+
const leased = yield* api.evals.credentials({ payload: {
|
|
4829
|
+
harness: payload.tasks[0]?.harness ?? "codex",
|
|
4830
|
+
id: started.id
|
|
4831
|
+
} }).pipe(Effect.map((lease) => lease.values), Effect.catchAll(() => Effect.succeed(void 0)));
|
|
4832
|
+
return yield* runLocally(payload, {
|
|
4833
|
+
credentials: leased,
|
|
4834
|
+
onTrial: (trial) => api.evals.reportTrial({ payload: {
|
|
4835
|
+
id: started.id,
|
|
4836
|
+
trial
|
|
4837
|
+
} }).pipe(Effect.ignore)
|
|
4838
|
+
});
|
|
4839
|
+
}).pipe(Effect.scoped, Effect.provide(ClientLayer));
|
|
4829
4840
|
const runOneEvalLocally = (file) => apiKeyConfig.pipe(Effect.matchEffect({
|
|
4830
4841
|
onFailure: () => compileEvalEffect(file).pipe(Effect.flatMap((payload) => runLocally(payload))),
|
|
4831
4842
|
onSuccess: () => recordedLocally(file)
|