@dbx-tools/model 0.9.31 → 0.9.36
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 +3 -3
- package/exports.ts +1 -0
- package/index.ts +12 -8
- package/lib/index.d.ts +12 -8
- package/lib/index.js +8 -5
- package/lib/scripts/generate-metadata.d.ts +1 -0
- package/lib/scripts/generate-metadata.js +65 -0
- package/lib/src/_metadata-contract.d.ts +12 -6
- package/lib/src/_metadata-contract.js +3 -1
- package/lib/src/_metadata-generator.d.ts +3 -1
- package/lib/src/_metadata-generator.js +148 -1
- package/lib/src/_ranking.js +39 -12
- package/lib/src/_selection.d.ts +1 -17
- package/lib/src/_selection.js +1 -1
- package/lib/src/classify.d.ts +1 -17
- package/lib/src/classify.js +1 -1
- package/lib/src/generated/model-reasoning.json +147 -0
- package/lib/src/invoke.d.ts +8 -0
- package/lib/src/invoke.js +13 -1
- package/lib/src/metadata-cache.d.ts +84 -0
- package/lib/src/metadata-cache.js +226 -0
- package/lib/src/metadata.d.ts +52 -17
- package/lib/src/metadata.js +251 -18
- package/lib/src/model-catalog.d.ts +1 -19
- package/lib/src/model-catalog.js +9 -2
- package/lib/src/model-client.d.ts +11 -19
- package/lib/src/model-client.js +42 -24
- package/lib/src/reasoning-translation.d.ts +105 -0
- package/lib/src/reasoning-translation.js +444 -0
- package/lib/src/resolve.d.ts +2 -4
- package/lib/src/resolve.js +2 -2
- package/lib/src/serving-wire.d.ts +37 -0
- package/lib/src/serving-wire.js +211 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +110 -17
- package/src/_metadata-contract.ts +17 -7
- package/src/_metadata-generator.ts +160 -0
- package/src/_ranking.ts +40 -11
- package/src/_selection.ts +4 -19
- package/src/classify.ts +2 -18
- package/src/generated/model-reasoning.json +147 -0
- package/src/invoke.ts +16 -0
- package/src/metadata-cache.ts +307 -0
- package/src/metadata.ts +334 -43
- package/src/model-catalog.ts +8 -25
- package/src/model-client.ts +67 -44
- package/src/reasoning-translation.ts +495 -0
- package/src/resolve.ts +10 -11
- package/src/serving-wire.ts +231 -0
- package/lib/src/python.d.ts +0 -2
- package/lib/src/python.js +0 -3
- package/src/python.ts +0 -2
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic reasoning-budget translation for Model Serving and gateway callers.
|
|
3
|
+
*
|
|
4
|
+
* Provider wires disagree on effort labels (`xhigh`, `ultra`, `med`, `none`, …).
|
|
5
|
+
* This module owns one industry-shaped ladder and two parsers:
|
|
6
|
+
*
|
|
7
|
+
* - {@link parseReasoning}: fuzzy-match one label onto {@link ReasoningLevel}
|
|
8
|
+
* - {@link parseReasoningLevels}: unwrap nested / double-encoded error bodies
|
|
9
|
+
* - {@link remapReasoning} / {@link adaptRequestReasoning}: map a request onto a
|
|
10
|
+
* supported ladder and rewrite `reasoning_effort` / `reasoning.effort`
|
|
11
|
+
*
|
|
12
|
+
* Documented model ladders come from the committed HTML snapshot refreshed by
|
|
13
|
+
* `bun run --filter '@dbx-tools/model' metadata` (same cache path as
|
|
14
|
+
* capabilities / rate limits). Error-body parsing is never cached; callers
|
|
15
|
+
* persist learned ladders via the metadata module.
|
|
16
|
+
*
|
|
17
|
+
* Error bodies arrive as complete HTTP JSON whether the request asked for
|
|
18
|
+
* streaming or not (Databricks rejects unsupported efforts with 400 before SSE
|
|
19
|
+
* starts), so {@link parseReasoningLevels} applies to both paths.
|
|
20
|
+
*
|
|
21
|
+
* @module
|
|
22
|
+
*/
|
|
23
|
+
import { json } from "@dbx-tools/shared-core";
|
|
24
|
+
import { isRecord } from "@dbx-tools/shared-core/object";
|
|
25
|
+
import * as stringUtils from "@dbx-tools/shared-core/string-utils";
|
|
26
|
+
import Fuse from "fuse.js";
|
|
27
|
+
import { modelFamily, modelSearchQuery } from "./policy.js";
|
|
28
|
+
/** Runtime values for {@link ReasoningLevel}. */
|
|
29
|
+
export const ReasoningLevel = {
|
|
30
|
+
Low: "low",
|
|
31
|
+
Medium: "medium",
|
|
32
|
+
High: "high",
|
|
33
|
+
ExtraHigh: "extra-high",
|
|
34
|
+
Max: "max",
|
|
35
|
+
};
|
|
36
|
+
/** Canonical ladder order used when sorting or ranking remaps. */
|
|
37
|
+
export const REASONING_LEVELS = [
|
|
38
|
+
ReasoningLevel.Low,
|
|
39
|
+
ReasoningLevel.Medium,
|
|
40
|
+
ReasoningLevel.High,
|
|
41
|
+
ReasoningLevel.ExtraHigh,
|
|
42
|
+
ReasoningLevel.Max,
|
|
43
|
+
];
|
|
44
|
+
const STANDARD = [
|
|
45
|
+
ReasoningLevel.Low,
|
|
46
|
+
ReasoningLevel.Medium,
|
|
47
|
+
ReasoningLevel.High,
|
|
48
|
+
];
|
|
49
|
+
const WITH_EXTRA_HIGH = [
|
|
50
|
+
ReasoningLevel.Low,
|
|
51
|
+
ReasoningLevel.Medium,
|
|
52
|
+
ReasoningLevel.High,
|
|
53
|
+
ReasoningLevel.ExtraHigh,
|
|
54
|
+
];
|
|
55
|
+
const WITH_MAX = [
|
|
56
|
+
ReasoningLevel.Low,
|
|
57
|
+
ReasoningLevel.Medium,
|
|
58
|
+
ReasoningLevel.High,
|
|
59
|
+
ReasoningLevel.ExtraHigh,
|
|
60
|
+
ReasoningLevel.Max,
|
|
61
|
+
];
|
|
62
|
+
const GPT_5_5_PRO = [
|
|
63
|
+
ReasoningLevel.Medium,
|
|
64
|
+
ReasoningLevel.High,
|
|
65
|
+
ReasoningLevel.ExtraHigh,
|
|
66
|
+
];
|
|
67
|
+
/**
|
|
68
|
+
* Alias table for exact / near-exact labels. Keys are {@link normalizeReasoningToken}
|
|
69
|
+
* results. Provider wires (`xhigh`) and plain English (`ultra`, `med`) both land
|
|
70
|
+
* on the generic ladder.
|
|
71
|
+
*/
|
|
72
|
+
const ALIASES = {
|
|
73
|
+
low: ReasoningLevel.Low,
|
|
74
|
+
l: ReasoningLevel.Low,
|
|
75
|
+
none: ReasoningLevel.Low,
|
|
76
|
+
off: ReasoningLevel.Low,
|
|
77
|
+
disable: ReasoningLevel.Low,
|
|
78
|
+
disabled: ReasoningLevel.Low,
|
|
79
|
+
zero: ReasoningLevel.Low,
|
|
80
|
+
minimal: ReasoningLevel.Low,
|
|
81
|
+
min: ReasoningLevel.Low,
|
|
82
|
+
tiny: ReasoningLevel.Low,
|
|
83
|
+
light: ReasoningLevel.Low,
|
|
84
|
+
medium: ReasoningLevel.Medium,
|
|
85
|
+
med: ReasoningLevel.Medium,
|
|
86
|
+
mid: ReasoningLevel.Medium,
|
|
87
|
+
moderate: ReasoningLevel.Medium,
|
|
88
|
+
default: ReasoningLevel.Medium,
|
|
89
|
+
normal: ReasoningLevel.Medium,
|
|
90
|
+
balanced: ReasoningLevel.Medium,
|
|
91
|
+
high: ReasoningLevel.High,
|
|
92
|
+
hi: ReasoningLevel.High,
|
|
93
|
+
heavy: ReasoningLevel.High,
|
|
94
|
+
"extra-high": ReasoningLevel.ExtraHigh,
|
|
95
|
+
extrahigh: ReasoningLevel.ExtraHigh,
|
|
96
|
+
xhigh: ReasoningLevel.ExtraHigh,
|
|
97
|
+
xh: ReasoningLevel.ExtraHigh,
|
|
98
|
+
ultra: ReasoningLevel.ExtraHigh,
|
|
99
|
+
"ultra-high": ReasoningLevel.ExtraHigh,
|
|
100
|
+
ultrahigh: ReasoningLevel.ExtraHigh,
|
|
101
|
+
max: ReasoningLevel.Max,
|
|
102
|
+
maximum: ReasoningLevel.Max,
|
|
103
|
+
highest: ReasoningLevel.Max,
|
|
104
|
+
full: ReasoningLevel.Max,
|
|
105
|
+
};
|
|
106
|
+
const SUPPORTED_VALUES_PATTERN = /supported\s+values?\s+are\s*:?\s*(.+?)(?:\.?\s*(?:param|type|code)\b|$)/is;
|
|
107
|
+
const TOKEN_PATTERN = /'([^']+)'|"([^"]+)"|`([^`]+)`|\b([a-z][a-z0-9_-]*)\b/gi;
|
|
108
|
+
const MAX_JSON_UNWRAP_DEPTH = 8;
|
|
109
|
+
const aliasDocuments = Object.entries(ALIASES).map(([token, level]) => ({ token, level }));
|
|
110
|
+
const aliasFuse = new Fuse(aliasDocuments, {
|
|
111
|
+
keys: ["token"],
|
|
112
|
+
includeScore: true,
|
|
113
|
+
threshold: 0.35,
|
|
114
|
+
ignoreLocation: true,
|
|
115
|
+
});
|
|
116
|
+
/**
|
|
117
|
+
* Fuzzy-match one reasoning label onto {@link ReasoningLevel}.
|
|
118
|
+
*
|
|
119
|
+
* Returns `undefined` when the input is empty or cannot be mapped confidently.
|
|
120
|
+
*/
|
|
121
|
+
export function parseReasoning(value) {
|
|
122
|
+
if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
const normalized = normalizeReasoningToken(String(value));
|
|
126
|
+
if (!normalized)
|
|
127
|
+
return undefined;
|
|
128
|
+
const exact = ALIASES[normalized] ?? ALIASES[normalized.replace(/-/g, "")];
|
|
129
|
+
if (exact)
|
|
130
|
+
return exact;
|
|
131
|
+
const [match] = aliasFuse.search(normalized);
|
|
132
|
+
if (!match || (match.score ?? 1) > 0.35)
|
|
133
|
+
return undefined;
|
|
134
|
+
return match.item.level;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Extract supported reasoning levels from an upstream error body.
|
|
138
|
+
*
|
|
139
|
+
* Accepts raw response text, already-parsed JSON, or Databricks envelopes that
|
|
140
|
+
* nest JSON strings several times. Returns `[]` when no supported-values list
|
|
141
|
+
* can be recovered. Results are not cached.
|
|
142
|
+
*/
|
|
143
|
+
export function parseReasoningLevels(body) {
|
|
144
|
+
const levels = [];
|
|
145
|
+
const seen = new Set();
|
|
146
|
+
for (const text of collectTextLeaves(body)) {
|
|
147
|
+
for (const token of extractSupportedTokens(text)) {
|
|
148
|
+
const level = parseReasoning(token);
|
|
149
|
+
if (!level || seen.has(level))
|
|
150
|
+
continue;
|
|
151
|
+
seen.add(level);
|
|
152
|
+
levels.push(level);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return levels;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Look up documented levels for a model identity inside a catalogue.
|
|
159
|
+
*
|
|
160
|
+
* Matches exact catalogue keys and suffix identities.
|
|
161
|
+
*/
|
|
162
|
+
export function documentedReasoningLevels(model, catalogue) {
|
|
163
|
+
const keys = catalogueKeysFor(model);
|
|
164
|
+
for (const key of keys) {
|
|
165
|
+
const levels = catalogue[key];
|
|
166
|
+
if (levels?.length)
|
|
167
|
+
return [...levels];
|
|
168
|
+
}
|
|
169
|
+
for (const [key, levels] of Object.entries(catalogue)) {
|
|
170
|
+
if (keys.some((candidate) => key.endsWith(candidate) || candidate.endsWith(key))) {
|
|
171
|
+
return [...levels];
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Hard-coded family defaults used when documentation has no entry.
|
|
178
|
+
*
|
|
179
|
+
* Unknown families return the standard low/medium/high ladder.
|
|
180
|
+
*/
|
|
181
|
+
export function defaultReasoningLevels(model) {
|
|
182
|
+
const family = modelFamily(model)?.toLowerCase();
|
|
183
|
+
const normalized = model.toLowerCase();
|
|
184
|
+
if (family === "grok" || normalized.includes("grok"))
|
|
185
|
+
return [...WITH_EXTRA_HIGH];
|
|
186
|
+
if (family === "gemini" || normalized.includes("gemini"))
|
|
187
|
+
return [...STANDARD];
|
|
188
|
+
if (family === "claude" || normalized.includes("claude"))
|
|
189
|
+
return [...WITH_MAX];
|
|
190
|
+
if (family === "glm" || normalized.includes("glm")) {
|
|
191
|
+
return [ReasoningLevel.High, ReasoningLevel.Max];
|
|
192
|
+
}
|
|
193
|
+
if (family === "deepseek" ||
|
|
194
|
+
normalized.includes("deepseek") ||
|
|
195
|
+
family === "kimi" ||
|
|
196
|
+
normalized.includes("kimi")) {
|
|
197
|
+
return [ReasoningLevel.Low, ReasoningLevel.High, ReasoningLevel.Max];
|
|
198
|
+
}
|
|
199
|
+
if (family === "inkling" || normalized.includes("inkling"))
|
|
200
|
+
return [...WITH_MAX];
|
|
201
|
+
if (family === "gpt" || normalized.includes("gpt") || normalized.includes("codex")) {
|
|
202
|
+
if (normalized.includes("oss"))
|
|
203
|
+
return [...STANDARD];
|
|
204
|
+
if (/(?:^|[-_.])5[-_.]?5(?:[-_.]|$)/.test(normalized) && normalized.includes("pro")) {
|
|
205
|
+
return [...GPT_5_5_PRO];
|
|
206
|
+
}
|
|
207
|
+
if (/(?:^|[-_.])5[-_.]?6(?:[-_.]|$)/.test(normalized) ||
|
|
208
|
+
/(?:^|[-_.])6(?:[-_.]|$)/.test(normalized)) {
|
|
209
|
+
return [...WITH_MAX];
|
|
210
|
+
}
|
|
211
|
+
return [...STANDARD];
|
|
212
|
+
}
|
|
213
|
+
if (/(?:^|[-_./])o(?:1|3|4)(?:[-_./]|$)/.test(model) || normalized.includes("codex")) {
|
|
214
|
+
return [...STANDARD];
|
|
215
|
+
}
|
|
216
|
+
return [...STANDARD];
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Prefer a documentation catalogue when provided, otherwise
|
|
220
|
+
* {@link defaultReasoningLevels}.
|
|
221
|
+
*/
|
|
222
|
+
export function reasoningLevelsFor(model, catalogue) {
|
|
223
|
+
if (catalogue) {
|
|
224
|
+
const documented = documentedReasoningLevels(model, catalogue);
|
|
225
|
+
if (documented?.length)
|
|
226
|
+
return documented;
|
|
227
|
+
}
|
|
228
|
+
return defaultReasoningLevels(model);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Map a generic level onto the most common provider wire token.
|
|
232
|
+
*
|
|
233
|
+
* `extra-high` becomes `xhigh` because that is what Databricks / OpenAI error
|
|
234
|
+
* messages advertise today.
|
|
235
|
+
*/
|
|
236
|
+
export function formatReasoning(level) {
|
|
237
|
+
return level === ReasoningLevel.ExtraHigh ? "xhigh" : level;
|
|
238
|
+
}
|
|
239
|
+
/** Wire tokens that mean "do not reason" rather than "use a low budget". */
|
|
240
|
+
const DISABLED_REASONING_TOKENS = new Set(["none", "off", "disable", "disabled"]);
|
|
241
|
+
/**
|
|
242
|
+
* Remap a requested effort onto the nearest supported {@link ReasoningLevel}.
|
|
243
|
+
*
|
|
244
|
+
* `none` / `off` (and disable aliases) are not a low budget: when the model
|
|
245
|
+
* requires reasoning, they snap to the supported level closest to
|
|
246
|
+
* {@link ReasoningLevel.Medium}. Other requests prefer the highest allowed
|
|
247
|
+
* level at or below the request, otherwise the lowest allowed level.
|
|
248
|
+
*
|
|
249
|
+
* Returns `undefined` when the request cannot be parsed or `levels` is empty.
|
|
250
|
+
*/
|
|
251
|
+
export function remapReasoning(requested, levels) {
|
|
252
|
+
if (levels.length === 0)
|
|
253
|
+
return undefined;
|
|
254
|
+
if (isDisabledReasoningToken(requested)) {
|
|
255
|
+
return nearestReasoning(ReasoningLevel.Medium, levels);
|
|
256
|
+
}
|
|
257
|
+
const parsed = parseReasoning(requested);
|
|
258
|
+
if (!parsed)
|
|
259
|
+
return undefined;
|
|
260
|
+
if (levels.includes(parsed))
|
|
261
|
+
return parsed;
|
|
262
|
+
const requestedIndex = REASONING_LEVELS.indexOf(parsed);
|
|
263
|
+
let best;
|
|
264
|
+
let bestIndex = Number.NEGATIVE_INFINITY;
|
|
265
|
+
for (const level of levels) {
|
|
266
|
+
const index = REASONING_LEVELS.indexOf(level);
|
|
267
|
+
if (index <= requestedIndex && index > bestIndex) {
|
|
268
|
+
best = level;
|
|
269
|
+
bestIndex = index;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return best ?? levels[0];
|
|
273
|
+
}
|
|
274
|
+
function isDisabledReasoningToken(value) {
|
|
275
|
+
if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
return DISABLED_REASONING_TOKENS.has(normalizeReasoningToken(String(value)));
|
|
279
|
+
}
|
|
280
|
+
/** Closest supported level to `target`; ties prefer the higher budget. */
|
|
281
|
+
function nearestReasoning(target, levels) {
|
|
282
|
+
if (levels.length === 0)
|
|
283
|
+
return undefined;
|
|
284
|
+
if (levels.includes(target))
|
|
285
|
+
return target;
|
|
286
|
+
const targetIndex = REASONING_LEVELS.indexOf(target);
|
|
287
|
+
let best;
|
|
288
|
+
let bestDistance = Number.POSITIVE_INFINITY;
|
|
289
|
+
for (const level of levels) {
|
|
290
|
+
const distance = Math.abs(REASONING_LEVELS.indexOf(level) - targetIndex);
|
|
291
|
+
if (distance < bestDistance ||
|
|
292
|
+
(distance === bestDistance &&
|
|
293
|
+
REASONING_LEVELS.indexOf(level) > REASONING_LEVELS.indexOf(best ?? level))) {
|
|
294
|
+
best = level;
|
|
295
|
+
bestDistance = distance;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return best;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Rewrite `reasoning_effort` / `reasoning.effort` onto a supported ladder.
|
|
302
|
+
*
|
|
303
|
+
* Model-agnostic: callers supply the allowed levels (learned, documented, or
|
|
304
|
+
* defaults). Bodies without reasoning fields are returned unchanged.
|
|
305
|
+
*/
|
|
306
|
+
export function adaptRequestReasoning(body, levels) {
|
|
307
|
+
if (levels.length === 0)
|
|
308
|
+
return { body, changed: false };
|
|
309
|
+
const topLevel = body.reasoning_effort;
|
|
310
|
+
const reasoning = isRecord(body.reasoning) ? body.reasoning : undefined;
|
|
311
|
+
const nested = reasoning?.effort;
|
|
312
|
+
const requested = topLevel ?? nested;
|
|
313
|
+
if (requested === undefined)
|
|
314
|
+
return { body, changed: false };
|
|
315
|
+
const remapped = remapReasoning(requested, levels);
|
|
316
|
+
if (!remapped)
|
|
317
|
+
return { body, changed: false };
|
|
318
|
+
const wire = formatReasoning(remapped);
|
|
319
|
+
let changed = false;
|
|
320
|
+
let next = { ...body };
|
|
321
|
+
if (typeof topLevel === "string" || typeof topLevel === "number") {
|
|
322
|
+
if (String(topLevel) !== wire) {
|
|
323
|
+
next = { ...next, reasoning_effort: wire };
|
|
324
|
+
changed = true;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (reasoning && (typeof nested === "string" || typeof nested === "number")) {
|
|
328
|
+
if (String(nested) !== wire) {
|
|
329
|
+
next = { ...next, reasoning: { ...reasoning, effort: wire } };
|
|
330
|
+
changed = true;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return changed ? { body: next, changed: true, wireEffort: wire } : { body, changed: false, wireEffort: wire };
|
|
334
|
+
}
|
|
335
|
+
/** Normalize labels for alias lookup (`Extra High` → `extra-high`). */
|
|
336
|
+
export function normalizeReasoningToken(value) {
|
|
337
|
+
return (stringUtils
|
|
338
|
+
.trimToNull(value)
|
|
339
|
+
?.toLowerCase()
|
|
340
|
+
.replace(/[_\s]+/g, "-")
|
|
341
|
+
.replace(/[^a-z0-9-]/g, "")
|
|
342
|
+
.replace(/-+/g, "-")
|
|
343
|
+
.replace(/^-|-$/g, "") ?? "");
|
|
344
|
+
}
|
|
345
|
+
/** Deduplicate levels while preserving first-seen order. */
|
|
346
|
+
export function uniqueReasoningLevels(levels) {
|
|
347
|
+
const seen = new Set();
|
|
348
|
+
const ordered = [];
|
|
349
|
+
for (const level of levels) {
|
|
350
|
+
if (seen.has(level))
|
|
351
|
+
continue;
|
|
352
|
+
seen.add(level);
|
|
353
|
+
ordered.push(level);
|
|
354
|
+
}
|
|
355
|
+
return ordered;
|
|
356
|
+
}
|
|
357
|
+
function extractSupportedTokens(text) {
|
|
358
|
+
const match = SUPPORTED_VALUES_PATTERN.exec(text);
|
|
359
|
+
if (!match?.[1])
|
|
360
|
+
return [];
|
|
361
|
+
return tokensFromFragment(match[1]);
|
|
362
|
+
}
|
|
363
|
+
function catalogueKeysFor(model) {
|
|
364
|
+
const keys = new Set();
|
|
365
|
+
const direct = modelCatalogueKey(model);
|
|
366
|
+
if (direct)
|
|
367
|
+
keys.add(direct);
|
|
368
|
+
const stripped = model
|
|
369
|
+
.toLowerCase()
|
|
370
|
+
.replace(/^databricks\//, "")
|
|
371
|
+
.replace(/^system\.ai\./, "")
|
|
372
|
+
.replace(/^databricks-/, "");
|
|
373
|
+
const strippedKey = modelCatalogueKey(stripped);
|
|
374
|
+
if (strippedKey)
|
|
375
|
+
keys.add(strippedKey);
|
|
376
|
+
const withPrefix = modelCatalogueKey(`databricks-${stripped}`);
|
|
377
|
+
if (withPrefix)
|
|
378
|
+
keys.add(withPrefix);
|
|
379
|
+
return [...keys];
|
|
380
|
+
}
|
|
381
|
+
function modelCatalogueKey(name) {
|
|
382
|
+
const trimmed = stringUtils.trimToNull(name);
|
|
383
|
+
if (!trimmed)
|
|
384
|
+
return undefined;
|
|
385
|
+
return (modelSearchQuery(trimmed)?.replaceAll(" ", "-") ??
|
|
386
|
+
trimmed
|
|
387
|
+
.toLowerCase()
|
|
388
|
+
.replace(/^databricks-/, "")
|
|
389
|
+
.replace(/[^a-z0-9._-]+/g, "-"));
|
|
390
|
+
}
|
|
391
|
+
function tokensFromFragment(fragment) {
|
|
392
|
+
const tokens = [];
|
|
393
|
+
for (const part of fragment.matchAll(TOKEN_PATTERN)) {
|
|
394
|
+
const token = part[1] ?? part[2] ?? part[3] ?? part[4];
|
|
395
|
+
if (!token || token === "and" || token === "or" || token === "of")
|
|
396
|
+
continue;
|
|
397
|
+
tokens.push(token.replace(/^["'`]+|["'`]+$/g, ""));
|
|
398
|
+
}
|
|
399
|
+
return tokens;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Walk a value tree, unwrapping nested JSON strings, and collect text leaves
|
|
403
|
+
* that may contain a supported-values sentence.
|
|
404
|
+
*/
|
|
405
|
+
function collectTextLeaves(value, depth = 0) {
|
|
406
|
+
if (value == null || depth > MAX_JSON_UNWRAP_DEPTH)
|
|
407
|
+
return [];
|
|
408
|
+
if (typeof value === "string") {
|
|
409
|
+
const trimmed = value.trim();
|
|
410
|
+
if (!trimmed)
|
|
411
|
+
return [];
|
|
412
|
+
const parsed = tryUnwrapJson(trimmed);
|
|
413
|
+
if (parsed !== undefined && parsed !== trimmed) {
|
|
414
|
+
return collectTextLeaves(parsed, depth + 1);
|
|
415
|
+
}
|
|
416
|
+
return [trimmed];
|
|
417
|
+
}
|
|
418
|
+
if (typeof value === "number" || typeof value === "boolean")
|
|
419
|
+
return [String(value)];
|
|
420
|
+
if (Array.isArray(value)) {
|
|
421
|
+
return value.flatMap((entry) => collectTextLeaves(entry, depth + 1));
|
|
422
|
+
}
|
|
423
|
+
if (!isRecord(value))
|
|
424
|
+
return [];
|
|
425
|
+
return Object.values(value).flatMap((entry) => collectTextLeaves(entry, depth + 1));
|
|
426
|
+
}
|
|
427
|
+
function tryUnwrapJson(text) {
|
|
428
|
+
const asRecord = json.parseRecord(text);
|
|
429
|
+
if (asRecord)
|
|
430
|
+
return asRecord;
|
|
431
|
+
const parsed = json.parse(text);
|
|
432
|
+
if (parsed !== undefined)
|
|
433
|
+
return parsed;
|
|
434
|
+
if (text.includes('\\"') || text.includes("\\n")) {
|
|
435
|
+
const unescaped = text.replace(/\\"/g, '"').replace(/\\n/g, "\n").replace(/\\\\/g, "\\");
|
|
436
|
+
if (unescaped !== text) {
|
|
437
|
+
const nested = json.parse(unescaped);
|
|
438
|
+
if (nested !== undefined)
|
|
439
|
+
return nested;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return undefined;
|
|
443
|
+
}
|
|
444
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhc29uaW5nLXRyYW5zbGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlYXNvbmluZy10cmFuc2xhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RCxPQUFPLEtBQUssV0FBVyxNQUFNLHFDQUFxQyxDQUFDO0FBQ25FLE9BQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUUzQixPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSzVELGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsR0FBRyxFQUFFLEtBQUs7SUFDVixNQUFNLEVBQUUsUUFBUTtJQUNoQixJQUFJLEVBQUUsTUFBTTtJQUNaLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLEdBQUcsRUFBRSxLQUFLO0NBQ3VDLENBQUM7QUFFcEQsa0VBQWtFO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE4QjtJQUN6RCxjQUFjLENBQUMsR0FBRztJQUNsQixjQUFjLENBQUMsTUFBTTtJQUNyQixjQUFjLENBQUMsSUFBSTtJQUNuQixjQUFjLENBQUMsU0FBUztJQUN4QixjQUFjLENBQUMsR0FBRztDQUNuQixDQUFDO0FBS0YsTUFBTSxRQUFRLEdBQThCO0lBQzFDLGNBQWMsQ0FBQyxHQUFHO0lBQ2xCLGNBQWMsQ0FBQyxNQUFNO0lBQ3JCLGNBQWMsQ0FBQyxJQUFJO0NBQ3BCLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBOEI7SUFDakQsY0FBYyxDQUFDLEdBQUc7SUFDbEIsY0FBYyxDQUFDLE1BQU07SUFDckIsY0FBYyxDQUFDLElBQUk7SUFDbkIsY0FBYyxDQUFDLFNBQVM7Q0FDekIs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QUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsSUFBSSxRQUFRO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDeEMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekYsSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyQyxJQUFJLE1BQU0sS0FBSyxTQUFTO2dCQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJpYyByZWFzb25pbmctYnVkZ2V0IHRyYW5zbGF0aW9uIGZvciBNb2RlbCBTZXJ2aW5nIGFuZCBnYXRld2F5IGNhbGxlcnMuXG4gKlxuICogUHJvdmlkZXIgd2lyZXMgZGlzYWdyZWUgb24gZWZmb3J0IGxhYmVscyAoYHhoaWdoYCwgYHVsdHJhYCwgYG1lZGAsIGBub25lYCwg4oCmKS5cbiAqIFRoaXMgbW9kdWxlIG93bnMgb25lIGluZHVzdHJ5LXNoYXBlZCBsYWRkZXIgYW5kIHR3byBwYXJzZXJzOlxuICpcbiAqIC0ge0BsaW5rIHBhcnNlUmVhc29uaW5nfTogZnV6enktbWF0Y2ggb25lIGxhYmVsIG9udG8ge0BsaW5rIFJlYXNvbmluZ0xldmVsfVxuICogLSB7QGxpbmsgcGFyc2VSZWFzb25pbmdMZXZlbHN9OiB1bndyYXAgbmVzdGVkIC8gZG91YmxlLWVuY29kZWQgZXJyb3IgYm9kaWVzXG4gKiAtIHtAbGluayByZW1hcFJlYXNvbmluZ30gLyB7QGxpbmsgYWRhcHRSZXF1ZXN0UmVhc29uaW5nfTogbWFwIGEgcmVxdWVzdCBvbnRvIGFcbiAqICAgc3VwcG9ydGVkIGxhZGRlciBhbmQgcmV3cml0ZSBgcmVhc29uaW5nX2VmZm9ydGAgLyBgcmVhc29uaW5nLmVmZm9ydGBcbiAqXG4gKiBEb2N1bWVudGVkIG1vZGVsIGxhZGRlcnMgY29tZSBmcm9tIHRoZSBjb21taXR0ZWQgSFRNTCBzbmFwc2hvdCByZWZyZXNoZWQgYnlcbiAqIGBidW4gcnVuIC0tZmlsdGVyICdAZGJ4LXRvb2xzL21vZGVsJyBtZXRhZGF0YWAgKHNhbWUgY2FjaGUgcGF0aCBhc1xuICogY2FwYWJpbGl0aWVzIC8gcmF0ZSBsaW1pdHMpLiBFcnJvci1ib2R5IHBhcnNpbmcgaXMgbmV2ZXIgY2FjaGVkOyBjYWxsZXJzXG4gKiBwZXJzaXN0IGxlYXJuZWQgbGFkZGVycyB2aWEgdGhlIG1ldGFkYXRhIG1vZHVsZS5cbiAqXG4gKiBFcnJvciBib2RpZXMgYXJyaXZlIGFzIGNvbXBsZXRlIEhUVFAgSlNPTiB3aGV0aGVyIHRoZSByZXF1ZXN0IGFza2VkIGZvclxuICogc3RyZWFtaW5nIG9yIG5vdCAoRGF0YWJyaWNrcyByZWplY3RzIHVuc3VwcG9ydGVkIGVmZm9ydHMgd2l0aCA0MDAgYmVmb3JlIFNTRVxuICogc3RhcnRzKSwgc28ge0BsaW5rIHBhcnNlUmVhc29uaW5nTGV2ZWxzfSBhcHBsaWVzIHRvIGJvdGggcGF0aHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGpzb24gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgaXNSZWNvcmQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9vYmplY3RcIjtcbmltcG9ydCAqIGFzIHN0cmluZ1V0aWxzIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL3N0cmluZy11dGlsc1wiO1xuaW1wb3J0IEZ1c2UgZnJvbSBcImZ1c2UuanNcIjtcblxuaW1wb3J0IHsgbW9kZWxGYW1pbHksIG1vZGVsU2VhcmNoUXVlcnkgfSBmcm9tIFwiLi9wb2xpY3kudHNcIjtcblxuLyoqIEluZHVzdHJ5LWdlbmVyaWMgcmVhc29uaW5nIGJ1ZGdldCBsZXZlbHMsIGxvd2VzdCB0byBoaWdoZXN0LiAqL1xuZXhwb3J0IHR5cGUgUmVhc29uaW5nTGV2ZWwgPSBcImxvd1wiIHwgXCJtZWRpdW1cIiB8IFwiaGlnaFwiIHwgXCJleHRyYS1oaWdoXCIgfCBcIm1heFwiO1xuXG4vKiogUnVudGltZSB2YWx1ZXMgZm9yIHtAbGluayBSZWFzb25pbmdMZXZlbH0uICovXG5leHBvcnQgY29uc3QgUmVhc29uaW5nTGV2ZWwgPSB7XG4gIExvdzogXCJsb3dcIixcbiAgTWVkaXVtOiBcIm1lZGl1bVwiLFxuICBIaWdoOiBcImhpZ2hcIixcbiAgRXh0cmFIaWdoOiBcImV4dHJhLWhpZ2hcIixcbiAgTWF4OiBcIm1heFwiLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgUmVhc29uaW5nTGV2ZWw+O1xuXG4vKiogQ2Fub25pY2FsIGxhZGRlciBvcmRlciB1c2VkIHdoZW4gc29ydGluZyBvciByYW5raW5nIHJlbWFwcy4gKi9cbmV4cG9ydCBjb25zdCBSRUFTT05JTkdfTEVWRUxTOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBSZWFzb25pbmdMZXZlbC5NYXgsXG5dO1xuXG4vKiogTW9kZWwgaWRlbnRpdHkg4oaSIGFjY2VwdGVkIHtAbGluayBSZWFzb25pbmdMZXZlbH0gbGFkZGVyLiAqL1xuZXhwb3J0IHR5cGUgUmVhc29uaW5nTW9kZWxDYXRhbG9ndWUgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdPj47XG5cbmNvbnN0IFNUQU5EQVJEOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbl07XG5cbmNvbnN0IFdJVEhfRVhUUkFfSElHSDogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSA9IFtcbiAgUmVhc29uaW5nTGV2ZWwuTG93LFxuICBSZWFzb25pbmdMZXZlbC5NZWRpdW0sXG4gIFJlYXNvbmluZ0xldmVsLkhpZ2gsXG4gIFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbl07XG5cbmNvbnN0IFdJVEhfTUFYOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdID0gW1xuICBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBSZWFzb25pbmdMZXZlbC5NYXgsXG5dO1xuXG5jb25zdCBHUFRfNV81X1BSTzogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSA9IFtcbiAgUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBSZWFzb25pbmdMZXZlbC5IaWdoLFxuICBSZWFzb25pbmdMZXZlbC5FeHRyYUhpZ2gsXG5dO1xuXG4vKipcbiAqIEFsaWFzIHRhYmxlIGZvciBleGFjdCAvIG5lYXItZXhhY3QgbGFiZWxzLiBLZXlzIGFyZSB7QGxpbmsgbm9ybWFsaXplUmVhc29uaW5nVG9rZW59XG4gKiByZXN1bHRzLiBQcm92aWRlciB3aXJlcyAoYHhoaWdoYCkgYW5kIHBsYWluIEVuZ2xpc2ggKGB1bHRyYWAsIGBtZWRgKSBib3RoIGxhbmRcbiAqIG9uIHRoZSBnZW5lcmljIGxhZGRlci5cbiAqL1xuY29uc3QgQUxJQVNFUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUmVhc29uaW5nTGV2ZWw+PiA9IHtcbiAgbG93OiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIGw6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbm9uZTogUmVhc29uaW5nTGV2ZWwuTG93LFxuICBvZmY6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgZGlzYWJsZTogUmVhc29uaW5nTGV2ZWwuTG93LFxuICBkaXNhYmxlZDogUmVhc29uaW5nTGV2ZWwuTG93LFxuICB6ZXJvOiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIG1pbmltYWw6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbWluOiBSZWFzb25pbmdMZXZlbC5Mb3csXG4gIHRpbnk6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbGlnaHQ6IFJlYXNvbmluZ0xldmVsLkxvdyxcbiAgbWVkaXVtOiBSZWFzb25pbmdMZXZlbC5NZWRpdW0sXG4gIG1lZDogUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBtaWQ6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgbW9kZXJhdGU6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgZGVmYXVsdDogUmVhc29uaW5nTGV2ZWwuTWVkaXVtLFxuICBub3JtYWw6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgYmFsYW5jZWQ6IFJlYXNvbmluZ0xldmVsLk1lZGl1bSxcbiAgaGlnaDogUmVhc29uaW5nTGV2ZWwuSGlnaCxcbiAgaGk6IFJlYXNvbmluZ0xldmVsLkhpZ2gsXG4gIGhlYXZ5OiBSZWFzb25pbmdMZXZlbC5IaWdoLFxuICBcImV4dHJhLWhpZ2hcIjogUmVhc29uaW5nTGV2ZWwuRXh0cmFIaWdoLFxuICBleHRyYWhpZ2g6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgeGhpZ2g6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgeGg6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgdWx0cmE6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgXCJ1bHRyYS1oaWdoXCI6IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCxcbiAgdWx0cmFoaWdoOiBSZWFzb25pbmdMZXZlbC5FeHRyYUhpZ2gsXG4gIG1heDogUmVhc29uaW5nTGV2ZWwuTWF4LFxuICBtYXhpbXVtOiBSZWFzb25pbmdMZXZlbC5NYXgsXG4gIGhpZ2hlc3Q6IFJlYXNvbmluZ0xldmVsLk1heCxcbiAgZnVsbDogUmVhc29uaW5nTGV2ZWwuTWF4LFxufTtcblxuY29uc3QgU1VQUE9SVEVEX1ZBTFVFU19QQVRURVJOID1cbiAgL3N1cHBvcnRlZFxccyt2YWx1ZXM/XFxzK2FyZVxccyo6P1xccyooLis/KSg/OlxcLj9cXHMqKD86cGFyYW18dHlwZXxjb2RlKVxcYnwkKS9pcztcbmNvbnN0IFRPS0VOX1BBVFRFUk4gPSAvJyhbXiddKyknfFwiKFteXCJdKylcInxgKFteYF0rKWB8XFxiKFthLXpdW2EtejAtOV8tXSopXFxiL2dpO1xuY29uc3QgTUFYX0pTT05fVU5XUkFQX0RFUFRIID0gODtcblxuaW50ZXJmYWNlIEFsaWFzRG9jdW1lbnQge1xuICByZWFkb25seSB0b2tlbjogc3RyaW5nO1xuICByZWFkb25seSBsZXZlbDogUmVhc29uaW5nTGV2ZWw7XG59XG5cbmNvbnN0IGFsaWFzRG9jdW1lbnRzOiByZWFkb25seSBBbGlhc0RvY3VtZW50W10gPSBPYmplY3QuZW50cmllcyhBTElBU0VTKS5tYXAoXG4gIChbdG9rZW4sIGxldmVsXSkgPT4gKHsgdG9rZW4sIGxldmVsIH0pLFxuKTtcblxuY29uc3QgYWxpYXNGdXNlID0gbmV3IEZ1c2UoYWxpYXNEb2N1bWVudHMsIHtcbiAga2V5czogW1widG9rZW5cIl0sXG4gIGluY2x1ZGVTY29yZTogdHJ1ZSxcbiAgdGhyZXNob2xkOiAwLjM1LFxuICBpZ25vcmVMb2NhdGlvbjogdHJ1ZSxcbn0pO1xuXG4vKipcbiAqIEZ1enp5LW1hdGNoIG9uZSByZWFzb25pbmcgbGFiZWwgb250byB7QGxpbmsgUmVhc29uaW5nTGV2ZWx9LlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgaW5wdXQgaXMgZW1wdHkgb3IgY2Fubm90IGJlIG1hcHBlZCBjb25maWRlbnRseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVhc29uaW5nKHZhbHVlOiB1bmtub3duKTogUmVhc29uaW5nTGV2ZWwgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUmVhc29uaW5nVG9rZW4oU3RyaW5nKHZhbHVlKSk7XG4gIGlmICghbm9ybWFsaXplZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZXhhY3QgPSBBTElBU0VTW25vcm1hbGl6ZWRdID8/IEFMSUFTRVNbbm9ybWFsaXplZC5yZXBsYWNlKC8tL2csIFwiXCIpXTtcbiAgaWYgKGV4YWN0KSByZXR1cm4gZXhhY3Q7XG4gIGNvbnN0IFttYXRjaF0gPSBhbGlhc0Z1c2Uuc2VhcmNoKG5vcm1hbGl6ZWQpO1xuICBpZiAoIW1hdGNoIHx8IChtYXRjaC5zY29yZSA/PyAxKSA+IDAuMzUpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBtYXRjaC5pdGVtLmxldmVsO1xufVxuXG4vKipcbiAqIEV4dHJhY3Qgc3VwcG9ydGVkIHJlYXNvbmluZyBsZXZlbHMgZnJvbSBhbiB1cHN0cmVhbSBlcnJvciBib2R5LlxuICpcbiAqIEFjY2VwdHMgcmF3IHJlc3BvbnNlIHRleHQsIGFscmVhZHktcGFyc2VkIEpTT04sIG9yIERhdGFicmlja3MgZW52ZWxvcGVzIHRoYXRcbiAqIG5lc3QgSlNPTiBzdHJpbmdzIHNldmVyYWwgdGltZXMuIFJldHVybnMgYFtdYCB3aGVuIG5vIHN1cHBvcnRlZC12YWx1ZXMgbGlzdFxuICogY2FuIGJlIHJlY292ZXJlZC4gUmVzdWx0cyBhcmUgbm90IGNhY2hlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVhc29uaW5nTGV2ZWxzKGJvZHk6IHVua25vd24pOiBSZWFzb25pbmdMZXZlbFtdIHtcbiAgY29uc3QgbGV2ZWxzOiBSZWFzb25pbmdMZXZlbFtdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PFJlYXNvbmluZ0xldmVsPigpO1xuICBmb3IgKGNvbnN0IHRleHQgb2YgY29sbGVjdFRleHRMZWF2ZXMoYm9keSkpIHtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIGV4dHJhY3RTdXBwb3J0ZWRUb2tlbnModGV4dCkpIHtcbiAgICAgIGNvbnN0IGxldmVsID0gcGFyc2VSZWFzb25pbmcodG9rZW4pO1xuICAgICAgaWYgKCFsZXZlbCB8fCBzZWVuLmhhcyhsZXZlbCkpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQobGV2ZWwpO1xuICAgICAgbGV2ZWxzLnB1c2gobGV2ZWwpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGV2ZWxzO1xufVxuXG4vKipcbiAqIExvb2sgdXAgZG9jdW1lbnRlZCBsZXZlbHMgZm9yIGEgbW9kZWwgaWRlbnRpdHkgaW5zaWRlIGEgY2F0YWxvZ3VlLlxuICpcbiAqIE1hdGNoZXMgZXhhY3QgY2F0YWxvZ3VlIGtleXMgYW5kIHN1ZmZpeCBpZGVudGl0aWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZG9jdW1lbnRlZFJlYXNvbmluZ0xldmVscyhcbiAgbW9kZWw6IHN0cmluZyxcbiAgY2F0YWxvZ3VlOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSxcbik6IFJlYXNvbmluZ0xldmVsW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBrZXlzID0gY2F0YWxvZ3VlS2V5c0Zvcihtb2RlbCk7XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCBsZXZlbHMgPSBjYXRhbG9ndWVba2V5XTtcbiAgICBpZiAobGV2ZWxzPy5sZW5ndGgpIHJldHVybiBbLi4ubGV2ZWxzXTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIGxldmVsc10gb2YgT2JqZWN0LmVudHJpZXMoY2F0YWxvZ3VlKSkge1xuICAgIGlmIChrZXlzLnNvbWUoKGNhbmRpZGF0ZSkgPT4ga2V5LmVuZHNXaXRoKGNhbmRpZGF0ZSkgfHwgY2FuZGlkYXRlLmVuZHNXaXRoKGtleSkpKSB7XG4gICAgICByZXR1cm4gWy4uLmxldmVsc107XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSGFyZC1jb2RlZCBmYW1pbHkgZGVmYXVsdHMgdXNlZCB3aGVuIGRvY3VtZW50YXRpb24gaGFzIG5vIGVudHJ5LlxuICpcbiAqIFVua25vd24gZmFtaWxpZXMgcmV0dXJuIHRoZSBzdGFuZGFyZCBsb3cvbWVkaXVtL2hpZ2ggbGFkZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFJlYXNvbmluZ0xldmVscyhtb2RlbDogc3RyaW5nKTogUmVhc29uaW5nTGV2ZWxbXSB7XG4gIGNvbnN0IGZhbWlseSA9IG1vZGVsRmFtaWx5KG1vZGVsKT8udG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG1vZGVsLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChmYW1pbHkgPT09IFwiZ3Jva1wiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJncm9rXCIpKSByZXR1cm4gWy4uLldJVEhfRVhUUkFfSElHSF07XG4gIGlmIChmYW1pbHkgPT09IFwiZ2VtaW5pXCIgfHwgbm9ybWFsaXplZC5pbmNsdWRlcyhcImdlbWluaVwiKSkgcmV0dXJuIFsuLi5TVEFOREFSRF07XG4gIGlmIChmYW1pbHkgPT09IFwiY2xhdWRlXCIgfHwgbm9ybWFsaXplZC5pbmNsdWRlcyhcImNsYXVkZVwiKSkgcmV0dXJuIFsuLi5XSVRIX01BWF07XG4gIGlmIChmYW1pbHkgPT09IFwiZ2xtXCIgfHwgbm9ybWFsaXplZC5pbmNsdWRlcyhcImdsbVwiKSkge1xuICAgIHJldHVybiBbUmVhc29uaW5nTGV2ZWwuSGlnaCwgUmVhc29uaW5nTGV2ZWwuTWF4XTtcbiAgfVxuICBpZiAoXG4gICAgZmFtaWx5ID09PSBcImRlZXBzZWVrXCIgfHxcbiAgICBub3JtYWxpemVkLmluY2x1ZGVzKFwiZGVlcHNlZWtcIikgfHxcbiAgICBmYW1pbHkgPT09IFwia2ltaVwiIHx8XG4gICAgbm9ybWFsaXplZC5pbmNsdWRlcyhcImtpbWlcIilcbiAgKSB7XG4gICAgcmV0dXJuIFtSZWFzb25pbmdMZXZlbC5Mb3csIFJlYXNvbmluZ0xldmVsLkhpZ2gsIFJlYXNvbmluZ0xldmVsLk1heF07XG4gIH1cbiAgaWYgKGZhbWlseSA9PT0gXCJpbmtsaW5nXCIgfHwgbm9ybWFsaXplZC5pbmNsdWRlcyhcImlua2xpbmdcIikpIHJldHVybiBbLi4uV0lUSF9NQVhdO1xuICBpZiAoZmFtaWx5ID09PSBcImdwdFwiIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJncHRcIikgfHwgbm9ybWFsaXplZC5pbmNsdWRlcyhcImNvZGV4XCIpKSB7XG4gICAgaWYgKG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJvc3NcIikpIHJldHVybiBbLi4uU1RBTkRBUkRdO1xuICAgIGlmICgvKD86XnxbLV8uXSk1Wy1fLl0/NSg/OlstXy5dfCQpLy50ZXN0KG5vcm1hbGl6ZWQpICYmIG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJwcm9cIikpIHtcbiAgICAgIHJldHVybiBbLi4uR1BUXzVfNV9QUk9dO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAvKD86XnxbLV8uXSk1Wy1fLl0/Nig/OlstXy5dfCQpLy50ZXN0KG5vcm1hbGl6ZWQpIHx8XG4gICAgICAvKD86XnxbLV8uXSk2KD86Wy1fLl18JCkvLnRlc3Qobm9ybWFsaXplZClcbiAgICApIHtcbiAgICAgIHJldHVybiBbLi4uV0lUSF9NQVhdO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLlNUQU5EQVJEXTtcbiAgfVxuICBpZiAoLyg/Ol58Wy1fLi9dKW8oPzoxfDN8NCkoPzpbLV8uL118JCkvLnRlc3QobW9kZWwpIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoXCJjb2RleFwiKSkge1xuICAgIHJldHVybiBbLi4uU1RBTkRBUkRdO1xuICB9XG4gIHJldHVybiBbLi4uU1RBTkRBUkRdO1xufVxuXG4vKipcbiAqIFByZWZlciBhIGRvY3VtZW50YXRpb24gY2F0YWxvZ3VlIHdoZW4gcHJvdmlkZWQsIG90aGVyd2lzZVxuICoge0BsaW5rIGRlZmF1bHRSZWFzb25pbmdMZXZlbHN9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhc29uaW5nTGV2ZWxzRm9yKFxuICBtb2RlbDogc3RyaW5nLFxuICBjYXRhbG9ndWU/OiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSxcbik6IFJlYXNvbmluZ0xldmVsW10ge1xuICBpZiAoY2F0YWxvZ3VlKSB7XG4gICAgY29uc3QgZG9jdW1lbnRlZCA9IGRvY3VtZW50ZWRSZWFzb25pbmdMZXZlbHMobW9kZWwsIGNhdGFsb2d1ZSk7XG4gICAgaWYgKGRvY3VtZW50ZWQ/Lmxlbmd0aCkgcmV0dXJuIGRvY3VtZW50ZWQ7XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRSZWFzb25pbmdMZXZlbHMobW9kZWwpO1xufVxuXG4vKipcbiAqIE1hcCBhIGdlbmVyaWMgbGV2ZWwgb250byB0aGUgbW9zdCBjb21tb24gcHJvdmlkZXIgd2lyZSB0b2tlbi5cbiAqXG4gKiBgZXh0cmEtaGlnaGAgYmVjb21lcyBgeGhpZ2hgIGJlY2F1c2UgdGhhdCBpcyB3aGF0IERhdGFicmlja3MgLyBPcGVuQUkgZXJyb3JcbiAqIG1lc3NhZ2VzIGFkdmVydGlzZSB0b2RheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlYXNvbmluZyhsZXZlbDogUmVhc29uaW5nTGV2ZWwpOiBzdHJpbmcge1xuICByZXR1cm4gbGV2ZWwgPT09IFJlYXNvbmluZ0xldmVsLkV4dHJhSGlnaCA/IFwieGhpZ2hcIiA6IGxldmVsO1xufVxuXG4vKiogV2lyZSB0b2tlbnMgdGhhdCBtZWFuIFwiZG8gbm90IHJlYXNvblwiIHJhdGhlciB0aGFuIFwidXNlIGEgbG93IGJ1ZGdldFwiLiAqL1xuY29uc3QgRElTQUJMRURfUkVBU09OSU5HX1RPS0VOUyA9IG5ldyBTZXQoW1wibm9uZVwiLCBcIm9mZlwiLCBcImRpc2FibGVcIiwgXCJkaXNhYmxlZFwiXSk7XG5cbi8qKlxuICogUmVtYXAgYSByZXF1ZXN0ZWQgZWZmb3J0IG9udG8gdGhlIG5lYXJlc3Qgc3VwcG9ydGVkIHtAbGluayBSZWFzb25pbmdMZXZlbH0uXG4gKlxuICogYG5vbmVgIC8gYG9mZmAgKGFuZCBkaXNhYmxlIGFsaWFzZXMpIGFyZSBub3QgYSBsb3cgYnVkZ2V0OiB3aGVuIHRoZSBtb2RlbFxuICogcmVxdWlyZXMgcmVhc29uaW5nLCB0aGV5IHNuYXAgdG8gdGhlIHN1cHBvcnRlZCBsZXZlbCBjbG9zZXN0IHRvXG4gKiB7QGxpbmsgUmVhc29uaW5nTGV2ZWwuTWVkaXVtfS4gT3RoZXIgcmVxdWVzdHMgcHJlZmVyIHRoZSBoaWdoZXN0IGFsbG93ZWRcbiAqIGxldmVsIGF0IG9yIGJlbG93IHRoZSByZXF1ZXN0LCBvdGhlcndpc2UgdGhlIGxvd2VzdCBhbGxvd2VkIGxldmVsLlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcmVxdWVzdCBjYW5ub3QgYmUgcGFyc2VkIG9yIGBsZXZlbHNgIGlzIGVtcHR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtYXBSZWFzb25pbmcoXG4gIHJlcXVlc3RlZDogdW5rbm93bixcbiAgbGV2ZWxzOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdLFxuKTogUmVhc29uaW5nTGV2ZWwgfCB1bmRlZmluZWQge1xuICBpZiAobGV2ZWxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGlzRGlzYWJsZWRSZWFzb25pbmdUb2tlbihyZXF1ZXN0ZWQpKSB7XG4gICAgcmV0dXJuIG5lYXJlc3RSZWFzb25pbmcoUmVhc29uaW5nTGV2ZWwuTWVkaXVtLCBsZXZlbHMpO1xuICB9XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlUmVhc29uaW5nKHJlcXVlc3RlZCk7XG4gIGlmICghcGFyc2VkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAobGV2ZWxzLmluY2x1ZGVzKHBhcnNlZCkpIHJldHVybiBwYXJzZWQ7XG4gIGNvbnN0IHJlcXVlc3RlZEluZGV4ID0gUkVBU09OSU5HX0xFVkVMUy5pbmRleE9mKHBhcnNlZCk7XG4gIGxldCBiZXN0OiBSZWFzb25pbmdMZXZlbCB8IHVuZGVmaW5lZDtcbiAgbGV0IGJlc3RJbmRleCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgZm9yIChjb25zdCBsZXZlbCBvZiBsZXZlbHMpIHtcbiAgICBjb25zdCBpbmRleCA9IFJFQVNPTklOR19MRVZFTFMuaW5kZXhPZihsZXZlbCk7XG4gICAgaWYgKGluZGV4IDw9IHJlcXVlc3RlZEluZGV4ICYmIGluZGV4ID4gYmVzdEluZGV4KSB7XG4gICAgICBiZXN0ID0gbGV2ZWw7XG4gICAgICBiZXN0SW5kZXggPSBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJlc3QgPz8gbGV2ZWxzWzBdO1xufVxuXG5mdW5jdGlvbiBpc0Rpc2FibGVkUmVhc29uaW5nVG9rZW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gRElTQUJMRURfUkVBU09OSU5HX1RPS0VOUy5oYXMobm9ybWFsaXplUmVhc29uaW5nVG9rZW4oU3RyaW5nKHZhbHVlKSkpO1xufVxuXG4vKiogQ2xvc2VzdCBzdXBwb3J0ZWQgbGV2ZWwgdG8gYHRhcmdldGA7IHRpZXMgcHJlZmVyIHRoZSBoaWdoZXIgYnVkZ2V0LiAqL1xuZnVuY3Rpb24gbmVhcmVzdFJlYXNvbmluZyhcbiAgdGFyZ2V0OiBSZWFzb25pbmdMZXZlbCxcbiAgbGV2ZWxzOiByZWFkb25seSBSZWFzb25pbmdMZXZlbFtdLFxuKTogUmVhc29uaW5nTGV2ZWwgfCB1bmRlZmluZWQge1xuICBpZiAobGV2ZWxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGxldmVscy5pbmNsdWRlcyh0YXJnZXQpKSByZXR1cm4gdGFyZ2V0O1xuICBjb25zdCB0YXJnZXRJbmRleCA9IFJFQVNPTklOR19MRVZFTFMuaW5kZXhPZih0YXJnZXQpO1xuICBsZXQgYmVzdDogUmVhc29uaW5nTGV2ZWwgfCB1bmRlZmluZWQ7XG4gIGxldCBiZXN0RGlzdGFuY2UgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIGZvciAoY29uc3QgbGV2ZWwgb2YgbGV2ZWxzKSB7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmFicyhSRUFTT05JTkdfTEVWRUxTLmluZGV4T2YobGV2ZWwpIC0gdGFyZ2V0SW5kZXgpO1xuICAgIGlmIChcbiAgICAgIGRpc3RhbmNlIDwgYmVzdERpc3RhbmNlIHx8XG4gICAgICAoZGlzdGFuY2UgPT09IGJlc3REaXN0YW5jZSAmJlxuICAgICAgICBSRUFTT05JTkdfTEVWRUxTLmluZGV4T2YobGV2ZWwpID4gUkVBU09OSU5HX0xFVkVMUy5pbmRleE9mKGJlc3QgPz8gbGV2ZWwpKVxuICAgICkge1xuICAgICAgYmVzdCA9IGxldmVsO1xuICAgICAgYmVzdERpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBiZXN0O1xufVxuXG4vKiogUmVzdWx0IG9mIGFkYXB0aW5nIHJlYXNvbmluZyBmaWVsZHMgb24gYSBnYXRld2F5IHJlcXVlc3QgYm9keS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlZFJlcXVlc3RSZWFzb25pbmcge1xuICAvKiogQm9keSB3aXRoIHJlbWFwcGVkIHdpcmUgdG9rZW5zIChzYW1lIHJlZmVyZW5jZSB3aGVuIHVuY2hhbmdlZCkuICovXG4gIHJlYWRvbmx5IGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqIFRydWUgd2hlbiBhbnkgcmVhc29uaW5nIGZpZWxkIHdhcyByZXdyaXR0ZW4uICovXG4gIHJlYWRvbmx5IGNoYW5nZWQ6IGJvb2xlYW47XG4gIC8qKiBXaXJlIHRva2VuIHdyaXR0ZW4gd2hlbiBhIHJlYXNvbmluZyBmaWVsZCB3YXMgcHJlc2VudCBhbmQgcmVtYXBwZWQuICovXG4gIHJlYWRvbmx5IHdpcmVFZmZvcnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmV3cml0ZSBgcmVhc29uaW5nX2VmZm9ydGAgLyBgcmVhc29uaW5nLmVmZm9ydGAgb250byBhIHN1cHBvcnRlZCBsYWRkZXIuXG4gKlxuICogTW9kZWwtYWdub3N0aWM6IGNhbGxlcnMgc3VwcGx5IHRoZSBhbGxvd2VkIGxldmVscyAobGVhcm5lZCwgZG9jdW1lbnRlZCwgb3JcbiAqIGRlZmF1bHRzKS4gQm9kaWVzIHdpdGhvdXQgcmVhc29uaW5nIGZpZWxkcyBhcmUgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRhcHRSZXF1ZXN0UmVhc29uaW5nKFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gIGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSxcbik6IEFkYXB0ZWRSZXF1ZXN0UmVhc29uaW5nIHtcbiAgaWYgKGxldmVscy5sZW5ndGggPT09IDApIHJldHVybiB7IGJvZHksIGNoYW5nZWQ6IGZhbHNlIH07XG5cbiAgY29uc3QgdG9wTGV2ZWwgPSBib2R5LnJlYXNvbmluZ19lZmZvcnQ7XG4gIGNvbnN0IHJlYXNvbmluZyA9IGlzUmVjb3JkKGJvZHkucmVhc29uaW5nKSA/IGJvZHkucmVhc29uaW5nIDogdW5kZWZpbmVkO1xuICBjb25zdCBuZXN0ZWQgPSByZWFzb25pbmc/LmVmZm9ydDtcbiAgY29uc3QgcmVxdWVzdGVkID0gdG9wTGV2ZWwgPz8gbmVzdGVkO1xuICBpZiAocmVxdWVzdGVkID09PSB1bmRlZmluZWQpIHJldHVybiB7IGJvZHksIGNoYW5nZWQ6IGZhbHNlIH07XG5cbiAgY29uc3QgcmVtYXBwZWQgPSByZW1hcFJlYXNvbmluZyhyZXF1ZXN0ZWQsIGxldmVscyk7XG4gIGlmICghcmVtYXBwZWQpIHJldHVybiB7IGJvZHksIGNoYW5nZWQ6IGZhbHNlIH07XG4gIGNvbnN0IHdpcmUgPSBmb3JtYXRSZWFzb25pbmcocmVtYXBwZWQpO1xuXG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGxldCBuZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uYm9keSB9O1xuXG4gIGlmICh0eXBlb2YgdG9wTGV2ZWwgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHRvcExldmVsID09PSBcIm51bWJlclwiKSB7XG4gICAgaWYgKFN0cmluZyh0b3BMZXZlbCkgIT09IHdpcmUpIHtcbiAgICAgIG5leHQgPSB7IC4uLm5leHQsIHJlYXNvbmluZ19lZmZvcnQ6IHdpcmUgfTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAocmVhc29uaW5nICYmICh0eXBlb2YgbmVzdGVkID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBuZXN0ZWQgPT09IFwibnVtYmVyXCIpKSB7XG4gICAgaWYgKFN0cmluZyhuZXN0ZWQpICE9PSB3aXJlKSB7XG4gICAgICBuZXh0ID0geyAuLi5uZXh0LCByZWFzb25pbmc6IHsgLi4ucmVhc29uaW5nLCBlZmZvcnQ6IHdpcmUgfSB9O1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNoYW5nZWQgPyB7IGJvZHk6IG5leHQsIGNoYW5nZWQ6IHRydWUsIHdpcmVFZmZvcnQ6IHdpcmUgfSA6IHsgYm9keSwgY2hhbmdlZDogZmFsc2UsIHdpcmVFZmZvcnQ6IHdpcmUgfTtcbn1cblxuLyoqIE5vcm1hbGl6ZSBsYWJlbHMgZm9yIGFsaWFzIGxvb2t1cCAoYEV4dHJhIEhpZ2hgIOKGkiBgZXh0cmEtaGlnaGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlYXNvbmluZ1Rva2VuKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIHN0cmluZ1V0aWxzXG4gICAgICAudHJpbVRvTnVsbCh2YWx1ZSlcbiAgICAgID8udG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1tfXFxzXSsvZywgXCItXCIpXG4gICAgICAucmVwbGFjZSgvW15hLXowLTktXS9nLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoLy0rL2csIFwiLVwiKVxuICAgICAgLnJlcGxhY2UoL14tfC0kL2csIFwiXCIpID8/IFwiXCJcbiAgKTtcbn1cblxuLyoqIERlZHVwbGljYXRlIGxldmVscyB3aGlsZSBwcmVzZXJ2aW5nIGZpcnN0LXNlZW4gb3JkZXIuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlUmVhc29uaW5nTGV2ZWxzKGxldmVsczogcmVhZG9ubHkgUmVhc29uaW5nTGV2ZWxbXSk6IFJlYXNvbmluZ0xldmVsW10ge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxSZWFzb25pbmdMZXZlbD4oKTtcbiAgY29uc3Qgb3JkZXJlZDogUmVhc29uaW5nTGV2ZWxbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxldmVsIG9mIGxldmVscykge1xuICAgIGlmIChzZWVuLmhhcyhsZXZlbCkpIGNvbnRpbnVlO1xuICAgIHNlZW4uYWRkKGxldmVsKTtcbiAgICBvcmRlcmVkLnB1c2gobGV2ZWwpO1xuICB9XG4gIHJldHVybiBvcmRlcmVkO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0U3VwcG9ydGVkVG9rZW5zKHRleHQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbWF0Y2ggPSBTVVBQT1JURURfVkFMVUVTX1BBVFRFUk4uZXhlYyh0ZXh0KTtcbiAgaWYgKCFtYXRjaD8uWzFdKSByZXR1cm4gW107XG4gIHJldHVybiB0b2tlbnNGcm9tRnJhZ21lbnQobWF0Y2hbMV0pO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVLZXlzRm9yKG1vZGVsOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGlyZWN0ID0gbW9kZWxDYXRhbG9ndWVLZXkobW9kZWwpO1xuICBpZiAoZGlyZWN0KSBrZXlzLmFkZChkaXJlY3QpO1xuICBjb25zdCBzdHJpcHBlZCA9IG1vZGVsXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvXmRhdGFicmlja3NcXC8vLCBcIlwiKVxuICAgIC5yZXBsYWNlKC9ec3lzdGVtXFwuYWlcXC4vLCBcIlwiKVxuICAgIC5yZXBsYWNlKC9eZGF0YWJyaWNrcy0vLCBcIlwiKTtcbiAgY29uc3Qgc3RyaXBwZWRLZXkgPSBtb2RlbENhdGFsb2d1ZUtleShzdHJpcHBlZCk7XG4gIGlmIChzdHJpcHBlZEtleSkga2V5cy5hZGQoc3RyaXBwZWRLZXkpO1xuICBjb25zdCB3aXRoUHJlZml4ID0gbW9kZWxDYXRhbG9ndWVLZXkoYGRhdGFicmlja3MtJHtzdHJpcHBlZH1gKTtcbiAgaWYgKHdpdGhQcmVmaXgpIGtleXMuYWRkKHdpdGhQcmVmaXgpO1xuICByZXR1cm4gWy4uLmtleXNdO1xufVxuXG5mdW5jdGlvbiBtb2RlbENhdGFsb2d1ZUtleShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0cmltbWVkID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChuYW1lKTtcbiAgaWYgKCF0cmltbWVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gKFxuICAgIG1vZGVsU2VhcmNoUXVlcnkodHJpbW1lZCk/LnJlcGxhY2VBbGwoXCIgXCIsIFwiLVwiKSA/P1xuICAgIHRyaW1tZWRcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAucmVwbGFjZSgvXmRhdGFicmlja3MtLywgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOS5fLV0rL2csIFwiLVwiKVxuICApO1xufVxuXG5mdW5jdGlvbiB0b2tlbnNGcm9tRnJhZ21lbnQoZnJhZ21lbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgZnJhZ21lbnQubWF0Y2hBbGwoVE9LRU5fUEFUVEVSTikpIHtcbiAgICBjb25zdCB0b2tlbiA9IHBhcnRbMV0gPz8gcGFydFsyXSA/PyBwYXJ0WzNdID8/IHBhcnRbNF07XG4gICAgaWYgKCF0b2tlbiB8fCB0b2tlbiA9PT0gXCJhbmRcIiB8fCB0b2tlbiA9PT0gXCJvclwiIHx8IHRva2VuID09PSBcIm9mXCIpIGNvbnRpbnVlO1xuICAgIHRva2Vucy5wdXNoKHRva2VuLnJlcGxhY2UoL15bXCInYF0rfFtcIidgXSskL2csIFwiXCIpKTtcbiAgfVxuICByZXR1cm4gdG9rZW5zO1xufVxuXG4vKipcbiAqIFdhbGsgYSB2YWx1ZSB0cmVlLCB1bndyYXBwaW5nIG5lc3RlZCBKU09OIHN0cmluZ3MsIGFuZCBjb2xsZWN0IHRleHQgbGVhdmVzXG4gKiB0aGF0IG1heSBjb250YWluIGEgc3VwcG9ydGVkLXZhbHVlcyBzZW50ZW5jZS5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFRleHRMZWF2ZXModmFsdWU6IHVua25vd24sIGRlcHRoID0gMCk6IHN0cmluZ1tdIHtcbiAgaWYgKHZhbHVlID09IG51bGwgfHwgZGVwdGggPiBNQVhfSlNPTl9VTldSQVBfREVQVEgpIHJldHVybiBbXTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm4gW107XG4gICAgY29uc3QgcGFyc2VkID0gdHJ5VW53cmFwSnNvbih0cmltbWVkKTtcbiAgICBpZiAocGFyc2VkICE9PSB1bmRlZmluZWQgJiYgcGFyc2VkICE9PSB0cmltbWVkKSB7XG4gICAgICByZXR1cm4gY29sbGVjdFRleHRMZWF2ZXMocGFyc2VkLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gW3RyaW1tZWRdO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIFtTdHJpbmcodmFsdWUpXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmZsYXRNYXAoKGVudHJ5KSA9PiBjb2xsZWN0VGV4dExlYXZlcyhlbnRyeSwgZGVwdGggKyAxKSk7XG4gIH1cbiAgaWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXModmFsdWUpLmZsYXRNYXAoKGVudHJ5KSA9PiBjb2xsZWN0VGV4dExlYXZlcyhlbnRyeSwgZGVwdGggKyAxKSk7XG59XG5cbmZ1bmN0aW9uIHRyeVVud3JhcEpzb24odGV4dDogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGFzUmVjb3JkID0ganNvbi5wYXJzZVJlY29yZCh0ZXh0KTtcbiAgaWYgKGFzUmVjb3JkKSByZXR1cm4gYXNSZWNvcmQ7XG4gIGNvbnN0IHBhcnNlZCA9IGpzb24ucGFyc2UodGV4dCk7XG4gIGlmIChwYXJzZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHBhcnNlZDtcbiAgaWYgKHRleHQuaW5jbHVkZXMoJ1xcXFxcIicpIHx8IHRleHQuaW5jbHVkZXMoXCJcXFxcblwiKSkge1xuICAgIGNvbnN0IHVuZXNjYXBlZCA9IHRleHQucmVwbGFjZSgvXFxcXFwiL2csICdcIicpLnJlcGxhY2UoL1xcXFxuL2csIFwiXFxuXCIpLnJlcGxhY2UoL1xcXFxcXFxcL2csIFwiXFxcXFwiKTtcbiAgICBpZiAodW5lc2NhcGVkICE9PSB0ZXh0KSB7XG4gICAgICBjb25zdCBuZXN0ZWQgPSBqc29uLnBhcnNlKHVuZXNjYXBlZCk7XG4gICAgICBpZiAobmVzdGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBuZXN0ZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
|
package/lib/src/resolve.d.ts
CHANGED
|
@@ -3,11 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import type { ModelQuery, RankedModel, ServingEndpointSummary } from "@dbx-tools/shared-model";
|
|
7
|
-
import { type
|
|
8
|
-
import { type ResolvedModel, type ResolveModelOptions, type WorkspaceClientLike } from "./model-catalog.ts";
|
|
6
|
+
import type { ModelQuery, RankedModel, ResolvedModel, ResolvedModelSelection, ResolveModelInput, ResolveModelOptions, ServingEndpointSummary } from "@dbx-tools/shared-model";
|
|
7
|
+
import { type WorkspaceClientLike } from "./model-catalog.ts";
|
|
9
8
|
export { lookupModels, rankModelId, resolveModel } from "./_selection.ts";
|
|
10
|
-
export type { ResolveModelInput, ResolvedModelSelection } from "./_selection.ts";
|
|
11
9
|
/** Intent plus catalogue cache controls passed to {@link selectModel}. */
|
|
12
10
|
export interface SelectModelInput extends ResolveModelInput {
|
|
13
11
|
ttlMs?: number;
|
package/lib/src/resolve.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { lookupModels, rankModelId, resolveModel
|
|
1
|
+
import { lookupModels, rankModelId, resolveModel } from "./_selection.js";
|
|
2
2
|
import { listServingEndpoints, } from "./model-catalog.js";
|
|
3
3
|
export { lookupModels, rankModelId, resolveModel } from "./_selection.js";
|
|
4
4
|
/** Resolve against a potentially stale catalogue, refreshing once on a miss. */
|
|
@@ -27,4 +27,4 @@ function catalogueOptions(input) {
|
|
|
27
27
|
...(input.cacheIdentity !== undefined ? { cacheIdentity: input.cacheIdentity } : {}),
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWVBLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFFLE9BQU8sRUFDTCxvQkFBb0IsR0FHckIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQWMxRSxnRkFBZ0Y7QUFDaEYsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQ25DLElBQW9FLEVBQ3BFLE1BQWMsRUFDZCxVQUErQixFQUFFO0lBRWpDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakUsSUFBSSxRQUFRLENBQUMsT0FBTztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQ3RDLE9BQU8sV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsaURBQWlEO0FBQ2pELE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxNQUEyQixFQUMzQixJQUFZLEVBQ1osUUFBMkIsRUFBRTtJQUU3QixNQUFNLFNBQVMsR0FBRyxNQUFNLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRixPQUFPLFlBQVksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELHdEQUF3RDtBQUN4RCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FDL0IsTUFBMkIsRUFDM0IsSUFBWSxFQUNaLFFBQTBCLEVBQUU7SUFFNUIsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNsRixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRixPQUFPLFlBQVksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsS0FHekI7SUFDQyxPQUFPO1FBQ0wsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RCxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3JGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXb3Jrc3BhY2UtYXdhcmUgbW9kZWwgc2VsZWN0aW9uIHdyYXBwZXJzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHR5cGUge1xuICBNb2RlbFF1ZXJ5LFxuICBSYW5rZWRNb2RlbCxcbiAgUmVzb2x2ZWRNb2RlbCxcbiAgUmVzb2x2ZWRNb2RlbFNlbGVjdGlvbixcbiAgUmVzb2x2ZU1vZGVsSW5wdXQsXG4gIFJlc29sdmVNb2RlbE9wdGlvbnMsXG4gIFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuXG5pbXBvcnQgeyBsb29rdXBNb2RlbHMsIHJhbmtNb2RlbElkLCByZXNvbHZlTW9kZWwgfSBmcm9tIFwiLi9fc2VsZWN0aW9uLnRzXCI7XG5pbXBvcnQge1xuICBsaXN0U2VydmluZ0VuZHBvaW50cyxcbiAgdHlwZSBMaXN0U2VydmluZ0VuZHBvaW50c09wdGlvbnMsXG4gIHR5cGUgV29ya3NwYWNlQ2xpZW50TGlrZSxcbn0gZnJvbSBcIi4vbW9kZWwtY2F0YWxvZy50c1wiO1xuXG5leHBvcnQgeyBsb29rdXBNb2RlbHMsIHJhbmtNb2RlbElkLCByZXNvbHZlTW9kZWwgfSBmcm9tIFwiLi9fc2VsZWN0aW9uLnRzXCI7XG5cbi8qKiBJbnRlbnQgcGx1cyBjYXRhbG9ndWUgY2FjaGUgY29udHJvbHMgcGFzc2VkIHRvIHtAbGluayBzZWxlY3RNb2RlbH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE1vZGVsSW5wdXQgZXh0ZW5kcyBSZXNvbHZlTW9kZWxJbnB1dCB7XG4gIHR0bE1zPzogbnVtYmVyO1xuICBjYWNoZUlkZW50aXR5Pzogc3RyaW5nO1xufVxuXG4vKiogUXVlcnkgcGx1cyBjYXRhbG9ndWUgY2FjaGUgY29udHJvbHMgcGFzc2VkIHRvIHtAbGluayBzZWFyY2hNb2RlbHN9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hNb2RlbHNJbnB1dCBleHRlbmRzIE1vZGVsUXVlcnkge1xuICB0dGxNcz86IG51bWJlcjtcbiAgY2FjaGVJZGVudGl0eT86IHN0cmluZztcbn1cblxuLyoqIFJlc29sdmUgYWdhaW5zdCBhIHBvdGVudGlhbGx5IHN0YWxlIGNhdGFsb2d1ZSwgcmVmcmVzaGluZyBvbmNlIG9uIGEgbWlzcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByYW5rTW9kZWxJZExpdmUoXG4gIGxvYWQ6IChmb3JjZTogYm9vbGVhbikgPT4gUHJvbWlzZTxyZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10+LFxuICBzZWFyY2g6IHN0cmluZyxcbiAgb3B0aW9uczogUmVzb2x2ZU1vZGVsT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxSZXNvbHZlZE1vZGVsPiB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmFua01vZGVsSWQoYXdhaXQgbG9hZChmYWxzZSksIHNlYXJjaCwgb3B0aW9ucyk7XG4gIGlmIChyZXNvbHZlZC5tYXRjaGVkKSByZXR1cm4gcmVzb2x2ZWQ7XG4gIHJldHVybiByYW5rTW9kZWxJZChhd2FpdCBsb2FkKHRydWUpLCBzZWFyY2gsIG9wdGlvbnMpO1xufVxuXG4vKiogTGlzdCBhbmQgcmFuayBhIHdvcmtzcGFjZSBtb2RlbCBjYXRhbG9ndWUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VhcmNoTW9kZWxzKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsXG4gIGhvc3Q6IHN0cmluZyxcbiAgaW5wdXQ6IFNlYXJjaE1vZGVsc0lucHV0ID0ge30sXG4pOiBQcm9taXNlPFJhbmtlZE1vZGVsW10+IHtcbiAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdFNlcnZpbmdFbmRwb2ludHMoY2xpZW50LCBob3N0LCBjYXRhbG9ndWVPcHRpb25zKGlucHV0KSk7XG4gIHJldHVybiBsb29rdXBNb2RlbHMoZW5kcG9pbnRzLCBpbnB1dCk7XG59XG5cbi8qKiBMaXN0IGEgd29ya3NwYWNlIGNhdGFsb2d1ZSBhbmQgcmVzb2x2ZSBvbmUgbW9kZWwuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VsZWN0TW9kZWwoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgaG9zdDogc3RyaW5nLFxuICBpbnB1dDogU2VsZWN0TW9kZWxJbnB1dCA9IHt9LFxuKTogUHJvbWlzZTxSZXNvbHZlZE1vZGVsU2VsZWN0aW9uPiB7XG4gIGlmIChpbnB1dC5leHBsaWNpdCAhPT0gdW5kZWZpbmVkICYmIGlucHV0LmZ1enp5ID09PSBmYWxzZSAmJiAhaW5wdXQucmVxdWlyZXNUb29scykge1xuICAgIHJldHVybiB7IG1vZGVsSWQ6IGlucHV0LmV4cGxpY2l0LCBzb3VyY2U6IFwiZXhwbGljaXRcIiB9O1xuICB9XG4gIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGxpc3RTZXJ2aW5nRW5kcG9pbnRzKGNsaWVudCwgaG9zdCwgY2F0YWxvZ3VlT3B0aW9ucyhpbnB1dCkpO1xuICByZXR1cm4gcmVzb2x2ZU1vZGVsKGVuZHBvaW50cywgaW5wdXQpO1xufVxuXG5mdW5jdGlvbiBjYXRhbG9ndWVPcHRpb25zKGlucHV0OiB7XG4gIHJlYWRvbmx5IHR0bE1zPzogbnVtYmVyO1xuICByZWFkb25seSBjYWNoZUlkZW50aXR5Pzogc3RyaW5nO1xufSk6IExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucyB7XG4gIHJldHVybiB7XG4gICAgLi4uKGlucHV0LnR0bE1zICE9PSB1bmRlZmluZWQgPyB7IHR0bE1zOiBpbnB1dC50dGxNcyB9IDoge30pLFxuICAgIC4uLihpbnB1dC5jYWNoZUlkZW50aXR5ICE9PSB1bmRlZmluZWQgPyB7IGNhY2hlSWRlbnRpdHk6IGlucHV0LmNhY2hlSWRlbnRpdHkgfSA6IHt9KSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-neutral repairs for OpenAI Chat traffic sent through Databricks
|
|
3
|
+
* Model Serving.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { type ChatMessage, type ChatRole } from "@dbx-tools/shared-model";
|
|
8
|
+
/** Chat message plus provider reasoning fields emitted by Databricks models. */
|
|
9
|
+
export interface ServingChatMessage extends ChatMessage {
|
|
10
|
+
role: ChatRole | "reasoning";
|
|
11
|
+
reasoning?: unknown;
|
|
12
|
+
reasoning_content?: unknown;
|
|
13
|
+
}
|
|
14
|
+
/** Prepared fetch arguments and the sanitized request body. */
|
|
15
|
+
export interface RewrittenServingRequest {
|
|
16
|
+
input: Parameters<typeof fetch>[0];
|
|
17
|
+
init: Parameters<typeof fetch>[1];
|
|
18
|
+
body: string;
|
|
19
|
+
}
|
|
20
|
+
/** Sanitize a serialized Chat Completions request when provider quirks require it. */
|
|
21
|
+
export declare function rewriteServingBody(body: string): string;
|
|
22
|
+
/** Read and sanitize a Chat Completions request without retaining stale byte headers. */
|
|
23
|
+
export declare function rewriteServingRequest(input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]): Promise<RewrittenServingRequest>;
|
|
24
|
+
/** Normalize Chat Completions reasoning for GPT tool calls. */
|
|
25
|
+
export declare function applyToolReasoningCompatibility(body: Record<string, unknown>): boolean;
|
|
26
|
+
/** Remove provider reasoning blocks that cannot be replayed safely. */
|
|
27
|
+
export declare function stripReasoningFromServingMessages(messages: ServingChatMessage[]): boolean;
|
|
28
|
+
/** Fold a trailing assistant prefill back into its preceding tool-call turn. */
|
|
29
|
+
export declare function repairAssistantPrefill(messages: ServingChatMessage[]): boolean;
|
|
30
|
+
/** Normalize array-valued content in a non-streaming Chat Completions response. */
|
|
31
|
+
export declare function rewriteServingResponseBody(body: string): string;
|
|
32
|
+
/** Normalize array-valued content in an SSE stream without buffering the stream. */
|
|
33
|
+
export declare function rewriteServingResponseStream(body: ReadableStream<Uint8Array>): ReadableStream<Uint8Array>;
|
|
34
|
+
/** Flatten Chat Completions `choices[].message.content` arrays to strings. */
|
|
35
|
+
export declare function flattenChoiceMessageContent(payload: Record<string, unknown>): boolean;
|
|
36
|
+
/** Flatten Chat Completions `choices[].delta.content` arrays to strings. */
|
|
37
|
+
export declare function flattenChoiceDeltaContent(payload: Record<string, unknown>): boolean;
|