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.
Files changed (217) hide show
  1. package/CHANGELOG.md +97 -103
  2. package/CODE_OF_CONDUCT.md +11 -13
  3. package/CONTRIBUTING.md +40 -43
  4. package/GOVERNANCE.md +34 -35
  5. package/README.md +99 -63
  6. package/ROADMAP.md +12 -12
  7. package/SECURITY.md +15 -15
  8. package/dist/audit/ledger.d.ts.map +1 -1
  9. package/dist/audit/ledger.js +2 -1
  10. package/dist/audit/records.d.ts.map +1 -1
  11. package/dist/audit/records.js +2 -1
  12. package/dist/audit/types.d.ts +4 -1
  13. package/dist/audit/types.d.ts.map +1 -1
  14. package/dist/aws/dynamodb-stores.d.ts +2 -7
  15. package/dist/aws/dynamodb-stores.d.ts.map +1 -1
  16. package/dist/aws/dynamodb-stores.js +56 -5
  17. package/dist/aws/testing.d.ts.map +1 -1
  18. package/dist/aws/testing.js +9 -0
  19. package/dist/cli.d.ts +6 -6
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +77 -7
  22. package/dist/evals-live/index.d.ts +2 -2
  23. package/dist/evals-live/index.d.ts.map +1 -1
  24. package/dist/evals-live/index.js +1 -1
  25. package/dist/evals-live/live-eval-runner.d.ts +49 -1
  26. package/dist/evals-live/live-eval-runner.d.ts.map +1 -1
  27. package/dist/evals-live/live-eval-runner.js +246 -4
  28. package/dist/evals-live/types.d.ts +62 -9
  29. package/dist/evals-live/types.d.ts.map +1 -1
  30. package/dist/index.d.ts +0 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +0 -1
  33. package/dist/runtime/actions.d.ts +2 -0
  34. package/dist/runtime/actions.d.ts.map +1 -1
  35. package/dist/runtime/actions.js +200 -55
  36. package/dist/runtime/index.d.ts +1 -1
  37. package/dist/runtime/index.d.ts.map +1 -1
  38. package/dist/runtime/stores.d.ts +2 -7
  39. package/dist/runtime/stores.d.ts.map +1 -1
  40. package/dist/runtime/stores.js +12 -0
  41. package/dist/runtime/types.d.ts +25 -6
  42. package/dist/runtime/types.d.ts.map +1 -1
  43. package/docs/action-lifecycle.md +38 -32
  44. package/docs/adapter-roadmap.md +51 -49
  45. package/docs/adapters.md +14 -15
  46. package/docs/ai-sdk-runtime.md +36 -39
  47. package/docs/anthropic-runtime.md +29 -32
  48. package/docs/api/public-api-policy.md +59 -0
  49. package/docs/api.md +354 -371
  50. package/docs/architecture/current-state.md +28 -31
  51. package/docs/audit/index.md +29 -29
  52. package/docs/aws/cloudwatch-telemetry.md +5 -7
  53. package/docs/aws/dynamodb-single-table.md +8 -9
  54. package/docs/aws/kms-redaction.md +5 -6
  55. package/docs/aws/overview.md +5 -5
  56. package/docs/aws/production-reference.md +13 -14
  57. package/docs/aws/step-functions-approval.md +7 -9
  58. package/docs/aws-runtime.md +24 -25
  59. package/docs/capability-manifests.md +17 -21
  60. package/docs/control-plane/overview.md +2 -2
  61. package/docs/control-plane.md +24 -27
  62. package/docs/controls/index.md +19 -22
  63. package/docs/core/capability-manifests.md +4 -5
  64. package/docs/core/entity-manifests.md +5 -5
  65. package/docs/eval-runner.md +29 -31
  66. package/docs/evalops.md +13 -14
  67. package/docs/evals/golden-tests.md +4 -5
  68. package/docs/evals/overview.md +3 -3
  69. package/docs/evals/replay-and-trace-to-golden.md +19 -20
  70. package/docs/evals.md +19 -20
  71. package/docs/evidence.md +22 -23
  72. package/docs/gemini-runtime.md +31 -33
  73. package/docs/getting-started/anthropic-quickstart.md +61 -0
  74. package/docs/getting-started/concepts.md +9 -10
  75. package/docs/getting-started/gemini-quickstart.md +62 -0
  76. package/docs/getting-started/installation.md +3 -3
  77. package/docs/getting-started/openai-quickstart.md +61 -0
  78. package/docs/getting-started/provider-neutral-quickstart.md +106 -0
  79. package/docs/getting-started/quickstart.md +2 -2
  80. package/docs/getting-started.md +23 -20
  81. package/docs/glossary.md +31 -48
  82. package/docs/governance/gate.md +28 -30
  83. package/docs/governance/impact-and-compatibility.md +2 -3
  84. package/docs/governance/index.md +53 -54
  85. package/docs/governance/lifecycle.md +4 -5
  86. package/docs/governance/overview.md +2 -3
  87. package/docs/governance/risk-compiler.md +4 -5
  88. package/docs/host-responsibilities.md +6 -8
  89. package/docs/implementation-notes/baseline-gaps.md +15 -18
  90. package/docs/index.md +21 -6
  91. package/docs/interoperability.md +9 -9
  92. package/docs/langchain-runtime.md +27 -31
  93. package/docs/live-evals.md +68 -32
  94. package/docs/mcp-server-runtime.md +36 -40
  95. package/docs/memory.md +35 -36
  96. package/docs/migration-0.1-to-1.0.md +14 -9
  97. package/docs/observability/overview.md +2 -3
  98. package/docs/observability-runtime.md +35 -39
  99. package/docs/openai-responses.md +36 -37
  100. package/docs/openai-runtime.md +41 -46
  101. package/docs/openai-walkthrough.md +24 -28
  102. package/docs/policy-broker.md +9 -10
  103. package/docs/provenance.md +30 -29
  104. package/docs/providers/anthropic.md +5 -5
  105. package/docs/providers/choose-a-runtime.md +37 -0
  106. package/docs/providers/conformance.md +14 -15
  107. package/docs/providers/gemini.md +5 -5
  108. package/docs/providers/mcp.md +2 -3
  109. package/docs/providers/openai.md +2 -2
  110. package/docs/providers/semantic-kernel.md +2 -2
  111. package/docs/providers.md +43 -38
  112. package/docs/public/license-exceptions.md +187 -0
  113. package/docs/public/npm-release-preflight.md +112 -0
  114. package/docs/public-framework/compatibility-policy.md +12 -13
  115. package/docs/public-framework/deprecation-policy.md +8 -8
  116. package/docs/public-framework/final-certification-matrix.md +104 -0
  117. package/docs/public-framework/license-decision.md +20 -0
  118. package/docs/public-framework/release-process.md +46 -16
  119. package/docs/public-framework/security-disclosure.md +4 -5
  120. package/docs/public-framework/v1-certification.md +102 -15
  121. package/docs/release.md +200 -122
  122. package/docs/runtime/action-lifecycle.md +3 -3
  123. package/docs/runtime/policy-broker.md +4 -4
  124. package/docs/runtime/runtime-overview.md +4 -5
  125. package/docs/runtime/tool-result-envelope.md +7 -7
  126. package/docs/runtime.md +90 -93
  127. package/docs/security/overview.md +4 -4
  128. package/docs/security/security-packs.md +24 -26
  129. package/docs/security/trust-taint-redaction.md +42 -47
  130. package/docs/semantic-kernel-runtime.md +35 -37
  131. package/docs/spec.md +95 -101
  132. package/docs/start-here.md +18 -20
  133. package/examples/01-basic-read-capability/README.md +3 -4
  134. package/examples/02-prepare-approve-commit/README.md +6 -6
  135. package/examples/03-multi-provider-tools/README.md +2 -2
  136. package/examples/04-mcp-server/README.md +4 -5
  137. package/examples/05-langchain-langgraph-bridge/README.md +4 -5
  138. package/examples/06-vercel-ai-sdk-bridge/README.md +5 -7
  139. package/examples/07-policy-broker-custom-auth/README.md +4 -4
  140. package/examples/08-aws-step-functions-approval/README.md +4 -5
  141. package/examples/09-security-packs-promptfoo/README.md +4 -4
  142. package/examples/10-trace-to-golden/README.md +2 -2
  143. package/examples/11-control-plane/README.md +4 -5
  144. package/examples/aws/README.md +5 -8
  145. package/examples/control-plane/README.md +8 -9
  146. package/examples/control-plane/fixtures/control-plane.seed.json +8 -32
  147. package/examples/control-plane/public/app.js +57 -18
  148. package/examples/control-plane/public/index.html +15 -6
  149. package/examples/control-plane/server.mjs +15 -3
  150. package/examples/eval-results/public.results.passing.json +6 -21
  151. package/examples/providers/ai-sdk-next/README.md +11 -8
  152. package/examples/providers/anthropic-claude/README.md +5 -6
  153. package/examples/providers/gemini/README.md +6 -6
  154. package/examples/providers/langchain-agent/README.md +3 -4
  155. package/examples/providers/langgraph-tool-node/README.md +7 -7
  156. package/examples/providers/mcp/README.md +8 -8
  157. package/examples/providers/provider-conformance/README.md +3 -3
  158. package/examples/providers/semantic-kernel-mcp/README.md +6 -6
  159. package/examples/providers/semantic-kernel-openapi/README.md +6 -7
  160. package/examples/runtime-support-billing/README.md +8 -9
  161. package/examples/runtime-support-billing/support-billing-runtime.mjs +8 -4
  162. package/examples/scheduling/capabilities/scheduling.availability.get.yaml +2 -2
  163. package/examples/scheduling/capabilities/scheduling.invite.prepare.yaml +2 -2
  164. package/examples/scheduling/capabilities/scheduling.invite.send.yaml +2 -2
  165. package/examples/scheduling/entities/AvailabilitySlot.yaml +2 -2
  166. package/examples/scheduling/entities/MeetingInvite.yaml +2 -2
  167. package/examples/scheduling/evals/scheduling.invite.prepare.valid.yaml +3 -1
  168. package/examples/semantic-kernel-mcp/README.md +11 -12
  169. package/examples/semantic-kernel-openapi/README.md +8 -8
  170. package/examples/support/capabilities/support.refund.commit_case.yaml +3 -3
  171. package/examples/support/capabilities/support.refund.prepare_case.yaml +2 -2
  172. package/examples/support/capabilities/support.ticket.get.yaml +2 -2
  173. package/examples/support/entities/Ticket.yaml +0 -1
  174. package/examples/support/eval-results/support.results.passing.json +3 -12
  175. package/examples/support/evals/support.refund.prepare_case.approval_required.yaml +3 -1
  176. package/examples/support/evals/support.refund.prepare_case.valid.yaml +3 -2
  177. package/examples/support/memory/support.agent.preferences.json +2 -6
  178. package/examples/support/openai/context.support_agent.json +1 -4
  179. package/examples/support/provenance/support.refund.summary.provenance.json +2 -6
  180. package/examples/support/replay/support.refund.approval_required.trace.json +4 -14
  181. package/package.json +22 -5
  182. package/schemas/audit/action-record.schema.json +4 -1
  183. package/schemas/aws/approval-task.schema.json +8 -1
  184. package/schemas/conformance/conformance-case.schema.json +18 -2
  185. package/schemas/conformance/conformance-report.schema.json +17 -2
  186. package/schemas/conformance/provider-target-matrix.schema.json +35 -4
  187. package/schemas/controls/control-decision.schema.json +7 -1
  188. package/schemas/eval-case.schema.json +8 -1
  189. package/schemas/eval-result.schema.json +8 -1
  190. package/schemas/evidence/evidence-pack.schema.json +34 -5
  191. package/schemas/governance/compatibility-diff.schema.json +8 -1
  192. package/schemas/governance/lifecycle-transition.schema.json +10 -1
  193. package/schemas/governance/risk-compilation-result.schema.json +9 -1
  194. package/schemas/provenance/generated-content-provenance.schema.json +3 -1
  195. package/schemas/replay/replay-result.schema.json +16 -2
  196. package/schemas/replay/replay-trace.schema.json +11 -2
  197. package/schemas/security/context-segment.schema.json +21 -12
  198. package/schemas/security/redaction-policy.schema.json +4 -1
  199. package/schemas/security-packs/coverage-report.schema.json +17 -2
  200. package/schemas/security-packs/security-case-suite.schema.json +11 -1
  201. package/schemas/tool-result-envelope.schema.json +9 -1
  202. package/security-packs/approval_bypass.yaml +12 -2
  203. package/security-packs/capability_spoofing.yaml +17 -3
  204. package/security-packs/cost_amplification.yaml +21 -4
  205. package/security-packs/cross_tenant_access.yaml +16 -3
  206. package/security-packs/insecure_output_rendering.yaml +15 -4
  207. package/security-packs/mcp_tool_abuse.yaml +17 -3
  208. package/security-packs/memory_scope_violation.yaml +19 -4
  209. package/security-packs/prompt_injection_direct.yaml +19 -4
  210. package/security-packs/prompt_injection_indirect.yaml +18 -3
  211. package/security-packs/provider_payload_exposure.yaml +26 -4
  212. package/security-packs/retrieval_poisoning.yaml +5 -2
  213. package/security-packs/schema_confusion.yaml +17 -3
  214. package/security-packs/sensitive_data_disclosure.yaml +22 -5
  215. package/security-packs/tool_exfiltration.yaml +20 -4
  216. package/security-packs/tool_result_poisoning.yaml +19 -4
  217. 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 (!process.env.OPENAI_API_KEY) {
215
- stderr.write("OPENAI_API_KEY is required for eval-live. Use the TypeScript API with a mock client for API-key-free tests.\n");
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
- lines.push(`- ${result.status}: ${result.evalId}`);
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"}
@@ -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":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,QAAQ,EACR,gBAAgB,EAEjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAElB,mBAAmB,EACnB,kBAAkB,EAClB,4BAA4B,EAC7B,MAAM,YAAY,CAAC;AAEpB,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAiF/B;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,kBAAkB,EAAE,EAC7B,IAAI,GAAE,YAAiB,GACtB,kBAAkB,CAsCpB;AAED,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,MAAM,EACd,SAAS,EAAE;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;YAAE,YAAY,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3E,WAAW,EAAE,KAAK,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE;YAAE,MAAM,EAAE,SAAS,GAAG,mBAAmB,GAAG,QAAQ,CAAA;SAAE,CAAC;QAChE,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ,GACA,mBAAmB,CAoBrB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,4BAA4B,GAAG,QAAQ,CAsBrF;AAED,wBAAgB,0BAA0B,IAAI;IAC5C,IAAI,EAAE,yBAAyB,CAAC;IAChC,KAAK,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,OAAO,EAAE,CAAA;SAAE,CAAA;KAAE,GAAG,gBAAgB,CAAC;CAC9F,CAoBA"}
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 runResult = await runOpenAIResponses({
33
- client: options.openAIClient,
38
+ const providerResult = await runner.runCase({
39
+ caseId: testCase.evalId,
34
40
  contextBuilder: options.contextBuilderFactory(testCase),
35
41
  executor: options.executor,
36
- model: options.model,
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, AicfOpenAIRunResult } from "../openai/index.js";
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: AicfOpenAIRunResult;
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: string;
26
- openAIClient: AicfOpenAIResponsesClient;
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
- runResult?: AicfOpenAIRunResult;
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: AicfOpenAIRunResult;
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,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChC,mBAAmB,CAAC,EAAE,eAAe,EAAE,CAAC;IACxC,cAAc,EAAE,kBAAkB,CAAC;IACnC,SAAS,EAAE,oBAAoB,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,KAAK,EAAE;QACX,SAAS,EAAE,mBAAmB,CAAC;QAC/B,SAAS,EAAE,mBAAmB,CAAC;QAC/B,QAAQ,EAAE,qBAAqB,CAAC;KACjC,GAAG,gBAAgB,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,qBAAqB,EAAE,CAAC,QAAQ,EAAE,qBAAqB,KAAK,kBAAkB,CAAC;IAC/E,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,yBAAyB,CAAC;IACxC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,MAAM,EAAE,KAAK,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,4BAA4B;IAC3C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,MAAM,EAAE,eAAe,GAAG,eAAe,GAAG,oBAAoB,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC1F,SAAS,EAAE,mBAAmB,CAAC;CAChC"}
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";