ai-capability-framework 1.0.0-rc.3 → 1.0.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/CHANGELOG.md +97 -103
- package/CODE_OF_CONDUCT.md +11 -13
- package/CONTRIBUTING.md +40 -43
- package/GOVERNANCE.md +34 -35
- package/README.md +99 -63
- package/ROADMAP.md +12 -12
- package/SECURITY.md +15 -15
- package/dist/audit/ledger.d.ts.map +1 -1
- package/dist/audit/ledger.js +2 -1
- package/dist/audit/records.d.ts.map +1 -1
- package/dist/audit/records.js +2 -1
- package/dist/audit/types.d.ts +4 -1
- package/dist/audit/types.d.ts.map +1 -1
- package/dist/aws/dynamodb-stores.d.ts +2 -7
- package/dist/aws/dynamodb-stores.d.ts.map +1 -1
- package/dist/aws/dynamodb-stores.js +56 -5
- package/dist/aws/testing.d.ts.map +1 -1
- package/dist/aws/testing.js +9 -0
- package/dist/cli.d.ts +6 -6
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +77 -7
- package/dist/evals-live/index.d.ts +2 -2
- package/dist/evals-live/index.d.ts.map +1 -1
- package/dist/evals-live/index.js +1 -1
- package/dist/evals-live/live-eval-runner.d.ts +49 -1
- package/dist/evals-live/live-eval-runner.d.ts.map +1 -1
- package/dist/evals-live/live-eval-runner.js +246 -4
- package/dist/evals-live/types.d.ts +62 -9
- package/dist/evals-live/types.d.ts.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/runtime/actions.d.ts +2 -0
- package/dist/runtime/actions.d.ts.map +1 -1
- package/dist/runtime/actions.js +200 -55
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/stores.d.ts +2 -7
- package/dist/runtime/stores.d.ts.map +1 -1
- package/dist/runtime/stores.js +12 -0
- package/dist/runtime/types.d.ts +25 -6
- package/dist/runtime/types.d.ts.map +1 -1
- package/docs/action-lifecycle.md +38 -32
- package/docs/adapter-roadmap.md +51 -49
- package/docs/adapters.md +14 -15
- package/docs/ai-sdk-runtime.md +36 -39
- package/docs/anthropic-runtime.md +29 -32
- package/docs/api/public-api-policy.md +59 -0
- package/docs/api.md +354 -371
- package/docs/architecture/current-state.md +28 -31
- package/docs/audit/index.md +29 -29
- package/docs/aws/cloudwatch-telemetry.md +5 -7
- package/docs/aws/dynamodb-single-table.md +8 -9
- package/docs/aws/kms-redaction.md +5 -6
- package/docs/aws/overview.md +5 -5
- package/docs/aws/production-reference.md +13 -14
- package/docs/aws/step-functions-approval.md +7 -9
- package/docs/aws-runtime.md +24 -25
- package/docs/capability-manifests.md +17 -21
- package/docs/control-plane/overview.md +2 -2
- package/docs/control-plane.md +24 -27
- package/docs/controls/index.md +19 -22
- package/docs/core/capability-manifests.md +4 -5
- package/docs/core/entity-manifests.md +5 -5
- package/docs/eval-runner.md +29 -31
- package/docs/evalops.md +13 -14
- package/docs/evals/golden-tests.md +4 -5
- package/docs/evals/overview.md +3 -3
- package/docs/evals/replay-and-trace-to-golden.md +19 -20
- package/docs/evals.md +19 -20
- package/docs/evidence.md +22 -23
- package/docs/gemini-runtime.md +31 -33
- package/docs/getting-started/anthropic-quickstart.md +61 -0
- package/docs/getting-started/concepts.md +9 -10
- package/docs/getting-started/gemini-quickstart.md +62 -0
- package/docs/getting-started/installation.md +3 -3
- package/docs/getting-started/openai-quickstart.md +61 -0
- package/docs/getting-started/provider-neutral-quickstart.md +106 -0
- package/docs/getting-started/quickstart.md +2 -2
- package/docs/getting-started.md +23 -20
- package/docs/glossary.md +31 -48
- package/docs/governance/gate.md +28 -30
- package/docs/governance/impact-and-compatibility.md +2 -3
- package/docs/governance/index.md +53 -54
- package/docs/governance/lifecycle.md +4 -5
- package/docs/governance/overview.md +2 -3
- package/docs/governance/risk-compiler.md +4 -5
- package/docs/host-responsibilities.md +6 -8
- package/docs/implementation-notes/baseline-gaps.md +15 -18
- package/docs/index.md +21 -6
- package/docs/interoperability.md +9 -9
- package/docs/langchain-runtime.md +27 -31
- package/docs/live-evals.md +68 -32
- package/docs/mcp-server-runtime.md +36 -40
- package/docs/memory.md +35 -36
- package/docs/migration-0.1-to-1.0.md +14 -9
- package/docs/observability/overview.md +2 -3
- package/docs/observability-runtime.md +35 -39
- package/docs/openai-responses.md +36 -37
- package/docs/openai-runtime.md +41 -46
- package/docs/openai-walkthrough.md +24 -28
- package/docs/policy-broker.md +9 -10
- package/docs/provenance.md +30 -29
- package/docs/providers/anthropic.md +5 -5
- package/docs/providers/choose-a-runtime.md +37 -0
- package/docs/providers/conformance.md +14 -15
- package/docs/providers/gemini.md +5 -5
- package/docs/providers/mcp.md +2 -3
- package/docs/providers/openai.md +2 -2
- package/docs/providers/semantic-kernel.md +2 -2
- package/docs/providers.md +43 -38
- package/docs/public/license-exceptions.md +187 -0
- package/docs/public/npm-release-preflight.md +112 -0
- package/docs/public-framework/compatibility-policy.md +12 -13
- package/docs/public-framework/deprecation-policy.md +8 -8
- package/docs/public-framework/final-certification-matrix.md +104 -0
- package/docs/public-framework/license-decision.md +20 -0
- package/docs/public-framework/release-process.md +46 -16
- package/docs/public-framework/security-disclosure.md +4 -5
- package/docs/public-framework/v1-certification.md +102 -15
- package/docs/release.md +200 -122
- package/docs/runtime/action-lifecycle.md +3 -3
- package/docs/runtime/policy-broker.md +4 -4
- package/docs/runtime/runtime-overview.md +4 -5
- package/docs/runtime/tool-result-envelope.md +7 -7
- package/docs/runtime.md +90 -93
- package/docs/security/overview.md +4 -4
- package/docs/security/security-packs.md +24 -26
- package/docs/security/trust-taint-redaction.md +42 -47
- package/docs/semantic-kernel-runtime.md +35 -37
- package/docs/spec.md +95 -101
- package/docs/start-here.md +18 -20
- package/examples/01-basic-read-capability/README.md +3 -4
- package/examples/02-prepare-approve-commit/README.md +6 -6
- package/examples/03-multi-provider-tools/README.md +2 -2
- package/examples/04-mcp-server/README.md +4 -5
- package/examples/05-langchain-langgraph-bridge/README.md +4 -5
- package/examples/06-vercel-ai-sdk-bridge/README.md +5 -7
- package/examples/07-policy-broker-custom-auth/README.md +4 -4
- package/examples/08-aws-step-functions-approval/README.md +4 -5
- package/examples/09-security-packs-promptfoo/README.md +4 -4
- package/examples/10-trace-to-golden/README.md +2 -2
- package/examples/11-control-plane/README.md +4 -5
- package/examples/aws/README.md +5 -8
- package/examples/control-plane/README.md +8 -9
- package/examples/control-plane/fixtures/control-plane.seed.json +8 -32
- package/examples/control-plane/public/app.js +57 -18
- package/examples/control-plane/public/index.html +15 -6
- package/examples/control-plane/server.mjs +15 -3
- package/examples/eval-results/public.results.passing.json +6 -21
- package/examples/providers/ai-sdk-next/README.md +11 -8
- package/examples/providers/anthropic-claude/README.md +5 -6
- package/examples/providers/gemini/README.md +6 -6
- package/examples/providers/langchain-agent/README.md +3 -4
- package/examples/providers/langgraph-tool-node/README.md +7 -7
- package/examples/providers/mcp/README.md +8 -8
- package/examples/providers/provider-conformance/README.md +3 -3
- package/examples/providers/semantic-kernel-mcp/README.md +6 -6
- package/examples/providers/semantic-kernel-openapi/README.md +6 -7
- package/examples/runtime-support-billing/README.md +8 -9
- package/examples/runtime-support-billing/support-billing-runtime.mjs +8 -4
- package/examples/scheduling/capabilities/scheduling.availability.get.yaml +2 -2
- package/examples/scheduling/capabilities/scheduling.invite.prepare.yaml +2 -2
- package/examples/scheduling/capabilities/scheduling.invite.send.yaml +2 -2
- package/examples/scheduling/entities/AvailabilitySlot.yaml +2 -2
- package/examples/scheduling/entities/MeetingInvite.yaml +2 -2
- package/examples/scheduling/evals/scheduling.invite.prepare.valid.yaml +3 -1
- package/examples/semantic-kernel-mcp/README.md +11 -12
- package/examples/semantic-kernel-openapi/README.md +8 -8
- package/examples/support/capabilities/support.refund.commit_case.yaml +3 -3
- package/examples/support/capabilities/support.refund.prepare_case.yaml +2 -2
- package/examples/support/capabilities/support.ticket.get.yaml +2 -2
- package/examples/support/entities/Ticket.yaml +0 -1
- package/examples/support/eval-results/support.results.passing.json +3 -12
- package/examples/support/evals/support.refund.prepare_case.approval_required.yaml +3 -1
- package/examples/support/evals/support.refund.prepare_case.valid.yaml +3 -2
- package/examples/support/memory/support.agent.preferences.json +2 -6
- package/examples/support/openai/context.support_agent.json +1 -4
- package/examples/support/provenance/support.refund.summary.provenance.json +2 -6
- package/examples/support/replay/support.refund.approval_required.trace.json +4 -14
- package/package.json +22 -5
- package/schemas/audit/action-record.schema.json +4 -1
- package/schemas/aws/approval-task.schema.json +8 -1
- package/schemas/conformance/conformance-case.schema.json +18 -2
- package/schemas/conformance/conformance-report.schema.json +17 -2
- package/schemas/conformance/provider-target-matrix.schema.json +35 -4
- package/schemas/controls/control-decision.schema.json +7 -1
- package/schemas/eval-case.schema.json +8 -1
- package/schemas/eval-result.schema.json +8 -1
- package/schemas/evidence/evidence-pack.schema.json +34 -5
- package/schemas/governance/compatibility-diff.schema.json +8 -1
- package/schemas/governance/lifecycle-transition.schema.json +10 -1
- package/schemas/governance/risk-compilation-result.schema.json +9 -1
- package/schemas/provenance/generated-content-provenance.schema.json +3 -1
- package/schemas/replay/replay-result.schema.json +16 -2
- package/schemas/replay/replay-trace.schema.json +11 -2
- package/schemas/security/context-segment.schema.json +21 -12
- package/schemas/security/redaction-policy.schema.json +4 -1
- package/schemas/security-packs/coverage-report.schema.json +17 -2
- package/schemas/security-packs/security-case-suite.schema.json +11 -1
- package/schemas/tool-result-envelope.schema.json +9 -1
- package/security-packs/approval_bypass.yaml +12 -2
- package/security-packs/capability_spoofing.yaml +17 -3
- package/security-packs/cost_amplification.yaml +21 -4
- package/security-packs/cross_tenant_access.yaml +16 -3
- package/security-packs/insecure_output_rendering.yaml +15 -4
- package/security-packs/mcp_tool_abuse.yaml +17 -3
- package/security-packs/memory_scope_violation.yaml +19 -4
- package/security-packs/prompt_injection_direct.yaml +19 -4
- package/security-packs/prompt_injection_indirect.yaml +18 -3
- package/security-packs/provider_payload_exposure.yaml +26 -4
- package/security-packs/retrieval_poisoning.yaml +5 -2
- package/security-packs/schema_confusion.yaml +17 -3
- package/security-packs/sensitive_data_disclosure.yaml +22 -5
- package/security-packs/tool_exfiltration.yaml +20 -4
- package/security-packs/tool_result_poisoning.yaml +19 -4
- package/security-packs/unsafe_commit_attempt.yaml +6 -3
package/dist/cli.js
CHANGED
|
@@ -16,13 +16,15 @@ import { buildLangChainToolDescriptors } from "./langchain.js";
|
|
|
16
16
|
import { loadManifests } from "./loader.js";
|
|
17
17
|
import { buildMcpToolDescriptors } from "./mcp.js";
|
|
18
18
|
import { createDefaultOpenAIResponsesClient } from "./openai/index.js";
|
|
19
|
+
import { createDefaultAnthropicMessagesClient } from "./providers/anthropic/index.js";
|
|
20
|
+
import { createDefaultGeminiClient } from "./providers/gemini/index.js";
|
|
19
21
|
import { buildOpenAIResponsesTools } from "./openai-responses.js";
|
|
20
22
|
import { exportPromptfooSuite } from "./promptfoo/index.js";
|
|
21
23
|
import { buildRegistry, formatInspection, inspectRegistry } from "./registry.js";
|
|
22
24
|
import { createGoldenFromTrace, runReplay, validateReplayTrace } from "./replay/index.js";
|
|
23
25
|
import { exportPromptfooSecurityPackSuite, generateSecurityCases, getSecurityPack, listSecurityPacks } from "./security-packs/index.js";
|
|
24
26
|
import { AicfActionLifecycleManager, AicfHandlerRegistry, AicfToolExecutor, DefaultCapabilityRouter, DefaultContextBuilder, DefaultPolicyBroker, InMemoryApprovalStore, InMemoryAuditSink, InMemoryIdempotencyStore, InMemoryPreparedActionStore } from "./runtime/index.js";
|
|
25
|
-
import { evaluateGate, runLiveEvalSuite } from "./evals-live/index.js";
|
|
27
|
+
import { createAnthropicLiveEvalRunner, createGeminiLiveEvalRunner, createOpenAILiveEvalRunner, evaluateGate, runLiveEvalSuite } from "./evals-live/index.js";
|
|
26
28
|
import { buildSemanticKernelFunctions } from "./semantic-kernel.js";
|
|
27
29
|
import { validateManifests, validatePublicFixtures } from "./validator.js";
|
|
28
30
|
const adapterCommands = new Set([
|
|
@@ -207,12 +209,21 @@ export async function runCli(argv, options = {}) {
|
|
|
207
209
|
stderr.write("Missing required --cases <cases.json>.\n");
|
|
208
210
|
return 1;
|
|
209
211
|
}
|
|
212
|
+
if (!parsedArgs.providerName) {
|
|
213
|
+
stderr.write("Missing required --provider <openai|anthropic|gemini|ai-sdk> for live evals.\n");
|
|
214
|
+
return 1;
|
|
215
|
+
}
|
|
210
216
|
if (!parsedArgs.model) {
|
|
211
217
|
stderr.write("Missing required --model <model> for live evals.\n");
|
|
212
218
|
return 1;
|
|
213
219
|
}
|
|
214
|
-
if (
|
|
215
|
-
stderr.write("
|
|
220
|
+
if (process.env.RUN_REAL_AICF_LIVE_EVALS !== "1") {
|
|
221
|
+
stderr.write("RUN_REAL_AICF_LIVE_EVALS=1 is required for CLI live evals. Use the TypeScript API with a mock runner for API-key-free tests.\n");
|
|
222
|
+
return 1;
|
|
223
|
+
}
|
|
224
|
+
const runner = await createCliLiveEvalRunner(parsedArgs.providerName, parsedArgs.model);
|
|
225
|
+
if (!runner.ok) {
|
|
226
|
+
stderr.write(`${runner.error}\n`);
|
|
216
227
|
return 1;
|
|
217
228
|
}
|
|
218
229
|
const cases = await readLiveEvalCases(parsedArgs.casesPath);
|
|
@@ -243,9 +254,8 @@ export async function runCli(argv, options = {}) {
|
|
|
243
254
|
cases: cases.value,
|
|
244
255
|
contextBuilderFactory: () => new DefaultContextBuilder(),
|
|
245
256
|
executor,
|
|
246
|
-
model: parsedArgs.model,
|
|
247
|
-
openAIClient: await createDefaultOpenAIResponsesClient(),
|
|
248
257
|
registry,
|
|
258
|
+
runner: runner.value,
|
|
249
259
|
router: new DefaultCapabilityRouter()
|
|
250
260
|
});
|
|
251
261
|
const gate = evaluateGate(results);
|
|
@@ -266,7 +276,7 @@ function helpText() {
|
|
|
266
276
|
"Commands:",
|
|
267
277
|
" decide <path> --request <file> Evaluate a decision request.",
|
|
268
278
|
" eval <path> --results <file> [--format text|json] Run deterministic evals.",
|
|
269
|
-
" eval-live <path> --cases <file> --model <model> [--format text|json] Run opt-in live evals.",
|
|
279
|
+
" eval-live <path> --cases <file> --provider <provider> --model <model> [--format text|json] Run opt-in live evals.",
|
|
270
280
|
" export promptfoo <path> --out <dir> [--provider <provider>] Generate Promptfoo suite files.",
|
|
271
281
|
" governance risk <path> [--capability <id>] [--format text|json] Compile governance risk.",
|
|
272
282
|
" governance lifecycle <path> --capability <id> --to <status> --reason <text> Evaluate lifecycle transition.",
|
|
@@ -2042,6 +2052,65 @@ function adapterLabel(command) {
|
|
|
2042
2052
|
return "Semantic Kernel";
|
|
2043
2053
|
}
|
|
2044
2054
|
}
|
|
2055
|
+
async function createCliLiveEvalRunner(providerName, model) {
|
|
2056
|
+
const provider = normalizeLiveEvalProvider(providerName);
|
|
2057
|
+
if (!provider) {
|
|
2058
|
+
return {
|
|
2059
|
+
error: "Unsupported live eval provider. Use one of: openai, anthropic, gemini, ai-sdk.",
|
|
2060
|
+
ok: false
|
|
2061
|
+
};
|
|
2062
|
+
}
|
|
2063
|
+
if (provider === "openai") {
|
|
2064
|
+
if (!process.env.OPENAI_API_KEY) {
|
|
2065
|
+
return { error: "OPENAI_API_KEY is required for OpenAI CLI live evals.", ok: false };
|
|
2066
|
+
}
|
|
2067
|
+
return {
|
|
2068
|
+
ok: true,
|
|
2069
|
+
value: createOpenAILiveEvalRunner({
|
|
2070
|
+
client: await createDefaultOpenAIResponsesClient(),
|
|
2071
|
+
model
|
|
2072
|
+
})
|
|
2073
|
+
};
|
|
2074
|
+
}
|
|
2075
|
+
if (provider === "anthropic") {
|
|
2076
|
+
if (!process.env.ANTHROPIC_API_KEY) {
|
|
2077
|
+
return { error: "ANTHROPIC_API_KEY is required for Anthropic CLI live evals.", ok: false };
|
|
2078
|
+
}
|
|
2079
|
+
return {
|
|
2080
|
+
ok: true,
|
|
2081
|
+
value: createAnthropicLiveEvalRunner({
|
|
2082
|
+
client: await createDefaultAnthropicMessagesClient(),
|
|
2083
|
+
model
|
|
2084
|
+
})
|
|
2085
|
+
};
|
|
2086
|
+
}
|
|
2087
|
+
if (provider === "gemini") {
|
|
2088
|
+
if (!process.env.GEMINI_API_KEY) {
|
|
2089
|
+
return { error: "GEMINI_API_KEY is required for Gemini CLI live evals.", ok: false };
|
|
2090
|
+
}
|
|
2091
|
+
return {
|
|
2092
|
+
ok: true,
|
|
2093
|
+
value: createGeminiLiveEvalRunner({
|
|
2094
|
+
client: await createDefaultGeminiClient(),
|
|
2095
|
+
model
|
|
2096
|
+
})
|
|
2097
|
+
};
|
|
2098
|
+
}
|
|
2099
|
+
return {
|
|
2100
|
+
error: "AI SDK CLI live evals require a host-supplied generateText function. Use createAiSdkLiveEvalRunner() from the TypeScript API.",
|
|
2101
|
+
ok: false
|
|
2102
|
+
};
|
|
2103
|
+
}
|
|
2104
|
+
function normalizeLiveEvalProvider(value) {
|
|
2105
|
+
const normalized = value.toLowerCase().replace(/_/g, "-");
|
|
2106
|
+
if (normalized === "openai" || normalized === "anthropic" || normalized === "gemini" || normalized === "ai-sdk") {
|
|
2107
|
+
return normalized;
|
|
2108
|
+
}
|
|
2109
|
+
if (normalized === "vercel-ai-sdk") {
|
|
2110
|
+
return "ai-sdk";
|
|
2111
|
+
}
|
|
2112
|
+
return undefined;
|
|
2113
|
+
}
|
|
2045
2114
|
function formatDiagnostics(errors) {
|
|
2046
2115
|
return errors
|
|
2047
2116
|
.map((error) => {
|
|
@@ -2057,7 +2126,8 @@ function formatLiveEvalResults(results, gate) {
|
|
|
2057
2126
|
`Live eval gate ${gate.status}: average score ${gate.averageScore.toFixed(3)}.`
|
|
2058
2127
|
];
|
|
2059
2128
|
for (const result of results) {
|
|
2060
|
-
|
|
2129
|
+
const provider = result.providerId ? ` (${result.providerId}${result.runtimeName ? `/${result.runtimeName}` : ""})` : "";
|
|
2130
|
+
lines.push(`- ${result.status}: ${result.evalId}${provider}`);
|
|
2061
2131
|
}
|
|
2062
2132
|
return `${lines.join("\n")}\n`;
|
|
2063
2133
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { createEvalCandidateFromRunResult, createEvalCaseFromTrace, evaluateGate, noRawInternalDetailsScorer, runLiveEvalSuite } from "./live-eval-runner.js";
|
|
2
|
-
export type { AicfEvalGate, AicfEvalGateResult, AicfLiveEvalCaseInput, AicfLiveEvalOptions, AicfLiveEvalResult, AicfLiveEvalScorer, CreateEvalCaseFromTraceInput } from "./types.js";
|
|
1
|
+
export { createEvalCandidateFromRunResult, createEvalCaseFromTrace, createAiSdkLiveEvalRunner, createAnthropicLiveEvalRunner, createGeminiLiveEvalRunner, createMockLiveEvalRunner, createOpenAILiveEvalRunner, evaluateGate, noRawInternalDetailsScorer, runOpenAILiveEvalSuite, runLiveEvalSuite } from "./live-eval-runner.js";
|
|
2
|
+
export type { AicfEvalGate, AicfEvalGateResult, AicfLiveEvalCaseInput, AicfLiveEvalCaseRunInput, AicfLiveEvalCaseRunResult, AicfLiveEvalOptions, AicfLiveEvalProviderId, AicfLiveEvalResult, AicfLiveEvalRunner, AicfLiveEvalScorer, AicfNormalizedLiveEvalRunResult, CreateEvalCaseFromTraceInput } from "./types.js";
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/evals-live/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gCAAgC,EAChC,uBAAuB,EACvB,YAAY,EACZ,0BAA0B,EAC1B,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,4BAA4B,EAC7B,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/evals-live/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gCAAgC,EAChC,uBAAuB,EACvB,yBAAyB,EACzB,6BAA6B,EAC7B,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,EAC1B,YAAY,EACZ,0BAA0B,EAC1B,sBAAsB,EACtB,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,+BAA+B,EAC/B,4BAA4B,EAC7B,MAAM,YAAY,CAAC"}
|
package/dist/evals-live/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { createEvalCandidateFromRunResult, createEvalCaseFromTrace, evaluateGate, noRawInternalDetailsScorer, runLiveEvalSuite } from "./live-eval-runner.js";
|
|
1
|
+
export { createEvalCandidateFromRunResult, createEvalCaseFromTrace, createAiSdkLiveEvalRunner, createAnthropicLiveEvalRunner, createGeminiLiveEvalRunner, createMockLiveEvalRunner, createOpenAILiveEvalRunner, evaluateGate, noRawInternalDetailsScorer, runOpenAILiveEvalSuite, runLiveEvalSuite } from "./live-eval-runner.js";
|
|
@@ -1,6 +1,54 @@
|
|
|
1
|
+
import { type AicfOpenAIResponsesClient } from "../openai/index.js";
|
|
2
|
+
import { type AicfAnthropicMessagesClient } from "../providers/anthropic/index.js";
|
|
3
|
+
import { type AicfGeminiClient } from "../providers/gemini/index.js";
|
|
4
|
+
import { type AicfAiSdkGenerateTextLike, type AicfAiSdkToolFactories } from "../providers/ai-sdk/index.js";
|
|
1
5
|
import type { EvalCandidateResult, EvalCase, EvalScorerResult } from "../types.js";
|
|
2
|
-
import type { AicfEvalGate, AicfEvalGateResult, AicfLiveEvalOptions, AicfLiveEvalResult, CreateEvalCaseFromTraceInput } from "./types.js";
|
|
6
|
+
import type { AicfEvalGate, AicfEvalGateResult, AicfLiveEvalCaseInput, AicfLiveEvalOptions, AicfLiveEvalProviderId, AicfLiveEvalResult, AicfLiveEvalRunner, AicfNormalizedLiveEvalRunResult, CreateEvalCaseFromTraceInput } from "./types.js";
|
|
3
7
|
export declare function runLiveEvalSuite(options: AicfLiveEvalOptions): Promise<AicfLiveEvalResult[]>;
|
|
8
|
+
export declare function runOpenAILiveEvalSuite(options: Omit<AicfLiveEvalOptions, "runner"> & {
|
|
9
|
+
model: string;
|
|
10
|
+
openAIClient: AicfOpenAIResponsesClient;
|
|
11
|
+
}): Promise<AicfLiveEvalResult[]>;
|
|
12
|
+
export declare function createOpenAILiveEvalRunner(options: {
|
|
13
|
+
client: AicfOpenAIResponsesClient;
|
|
14
|
+
maxToolCalls?: number;
|
|
15
|
+
maxTurns?: number;
|
|
16
|
+
model: string;
|
|
17
|
+
runtimeName?: string;
|
|
18
|
+
systemInstructions?: string;
|
|
19
|
+
temperature?: number;
|
|
20
|
+
}): AicfLiveEvalRunner;
|
|
21
|
+
export declare function createAnthropicLiveEvalRunner(options: {
|
|
22
|
+
client: AicfAnthropicMessagesClient;
|
|
23
|
+
maxTokens?: number;
|
|
24
|
+
maxToolCalls?: number;
|
|
25
|
+
maxToolIterations?: number;
|
|
26
|
+
model: string;
|
|
27
|
+
runtimeName?: string;
|
|
28
|
+
strictTools?: boolean;
|
|
29
|
+
system?: string;
|
|
30
|
+
}): AicfLiveEvalRunner;
|
|
31
|
+
export declare function createGeminiLiveEvalRunner(options: {
|
|
32
|
+
client: AicfGeminiClient;
|
|
33
|
+
maxToolCalls?: number;
|
|
34
|
+
maxToolIterations?: number;
|
|
35
|
+
model: string;
|
|
36
|
+
runtimeName?: string;
|
|
37
|
+
systemInstruction?: string;
|
|
38
|
+
}): AicfLiveEvalRunner;
|
|
39
|
+
export declare function createAiSdkLiveEvalRunner(options: {
|
|
40
|
+
generateText: AicfAiSdkGenerateTextLike;
|
|
41
|
+
maxSteps?: number;
|
|
42
|
+
model: unknown;
|
|
43
|
+
runtimeName?: string;
|
|
44
|
+
system?: string;
|
|
45
|
+
toolFactories?: AicfAiSdkToolFactories;
|
|
46
|
+
}): AicfLiveEvalRunner;
|
|
47
|
+
export declare function createMockLiveEvalRunner(input: {
|
|
48
|
+
providerId?: AicfLiveEvalProviderId;
|
|
49
|
+
result: AicfNormalizedLiveEvalRunResult | ((testCase: AicfLiveEvalCaseInput) => AicfNormalizedLiveEvalRunResult);
|
|
50
|
+
runtimeName?: string;
|
|
51
|
+
}): AicfLiveEvalRunner;
|
|
4
52
|
export declare function evaluateGate(results: AicfLiveEvalResult[], gate?: AicfEvalGate): AicfEvalGateResult;
|
|
5
53
|
export declare function createEvalCandidateFromRunResult(evalId: string, runResult: {
|
|
6
54
|
finalText: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-eval-runner.d.ts","sourceRoot":"","sources":["../../src/evals-live/live-eval-runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"live-eval-runner.d.ts","sourceRoot":"","sources":["../../src/evals-live/live-eval-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { runOpenAIResponses } from "../openai/index.js";
|
|
2
|
+
import { runAnthropicMessages } from "../providers/anthropic/index.js";
|
|
3
|
+
import { runGeminiGenerateContent } from "../providers/gemini/index.js";
|
|
4
|
+
import { createPlainAiSdkToolFactories, runAiSdkGenerateText } from "../providers/ai-sdk/index.js";
|
|
2
5
|
import { scoreEvalCase } from "../eval-runner.js";
|
|
3
6
|
import { emitTraceEvent } from "../observability/index.js";
|
|
4
7
|
export async function runLiveEvalSuite(options) {
|
|
5
8
|
const results = [];
|
|
9
|
+
const runner = resolveLiveEvalRunner(options);
|
|
6
10
|
for (const testCase of options.cases) {
|
|
7
11
|
const loadedEval = options.registry.evalById.get(testCase.evalId);
|
|
8
12
|
if (!loadedEval) {
|
|
@@ -21,7 +25,9 @@ export async function runLiveEvalSuite(options) {
|
|
|
21
25
|
try {
|
|
22
26
|
await emitTraceEvent({
|
|
23
27
|
attributes: {
|
|
24
|
-
evalId: testCase.evalId
|
|
28
|
+
evalId: testCase.evalId,
|
|
29
|
+
provider: runner.providerId,
|
|
30
|
+
runtimeName: runner.runtimeName
|
|
25
31
|
},
|
|
26
32
|
events: undefined,
|
|
27
33
|
requestId: testCase.runtimeContext.requestId,
|
|
@@ -29,17 +35,21 @@ export async function runLiveEvalSuite(options) {
|
|
|
29
35
|
sink: options.traceSink,
|
|
30
36
|
type: "eval.score"
|
|
31
37
|
});
|
|
32
|
-
const
|
|
33
|
-
|
|
38
|
+
const providerResult = await runner.runCase({
|
|
39
|
+
caseId: testCase.evalId,
|
|
34
40
|
contextBuilder: options.contextBuilderFactory(testCase),
|
|
35
41
|
executor: options.executor,
|
|
36
|
-
|
|
42
|
+
loadedEval,
|
|
43
|
+
providerConfig: options.providerConfig,
|
|
37
44
|
registry: options.registry,
|
|
38
45
|
router: options.router,
|
|
39
46
|
runtimeContext: testCase.runtimeContext,
|
|
47
|
+
suiteId: options.suiteId ?? "live_eval_suite",
|
|
48
|
+
testCase,
|
|
40
49
|
traceSink: options.traceSink,
|
|
41
50
|
userInput: testCase.userInput
|
|
42
51
|
});
|
|
52
|
+
const runResult = providerResult.runResult;
|
|
43
53
|
const candidate = createEvalCandidateFromRunResult(testCase.evalId, runResult);
|
|
44
54
|
const evalForScoring = testCase.expected
|
|
45
55
|
? loadedEvalWithExpected(loadedEval, testCase.expected)
|
|
@@ -60,7 +70,9 @@ export async function runLiveEvalSuite(options) {
|
|
|
60
70
|
results.push({
|
|
61
71
|
candidate,
|
|
62
72
|
evalId: testCase.evalId,
|
|
73
|
+
providerId: providerResult.providerId,
|
|
63
74
|
runResult,
|
|
75
|
+
runtimeName: providerResult.runtimeName,
|
|
64
76
|
scores,
|
|
65
77
|
status: passed ? "passed" : "failed"
|
|
66
78
|
});
|
|
@@ -80,6 +92,149 @@ export async function runLiveEvalSuite(options) {
|
|
|
80
92
|
}
|
|
81
93
|
return results;
|
|
82
94
|
}
|
|
95
|
+
export function runOpenAILiveEvalSuite(options) {
|
|
96
|
+
return runLiveEvalSuite({
|
|
97
|
+
...options,
|
|
98
|
+
runner: createOpenAILiveEvalRunner({
|
|
99
|
+
client: options.openAIClient,
|
|
100
|
+
model: options.model
|
|
101
|
+
})
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
export function createOpenAILiveEvalRunner(options) {
|
|
105
|
+
return {
|
|
106
|
+
providerId: "openai",
|
|
107
|
+
runtimeName: options.runtimeName ?? "openai-responses",
|
|
108
|
+
async runCase(input) {
|
|
109
|
+
const runResult = await runOpenAIResponses({
|
|
110
|
+
client: options.client,
|
|
111
|
+
contextBuilder: input.contextBuilder,
|
|
112
|
+
executor: input.executor,
|
|
113
|
+
maxToolCalls: options.maxToolCalls,
|
|
114
|
+
maxTurns: options.maxTurns,
|
|
115
|
+
model: options.model,
|
|
116
|
+
registry: input.registry,
|
|
117
|
+
router: input.router,
|
|
118
|
+
runtimeContext: input.runtimeContext,
|
|
119
|
+
systemInstructions: options.systemInstructions,
|
|
120
|
+
temperature: options.temperature,
|
|
121
|
+
traceSink: input.traceSink,
|
|
122
|
+
userInput: input.userInput
|
|
123
|
+
});
|
|
124
|
+
return {
|
|
125
|
+
providerId: "openai",
|
|
126
|
+
runtimeName: options.runtimeName ?? "openai-responses",
|
|
127
|
+
runResult: normalizeOpenAIRunResult(runResult, options.runtimeName ?? "openai-responses")
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
export function createAnthropicLiveEvalRunner(options) {
|
|
133
|
+
return {
|
|
134
|
+
providerId: "anthropic",
|
|
135
|
+
runtimeName: options.runtimeName ?? "anthropic-messages",
|
|
136
|
+
async runCase(input) {
|
|
137
|
+
const { builtContext, slice } = await buildLiveEvalContext(input);
|
|
138
|
+
const runResult = await runAnthropicMessages({
|
|
139
|
+
builtContext,
|
|
140
|
+
client: options.client,
|
|
141
|
+
executor: input.executor,
|
|
142
|
+
maxTokens: options.maxTokens,
|
|
143
|
+
maxToolCalls: options.maxToolCalls,
|
|
144
|
+
maxToolIterations: options.maxToolIterations,
|
|
145
|
+
messages: [{ content: input.userInput.text, role: "user" }],
|
|
146
|
+
model: options.model,
|
|
147
|
+
registry: input.registry,
|
|
148
|
+
runtimeContext: input.runtimeContext,
|
|
149
|
+
slice,
|
|
150
|
+
strictTools: options.strictTools,
|
|
151
|
+
system: options.system,
|
|
152
|
+
traceSink: input.traceSink
|
|
153
|
+
});
|
|
154
|
+
return {
|
|
155
|
+
providerId: "anthropic",
|
|
156
|
+
runtimeName: options.runtimeName ?? "anthropic-messages",
|
|
157
|
+
runResult: normalizeProviderRuntimeResult("anthropic", options.runtimeName ?? "anthropic-messages", runResult, slice)
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
export function createGeminiLiveEvalRunner(options) {
|
|
163
|
+
return {
|
|
164
|
+
providerId: "gemini",
|
|
165
|
+
runtimeName: options.runtimeName ?? "gemini-generate-content",
|
|
166
|
+
async runCase(input) {
|
|
167
|
+
const { builtContext, slice } = await buildLiveEvalContext(input);
|
|
168
|
+
const runResult = await runGeminiGenerateContent({
|
|
169
|
+
builtContext,
|
|
170
|
+
client: options.client,
|
|
171
|
+
contents: input.userInput.text,
|
|
172
|
+
executor: input.executor,
|
|
173
|
+
maxToolCalls: options.maxToolCalls,
|
|
174
|
+
maxToolIterations: options.maxToolIterations,
|
|
175
|
+
model: options.model,
|
|
176
|
+
registry: input.registry,
|
|
177
|
+
runtimeContext: input.runtimeContext,
|
|
178
|
+
slice,
|
|
179
|
+
systemInstruction: options.systemInstruction,
|
|
180
|
+
traceSink: input.traceSink
|
|
181
|
+
});
|
|
182
|
+
return {
|
|
183
|
+
providerId: "gemini",
|
|
184
|
+
runtimeName: options.runtimeName ?? "gemini-generate-content",
|
|
185
|
+
runResult: normalizeProviderRuntimeResult("gemini", options.runtimeName ?? "gemini-generate-content", runResult, slice)
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
export function createAiSdkLiveEvalRunner(options) {
|
|
191
|
+
return {
|
|
192
|
+
providerId: "ai-sdk",
|
|
193
|
+
runtimeName: options.runtimeName ?? "ai-sdk-generate-text",
|
|
194
|
+
async runCase(input) {
|
|
195
|
+
const { builtContext, slice } = await buildLiveEvalContext(input);
|
|
196
|
+
const runResult = await runAiSdkGenerateText({
|
|
197
|
+
builtContext,
|
|
198
|
+
executor: input.executor,
|
|
199
|
+
generateText: options.generateText,
|
|
200
|
+
maxSteps: options.maxSteps,
|
|
201
|
+
model: options.model,
|
|
202
|
+
prompt: input.userInput.text,
|
|
203
|
+
registry: input.registry,
|
|
204
|
+
runtimeContext: input.runtimeContext,
|
|
205
|
+
slice,
|
|
206
|
+
system: options.system,
|
|
207
|
+
toolFactories: options.toolFactories ?? createPlainAiSdkToolFactories(),
|
|
208
|
+
traceSink: input.traceSink
|
|
209
|
+
});
|
|
210
|
+
return {
|
|
211
|
+
providerId: "ai-sdk",
|
|
212
|
+
runtimeName: options.runtimeName ?? "ai-sdk-generate-text",
|
|
213
|
+
runResult: normalizeAiSdkRunResult(runResult, options.runtimeName ?? "ai-sdk-generate-text", slice)
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
export function createMockLiveEvalRunner(input) {
|
|
219
|
+
const providerId = input.providerId ?? "mock";
|
|
220
|
+
const runtimeName = input.runtimeName ?? "mock-live-eval";
|
|
221
|
+
return {
|
|
222
|
+
providerId,
|
|
223
|
+
runtimeName,
|
|
224
|
+
async runCase(runInput) {
|
|
225
|
+
const result = typeof input.result === "function" ? input.result(runInput.testCase) : input.result;
|
|
226
|
+
return {
|
|
227
|
+
providerId,
|
|
228
|
+
runtimeName,
|
|
229
|
+
runResult: {
|
|
230
|
+
...result,
|
|
231
|
+
providerId,
|
|
232
|
+
runtimeName
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
}
|
|
83
238
|
export function evaluateGate(results, gate = {}) {
|
|
84
239
|
const minAverageScore = gate.minAverageScore ?? 0.9;
|
|
85
240
|
const forbiddenFailedScorers = gate.forbiddenFailedScorers ?? [
|
|
@@ -135,6 +290,93 @@ export function createEvalCandidateFromRunResult(evalId, runResult) {
|
|
|
135
290
|
}))
|
|
136
291
|
};
|
|
137
292
|
}
|
|
293
|
+
function resolveLiveEvalRunner(options) {
|
|
294
|
+
if (options.runner) {
|
|
295
|
+
return options.runner;
|
|
296
|
+
}
|
|
297
|
+
if (options.openAIClient && options.model) {
|
|
298
|
+
return createOpenAILiveEvalRunner({
|
|
299
|
+
client: options.openAIClient,
|
|
300
|
+
model: options.model
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
throw new Error("A live eval runner is required. Pass runner or legacy openAIClient plus model.");
|
|
304
|
+
}
|
|
305
|
+
async function buildLiveEvalContext(input) {
|
|
306
|
+
const builtContext = await input.contextBuilder.build({
|
|
307
|
+
baseContext: input.runtimeContext,
|
|
308
|
+
registry: input.registry,
|
|
309
|
+
userInput: input.userInput
|
|
310
|
+
});
|
|
311
|
+
const slice = await input.router.route({
|
|
312
|
+
builtContext,
|
|
313
|
+
registry: input.registry,
|
|
314
|
+
userInput: input.userInput
|
|
315
|
+
});
|
|
316
|
+
return { builtContext, slice };
|
|
317
|
+
}
|
|
318
|
+
function normalizeOpenAIRunResult(runResult, runtimeName) {
|
|
319
|
+
return {
|
|
320
|
+
errors: runResult.errors,
|
|
321
|
+
finalText: runResult.finalText,
|
|
322
|
+
providerId: "openai",
|
|
323
|
+
responseId: runResult.responseId,
|
|
324
|
+
runId: runResult.runId,
|
|
325
|
+
runtimeName,
|
|
326
|
+
selectedCapabilities: runResult.selectedCapabilities,
|
|
327
|
+
status: runResult.status,
|
|
328
|
+
toolCalls: runResult.toolCalls.map((call) => ({
|
|
329
|
+
args: call.args,
|
|
330
|
+
callId: call.callId,
|
|
331
|
+
capabilityId: call.capabilityId,
|
|
332
|
+
toolName: call.toolName
|
|
333
|
+
})),
|
|
334
|
+
toolResults: runResult.toolResults,
|
|
335
|
+
traceEvents: runResult.traceEvents,
|
|
336
|
+
usage: runResult.usage
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
function normalizeProviderRuntimeResult(providerId, runtimeName, runResult, selectedCapabilities) {
|
|
340
|
+
return {
|
|
341
|
+
errors: runResult.errors,
|
|
342
|
+
finalText: runResult.finalText,
|
|
343
|
+
providerId,
|
|
344
|
+
responseId: runResult.responseId,
|
|
345
|
+
runId: runResult.traceEvents[0]?.runId ?? runResult.toolResults[0]?.runId ?? "unknown",
|
|
346
|
+
runtimeName,
|
|
347
|
+
selectedCapabilities,
|
|
348
|
+
status: runResult.status,
|
|
349
|
+
toolCalls: runResult.toolCalls.map((call) => ({
|
|
350
|
+
args: call.args,
|
|
351
|
+
callId: call.callId,
|
|
352
|
+
capabilityId: call.capabilityId,
|
|
353
|
+
toolName: call.providerToolName
|
|
354
|
+
})),
|
|
355
|
+
toolResults: runResult.toolResults,
|
|
356
|
+
traceEvents: runResult.traceEvents,
|
|
357
|
+
usage: runResult.usage
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
function normalizeAiSdkRunResult(runResult, runtimeName, selectedCapabilities) {
|
|
361
|
+
return {
|
|
362
|
+
errors: runResult.errors,
|
|
363
|
+
finalText: runResult.text ?? "",
|
|
364
|
+
providerId: "ai-sdk",
|
|
365
|
+
runId: runResult.traceEvents[0]?.runId ?? runResult.toolResults[0]?.runId ?? "unknown",
|
|
366
|
+
runtimeName,
|
|
367
|
+
selectedCapabilities,
|
|
368
|
+
status: runResult.status,
|
|
369
|
+
toolCalls: runResult.toolCalls.map((call) => ({
|
|
370
|
+
args: {},
|
|
371
|
+
callId: call.toolCallId,
|
|
372
|
+
capabilityId: call.capabilityId ?? "unknown",
|
|
373
|
+
toolName: call.toolName
|
|
374
|
+
})),
|
|
375
|
+
toolResults: runResult.toolResults,
|
|
376
|
+
traceEvents: runResult.traceEvents,
|
|
377
|
+
usage: runResult.usage
|
|
378
|
+
};
|
|
379
|
+
}
|
|
138
380
|
export function createEvalCaseFromTrace(input) {
|
|
139
381
|
const runResult = input.runResult;
|
|
140
382
|
return {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { AicfOpenAIResponsesClient
|
|
2
|
-
import type { AicfCapabilityRouter, AicfContextBuilder, AicfContextItem, AicfRuntimeContext, AicfRuntimeUserInput, AicfToolExecutor, ManifestRegistry } from "../runtime/index.js";
|
|
3
|
-
import type { EvalCandidateResult, EvalCase, EvalScorerResult } from "../types.js";
|
|
4
|
-
import type { AicfTraceSink } from "../observability/index.js";
|
|
1
|
+
import type { AicfOpenAIResponsesClient } from "../openai/index.js";
|
|
2
|
+
import type { AicfCapabilityRouter, AicfContextBuilder, AicfContextItem, AicfRuntimeContext, AicfRuntimeToolResultEnvelope, AicfRuntimeUserInput, AicfToolExecutor, CapabilitySlice, ManifestRegistry } from "../runtime/index.js";
|
|
3
|
+
import type { EvalCandidateResult, EvalCase, EvalScorerResult, LoadedEvalCase } from "../types.js";
|
|
4
|
+
import type { AicfRuntimeTraceEvent, AicfTraceSink } from "../observability/index.js";
|
|
5
|
+
export type AicfLiveEvalProviderId = "openai" | "anthropic" | "gemini" | "ai-sdk" | "langchain" | "langgraph" | "mcp" | "semantic-kernel-compatible" | string;
|
|
5
6
|
export interface AicfLiveEvalCaseInput {
|
|
6
7
|
evalId: string;
|
|
7
8
|
expected?: EvalCase["expected"];
|
|
@@ -9,11 +10,58 @@ export interface AicfLiveEvalCaseInput {
|
|
|
9
10
|
runtimeContext: AicfRuntimeContext;
|
|
10
11
|
userInput: AicfRuntimeUserInput;
|
|
11
12
|
}
|
|
13
|
+
export interface AicfNormalizedLiveEvalRunResult {
|
|
14
|
+
errors: Array<{
|
|
15
|
+
code: string;
|
|
16
|
+
message: string;
|
|
17
|
+
}>;
|
|
18
|
+
finalText: string;
|
|
19
|
+
providerId: AicfLiveEvalProviderId;
|
|
20
|
+
responseId?: string;
|
|
21
|
+
runId: string;
|
|
22
|
+
runtimeName: string;
|
|
23
|
+
selectedCapabilities: CapabilitySlice;
|
|
24
|
+
status: string;
|
|
25
|
+
toolCalls: Array<{
|
|
26
|
+
args: Record<string, unknown>;
|
|
27
|
+
callId?: string;
|
|
28
|
+
capabilityId: string;
|
|
29
|
+
toolName?: string;
|
|
30
|
+
}>;
|
|
31
|
+
toolResults: AicfRuntimeToolResultEnvelope[];
|
|
32
|
+
traceEvents: AicfRuntimeTraceEvent[];
|
|
33
|
+
usage?: unknown;
|
|
34
|
+
}
|
|
35
|
+
export interface AicfLiveEvalCaseRunInput<TProviderConfig = unknown> {
|
|
36
|
+
abortSignal?: AbortSignal;
|
|
37
|
+
caseId: string;
|
|
38
|
+
contextBuilder: AicfContextBuilder;
|
|
39
|
+
executor: AicfToolExecutor;
|
|
40
|
+
loadedEval: LoadedEvalCase;
|
|
41
|
+
providerConfig?: TProviderConfig;
|
|
42
|
+
registry: ManifestRegistry;
|
|
43
|
+
router: AicfCapabilityRouter;
|
|
44
|
+
runtimeContext: AicfRuntimeContext;
|
|
45
|
+
suiteId: string;
|
|
46
|
+
testCase: AicfLiveEvalCaseInput;
|
|
47
|
+
traceSink?: AicfTraceSink;
|
|
48
|
+
userInput: AicfRuntimeUserInput;
|
|
49
|
+
}
|
|
50
|
+
export interface AicfLiveEvalCaseRunResult {
|
|
51
|
+
providerId: AicfLiveEvalProviderId;
|
|
52
|
+
runResult: AicfNormalizedLiveEvalRunResult;
|
|
53
|
+
runtimeName: string;
|
|
54
|
+
}
|
|
55
|
+
export interface AicfLiveEvalRunner<TProviderConfig = unknown> {
|
|
56
|
+
readonly providerId: AicfLiveEvalProviderId;
|
|
57
|
+
readonly runtimeName: string;
|
|
58
|
+
runCase(input: AicfLiveEvalCaseRunInput<TProviderConfig>): Promise<AicfLiveEvalCaseRunResult>;
|
|
59
|
+
}
|
|
12
60
|
export interface AicfLiveEvalScorer {
|
|
13
61
|
name: string;
|
|
14
62
|
score(input: {
|
|
15
63
|
candidate: EvalCandidateResult;
|
|
16
|
-
runResult:
|
|
64
|
+
runResult: AicfNormalizedLiveEvalRunResult;
|
|
17
65
|
testCase: AicfLiveEvalCaseInput;
|
|
18
66
|
}): EvalScorerResult;
|
|
19
67
|
}
|
|
@@ -22,17 +70,22 @@ export interface AicfLiveEvalOptions {
|
|
|
22
70
|
contextBuilderFactory: (testCase: AicfLiveEvalCaseInput) => AicfContextBuilder;
|
|
23
71
|
executor: AicfToolExecutor;
|
|
24
72
|
maxConcurrency?: number;
|
|
25
|
-
model
|
|
26
|
-
openAIClient
|
|
73
|
+
model?: string;
|
|
74
|
+
openAIClient?: AicfOpenAIResponsesClient;
|
|
75
|
+
providerConfig?: unknown;
|
|
27
76
|
registry: ManifestRegistry;
|
|
77
|
+
runner?: AicfLiveEvalRunner;
|
|
28
78
|
router: AicfCapabilityRouter;
|
|
29
79
|
scorers?: AicfLiveEvalScorer[];
|
|
80
|
+
suiteId?: string;
|
|
30
81
|
traceSink?: AicfTraceSink;
|
|
31
82
|
}
|
|
32
83
|
export interface AicfLiveEvalResult {
|
|
33
84
|
candidate?: EvalCandidateResult;
|
|
34
85
|
evalId: string;
|
|
35
|
-
|
|
86
|
+
providerId?: AicfLiveEvalProviderId;
|
|
87
|
+
runResult?: AicfNormalizedLiveEvalRunResult;
|
|
88
|
+
runtimeName?: string;
|
|
36
89
|
scores: Array<{
|
|
37
90
|
message?: string;
|
|
38
91
|
passed: boolean;
|
|
@@ -55,6 +108,6 @@ export interface AicfEvalGateResult {
|
|
|
55
108
|
export interface CreateEvalCaseFromTraceInput {
|
|
56
109
|
includeModelOutput?: boolean;
|
|
57
110
|
reason: "user_feedback" | "policy_denial" | "approval_rejection" | "low_score" | "manual";
|
|
58
|
-
runResult:
|
|
111
|
+
runResult: AicfNormalizedLiveEvalRunResult;
|
|
59
112
|
}
|
|
60
113
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/evals-live/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/evals-live/types.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,7 +9,6 @@ export { loadManifests, kindFromPath } from "./loader.js";
|
|
|
9
9
|
export { buildMcpToolDescriptors, parseMcpToolCall, toMcpToolName } from "./mcp.js";
|
|
10
10
|
export { buildOpenAIResponsesTools, parseOpenAIResponsesToolCall, toOpenAIResponsesToolName } from "./openai-responses.js";
|
|
11
11
|
export { buildRegistry, formatInspection, inspectRegistry } from "./registry.js";
|
|
12
|
-
export { runCli } from "./cli.js";
|
|
13
12
|
export { buildSemanticKernelFunctions, parseSemanticKernelFunctionCall, toSemanticKernelFunctionName } from "./semantic-kernel.js";
|
|
14
13
|
export { approvalRequiredToolResult, deniedToolResult, errorToolResult, okToolResult, toModelFacingToolResult, unavailableToolResult } from "./tool-result.js";
|
|
15
14
|
export { validateCapabilityInvariants, validateManifests, validatePublicFixtures } from "./validator.js";
|