niceeval 0.17.1 → 0.19.0
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/INDEX.md +5 -2
- package/dist/adapter-usage.cjs.map +1 -1
- package/dist/adapter-usage.d.cts +1 -1
- package/dist/adapter-usage.d.mts +1 -1
- package/dist/adapter-usage.d.ts +1 -1
- package/dist/adapter.cjs +8 -3
- package/dist/adapter.cjs.map +1 -1
- package/dist/adapter.d.cts +26 -15
- package/dist/adapter.d.mts +26 -15
- package/dist/adapter.d.ts +26 -15
- package/dist/agents/{effect-runtime.cjs → agent-effects.cjs} +12 -18
- package/dist/agents/agent-effects.cjs.map +1 -0
- package/dist/agents/agent-effects.d.cts +23 -0
- package/dist/agents/agent-effects.d.mts +23 -0
- package/dist/agents/agent-effects.d.ts +23 -0
- package/dist/agents/agent-effects.js +16 -0
- package/dist/agents/agent-effects.js.map +1 -0
- package/dist/agents/ai-sdk.cjs +1 -1
- package/dist/agents/ai-sdk.cjs.map +1 -1
- package/dist/agents/bub.cjs +31 -18
- package/dist/agents/bub.cjs.map +1 -1
- package/dist/agents/bub.d.cts +9 -12
- package/dist/agents/bub.d.mts +9 -12
- package/dist/agents/bub.d.ts +9 -12
- package/dist/agents/claude-code-native.cjs +2 -2
- package/dist/agents/claude-code-native.cjs.map +1 -1
- package/dist/agents/claude-code.cjs +17 -11
- package/dist/agents/claude-code.cjs.map +1 -1
- package/dist/agents/claude-code.d.cts +11 -11
- package/dist/agents/claude-code.d.mts +11 -11
- package/dist/agents/claude-code.d.ts +11 -11
- package/dist/agents/codex-app-server.cjs +2 -2
- package/dist/agents/codex-app-server.cjs.map +1 -1
- package/dist/agents/codex.cjs +18 -12
- package/dist/agents/codex.cjs.map +1 -1
- package/dist/agents/codex.d.cts +12 -12
- package/dist/agents/codex.d.mts +12 -12
- package/dist/agents/codex.d.ts +12 -12
- package/dist/agents/deepseek-harness.cjs +2 -2
- package/dist/agents/deepseek-harness.cjs.map +1 -1
- package/dist/agents/hermes.cjs +3 -3
- package/dist/agents/hermes.cjs.map +1 -1
- package/dist/agents/index.cjs +3 -3
- package/dist/agents/index.cjs.map +1 -1
- package/dist/agents/index.d.cts +3 -3
- package/dist/agents/index.d.mts +3 -3
- package/dist/agents/index.d.ts +3 -3
- package/dist/agents/index.js +2 -2
- package/dist/agents/index.mjs +2 -2
- package/dist/agents/mcp.cjs.map +1 -1
- package/dist/agents/mcp.d.cts +2 -2
- package/dist/agents/mcp.d.mts +2 -2
- package/dist/agents/mcp.d.ts +2 -2
- package/dist/agents/omp.cjs +2 -2
- package/dist/agents/omp.cjs.map +1 -1
- package/dist/agents/openai-compat.cjs +2 -2
- package/dist/agents/openai-compat.cjs.map +1 -1
- package/dist/agents/openclaw.cjs +3 -3
- package/dist/agents/openclaw.cjs.map +1 -1
- package/dist/agents/opencode.cjs +16 -4
- package/dist/agents/opencode.cjs.map +1 -1
- package/dist/agents/plugin-extensions.cjs +71 -0
- package/dist/agents/plugin-extensions.cjs.map +1 -0
- package/dist/agents/plugin-extensions.d.cts +26 -0
- package/dist/agents/plugin-extensions.d.mts +26 -0
- package/dist/agents/plugin-extensions.d.ts +26 -0
- package/dist/agents/plugin-extensions.js +8 -0
- package/dist/agents/plugin-extensions.js.map +1 -0
- package/dist/agents/post-setup.cjs +14 -3
- package/dist/agents/post-setup.cjs.map +1 -1
- package/dist/agents/post-setup.d.cts +4 -2
- package/dist/agents/post-setup.d.mts +4 -2
- package/dist/agents/post-setup.d.ts +4 -2
- package/dist/agents/post-setup.js +8 -6
- package/dist/agents/sdk-streams.cjs +3 -3
- package/dist/agents/sdk-streams.cjs.map +1 -1
- package/dist/agents/{session-slot.cjs → session-key.cjs} +4 -4
- package/dist/agents/session-key.cjs.map +1 -0
- package/dist/agents/session-key.d.cts +12 -0
- package/dist/agents/session-key.d.mts +12 -0
- package/dist/agents/session-key.d.ts +12 -0
- package/dist/agents/session-key.js +6 -0
- package/dist/agents/session-key.js.map +1 -0
- package/dist/agents/shared.cjs +2 -2
- package/dist/agents/shared.cjs.map +1 -1
- package/dist/agents/shared.d.cts +4 -4
- package/dist/agents/shared.d.mts +4 -4
- package/dist/agents/shared.d.ts +4 -4
- package/dist/agents/skills.cjs.map +1 -1
- package/dist/agents/skills.d.cts +3 -3
- package/dist/agents/skills.d.mts +3 -3
- package/dist/agents/skills.d.ts +3 -3
- package/dist/agents/types.cjs.map +1 -1
- package/dist/agents/types.d.cts +55 -54
- package/dist/agents/types.d.mts +55 -54
- package/dist/agents/types.d.ts +55 -54
- package/dist/agents/ui-message-stream.cjs +4 -4
- package/dist/agents/ui-message-stream.cjs.map +1 -1
- package/dist/agents/unrecognized-events.cjs +32 -0
- package/dist/agents/unrecognized-events.cjs.map +1 -0
- package/dist/agents/unrecognized-events.d.cts +8 -0
- package/dist/agents/unrecognized-events.d.mts +8 -0
- package/dist/agents/unrecognized-events.d.ts +8 -0
- package/dist/agents/unrecognized-events.js +6 -0
- package/dist/agents/unrecognized-events.js.map +1 -0
- package/dist/assertions/api.cjs.map +1 -1
- package/dist/assertions/api.d.cts +3 -0
- package/dist/assertions/api.d.mts +3 -0
- package/dist/assertions/api.d.ts +3 -0
- package/dist/assertions/collection.cjs +1 -1
- package/dist/assertions/collection.cjs.map +1 -1
- package/dist/assertions/judge.cjs +1 -1
- package/dist/assertions/judge.cjs.map +1 -1
- package/dist/assertions/match.cjs +52 -21
- package/dist/assertions/match.cjs.map +1 -1
- package/dist/assertions/match.d.cts +16 -5
- package/dist/assertions/match.d.mts +16 -5
- package/dist/assertions/match.d.ts +16 -5
- package/dist/assertions/match.js +96 -94
- package/dist/assertions/measurements.cjs +61 -0
- package/dist/assertions/measurements.cjs.map +1 -0
- package/dist/assertions/measurements.d.cts +24 -0
- package/dist/assertions/measurements.d.mts +24 -0
- package/dist/assertions/measurements.d.ts +24 -0
- package/dist/assertions/measurements.js +8 -0
- package/dist/assertions/measurements.js.map +1 -0
- package/dist/assertions/numeric.cjs +2 -0
- package/dist/assertions/numeric.cjs.map +1 -1
- package/dist/assertions/numeric.d.cts +1 -1
- package/dist/assertions/numeric.d.mts +1 -1
- package/dist/assertions/numeric.d.ts +1 -1
- package/dist/assertions/quantity.cjs +42 -0
- package/dist/assertions/quantity.cjs.map +1 -0
- package/dist/assertions/quantity.d.cts +18 -0
- package/dist/assertions/quantity.d.mts +18 -0
- package/dist/assertions/quantity.d.ts +18 -0
- package/dist/assertions/quantity.js +22 -0
- package/dist/assertions/quantity.js.map +1 -0
- package/dist/assertions/record/attachment.cjs +2 -0
- package/dist/assertions/record/attachment.cjs.map +1 -1
- package/dist/assertions/record/codec.cjs +5 -1
- package/dist/assertions/record/codec.cjs.map +1 -1
- package/dist/assertions/record/model.cjs.map +1 -1
- package/dist/assertions/record/model.d.cts +3 -1
- package/dist/assertions/record/model.d.mts +3 -1
- package/dist/assertions/record/model.d.ts +3 -1
- package/dist/assertions/runtime.cjs +11 -6
- package/dist/assertions/runtime.cjs.map +1 -1
- package/dist/cli/program.cjs +3 -0
- package/dist/cli/program.cjs.map +1 -1
- package/dist/context/assert-first.cjs +6 -4
- package/dist/context/assert-first.cjs.map +1 -1
- package/dist/context/assert-first.d.cts +9 -3
- package/dist/context/assert-first.d.mts +9 -3
- package/dist/context/assert-first.d.ts +9 -3
- package/dist/context/notes.cjs +47 -0
- package/dist/context/notes.cjs.map +1 -0
- package/dist/context/notes.d.cts +10 -0
- package/dist/context/notes.d.mts +10 -0
- package/dist/context/notes.d.ts +10 -0
- package/dist/context/notes.js +6 -0
- package/dist/context/notes.js.map +1 -0
- package/dist/context/send-failures.cjs +1 -7
- package/dist/context/send-failures.cjs.map +1 -1
- package/dist/context/send-failures.d.cts +2 -3
- package/dist/context/send-failures.d.mts +2 -3
- package/dist/context/send-failures.d.ts +2 -3
- package/dist/context/send-retry.cjs +0 -1
- package/dist/context/send-retry.cjs.map +1 -1
- package/dist/context/send-retry.d.cts +1 -2
- package/dist/context/send-retry.d.mts +1 -2
- package/dist/context/send-retry.d.ts +1 -2
- package/dist/context/session.cjs +10 -17
- package/dist/context/session.cjs.map +1 -1
- package/dist/context/session.d.cts +4 -10
- package/dist/context/session.d.mts +4 -10
- package/dist/context/session.d.ts +4 -10
- package/dist/define.cjs +89 -64
- package/dist/define.cjs.map +1 -1
- package/dist/define.d.cts +3 -3
- package/dist/define.d.mts +3 -3
- package/dist/define.d.ts +3 -3
- package/dist/eval/cli/contribution.cjs +1 -1
- package/dist/eval/cli/contribution.cjs.map +1 -1
- package/dist/eval/host/index.cjs +1 -1
- package/dist/eval/host/index.cjs.map +1 -1
- package/dist/eval/record/evaluation.cjs +1 -1
- package/dist/eval/record/evaluation.cjs.map +1 -1
- package/dist/eval/record/membership-provenance.d.cts +3 -3
- package/dist/eval/record/membership-provenance.d.mts +3 -3
- package/dist/eval/record/membership-provenance.d.ts +3 -3
- package/dist/eval/record/score.cjs +2 -2
- package/dist/eval/record/score.cjs.map +1 -1
- package/dist/eval/record/sealed-assertion.cjs +1 -1
- package/dist/eval/record/sealed-assertion.cjs.map +1 -1
- package/dist/eval/record/verdict.cjs +2 -2
- package/dist/eval/record/verdict.cjs.map +1 -1
- package/dist/expect/index.cjs +13 -1
- package/dist/expect/index.cjs.map +1 -1
- package/dist/expect/index.d.cts +5 -1
- package/dist/expect/index.d.mts +5 -1
- package/dist/expect/index.d.ts +5 -1
- package/dist/expect/index.js +92 -72
- package/dist/expect/index.mjs +92 -72
- package/dist/experiment/host/cli/contribution.cjs +52 -39
- package/dist/experiment/host/cli/contribution.cjs.map +1 -1
- package/dist/experiment/host/cli/contribution.d.cts +18 -4
- package/dist/experiment/host/cli/contribution.d.mts +18 -4
- package/dist/experiment/host/cli/contribution.d.ts +18 -4
- package/dist/experiment/host/cli/contribution.js +2 -2
- package/dist/experiment/host/cli/debug-protocol.cjs +2 -2
- package/dist/experiment/host/cli/debug-protocol.cjs.map +1 -1
- package/dist/experiment/host/cli/debug-protocol.d.cts +2 -2
- package/dist/experiment/host/cli/debug-protocol.d.mts +2 -2
- package/dist/experiment/host/cli/debug-protocol.d.ts +2 -2
- package/dist/experiment/host/cli/output-protocol.cjs +1 -1
- package/dist/experiment/host/cli/output-protocol.cjs.map +1 -1
- package/dist/experiment/host/cli/output-protocol.d.cts +2 -2
- package/dist/experiment/host/cli/output-protocol.d.mts +2 -2
- package/dist/experiment/host/cli/output-protocol.d.ts +2 -2
- package/dist/experiment/host/current.cjs +2 -2
- package/dist/experiment/host/current.cjs.map +1 -1
- package/dist/experiment/host/index.cjs +1 -1
- package/dist/experiment/host/index.cjs.map +1 -1
- package/dist/experiment/host/operations.cjs +24 -23
- package/dist/experiment/host/operations.cjs.map +1 -1
- package/dist/experiment/host/runtime.cjs +11 -10
- package/dist/experiment/host/runtime.cjs.map +1 -1
- package/dist/experiment/host/runtime.d.cts +3 -3
- package/dist/experiment/host/runtime.d.mts +3 -3
- package/dist/experiment/host/runtime.d.ts +3 -3
- package/dist/experiment/host/teardown.cjs +4 -3
- package/dist/experiment/host/teardown.cjs.map +1 -1
- package/dist/experiment/host/teardown.d.cts +3 -3
- package/dist/experiment/host/teardown.d.mts +3 -3
- package/dist/experiment/host/teardown.d.ts +3 -3
- package/dist/experiment/host/types.cjs.map +1 -1
- package/dist/experiment/host/types.d.cts +19 -19
- package/dist/experiment/host/types.d.mts +19 -19
- package/dist/experiment/host/types.d.ts +19 -19
- package/dist/index.cjs +3 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -8
- package/dist/index.d.mts +4 -8
- package/dist/index.d.ts +4 -8
- package/dist/index.js +12 -34
- package/dist/index.mjs +12 -34
- package/dist/inspection/assertions.cjs +1 -1
- package/dist/inspection/assertions.cjs.map +1 -1
- package/dist/inspection/cli/contribution.cjs +8 -7
- package/dist/inspection/cli/contribution.cjs.map +1 -1
- package/dist/inspection/facts.cjs +4 -4
- package/dist/inspection/facts.cjs.map +1 -1
- package/dist/inspection/index.cjs +1 -5
- package/dist/inspection/index.cjs.map +1 -1
- package/dist/inspection/index.d.cts +1 -2
- package/dist/inspection/index.d.mts +1 -2
- package/dist/inspection/index.d.ts +1 -2
- package/dist/inspection/index.js +20 -26
- package/dist/inspection/lifecycle.cjs +7 -0
- package/dist/inspection/lifecycle.cjs.map +1 -0
- package/dist/inspection/lifecycle.d.cts +4 -0
- package/dist/inspection/lifecycle.d.mts +4 -0
- package/dist/inspection/lifecycle.d.ts +4 -0
- package/dist/inspection/lifecycle.js +6 -0
- package/dist/inspection/lifecycle.js.map +1 -0
- package/dist/inspection/notes.cjs +40 -0
- package/dist/inspection/notes.cjs.map +1 -0
- package/dist/inspection/notes.d.cts +12 -0
- package/dist/inspection/notes.d.mts +12 -0
- package/dist/inspection/notes.d.ts +12 -0
- package/dist/inspection/notes.js +8 -0
- package/dist/inspection/notes.js.map +1 -0
- package/dist/inspection/overview.cjs +12 -15
- package/dist/inspection/overview.cjs.map +1 -1
- package/dist/inspection/overview.d.cts +8 -6
- package/dist/inspection/overview.d.mts +8 -6
- package/dist/inspection/overview.d.ts +8 -6
- package/dist/inspection/planned-attempt.cjs +45 -0
- package/dist/inspection/planned-attempt.cjs.map +1 -0
- package/dist/inspection/planned-attempt.d.cts +109 -0
- package/dist/inspection/planned-attempt.d.mts +109 -0
- package/dist/inspection/planned-attempt.d.ts +109 -0
- package/dist/inspection/planned-attempt.js +24 -0
- package/dist/inspection/planned-attempt.js.map +1 -0
- package/dist/inspection/project-result.cjs +5 -5
- package/dist/inspection/project-result.cjs.map +1 -1
- package/dist/inspection/project-result.d.cts +58 -57
- package/dist/inspection/project-result.d.mts +58 -57
- package/dist/inspection/project-result.d.ts +58 -57
- package/dist/inspection/project-result.js +4 -4
- package/dist/inspection/project.cjs +3 -3
- package/dist/inspection/project.cjs.map +1 -1
- package/dist/inspection/protocol-values.cjs +1 -1
- package/dist/inspection/protocol-values.cjs.map +1 -1
- package/dist/inspection/protocol-values.d.cts +1 -1
- package/dist/inspection/protocol-values.d.mts +1 -1
- package/dist/inspection/protocol-values.d.ts +1 -1
- package/dist/inspection/protocol.cjs +8 -8
- package/dist/inspection/protocol.cjs.map +1 -1
- package/dist/inspection/protocol.d.cts +237 -219
- package/dist/inspection/protocol.d.mts +237 -219
- package/dist/inspection/protocol.d.ts +237 -219
- package/dist/inspection/public.cjs +1 -5
- package/dist/inspection/public.cjs.map +1 -1
- package/dist/inspection/public.d.cts +1 -2
- package/dist/inspection/public.d.mts +1 -2
- package/dist/inspection/public.d.ts +1 -2
- package/dist/inspection/public.js +14 -20
- package/dist/inspection/public.mjs +166 -129
- package/dist/inspection/query.cjs +1 -1
- package/dist/inspection/query.cjs.map +1 -1
- package/dist/inspection/results.cjs +61 -52
- package/dist/inspection/results.cjs.map +1 -1
- package/dist/inspection/results.d.cts +157 -140
- package/dist/inspection/results.d.mts +157 -140
- package/dist/inspection/results.d.ts +157 -140
- package/dist/inspection/select.cjs +33 -28
- package/dist/inspection/select.cjs.map +1 -1
- package/dist/inspection/source.cjs +1 -1
- package/dist/inspection/source.cjs.map +1 -1
- package/dist/inspection/sources.cjs +2 -2
- package/dist/inspection/sources.cjs.map +1 -1
- package/dist/inspection/trace.cjs +9 -8
- package/dist/inspection/trace.cjs.map +1 -1
- package/dist/inspection/trace.d.cts +4 -4
- package/dist/inspection/trace.d.mts +4 -4
- package/dist/inspection/trace.d.ts +4 -4
- package/dist/loaders/index.cjs +7 -279
- package/dist/loaders/index.cjs.map +1 -1
- package/dist/loaders/index.d.cts +2 -95
- package/dist/loaders/index.d.mts +2 -95
- package/dist/loaders/index.d.ts +2 -95
- package/dist/loaders/index.js +10 -12
- package/dist/loaders/index.mjs +10 -12
- package/dist/loaders/runtime.cjs +283 -0
- package/dist/loaders/runtime.cjs.map +1 -0
- package/dist/loaders/runtime.d.cts +95 -0
- package/dist/loaders/runtime.d.mts +95 -0
- package/dist/loaders/runtime.d.ts +95 -0
- package/dist/loaders/runtime.js +16 -0
- package/dist/loaders/runtime.js.map +1 -0
- package/dist/migrations/judge-provider.md +6 -6
- package/dist/{model-slots.cjs → model-roles.cjs} +26 -7
- package/dist/model-roles.cjs.map +1 -0
- package/dist/model-roles.d.cts +26 -0
- package/dist/model-roles.d.mts +26 -0
- package/dist/model-roles.d.ts +26 -0
- package/dist/model-roles.js +14 -0
- package/dist/model-roles.js.map +1 -0
- package/dist/o11y/adapter-usage-projection.cjs +9 -8
- package/dist/o11y/adapter-usage-projection.cjs.map +1 -1
- package/dist/o11y/adapter-usage-projection.d.cts +23 -15
- package/dist/o11y/adapter-usage-projection.d.mts +23 -15
- package/dist/o11y/adapter-usage-projection.d.ts +23 -15
- package/dist/o11y/cache-read.cjs +14 -14
- package/dist/o11y/cache-read.cjs.map +1 -1
- package/dist/o11y/cache-read.d.cts +5 -5
- package/dist/o11y/cache-read.d.mts +5 -5
- package/dist/o11y/cache-read.d.ts +5 -5
- package/dist/o11y/derive.cjs.map +1 -1
- package/dist/o11y/derive.d.cts +2 -2
- package/dist/o11y/derive.d.mts +2 -2
- package/dist/o11y/derive.d.ts +2 -2
- package/dist/o11y/eval-usage.cjs +9 -9
- package/dist/o11y/eval-usage.cjs.map +1 -1
- package/dist/o11y/eval-usage.d.cts +7 -7
- package/dist/o11y/eval-usage.d.mts +7 -7
- package/dist/o11y/eval-usage.d.ts +7 -7
- package/dist/o11y/parsers/bub.cjs +57 -81
- package/dist/o11y/parsers/bub.cjs.map +1 -1
- package/dist/o11y/parsers/index.cjs.map +1 -1
- package/dist/o11y/parsers/index.d.cts +2 -0
- package/dist/o11y/parsers/index.d.mts +2 -0
- package/dist/o11y/parsers/index.d.ts +2 -0
- package/dist/o11y/parsers/opencode.cjs +129 -217
- package/dist/o11y/parsers/opencode.cjs.map +1 -1
- package/dist/o11y/parsers/opencode.d.cts +2 -5
- package/dist/o11y/parsers/opencode.d.mts +2 -5
- package/dist/o11y/parsers/opencode.d.ts +2 -5
- package/dist/o11y/types.cjs.map +1 -1
- package/dist/o11y/types.d.cts +1 -1
- package/dist/o11y/types.d.mts +1 -1
- package/dist/o11y/types.d.ts +1 -1
- package/dist/plugin/contracts.cjs +170 -120
- package/dist/plugin/contracts.cjs.map +1 -1
- package/dist/plugin/contracts.d.cts +102 -90
- package/dist/plugin/contracts.d.mts +102 -90
- package/dist/plugin/contracts.d.ts +102 -90
- package/dist/plugin/contracts.js +16 -12
- package/dist/plugin/index.cjs.map +1 -1
- package/dist/plugin/index.d.cts +1 -1
- package/dist/plugin/index.d.mts +1 -1
- package/dist/plugin/index.d.ts +1 -1
- package/dist/plugin/link.cjs +69 -64
- package/dist/plugin/link.cjs.map +1 -1
- package/dist/plugin/link.d.cts +5 -3
- package/dist/plugin/link.d.mts +5 -3
- package/dist/plugin/link.d.ts +5 -3
- package/dist/plugin/link.js +12 -8
- package/dist/record/codec/seal-manifest.d.cts +3 -3
- package/dist/record/codec/seal-manifest.d.mts +3 -3
- package/dist/record/codec/seal-manifest.d.ts +3 -3
- package/dist/record/family/attempt-note/definition.cjs +12 -0
- package/dist/record/family/attempt-note/definition.cjs.map +1 -0
- package/dist/record/family/attempt-note/definition.d.cts +6 -0
- package/dist/record/family/attempt-note/definition.d.mts +6 -0
- package/dist/record/family/attempt-note/definition.d.ts +6 -0
- package/dist/record/family/attempt-note/definition.js +6 -0
- package/dist/record/family/attempt-note/definition.js.map +1 -0
- package/dist/record/family/attempt-note/persistence.cjs +10 -0
- package/dist/record/family/attempt-note/persistence.cjs.map +1 -0
- package/dist/record/family/attempt-note/persistence.d.cts +6 -0
- package/dist/record/family/attempt-note/persistence.d.mts +6 -0
- package/dist/record/family/attempt-note/persistence.d.ts +6 -0
- package/dist/record/family/attempt-note/persistence.js +6 -0
- package/dist/record/family/attempt-note/persistence.js.map +1 -0
- package/dist/record/family/attempt-note/schema.cjs +20 -0
- package/dist/record/family/attempt-note/schema.cjs.map +1 -0
- package/dist/record/family/attempt-note/schema.d.cts +21 -0
- package/dist/record/family/attempt-note/schema.d.mts +21 -0
- package/dist/record/family/attempt-note/schema.d.ts +21 -0
- package/dist/record/family/attempt-note/schema.js +10 -0
- package/dist/record/family/attempt-note/schema.js.map +1 -0
- package/dist/record/family/catalog.cjs +32 -29
- package/dist/record/family/catalog.cjs.map +1 -1
- package/dist/record/family/catalog.d.cts +7 -2
- package/dist/record/family/catalog.d.mts +7 -2
- package/dist/record/family/catalog.d.ts +7 -2
- package/dist/record/family/current.cjs +48 -45
- package/dist/record/family/current.cjs.map +1 -1
- package/dist/record/family/current.d.cts +15 -0
- package/dist/record/family/current.d.mts +15 -0
- package/dist/record/family/current.d.ts +15 -0
- package/dist/record/model/index.js +66 -64
- package/dist/record/model/run-context.cjs +9 -3
- package/dist/record/model/run-context.cjs.map +1 -1
- package/dist/record/model/run-context.d.cts +9 -2
- package/dist/record/model/run-context.d.mts +9 -2
- package/dist/record/model/run-context.d.ts +9 -2
- package/dist/record/model/run-context.js +8 -6
- package/dist/record/model/seal-manifest.d.cts +1 -1
- package/dist/record/model/seal-manifest.d.mts +1 -1
- package/dist/record/model/seal-manifest.d.ts +1 -1
- package/dist/run/cli/contribution.cjs +6 -32
- package/dist/run/cli/contribution.cjs.map +1 -1
- package/dist/run/host/runtime.cjs +1 -1
- package/dist/run/host/runtime.cjs.map +1 -1
- package/dist/run/storage/sqlite.cjs +7 -7
- package/dist/run/storage/sqlite.cjs.map +1 -1
- package/dist/runner/adapter-usage.cjs +5 -3
- package/dist/runner/adapter-usage.cjs.map +1 -1
- package/dist/runner/adapter-usage.d.cts +2 -2
- package/dist/runner/adapter-usage.d.mts +2 -2
- package/dist/runner/adapter-usage.d.ts +2 -2
- package/dist/runner/adoption.cjs +10 -12
- package/dist/runner/adoption.cjs.map +1 -1
- package/dist/runner/attempt-notes.cjs +8 -0
- package/dist/runner/attempt-notes.cjs.map +1 -0
- package/dist/runner/attempt-notes.d.cts +4 -0
- package/dist/runner/attempt-notes.d.mts +4 -0
- package/dist/runner/attempt-notes.d.ts +4 -0
- package/dist/runner/attempt-notes.js +8 -0
- package/dist/runner/attempt-notes.js.map +1 -0
- package/dist/runner/attempt.cjs +61 -73
- package/dist/runner/attempt.cjs.map +1 -1
- package/dist/runner/attempt.d.cts +3 -3
- package/dist/runner/attempt.d.mts +3 -3
- package/dist/runner/attempt.d.ts +3 -3
- package/dist/runner/command-plan.cjs +21 -26
- package/dist/runner/command-plan.cjs.map +1 -1
- package/dist/runner/command-plan.d.cts +4 -4
- package/dist/runner/command-plan.d.mts +4 -4
- package/dist/runner/command-plan.d.ts +4 -4
- package/dist/runner/command-plan.js +4 -4
- package/dist/runner/config-identity.cjs.map +1 -1
- package/dist/runner/config-identity.d.cts +2 -2
- package/dist/runner/config-identity.d.mts +2 -2
- package/dist/runner/config-identity.d.ts +2 -2
- package/dist/runner/discover.cjs +6 -6
- package/dist/runner/discover.cjs.map +1 -1
- package/dist/runner/eval-selection.cjs +15 -1
- package/dist/runner/eval-selection.cjs.map +1 -1
- package/dist/runner/eval-selection.d.cts +4 -0
- package/dist/runner/eval-selection.d.mts +4 -0
- package/dist/runner/eval-selection.d.ts +4 -0
- package/dist/runner/feedback/human.cjs +1 -1
- package/dist/runner/feedback/human.cjs.map +1 -1
- package/dist/runner/feedback/json.cjs +4 -2
- package/dist/runner/feedback/json.cjs.map +1 -1
- package/dist/runner/feedback/json.d.cts +1 -1
- package/dist/runner/feedback/json.d.mts +1 -1
- package/dist/runner/feedback/json.d.ts +1 -1
- package/dist/runner/feedback/sink.cjs +1 -1
- package/dist/runner/feedback/sink.cjs.map +1 -1
- package/dist/runner/feedback/sink.d.cts +1 -1
- package/dist/runner/feedback/sink.d.mts +1 -1
- package/dist/runner/feedback/sink.d.ts +1 -1
- package/dist/runner/fingerprint.cjs +1 -1
- package/dist/runner/fingerprint.cjs.map +1 -1
- package/dist/runner/lock.cjs +1 -3
- package/dist/runner/lock.cjs.map +1 -1
- package/dist/runner/lock.d.cts +0 -2
- package/dist/runner/lock.d.mts +0 -2
- package/dist/runner/lock.d.ts +0 -2
- package/dist/runner/lock.js +14 -16
- package/dist/runner/project-target.cjs.map +1 -1
- package/dist/runner/project-target.d.cts +2 -2
- package/dist/runner/project-target.d.mts +2 -2
- package/dist/runner/project-target.d.ts +2 -2
- package/dist/runner/record/attachments.cjs +2 -2
- package/dist/runner/record/attachments.cjs.map +1 -1
- package/dist/runner/record/planning.cjs +8 -2
- package/dist/runner/record/planning.cjs.map +1 -1
- package/dist/runner/record.cjs +2 -0
- package/dist/runner/record.cjs.map +1 -1
- package/dist/runner/report.cjs +3 -3
- package/dist/runner/report.cjs.map +1 -1
- package/dist/runner/report.d.cts +1 -1
- package/dist/runner/report.d.mts +1 -1
- package/dist/runner/report.d.ts +1 -1
- package/dist/runner/reuse-plan.cjs +2 -2
- package/dist/runner/reuse-plan.cjs.map +1 -1
- package/dist/runner/run.cjs +10 -45
- package/dist/runner/run.cjs.map +1 -1
- package/dist/runner/sandbox-pool.cjs +1 -2
- package/dist/runner/sandbox-pool.cjs.map +1 -1
- package/dist/runner/setup-prefix-preparation.cjs +1 -1
- package/dist/runner/setup-prefix-preparation.cjs.map +1 -1
- package/dist/runner/teardown-registry.cjs +2 -2
- package/dist/runner/teardown-registry.cjs.map +1 -1
- package/dist/runner/teardown-registry.d.cts +1 -1
- package/dist/runner/teardown-registry.d.mts +1 -1
- package/dist/runner/teardown-registry.d.ts +1 -1
- package/dist/runner/types.cjs +4 -4
- package/dist/runner/types.cjs.map +1 -1
- package/dist/runner/types.d.cts +64 -92
- package/dist/runner/types.d.mts +64 -92
- package/dist/runner/types.d.ts +64 -92
- package/dist/runner/types.js +2 -2
- package/dist/sandbox/action.cjs +1 -1
- package/dist/sandbox/action.cjs.map +1 -1
- package/dist/sandbox/cli/contribution.cjs +17 -14
- package/dist/sandbox/cli/contribution.cjs.map +1 -1
- package/dist/sandbox/cli/contribution.d.cts +1 -1
- package/dist/sandbox/cli/contribution.d.mts +1 -1
- package/dist/sandbox/cli/contribution.d.ts +1 -1
- package/dist/sandbox/commands.cjs +1 -1
- package/dist/sandbox/commands.cjs.map +1 -1
- package/dist/sandbox/commands.d.cts +1 -1
- package/dist/sandbox/commands.d.mts +1 -1
- package/dist/sandbox/commands.d.ts +1 -1
- package/dist/sandbox/compose.cjs +2 -2
- package/dist/sandbox/compose.cjs.map +1 -1
- package/dist/sandbox/docker-profile/registry.cjs +5 -10
- package/dist/sandbox/docker-profile/registry.cjs.map +1 -1
- package/dist/sandbox/docker-profile/registry.d.cts +0 -4
- package/dist/sandbox/docker-profile/registry.d.mts +0 -4
- package/dist/sandbox/docker-profile/registry.d.ts +0 -4
- package/dist/sandbox/docker-profile/registry.js +6 -14
- package/dist/sandbox/docker-profile/runtime.cjs +1 -1
- package/dist/sandbox/docker-profile/runtime.cjs.map +1 -1
- package/dist/sandbox/docker-profile/schema.cjs +12 -16
- package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
- package/dist/sandbox/docker-profile/schema.d.cts +2 -6
- package/dist/sandbox/docker-profile/schema.d.mts +2 -6
- package/dist/sandbox/docker-profile/schema.d.ts +2 -6
- package/dist/sandbox/docker-profile/schema.js +24 -32
- package/dist/sandbox/incus.cjs +2 -2
- package/dist/sandbox/incus.cjs.map +1 -1
- package/dist/sandbox/index.cjs +4 -36
- package/dist/sandbox/index.cjs.map +1 -1
- package/dist/sandbox/index.d.cts +4 -8
- package/dist/sandbox/index.d.mts +4 -8
- package/dist/sandbox/index.d.ts +4 -8
- package/dist/sandbox/index.js +116 -174
- package/dist/sandbox/index.mjs +116 -174
- package/dist/sandbox/layer.cjs +3 -3
- package/dist/sandbox/layer.cjs.map +1 -1
- package/dist/sandbox/link.cjs +5 -0
- package/dist/sandbox/link.cjs.map +1 -1
- package/dist/sandbox/link.d.cts +3 -0
- package/dist/sandbox/link.d.mts +3 -0
- package/dist/sandbox/link.d.ts +3 -0
- package/dist/sandbox/runtime.cjs +9 -4
- package/dist/sandbox/runtime.cjs.map +1 -1
- package/dist/shared/failure-class.cjs +5 -5
- package/dist/shared/failure-class.cjs.map +1 -1
- package/dist/shared/failure-class.d.cts +4 -10
- package/dist/shared/failure-class.d.mts +4 -10
- package/dist/shared/failure-class.d.ts +4 -10
- package/dist/shared/types.cjs.map +1 -1
- package/dist/shared/types.d.cts +1 -1
- package/dist/shared/types.d.mts +1 -1
- package/dist/shared/types.d.ts +1 -1
- package/dist/show/contribution.cjs +17 -2
- package/dist/show/contribution.cjs.map +1 -1
- package/dist/show/contribution.d.cts +14 -0
- package/dist/show/contribution.d.mts +14 -0
- package/dist/show/contribution.d.ts +14 -0
- package/dist/show/model.cjs +8 -5
- package/dist/show/model.cjs.map +1 -1
- package/dist/show/model.d.cts +11 -8
- package/dist/show/model.d.mts +11 -8
- package/dist/show/model.d.ts +11 -8
- package/dist/show/render.cjs +34 -22
- package/dist/show/render.cjs.map +1 -1
- package/dist/sources/projector.cjs +1 -1
- package/dist/sources/projector.cjs.map +1 -1
- package/dist/types.cjs +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +1 -1
- package/dist/types.d.mts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.js +2 -2
- package/dist/view/app-dist/.vite/manifest.json +2 -2
- package/dist/view/app-dist/assets/{index-B3ijZRph.js → index-CxrOUvHC.js} +17 -17
- package/dist/view/app-dist/assets/{quality-cost-scatter-B--DfJ9s.js → quality-cost-scatter-B6Aiss7x.js} +1 -1
- package/dist/view/app-dist/index.html +1 -1
- package/dist/view/cli/contribution.cjs +1 -1
- package/dist/view/cli/contribution.cjs.map +1 -1
- package/dist/view/function-runtime.mjs +318 -121
- package/dist/view/http-protocol.d.cts +1 -1
- package/dist/view/http-protocol.d.mts +1 -1
- package/dist/view/http-protocol.d.ts +1 -1
- package/dist/view/inspection-host.cjs +2 -2
- package/dist/view/inspection-host.cjs.map +1 -1
- package/dist/view/inspection-host.d.cts +349 -331
- package/dist/view/inspection-host.d.mts +349 -331
- package/dist/view/inspection-host.d.ts +349 -331
- package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +9 -9
- package/docs-site/zh/examples/integrations/claude-sdk.mdx +8 -8
- package/docs-site/zh/examples/integrations/codex-sdk.mdx +4 -4
- package/docs-site/zh/examples/integrations/langgraph.mdx +6 -6
- package/docs-site/zh/examples/integrations/pi-sdk.mdx +8 -8
- package/docs-site/zh/explanation/adapter.mdx +6 -6
- package/docs-site/zh/explanation/assert.mdx +7 -7
- package/docs-site/zh/explanation/drive.mdx +4 -4
- package/docs-site/zh/explanation/hitl.mdx +2 -2
- package/docs-site/zh/explanation/judge.mdx +3 -3
- package/docs-site/zh/index.mdx +18 -0
- package/docs-site/zh/introduction.mdx +4 -3
- package/docs-site/zh/reference/builtin-agents.mdx +46 -49
- package/docs-site/zh/reference/cli.mdx +16 -14
- package/docs-site/zh/reference/define-agent.mdx +19 -19
- package/docs-site/zh/reference/define-config.mdx +7 -15
- package/docs-site/zh/reference/define-eval.mdx +20 -14
- package/docs-site/zh/reference/define-experiment.mdx +18 -39
- package/docs-site/zh/reference/events.mdx +1 -1
- package/docs-site/zh/reference/expect.mdx +21 -0
- package/docs-site/zh/reference/official-adapters.mdx +12 -5
- package/docs-site/zh/troubleshooting/debugging.mdx +2 -2
- package/docs-site/zh/troubleshooting/recover-after-kill.mdx +1 -1
- package/docs-site/zh/tutorials/agent-onboarding.mdx +2 -2
- package/docs-site/zh/tutorials/authoring.mdx +4 -3
- package/docs-site/zh/tutorials/compare-runs.mdx +1 -1
- package/docs-site/zh/tutorials/concurrency.mdx +8 -8
- package/docs-site/zh/tutorials/configuration.mdx +5 -5
- package/docs-site/zh/tutorials/control-run-cost.mdx +49 -9
- package/docs-site/zh/tutorials/eval-groups.mdx +1 -1
- package/docs-site/zh/tutorials/evaluation-kinds.mdx +5 -5
- package/docs-site/zh/tutorials/experiment-services.mdx +32 -32
- package/docs-site/zh/tutorials/handle-execution-failures.mdx +2 -28
- package/docs-site/zh/tutorials/plugins.mdx +49 -143
- package/docs-site/zh/tutorials/sandbox-agent.mdx +1 -1
- package/docs-site/zh/tutorials/sandbox-reuse.mdx +7 -7
- package/docs-site/zh/tutorials/upgrade-0-18.mdx +64 -0
- package/docs-site/zh/tutorials/upgrade-0-19.mdx +121 -0
- package/docs-site/zh/tutorials/upgrade-0-20.mdx +12 -0
- package/docs-site/zh/tutorials/verify-judge.mdx +4 -3
- package/docs-site/zh/tutorials/viewing-results.mdx +2 -2
- package/docs-site/zh/tutorials/write-experiment.mdx +1 -1
- package/docs-site/zh/tutorials/write-send.mdx +13 -13
- package/package.json +1 -1
- package/dist/agents/effect-runtime.cjs.map +0 -1
- package/dist/agents/effect-runtime.d.cts +0 -29
- package/dist/agents/effect-runtime.d.mts +0 -29
- package/dist/agents/effect-runtime.d.ts +0 -29
- package/dist/agents/effect-runtime.js +0 -16
- package/dist/agents/effect-runtime.js.map +0 -1
- package/dist/agents/session-slot.cjs.map +0 -1
- package/dist/agents/session-slot.d.cts +0 -12
- package/dist/agents/session-slot.d.mts +0 -12
- package/dist/agents/session-slot.d.ts +0 -12
- package/dist/agents/session-slot.js +0 -6
- package/dist/agents/session-slot.js.map +0 -1
- package/dist/model-slots.cjs.map +0 -1
- package/dist/model-slots.d.cts +0 -19
- package/dist/model-slots.d.mts +0 -19
- package/dist/model-slots.d.ts +0 -19
- package/dist/model-slots.js +0 -8
- package/dist/model-slots.js.map +0 -1
|
@@ -50,7 +50,7 @@ import { defineConfig } from "niceeval";
|
|
|
50
50
|
import { OpenAIProvider } from "niceeval/judge";
|
|
51
51
|
|
|
52
52
|
export default defineConfig({
|
|
53
|
-
|
|
53
|
+
judgeProvider: OpenAIProvider({ model: "gpt-5.4-mini" }),
|
|
54
54
|
maxConcurrency: 4,
|
|
55
55
|
timeoutMs: 300_000,
|
|
56
56
|
});
|
|
@@ -61,7 +61,7 @@ export default defineConfig({
|
|
|
61
61
|
| 字段 | 放什么 |
|
|
62
62
|
| --- | --- |
|
|
63
63
|
| `name` | 项目名,显示在 `niceeval view` 顶部。可按语言给多份 |
|
|
64
|
-
| `
|
|
64
|
+
| `judgeProvider` | 默认裁判 Provider,由 `niceeval/judge` 的具名工厂构造 |
|
|
65
65
|
| `workspace` | 上传进 Sandbox 的工作区根目录 |
|
|
66
66
|
| `reporters` | 默认 reporter 列表(落盘、上报实验平台) |
|
|
67
67
|
| `maxConcurrency` | 默认并发上限 |
|
|
@@ -80,7 +80,7 @@ export default defineConfig({
|
|
|
80
80
|
| `ANTHROPIC_API_KEY` | `claudeCodeAgent()` | 工厂参数 `apiKey` 可覆盖 |
|
|
81
81
|
| `ANTHROPIC_BASE_URL` | `claudeCodeAgent()` | 网关地址,工厂参数 `baseUrl` 可覆盖 |
|
|
82
82
|
| `CODEX_API_KEY` / `CODEX_BASE_URL` | `codexAgent()` | key 必需,代理地址可选;工厂参数 `apiKey` / `baseUrl` 可覆盖 |
|
|
83
|
-
| `BUB_API_KEY` / `BUB_API_BASE` | `bubAgent()` | 两者必需;工厂参数 `apiKey` / `
|
|
83
|
+
| `BUB_API_KEY` / `BUB_API_BASE` | `bubAgent()` | 两者必需;工厂参数 `apiKey` / `baseUrl` 可覆盖 |
|
|
84
84
|
| `OPENCLAW_API_KEY` / `OPENCLAW_BASE_URL` | `openClawAgent()` | key 省略时回落 `ANTHROPIC_API_KEY` |
|
|
85
85
|
| `OPENCODE_API_KEY` / `OPENCODE_BASE_URL` | `openCodeAgent()` | key 省略时回落 `ANTHROPIC_API_KEY` |
|
|
86
86
|
| `HERMES_API_KEY` / `HERMES_API_BASE` | `hermesAgent()` | key 省略时依次回落 `OPENROUTER_API_KEY`、`ANTHROPIC_API_KEY` |
|
|
@@ -100,7 +100,7 @@ export default defineConfig({
|
|
|
100
100
|
import { OpenAIProvider } from "niceeval/judge";
|
|
101
101
|
|
|
102
102
|
export default defineConfig({
|
|
103
|
-
|
|
103
|
+
judgeProvider: OpenAIProvider({
|
|
104
104
|
model: "gpt-5.4-mini",
|
|
105
105
|
baseUrl: "https://gateway.example.com/v1", // 网关地址是配置,写在这里
|
|
106
106
|
apiKeyEnv: "MY_GATEWAY_KEY", // key 是密钥,读这个环境变量
|
|
@@ -112,7 +112,7 @@ export default defineConfig({
|
|
|
112
112
|
|
|
113
113
|
```ts
|
|
114
114
|
export default defineConfig({
|
|
115
|
-
|
|
115
|
+
judgeProvider: OpenAIProvider({
|
|
116
116
|
model: "gpt-5.4-mini",
|
|
117
117
|
baseUrl: process.env.MY_GATEWAY_URL, // 变量名自己起,自己读
|
|
118
118
|
apiKeyEnv: "MY_GATEWAY_KEY",
|
|
@@ -113,36 +113,36 @@ Attempt 页面先显示应用和 Judge 的合计费用:
|
|
|
113
113
|
Headless Adapter 使用 `ctx.recordUsage` 登记真实调用,并在采集结束后调用 `ctx.sealUsage`。随后可以直接用 `t.usage.cacheRead` 设置缓存读取率门槛:
|
|
114
114
|
|
|
115
115
|
```ts
|
|
116
|
-
import { atLeast } from "niceeval/expect";
|
|
116
|
+
import { atLeast, ratio } from "niceeval/expect";
|
|
117
117
|
|
|
118
|
-
t.check(t.usage.cacheRead.rate("planner"), atLeast(0.6)).gate();
|
|
118
|
+
t.check(t.usage.cacheRead.rate("planner"), atLeast(ratio(0.6))).gate();
|
|
119
119
|
// 不区分用途时,检查所有已登记调用的合计。
|
|
120
|
-
t.check(t.usage.cacheRead.rate(), atLeast(0.6)).gate();
|
|
120
|
+
t.check(t.usage.cacheRead.rate(), atLeast(ratio(0.6))).gate();
|
|
121
121
|
```
|
|
122
122
|
|
|
123
123
|
读取率是同组调用的 **缓存读取 token 总量 / 含缓存输入 token 总量**,包括失败调用与重试。它不是逐次百分比的平均值。每次调用优先使用 `inputTotalTokens`;没有独立总量时,必须同时提供 `inputTokens`、`cacheReadTokens`、`cacheWriteTokens` 三个互斥桶。
|
|
124
124
|
|
|
125
|
-
`cacheRead.total` 给出整个 Attempt 的结果,`
|
|
125
|
+
`cacheRead.total` 给出整个 Attempt 的结果,`roles` 按用途分组,`models` 进一步按真实 `provider` 和 `model` 分组。未知身份保持 `null`,不会用配置值补齐。`coveredCalls / recordedCalls` 表示已登记调用的输入覆盖率;`collectionComplete` 单独表示采集是否完整。
|
|
126
126
|
|
|
127
127
|
缺失输入、未 seal、partial seal、unknown 调用状态、空组或零分母均返回 `unavailable`,`reasons` 列出原因。缺失不按零处理;完整且有正输入总量的零缓存读取率才是数值 0。旧账本没有明确的生产者完整性声明时,也返回不可判定。
|
|
128
128
|
|
|
129
129
|
使用 `niceeval show <Attempt locator> --usage` 或 View 查看读取率、覆盖情况与原因;脚本通过 `attempt.usage` 的 `usage.cacheRead` 读取相同报告。已有 `recordUsage` 调用无需改名,但必须登记缓存 token,并在采集完成后诚实 seal。无需迁移历史结果文件。
|
|
130
130
|
|
|
131
131
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
Eval 可以被多个 Experiment
|
|
132
|
+
角色名来自 Experiment 的 `models` 键,不是框架内置名单。`model` 单模型简写对应 `default`。
|
|
133
|
+
传入未声明的角色会在调用处报错,并列出可用名称。已声明但完整记录中没有调用的角色返回 `role-has-no-calls`;采集不完整时仍返回 `collection-incomplete`。
|
|
134
|
+
Eval 可以被多个 Experiment 复用,因此此入口在运行回调里校验角色,不在定义期检查动态字符串。
|
|
135
135
|
|
|
136
136
|
### 登记命令行 Agent 的用量
|
|
137
137
|
|
|
138
|
-
Adapter 应按外部回执记录真实调用,并将 `
|
|
138
|
+
Adapter 应按外部回执记录真实调用,并将 `modelRole` 设为 Experiment 声明的用途,例如 `mind`。
|
|
139
139
|
同一请求的流式增量和最终回执不能各登记一次;先按请求 ID 合并,收到最终回执后再登记。
|
|
140
140
|
|
|
141
141
|
```ts
|
|
142
142
|
// 单次 Claude 请求的最终 usage;字段缺失时保留 null。
|
|
143
143
|
ctx.recordUsage({
|
|
144
144
|
callId: requestId,
|
|
145
|
-
|
|
145
|
+
modelRole: "mind",
|
|
146
146
|
provider: observedProvider,
|
|
147
147
|
model: observedModel,
|
|
148
148
|
status: observedStatus,
|
|
@@ -168,3 +168,43 @@ ctx.sealUsage({ state: "partial", reason: "usage-not-exposed" });
|
|
|
168
168
|
```
|
|
169
169
|
|
|
170
170
|
确实拿到全部物理调用的最终记录后,再调用 `ctx.sealUsage({ state: "complete" })`。
|
|
171
|
+
|
|
172
|
+
## 让模型用途名称参与类型检查
|
|
173
|
+
|
|
174
|
+
从 0.18 起,共享声明让同一评估可用于多个实验,同时在编译时检查用途名称:
|
|
175
|
+
|
|
176
|
+
```ts title="models.ts"
|
|
177
|
+
import { defineModelRoles } from "niceeval";
|
|
178
|
+
|
|
179
|
+
export const roles = defineModelRoles({
|
|
180
|
+
mind: { model: "provider/planner" },
|
|
181
|
+
speech: { model: "provider/speaker" },
|
|
182
|
+
});
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
在已有 Adapter 的绑定工厂上声明要求。也可解构 `adapter.defineScoreEval`,但根入口的同名工厂不接受 `requires`:
|
|
186
|
+
|
|
187
|
+
```ts title="evals/cache.eval.ts"
|
|
188
|
+
import { atLeast, ratio } from "niceeval/expect";
|
|
189
|
+
import { adapter } from "../adapter";
|
|
190
|
+
import { roles } from "../models";
|
|
191
|
+
|
|
192
|
+
export default adapter.defineScoreEval({
|
|
193
|
+
requires: { models: roles },
|
|
194
|
+
test(t) {
|
|
195
|
+
t.check(t.usage.cacheRead.rate("mind"), atLeast(ratio(0.6))).gate();
|
|
196
|
+
// rate("mimd") 会产生 TypeScript 错误;rate() 仍查询全部用途的合计。
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
实验使用 `defineExperiment({ adapter, models: roles, evals: ["cache"] })`。
|
|
202
|
+
其它实验可为这些用途选择不同模型;`requires` 要求用途存在,不要求模型值相同。
|
|
203
|
+
加载实验时会检查它选中的全部评估,CLI 的标签或前缀过滤不能隐藏缺失用途。
|
|
204
|
+
|
|
205
|
+
给 `defineAdapter` 也传入 `requires: { models: roles }`,即可同时收窄 `ctx.models` 和 `ctx.recordUsage` 的 `modelRole`。
|
|
206
|
+
`null` 或省略的 `modelRole` 仍表示未归属到用途的调用。已声明但本次没有调用时,`rate` 返回原因 `role-has-no-calls` 的不可用材料。
|
|
207
|
+
|
|
208
|
+
0.17.x 中省略 `requires` 的写法在 0.18 继续兼容,名称仍在调用时校验。
|
|
209
|
+
迁移时先提取共享声明,再给 Adapter 和绑定评估分别添加 `requires`。
|
|
210
|
+
不要先把声明标注成 `Record<string, ModelRoleSelection>`,否则 TypeScript 已丢失具体键,无法检测拼写错误。
|
|
@@ -98,7 +98,7 @@ export default defineExperiment({
|
|
|
98
98
|
});
|
|
99
99
|
```
|
|
100
100
|
|
|
101
|
-
这里不要写 `sandboxReuse: true`。`maxConcurrency: 4` 是整个 Experiment
|
|
101
|
+
这里不要写 `sandboxReuse: true`。`maxConcurrency: 4` 是整个 Experiment 的上限,不会让同组同时跑四个;剩下的并发名额留给其它组和没分组的评估用例。
|
|
102
102
|
|
|
103
103
|
评估组只能和在 Sandbox 里运行的 Agent、支持复用的 Provider 一起用。不带 Sandbox 的 Agent 不能运行评估组。
|
|
104
104
|
|
|
@@ -25,7 +25,7 @@ export default defineEval({
|
|
|
25
25
|
async test(t) {
|
|
26
26
|
const turn = await t.send("修复测试并说明原因。");
|
|
27
27
|
|
|
28
|
-
t.check(turn.
|
|
28
|
+
t.check(turn.reply, includes("原因")).label("说明失败原因");
|
|
29
29
|
|
|
30
30
|
const tests = await t.sandbox.runCommand("pnpm", ["test"]);
|
|
31
31
|
await t.check(tests, commandSucceeded()).label("测试通过").orStop();
|
|
@@ -40,7 +40,7 @@ Boolean `matched` 进入 Verdict;`mismatched` 使最终 Verdict 为 `failed`
|
|
|
40
40
|
`similarity(...)` 这类 Match 产生 `[0, 1]` 的 measurement。它计算字符级 Levenshtein 编辑相似度,不判断语义。通过制评估在 handle 上用 `.gate(minimum)` 建立质量门:
|
|
41
41
|
|
|
42
42
|
```ts
|
|
43
|
-
t.check(turn.
|
|
43
|
+
t.check(turn.reply, similarity(expected))
|
|
44
44
|
.gate(0.8)
|
|
45
45
|
.label("回答接近期望内容");
|
|
46
46
|
```
|
|
@@ -66,7 +66,7 @@ export default defineScoreEval({
|
|
|
66
66
|
t.check(health, commandSucceeded()).score(1).label("健康检查可达");
|
|
67
67
|
t.check(health.stdout, includes("ok")).score(1).label("健康检查内容正确");
|
|
68
68
|
|
|
69
|
-
t.check(turn.
|
|
69
|
+
t.check(turn.reply, includes("验证")).score(2).label("回复说明验证方法");
|
|
70
70
|
|
|
71
71
|
t.score(1).label("代码精简");
|
|
72
72
|
},
|
|
@@ -89,7 +89,7 @@ export default defineScoreEval({
|
|
|
89
89
|
## Judge 也是 Measurement
|
|
90
90
|
|
|
91
91
|
`defineJudge` 声明一个受管 Judge Match。作者把完成判断所需的值组成带语义字段的材料。
|
|
92
|
-
裁判可以直接传给 `t.judge`,无需在评估上登记。模型默认使用项目的 `
|
|
92
|
+
裁判可以直接传给 `t.judge`,无需在评估上登记。模型默认使用项目的 `judgeProvider`;单题只换模型时设置 `judge: "judge-model"`。
|
|
93
93
|
|
|
94
94
|
```ts
|
|
95
95
|
const explainsMotive = defineJudge({
|
|
@@ -105,7 +105,7 @@ export default defineEval({
|
|
|
105
105
|
async test(t) {
|
|
106
106
|
const change = "把缓存键加入模型版本";
|
|
107
107
|
const turn = await t.send(`说明这项变更的动机和风险:${change}`);
|
|
108
|
-
const material = { change, explanation: turn.
|
|
108
|
+
const material = { change, explanation: turn.reply };
|
|
109
109
|
t.judge(material, explainsMotive).gate(0.8).label("变更动机");
|
|
110
110
|
t.judge(material, explainsRisk).gate(0.8).label("具体风险");
|
|
111
111
|
},
|
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "启动实验共享服务"
|
|
3
3
|
sidebarTitle: "实验共享服务"
|
|
4
|
-
description: "用 Experiment 的
|
|
4
|
+
description: "用 Experiment 的 before / after 启停整个实验共用的隧道、mock server 或租约,把运行时地址交给 Agent 和 Sandbox,又不让它作废已有结果。"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
你在评估一个接入了记忆服务的 Coding Agent。记忆服务跑在内网,每次评估前要先开一条隧道,拿到一个临时地址,再把地址告诉 Agent。隧道开一次就够,几十个 Attempt 共用;全部跑完后要记得关掉。
|
|
8
8
|
|
|
9
|
-
这类“一个实验一份、所有 Attempt 共用”的资源,写进 Experiment 的 `
|
|
9
|
+
这类“一个实验一份、所有 Attempt 共用”的资源,写进 Experiment 的 `before` 和 `after`。
|
|
10
10
|
|
|
11
|
-
## 写一对
|
|
11
|
+
## 写一对 before / after
|
|
12
12
|
|
|
13
13
|
```ts
|
|
14
14
|
// experiments/memory/codex.ts
|
|
15
15
|
import { defineExperiment } from "niceeval";
|
|
16
16
|
import { nowledgeAgent, nowledgeTunnel } from "../../agents/nowledge.ts";
|
|
17
17
|
|
|
18
|
-
//
|
|
18
|
+
// before 拿到的坐标放在模块变量里,after 和 Agent 都能读到
|
|
19
19
|
let tunnel: { url: string; apiKey: string; stop(): Promise<void> } | undefined;
|
|
20
20
|
|
|
21
21
|
export default defineExperiment({
|
|
22
22
|
agent: nowledgeAgent(() => ({ url: tunnel!.url, apiKey: tunnel!.apiKey })),
|
|
23
23
|
evals: ["memory/"],
|
|
24
|
-
async
|
|
24
|
+
async before(ctx) {
|
|
25
25
|
ctx.progress({ message: "starting nowledge tunnel" });
|
|
26
26
|
tunnel = await nowledgeTunnel({ signal: ctx.signal });
|
|
27
27
|
},
|
|
28
|
-
async
|
|
28
|
+
async after(ctx) {
|
|
29
29
|
ctx.progress({ message: "stopping nowledge tunnel" });
|
|
30
30
|
await tunnel?.stop();
|
|
31
31
|
},
|
|
@@ -34,23 +34,23 @@ export default defineExperiment({
|
|
|
34
34
|
|
|
35
35
|
两个回调在你自己的机器上执行,各自最多跑一次:
|
|
36
36
|
|
|
37
|
-
- `
|
|
38
|
-
- `
|
|
39
|
-
- 只要 `
|
|
37
|
+
- `before` 在这个实验第一个要真正执行的 Attempt 之前运行。
|
|
38
|
+
- `after` 在全部 Attempt 结束后运行,运行被中断时也会执行。
|
|
39
|
+
- 只要 `before` 开始过,`after` 就一定会执行,`before` 抛错也一样。所以 `after` 里要防御变量还没赋值的情况,上面用的是 `tunnel?.stop()`。
|
|
40
40
|
- 上次的结果全部能沿用、这次一个 Attempt 都不用真正执行时,两者都不会运行。
|
|
41
41
|
|
|
42
|
-
`
|
|
42
|
+
`before` 运行期间,终端 `ACTIVE` 区会显示一行 `experiment before · <实验 id>`,`ctx.progress(...)` 的消息更新在这一行末尾。这时该实验的 Attempt 计入排队数,不是卡住了。
|
|
43
43
|
|
|
44
|
-
##
|
|
44
|
+
## before 失败时会发生什么
|
|
45
45
|
|
|
46
|
-
`
|
|
46
|
+
`before` 抛错时,这个实验的每个 Attempt 都记为 `errored`,错误码是 `experiment-setup-failed`。同一批里的其它实验照常运行。环境没起来不会被算成通过,也不会拖累别的实验。
|
|
47
47
|
|
|
48
|
-
##
|
|
48
|
+
## after 里先保证释放
|
|
49
49
|
|
|
50
50
|
释放资源是必须做到的事,健康检查、上报指标这类观测只是尽力而为。用 `try/finally` 包住,观测出错也不能挡住释放;运行被中断时直接跳过观测:
|
|
51
51
|
|
|
52
52
|
```ts
|
|
53
|
-
async
|
|
53
|
+
async after(ctx) {
|
|
54
54
|
try {
|
|
55
55
|
if (!ctx.signal.aborted) {
|
|
56
56
|
await tunnel?.probe({ timeoutMs: 10_000 }).catch(() => {});
|
|
@@ -76,7 +76,7 @@ export default defineExperiment({
|
|
|
76
76
|
.before(async (sandbox) => {
|
|
77
77
|
await sandbox.writeText(".nowledge/env", `NMEM_URL=${endpoint!}\n`);
|
|
78
78
|
}),
|
|
79
|
-
async
|
|
79
|
+
async before(ctx) {
|
|
80
80
|
endpoint = (await nowledgeTunnel({ signal: ctx.signal })).url;
|
|
81
81
|
},
|
|
82
82
|
});
|
|
@@ -95,12 +95,12 @@ $ pnpm exec niceeval exp compare/codex--nowledge
|
|
|
95
95
|
判断一个值该放哪里,问一句:它是不是你想比较的实验条件?
|
|
96
96
|
|
|
97
97
|
- 是,例如记忆服务的版本号 `0.10.39`,换版本行为可能真的不同,写进 `flags`,变了就该重跑。
|
|
98
|
-
- 不是,只是这一次的连接坐标,留在 `
|
|
98
|
+
- 不是,只是这一次的连接坐标,留在 `before` 和模块变量里。
|
|
99
99
|
- 只用来给报告分组的标注,写 `labels`。
|
|
100
100
|
|
|
101
101
|
## 在 Sandbox 里准备环境
|
|
102
102
|
|
|
103
|
-
`
|
|
103
|
+
`before` / `after` 管的是你机器上的服务。Agent 运行前要在 Sandbox 里做的准备,例如写入配置、装二进制、载入上次保存的状态,挂在 `sandbox` 的 `.before()` 上。它对每个真正执行的 Attempt 跑一次,一定晚于 `before`,所以能读到 `before` 赋好的变量:
|
|
104
104
|
|
|
105
105
|
```ts
|
|
106
106
|
// experiments/compare/claude--nowledge.ts
|
|
@@ -128,16 +128,16 @@ export default defineExperiment({
|
|
|
128
128
|
await saveMemoryState(sandbox, ctx.experimentId);
|
|
129
129
|
});
|
|
130
130
|
}),
|
|
131
|
-
async
|
|
131
|
+
async before(ctx) {
|
|
132
132
|
tunnel = await nowledgeTunnel({ signal: ctx.signal });
|
|
133
133
|
},
|
|
134
|
-
async
|
|
134
|
+
async after() {
|
|
135
135
|
await tunnel?.stop();
|
|
136
136
|
},
|
|
137
137
|
});
|
|
138
138
|
```
|
|
139
139
|
|
|
140
|
-
从上往下读,这个文件就是完整的运行说明:整个实验一份的服务在 `
|
|
140
|
+
从上往下读,这个文件就是完整的运行说明:整个实验一份的服务在 `before` / `after`,每个 Sandbox 的准备和收尾在 `.before()` 和 `ctx.onCleanup`。
|
|
141
141
|
|
|
142
142
|
Agent CLI、系统包这类固定不变的安装,最好先做进镜像或 template。NiceEval 会复用没变的准备步骤,不会因为评估用例改了就重装一遍。做法见 [预制 Sandbox 环境 · 从官方基线继续构建](/zh/tutorials/prebuilt-sandbox#从官方基线继续构建)。
|
|
143
143
|
|
|
@@ -164,18 +164,18 @@ export function nowledgeLifecycle() {
|
|
|
164
164
|
let env: { url: string; apiKey: string } | undefined;
|
|
165
165
|
|
|
166
166
|
return {
|
|
167
|
-
/** Agent 工厂经它读连接信息,
|
|
167
|
+
/** Agent 工厂经它读连接信息,before 之后才有值 */
|
|
168
168
|
endpoint: () => env!,
|
|
169
169
|
|
|
170
|
-
async
|
|
170
|
+
async before(ctx: ExperimentHookContext) {
|
|
171
171
|
instance = `exp-${ctx.experimentId.replace(/[^A-Za-z0-9]+/g, "-")}`;
|
|
172
172
|
ctx.progress({ message: `[nowledge] activating ${instance}` });
|
|
173
173
|
await memctl("up", instance);
|
|
174
174
|
env = await readInstanceEnv(instance);
|
|
175
175
|
},
|
|
176
176
|
|
|
177
|
-
async
|
|
178
|
-
if (!instance) return; //
|
|
177
|
+
async after() {
|
|
178
|
+
if (!instance) return; // before 还没起实例就失败了,没有要清理的
|
|
179
179
|
await memctl("down", instance);
|
|
180
180
|
},
|
|
181
181
|
|
|
@@ -198,15 +198,15 @@ const nowledge = nowledgeLifecycle();
|
|
|
198
198
|
export default defineExperiment({
|
|
199
199
|
agent: codexAgent(nowledgeCodexConfig(nowledge.endpoint)),
|
|
200
200
|
sandbox: e2bSandbox({ template: CODEX_TEMPLATE }).before(nowledge.sandboxBefore()),
|
|
201
|
-
|
|
202
|
-
|
|
201
|
+
before: nowledge.before,
|
|
202
|
+
after: nowledge.after,
|
|
203
203
|
maxConcurrency: 1,
|
|
204
204
|
});
|
|
205
205
|
```
|
|
206
206
|
|
|
207
207
|
这样写要守住两条,多个实验并发运行时才不会互相覆盖:
|
|
208
208
|
|
|
209
|
-
- 工厂函数被调用时只创建闭包,不做 I/O,也不读配置。`niceeval exp` 在发现阶段就会 import 实验文件,这时抛错会连累同一批里无关的实验。所有可能失败的操作都放进 `
|
|
209
|
+
- 工厂函数被调用时只创建闭包,不做 I/O,也不读配置。`niceeval exp` 在发现阶段就会 import 实验文件,这时抛错会连累同一批里无关的实验。所有可能失败的操作都放进 `before`。
|
|
210
210
|
- 运行时坐标放在工厂闭包里,不放在模块级单例里。并行的两个实验各持一份,互不覆写。
|
|
211
211
|
|
|
212
212
|
服务起多份太贵、必须让同一批实验共用一个实例时,用引用计数:第一个进来的启动,最后一个离开的关闭。
|
|
@@ -218,12 +218,12 @@ let starting: Promise<void> | undefined;
|
|
|
218
218
|
let service: { url: string; stop(): Promise<void> } | undefined;
|
|
219
219
|
|
|
220
220
|
export const sharedNowledge = {
|
|
221
|
-
async
|
|
221
|
+
async before() {
|
|
222
222
|
refs += 1;
|
|
223
223
|
starting ??= startNowledge().then((s) => { service = s; });
|
|
224
224
|
await starting; // 并发的实验等同一次启动
|
|
225
225
|
},
|
|
226
|
-
async
|
|
226
|
+
async after() {
|
|
227
227
|
refs -= 1;
|
|
228
228
|
if (refs === 0) {
|
|
229
229
|
await service?.stop(); // 启动失败时 service 没有值
|
|
@@ -234,10 +234,10 @@ export const sharedNowledge = {
|
|
|
234
234
|
};
|
|
235
235
|
```
|
|
236
236
|
|
|
237
|
-
因为 `
|
|
237
|
+
因为 `before` 开始过就一定会配对执行 `after`,计数总能回到 0,不会泄漏。
|
|
238
238
|
|
|
239
239
|
## 跨多次运行存在的服务
|
|
240
240
|
|
|
241
|
-
`
|
|
241
|
+
`before` 启动的服务活不过这一次 `niceeval exp`。需要先起好、连续跑好几次的服务,用 `docker compose` 这类外部工具启停,再通过环境变量把地址传给 Adapter。
|
|
242
242
|
|
|
243
|
-
`
|
|
243
|
+
`before` 和 `after` 的完整参数见 [Experiment](/zh/explanation/experiment)。Sandbox 准备步骤的顺序、缓存和收尾见 [Sandbox · 按顺序准备 Sandbox](/zh/tutorials/sandbox-providers#按顺序准备-sandbox)。
|
|
@@ -95,35 +95,9 @@ export default defineEval({
|
|
|
95
95
|
|
|
96
96
|
错误消息会出现在终端和运行记录中。请写明发生了什么,以及下一步怎么修复。
|
|
97
97
|
|
|
98
|
-
##
|
|
98
|
+
## 共享服务在执行中断开
|
|
99
99
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
```ts
|
|
103
|
-
// experiments/compare.ts
|
|
104
|
-
import { defineExperiment } from "niceeval";
|
|
105
|
-
|
|
106
|
-
const serviceHost = "memory.internal.example";
|
|
107
|
-
|
|
108
|
-
export default defineExperiment({
|
|
109
|
-
// agent 和 sandbox 配置省略
|
|
110
|
-
classifyFailure({ text }) {
|
|
111
|
-
const isOurService = text.includes(serviceHost);
|
|
112
|
-
const isConnectionFailure = /ECONNREFUSED|ENOTFOUND|connection refused/i.test(text);
|
|
113
|
-
|
|
114
|
-
if (isOurService && isConnectionFailure) {
|
|
115
|
-
return {
|
|
116
|
-
retryable: false,
|
|
117
|
-
scope: "experiment",
|
|
118
|
-
reason: "shared_service_unavailable",
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
return undefined;
|
|
122
|
-
},
|
|
123
|
-
});
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
只识别你能确定影响范围的服务。不要把所有 `ECONNREFUSED` 都当成实验级故障,因为 Agent 访问其他站点时也可能出现同样的错误。
|
|
100
|
+
在能够确认影响范围的调用边界捕获 SDK 错误,抛出 `ExperimentFatalError` 或 `EvalFatalError`,并通过 cause 保留原始错误。Experiment 不再接受 `classifyFailure`;内建重试规则与 Adapter 的 `classifySendFailure` 保留。
|
|
127
101
|
|
|
128
102
|
## 修好后补跑没完成的部分
|
|
129
103
|
|
|
@@ -1,176 +1,82 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: "用 Plugin
|
|
2
|
+
title: "用 Plugin 复用运行条件"
|
|
3
3
|
sidebarTitle: "Plugin"
|
|
4
|
-
description: "
|
|
4
|
+
description: "把 Agent 扩展、Sandbox 步骤与宿主生命周期装进一个可复用的实验条件。"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
多个 Experiment 使用相同 Skill、MCP 服务或环境准备时,把条件写成一个 Plugin,再通过 `plugins` 数组挂载。
|
|
8
|
+
Plugin 声明条件;Sandbox template 仍由 Eval、Eval Group 或 Experiment 的 `sandbox` 字段提供。
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
## 定义实例或工厂
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
Agent 自己的 Skill、MCP server 和原生 Plugin 也不归这里管,它们仍传给 Agent factory,例如 `codexAgent({ plugins: [...] })`。
|
|
14
|
-
|
|
15
|
-
## 第 1 步:写一个 Plugin
|
|
16
|
-
|
|
17
|
-
把这套条件写成一个 Plugin,放在几个 Experiment 都能导入的位置。所有 Plugin API 从 `niceeval/plugin` 导入。
|
|
18
|
-
|
|
19
|
-
下面这个例子在宿主机上起停记忆服务,并在 Sandbox 里上传插件文件、写入连接配置:
|
|
12
|
+
对象定义直接得到实例,函数定义得到单参数工厂。`name` 与 `identity` 必填;`key` 默认 `"default"`。
|
|
20
13
|
|
|
21
14
|
```ts
|
|
22
|
-
// experiments/shared/memory.ts
|
|
23
15
|
import { definePlugin } from "niceeval/plugin";
|
|
24
|
-
import {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
behaviorRevision: "2",
|
|
38
|
-
instanceKey: ({ model }) => model,
|
|
39
|
-
|
|
40
|
-
experiment: ({ model }) => ({
|
|
41
|
-
identity: { model },
|
|
42
|
-
setup: (context) => {
|
|
43
|
-
context.progress({ message: `启动 ${model} memory service` });
|
|
44
|
-
},
|
|
45
|
-
teardown: (context) => {
|
|
46
|
-
context.progress({ message: `停止 ${model} memory service` });
|
|
47
|
-
},
|
|
48
|
-
}),
|
|
49
|
-
|
|
50
|
-
sandbox: ({ model }) => sandboxLayer()
|
|
51
|
-
.before(uploadDirectory({
|
|
52
|
-
id: "memory-plugin-files",
|
|
53
|
-
source: new URL("fixtures/memory-plugin/", import.meta.url),
|
|
54
|
-
to: ".agents/plugins/memory",
|
|
55
|
-
changeFrequency: changeFrequency.rare,
|
|
56
|
-
}))
|
|
57
|
-
.before(writeText({
|
|
58
|
-
id: "memory-plugin-config",
|
|
59
|
-
path: ".memory/config.json",
|
|
60
|
-
text: JSON.stringify({ model }),
|
|
61
|
-
changeFrequency: changeFrequency.frequent,
|
|
62
|
-
})),
|
|
63
|
-
});
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
几个字段各管一件事:
|
|
67
|
-
|
|
68
|
-
- `name` 和 `instanceKey` 一起区分同一个 Plugin 的不同实例,这里按 `model` 区分。
|
|
69
|
-
- `experiment` 里的 `setup` / `teardown` 在宿主机上运行,适合起停服务、开隧道。
|
|
70
|
-
- `sandbox` 返回一个 `sandboxLayer()`,里面用和普通代码相同的 `.before()` / `.after()` 准备 Sandbox。
|
|
71
|
-
|
|
72
|
-
Sandbox 里的准备步骤用内置的 `uploadDirectory()`、`writeText()`、`gitCheckout()`、`shell()` 等函数写。它们和 Experiment、评估用例里的准备步骤一起排序,没变的步骤在 Docker 上可以直接沿用上次的准备结果。Plugin 不需要自己处理上传或 clone。
|
|
73
|
-
|
|
74
|
-
需要运行时才能决定的分支,可以在返回的 layer 里写 `.before(async (sandbox, context) => ...)`。这种回调每次都真实执行,它后面的准备步骤也不再沿用缓存。成功取得资源后,立即用 `context.onCleanup()` 登记释放。
|
|
75
|
-
|
|
76
|
-
<Warning>
|
|
77
|
-
`sandbox` 必须返回 `sandboxLayer()`。返回 `dockerSandbox()`、`e2bSandbox()` 这类选择了镜像或 template 的 layer,会在加载定义时报错。Plugin 不能替换调用方选择的 Provider。
|
|
78
|
-
</Warning>
|
|
79
|
-
|
|
80
|
-
### 从 Git 仓库取 Plugin 源码
|
|
81
|
-
|
|
82
|
-
Plugin 源码在一个能 clone 的仓库里时,用 `gitCheckout()`,`ref` 填完整的 commit ID。branch 或 tag 会移动,NiceEval 无法据此判断内容变没变,所以不接受:
|
|
83
|
-
|
|
84
|
-
```ts
|
|
85
|
-
import {
|
|
86
|
-
gitCheckout,
|
|
87
|
-
sandboxLayer,
|
|
88
|
-
} from "niceeval/sandbox";
|
|
89
|
-
|
|
90
|
-
const pluginSource = sandboxLayer().before(gitCheckout({
|
|
91
|
-
id: "memory-plugin-source",
|
|
92
|
-
repository: "https://github.com/acme/memory-plugin.git",
|
|
93
|
-
ref: "0123456789abcdef0123456789abcdef01234567",
|
|
94
|
-
to: ".agents/plugins/memory",
|
|
16
|
+
import { writeText } from "niceeval/sandbox";
|
|
17
|
+
|
|
18
|
+
export const memory = definePlugin(({ version }: { version: string }) => ({
|
|
19
|
+
name: "example.memory",
|
|
20
|
+
identity: { version },
|
|
21
|
+
agent: { skills: [{ kind: "local", path: "./skills/memory" }] },
|
|
22
|
+
sandbox: {
|
|
23
|
+
before: writeText({ id: "memory-mode", path: "/tmp/memory-mode", text: version }),
|
|
24
|
+
},
|
|
25
|
+
experiment: {
|
|
26
|
+
before: (ctx) => ctx.progress({ message: "Prepare memory service" }),
|
|
27
|
+
after: (ctx) => ctx.progress({ message: "Release memory service" }),
|
|
28
|
+
},
|
|
95
29
|
}));
|
|
96
30
|
```
|
|
97
31
|
|
|
98
|
-
源码在本地目录时用 `uploadDirectory()`,`source` 写成相对当前文件的 `new URL("...", import.meta.url)`。目录里的文件内容、权限和 symlink 变化都会被自动发现:改一个文件,只有上传这个目录的步骤和它后面的步骤会重新执行。
|
|
99
|
-
|
|
100
|
-
## 第 2 步:挂到 Experiment、评估组或评估用例
|
|
101
|
-
|
|
102
|
-
只用一两个 Plugin 时,直接传数组:
|
|
103
|
-
|
|
104
32
|
```ts
|
|
105
33
|
export default defineExperiment({
|
|
106
|
-
|
|
107
|
-
plugins: [memory({
|
|
108
|
-
sandbox: dockerSandbox({
|
|
109
|
-
source: { type: "image", image: "niceeval/codex:0.144.1-r1" },
|
|
110
|
-
}),
|
|
34
|
+
adapter: codexAgent(),
|
|
35
|
+
plugins: [memory({ version: "1" })],
|
|
111
36
|
});
|
|
112
37
|
```
|
|
113
38
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
```ts
|
|
117
|
-
import { pluginStack } from "niceeval/plugin";
|
|
118
|
-
|
|
119
|
-
const observability = pluginStack().use(telemetry());
|
|
120
|
-
const withMemory = observability.use(memory({ model: "gpt-5.6-luna" }));
|
|
39
|
+
`before` 与 `after` 接受一个元素或数组。共享一组条件时使用普通数组展开:`plugins: [...basePlugins, condition]`。
|
|
40
|
+
同一 Attempt 的生效集合中,`name` 和 `key` 的组合必须唯一,包括跨 Experiment、Eval Group 与 Eval 的重复挂载。
|
|
121
41
|
|
|
122
|
-
|
|
123
|
-
agent: codexAgent(),
|
|
124
|
-
plugins: withMemory,
|
|
125
|
-
sandbox: dockerSandbox({
|
|
126
|
-
source: { type: "image", image: "niceeval/codex:0.144.1-r1" },
|
|
127
|
-
}),
|
|
128
|
-
});
|
|
129
|
-
```
|
|
42
|
+
## 选择执行范围
|
|
130
43
|
|
|
131
|
-
|
|
44
|
+
| 字段 | 执行时机 | 允许挂载位置 |
|
|
45
|
+
| --- | --- | --- |
|
|
46
|
+
| `agent` | 合并进内建 Agent factory | Experiment |
|
|
47
|
+
| `experiment` | 每个有 fresh Attempt 的 Run 一次 | Experiment |
|
|
48
|
+
| `group` | 每条有 fresh Attempt 的 Group lane 一次 | Experiment、Eval Group |
|
|
49
|
+
| `sandbox` | 每条 fresh Attempt,reset 之后 | Experiment、Eval Group、Eval |
|
|
50
|
+
| `attempt` | 每条 fresh Attempt 一次 | Experiment、Eval Group、Eval |
|
|
132
51
|
|
|
133
|
-
|
|
52
|
+
全部沿用历史结果时,这些 Hook 与 Sandbox 创建都不执行。before 按作者、Plugin 声明顺序运行;after 按已激活顺序逆序运行。
|
|
53
|
+
宿主 after 失败记录 warning,并继续其余收尾;Agent after 失败会使 Attempt 失败,但仍继续剩余 after 与 finalizer。
|
|
134
54
|
|
|
135
|
-
|
|
55
|
+
回调需要 Group 时,声明 `requires: { evalGroup: true }`,即可直接读取 `ctx.evalGroup.id`。
|
|
56
|
+
选中 Group 外的 Eval 会在创建资源前失败,包括全部沿用结果的情况。
|
|
136
57
|
|
|
137
|
-
|
|
58
|
+
## 合并 Agent 扩展
|
|
138
59
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
| `group(options)` | 每个 Experiment 和评估组的组合一次 |
|
|
143
|
-
| `eval(options)` | 每个确实要跑的 Attempt 一次 |
|
|
60
|
+
`agent.skills` 与 `agent.mcpServers` 提供通用扩展;`agent.codex`、`agent.claudeCode` 与 `agent.bub` 提供对应工厂的原生配置。
|
|
61
|
+
factory 配置在前,Plugin 按数组顺序追加。Skill 或 MCP 重名、原生插件冲突、多个 configFile 都会报错。
|
|
62
|
+
Bub 不接受 MCP;自定义 Adapter 不接受 agent 扩展。声明专用子项时,必须包含当前选择的 Agent。
|
|
144
63
|
|
|
145
|
-
|
|
64
|
+
## 让条件变化触发重跑
|
|
146
65
|
|
|
147
|
-
`
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
Plugin 的行为变了,沿用上次的结果就不再可信。NiceEval 能看到一部分变化,另一部分要你告诉它:
|
|
152
|
-
|
|
153
|
-
- 改了宿主机 `setup` / `teardown` 的行为时,把 `behaviorRevision` 加一。NiceEval 看不到函数体的变化。
|
|
154
|
-
- 改了 Sandbox 里的内置准备步骤(命令、文件、commit)时,不用做任何事,这些变化会被自动发现。
|
|
155
|
-
- 自定义的准备步骤只在 NiceEval 观察不到的协议变化时,才补一个 `cache.fingerprint`。
|
|
156
|
-
|
|
157
|
-
改完后先用 `pnpm exec niceeval exp <experiment> --dry` 确认受影响的题会重跑。
|
|
158
|
-
|
|
159
|
-
## 运行前检查 Plugin 加进了哪些步骤
|
|
160
|
-
|
|
161
|
-
挂上 Plugin 后,先看它的准备步骤排在哪里,再花钱运行:
|
|
66
|
+
`identity` 是条件版本。受管 Action 内容、Skill 内容与配置文件内容也参与身份;MCP headers 与 env 不参与。
|
|
67
|
+
只改 Experiment 模块里的回调函数体不会改变 Plugin 身份;需要重跑时修改 `identity` 或使用 `--rerun all`。
|
|
68
|
+
Eval 模块仍遵循源文件闭包规则。条件身份不会自动进入 `ctx.flags`,运行参数仍显式写在 flags 中。
|
|
162
69
|
|
|
163
70
|
```bash
|
|
164
71
|
pnpm exec niceeval debug compare/codex memory/smoke
|
|
165
|
-
pnpm exec niceeval
|
|
72
|
+
pnpm exec niceeval show --exp compare/codex
|
|
73
|
+
pnpm exec niceeval show --exp compare/codex --json
|
|
166
74
|
```
|
|
167
75
|
|
|
168
|
-
`debug`
|
|
169
|
-
|
|
170
|
-
Plugin 的步骤没出现在计划里时,先检查 `plugins` 是否挂在了你选中的 Experiment 或评估用例上。
|
|
76
|
+
`debug` 展示展开步骤、实际 Action 顺序与 Plugin 来源。`show` 和 `view` 的 Experiment 信息列出 Plugin 的 name、key 与 identity。
|
|
171
77
|
|
|
172
78
|
## 接着看
|
|
173
79
|
|
|
174
|
-
- [Sandbox
|
|
175
|
-
- [评估组](/zh/tutorials/eval-groups)
|
|
176
|
-
- [
|
|
80
|
+
- [Sandbox 准备](/zh/tutorials/sandbox-providers)
|
|
81
|
+
- [评估组](/zh/tutorials/eval-groups)
|
|
82
|
+
- [检查生命周期计划](/zh/tutorials/debug-lifecycle-plan)
|