@dbx-tools/model 0.9.154 → 0.9.158
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/index.ts +23 -12
- package/lib/index.d.ts +23 -12
- package/lib/index.js +21 -12
- package/lib/scripts/generate-metadata.js +2 -2
- package/lib/src/_cache.js +2 -2
- package/lib/src/_metadata-generator.d.ts +1 -1
- package/lib/src/_metadata-generator.js +1 -1
- package/lib/src/_ranking.d.ts +1 -1
- package/lib/src/_ranking.js +22 -27
- package/lib/src/classes.d.ts +1 -1
- package/lib/src/classes.js +2 -2
- package/lib/src/classify.d.ts +1 -1
- package/lib/src/classify.js +2 -2
- package/lib/src/fallback.d.ts +1 -1
- package/lib/src/fallback.js +2 -2
- package/lib/src/metadata-cache.d.ts +1 -1
- package/lib/src/metadata-cache.js +5 -6
- package/lib/src/{_metadata-contract.d.ts → metadata-contract.d.ts} +1 -1
- package/lib/src/metadata-contract.js +13 -0
- package/lib/src/metadata.d.ts +3 -4
- package/lib/src/metadata.js +5 -7
- package/lib/src/model-catalog.js +5 -6
- package/lib/src/model-client.d.ts +1 -1
- package/lib/src/model-client.js +10 -12
- package/lib/src/policy.d.ts +1 -1
- package/lib/src/policy.js +2 -2
- package/lib/src/reasoning-translation.js +7 -10
- package/lib/src/resolve.d.ts +1 -3
- package/lib/src/resolve.js +2 -3
- package/lib/src/{_retirement.d.ts → retirement.d.ts} +1 -1
- package/lib/src/retirement.js +59 -0
- package/lib/src/{_selection.d.ts → selection.d.ts} +1 -1
- package/lib/src/selection.js +89 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -113
- package/src/_cache.ts +1 -1
- package/src/_metadata-generator.ts +1 -1
- package/src/_ranking.ts +21 -26
- package/src/classes.ts +1 -1
- package/src/classify.ts +1 -1
- package/src/fallback.ts +1 -1
- package/src/metadata-cache.ts +4 -5
- package/src/{_metadata-contract.ts → metadata-contract.ts} +1 -1
- package/src/metadata.ts +20 -34
- package/src/model-catalog.ts +4 -6
- package/src/model-client.ts +9 -11
- package/src/policy.ts +1 -1
- package/src/reasoning-translation.ts +6 -9
- package/src/resolve.ts +6 -9
- package/src/{_retirement.ts → retirement.ts} +2 -2
- package/src/{_selection.ts → selection.ts} +3 -3
- package/exports.ts +0 -1
- package/lib/exports.d.ts +0 -1
- package/lib/exports.js +0 -2
- package/lib/src/_metadata-contract.js +0 -13
- package/lib/src/_retirement.js +0 -59
- package/lib/src/_selection.js +0 -89
package/exports.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { createModelClient } from "./src/model-client.ts";
|
package/lib/exports.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { createModelClient } from "./src/model-client.ts";
|
package/lib/exports.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export { createModelClient } from "./src/model-client.js";
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2V4cG9ydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBjcmVhdGVNb2RlbENsaWVudCB9IGZyb20gXCIuL3NyYy9tb2RlbC1jbGllbnQudHNcIjtcbiJdfQ==
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/** One day, matching the refresh cadence of Databricks model documentation. */
|
|
2
|
-
export const MODEL_METADATA_TTL_MS = 24 * 60 * 60 * 1000;
|
|
3
|
-
/** Databricks documentation URL for retired foundation models. */
|
|
4
|
-
export const RETIRED_MODELS_URL = "https://docs.databricks.com/aws/en/machine-learning/retired-models-policy";
|
|
5
|
-
/** Databricks documentation URL for OpenAI Responses model support. */
|
|
6
|
-
export const OPENAI_RESPONSES_MODELS_URL = "https://docs.databricks.com/aws/en/machine-learning/model-serving/query-openai-responses";
|
|
7
|
-
/** Databricks documentation URL for native web-search model support. */
|
|
8
|
-
export const WEB_SEARCH_MODELS_URL = "https://docs.databricks.com/aws/en/machine-learning/model-serving/web-search";
|
|
9
|
-
/** Databricks documentation URL for Foundation Model API limits. */
|
|
10
|
-
export const MODEL_RATE_LIMITS_URL = "https://docs.databricks.com/aws/en/machine-learning/foundation-model-apis/limits";
|
|
11
|
-
/** Databricks documentation URL for reasoning-effort model policy. */
|
|
12
|
-
export const QUERY_REASON_MODELS_URL = "https://docs.databricks.com/aws/en/machine-learning/model-serving/query-reason-models";
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX21ldGFkYXRhLWNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19tZXRhZGF0YS1jb250cmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSwrRUFBK0U7QUFDL0UsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRXpELGtFQUFrRTtBQUNsRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FDN0IsMkVBQTJFLENBQUM7QUFFOUUsdUVBQXVFO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUN0QywwRkFBMEYsQ0FBQztBQUU3Rix3RUFBd0U7QUFDeEUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQ2hDLDhFQUE4RSxDQUFDO0FBRWpGLG9FQUFvRTtBQUNwRSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FDaEMsa0ZBQWtGLENBQUM7QUFFckYsc0VBQXNFO0FBQ3RFLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUNsQyx1RkFBdUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTW9kZWxSYXRlTGltaXRzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2NvbnRyYWN0c1wiO1xuXG4vKiogT25lIGRheSwgbWF0Y2hpbmcgdGhlIHJlZnJlc2ggY2FkZW5jZSBvZiBEYXRhYnJpY2tzIG1vZGVsIGRvY3VtZW50YXRpb24uICovXG5leHBvcnQgY29uc3QgTU9ERUxfTUVUQURBVEFfVFRMX01TID0gMjQgKiA2MCAqIDYwICogMTAwMDtcblxuLyoqIERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiBVUkwgZm9yIHJldGlyZWQgZm91bmRhdGlvbiBtb2RlbHMuICovXG5leHBvcnQgY29uc3QgUkVUSVJFRF9NT0RFTFNfVVJMID1cbiAgXCJodHRwczovL2RvY3MuZGF0YWJyaWNrcy5jb20vYXdzL2VuL21hY2hpbmUtbGVhcm5pbmcvcmV0aXJlZC1tb2RlbHMtcG9saWN5XCI7XG5cbi8qKiBEYXRhYnJpY2tzIGRvY3VtZW50YXRpb24gVVJMIGZvciBPcGVuQUkgUmVzcG9uc2VzIG1vZGVsIHN1cHBvcnQuICovXG5leHBvcnQgY29uc3QgT1BFTkFJX1JFU1BPTlNFU19NT0RFTFNfVVJMID1cbiAgXCJodHRwczovL2RvY3MuZGF0YWJyaWNrcy5jb20vYXdzL2VuL21hY2hpbmUtbGVhcm5pbmcvbW9kZWwtc2VydmluZy9xdWVyeS1vcGVuYWktcmVzcG9uc2VzXCI7XG5cbi8qKiBEYXRhYnJpY2tzIGRvY3VtZW50YXRpb24gVVJMIGZvciBuYXRpdmUgd2ViLXNlYXJjaCBtb2RlbCBzdXBwb3J0LiAqL1xuZXhwb3J0IGNvbnN0IFdFQl9TRUFSQ0hfTU9ERUxTX1VSTCA9XG4gIFwiaHR0cHM6Ly9kb2NzLmRhdGFicmlja3MuY29tL2F3cy9lbi9tYWNoaW5lLWxlYXJuaW5nL21vZGVsLXNlcnZpbmcvd2ViLXNlYXJjaFwiO1xuXG4vKiogRGF0YWJyaWNrcyBkb2N1bWVudGF0aW9uIFVSTCBmb3IgRm91bmRhdGlvbiBNb2RlbCBBUEkgbGltaXRzLiAqL1xuZXhwb3J0IGNvbnN0IE1PREVMX1JBVEVfTElNSVRTX1VSTCA9XG4gIFwiaHR0cHM6Ly9kb2NzLmRhdGFicmlja3MuY29tL2F3cy9lbi9tYWNoaW5lLWxlYXJuaW5nL2ZvdW5kYXRpb24tbW9kZWwtYXBpcy9saW1pdHNcIjtcblxuLyoqIERhdGFicmlja3MgZG9jdW1lbnRhdGlvbiBVUkwgZm9yIHJlYXNvbmluZy1lZmZvcnQgbW9kZWwgcG9saWN5LiAqL1xuZXhwb3J0IGNvbnN0IFFVRVJZX1JFQVNPTl9NT0RFTFNfVVJMID1cbiAgXCJodHRwczovL2RvY3MuZGF0YWJyaWNrcy5jb20vYXdzL2VuL21hY2hpbmUtbGVhcm5pbmcvbW9kZWwtc2VydmluZy9xdWVyeS1yZWFzb24tbW9kZWxzXCI7XG5cbi8qKiBCdWlsZC1nZW5lcmF0ZWQgcmV0aXJlZC1tb2RlbCBzbmFwc2hvdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0aXJlZE1vZGVsc1NuYXBzaG90IHtcbiAgcmVhZG9ubHkgZ2VuZXJhdGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgbW9kZWxzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqIE5vcm1hbGl6ZWQgbW9kZWwgaWRlbnRpdGllcyBncm91cGVkIGJ5IGRvY3VtZW50ZWQgY2FwYWJpbGl0eS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDYXBhYmlsaXR5Q2F0YWxvZ3VlIHtcbiAgcmVhZG9ubHkgcmVzcG9uc2VzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgaW1hZ2VJbnB1dDogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IGFwcGx5UGF0Y2g6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSB3ZWJTZWFyY2g6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKiogQnVpbGQtZ2VuZXJhdGVkIG1vZGVsLWNhcGFiaWxpdHkgc25hcHNob3QuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ2FwYWJpbGl0aWVzU25hcHNob3Qge1xuICByZWFkb25seSBnZW5lcmF0ZWRBdDogbnVtYmVyO1xuICByZWFkb25seSBjYXBhYmlsaXRpZXM6IE1vZGVsQ2FwYWJpbGl0eUNhdGFsb2d1ZTtcbn1cblxuLyoqIE1vZGVsIGxpbWl0cyBrZXllZCBieSBub3JtYWxpemVkIERhdGFicmlja3MgbW9kZWwgaWRlbnRpdHkuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUmF0ZUxpbWl0Q2F0YWxvZ3VlIHtcbiAgcmVhZG9ubHkgbW9kZWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBNb2RlbFJhdGVMaW1pdHM+Pjtcbn1cblxuLyoqIEJ1aWxkLWdlbmVyYXRlZCBtb2RlbC1yYXRlLWxpbWl0IHNuYXBzaG90LiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFJhdGVMaW1pdHNTbmFwc2hvdCB7XG4gIHJlYWRvbmx5IGdlbmVyYXRlZEF0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGNhdGFsb2d1ZTogTW9kZWxSYXRlTGltaXRDYXRhbG9ndWU7XG59XG5cbi8qKiBEb2N1bWVudGVkIGdlbmVyaWMgcmVhc29uaW5nIGxldmVscyBrZXllZCBieSBub3JtYWxpemVkIG1vZGVsIGlkZW50aXR5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZSB7XG4gIHJlYWRvbmx5IG1vZGVsczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+Pjtcbn1cblxuLyoqIEJ1aWxkLWdlbmVyYXRlZCByZWFzb25pbmctZWZmb3J0IGRvY3VtZW50YXRpb24gc25hcHNob3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlYXNvbmluZ01vZGVsc1NuYXBzaG90IHtcbiAgcmVhZG9ubHkgZ2VuZXJhdGVkQXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgY2F0YWxvZ3VlOiBSZWFzb25pbmdNb2RlbENhdGFsb2d1ZTtcbn1cbiJdfQ==
|
package/lib/src/_retirement.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import retiredModelsSnapshotJson from "./generated/retired-models.json" with { type: "json" };
|
|
2
|
-
const snapshot = retiredModelsSnapshotJson;
|
|
3
|
-
const RETIRED_MODEL_PREFIXES = new Set([
|
|
4
|
-
"ai",
|
|
5
|
-
"anthropic",
|
|
6
|
-
"databricks",
|
|
7
|
-
"dbx",
|
|
8
|
-
"google",
|
|
9
|
-
"meta",
|
|
10
|
-
"openai",
|
|
11
|
-
"system",
|
|
12
|
-
]);
|
|
13
|
-
let names = Object.freeze([...snapshot.models]);
|
|
14
|
-
let keys = retiredKeys(names);
|
|
15
|
-
export const COMMITTED_RETIRED_MODELS = snapshot.models;
|
|
16
|
-
export const RETIRED_MODELS_GENERATED_AT = snapshot.generatedAt;
|
|
17
|
-
/** Replace retirement state after metadata cache hydration or refresh. */
|
|
18
|
-
export function replaceRetiredModelNames(models) {
|
|
19
|
-
names = Object.freeze([...models]);
|
|
20
|
-
keys = retiredKeys(names);
|
|
21
|
-
}
|
|
22
|
-
/** Return the active retired-model names. */
|
|
23
|
-
export function retiredModelNames() {
|
|
24
|
-
return names;
|
|
25
|
-
}
|
|
26
|
-
/** Resolve whether any supplied identity is listed as retired. */
|
|
27
|
-
export function modelStatusFor(...models) {
|
|
28
|
-
const deprecated = models
|
|
29
|
-
.flatMap((model) => modelIdentities(model))
|
|
30
|
-
.some((identity) => {
|
|
31
|
-
const candidate = retiredModelKey(identity);
|
|
32
|
-
for (const key of keys) {
|
|
33
|
-
if (candidate === key || candidate.startsWith(`${key}-`))
|
|
34
|
-
return true;
|
|
35
|
-
}
|
|
36
|
-
return false;
|
|
37
|
-
});
|
|
38
|
-
return { deprecated };
|
|
39
|
-
}
|
|
40
|
-
function retiredKeys(models) {
|
|
41
|
-
return new Set(models.map(retiredModelKey).filter(Boolean));
|
|
42
|
-
}
|
|
43
|
-
function modelIdentities(model) {
|
|
44
|
-
if (typeof model === "string")
|
|
45
|
-
return [model];
|
|
46
|
-
return [
|
|
47
|
-
model.name,
|
|
48
|
-
model.displayName,
|
|
49
|
-
model.modelServiceName,
|
|
50
|
-
...Object.values(model.serviceNames ?? {}),
|
|
51
|
-
].filter((value) => Boolean(value));
|
|
52
|
-
}
|
|
53
|
-
function retiredModelKey(value) {
|
|
54
|
-
const tokens = value.toLowerCase().match(/[a-z0-9]+/g) ?? [];
|
|
55
|
-
while (tokens[0] && RETIRED_MODEL_PREFIXES.has(tokens[0]))
|
|
56
|
-
tokens.shift();
|
|
57
|
-
return tokens.join("-");
|
|
58
|
-
}
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3JldGlyZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX3JldGlyZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyx5QkFBeUIsTUFBTSxpQ0FBaUMsQ0FBQyxPQUFPLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUU5RixNQUFNLFFBQVEsR0FBRyx5QkFBa0QsQ0FBQztBQUNwRSxNQUFNLHNCQUFzQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3JDLElBQUk7SUFDSixXQUFXO0lBQ1gsWUFBWTtJQUNaLEtBQUs7SUFDTCxRQUFRO0lBQ1IsTUFBTTtJQUNOLFFBQVE7SUFDUixRQUFRO0NBQ1QsQ0FBQyxDQUFDO0FBRUgsSUFBSSxLQUFLLEdBQXNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ25FLElBQUksSUFBSSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUU5QixNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7QUFFaEUsMEVBQTBFO0FBQzFFLE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxNQUF5QjtJQUNoRSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNuQyxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCw2Q0FBNkM7QUFDN0MsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxrRUFBa0U7QUFDbEUsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsR0FBRyxNQUFvRDtJQUV2RCxNQUFNLFVBQVUsR0FBRyxNQUFNO1NBQ3RCLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQ2pCLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLElBQUksU0FBUyxLQUFLLEdBQUcsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDeEUsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDTCxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDeEIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE1BQXlCO0lBQzVDLE9BQU8sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsS0FBc0M7SUFDN0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLE9BQU87UUFDTCxLQUFLLENBQUMsSUFBSTtRQUNWLEtBQUssQ0FBQyxXQUFXO1FBQ2pCLEtBQUssQ0FBQyxnQkFBZ0I7UUFDdEIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO0tBQzNDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEtBQWE7SUFDcEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0QsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksc0JBQXNCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBMaWdodHdlaWdodCBtb2RlbCByZXRpcmVtZW50IHN0YXRlIHNoYXJlZCBieSBkaXNjb3ZlcnkgYW5kIG1ldGFkYXRhIGNhY2hlcy4gKi9cbmltcG9ydCB0eXBlIHsgTW9kZWxTdGF0dXMsIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5cbmltcG9ydCB0eXBlIHsgUmV0aXJlZE1vZGVsc1NuYXBzaG90IH0gZnJvbSBcIi4vX21ldGFkYXRhLWNvbnRyYWN0LnRzXCI7XG5pbXBvcnQgcmV0aXJlZE1vZGVsc1NuYXBzaG90SnNvbiBmcm9tIFwiLi9nZW5lcmF0ZWQvcmV0aXJlZC1tb2RlbHMuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuXG5jb25zdCBzbmFwc2hvdCA9IHJldGlyZWRNb2RlbHNTbmFwc2hvdEpzb24gYXMgUmV0aXJlZE1vZGVsc1NuYXBzaG90O1xuY29uc3QgUkVUSVJFRF9NT0RFTF9QUkVGSVhFUyA9IG5ldyBTZXQoW1xuICBcImFpXCIsXG4gIFwiYW50aHJvcGljXCIsXG4gIFwiZGF0YWJyaWNrc1wiLFxuICBcImRieFwiLFxuICBcImdvb2dsZVwiLFxuICBcIm1ldGFcIixcbiAgXCJvcGVuYWlcIixcbiAgXCJzeXN0ZW1cIixcbl0pO1xuXG5sZXQgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gT2JqZWN0LmZyZWV6ZShbLi4uc25hcHNob3QubW9kZWxzXSk7XG5sZXQga2V5cyA9IHJldGlyZWRLZXlzKG5hbWVzKTtcblxuZXhwb3J0IGNvbnN0IENPTU1JVFRFRF9SRVRJUkVEX01PREVMUyA9IHNuYXBzaG90Lm1vZGVscztcbmV4cG9ydCBjb25zdCBSRVRJUkVEX01PREVMU19HRU5FUkFURURfQVQgPSBzbmFwc2hvdC5nZW5lcmF0ZWRBdDtcblxuLyoqIFJlcGxhY2UgcmV0aXJlbWVudCBzdGF0ZSBhZnRlciBtZXRhZGF0YSBjYWNoZSBoeWRyYXRpb24gb3IgcmVmcmVzaC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlUmV0aXJlZE1vZGVsTmFtZXMobW9kZWxzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICBuYW1lcyA9IE9iamVjdC5mcmVlemUoWy4uLm1vZGVsc10pO1xuICBrZXlzID0gcmV0aXJlZEtleXMobmFtZXMpO1xufVxuXG4vKiogUmV0dXJuIHRoZSBhY3RpdmUgcmV0aXJlZC1tb2RlbCBuYW1lcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXRpcmVkTW9kZWxOYW1lcygpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIHJldHVybiBuYW1lcztcbn1cblxuLyoqIFJlc29sdmUgd2hldGhlciBhbnkgc3VwcGxpZWQgaWRlbnRpdHkgaXMgbGlzdGVkIGFzIHJldGlyZWQuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxTdGF0dXNGb3IoXG4gIC4uLm1vZGVsczogcmVhZG9ubHkgKHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpW11cbik6IE1vZGVsU3RhdHVzIHtcbiAgY29uc3QgZGVwcmVjYXRlZCA9IG1vZGVsc1xuICAgIC5mbGF0TWFwKChtb2RlbCkgPT4gbW9kZWxJZGVudGl0aWVzKG1vZGVsKSlcbiAgICAuc29tZSgoaWRlbnRpdHkpID0+IHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHJldGlyZWRNb2RlbEtleShpZGVudGl0eSk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGlmIChjYW5kaWRhdGUgPT09IGtleSB8fCBjYW5kaWRhdGUuc3RhcnRzV2l0aChgJHtrZXl9LWApKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgcmV0dXJuIHsgZGVwcmVjYXRlZCB9O1xufVxuXG5mdW5jdGlvbiByZXRpcmVkS2V5cyhtb2RlbHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUmVhZG9ubHlTZXQ8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgU2V0KG1vZGVscy5tYXAocmV0aXJlZE1vZGVsS2V5KS5maWx0ZXIoQm9vbGVhbikpO1xufVxuXG5mdW5jdGlvbiBtb2RlbElkZW50aXRpZXMobW9kZWw6IHN0cmluZyB8IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIpIHJldHVybiBbbW9kZWxdO1xuICByZXR1cm4gW1xuICAgIG1vZGVsLm5hbWUsXG4gICAgbW9kZWwuZGlzcGxheU5hbWUsXG4gICAgbW9kZWwubW9kZWxTZXJ2aWNlTmFtZSxcbiAgICAuLi5PYmplY3QudmFsdWVzKG1vZGVsLnNlcnZpY2VOYW1lcyA/PyB7fSksXG4gIF0uZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiBCb29sZWFuKHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIHJldGlyZWRNb2RlbEtleSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdG9rZW5zID0gdmFsdWUudG9Mb3dlckNhc2UoKS5tYXRjaCgvW2EtejAtOV0rL2cpID8/IFtdO1xuICB3aGlsZSAodG9rZW5zWzBdICYmIFJFVElSRURfTU9ERUxfUFJFRklYRVMuaGFzKHRva2Vuc1swXSkpIHRva2Vucy5zaGlmdCgpO1xuICByZXR1cm4gdG9rZW5zLmpvaW4oXCItXCIpO1xufVxuIl19
|
package/lib/src/_selection.js
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Runtime-independent model ranking and selection.
|
|
3
|
-
*
|
|
4
|
-
* @module
|
|
5
|
-
*/
|
|
6
|
-
import * as object from "@dbx-tools/shared-core/object";
|
|
7
|
-
import { rankEndpoints } from "./_ranking.js";
|
|
8
|
-
import { FALLBACK_MODEL_IDS, modelsForClass } from "./fallback.js";
|
|
9
|
-
import { endpointSupportsTools } from "./policy.js";
|
|
10
|
-
/** Rank a catalogue against a model query, best-first. */
|
|
11
|
-
export function lookupModels(endpoints, query = {}, policy = {}) {
|
|
12
|
-
return rankEndpoints(endpoints, query, policy);
|
|
13
|
-
}
|
|
14
|
-
/** Resolve the closest model id in one catalogue snapshot. */
|
|
15
|
-
export function rankModelId(endpoints, search, options = {}, policy = {}) {
|
|
16
|
-
const [top] = lookupModels(endpoints, {
|
|
17
|
-
search,
|
|
18
|
-
limit: 1,
|
|
19
|
-
...(options.threshold !== undefined ? { threshold: options.threshold } : {}),
|
|
20
|
-
...(options.requiresTools !== undefined ? { requiresTools: options.requiresTools } : {}),
|
|
21
|
-
}, policy);
|
|
22
|
-
if (!top)
|
|
23
|
-
return { modelId: search, matched: false };
|
|
24
|
-
return { modelId: top.endpoint.name, matched: true, score: top.score };
|
|
25
|
-
}
|
|
26
|
-
/** Resolve a single model id from a catalogue and caller intent. */
|
|
27
|
-
export function resolveModel(endpoints, input = {}, policy = {}) {
|
|
28
|
-
if (input.explicit !== undefined) {
|
|
29
|
-
if (input.fuzzy === false) {
|
|
30
|
-
if (input.requiresTools)
|
|
31
|
-
assertToolSupport(endpoints, input.explicit);
|
|
32
|
-
return { modelId: input.explicit, source: "explicit" };
|
|
33
|
-
}
|
|
34
|
-
const [top] = lookupModels(endpoints, buildQuery(input, input.explicit), policy);
|
|
35
|
-
if (input.requiresTools && !top) {
|
|
36
|
-
throw new Error(`No tool-capable model matches "${input.explicit}"`);
|
|
37
|
-
}
|
|
38
|
-
return { modelId: top?.endpoint.name ?? input.explicit, source: "fuzzy-match" };
|
|
39
|
-
}
|
|
40
|
-
if (input.modelClass === undefined && input.fallbacks && input.fallbacks.length > 0) {
|
|
41
|
-
const present = new Set(endpoints
|
|
42
|
-
.filter((endpoint) => !input.requiresTools || endpointSupportsTools(endpoint))
|
|
43
|
-
.map((endpoint) => endpoint.name));
|
|
44
|
-
const pinned = input.fallbacks.find((id) => present.has(id));
|
|
45
|
-
if (pinned)
|
|
46
|
-
return { modelId: pinned, source: "fallback" };
|
|
47
|
-
}
|
|
48
|
-
const source = input.modelClass !== undefined ? "class" : "fallback";
|
|
49
|
-
const [top] = lookupModels(endpoints, buildQuery(input, undefined), policy);
|
|
50
|
-
if (top)
|
|
51
|
-
return { modelId: top.endpoint.name, source };
|
|
52
|
-
if (input.liveOnly) {
|
|
53
|
-
throw new Error("No matching live Model Serving endpoint is available");
|
|
54
|
-
}
|
|
55
|
-
const floorSource = input.modelClass !== undefined ? modelsForClass(input.modelClass) : (input.fallbacks ?? []);
|
|
56
|
-
const floor = object.sequence(floorSource).concat(FALLBACK_MODEL_IDS).distinct().toArray();
|
|
57
|
-
if (input.requiresTools) {
|
|
58
|
-
const available = new Set(endpoints.filter(endpointSupportsTools).map((endpoint) => endpoint.name));
|
|
59
|
-
const selected = floor.find((id) => available.has(id));
|
|
60
|
-
if (!selected)
|
|
61
|
-
throw new Error("No tool-capable model is available");
|
|
62
|
-
return { modelId: selected, source };
|
|
63
|
-
}
|
|
64
|
-
return { modelId: pickFirstAvailable(floor, endpoints), source };
|
|
65
|
-
}
|
|
66
|
-
function buildQuery(input, search) {
|
|
67
|
-
return {
|
|
68
|
-
...(search !== undefined ? { search } : {}),
|
|
69
|
-
...(input.modelClass !== undefined ? { modelClass: input.modelClass } : {}),
|
|
70
|
-
...(input.requiresTools !== undefined ? { requiresTools: input.requiresTools } : {}),
|
|
71
|
-
...(input.threshold !== undefined ? { threshold: input.threshold } : {}),
|
|
72
|
-
limit: 1,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
function assertToolSupport(endpoints, modelId) {
|
|
76
|
-
const endpoint = endpoints.find((candidate) => candidate.name === modelId);
|
|
77
|
-
if (!endpoint || !endpointSupportsTools(endpoint)) {
|
|
78
|
-
throw new Error(`Model "${modelId}" does not support function tools`);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
function pickFirstAvailable(candidates, endpoints) {
|
|
82
|
-
const present = new Set(endpoints.map((endpoint) => endpoint.name));
|
|
83
|
-
for (const candidate of candidates) {
|
|
84
|
-
if (present.has(candidate))
|
|
85
|
-
return candidate;
|
|
86
|
-
}
|
|
87
|
-
return candidates[0] ?? FALLBACK_MODEL_IDS[0];
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3NlbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fc2VsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxPQUFPLEtBQUssTUFBTSxNQUFNLCtCQUErQixDQUFDO0FBV3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFRcEQsMERBQTBEO0FBQzFELE1BQU0sVUFBVSxZQUFZLENBQzFCLFNBQTRDLEVBQzVDLFFBQW9CLEVBQUUsRUFDdEIsU0FBc0MsRUFBRTtJQUV4QyxPQUFPLGFBQWEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLFdBQVcsQ0FDekIsU0FBNEMsRUFDNUMsTUFBYyxFQUNkLFVBQStCLEVBQUUsRUFDakMsU0FBc0MsRUFBRTtJQUV4QyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsWUFBWSxDQUN4QixTQUFTLEVBQ1Q7UUFDRSxNQUFNO1FBQ04sS0FBSyxFQUFFLENBQUM7UUFDUixHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVFLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDekYsRUFDRCxNQUFNLENBQ1AsQ0FBQztJQUNGLElBQUksQ0FBQyxHQUFHO1FBQUUs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QyxDQUFFLENBQUM7QUFDakQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUnVudGltZS1pbmRlcGVuZGVudCBtb2RlbCByYW5raW5nIGFuZCBzZWxlY3Rpb24uXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgKiBhcyBvYmplY3QgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvb2JqZWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIE1vZGVsUXVlcnksXG4gIFJhbmtlZE1vZGVsLFxuICBSZXNvbHZlZE1vZGVsLFxuICBSZXNvbHZlZE1vZGVsU2VsZWN0aW9uLFxuICBSZXNvbHZlTW9kZWxJbnB1dCxcbiAgUmVzb2x2ZU1vZGVsT3B0aW9ucyxcbiAgU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsL2NvbnRyYWN0c1wiO1xuXG5pbXBvcnQgeyByYW5rRW5kcG9pbnRzIH0gZnJvbSBcIi4vX3JhbmtpbmcudHNcIjtcbmltcG9ydCB7IEZBTExCQUNLX01PREVMX0lEUywgbW9kZWxzRm9yQ2xhc3MgfSBmcm9tIFwiLi9mYWxsYmFjay50c1wiO1xuaW1wb3J0IHsgZW5kcG9pbnRTdXBwb3J0c1Rvb2xzIH0gZnJvbSBcIi4vcG9saWN5LnRzXCI7XG5cbi8qKiBJbi1wcm9jZXNzIG1vZGVsLXJhbmtpbmcgcG9saWN5IGNvbnRyb2xzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFNlbGVjdGlvblBvbGljeU9wdGlvbnMge1xuICAvKiogUHJlZmVyIERhdGFicmlja3Mgc3lzdGVtIGVuZHBvaW50cyBpbnN0ZWFkIG9mIGV4Y2x1ZGluZyB0aGVtIGZyb20gbm9uLWV4YWN0IHNlbGVjdGlvbi4gKi9cbiAgcmVhZG9ubHkgcHJlZmVyU3lzdGVtTW9kZWxzPzogYm9vbGVhbjtcbn1cblxuLyoqIFJhbmsgYSBjYXRhbG9ndWUgYWdhaW5zdCBhIG1vZGVsIHF1ZXJ5LCBiZXN0LWZpcnN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cE1vZGVscyhcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIHF1ZXJ5OiBNb2RlbFF1ZXJ5ID0ge30sXG4gIHBvbGljeTogTW9kZWxTZWxlY3Rpb25Qb2xpY3lPcHRpb25zID0ge30sXG4pOiBSYW5rZWRNb2RlbFtdIHtcbiAgcmV0dXJuIHJhbmtFbmRwb2ludHMoZW5kcG9pbnRzLCBxdWVyeSwgcG9saWN5KTtcbn1cblxuLyoqIFJlc29sdmUgdGhlIGNsb3Nlc3QgbW9kZWwgaWQgaW4gb25lIGNhdGFsb2d1ZSBzbmFwc2hvdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5rTW9kZWxJZChcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIHNlYXJjaDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXNvbHZlTW9kZWxPcHRpb25zID0ge30sXG4gIHBvbGljeTogTW9kZWxTZWxlY3Rpb25Qb2xpY3lPcHRpb25zID0ge30sXG4pOiBSZXNvbHZlZE1vZGVsIHtcbiAgY29uc3QgW3RvcF0gPSBsb29rdXBNb2RlbHMoXG4gICAgZW5kcG9pbnRzLFxuICAgIHtcbiAgICAgIHNlYXJjaCxcbiAgICAgIGxpbWl0OiAxLFxuICAgICAgLi4uKG9wdGlvbnMudGhyZXNob2xkICE9PSB1bmRlZmluZWQgPyB7IHRocmVzaG9sZDogb3B0aW9ucy50aHJlc2hvbGQgfSA6IHt9KSxcbiAgICAgIC4uLihvcHRpb25zLnJlcXVpcmVzVG9vbHMgIT09IHVuZGVmaW5lZCA/IHsgcmVxdWlyZXNUb29sczogb3B0aW9ucy5yZXF1aXJlc1Rvb2xzIH0gOiB7fSksXG4gICAgfSxcbiAgICBwb2xpY3ksXG4gICk7XG4gIGlmICghdG9wKSByZXR1cm4geyBtb2RlbElkOiBzZWFyY2gsIG1hdGNoZWQ6IGZhbHNlIH07XG4gIHJldHVybiB7IG1vZGVsSWQ6IHRvcC5lbmRwb2ludC5uYW1lLCBtYXRjaGVkOiB0cnVlLCBzY29yZTogdG9wLnNjb3JlIH07XG59XG5cbi8qKiBSZXNvbHZlIGEgc2luZ2xlIG1vZGVsIGlkIGZyb20gYSBjYXRhbG9ndWUgYW5kIGNhbGxlciBpbnRlbnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1vZGVsKFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgaW5wdXQ6IFJlc29sdmVNb2RlbElucHV0ID0ge30sXG4gIHBvbGljeTogTW9kZWxTZWxlY3Rpb25Qb2xpY3lPcHRpb25zID0ge30sXG4pOiBSZXNvbHZlZE1vZGVsU2VsZWN0aW9uIHtcbiAgaWYgKGlucHV0LmV4cGxpY2l0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoaW5wdXQuZnV6enkgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoaW5wdXQucmVxdWlyZXNUb29scykgYXNzZXJ0VG9vbFN1cHBvcnQoZW5kcG9pbnRzLCBpbnB1dC5leHBsaWNpdCk7XG4gICAgICByZXR1cm4geyBtb2RlbElkOiBpbnB1dC5leHBsaWNpdCwgc291cmNlOiBcImV4cGxpY2l0XCIgfTtcbiAgICB9XG4gICAgY29uc3QgW3RvcF0gPSBsb29rdXBNb2RlbHMoZW5kcG9pbnRzLCBidWlsZFF1ZXJ5KGlucHV0LCBpbnB1dC5leHBsaWNpdCksIHBvbGljeSk7XG4gICAgaWYgKGlucHV0LnJlcXVpcmVzVG9vbHMgJiYgIXRvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB0b29sLWNhcGFibGUgbW9kZWwgbWF0Y2hlcyBcIiR7aW5wdXQuZXhwbGljaXR9XCJgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbW9kZWxJZDogdG9wPy5lbmRwb2ludC5uYW1lID8/IGlucHV0LmV4cGxpY2l0LCBzb3VyY2U6IFwiZnV6enktbWF0Y2hcIiB9O1xuICB9XG5cbiAgaWYgKGlucHV0Lm1vZGVsQ2xhc3MgPT09IHVuZGVmaW5lZCAmJiBpbnB1dC5mYWxsYmFja3MgJiYgaW5wdXQuZmFsbGJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBwcmVzZW50ID0gbmV3IFNldChcbiAgICAgIGVuZHBvaW50c1xuICAgICAgICAuZmlsdGVyKChlbmRwb2ludCkgPT4gIWlucHV0LnJlcXVpcmVzVG9vbHMgfHwgZW5kcG9pbnRTdXBwb3J0c1Rvb2xzKGVuZHBvaW50KSlcbiAgICAgICAgLm1hcCgoZW5kcG9pbnQpID0+IGVuZHBvaW50Lm5hbWUpLFxuICAgICk7XG4gICAgY29uc3QgcGlubmVkID0gaW5wdXQuZmFsbGJhY2tzLmZpbmQoKGlkKSA9PiBwcmVzZW50LmhhcyhpZCkpO1xuICAgIGlmIChwaW5uZWQpIHJldHVybiB7IG1vZGVsSWQ6IHBpbm5lZCwgc291cmNlOiBcImZhbGxiYWNrXCIgfTtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZSA9IGlucHV0Lm1vZGVsQ2xhc3MgIT09IHVuZGVmaW5lZCA/IFwiY2xhc3NcIiA6IFwiZmFsbGJhY2tcIjtcbiAgY29uc3QgW3RvcF0gPSBsb29rdXBNb2RlbHMoZW5kcG9pbnRzLCBidWlsZFF1ZXJ5KGlucHV0LCB1bmRlZmluZWQpLCBwb2xpY3kpO1xuICBpZiAodG9wKSByZXR1cm4geyBtb2RlbElkOiB0b3AuZW5kcG9pbnQubmFtZSwgc291cmNlIH07XG5cbiAgaWYgKGlucHV0LmxpdmVPbmx5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbWF0Y2hpbmcgbGl2ZSBNb2RlbCBTZXJ2aW5nIGVuZHBvaW50IGlzIGF2YWlsYWJsZVwiKTtcbiAgfVxuXG4gIGNvbnN0IGZsb29yU291cmNlID1cbiAgICBpbnB1dC5tb2RlbENsYXNzICE9PSB1bmRlZmluZWQgPyBtb2RlbHNGb3JDbGFzcyhpbnB1dC5tb2RlbENsYXNzKSA6IChpbnB1dC5mYWxsYmFja3MgPz8gW10pO1xuICBjb25zdCBmbG9vciA9IG9iamVjdC5zZXF1ZW5jZShmbG9vclNvdXJjZSkuY29uY2F0KEZBTExCQUNLX01PREVMX0lEUykuZGlzdGluY3QoKS50b0FycmF5KCk7XG4gIGlmIChpbnB1dC5yZXF1aXJlc1Rvb2xzKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gbmV3IFNldChcbiAgICAgIGVuZHBvaW50cy5maWx0ZXIoZW5kcG9pbnRTdXBwb3J0c1Rvb2xzKS5tYXAoKGVuZHBvaW50KSA9PiBlbmRwb2ludC5uYW1lKSxcbiAgICApO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gZmxvb3IuZmluZCgoaWQpID0+IGF2YWlsYWJsZS5oYXMoaWQpKTtcbiAgICBpZiAoIXNlbGVjdGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJObyB0b29sLWNhcGFibGUgbW9kZWwgaXMgYXZhaWxhYmxlXCIpO1xuICAgIHJldHVybiB7IG1vZGVsSWQ6IHNlbGVjdGVkLCBzb3VyY2UgfTtcbiAgfVxuICByZXR1cm4geyBtb2RlbElkOiBwaWNrRmlyc3RBdmFpbGFibGUoZmxvb3IsIGVuZHBvaW50cyksIHNvdXJjZSB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFF1ZXJ5KGlucHV0OiBSZXNvbHZlTW9kZWxJbnB1dCwgc2VhcmNoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBNb2RlbFF1ZXJ5IHtcbiAgcmV0dXJuIHtcbiAgICAuLi4oc2VhcmNoICE9PSB1bmRlZmluZWQgPyB7IHNlYXJjaCB9IDoge30pLFxuICAgIC4uLihpbnB1dC5tb2RlbENsYXNzICE9PSB1bmRlZmluZWQgPyB7IG1vZGVsQ2xhc3M6IGlucHV0Lm1vZGVsQ2xhc3MgfSA6IHt9KSxcbiAgICAuLi4oaW5wdXQucmVxdWlyZXNUb29scyAhPT0gdW5kZWZpbmVkID8geyByZXF1aXJlc1Rvb2xzOiBpbnB1dC5yZXF1aXJlc1Rvb2xzIH0gOiB7fSksXG4gICAgLi4uKGlucHV0LnRocmVzaG9sZCAhPT0gdW5kZWZpbmVkID8geyB0aHJlc2hvbGQ6IGlucHV0LnRocmVzaG9sZCB9IDoge30pLFxuICAgIGxpbWl0OiAxLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhc3NlcnRUb29sU3VwcG9ydChlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSwgbW9kZWxJZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGVuZHBvaW50ID0gZW5kcG9pbnRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IG1vZGVsSWQpO1xuICBpZiAoIWVuZHBvaW50IHx8ICFlbmRwb2ludFN1cHBvcnRzVG9vbHMoZW5kcG9pbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCBcIiR7bW9kZWxJZH1cIiBkb2VzIG5vdCBzdXBwb3J0IGZ1bmN0aW9uIHRvb2xzYCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGlja0ZpcnN0QXZhaWxhYmxlKFxuICBjYW5kaWRhdGVzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4pOiBzdHJpbmcge1xuICBjb25zdCBwcmVzZW50ID0gbmV3IFNldChlbmRwb2ludHMubWFwKChlbmRwb2ludCkgPT4gZW5kcG9pbnQubmFtZSkpO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKHByZXNlbnQuaGFzKGNhbmRpZGF0ZSkpIHJldHVybiBjYW5kaWRhdGU7XG4gIH1cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF0gPz8gRkFMTEJBQ0tfTU9ERUxfSURTWzBdITtcbn1cbiJdfQ==
|