@zhivex-ai/core 1.10.0 → 1.12.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/README.md +10 -0
- package/dist/api-stability.d.ts.map +1 -1
- package/dist/api-stability.js +8 -0
- package/dist/api-stability.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/provider-conformance.d.ts +120 -0
- package/dist/provider-conformance.d.ts.map +1 -0
- package/dist/provider-conformance.js +505 -0
- package/dist/provider-conformance.js.map +1 -0
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
import { ValidationError } from "./errors.js";
|
|
2
|
+
import { createRedactionPolicy } from "./safety-policy.js";
|
|
3
|
+
export const PROVIDER_CONFORMANCE_REPORT_SCHEMA_VERSION = 1;
|
|
4
|
+
export const PROVIDER_CONFORMANCE_STATUSES = [
|
|
5
|
+
"implemented",
|
|
6
|
+
"offline_passed",
|
|
7
|
+
"installed_passed",
|
|
8
|
+
"live_passed",
|
|
9
|
+
"skipped_missing_credentials",
|
|
10
|
+
"failed",
|
|
11
|
+
"stale"
|
|
12
|
+
];
|
|
13
|
+
export const PROVIDER_CONFORMANCE_EVIDENCE_LEVELS = [
|
|
14
|
+
"declared",
|
|
15
|
+
"offline",
|
|
16
|
+
"installed",
|
|
17
|
+
"live"
|
|
18
|
+
];
|
|
19
|
+
const statusSet = new Set(PROVIDER_CONFORMANCE_STATUSES);
|
|
20
|
+
const evidenceSet = new Set(PROVIDER_CONFORMANCE_EVIDENCE_LEVELS);
|
|
21
|
+
const passingStatusByEvidence = {
|
|
22
|
+
declared: "implemented",
|
|
23
|
+
offline: "offline_passed",
|
|
24
|
+
installed: "installed_passed",
|
|
25
|
+
live: "live_passed"
|
|
26
|
+
};
|
|
27
|
+
const isRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
28
|
+
const requireRecord = (value, path) => {
|
|
29
|
+
if (!isRecord(value)) {
|
|
30
|
+
throw new ValidationError(`${path} must be an object.`);
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
};
|
|
34
|
+
const requireString = (value, path) => {
|
|
35
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
36
|
+
throw new ValidationError(`${path} must be a non-empty string.`);
|
|
37
|
+
}
|
|
38
|
+
return value.trim();
|
|
39
|
+
};
|
|
40
|
+
const optionalString = (value, path) => value === undefined ? undefined : requireString(value, path);
|
|
41
|
+
const requireLogicalEndpoint = (value, path) => {
|
|
42
|
+
const endpoint = requireString(value, path);
|
|
43
|
+
if (endpoint.includes("://") || endpoint.includes("@") || endpoint.includes("?") || endpoint.includes("#")) {
|
|
44
|
+
throw new ValidationError(`${path} must be a logical endpoint label, not a URL or tenant-bearing identifier.`);
|
|
45
|
+
}
|
|
46
|
+
return endpoint;
|
|
47
|
+
};
|
|
48
|
+
const requireBoolean = (value, path) => {
|
|
49
|
+
if (typeof value !== "boolean") {
|
|
50
|
+
throw new ValidationError(`${path} must be a boolean.`);
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
};
|
|
54
|
+
const requireNonNegativeInteger = (value, path) => {
|
|
55
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
56
|
+
throw new ValidationError(`${path} must be a non-negative safe integer.`);
|
|
57
|
+
}
|
|
58
|
+
return value;
|
|
59
|
+
};
|
|
60
|
+
const optionalNonNegativeNumber = (value, path) => {
|
|
61
|
+
if (value === undefined)
|
|
62
|
+
return undefined;
|
|
63
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
|
|
64
|
+
throw new ValidationError(`${path} must be a non-negative finite number.`);
|
|
65
|
+
}
|
|
66
|
+
return value;
|
|
67
|
+
};
|
|
68
|
+
const requireIsoDate = (value, path) => {
|
|
69
|
+
const input = requireString(value, path);
|
|
70
|
+
const timestamp = Date.parse(input);
|
|
71
|
+
if (!Number.isFinite(timestamp)) {
|
|
72
|
+
throw new ValidationError(`${path} must be an ISO-8601 timestamp.`);
|
|
73
|
+
}
|
|
74
|
+
return new Date(timestamp).toISOString();
|
|
75
|
+
};
|
|
76
|
+
const resolveNow = (value) => {
|
|
77
|
+
if (value instanceof Date) {
|
|
78
|
+
if (!Number.isFinite(value.getTime()))
|
|
79
|
+
throw new ValidationError("now must be a valid date.");
|
|
80
|
+
return value.getTime();
|
|
81
|
+
}
|
|
82
|
+
if (value !== undefined) {
|
|
83
|
+
const timestamp = Date.parse(value);
|
|
84
|
+
if (!Number.isFinite(timestamp))
|
|
85
|
+
throw new ValidationError("now must be a valid date.");
|
|
86
|
+
return timestamp;
|
|
87
|
+
}
|
|
88
|
+
return Date.now();
|
|
89
|
+
};
|
|
90
|
+
const normalizeStringArray = (value, path, redact) => {
|
|
91
|
+
if (value === undefined)
|
|
92
|
+
return undefined;
|
|
93
|
+
if (!Array.isArray(value))
|
|
94
|
+
throw new ValidationError(`${path} must be an array.`);
|
|
95
|
+
return value.map((entry, index) => redact(requireString(entry, `${path}[${index}]`)));
|
|
96
|
+
};
|
|
97
|
+
const normalizeMetadata = (value, path, redactJson) => {
|
|
98
|
+
if (value === undefined)
|
|
99
|
+
return undefined;
|
|
100
|
+
const record = requireRecord(value, path);
|
|
101
|
+
const seen = new WeakSet();
|
|
102
|
+
const isJsonValue = (input) => {
|
|
103
|
+
if (input === null || typeof input === "string" || typeof input === "boolean")
|
|
104
|
+
return true;
|
|
105
|
+
if (typeof input === "number")
|
|
106
|
+
return Number.isFinite(input);
|
|
107
|
+
if (!input || typeof input !== "object")
|
|
108
|
+
return false;
|
|
109
|
+
if (seen.has(input))
|
|
110
|
+
return false;
|
|
111
|
+
seen.add(input);
|
|
112
|
+
const valid = Array.isArray(input)
|
|
113
|
+
? input.every(isJsonValue)
|
|
114
|
+
: Object.getPrototypeOf(input) === Object.prototype && Object.values(input).every(isJsonValue);
|
|
115
|
+
seen.delete(input);
|
|
116
|
+
return valid;
|
|
117
|
+
};
|
|
118
|
+
if (!isJsonValue(record)) {
|
|
119
|
+
throw new ValidationError(`${path} must contain only JSON-compatible values.`);
|
|
120
|
+
}
|
|
121
|
+
return redactJson(structuredClone(record));
|
|
122
|
+
};
|
|
123
|
+
const normalizeArtifact = (value, path) => {
|
|
124
|
+
const record = requireRecord(value, path);
|
|
125
|
+
const kind = requireString(record.kind, `${path}.kind`);
|
|
126
|
+
if (kind !== "checkout" && kind !== "installed") {
|
|
127
|
+
throw new ValidationError(`${path}.kind must be checkout or installed.`);
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
kind,
|
|
131
|
+
packageName: requireString(record.packageName, `${path}.packageName`),
|
|
132
|
+
packageVersion: requireString(record.packageVersion, `${path}.packageVersion`),
|
|
133
|
+
integrity: optionalString(record.integrity, `${path}.integrity`)
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
const normalizeStatus = (value, path) => {
|
|
137
|
+
const status = requireString(value, path);
|
|
138
|
+
if (!statusSet.has(status)) {
|
|
139
|
+
throw new ValidationError(`${path} contains an unknown provider conformance status.`);
|
|
140
|
+
}
|
|
141
|
+
return status;
|
|
142
|
+
};
|
|
143
|
+
const normalizeEvidence = (value, path) => {
|
|
144
|
+
const evidence = requireString(value, path);
|
|
145
|
+
if (!evidenceSet.has(evidence)) {
|
|
146
|
+
throw new ValidationError(`${path} contains an unknown provider conformance evidence level.`);
|
|
147
|
+
}
|
|
148
|
+
return evidence;
|
|
149
|
+
};
|
|
150
|
+
const normalizeError = (value, path, redact) => {
|
|
151
|
+
if (value === undefined)
|
|
152
|
+
return undefined;
|
|
153
|
+
const record = requireRecord(value, path);
|
|
154
|
+
return {
|
|
155
|
+
code: redact(requireString(record.code, `${path}.code`)),
|
|
156
|
+
message: redact(requireString(record.message, `${path}.message`)),
|
|
157
|
+
retryable: requireBoolean(record.retryable, `${path}.retryable`)
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
const normalizeResult = (value, path, now, applyTtl, redaction) => {
|
|
161
|
+
const record = requireRecord(value, path);
|
|
162
|
+
const evidence = normalizeEvidence(record.evidence, `${path}.evidence`);
|
|
163
|
+
let status = normalizeStatus(record.status, `${path}.status`);
|
|
164
|
+
let observedStatus;
|
|
165
|
+
if (record.observedStatus !== undefined) {
|
|
166
|
+
const parsedObservedStatus = normalizeStatus(record.observedStatus, `${path}.observedStatus`);
|
|
167
|
+
if (parsedObservedStatus === "stale") {
|
|
168
|
+
throw new ValidationError(`${path}.observedStatus cannot itself be stale.`);
|
|
169
|
+
}
|
|
170
|
+
observedStatus = parsedObservedStatus;
|
|
171
|
+
}
|
|
172
|
+
const observedAt = requireIsoDate(record.observedAt, `${path}.observedAt`);
|
|
173
|
+
const expiresAt = requireIsoDate(record.expiresAt, `${path}.expiresAt`);
|
|
174
|
+
if (Date.parse(expiresAt) < Date.parse(observedAt)) {
|
|
175
|
+
throw new ValidationError(`${path}.expiresAt cannot precede observedAt.`);
|
|
176
|
+
}
|
|
177
|
+
if (status === "stale" && !observedStatus) {
|
|
178
|
+
throw new ValidationError(`${path}.observedStatus is required when status is stale.`);
|
|
179
|
+
}
|
|
180
|
+
if (status !== "stale" && observedStatus !== undefined) {
|
|
181
|
+
throw new ValidationError(`${path}.observedStatus is only allowed when status is stale.`);
|
|
182
|
+
}
|
|
183
|
+
if (applyTtl &&
|
|
184
|
+
status !== "failed" &&
|
|
185
|
+
status !== "skipped_missing_credentials" &&
|
|
186
|
+
status !== "stale" &&
|
|
187
|
+
Date.parse(expiresAt) <= now) {
|
|
188
|
+
observedStatus = status;
|
|
189
|
+
status = "stale";
|
|
190
|
+
}
|
|
191
|
+
if (status !== "failed" && record.error !== undefined) {
|
|
192
|
+
throw new ValidationError(`${path}.error is only allowed for failed results.`);
|
|
193
|
+
}
|
|
194
|
+
const error = normalizeError(record.error, `${path}.error`, redaction.redactText);
|
|
195
|
+
if (status === "failed" && !error) {
|
|
196
|
+
throw new ValidationError(`${path}.error is required for failed results.`);
|
|
197
|
+
}
|
|
198
|
+
const expectedPassingStatus = passingStatusByEvidence[evidence];
|
|
199
|
+
const effectiveStatus = status === "stale" ? observedStatus : status;
|
|
200
|
+
if (effectiveStatus !== undefined &&
|
|
201
|
+
status !== "failed" &&
|
|
202
|
+
status !== "skipped_missing_credentials" &&
|
|
203
|
+
effectiveStatus !== expectedPassingStatus) {
|
|
204
|
+
throw new ValidationError(`${path}.status is incompatible with its evidence level.`);
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
capability: requireString(record.capability, `${path}.capability`),
|
|
208
|
+
evidence,
|
|
209
|
+
status,
|
|
210
|
+
observedStatus,
|
|
211
|
+
required: requireBoolean(record.required, `${path}.required`),
|
|
212
|
+
modelId: requireString(record.modelId, `${path}.modelId`),
|
|
213
|
+
endpoint: requireLogicalEndpoint(record.endpoint, `${path}.endpoint`),
|
|
214
|
+
artifact: normalizeArtifact(record.artifact, `${path}.artifact`),
|
|
215
|
+
observedAt,
|
|
216
|
+
expiresAt,
|
|
217
|
+
attempts: requireNonNegativeInteger(record.attempts, `${path}.attempts`),
|
|
218
|
+
durationMs: optionalNonNegativeNumber(record.durationMs, `${path}.durationMs`),
|
|
219
|
+
error,
|
|
220
|
+
missingRequirements: normalizeStringArray(record.missingRequirements, `${path}.missingRequirements`, redaction.redactText),
|
|
221
|
+
metadata: normalizeMetadata(record.metadata, `${path}.metadata`, redaction.redactJson)
|
|
222
|
+
};
|
|
223
|
+
};
|
|
224
|
+
const resultKey = (provider, result) => [provider, result.capability, result.evidence, result.artifact.kind].join("\u0000");
|
|
225
|
+
export const normalizeProviderConformanceReport = (value, options = {}) => {
|
|
226
|
+
const record = requireRecord(value, "report");
|
|
227
|
+
if (record.schemaVersion !== PROVIDER_CONFORMANCE_REPORT_SCHEMA_VERSION) {
|
|
228
|
+
throw new ValidationError(`Unsupported provider conformance report schema version ${String(record.schemaVersion)}.`);
|
|
229
|
+
}
|
|
230
|
+
const redaction = createRedactionPolicy({
|
|
231
|
+
includeEmails: true,
|
|
232
|
+
...options.redaction,
|
|
233
|
+
rules: [
|
|
234
|
+
{
|
|
235
|
+
name: "provider-conformance-token",
|
|
236
|
+
pattern: /\b(?:sk|pk|rk|api|token)[-_][A-Za-z0-9._-]{16,}\b/gi
|
|
237
|
+
},
|
|
238
|
+
...(options.redaction?.rules ?? [])
|
|
239
|
+
]
|
|
240
|
+
});
|
|
241
|
+
const now = resolveNow(options.now);
|
|
242
|
+
const applyTtl = options.applyTtl ?? true;
|
|
243
|
+
const source = requireRecord(record.source, "report.source");
|
|
244
|
+
const ciInput = source.ci;
|
|
245
|
+
let ci;
|
|
246
|
+
if (ciInput !== undefined) {
|
|
247
|
+
const ciRecord = requireRecord(ciInput, "report.source.ci");
|
|
248
|
+
ci = {
|
|
249
|
+
system: requireString(ciRecord.system, "report.source.ci.system"),
|
|
250
|
+
runId: requireString(ciRecord.runId, "report.source.ci.runId"),
|
|
251
|
+
runAttempt: optionalString(ciRecord.runAttempt, "report.source.ci.runAttempt"),
|
|
252
|
+
workflow: optionalString(ciRecord.workflow, "report.source.ci.workflow")
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
if (!Array.isArray(record.providers)) {
|
|
256
|
+
throw new ValidationError("report.providers must be an array.");
|
|
257
|
+
}
|
|
258
|
+
const seenProviders = new Set();
|
|
259
|
+
const seenResults = new Set();
|
|
260
|
+
const providers = record.providers.map((providerValue, providerIndex) => {
|
|
261
|
+
const providerRecord = requireRecord(providerValue, `report.providers[${providerIndex}]`);
|
|
262
|
+
const provider = requireString(providerRecord.provider, `report.providers[${providerIndex}].provider`);
|
|
263
|
+
if (seenProviders.has(provider)) {
|
|
264
|
+
throw new ValidationError(`report.providers contains duplicate provider ${provider}.`);
|
|
265
|
+
}
|
|
266
|
+
seenProviders.add(provider);
|
|
267
|
+
if (!Array.isArray(providerRecord.results)) {
|
|
268
|
+
throw new ValidationError(`report.providers[${providerIndex}].results must be an array.`);
|
|
269
|
+
}
|
|
270
|
+
const results = providerRecord.results.map((result, resultIndex) => normalizeResult(result, `report.providers[${providerIndex}].results[${resultIndex}]`, now, applyTtl, redaction));
|
|
271
|
+
for (const result of results) {
|
|
272
|
+
const key = resultKey(provider, result);
|
|
273
|
+
if (seenResults.has(key)) {
|
|
274
|
+
throw new ValidationError(`report.providers contains duplicate evidence for ${provider}/${result.capability}/${result.evidence}/${result.artifact.kind}.`);
|
|
275
|
+
}
|
|
276
|
+
seenResults.add(key);
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
provider,
|
|
280
|
+
results: results.sort((left, right) => left.capability.localeCompare(right.capability) ||
|
|
281
|
+
left.evidence.localeCompare(right.evidence) ||
|
|
282
|
+
left.artifact.kind.localeCompare(right.artifact.kind))
|
|
283
|
+
};
|
|
284
|
+
});
|
|
285
|
+
const generatedAt = requireIsoDate(record.generatedAt, "report.generatedAt");
|
|
286
|
+
const expiresAt = requireIsoDate(record.expiresAt, "report.expiresAt");
|
|
287
|
+
if (Date.parse(expiresAt) < Date.parse(generatedAt)) {
|
|
288
|
+
throw new ValidationError("report.expiresAt cannot precede generatedAt.");
|
|
289
|
+
}
|
|
290
|
+
return {
|
|
291
|
+
schemaVersion: PROVIDER_CONFORMANCE_REPORT_SCHEMA_VERSION,
|
|
292
|
+
reportId: requireString(record.reportId, "report.reportId"),
|
|
293
|
+
generatedAt,
|
|
294
|
+
expiresAt,
|
|
295
|
+
generator: requireString(record.generator, "report.generator"),
|
|
296
|
+
source: {
|
|
297
|
+
repository: requireString(source.repository, "report.source.repository"),
|
|
298
|
+
gitSha: requireString(source.gitSha, "report.source.gitSha"),
|
|
299
|
+
runtime: requireString(source.runtime, "report.source.runtime"),
|
|
300
|
+
ci
|
|
301
|
+
},
|
|
302
|
+
providers: providers.sort((left, right) => left.provider.localeCompare(right.provider))
|
|
303
|
+
};
|
|
304
|
+
};
|
|
305
|
+
export const mergeProviderConformanceReports = (reports, options = {}) => {
|
|
306
|
+
if (reports.length === 0)
|
|
307
|
+
throw new ValidationError("At least one provider conformance report is required.");
|
|
308
|
+
const normalized = reports.map((report) => normalizeProviderConformanceReport(report, options));
|
|
309
|
+
const first = normalized[0];
|
|
310
|
+
for (const report of normalized.slice(1)) {
|
|
311
|
+
if (first.source.repository !== report.source.repository ||
|
|
312
|
+
first.source.gitSha !== report.source.gitSha) {
|
|
313
|
+
throw new ValidationError("Provider conformance reports must describe the same repository and git SHA.");
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
const providerResults = new Map();
|
|
317
|
+
for (const report of normalized) {
|
|
318
|
+
for (const provider of report.providers) {
|
|
319
|
+
const results = providerResults.get(provider.provider) ?? new Map();
|
|
320
|
+
for (const result of provider.results) {
|
|
321
|
+
results.set(resultKey(provider.provider, result), result);
|
|
322
|
+
}
|
|
323
|
+
providerResults.set(provider.provider, results);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
const generatedAt = normalized
|
|
327
|
+
.map((report) => report.generatedAt)
|
|
328
|
+
.sort()
|
|
329
|
+
.at(-1);
|
|
330
|
+
const expiresAt = normalized
|
|
331
|
+
.map((report) => report.expiresAt)
|
|
332
|
+
.sort()
|
|
333
|
+
.at(-1);
|
|
334
|
+
return normalizeProviderConformanceReport({
|
|
335
|
+
...first,
|
|
336
|
+
reportId: `${first.reportId}-merged`,
|
|
337
|
+
generatedAt,
|
|
338
|
+
expiresAt,
|
|
339
|
+
providers: [...providerResults.entries()].map(([provider, results]) => ({
|
|
340
|
+
provider,
|
|
341
|
+
results: [...results.values()]
|
|
342
|
+
}))
|
|
343
|
+
}, options);
|
|
344
|
+
};
|
|
345
|
+
export const compareProviderConformanceReports = (baselineInput, currentInput, options = {}) => {
|
|
346
|
+
const baseline = normalizeProviderConformanceReport(baselineInput, { ...options, applyTtl: false });
|
|
347
|
+
const current = normalizeProviderConformanceReport(currentInput, { ...options, applyTtl: true });
|
|
348
|
+
const currentResults = new Map();
|
|
349
|
+
for (const provider of current.providers) {
|
|
350
|
+
for (const result of provider.results)
|
|
351
|
+
currentResults.set(resultKey(provider.provider, result), result);
|
|
352
|
+
}
|
|
353
|
+
const regressions = [];
|
|
354
|
+
const changes = [];
|
|
355
|
+
for (const provider of baseline.providers) {
|
|
356
|
+
for (const baselineResult of provider.results) {
|
|
357
|
+
const currentResult = currentResults.get(resultKey(provider.provider, baselineResult));
|
|
358
|
+
const expectedStatus = passingStatusByEvidence[baselineResult.evidence];
|
|
359
|
+
if (!currentResult || currentResult.status !== expectedStatus) {
|
|
360
|
+
regressions.push({
|
|
361
|
+
provider: provider.provider,
|
|
362
|
+
capability: baselineResult.capability,
|
|
363
|
+
evidence: baselineResult.evidence,
|
|
364
|
+
artifactKind: baselineResult.artifact.kind,
|
|
365
|
+
baselineStatus: baselineResult.status,
|
|
366
|
+
currentStatus: currentResult?.status ?? "missing",
|
|
367
|
+
baselineModelId: baselineResult.modelId,
|
|
368
|
+
currentModelId: currentResult?.modelId
|
|
369
|
+
});
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
const fields = ["modelId", "endpoint"];
|
|
373
|
+
for (const field of fields) {
|
|
374
|
+
if (baselineResult[field] !== currentResult[field]) {
|
|
375
|
+
changes.push({
|
|
376
|
+
provider: provider.provider,
|
|
377
|
+
capability: baselineResult.capability,
|
|
378
|
+
evidence: baselineResult.evidence,
|
|
379
|
+
artifactKind: baselineResult.artifact.kind,
|
|
380
|
+
field,
|
|
381
|
+
baseline: baselineResult[field],
|
|
382
|
+
current: currentResult[field]
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
if (baselineResult.artifact.packageVersion !== currentResult.artifact.packageVersion) {
|
|
387
|
+
changes.push({
|
|
388
|
+
provider: provider.provider,
|
|
389
|
+
capability: baselineResult.capability,
|
|
390
|
+
evidence: baselineResult.evidence,
|
|
391
|
+
artifactKind: baselineResult.artifact.kind,
|
|
392
|
+
field: "packageVersion",
|
|
393
|
+
baseline: baselineResult.artifact.packageVersion,
|
|
394
|
+
current: currentResult.artifact.packageVersion
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
return { ok: regressions.length === 0, regressions, changes };
|
|
400
|
+
};
|
|
401
|
+
export const evaluateProviderConformanceGate = (reportInput, options = {}) => {
|
|
402
|
+
const report = normalizeProviderConformanceReport(reportInput, { now: options.now });
|
|
403
|
+
const requirements = [...(options.requirements ?? [])];
|
|
404
|
+
for (const provider of report.providers) {
|
|
405
|
+
for (const result of provider.results) {
|
|
406
|
+
if (result.required) {
|
|
407
|
+
requirements.push({
|
|
408
|
+
provider: provider.provider,
|
|
409
|
+
capability: result.capability,
|
|
410
|
+
evidence: result.evidence,
|
|
411
|
+
artifactKind: result.artifact.kind
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
const uniqueRequirements = new Map(requirements.map((requirement) => [
|
|
417
|
+
[requirement.provider, requirement.capability, requirement.evidence, requirement.artifactKind ?? "*"].join("\u0000"),
|
|
418
|
+
requirement
|
|
419
|
+
]));
|
|
420
|
+
const issues = [];
|
|
421
|
+
for (const requirement of uniqueRequirements.values()) {
|
|
422
|
+
const provider = report.providers.find((entry) => entry.provider === requirement.provider);
|
|
423
|
+
const result = provider?.results.find((entry) => entry.capability === requirement.capability &&
|
|
424
|
+
entry.evidence === requirement.evidence &&
|
|
425
|
+
(!requirement.artifactKind || entry.artifact.kind === requirement.artifactKind));
|
|
426
|
+
if (!result) {
|
|
427
|
+
issues.push({
|
|
428
|
+
code: "missing_required_result",
|
|
429
|
+
provider: requirement.provider,
|
|
430
|
+
capability: requirement.capability,
|
|
431
|
+
evidence: requirement.evidence,
|
|
432
|
+
message: `Missing required ${requirement.evidence} evidence for ${requirement.provider}/${requirement.capability}.`
|
|
433
|
+
});
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
if (result.status !== passingStatusByEvidence[requirement.evidence]) {
|
|
437
|
+
issues.push({
|
|
438
|
+
code: "required_result_not_passed",
|
|
439
|
+
provider: requirement.provider,
|
|
440
|
+
capability: requirement.capability,
|
|
441
|
+
evidence: requirement.evidence,
|
|
442
|
+
status: result.status,
|
|
443
|
+
message: `Required ${requirement.evidence} evidence for ${requirement.provider}/${requirement.capability} is ${result.status}.`
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
const comparison = options.baseline
|
|
448
|
+
? compareProviderConformanceReports(options.baseline, report, { now: options.now })
|
|
449
|
+
: undefined;
|
|
450
|
+
for (const regression of comparison?.regressions ?? []) {
|
|
451
|
+
issues.push({
|
|
452
|
+
code: "baseline_regression",
|
|
453
|
+
provider: regression.provider,
|
|
454
|
+
capability: regression.capability,
|
|
455
|
+
evidence: regression.evidence,
|
|
456
|
+
status: regression.currentStatus === "missing" ? undefined : regression.currentStatus,
|
|
457
|
+
message: `Baseline regression for ${regression.provider}/${regression.capability}/${regression.evidence}: ${regression.currentStatus}.`
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
return { ok: issues.length === 0, issues, comparison };
|
|
461
|
+
};
|
|
462
|
+
const escapeMarkdown = (value) => value.replaceAll("|", "\\|").replaceAll("\n", " ");
|
|
463
|
+
export const renderProviderConformanceMarkdown = (reportInput, options = {}) => {
|
|
464
|
+
const report = normalizeProviderConformanceReport(reportInput, { now: options.now });
|
|
465
|
+
const results = report.providers.flatMap((provider) => provider.results.map((result) => ({ provider: provider.provider, ...result })));
|
|
466
|
+
const statusCounts = new Map();
|
|
467
|
+
for (const result of results)
|
|
468
|
+
statusCounts.set(result.status, (statusCounts.get(result.status) ?? 0) + 1);
|
|
469
|
+
const lines = [
|
|
470
|
+
"# Zhivex AI SDK Provider Conformance Report",
|
|
471
|
+
"",
|
|
472
|
+
`- Schema: ${report.schemaVersion}`,
|
|
473
|
+
`- Report: ${escapeMarkdown(report.reportId)}`,
|
|
474
|
+
`- Generated: ${report.generatedAt}`,
|
|
475
|
+
`- Expires: ${report.expiresAt}`,
|
|
476
|
+
`- Git SHA: ${escapeMarkdown(report.source.gitSha)}`,
|
|
477
|
+
`- Results: ${results.length}`,
|
|
478
|
+
`- Live passed: ${statusCounts.get("live_passed") ?? 0}`,
|
|
479
|
+
`- Installed passed: ${statusCounts.get("installed_passed") ?? 0}`,
|
|
480
|
+
`- Skipped credentials: ${statusCounts.get("skipped_missing_credentials") ?? 0}`,
|
|
481
|
+
`- Failed: ${statusCounts.get("failed") ?? 0}`,
|
|
482
|
+
`- Stale: ${statusCounts.get("stale") ?? 0}`,
|
|
483
|
+
"",
|
|
484
|
+
"| Provider | Capability | Evidence | Status | Model | Endpoint | Artifact | Package | Observed | Expires | Required |",
|
|
485
|
+
"| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |"
|
|
486
|
+
];
|
|
487
|
+
for (const result of results) {
|
|
488
|
+
lines.push(`| ${[
|
|
489
|
+
result.provider,
|
|
490
|
+
result.capability,
|
|
491
|
+
result.evidence,
|
|
492
|
+
result.status,
|
|
493
|
+
result.modelId,
|
|
494
|
+
result.endpoint,
|
|
495
|
+
result.artifact.kind,
|
|
496
|
+
`${result.artifact.packageName}@${result.artifact.packageVersion}`,
|
|
497
|
+
result.observedAt,
|
|
498
|
+
result.expiresAt,
|
|
499
|
+
result.required ? "yes" : "no"
|
|
500
|
+
].map((value) => escapeMarkdown(String(value))).join(" | ")} |`);
|
|
501
|
+
}
|
|
502
|
+
lines.push("", "Skipped results are not certifications. Stale or failed required evidence fails closed.", "");
|
|
503
|
+
return lines.join("\n");
|
|
504
|
+
};
|
|
505
|
+
//# sourceMappingURL=provider-conformance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-conformance.js","sourceRoot":"","sources":["../src/provider-conformance.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -84,6 +84,10 @@ export interface ModelMessage {
|
|
|
84
84
|
parts: ContentPart[];
|
|
85
85
|
}
|
|
86
86
|
export interface ModelCapabilities {
|
|
87
|
+
/** Preserves complete callable tool history, including multiple results and error state.
|
|
88
|
+
* json adapters must honor ModelGenerateInput.toolResultFormat = "envelope".
|
|
89
|
+
*/
|
|
90
|
+
toolHistory?: "native" | "json";
|
|
87
91
|
streaming: boolean;
|
|
88
92
|
tools: boolean;
|
|
89
93
|
structuredOutput: boolean;
|
|
@@ -567,6 +571,10 @@ export type GenerateInputSource = {
|
|
|
567
571
|
export type ProviderOptions = Record<string, unknown>;
|
|
568
572
|
export interface ModelGenerateInput<TProviderOptions extends ProviderOptions = ProviderOptions> extends RetryOptions {
|
|
569
573
|
messages: ModelMessage[];
|
|
574
|
+
/** Opt-in discriminated JSON tool outputs: { output } on success, { error } on failure.
|
|
575
|
+
* Only use with models advertising toolHistory: "json"; legacy serialization is the default.
|
|
576
|
+
*/
|
|
577
|
+
toolResultFormat?: "raw" | "envelope";
|
|
570
578
|
tools?: ToolSet;
|
|
571
579
|
toolChoice?: ToolChoice;
|
|
572
580
|
toolExecution?: ToolExecutionOptions;
|