@capybara-hq/kernel 0.1.0-rc.5 → 0.1.0-rc.7
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/bootstrap.json +27 -3
- package/dist/admin/admin.controller.d.ts +21 -74
- package/dist/admin/admin.controller.js +50 -50
- package/dist/admin/admin.schemas.d.ts +57 -0
- package/dist/admin/admin.schemas.js +50 -0
- package/dist/admin/extensions.controller.d.ts +10 -0
- package/dist/admin/extensions.controller.js +18 -0
- package/dist/admin/extensions.schemas.d.ts +7 -0
- package/dist/admin/extensions.schemas.js +10 -0
- package/dist/admin/limit-defaults.d.ts +20 -0
- package/dist/admin/limit-defaults.js +10 -0
- package/dist/agents/agent-profile.service.d.ts +7 -5
- package/dist/agents/agent-profile.service.js +14 -9
- package/dist/agents/agents.controller.d.ts +7 -287
- package/dist/agents/agents.controller.js +7 -67
- package/dist/agents/agents.schemas.d.ts +389 -0
- package/dist/agents/agents.schemas.js +126 -0
- package/dist/agents/agents.service.d.ts +16 -6
- package/dist/agents/agents.service.js +75 -19
- package/dist/agents/definition.d.ts +47 -19
- package/dist/agents/definition.js +119 -38
- package/dist/agents/from-template.d.ts +2 -2
- package/dist/agents/from-template.js +76 -45
- package/dist/agents/from-template.service.d.ts +12 -0
- package/dist/agents/from-template.service.js +23 -6
- package/dist/agents/models.controller.d.ts +33 -5
- package/dist/agents/models.controller.js +50 -6
- package/dist/agents/org-templates.d.ts +13 -3
- package/dist/agents/org-templates.js +69 -28
- package/dist/agents/pending-connector-requests.d.ts +2 -0
- package/dist/agents/pending-connector-requests.js +1 -1
- package/dist/agents/pending-connectors.controller.d.ts +1 -1
- package/dist/agents/pending-connectors.controller.js +2 -2
- package/dist/agents/pending-connectors.service.d.ts +2 -2
- package/dist/agents/pending-connectors.service.js +19 -19
- package/dist/agents/profile.d.ts +18 -0
- package/dist/agents/profile.js +5 -1
- package/dist/agents/readiness.controller.d.ts +5 -5
- package/dist/agents/readiness.controller.js +6 -6
- package/dist/agents/templates.controller.d.ts +8 -17
- package/dist/agents/templates.controller.js +13 -31
- package/dist/agents/templates.schemas.d.ts +20 -0
- package/dist/agents/templates.schemas.js +45 -0
- package/dist/background/background.controller.js +3 -2
- package/dist/background/background.schemas.d.ts +10 -0
- package/dist/background/background.schemas.js +16 -0
- package/dist/background/tasks.service.d.ts +1 -1
- package/dist/background/tasks.service.js +7 -2
- package/dist/catalog/admin-catalog.controller.d.ts +4 -57
- package/dist/catalog/admin-catalog.controller.js +8 -45
- package/dist/catalog/admin-catalog.schemas.d.ts +72 -0
- package/dist/catalog/admin-catalog.schemas.js +92 -0
- package/dist/catalog/catalog-content.d.ts +12 -2
- package/dist/catalog/catalog-scope.service.js +8 -2
- package/dist/catalog/catalog.service.d.ts +2 -0
- package/dist/catalog/catalog.service.js +3 -0
- package/dist/catalog/component-scope.controller.d.ts +3 -65
- package/dist/catalog/component-scope.controller.js +3 -56
- package/dist/catalog/component-scope.schemas.d.ts +114 -0
- package/dist/catalog/component-scope.schemas.js +97 -0
- package/dist/catalog/component-scope.service.d.ts +28 -4
- package/dist/catalog/component-scope.service.js +55 -3
- package/dist/catalog/component-state.d.ts +9 -2
- package/dist/catalog/component-state.js +22 -13
- package/dist/catalog/marketplaces.controller.d.ts +5 -35
- package/dist/catalog/marketplaces.controller.js +6 -34
- package/dist/catalog/marketplaces.schemas.d.ts +48 -0
- package/dist/catalog/marketplaces.schemas.js +53 -0
- package/dist/catalog/marketplaces.service.d.ts +15 -1
- package/dist/catalog/marketplaces.service.js +22 -1
- package/dist/catalog/org-catalog.controller.d.ts +6 -62
- package/dist/catalog/org-catalog.controller.js +12 -66
- package/dist/catalog/org-catalog.schemas.d.ts +79 -0
- package/dist/catalog/org-catalog.schemas.js +82 -0
- package/dist/catalog/org-catalog.service.d.ts +9 -2
- package/dist/catalog/org-catalog.service.js +38 -5
- package/dist/catalog/org-extension.controller.d.ts +1 -12
- package/dist/catalog/org-extension.controller.js +1 -10
- package/dist/catalog/org-extension.schemas.d.ts +15 -0
- package/dist/catalog/org-extension.schemas.js +22 -0
- package/dist/catalog/org-plugin-uploads.controller.d.ts +2 -19
- package/dist/catalog/org-plugin-uploads.controller.js +15 -28
- package/dist/catalog/org-plugin-uploads.schemas.d.ts +20 -0
- package/dist/catalog/org-plugin-uploads.schemas.js +32 -0
- package/dist/catalog/owned-items.d.ts +6 -2
- package/dist/catalog/owned-items.js +16 -4
- package/dist/catalog/platform-components.d.ts +2 -0
- package/dist/catalog/platform-components.js +2 -0
- package/dist/catalog/plugin-import.js +1 -0
- package/dist/catalog/plugin-install.js +1 -1
- package/dist/catalog/requests.service.d.ts +2 -1
- package/dist/catalog/requests.service.js +6 -2
- package/dist/channels/channels.schemas.d.ts +33 -0
- package/dist/channels/channels.schemas.js +34 -0
- package/dist/channels/connections.controller.d.ts +2 -29
- package/dist/channels/connections.controller.js +1 -23
- package/dist/channels/connections.service.d.ts +8 -2
- package/dist/channels/connections.service.js +23 -5
- package/dist/channels/inbound.js +4 -0
- package/dist/config/schema.d.ts +4 -0
- package/dist/config/schema.js +24 -0
- package/dist/conversations/conversations.controller.d.ts +16 -37
- package/dist/conversations/conversations.controller.js +16 -56
- package/dist/conversations/conversations.schemas.d.ts +52 -0
- package/dist/conversations/conversations.schemas.js +79 -0
- package/dist/conversations/conversations.service.d.ts +13 -4
- package/dist/conversations/conversations.service.js +32 -26
- package/dist/conversations/events.d.ts +80 -6
- package/dist/conversations/events.js +60 -5
- package/dist/conversations/message-context.d.ts +28 -0
- package/dist/conversations/message-context.js +56 -0
- package/dist/conversations/queue.d.ts +2 -1
- package/dist/conversations/queue.js +11 -2
- package/dist/ctx/create-ctx.d.ts +15 -1
- package/dist/ctx/create-ctx.js +23 -2
- package/dist/db/kernel-schema.d.ts +44 -0
- package/dist/environments/environments.schemas.d.ts +3 -0
- package/dist/environments/environments.schemas.js +14 -0
- package/dist/environments/environments.service.d.ts +16 -4
- package/dist/environments/environments.service.js +58 -13
- package/dist/errors.d.ts +6 -0
- package/dist/errors.js +6 -0
- package/dist/evals/evals.schemas.d.ts +110 -0
- package/dist/evals/evals.schemas.js +107 -0
- package/dist/evals/reconstruct.js +18 -11
- package/dist/evals/recorded-tools.d.ts +2 -1
- package/dist/evals/recorded-tools.js +11 -3
- package/dist/evals/run-replay.d.ts +8 -1
- package/dist/evals/run-replay.js +17 -2
- package/dist/evals/runs.controller.d.ts +2 -57
- package/dist/evals/runs.controller.js +1 -42
- package/dist/evals/runs.service.d.ts +8 -7
- package/dist/evals/runs.service.js +45 -30
- package/dist/evals/sets.controller.d.ts +2 -28
- package/dist/evals/sets.controller.js +1 -31
- package/dist/evals/sets.service.d.ts +7 -7
- package/dist/evals/sets.service.js +23 -17
- package/dist/evals/snapshot.d.ts +3 -2
- package/dist/evals/snapshot.js +17 -4
- package/dist/evals/step-replay.d.ts +2 -1
- package/dist/evals/step-replay.js +3 -2
- package/dist/extensions/admin-ops.d.ts +5 -3
- package/dist/extensions/admin-ops.js +17 -12
- package/dist/extensions/config-hash.d.ts +10 -0
- package/dist/extensions/config-hash.js +38 -0
- package/dist/extensions/deployment-config.d.ts +16 -1
- package/dist/extensions/deployment-config.js +83 -0
- package/dist/extensions/extensions.module.js +9 -12
- package/dist/extensions/host.d.ts +39 -12
- package/dist/extensions/host.js +129 -51
- package/dist/extensions/installs.d.ts +5 -0
- package/dist/extensions/installs.js +12 -0
- package/dist/extensions/org-config.d.ts +17 -2
- package/dist/extensions/org-config.js +23 -4
- package/dist/extensions/point-defaults.controller.d.ts +2 -8
- package/dist/extensions/point-defaults.controller.js +1 -3
- package/dist/extensions/point-defaults.d.ts +3 -1
- package/dist/extensions/point-defaults.js +4 -2
- package/dist/extensions/point-defaults.schemas.d.ts +9 -0
- package/dist/extensions/point-defaults.schemas.js +14 -0
- package/dist/extensions/state.module.d.ts +9 -0
- package/dist/extensions/state.module.js +38 -0
- package/dist/extensions/unavailable.d.ts +49 -0
- package/dist/extensions/unavailable.js +113 -0
- package/dist/files/previewers.controller.js +2 -3
- package/dist/files/previewers.d.ts +1 -1
- package/dist/files/previewers.js +4 -4
- package/dist/files/previewers.schemas.d.ts +10 -0
- package/dist/files/previewers.schemas.js +9 -0
- package/dist/http/api.module.js +4 -0
- package/dist/http/plugin-dispatch.d.ts +4 -1
- package/dist/http/plugin-dispatch.js +14 -2
- package/dist/identity/accounts.d.ts +43 -4
- package/dist/identity/accounts.js +74 -6
- package/dist/identity/auth.guard.js +10 -1
- package/dist/identity/cookies.d.ts +6 -0
- package/dist/identity/cookies.js +14 -0
- package/dist/identity/identity.module.js +3 -0
- package/dist/identity/initial-passwords.controller.d.ts +22 -0
- package/dist/identity/initial-passwords.controller.js +49 -0
- package/dist/identity/initial-passwords.d.ts +61 -0
- package/dist/identity/initial-passwords.job.d.ts +16 -0
- package/dist/identity/initial-passwords.job.js +46 -0
- package/dist/identity/initial-passwords.js +159 -0
- package/dist/identity/me.controller.d.ts +14 -0
- package/dist/identity/me.controller.js +39 -1
- package/dist/identity/principal.d.ts +8 -0
- package/dist/identity/principal.js +8 -0
- package/dist/identity/settings.d.ts +3 -1
- package/dist/identity/settings.js +6 -4
- package/dist/inbox/inbox.schemas.d.ts +8 -0
- package/dist/inbox/inbox.schemas.js +11 -0
- package/dist/inbox/platform-inbox.controller.d.ts +1 -1
- package/dist/inbox/platform-inbox.controller.js +2 -2
- package/dist/index.d.ts +4 -0
- package/dist/index.js +6 -0
- package/dist/infra/config/kernel-config.service.js +3 -0
- package/dist/infra/events/kernel-events.d.ts +8 -0
- package/dist/lifecycle/kernel-lifecycle.js +4 -0
- package/dist/models/embeddings.d.ts +82 -0
- package/dist/models/embeddings.js +326 -0
- package/dist/models/enablement.controller.d.ts +40 -0
- package/dist/models/enablement.controller.js +74 -0
- package/dist/models/enablement.d.ts +101 -0
- package/dist/models/enablement.js +264 -0
- package/dist/models/models.module.d.ts +5 -1
- package/dist/models/models.module.js +16 -4
- package/dist/models/org-models.schemas.d.ts +8 -0
- package/dist/models/org-models.schemas.js +22 -0
- package/dist/models/prices.d.ts +3 -1
- package/dist/models/prices.js +7 -5
- package/dist/models/purposes.d.ts +30 -6
- package/dist/models/purposes.js +68 -17
- package/dist/orgs/orgs.controller.d.ts +2 -5
- package/dist/orgs/orgs.controller.js +3 -6
- package/dist/orgs/orgs.schemas.d.ts +8 -0
- package/dist/orgs/orgs.schemas.js +16 -0
- package/dist/orgs/orgs.service.d.ts +3 -1
- package/dist/orgs/orgs.service.js +6 -4
- package/dist/orgs/settings.service.d.ts +9 -1
- package/dist/orgs/settings.service.js +20 -5
- package/dist/overrides.d.ts +4 -0
- package/dist/overrides.js +2 -0
- package/dist/platform/errors.d.ts +21 -4
- package/dist/platform/errors.js +45 -6
- package/dist/platform/exclusions.d.ts +2 -3
- package/dist/platform/exclusions.js +68 -831
- package/dist/platform/method.js +1 -1
- package/dist/platform/operation.d.ts +82 -5
- package/dist/platform/operation.js +62 -7
- package/dist/platform/ops/accounts.ops.d.ts +32 -0
- package/dist/platform/ops/accounts.ops.js +291 -0
- package/dist/platform/ops/admin.ops.d.ts +36 -0
- package/dist/platform/ops/admin.ops.js +389 -0
- package/dist/platform/ops/agent-skills.ops.d.ts +24 -0
- package/dist/platform/ops/agent-skills.ops.js +226 -0
- package/dist/platform/ops/agent-templates.ops.d.ts +4 -1
- package/dist/platform/ops/agent-templates.ops.js +194 -14
- package/dist/platform/ops/agents.ops.d.ts +19 -1
- package/dist/platform/ops/agents.ops.js +481 -58
- package/dist/platform/ops/approvals.ops.d.ts +30 -0
- package/dist/platform/ops/approvals.ops.js +116 -0
- package/dist/platform/ops/background.ops.d.ts +14 -0
- package/dist/platform/ops/background.ops.js +134 -0
- package/dist/platform/ops/catalog-admin.ops.d.ts +74 -0
- package/dist/platform/ops/catalog-admin.ops.js +587 -0
- package/dist/platform/ops/channels.ops.d.ts +16 -0
- package/dist/platform/ops/channels.ops.js +195 -0
- package/dist/platform/ops/components.ops.d.ts +46 -0
- package/dist/platform/ops/components.ops.js +853 -0
- package/dist/platform/ops/connectors.ops.d.ts +4 -2
- package/dist/platform/ops/connectors.ops.js +68 -6
- package/dist/platform/ops/conversations.ops.d.ts +30 -0
- package/dist/platform/ops/conversations.ops.js +470 -0
- package/dist/platform/ops/environments.ops.d.ts +26 -0
- package/dist/platform/ops/environments.ops.js +289 -0
- package/dist/platform/ops/errors.d.ts +10 -5
- package/dist/platform/ops/errors.js +19 -11
- package/dist/platform/ops/evals.ops.d.ts +28 -0
- package/dist/platform/ops/evals.ops.js +783 -0
- package/dist/platform/ops/extensions-admin.ops.d.ts +25 -0
- package/dist/platform/ops/extensions-admin.ops.js +344 -0
- package/dist/platform/ops/extensions.ops.d.ts +7 -1
- package/dist/platform/ops/extensions.ops.js +248 -17
- package/dist/platform/ops/inbox.ops.d.ts +25 -0
- package/dist/platform/ops/inbox.ops.js +378 -0
- package/dist/platform/ops/marketplaces.ops.d.ts +7 -1
- package/dist/platform/ops/marketplaces.ops.js +326 -17
- package/dist/platform/ops/models.ops.d.ts +25 -0
- package/dist/platform/ops/models.ops.js +232 -0
- package/dist/platform/ops/org-plugins.ops.d.ts +29 -0
- package/dist/platform/ops/org-plugins.ops.js +329 -0
- package/dist/platform/ops/org-settings.ops.d.ts +16 -0
- package/dist/platform/ops/org-settings.ops.js +102 -0
- package/dist/platform/ops/orgs.ops.d.ts +28 -0
- package/dist/platform/ops/orgs.ops.js +295 -0
- package/dist/platform/ops/other-orgs.d.ts +20 -0
- package/dist/platform/ops/other-orgs.js +72 -0
- package/dist/platform/ops/platform.ops.d.ts +4 -4
- package/dist/platform/ops/platform.ops.js +23 -24
- package/dist/platform/ops/plugins.ops.d.ts +10 -8
- package/dist/platform/ops/plugins.ops.js +176 -77
- package/dist/platform/ops/previewers.ops.d.ts +14 -0
- package/dist/platform/ops/previewers.ops.js +109 -0
- package/dist/platform/ops/requests.ops.js +57 -19
- package/dist/platform/ops/skills.ops.d.ts +5 -1
- package/dist/platform/ops/skills.ops.js +129 -11
- package/dist/platform/ops/unavailable.d.ts +23 -0
- package/dist/platform/ops/unavailable.js +111 -0
- package/dist/platform/parity.d.ts +33 -0
- package/dist/platform/parity.js +272 -0
- package/dist/platform/platform-ops.module.d.ts +32 -0
- package/dist/platform/platform-ops.module.js +78 -11
- package/dist/platform/route-schemas.d.ts +18 -0
- package/dist/platform/route-schemas.js +60 -0
- package/dist/roles/worker.module.js +2 -0
- package/dist/runtime/context/build.d.ts +2 -0
- package/dist/runtime/context/build.js +28 -2
- package/dist/runtime/context/compaction.js +10 -1
- package/dist/runtime/context/run-context.d.ts +65 -0
- package/dist/runtime/context/run-context.js +215 -0
- package/dist/runtime/hook-calls.d.ts +8 -1
- package/dist/runtime/hook-calls.js +40 -9
- package/dist/runtime/model-call.d.ts +8 -3
- package/dist/runtime/model-call.js +30 -6
- package/dist/runtime/providers.d.ts +146 -32
- package/dist/runtime/providers.js +328 -67
- package/dist/runtime/run-context.service.d.ts +65 -0
- package/dist/runtime/run-context.service.js +220 -0
- package/dist/runtime/run-worker.d.ts +6 -1
- package/dist/runtime/run-worker.js +35 -10
- package/dist/runtime/runtime.module.js +2 -0
- package/dist/runtime/subagents/definition.d.ts +15 -15
- package/dist/runtime/subagents/definition.js +49 -118
- package/dist/runtime/usage-report-jobs.d.ts +88 -0
- package/dist/runtime/usage-report-jobs.js +158 -0
- package/dist/runtime/usage-report.d.ts +33 -38
- package/dist/runtime/usage-report.js +152 -84
- package/dist/skills/changes.controller.js +2 -1
- package/dist/skills/changes.service.d.ts +1 -1
- package/dist/skills/changes.service.js +4 -4
- package/dist/skills/invocable.controller.d.ts +1 -1
- package/dist/skills/invocable.controller.js +2 -2
- package/dist/skills/invoke.d.ts +2 -2
- package/dist/skills/invoke.js +8 -1
- package/dist/skills/skills.controller.d.ts +4 -13
- package/dist/skills/skills.controller.js +8 -24
- package/dist/skills/skills.schemas.d.ts +48 -0
- package/dist/skills/skills.schemas.js +61 -0
- package/dist/skills/skills.service.d.ts +11 -1
- package/dist/skills/skills.service.js +37 -14
- package/dist/time-zone.d.ts +5 -0
- package/dist/time-zone.js +19 -0
- package/dist/tools/approvals.controller.js +2 -3
- package/dist/tools/approvals.schemas.d.ts +21 -0
- package/dist/tools/approvals.schemas.js +15 -0
- package/dist/tools/builtin-names.d.ts +10 -8
- package/dist/tools/builtin-names.js +16 -11
- package/dist/tools/builtins/builtin-tools.d.ts +3 -1
- package/dist/tools/builtins/builtin-tools.js +15 -3
- package/dist/tools/builtins/current-time.d.ts +26 -0
- package/dist/tools/builtins/current-time.js +99 -0
- package/dist/tools/builtins/platform.d.ts +19 -2
- package/dist/tools/builtins/platform.js +105 -16
- package/dist/tools/connectors.controller.d.ts +1 -2
- package/dist/tools/connectors.controller.js +1 -4
- package/dist/tools/connectors.schemas.d.ts +12 -0
- package/dist/tools/connectors.schemas.js +19 -0
- package/dist/tools/connectors.service.d.ts +5 -2
- package/dist/tools/connectors.service.js +7 -5
- package/dist/tools/org-tool-switches.d.ts +16 -2
- package/dist/tools/org-tool-switches.js +26 -9
- package/dist/tools/pipeline.js +9 -1
- package/dist/tools/registry.d.ts +48 -51
- package/dist/tools/registry.js +222 -233
- package/package.json +3 -3
- package/src/migrations/0089_model_kinds_usage.sql +38 -0
- package/src/migrations/0090_initial_passwords.sql +27 -0
- package/src/migrations/0091_account_time_zone.sql +4 -0
- package/src/migrations/0092_tools_default_on.sql +27 -0
- package/dist/platform/redact-orgs.d.ts +0 -7
- package/dist/platform/redact-orgs.js +0 -52
package/dist/evals/run-replay.js
CHANGED
|
@@ -20,6 +20,7 @@ import { TransactionHost } from "../infra/database/transaction-host.js";
|
|
|
20
20
|
import { Transactional } from "../infra/database/transactional.decorator.js";
|
|
21
21
|
import { estimateTokens } from "../runtime/context/tokens.js";
|
|
22
22
|
import { RunError } from "../runtime/model-call.js";
|
|
23
|
+
import { runContextIdemKey } from "../runtime/run-context.service.js";
|
|
23
24
|
import { recordedSkillForks } from "../runtime/subagents/skill-fork.js";
|
|
24
25
|
import { skillsCatalogIdemKey } from "../skills/catalog.js";
|
|
25
26
|
import { ACTIVE_EVAL_STATUSES, addUsage, consumeTokens, TOO_MANY_ERRORS, usageTokens, } from "./budget.js";
|
|
@@ -121,6 +122,16 @@ let EvalReplaySeeder = class EvalReplaySeeder {
|
|
|
121
122
|
},
|
|
122
123
|
]
|
|
123
124
|
: []),
|
|
125
|
+
...(p.runContext
|
|
126
|
+
? [
|
|
127
|
+
{
|
|
128
|
+
type: "run_context",
|
|
129
|
+
runId,
|
|
130
|
+
idemKey: runContextIdemKey(runId),
|
|
131
|
+
payload: p.runContext.payload,
|
|
132
|
+
},
|
|
133
|
+
]
|
|
134
|
+
: []),
|
|
124
135
|
]);
|
|
125
136
|
if (onSeeded && !(await onSeeded(conversationId)))
|
|
126
137
|
throw new ReplayClaimLost();
|
|
@@ -320,6 +331,7 @@ export async function replayRun(d, s, candidate, evalRunId, signal) {
|
|
|
320
331
|
}
|
|
321
332
|
const trigger = replayTrigger(start.payload, seeds, consumed);
|
|
322
333
|
const catalog = s.events.find((e) => e.runId === s.runId && e.type === "skills_catalog" && e.seq > R);
|
|
334
|
+
const runContext = s.events.find((e) => e.runId === s.runId && e.type === "run_context" && e.seq > R);
|
|
323
335
|
// a sub-agent's case (spec §15.3) runs the effective definition frozen in its subagent_started
|
|
324
336
|
// (the request renders that event's preamble and instructions; its tools come from it too), with
|
|
325
337
|
// only the candidate's model and params, and the logged step limit
|
|
@@ -351,6 +363,7 @@ export async function replayRun(d, s, candidate, evalRunId, signal) {
|
|
|
351
363
|
agentVersion: candidate.agentVersion,
|
|
352
364
|
model: agent.model,
|
|
353
365
|
catalog,
|
|
366
|
+
runContext,
|
|
354
367
|
}, d.onSeeded);
|
|
355
368
|
await d.hooks?.afterRunSeeded?.(evalRunId, conversationId);
|
|
356
369
|
// 停止:取消 / 越限 / 熔断 / 失去认领 / 截止时间 → 中止 loop(进行中的请求立即停下,loop 以 aborted 返回)
|
|
@@ -435,8 +448,10 @@ export async function replayRun(d, s, candidate, evalRunId, signal) {
|
|
|
435
448
|
return metered;
|
|
436
449
|
};
|
|
437
450
|
const registry = {
|
|
438
|
-
|
|
439
|
-
|
|
451
|
+
// the case's org (its effective provider config), whatever the replayed step passes
|
|
452
|
+
// (and its disabled lists: a candidate disabled there is refused, spec B §5.3)
|
|
453
|
+
resolve: async (_orgId, ref, opts) => {
|
|
454
|
+
const r = await d.registry.resolve(s.orgId, ref, opts);
|
|
440
455
|
return { ...r, provider: meter(r.provider) };
|
|
441
456
|
},
|
|
442
457
|
};
|
|
@@ -1,62 +1,8 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
1
|
+
import type { z } from "zod";
|
|
2
2
|
import { type Principal } from "../identity/principal.js";
|
|
3
3
|
import { type OrgContext } from "../orgs/org.guard.js";
|
|
4
|
+
import { EvalRunEstimateBody as EstimateBody, EvalLabelBody as LabelBody, EvalRunResultsQuery as ResultsQuery, EvalRunStartBody as StartBody } from "./evals.schemas.js";
|
|
4
5
|
import { type EvalEstimate, type EvalResultLight, type EvalResultView, EvalRunsService, type EvalRunView, type EvalTokenCaps } from "./runs.service.js";
|
|
5
|
-
/** `tokenCap` 只校验类型,范围由服务判定(`eval.token_cap_invalid`)。 */
|
|
6
|
-
declare const EstimateBody: z.ZodObject<{
|
|
7
|
-
mode: z.ZodEnum<{
|
|
8
|
-
run: "run";
|
|
9
|
-
step: "step";
|
|
10
|
-
}>;
|
|
11
|
-
candidate: z.ZodObject<{
|
|
12
|
-
agentVersion: z.ZodOptional<z.ZodNumber>;
|
|
13
|
-
model: z.ZodOptional<z.ZodObject<{
|
|
14
|
-
provider: z.ZodString;
|
|
15
|
-
model: z.ZodString;
|
|
16
|
-
}, z.core.$strict>>;
|
|
17
|
-
modelParams: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
|
|
18
|
-
instructions: z.ZodOptional<z.ZodString>;
|
|
19
|
-
}, z.core.$strict>;
|
|
20
|
-
judge: z.ZodDefault<z.ZodBoolean>;
|
|
21
|
-
tokenCap: z.ZodOptional<z.ZodNumber>;
|
|
22
|
-
}, z.core.$strict>;
|
|
23
|
-
declare const StartBody: z.ZodObject<{
|
|
24
|
-
mode: z.ZodEnum<{
|
|
25
|
-
run: "run";
|
|
26
|
-
step: "step";
|
|
27
|
-
}>;
|
|
28
|
-
candidate: z.ZodObject<{
|
|
29
|
-
agentVersion: z.ZodOptional<z.ZodNumber>;
|
|
30
|
-
model: z.ZodOptional<z.ZodObject<{
|
|
31
|
-
provider: z.ZodString;
|
|
32
|
-
model: z.ZodString;
|
|
33
|
-
}, z.core.$strict>>;
|
|
34
|
-
modelParams: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
|
|
35
|
-
instructions: z.ZodOptional<z.ZodString>;
|
|
36
|
-
}, z.core.$strict>;
|
|
37
|
-
judge: z.ZodDefault<z.ZodBoolean>;
|
|
38
|
-
tokenCap: z.ZodOptional<z.ZodNumber>;
|
|
39
|
-
}, z.core.$strict>;
|
|
40
|
-
/**
|
|
41
|
-
* `view=light`:不含内容块(结果表与轮询用,响应带 `asOf`);缺省 `full`。`updatedSince`(ISO 时间)只取之后有变化的,
|
|
42
|
-
* 轮询时传上一次的 `asOf`。
|
|
43
|
-
*/
|
|
44
|
-
declare const ResultsQuery: z.ZodObject<{
|
|
45
|
-
after: z.ZodOptional<z.ZodString>;
|
|
46
|
-
limit: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
47
|
-
view: z.ZodDefault<z.ZodEnum<{
|
|
48
|
-
full: "full";
|
|
49
|
-
light: "light";
|
|
50
|
-
}>>;
|
|
51
|
-
updatedSince: z.ZodOptional<z.ZodString>;
|
|
52
|
-
}, z.core.$strict>;
|
|
53
|
-
declare const LabelBody: z.ZodObject<{
|
|
54
|
-
label: z.ZodNullable<z.ZodEnum<{
|
|
55
|
-
fail: "fail";
|
|
56
|
-
pass: "pass";
|
|
57
|
-
}>>;
|
|
58
|
-
note: z.ZodOptional<z.ZodString>;
|
|
59
|
-
}, z.core.$strict>;
|
|
60
6
|
/**
|
|
61
7
|
* 评测运行(`/api/v1/orgs/:orgId/eval-sets/:setId/runs`、`/api/v1/orgs/:orgId/eval-runs/:runId[/results[/:resultId]]`)与
|
|
62
8
|
* 结果的人工标注(`/api/v1/orgs/:orgId/eval-results/:resultId/label`):
|
|
@@ -97,4 +43,3 @@ export declare class EvalRunsController {
|
|
|
97
43
|
result: EvalResultView;
|
|
98
44
|
}>;
|
|
99
45
|
}
|
|
100
|
-
export {};
|
|
@@ -8,53 +8,12 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
8
8
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
9
|
};
|
|
10
10
|
import { Controller, Get, HttpCode, Inject, Param, Post, Put } from "@nestjs/common";
|
|
11
|
-
import { z } from "zod";
|
|
12
|
-
import { ModelRef } from "../agents/definition.js";
|
|
13
11
|
import { CurrentPrincipal, patTokenId, requireUser, } from "../identity/principal.js";
|
|
14
12
|
import { createZodDto } from "../infra/validation/create-zod-dto.js";
|
|
15
13
|
import { ZBody, ZQuery } from "../infra/validation/zod-params.js";
|
|
16
14
|
import { CurrentOrg, OrgAction } from "../orgs/org.guard.js";
|
|
15
|
+
import { EvalRunEstimateBody as EstimateBody, EvalLabelBody as LabelBody, EvalRunResultsQuery as ResultsQuery, EvalRunStartBody as StartBody, } from "./evals.schemas.js";
|
|
17
16
|
import { EvalRunsService, } from "./runs.service.js";
|
|
18
|
-
const Candidate = z
|
|
19
|
-
.object({
|
|
20
|
-
agentVersion: z.number().int().min(1).optional(),
|
|
21
|
-
model: ModelRef.strict().optional(),
|
|
22
|
-
modelParams: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),
|
|
23
|
-
instructions: z.string().max(100_000).optional(),
|
|
24
|
-
})
|
|
25
|
-
.strict();
|
|
26
|
-
/** `tokenCap` 只校验类型,范围由服务判定(`eval.token_cap_invalid`)。 */
|
|
27
|
-
const EstimateBody = z
|
|
28
|
-
.object({
|
|
29
|
-
mode: z.enum(["step", "run"]),
|
|
30
|
-
candidate: Candidate,
|
|
31
|
-
judge: z.boolean().default(false),
|
|
32
|
-
tokenCap: z.number().int().optional(),
|
|
33
|
-
})
|
|
34
|
-
.strict();
|
|
35
|
-
const StartBody = EstimateBody;
|
|
36
|
-
/**
|
|
37
|
-
* `view=light`:不含内容块(结果表与轮询用,响应带 `asOf`);缺省 `full`。`updatedSince`(ISO 时间)只取之后有变化的,
|
|
38
|
-
* 轮询时传上一次的 `asOf`。
|
|
39
|
-
*/
|
|
40
|
-
const ResultsQuery = z
|
|
41
|
-
.object({
|
|
42
|
-
after: z.string().max(100).optional(),
|
|
43
|
-
limit: z.coerce.number().int().min(1).max(200).default(50),
|
|
44
|
-
view: z.enum(["full", "light"]).default("full"),
|
|
45
|
-
updatedSince: z
|
|
46
|
-
.string()
|
|
47
|
-
.max(64)
|
|
48
|
-
.refine((v) => !Number.isNaN(Date.parse(v)), { message: "must be an ISO timestamp" })
|
|
49
|
-
.optional(),
|
|
50
|
-
})
|
|
51
|
-
.strict();
|
|
52
|
-
const LabelBody = z
|
|
53
|
-
.object({
|
|
54
|
-
label: z.enum(["pass", "fail"]).nullable(),
|
|
55
|
-
note: z.string().max(2000).optional(),
|
|
56
|
-
})
|
|
57
|
-
.strict();
|
|
58
17
|
/** 去掉 zod 输出里值为 undefined 的键(exactOptionalPropertyTypes)。 */
|
|
59
18
|
function candidateOf(c) {
|
|
60
19
|
return {
|
|
@@ -149,7 +149,8 @@ export declare class EvalRunsService {
|
|
|
149
149
|
private liveSet;
|
|
150
150
|
/**
|
|
151
151
|
* 解析模型;不存在 / 不可用 → `eval.candidate_invalid`(供应商列表暂时失败照常抛出)。
|
|
152
|
-
*
|
|
152
|
+
* Resolved for the org (its effective provider config), as the runtime does; per-org model
|
|
153
|
+
* admission must cover eval candidates the same way.
|
|
153
154
|
*/
|
|
154
155
|
private resolveModel;
|
|
155
156
|
/**
|
|
@@ -194,7 +195,7 @@ export declare class EvalRunsService {
|
|
|
194
195
|
candidate: EvalCandidate;
|
|
195
196
|
judge: boolean;
|
|
196
197
|
tokenCap?: number;
|
|
197
|
-
}, actorTokenId?: string): Promise<EvalRunView>;
|
|
198
|
+
}, actorTokenId?: string, auditDetail?: Record<string, unknown>): Promise<EvalRunView>;
|
|
198
199
|
/** The run row and its pending results, in a transaction of their own (enqueued after the commit). */
|
|
199
200
|
private startIn;
|
|
200
201
|
/** The enqueue failed: the run is `failed`, its pending results `skipped`. */
|
|
@@ -216,7 +217,7 @@ export declare class EvalRunsService {
|
|
|
216
217
|
after?: string;
|
|
217
218
|
limit: number;
|
|
218
219
|
updatedSince?: string;
|
|
219
|
-
}, actorTokenId?: string): Promise<{
|
|
220
|
+
}, actorTokenId?: string, auditDetail?: Record<string, unknown>): Promise<{
|
|
220
221
|
results: EvalResultView[];
|
|
221
222
|
next: string | null;
|
|
222
223
|
}>;
|
|
@@ -228,18 +229,18 @@ export declare class EvalRunsService {
|
|
|
228
229
|
after?: string;
|
|
229
230
|
limit: number;
|
|
230
231
|
updatedSince?: string;
|
|
231
|
-
}, actorTokenId?: string): Promise<{
|
|
232
|
+
}, actorTokenId?: string, auditDetail?: Record<string, unknown>): Promise<{
|
|
232
233
|
results: EvalResultLight[];
|
|
233
234
|
next: string | null;
|
|
234
235
|
asOf: string;
|
|
235
236
|
}>;
|
|
236
237
|
/** 一条结果的完整行(查看器按需读取);不在该运行 / 本组织 → `eval.result_not_found`。写查看审计(去重)。 */
|
|
237
|
-
result(orgId: string, actor: string, runId: string, resultId: string, actorTokenId?: string): Promise<EvalResultView>;
|
|
238
|
+
result(orgId: string, actor: string, runId: string, resultId: string, actorTokenId?: string, auditDetail?: Record<string, unknown>): Promise<EvalResultView>;
|
|
238
239
|
/**
|
|
239
240
|
* 取消:queued / running → cancelled,尚未开始的结果立即 skipped;在途请求做完照常写入(C7 在途可超出),
|
|
240
241
|
* 之后的请求不再发。已结束 → `eval.run_finished`。
|
|
241
242
|
*/
|
|
242
|
-
cancel(orgId: string, actor: string, runId: string, actorTokenId?: string): Promise<EvalRunView>;
|
|
243
|
+
cancel(orgId: string, actor: string, runId: string, actorTokenId?: string, auditDetail?: Record<string, unknown>): Promise<EvalRunView>;
|
|
243
244
|
/**
|
|
244
245
|
* 人工标注(D3):标通过 / 不通过(附可选备注),`label: null` 清除标注与备注。评测集已删除、结果不属于本组织 →
|
|
245
246
|
* `eval.result_not_found`。事务内锁组织并复核 `evals.manage`,写审计 `eval.result_labeled`(不含备注全文)。
|
|
@@ -247,7 +248,7 @@ export declare class EvalRunsService {
|
|
|
247
248
|
label(orgId: string, actor: string, resultId: string, input: {
|
|
248
249
|
label: "pass" | "fail" | null;
|
|
249
250
|
note?: string;
|
|
250
|
-
}, actorTokenId?: string): Promise<EvalResultView>;
|
|
251
|
+
}, actorTokenId?: string, auditDetail?: Record<string, unknown>): Promise<EvalResultView>;
|
|
251
252
|
private cancelIn;
|
|
252
253
|
private labelIn;
|
|
253
254
|
}
|
|
@@ -187,11 +187,12 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
187
187
|
}
|
|
188
188
|
/**
|
|
189
189
|
* 解析模型;不存在 / 不可用 → `eval.candidate_invalid`(供应商列表暂时失败照常抛出)。
|
|
190
|
-
*
|
|
190
|
+
* Resolved for the org (its effective provider config), as the runtime does; per-org model
|
|
191
|
+
* admission must cover eval candidates the same way.
|
|
191
192
|
*/
|
|
192
|
-
async resolveModel(ref) {
|
|
193
|
+
async resolveModel(orgId, ref) {
|
|
193
194
|
try {
|
|
194
|
-
return await this.d.registry.resolve(ref);
|
|
195
|
+
return await this.d.registry.resolve(orgId, ref);
|
|
195
196
|
}
|
|
196
197
|
catch (e) {
|
|
197
198
|
if (e instanceof ProviderListError)
|
|
@@ -208,7 +209,7 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
208
209
|
* 校验候选:版本存在(该集合的 agent)、模型可解析、参数按所用模型的声明严格通过(`paramIssues`)。
|
|
209
210
|
* 所用模型 = 候选模型,否则候选版本的模型,否则 agent 当前版本的模型。返回候选版本的定义。
|
|
210
211
|
*/
|
|
211
|
-
async checkCandidate(agentId, c) {
|
|
212
|
+
async checkCandidate(orgId, agentId, c) {
|
|
212
213
|
const versionDef = await versionDefinition(this.d.db, agentId, c.agentVersion);
|
|
213
214
|
if (c.agentVersion !== undefined && versionDef === undefined) {
|
|
214
215
|
throw candidateInvalid(`Agent version ${c.agentVersion} does not exist`, [
|
|
@@ -227,7 +228,7 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
227
228
|
}
|
|
228
229
|
if (model === undefined)
|
|
229
230
|
return versionDef;
|
|
230
|
-
const { info } = await this.resolveModel(model);
|
|
231
|
+
const { info } = await this.resolveModel(orgId, model);
|
|
231
232
|
if (c.modelParams !== undefined) {
|
|
232
233
|
const issues = paramIssues("candidate.modelParams", info.parameters, c.modelParams);
|
|
233
234
|
if (issues.length > 0)
|
|
@@ -239,7 +240,7 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
239
240
|
* 各用例的回放计划与成本:只读写入时存好的列(`plan_step` / `plan_run`、`base_model`),不读快照。
|
|
240
241
|
* 给了候选参数时按每个用例实际所用的模型严格校验(同一模型在一次调用里只解析一次)。
|
|
241
242
|
*/
|
|
242
|
-
async plan(setId, mode, c, versionDef) {
|
|
243
|
+
async plan(orgId, setId, mode, c, versionDef) {
|
|
243
244
|
const table = await this.d.prices.table();
|
|
244
245
|
const versionOnly = c.agentVersion !== undefined && c.model === undefined;
|
|
245
246
|
const rows = await this.d.db
|
|
@@ -277,7 +278,7 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
277
278
|
const key = priceKey(model.provider, model.model);
|
|
278
279
|
if (!infos.has(key)) {
|
|
279
280
|
try {
|
|
280
|
-
infos.set(key, (await this.d.registry.resolve(model)).info);
|
|
281
|
+
infos.set(key, (await this.d.registry.resolve(orgId, model)).info);
|
|
281
282
|
}
|
|
282
283
|
catch (e) {
|
|
283
284
|
if (e instanceof ProviderListError)
|
|
@@ -329,7 +330,7 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
329
330
|
}
|
|
330
331
|
let maxOutputTokens = configured;
|
|
331
332
|
try {
|
|
332
|
-
const { info } = await this.d.registry.resolve(target.model);
|
|
333
|
+
const { info } = await this.d.registry.resolve(orgId, target.model);
|
|
333
334
|
maxOutputTokens = Math.min(configured, info.maxOutputTokens);
|
|
334
335
|
}
|
|
335
336
|
catch (e) {
|
|
@@ -396,8 +397,8 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
396
397
|
const set = await this.liveSet(orgId, setId);
|
|
397
398
|
await this.assertAgentLive(set.agent_id);
|
|
398
399
|
const caps = this.tokenCaps(input.tokenCap);
|
|
399
|
-
const versionDef = await this.checkCandidate(set.agent_id, input.candidate);
|
|
400
|
-
const plans = await this.plan(setId, input.mode, input.candidate, versionDef);
|
|
400
|
+
const versionDef = await this.checkCandidate(orgId, set.agent_id, input.candidate);
|
|
401
|
+
const plans = await this.plan(orgId, setId, input.mode, input.candidate, versionDef);
|
|
401
402
|
const judge = await this.judgePricing(orgId, set.rubric, input.judge);
|
|
402
403
|
return { estimate: await this.summarize(plans, judge), ...caps };
|
|
403
404
|
}
|
|
@@ -417,15 +418,15 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
417
418
|
* 没有可回放的 → `eval.nothing_to_replay`。事务内建运行行、预建 pending 结果,提交后每个用例入队一个任务;
|
|
418
419
|
* 入队失败 → 运行标 failed、结果 skipped,错误照常抛出。
|
|
419
420
|
*/
|
|
420
|
-
async start(orgId, actor, setId, input, actorTokenId) {
|
|
421
|
+
async start(orgId, actor, setId, input, actorTokenId, auditDetail) {
|
|
421
422
|
const set = await this.liveSet(orgId, setId);
|
|
422
423
|
await this.assertAgentLive(set.agent_id);
|
|
423
424
|
const tokenCap = this.tokenCaps(input.tokenCap).effectiveTokenCap;
|
|
424
|
-
const versionDef = await this.checkCandidate(set.agent_id, input.candidate);
|
|
425
|
+
const versionDef = await this.checkCandidate(orgId, set.agent_id, input.candidate);
|
|
425
426
|
if (input.judge)
|
|
426
427
|
await this.d.purposes.resolve(orgId, "eval");
|
|
427
428
|
const judge = await this.judgePricing(orgId, set.rubric, input.judge);
|
|
428
|
-
const planned = await this.plan(setId, input.mode, input.candidate, versionDef);
|
|
429
|
+
const planned = await this.plan(orgId, setId, input.mode, input.candidate, versionDef);
|
|
429
430
|
if (planned.length === 0) {
|
|
430
431
|
throw new ApiError("eval.nothing_to_replay", "The eval set has nothing to replay");
|
|
431
432
|
}
|
|
@@ -434,7 +435,7 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
434
435
|
if (firstProblem) {
|
|
435
436
|
throw candidateInvalid(firstProblem.message, firstProblem.details ?? []);
|
|
436
437
|
}
|
|
437
|
-
const { runId, plans } = await this.startIn(orgId, actor, setId, set.agent_id, input, tokenCap, planned, judge, actorTokenId);
|
|
438
|
+
const { runId, plans } = await this.startIn(orgId, actor, setId, set.agent_id, input, tokenCap, planned, judge, actorTokenId, auditDetail);
|
|
438
439
|
try {
|
|
439
440
|
await this.d.queue.enqueue(plans.map((p) => ({ runId, caseId: p.caseId, orgId })));
|
|
440
441
|
}
|
|
@@ -445,7 +446,7 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
445
446
|
return this.get(orgId, runId);
|
|
446
447
|
}
|
|
447
448
|
/** The run row and its pending results, in a transaction of their own (enqueued after the commit). */
|
|
448
|
-
async startIn(orgId, actor, setId, agentId, input, tokenCap, planned, judge, actorTokenId) {
|
|
449
|
+
async startIn(orgId, actor, setId, agentId, input, tokenCap, planned, judge, actorTokenId, auditDetail) {
|
|
449
450
|
const db = this.d.db;
|
|
450
451
|
await this.d.orgLock.lockAndAuthorize(orgId, actor, "evals.manage");
|
|
451
452
|
// 与删除用例(锁集合行 FOR UPDATE)互斥:之后读到的用例在提交前不会被删
|
|
@@ -510,7 +511,14 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
510
511
|
orgId,
|
|
511
512
|
action: "eval.run_started",
|
|
512
513
|
target: run.id,
|
|
513
|
-
detail: {
|
|
514
|
+
detail: {
|
|
515
|
+
setId,
|
|
516
|
+
mode: input.mode,
|
|
517
|
+
judge: input.judge,
|
|
518
|
+
tokenCap,
|
|
519
|
+
cases: plans.length,
|
|
520
|
+
...auditDetail,
|
|
521
|
+
},
|
|
514
522
|
});
|
|
515
523
|
await this.d.budget.recountCases(run.id);
|
|
516
524
|
return { runId: run.id, plans: plans.filter((p) => p.problem === null) };
|
|
@@ -631,7 +639,7 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
631
639
|
* 查看结果的审计 `eval.results_viewed`(结果里有回放出来的对话内容):每位查看者每次运行每小时一条——Redis
|
|
632
640
|
* `SET NX EX` 去重(多副本共享),轻量轮询因此不会刷审计。Redis 不可用时照写(宁多不漏)。
|
|
633
641
|
*/
|
|
634
|
-
async viewed(orgId, runId, actor, actorTokenId) {
|
|
642
|
+
async viewed(orgId, runId, actor, actorTokenId, auditDetail) {
|
|
635
643
|
let first = true;
|
|
636
644
|
try {
|
|
637
645
|
first = await this.d.locks.lease(resultsViewedKey(runId, actor), "1", RESULTS_VIEWED_TTL_SECONDS * 1000);
|
|
@@ -647,6 +655,7 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
647
655
|
orgId,
|
|
648
656
|
action: "eval.results_viewed",
|
|
649
657
|
target: runId,
|
|
658
|
+
...(auditDetail !== undefined && { detail: auditDetail }),
|
|
650
659
|
});
|
|
651
660
|
}
|
|
652
661
|
/** 结果分页的公共部分:按 id 升序,`after` 为上一页最后一条的 id;`updatedSince` 只取之后有变化的。 */
|
|
@@ -672,11 +681,11 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
672
681
|
return query;
|
|
673
682
|
}
|
|
674
683
|
/** 结果分页(完整行):按 id 升序,`after` 为上一页最后一条的 id。写查看审计(去重见 {@link viewed})。 */
|
|
675
|
-
async results(orgId, actor, runId, q, actorTokenId) {
|
|
684
|
+
async results(orgId, actor, runId, q, actorTokenId, auditDetail) {
|
|
676
685
|
await this.get(orgId, runId);
|
|
677
686
|
const rows = await this.resultsQuery(orgId, runId, q).selectAll().execute();
|
|
678
687
|
const page = rows.slice(0, q.limit);
|
|
679
|
-
await this.viewed(orgId, runId, actor, actorTokenId);
|
|
688
|
+
await this.viewed(orgId, runId, actor, actorTokenId, auditDetail);
|
|
680
689
|
return {
|
|
681
690
|
results: page.map(resultView),
|
|
682
691
|
next: rows.length > q.limit ? (page.at(-1)?.id ?? null) : null,
|
|
@@ -686,13 +695,13 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
686
695
|
* 结果分页(轻量,结果表与轮询用):不含内容块。`asOf` 作为下一次轮询的 `updatedSince`(已留余量,
|
|
687
696
|
* 见 {@link RESULTS_ASOF_OVERLAP_MS};重复的行由调用方按 id 合并)。
|
|
688
697
|
*/
|
|
689
|
-
async resultsLight(orgId, actor, runId, q, actorTokenId) {
|
|
698
|
+
async resultsLight(orgId, actor, runId, q, actorTokenId, auditDetail) {
|
|
690
699
|
await this.get(orgId, runId);
|
|
691
700
|
const now = await sql `SELECT now() AS now`.execute(this.d.db);
|
|
692
701
|
const asOf = new Date(new Date(now.rows[0]?.now ?? Date.now()).getTime() - RESULTS_ASOF_OVERLAP_MS);
|
|
693
702
|
const rows = await this.resultsQuery(orgId, runId, q).select(LIGHT_COLUMNS).execute();
|
|
694
703
|
const page = rows.slice(0, q.limit);
|
|
695
|
-
await this.viewed(orgId, runId, actor, actorTokenId);
|
|
704
|
+
await this.viewed(orgId, runId, actor, actorTokenId, auditDetail);
|
|
696
705
|
return {
|
|
697
706
|
results: page.map((r) => ({
|
|
698
707
|
id: r.id,
|
|
@@ -714,7 +723,7 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
714
723
|
};
|
|
715
724
|
}
|
|
716
725
|
/** 一条结果的完整行(查看器按需读取);不在该运行 / 本组织 → `eval.result_not_found`。写查看审计(去重)。 */
|
|
717
|
-
async result(orgId, actor, runId, resultId, actorTokenId) {
|
|
726
|
+
async result(orgId, actor, runId, resultId, actorTokenId, auditDetail) {
|
|
718
727
|
await this.get(orgId, runId);
|
|
719
728
|
if (!UUID.test(resultId))
|
|
720
729
|
throw resultNotFound();
|
|
@@ -727,31 +736,31 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
727
736
|
.executeTakeFirst();
|
|
728
737
|
if (!row)
|
|
729
738
|
throw resultNotFound();
|
|
730
|
-
await this.viewed(orgId, runId, actor, actorTokenId);
|
|
739
|
+
await this.viewed(orgId, runId, actor, actorTokenId, auditDetail);
|
|
731
740
|
return resultView(row);
|
|
732
741
|
}
|
|
733
742
|
/**
|
|
734
743
|
* 取消:queued / running → cancelled,尚未开始的结果立即 skipped;在途请求做完照常写入(C7 在途可超出),
|
|
735
744
|
* 之后的请求不再发。已结束 → `eval.run_finished`。
|
|
736
745
|
*/
|
|
737
|
-
async cancel(orgId, actor, runId, actorTokenId) {
|
|
746
|
+
async cancel(orgId, actor, runId, actorTokenId, auditDetail) {
|
|
738
747
|
if (!UUID.test(runId))
|
|
739
748
|
throw runNotFound();
|
|
740
749
|
await this.get(orgId, runId);
|
|
741
|
-
await this.cancelIn(orgId, actor, runId, actorTokenId);
|
|
750
|
+
await this.cancelIn(orgId, actor, runId, actorTokenId, auditDetail);
|
|
742
751
|
return this.get(orgId, runId);
|
|
743
752
|
}
|
|
744
753
|
/**
|
|
745
754
|
* 人工标注(D3):标通过 / 不通过(附可选备注),`label: null` 清除标注与备注。评测集已删除、结果不属于本组织 →
|
|
746
755
|
* `eval.result_not_found`。事务内锁组织并复核 `evals.manage`,写审计 `eval.result_labeled`(不含备注全文)。
|
|
747
756
|
*/
|
|
748
|
-
async label(orgId, actor, resultId, input, actorTokenId) {
|
|
757
|
+
async label(orgId, actor, resultId, input, actorTokenId, auditDetail) {
|
|
749
758
|
if (!UUID.test(resultId))
|
|
750
759
|
throw resultNotFound();
|
|
751
|
-
const row = await this.labelIn(orgId, actor, resultId, input, actorTokenId);
|
|
760
|
+
const row = await this.labelIn(orgId, actor, resultId, input, actorTokenId, auditDetail);
|
|
752
761
|
return resultView(row);
|
|
753
762
|
}
|
|
754
|
-
async cancelIn(orgId, actor, runId, actorTokenId) {
|
|
763
|
+
async cancelIn(orgId, actor, runId, actorTokenId, auditDetail) {
|
|
755
764
|
await this.d.orgLock.lockAndAuthorize(orgId, actor, "evals.manage");
|
|
756
765
|
const r = await this.d.db
|
|
757
766
|
.updateTable("eval_runs")
|
|
@@ -771,9 +780,10 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
771
780
|
orgId,
|
|
772
781
|
action: "eval.run_cancelled",
|
|
773
782
|
target: runId,
|
|
783
|
+
...(auditDetail !== undefined && { detail: auditDetail }),
|
|
774
784
|
});
|
|
775
785
|
}
|
|
776
|
-
async labelIn(orgId, actor, resultId, input, actorTokenId) {
|
|
786
|
+
async labelIn(orgId, actor, resultId, input, actorTokenId, auditDetail) {
|
|
777
787
|
await this.d.orgLock.lockAndAuthorize(orgId, actor, "evals.manage");
|
|
778
788
|
// 先锁住这条结果、读出原标注(写进审计)
|
|
779
789
|
const before = await this.d.db
|
|
@@ -813,7 +823,12 @@ let EvalRunsService = EvalRunsService_1 = class EvalRunsService {
|
|
|
813
823
|
orgId,
|
|
814
824
|
action: "eval.result_labeled",
|
|
815
825
|
target: resultId,
|
|
816
|
-
detail: {
|
|
826
|
+
detail: {
|
|
827
|
+
runId: r.run_id,
|
|
828
|
+
label: input.label,
|
|
829
|
+
previousLabel: before.label,
|
|
830
|
+
...auditDetail,
|
|
831
|
+
},
|
|
817
832
|
});
|
|
818
833
|
return r;
|
|
819
834
|
}
|
|
@@ -1,33 +1,8 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
1
|
+
import type { z } from "zod";
|
|
2
2
|
import { type Principal } from "../identity/principal.js";
|
|
3
3
|
import { type OrgContext } from "../orgs/org.guard.js";
|
|
4
|
+
import { EvalAddCaseBody as AddCaseBody, EvalSetCreateBody as CreateBody, EvalSetPatchBody as PatchBody, EvalSampleBody as SampleBody } from "./evals.schemas.js";
|
|
4
5
|
import { type EvalCaseDetail, type EvalCaseView, type EvalSetDetail, EvalSetsService, type EvalSetView } from "./sets.service.js";
|
|
5
|
-
declare const CreateBody: z.ZodObject<{
|
|
6
|
-
agentId: z.ZodString;
|
|
7
|
-
name: z.ZodString;
|
|
8
|
-
description: z.ZodOptional<z.ZodString>;
|
|
9
|
-
rubric: z.ZodOptional<z.ZodString>;
|
|
10
|
-
}, z.core.$strict>;
|
|
11
|
-
declare const PatchBody: z.ZodObject<{
|
|
12
|
-
name: z.ZodOptional<z.ZodString>;
|
|
13
|
-
description: z.ZodOptional<z.ZodString>;
|
|
14
|
-
rubric: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
15
|
-
}, z.core.$strict>;
|
|
16
|
-
declare const AddCaseBody: z.ZodObject<{
|
|
17
|
-
conversationId: z.ZodString;
|
|
18
|
-
runId: z.ZodString;
|
|
19
|
-
}, z.core.$strict>;
|
|
20
|
-
declare const SampleBody: z.ZodObject<{
|
|
21
|
-
from: z.ZodOptional<z.ZodISODateTime>;
|
|
22
|
-
to: z.ZodOptional<z.ZodISODateTime>;
|
|
23
|
-
count: z.ZodNumber;
|
|
24
|
-
status: z.ZodOptional<z.ZodEnum<{
|
|
25
|
-
any: "any";
|
|
26
|
-
completed: "completed";
|
|
27
|
-
failed: "failed";
|
|
28
|
-
}>>;
|
|
29
|
-
minToolCalls: z.ZodOptional<z.ZodNumber>;
|
|
30
|
-
}, z.core.$strict>;
|
|
31
6
|
/**
|
|
32
7
|
* 评测集与用例(`/api/v1/orgs/:orgId/eval-sets`):全部 `evals.manage`(admin 起、只给人)。
|
|
33
8
|
* 用例详情返回快照还原的轨迹,每次写审计 `trajectory.viewed`。
|
|
@@ -58,4 +33,3 @@ export declare class EvalSetsController {
|
|
|
58
33
|
getCase(principal: Principal, org: OrgContext, setId: string, caseId: string): Promise<EvalCaseDetail>;
|
|
59
34
|
removeCase(principal: Principal, org: OrgContext, setId: string, caseId: string): Promise<void>;
|
|
60
35
|
}
|
|
61
|
-
export {};
|
|
@@ -8,42 +8,12 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
8
8
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
9
9
|
};
|
|
10
10
|
import { Controller, Delete, Get, HttpCode, Inject, Param, Patch, Post } from "@nestjs/common";
|
|
11
|
-
import { z } from "zod";
|
|
12
11
|
import { CurrentPrincipal, patTokenId, requireUser, } from "../identity/principal.js";
|
|
13
12
|
import { createZodDto } from "../infra/validation/create-zod-dto.js";
|
|
14
13
|
import { ZBody } from "../infra/validation/zod-params.js";
|
|
15
14
|
import { CurrentOrg, OrgAction } from "../orgs/org.guard.js";
|
|
15
|
+
import { EvalAddCaseBody as AddCaseBody, EvalSetCreateBody as CreateBody, EvalSetPatchBody as PatchBody, EvalSampleBody as SampleBody, } from "./evals.schemas.js";
|
|
16
16
|
import { EvalSetsService, } from "./sets.service.js";
|
|
17
|
-
const NAME = z.string().trim().min(1).max(200);
|
|
18
|
-
const DESCRIPTION = z.string().max(2000);
|
|
19
|
-
const RUBRIC = z.string().min(1).max(20_000);
|
|
20
|
-
const CreateBody = z
|
|
21
|
-
.object({
|
|
22
|
-
agentId: z.string().min(1).max(100),
|
|
23
|
-
name: NAME,
|
|
24
|
-
description: DESCRIPTION.optional(),
|
|
25
|
-
rubric: RUBRIC.optional(),
|
|
26
|
-
})
|
|
27
|
-
.strict();
|
|
28
|
-
const PatchBody = z
|
|
29
|
-
.object({
|
|
30
|
-
name: NAME.optional(),
|
|
31
|
-
description: DESCRIPTION.optional(),
|
|
32
|
-
rubric: RUBRIC.nullable().optional(),
|
|
33
|
-
})
|
|
34
|
-
.strict();
|
|
35
|
-
const AddCaseBody = z
|
|
36
|
-
.object({ conversationId: z.string().min(1).max(100), runId: z.string().min(1).max(100) })
|
|
37
|
-
.strict();
|
|
38
|
-
const SampleBody = z
|
|
39
|
-
.object({
|
|
40
|
-
from: z.iso.datetime({ offset: true }).optional(),
|
|
41
|
-
to: z.iso.datetime({ offset: true }).optional(),
|
|
42
|
-
count: z.number().int().min(1).max(50),
|
|
43
|
-
status: z.enum(["completed", "failed", "any"]).optional(),
|
|
44
|
-
minToolCalls: z.number().int().min(0).max(1000).optional(),
|
|
45
|
-
})
|
|
46
|
-
.strict();
|
|
47
17
|
class CreateBodyDto extends createZodDto(CreateBody, "EvalSetCreateBody") {
|
|
48
18
|
}
|
|
49
19
|
class PatchBodyDto extends createZodDto(PatchBody, "EvalSetPatchBody") {
|
|
@@ -91,19 +91,19 @@ export declare class EvalSetsService {
|
|
|
91
91
|
name: string;
|
|
92
92
|
description?: string;
|
|
93
93
|
rubric?: string;
|
|
94
|
-
}, actorTokenId?: string): Promise<EvalSetView>;
|
|
94
|
+
}, actorTokenId?: string, auditDetail?: Record<string, unknown>): Promise<EvalSetView>;
|
|
95
95
|
list(orgId: string): Promise<EvalSetView[]>;
|
|
96
96
|
get(orgId: string, setId: string): Promise<EvalSetDetail>;
|
|
97
97
|
update(orgId: string, actor: string, setId: string, patch: {
|
|
98
98
|
name?: string;
|
|
99
99
|
description?: string;
|
|
100
100
|
rubric?: string | null;
|
|
101
|
-
}, actorTokenId?: string): Promise<EvalSetView>;
|
|
101
|
+
}, actorTokenId?: string, auditDetail?: Record<string, unknown>): Promise<EvalSetView>;
|
|
102
102
|
/**
|
|
103
103
|
* 删除评测集(Ruling S1-a):集合行软删除,留作审计存根;用例(含快照)硬删,结果随之级联删除,不留复制来的对话内容;
|
|
104
104
|
* 在执行的运行取消,运行行保留(无入口)。
|
|
105
105
|
*/
|
|
106
|
-
remove(orgId: string, actor: string, setId: string, actorTokenId?: string): Promise<void>;
|
|
106
|
+
remove(orgId: string, actor: string, setId: string, actorTokenId?: string, auditDetail?: Record<string, unknown>): Promise<void>;
|
|
107
107
|
private createIn;
|
|
108
108
|
private updateIn;
|
|
109
109
|
private removeIn;
|
|
@@ -125,20 +125,20 @@ export declare class EvalSetsService {
|
|
|
125
125
|
addCase(orgId: string, actor: string, setId: string, input: {
|
|
126
126
|
conversationId: string;
|
|
127
127
|
runId: string;
|
|
128
|
-
}, actorTokenId?: string): Promise<EvalCaseView>;
|
|
128
|
+
}, actorTokenId?: string, auditDetail?: Record<string, unknown>): Promise<EvalCaseView>;
|
|
129
129
|
/**
|
|
130
130
|
* 抽样:从该 agent 的 chat 对话里随机取(`ORDER BY random()`)已终态、尚不在集合里的运行,至多
|
|
131
131
|
* `min(count, 剩余容量)` 个,逐个取快照写入。快照超大(或其间被删除 / 写入时已满 / 并发加入)的计入 `skipped`。
|
|
132
132
|
* 集合已满 → `eval.too_many_cases`。逐个写入,内存里一次只有一份快照。
|
|
133
133
|
*/
|
|
134
|
-
sample(orgId: string, actor: string, setId: string, input: SampleInput, actorTokenId?: string): Promise<{
|
|
134
|
+
sample(orgId: string, actor: string, setId: string, input: SampleInput, actorTokenId?: string, auditDetail?: Record<string, unknown>): Promise<{
|
|
135
135
|
added: number;
|
|
136
136
|
skipped: number;
|
|
137
137
|
}>;
|
|
138
|
-
removeCase(orgId: string, actor: string, setId: string, caseId: string, actorTokenId?: string): Promise<void>;
|
|
138
|
+
removeCase(orgId: string, actor: string, setId: string, caseId: string, actorTokenId?: string, auditDetail?: Record<string, unknown>): Promise<void>;
|
|
139
139
|
/**
|
|
140
140
|
* 用例详情:由快照还原轨迹(原对话删除后照常可读)。快照即对话内容,每次查看写审计 `trajectory.viewed`
|
|
141
141
|
* (target = 原对话 id,detail 带 `caseId` / `setId`)。
|
|
142
142
|
*/
|
|
143
|
-
getCase(orgId: string, actor: string, setId: string, caseId: string, actorTokenId?: string): Promise<EvalCaseDetail>;
|
|
143
|
+
getCase(orgId: string, actor: string, setId: string, caseId: string, actorTokenId?: string, auditDetail?: Record<string, unknown>): Promise<EvalCaseDetail>;
|
|
144
144
|
}
|