@dbx-tools/model 0.9.21 → 0.9.29
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 +61 -10
- package/index.ts +12 -2
- package/lib/exports.d.ts +1 -0
- package/lib/exports.js +2 -0
- package/lib/index.d.ts +12 -2
- package/lib/index.js +9 -2
- package/lib/src/_metadata-contract.d.ts +42 -0
- package/lib/src/_metadata-contract.js +11 -0
- package/lib/src/_metadata-generator.d.ts +7 -0
- package/lib/src/_metadata-generator.js +182 -0
- package/lib/src/_ranking.d.ts +20 -0
- package/lib/src/_ranking.js +226 -0
- package/lib/src/_selection.d.ts +23 -0
- package/lib/src/_selection.js +95 -0
- package/lib/src/classes.d.ts +2 -2
- package/lib/src/classes.js +10 -8
- package/lib/src/classify.d.ts +130 -0
- package/lib/src/classify.js +283 -0
- package/lib/src/fallback.d.ts +4 -4
- package/lib/src/fallback.js +7 -7
- package/lib/src/generated/model-capabilities.json +90 -0
- package/lib/src/generated/model-rate-limits.json +342 -0
- package/lib/src/generated/retired-models.json +32 -0
- package/lib/src/invoke.js +3 -3
- package/lib/src/metadata.d.ts +33 -0
- package/lib/src/metadata.js +120 -0
- package/lib/src/model-catalog.d.ts +4 -4
- package/lib/src/model-catalog.js +19 -24
- package/lib/src/model-client.d.ts +67 -0
- package/lib/src/model-client.js +181 -0
- package/lib/src/policy.d.ts +14 -8
- package/lib/src/policy.js +173 -14
- package/lib/src/python.d.ts +2 -0
- package/lib/src/python.js +3 -0
- package/lib/src/resolve.d.ts +10 -143
- package/lib/src/resolve.js +11 -196
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -5
- package/src/_metadata-contract.ts +56 -0
- package/src/_metadata-generator.ts +199 -0
- package/src/_ranking.ts +260 -0
- package/src/_selection.ts +141 -0
- package/src/classes.ts +11 -7
- package/src/classify.ts +324 -0
- package/src/fallback.ts +11 -7
- package/src/generated/model-capabilities.json +90 -0
- package/src/generated/model-rate-limits.json +342 -0
- package/src/generated/retired-models.json +32 -0
- package/src/invoke.ts +2 -2
- package/src/metadata.ts +189 -0
- package/src/model-catalog.ts +26 -28
- package/src/model-client.ts +311 -0
- package/src/policy.ts +176 -19
- package/src/python.ts +2 -0
- package/src/resolve.ts +24 -270
- package/._LICENSE +0 -0
- package/._README.md +0 -0
- package/._index.ts +0 -0
- package/._package.json +0 -0
- package/lib/._index.d.ts +0 -0
- package/lib/._index.js +0 -0
- package/lib/._tsconfig.tsbuildinfo +0 -0
- package/lib/src/.__native.d.ts +0 -0
- package/lib/src/.__native.js +0 -0
- package/lib/src/._classes.d.ts +0 -0
- package/lib/src/._classes.js +0 -0
- package/lib/src/._fallback.d.ts +0 -0
- package/lib/src/._fallback.js +0 -0
- package/lib/src/._invoke.d.ts +0 -0
- package/lib/src/._invoke.js +0 -0
- package/lib/src/._model-catalog.d.ts +0 -0
- package/lib/src/._model-catalog.js +0 -0
- package/lib/src/._policy.d.ts +0 -0
- package/lib/src/._policy.js +0 -0
- package/lib/src/._resolve.d.ts +0 -0
- package/lib/src/._resolve.js +0 -0
- package/lib/src/_native.d.ts +0 -14
- package/lib/src/_native.js +0 -124
- package/src/.__native.ts +0 -0
- package/src/._classes.ts +0 -0
- package/src/._fallback.ts +0 -0
- package/src/._invoke.ts +0 -0
- package/src/._model-catalog.ts +0 -0
- package/src/._policy.ts +0 -0
- package/src/._resolve.ts +0 -0
- package/src/_native.ts +0 -174
package/lib/src/policy.js
CHANGED
|
@@ -1,26 +1,185 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
/** TypeScript-owned model-family and serving capability policy. */
|
|
2
|
+
import { ModelClass, } from "@dbx-tools/shared-model/contracts";
|
|
3
|
+
import { supportsToolsByFamily } from "./classify.js";
|
|
4
|
+
const FAMILIES = [
|
|
5
|
+
"bge",
|
|
6
|
+
"claude",
|
|
7
|
+
"deepseek",
|
|
8
|
+
"gemini",
|
|
9
|
+
"gemma",
|
|
10
|
+
"glm",
|
|
11
|
+
"gpt",
|
|
12
|
+
"grok",
|
|
13
|
+
"gte",
|
|
14
|
+
"inkling",
|
|
15
|
+
"kimi",
|
|
16
|
+
"llama",
|
|
17
|
+
"qwen",
|
|
18
|
+
];
|
|
19
|
+
const STANDARD = ["low", "medium", "high"];
|
|
20
|
+
const GPT_5_6 = ["none", "low", "medium", "high", "xhigh", "max"];
|
|
21
|
+
const GPT_5_5_PRO = ["medium", "high", "xhigh"];
|
|
22
|
+
const CLAUDE = ["none", "minimal", "low", "medium", "high", "xhigh", "max"];
|
|
23
|
+
const GEMINI = ["minimal", "low", "medium", "high"];
|
|
24
|
+
/** Return the normalized family parsed from a model identity. */
|
|
9
25
|
export function modelFamily(name) {
|
|
10
|
-
return
|
|
26
|
+
return parseModelName(name)?.family;
|
|
27
|
+
}
|
|
28
|
+
/** Normalize a recognized model identity into family, version, and variant tokens. */
|
|
29
|
+
export function modelSearchQuery(name) {
|
|
30
|
+
const parsed = parseModelName(name);
|
|
31
|
+
if (!parsed)
|
|
32
|
+
return undefined;
|
|
33
|
+
return [parsed.family, ...parsed.version.map(String), ...parsed.model].join(" ");
|
|
11
34
|
}
|
|
12
35
|
/** Return the reasoning efforts accepted by a model family. */
|
|
13
36
|
export function modelReasoningEfforts(name) {
|
|
14
|
-
|
|
37
|
+
const normalized = name.toLowerCase();
|
|
38
|
+
const parsed = parseModelName(name);
|
|
39
|
+
let efforts = [];
|
|
40
|
+
if (parsed?.family === "gpt" && parsed.version.length > 0) {
|
|
41
|
+
const [major = 0, minor = 0] = parsed.version;
|
|
42
|
+
if (major >= 5) {
|
|
43
|
+
efforts =
|
|
44
|
+
major === 5 && minor === 5 && parsed.model.includes("pro")
|
|
45
|
+
? GPT_5_5_PRO
|
|
46
|
+
: major === 5 && minor === 6
|
|
47
|
+
? GPT_5_6
|
|
48
|
+
: STANDARD;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (parsed?.family === "gpt" && parsed.model.includes("oss"))
|
|
52
|
+
efforts = STANDARD;
|
|
53
|
+
if (parsed?.family === "claude") {
|
|
54
|
+
const [major = 0, minor = 0] = parsed.version;
|
|
55
|
+
if (major > 3 || (major === 3 && minor >= 7))
|
|
56
|
+
efforts = CLAUDE;
|
|
57
|
+
}
|
|
58
|
+
if (parsed?.family === "gemini")
|
|
59
|
+
efforts = GEMINI;
|
|
60
|
+
if (normalized.includes("codex") || /(?:^|[-_./])o(?:1|3|4)(?:[-_./]|$)/i.test(name)) {
|
|
61
|
+
efforts = STANDARD;
|
|
62
|
+
}
|
|
63
|
+
return efforts;
|
|
15
64
|
}
|
|
16
|
-
/** Return whether
|
|
65
|
+
/** Return whether policy verifies a complete tool-calling round trip. */
|
|
17
66
|
export function modelSupportsTools(name) {
|
|
18
|
-
return
|
|
67
|
+
return supportsToolsByFamily(name);
|
|
19
68
|
}
|
|
20
69
|
/** Return whether a discovered endpoint can be used for a tool-calling chat. */
|
|
21
70
|
export function endpointSupportsTools(endpoint) {
|
|
22
|
-
const embedding = endpoint.task === "llm/v1/embeddings" || endpoint.class ===
|
|
71
|
+
const embedding = endpoint.task === "llm/v1/embeddings" || endpoint.class === ModelClass.Embedding;
|
|
23
72
|
const chat = !embedding && (endpoint.task === "llm/v1/chat" || endpoint.class !== undefined);
|
|
24
73
|
return chat && (endpoint.supportsTools ?? modelSupportsTools(endpoint.name));
|
|
25
74
|
}
|
|
26
|
-
|
|
75
|
+
/** Return whether a model requires Databricks' native Responses endpoint. */
|
|
76
|
+
export function isResponsesOnly(name) {
|
|
77
|
+
if (name.toLowerCase().includes("codex"))
|
|
78
|
+
return true;
|
|
79
|
+
const parsed = parseModelName(name);
|
|
80
|
+
if (!parsed || parsed.family !== "gpt" || parsed.model.includes("oss"))
|
|
81
|
+
return false;
|
|
82
|
+
const [major = 0, minor = 0] = parsed.version;
|
|
83
|
+
return major > 5 || (major === 5 && minor >= 4);
|
|
84
|
+
}
|
|
85
|
+
/** Return the Databricks inference protocol required by a model. */
|
|
86
|
+
export function modelServingApi(name) {
|
|
87
|
+
return isResponsesOnly(name) ? "responses" : "chat";
|
|
88
|
+
}
|
|
89
|
+
/** Return the Chat Completions effort required when function tools are present. */
|
|
90
|
+
export function chatToolReasoningEffort(name) {
|
|
91
|
+
const parsed = parseModelName(name);
|
|
92
|
+
if (!parsed || parsed.family !== "gpt")
|
|
93
|
+
return undefined;
|
|
94
|
+
const [major = 0, minor = 0] = parsed.version;
|
|
95
|
+
return major === 5 && minor === 6 ? "none" : undefined;
|
|
96
|
+
}
|
|
97
|
+
/** Derive provider-specific model names from a Databricks model identity. */
|
|
98
|
+
export function modelServiceNames(name) {
|
|
99
|
+
const parsed = parseModelName(name);
|
|
100
|
+
if (!parsed)
|
|
101
|
+
return {};
|
|
102
|
+
const version = parsed.version.join(".");
|
|
103
|
+
const suffix = parsed.model.length ? `-${parsed.model.join("-")}` : "";
|
|
104
|
+
switch (parsed.family) {
|
|
105
|
+
case "gpt":
|
|
106
|
+
return parsed.model.includes("oss") ? {} : { openai: `gpt-${version}${suffix}` };
|
|
107
|
+
case "claude": {
|
|
108
|
+
const [variant, ...rest] = parsed.model;
|
|
109
|
+
return variant
|
|
110
|
+
? { anthropic: `claude-${variant}-${version}${rest.length ? `-${rest.join("-")}` : ""}` }
|
|
111
|
+
: {};
|
|
112
|
+
}
|
|
113
|
+
case "gemini":
|
|
114
|
+
case "gemma":
|
|
115
|
+
return { google: `${parsed.family}-${version}${suffix}` };
|
|
116
|
+
case "glm":
|
|
117
|
+
return { zhipu: `glm-${version}${suffix}` };
|
|
118
|
+
case "grok":
|
|
119
|
+
return { xai: `grok-${version}${suffix}` };
|
|
120
|
+
case "llama":
|
|
121
|
+
return { meta: `llama-${version}${suffix}` };
|
|
122
|
+
case "qwen":
|
|
123
|
+
return { alibaba: `qwen${version}${suffix}` };
|
|
124
|
+
case "deepseek":
|
|
125
|
+
return { deepseek: `deepseek-v${parsed.version[0] ?? ""}${suffix}` };
|
|
126
|
+
case "kimi":
|
|
127
|
+
return { moonshot: `kimi-k${parsed.version[0] ?? ""}${suffix}` };
|
|
128
|
+
default:
|
|
129
|
+
return {};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function parseModelName(name) {
|
|
133
|
+
const tokens = name.toLowerCase().match(/[a-z0-9]+/g) ?? [];
|
|
134
|
+
let familyIndex = -1;
|
|
135
|
+
let family;
|
|
136
|
+
for (let index = 0; index < tokens.length; index += 1) {
|
|
137
|
+
const token = tokens[index];
|
|
138
|
+
const compactQwen = /^qwen(\d+)$/.exec(token);
|
|
139
|
+
if (compactQwen) {
|
|
140
|
+
familyIndex = index;
|
|
141
|
+
family = "qwen";
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
if (FAMILIES.includes(token)) {
|
|
145
|
+
familyIndex = index;
|
|
146
|
+
family = token;
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (!family || familyIndex < 0)
|
|
151
|
+
return undefined;
|
|
152
|
+
const remainder = tokens.slice(familyIndex + 1);
|
|
153
|
+
const numeric = (value) => /^\d+$/.test(value);
|
|
154
|
+
let versionStart = remainder.findIndex(numeric);
|
|
155
|
+
if (family === "qwen" && /^qwen\d+$/.test(tokens[familyIndex])) {
|
|
156
|
+
versionStart = 0;
|
|
157
|
+
remainder.unshift(tokens[familyIndex].slice(4));
|
|
158
|
+
}
|
|
159
|
+
if (family === "deepseek") {
|
|
160
|
+
const prefixed = remainder.findIndex((value) => /^v\d+$/.test(value));
|
|
161
|
+
if (prefixed >= 0)
|
|
162
|
+
remainder[prefixed] = remainder[prefixed].slice(1);
|
|
163
|
+
versionStart = remainder.findIndex(numeric);
|
|
164
|
+
}
|
|
165
|
+
if (family === "kimi") {
|
|
166
|
+
const prefixed = remainder.findIndex((value) => /^k\d+$/.test(value));
|
|
167
|
+
if (prefixed >= 0)
|
|
168
|
+
remainder[prefixed] = remainder[prefixed].slice(1);
|
|
169
|
+
versionStart = remainder.findIndex(numeric);
|
|
170
|
+
}
|
|
171
|
+
if (versionStart < 0)
|
|
172
|
+
return { family, version: [], model: remainder };
|
|
173
|
+
const version = [];
|
|
174
|
+
let cursor = versionStart;
|
|
175
|
+
while (cursor < remainder.length && version.length < 2 && numeric(remainder[cursor])) {
|
|
176
|
+
version.push(Number(remainder[cursor]));
|
|
177
|
+
cursor += 1;
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
family,
|
|
181
|
+
version,
|
|
182
|
+
model: [...remainder.slice(0, versionStart), ...remainder.slice(cursor)],
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtRUFBbUU7QUFFbkUsT0FBTyxFQUNMLFVBQVUsR0FHWCxNQUFNLG1DQUFtQyxDQUFDO0FBRTNDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV0RCxNQUFNLFFBQVEsR0FBRztJQUNmLEtBQUs7SUFDTCxRQUFRO0lBQ1IsVUFBVTtJQUNWLFFBQVE7SUFDUixPQUFPO0lBQ1AsS0FBSztJQUNMLEtBQUs7SUFDTCxNQUFNO0lBQ04sS0FBSztJQUNMLFNBQVM7SUFDVCxNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07Q0FDRSxDQUFDO0FBRVgsTUFBTSxRQUFRLEdBQXNCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5RCxNQUFNLE9BQU8sR0FBc0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3JGLE1BQU0sV0FBVyxHQUFzQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbkUsTUFBTSxNQUFNLEdBQXNCLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDL0YsTUFBTSxNQUFNLEdBQXNCLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFRdkUsaUVBQWlFO0FBQ2pFLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBWTtJQUN0QyxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7QUFDdEMsQ0FBQztBQUVELHNGQUFzRjtBQUN0RixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBWTtJQUMzQyxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM5QixPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuRixDQUFDO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxJQUFZO0lBQ2hELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN0QyxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsSUFBSSxPQUFPLEdBQXNCLEVBQUUsQ0FBQztJQUNwQyxJQUFJLE1BQU0sRUFBRSxNQUFNLEtBQUssS0FBSyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFELE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQzlDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2YsT0FBTztnQkFDTCxLQUFLLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUN4RCxDQUFDLENBQUMsV0FBVztvQkFDYixDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQzt3QkFDMUIsQ0FBQyxDQUFDLE9BQU87d0JBQ1QsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksTUFBTSxFQUFFLE1BQU0sS0FBSyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxHQUFHLFFBQVEsQ0FBQztJQUNqRixJQUFJLE1BQU0sRUFBRSxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDOUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUNqRSxDQUFDO0lBQ0QsSUFBSSxNQUFNLEVBQUUsTUFBTSxLQUFLLFFBQVE7UUFBRSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ2xELElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxxQ0FBcUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNyRixPQUFPLEdBQUcsUUFBUSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxJQUFZO0lBQzdDLE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixNQUFNLFVBQVUscUJBQXFCLENBQUMsUUFBZ0M7SUFDcEUsTUFBTSxTQUFTLEdBQ2IsUUFBUSxDQUFDLElBQUksS0FBSyxtQkFBbUIsSUFBSSxRQUFRLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDbkYsTUFBTSxJQUFJLEdBQUcsQ0FBQyxTQUFTLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLGFBQWEsSUFBSSxRQUFRLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQzdGLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBWTtJQUMxQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDckYsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDOUMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUVELG9FQUFvRTtBQUNwRSxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQVk7SUFDMUMsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3RELENBQUM7QUFFRCxtRkFBbUY7QUFDbkYsTUFBTSxVQUFVLHVCQUF1QixDQUFDLElBQVk7SUFDbEQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDekQsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDOUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3pELENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsTUFBTSxVQUFVLGlCQUFpQixDQUFDLElBQVk7SUFDNUMsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDdkIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3ZFLFFBQVEsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RCLEtBQUssS0FBSztZQUNSLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxPQUFPLEdBQUcsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUNuRixLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDZCxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUN4QyxPQUFPLE9BQU87Z0JBQ1osQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsT0FBTyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7Z0JBQ3pGLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDVCxDQUFDO1FBQ0QsS0FBSyxRQUFRLENBQUM7UUFDZCxLQUFLLE9BQU87WUFDVixPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxPQUFPLEdBQUcsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUM1RCxLQUFLLEtBQUs7WUFDUixPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sT0FBTyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDOUMsS0FBSyxNQUFNO1lBQ1QsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLE9BQU8sR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQzdDLEtBQUssT0FBTztZQUNWLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxPQUFPLEdBQUcsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUMvQyxLQUFLLE1BQU07WUFDVCxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sT0FBTyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDaEQsS0FBSyxVQUFVO1lBQ2IsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDdkUsS0FBSyxNQUFNO1lBQ1QsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDbkU7WUFDRSxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsSUFBWTtJQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1RCxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNyQixJQUFJLE1BQTZDLENBQUM7SUFDbEQsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3RELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUUsQ0FBQztRQUM3QixNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUNwQixNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ2hCLE1BQU07UUFDUixDQUFDO1FBQ0QsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQWtDLENBQUMsRUFBRSxDQUFDO1lBQzFELFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDcEIsTUFBTSxHQUFHLEtBQWtDLENBQUM7WUFDNUMsTUFBTTtRQUNSLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxXQUFXLEdBQUcsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2pELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZELElBQUksWUFBWSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBRSxDQUFDLEVBQUUsQ0FBQztRQUNoRSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxJQUFJLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUMxQixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxRQUFRLElBQUksQ0FBQztZQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLFlBQVksR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUN0QixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxRQUFRLElBQUksQ0FBQztZQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLFlBQVksR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFJLFlBQVksR0FBRyxDQUFDO1FBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUN2RSxNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDN0IsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDO0lBQzFCLE9BQU8sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUUsQ0FBQyxFQUFFLENBQUM7UUFDdEYsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUNELE9BQU87UUFDTCxNQUFNO1FBQ04sT0FBTztRQUNQLEtBQUssRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3pFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFR5cGVTY3JpcHQtb3duZWQgbW9kZWwtZmFtaWx5IGFuZCBzZXJ2aW5nIGNhcGFiaWxpdHkgcG9saWN5LiAqL1xuXG5pbXBvcnQge1xuICBNb2RlbENsYXNzLFxuICB0eXBlIFJlYXNvbmluZ0VmZm9ydCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwvY29udHJhY3RzXCI7XG5cbmltcG9ydCB7IHN1cHBvcnRzVG9vbHNCeUZhbWlseSB9IGZyb20gXCIuL2NsYXNzaWZ5LnRzXCI7XG5cbmNvbnN0IEZBTUlMSUVTID0gW1xuICBcImJnZVwiLFxuICBcImNsYXVkZVwiLFxuICBcImRlZXBzZWVrXCIsXG4gIFwiZ2VtaW5pXCIsXG4gIFwiZ2VtbWFcIixcbiAgXCJnbG1cIixcbiAgXCJncHRcIixcbiAgXCJncm9rXCIsXG4gIFwiZ3RlXCIsXG4gIFwiaW5rbGluZ1wiLFxuICBcImtpbWlcIixcbiAgXCJsbGFtYVwiLFxuICBcInF3ZW5cIixcbl0gYXMgY29uc3Q7XG5cbmNvbnN0IFNUQU5EQVJEOiBSZWFzb25pbmdFZmZvcnRbXSA9IFtcImxvd1wiLCBcIm1lZGl1bVwiLCBcImhpZ2hcIl07XG5jb25zdCBHUFRfNV82OiBSZWFzb25pbmdFZmZvcnRbXSA9IFtcIm5vbmVcIiwgXCJsb3dcIiwgXCJtZWRpdW1cIiwgXCJoaWdoXCIsIFwieGhpZ2hcIiwgXCJtYXhcIl07XG5jb25zdCBHUFRfNV81X1BSTzogUmVhc29uaW5nRWZmb3J0W10gPSBbXCJtZWRpdW1cIiwgXCJoaWdoXCIsIFwieGhpZ2hcIl07XG5jb25zdCBDTEFVREU6IFJlYXNvbmluZ0VmZm9ydFtdID0gW1wibm9uZVwiLCBcIm1pbmltYWxcIiwgXCJsb3dcIiwgXCJtZWRpdW1cIiwgXCJoaWdoXCIsIFwieGhpZ2hcIiwgXCJtYXhcIl07XG5jb25zdCBHRU1JTkk6IFJlYXNvbmluZ0VmZm9ydFtdID0gW1wibWluaW1hbFwiLCBcImxvd1wiLCBcIm1lZGl1bVwiLCBcImhpZ2hcIl07XG5cbmludGVyZmFjZSBQYXJzZWRNb2RlbE5hbWUge1xuICBmYW1pbHk6ICh0eXBlb2YgRkFNSUxJRVMpW251bWJlcl07XG4gIHZlcnNpb246IG51bWJlcltdO1xuICBtb2RlbDogc3RyaW5nW107XG59XG5cbi8qKiBSZXR1cm4gdGhlIG5vcm1hbGl6ZWQgZmFtaWx5IHBhcnNlZCBmcm9tIGEgbW9kZWwgaWRlbnRpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxGYW1pbHkobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHBhcnNlTW9kZWxOYW1lKG5hbWUpPy5mYW1pbHk7XG59XG5cbi8qKiBOb3JtYWxpemUgYSByZWNvZ25pemVkIG1vZGVsIGlkZW50aXR5IGludG8gZmFtaWx5LCB2ZXJzaW9uLCBhbmQgdmFyaWFudCB0b2tlbnMuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxTZWFyY2hRdWVyeShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZU1vZGVsTmFtZShuYW1lKTtcbiAgaWYgKCFwYXJzZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBbcGFyc2VkLmZhbWlseSwgLi4ucGFyc2VkLnZlcnNpb24ubWFwKFN0cmluZyksIC4uLnBhcnNlZC5tb2RlbF0uam9pbihcIiBcIik7XG59XG5cbi8qKiBSZXR1cm4gdGhlIHJlYXNvbmluZyBlZmZvcnRzIGFjY2VwdGVkIGJ5IGEgbW9kZWwgZmFtaWx5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsUmVhc29uaW5nRWZmb3J0cyhuYW1lOiBzdHJpbmcpOiBSZWFzb25pbmdFZmZvcnRbXSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlTW9kZWxOYW1lKG5hbWUpO1xuICBsZXQgZWZmb3J0czogUmVhc29uaW5nRWZmb3J0W10gPSBbXTtcbiAgaWYgKHBhcnNlZD8uZmFtaWx5ID09PSBcImdwdFwiICYmIHBhcnNlZC52ZXJzaW9uLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBbbWFqb3IgPSAwLCBtaW5vciA9IDBdID0gcGFyc2VkLnZlcnNpb247XG4gICAgaWYgKG1ham9yID49IDUpIHtcbiAgICAgIGVmZm9ydHMgPVxuICAgICAgICBtYWpvciA9PT0gNSAmJiBtaW5vciA9PT0gNSAmJiBwYXJzZWQubW9kZWwuaW5jbHVkZXMoXCJwcm9cIilcbiAgICAgICAgICA/IEdQVF81XzVfUFJPXG4gICAgICAgICAgOiBtYWpvciA9PT0gNSAmJiBtaW5vciA9PT0gNlxuICAgICAgICAgICAgPyBHUFRfNV82XG4gICAgICAgICAgICA6IFNUQU5EQVJEO1xuICAgIH1cbiAgfVxuICBpZiAocGFyc2VkPy5mYW1pbHkgPT09IFwiZ3B0XCIgJiYgcGFyc2VkLm1vZGVsLmluY2x1ZGVzKFwib3NzXCIpKSBlZmZvcnRzID0gU1RBTkRBUkQ7XG4gIGlmIChwYXJzZWQ/LmZhbWlseSA9PT0gXCJjbGF1ZGVcIikge1xuICAgIGNvbnN0IFttYWpvciA9IDAsIG1pbm9yID0gMF0gPSBwYXJzZWQudmVyc2lvbjtcbiAgICBpZiAobWFqb3IgPiAzIHx8IChtYWpvciA9PT0gMyAmJiBtaW5vciA+PSA3KSkgZWZmb3J0cyA9IENMQVVERTtcbiAgfVxuICBpZiAocGFyc2VkPy5mYW1pbHkgPT09IFwiZ2VtaW5pXCIpIGVmZm9ydHMgPSBHRU1JTkk7XG4gIGlmIChub3JtYWxpemVkLmluY2x1ZGVzKFwiY29kZXhcIikgfHwgLyg/Ol58Wy1fLi9dKW8oPzoxfDN8NCkoPzpbLV8uL118JCkvaS50ZXN0KG5hbWUpKSB7XG4gICAgZWZmb3J0cyA9IFNUQU5EQVJEO1xuICB9XG4gIHJldHVybiBlZmZvcnRzO1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgcG9saWN5IHZlcmlmaWVzIGEgY29tcGxldGUgdG9vbC1jYWxsaW5nIHJvdW5kIHRyaXAuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxTdXBwb3J0c1Rvb2xzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gc3VwcG9ydHNUb29sc0J5RmFtaWx5KG5hbWUpO1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgYSBkaXNjb3ZlcmVkIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBhIHRvb2wtY2FsbGluZyBjaGF0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuZHBvaW50U3VwcG9ydHNUb29scyhlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSk6IGJvb2xlYW4ge1xuICBjb25zdCBlbWJlZGRpbmcgPVxuICAgIGVuZHBvaW50LnRhc2sgPT09IFwibGxtL3YxL2VtYmVkZGluZ3NcIiB8fCBlbmRwb2ludC5jbGFzcyA9PT0gTW9kZWxDbGFzcy5FbWJlZGRpbmc7XG4gIGNvbnN0IGNoYXQgPSAhZW1iZWRkaW5nICYmIChlbmRwb2ludC50YXNrID09PSBcImxsbS92MS9jaGF0XCIgfHwgZW5kcG9pbnQuY2xhc3MgIT09IHVuZGVmaW5lZCk7XG4gIHJldHVybiBjaGF0ICYmIChlbmRwb2ludC5zdXBwb3J0c1Rvb2xzID8/IG1vZGVsU3VwcG9ydHNUb29scyhlbmRwb2ludC5uYW1lKSk7XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciBhIG1vZGVsIHJlcXVpcmVzIERhdGFicmlja3MnIG5hdGl2ZSBSZXNwb25zZXMgZW5kcG9pbnQuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXNwb25zZXNPbmx5KG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiY29kZXhcIikpIHJldHVybiB0cnVlO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZU1vZGVsTmFtZShuYW1lKTtcbiAgaWYgKCFwYXJzZWQgfHwgcGFyc2VkLmZhbWlseSAhPT0gXCJncHRcIiB8fCBwYXJzZWQubW9kZWwuaW5jbHVkZXMoXCJvc3NcIikpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgW21ham9yID0gMCwgbWlub3IgPSAwXSA9IHBhcnNlZC52ZXJzaW9uO1xuICByZXR1cm4gbWFqb3IgPiA1IHx8IChtYWpvciA9PT0gNSAmJiBtaW5vciA+PSA0KTtcbn1cblxuLyoqIFJldHVybiB0aGUgRGF0YWJyaWNrcyBpbmZlcmVuY2UgcHJvdG9jb2wgcmVxdWlyZWQgYnkgYSBtb2RlbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFNlcnZpbmdBcGkobmFtZTogc3RyaW5nKTogXCJjaGF0XCIgfCBcInJlc3BvbnNlc1wiIHtcbiAgcmV0dXJuIGlzUmVzcG9uc2VzT25seShuYW1lKSA/IFwicmVzcG9uc2VzXCIgOiBcImNoYXRcIjtcbn1cblxuLyoqIFJldHVybiB0aGUgQ2hhdCBDb21wbGV0aW9ucyBlZmZvcnQgcmVxdWlyZWQgd2hlbiBmdW5jdGlvbiB0b29scyBhcmUgcHJlc2VudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGF0VG9vbFJlYXNvbmluZ0VmZm9ydChuYW1lOiBzdHJpbmcpOiBSZWFzb25pbmdFZmZvcnQgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZU1vZGVsTmFtZShuYW1lKTtcbiAgaWYgKCFwYXJzZWQgfHwgcGFyc2VkLmZhbWlseSAhPT0gXCJncHRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgW21ham9yID0gMCwgbWlub3IgPSAwXSA9IHBhcnNlZC52ZXJzaW9uO1xuICByZXR1cm4gbWFqb3IgPT09IDUgJiYgbWlub3IgPT09IDYgPyBcIm5vbmVcIiA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIERlcml2ZSBwcm92aWRlci1zcGVjaWZpYyBtb2RlbCBuYW1lcyBmcm9tIGEgRGF0YWJyaWNrcyBtb2RlbCBpZGVudGl0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbFNlcnZpY2VOYW1lcyhuYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VNb2RlbE5hbWUobmFtZSk7XG4gIGlmICghcGFyc2VkKSByZXR1cm4ge307XG4gIGNvbnN0IHZlcnNpb24gPSBwYXJzZWQudmVyc2lvbi5qb2luKFwiLlwiKTtcbiAgY29uc3Qgc3VmZml4ID0gcGFyc2VkLm1vZGVsLmxlbmd0aCA/IGAtJHtwYXJzZWQubW9kZWwuam9pbihcIi1cIil9YCA6IFwiXCI7XG4gIHN3aXRjaCAocGFyc2VkLmZhbWlseSkge1xuICAgIGNhc2UgXCJncHRcIjpcbiAgICAgIHJldHVybiBwYXJzZWQubW9kZWwuaW5jbHVkZXMoXCJvc3NcIikgPyB7fSA6IHsgb3BlbmFpOiBgZ3B0LSR7dmVyc2lvbn0ke3N1ZmZpeH1gIH07XG4gICAgY2FzZSBcImNsYXVkZVwiOiB7XG4gICAgICBjb25zdCBbdmFyaWFudCwgLi4ucmVzdF0gPSBwYXJzZWQubW9kZWw7XG4gICAgICByZXR1cm4gdmFyaWFudFxuICAgICAgICA/IHsgYW50aHJvcGljOiBgY2xhdWRlLSR7dmFyaWFudH0tJHt2ZXJzaW9ufSR7cmVzdC5sZW5ndGggPyBgLSR7cmVzdC5qb2luKFwiLVwiKX1gIDogXCJcIn1gIH1cbiAgICAgICAgOiB7fTtcbiAgICB9XG4gICAgY2FzZSBcImdlbWluaVwiOlxuICAgIGNhc2UgXCJnZW1tYVwiOlxuICAgICAgcmV0dXJuIHsgZ29vZ2xlOiBgJHtwYXJzZWQuZmFtaWx5fS0ke3ZlcnNpb259JHtzdWZmaXh9YCB9O1xuICAgIGNhc2UgXCJnbG1cIjpcbiAgICAgIHJldHVybiB7IHpoaXB1OiBgZ2xtLSR7dmVyc2lvbn0ke3N1ZmZpeH1gIH07XG4gICAgY2FzZSBcImdyb2tcIjpcbiAgICAgIHJldHVybiB7IHhhaTogYGdyb2stJHt2ZXJzaW9ufSR7c3VmZml4fWAgfTtcbiAgICBjYXNlIFwibGxhbWFcIjpcbiAgICAgIHJldHVybiB7IG1ldGE6IGBsbGFtYS0ke3ZlcnNpb259JHtzdWZmaXh9YCB9O1xuICAgIGNhc2UgXCJxd2VuXCI6XG4gICAgICByZXR1cm4geyBhbGliYWJhOiBgcXdlbiR7dmVyc2lvbn0ke3N1ZmZpeH1gIH07XG4gICAgY2FzZSBcImRlZXBzZWVrXCI6XG4gICAgICByZXR1cm4geyBkZWVwc2VlazogYGRlZXBzZWVrLXYke3BhcnNlZC52ZXJzaW9uWzBdID8/IFwiXCJ9JHtzdWZmaXh9YCB9O1xuICAgIGNhc2UgXCJraW1pXCI6XG4gICAgICByZXR1cm4geyBtb29uc2hvdDogYGtpbWktayR7cGFyc2VkLnZlcnNpb25bMF0gPz8gXCJcIn0ke3N1ZmZpeH1gIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZU1vZGVsTmFtZShuYW1lOiBzdHJpbmcpOiBQYXJzZWRNb2RlbE5hbWUgfCB1bmRlZmluZWQge1xuICBjb25zdCB0b2tlbnMgPSBuYW1lLnRvTG93ZXJDYXNlKCkubWF0Y2goL1thLXowLTldKy9nKSA/PyBbXTtcbiAgbGV0IGZhbWlseUluZGV4ID0gLTE7XG4gIGxldCBmYW1pbHk6IFBhcnNlZE1vZGVsTmFtZVtcImZhbWlseVwiXSB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRva2Vucy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpbmRleF0hO1xuICAgIGNvbnN0IGNvbXBhY3RRd2VuID0gL15xd2VuKFxcZCspJC8uZXhlYyh0b2tlbik7XG4gICAgaWYgKGNvbXBhY3RRd2VuKSB7XG4gICAgICBmYW1pbHlJbmRleCA9IGluZGV4O1xuICAgICAgZmFtaWx5ID0gXCJxd2VuXCI7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKEZBTUlMSUVTLmluY2x1ZGVzKHRva2VuIGFzIFBhcnNlZE1vZGVsTmFtZVtcImZhbWlseVwiXSkpIHtcbiAgICAgIGZhbWlseUluZGV4ID0gaW5kZXg7XG4gICAgICBmYW1pbHkgPSB0b2tlbiBhcyBQYXJzZWRNb2RlbE5hbWVbXCJmYW1pbHlcIl07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKCFmYW1pbHkgfHwgZmFtaWx5SW5kZXggPCAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZW1haW5kZXIgPSB0b2tlbnMuc2xpY2UoZmFtaWx5SW5kZXggKyAxKTtcbiAgY29uc3QgbnVtZXJpYyA9ICh2YWx1ZTogc3RyaW5nKSA9PiAvXlxcZCskLy50ZXN0KHZhbHVlKTtcbiAgbGV0IHZlcnNpb25TdGFydCA9IHJlbWFpbmRlci5maW5kSW5kZXgobnVtZXJpYyk7XG4gIGlmIChmYW1pbHkgPT09IFwicXdlblwiICYmIC9ecXdlblxcZCskLy50ZXN0KHRva2Vuc1tmYW1pbHlJbmRleF0hKSkge1xuICAgIHZlcnNpb25TdGFydCA9IDA7XG4gICAgcmVtYWluZGVyLnVuc2hpZnQodG9rZW5zW2ZhbWlseUluZGV4XSEuc2xpY2UoNCkpO1xuICB9XG4gIGlmIChmYW1pbHkgPT09IFwiZGVlcHNlZWtcIikge1xuICAgIGNvbnN0IHByZWZpeGVkID0gcmVtYWluZGVyLmZpbmRJbmRleCgodmFsdWUpID0+IC9edlxcZCskLy50ZXN0KHZhbHVlKSk7XG4gICAgaWYgKHByZWZpeGVkID49IDApIHJlbWFpbmRlcltwcmVmaXhlZF0gPSByZW1haW5kZXJbcHJlZml4ZWRdIS5zbGljZSgxKTtcbiAgICB2ZXJzaW9uU3RhcnQgPSByZW1haW5kZXIuZmluZEluZGV4KG51bWVyaWMpO1xuICB9XG4gIGlmIChmYW1pbHkgPT09IFwia2ltaVwiKSB7XG4gICAgY29uc3QgcHJlZml4ZWQgPSByZW1haW5kZXIuZmluZEluZGV4KCh2YWx1ZSkgPT4gL15rXFxkKyQvLnRlc3QodmFsdWUpKTtcbiAgICBpZiAocHJlZml4ZWQgPj0gMCkgcmVtYWluZGVyW3ByZWZpeGVkXSA9IHJlbWFpbmRlcltwcmVmaXhlZF0hLnNsaWNlKDEpO1xuICAgIHZlcnNpb25TdGFydCA9IHJlbWFpbmRlci5maW5kSW5kZXgobnVtZXJpYyk7XG4gIH1cbiAgaWYgKHZlcnNpb25TdGFydCA8IDApIHJldHVybiB7IGZhbWlseSwgdmVyc2lvbjogW10sIG1vZGVsOiByZW1haW5kZXIgfTtcbiAgY29uc3QgdmVyc2lvbjogbnVtYmVyW10gPSBbXTtcbiAgbGV0IGN1cnNvciA9IHZlcnNpb25TdGFydDtcbiAgd2hpbGUgKGN1cnNvciA8IHJlbWFpbmRlci5sZW5ndGggJiYgdmVyc2lvbi5sZW5ndGggPCAyICYmIG51bWVyaWMocmVtYWluZGVyW2N1cnNvcl0hKSkge1xuICAgIHZlcnNpb24ucHVzaChOdW1iZXIocmVtYWluZGVyW2N1cnNvcl0pKTtcbiAgICBjdXJzb3IgKz0gMTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGZhbWlseSxcbiAgICB2ZXJzaW9uLFxuICAgIG1vZGVsOiBbLi4ucmVtYWluZGVyLnNsaWNlKDAsIHZlcnNpb25TdGFydCksIC4uLnJlbWFpbmRlci5zbGljZShjdXJzb3IpXSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Portable entry point used by generated Python bindings. */
|
|
2
|
+
export { createModelClient } from "./model-client.js";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B5dGhvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4REFBOEQ7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogUG9ydGFibGUgZW50cnkgcG9pbnQgdXNlZCBieSBnZW5lcmF0ZWQgUHl0aG9uIGJpbmRpbmdzLiAqL1xuZXhwb3J0IHsgY3JlYXRlTW9kZWxDbGllbnQgfSBmcm9tIFwiLi9tb2RlbC1jbGllbnQudHNcIjtcbiJdfQ==
|
package/lib/src/resolve.d.ts
CHANGED
|
@@ -1,159 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Workspace-aware model selection.
|
|
3
|
-
*
|
|
4
|
-
* Given a caller's intent - a search string, a capability {@link ModelClass}
|
|
5
|
-
* ceiling, both, or nothing - the toolkit returns matching endpoints ranked by
|
|
6
|
-
* match quality then class, or collapses to the single best id the workspace
|
|
7
|
-
* actually has, degrading from "best in range" down to the static fallback
|
|
8
|
-
* floor. Selection is chat-only: embedding endpoints surface only when
|
|
9
|
-
* `modelClass` is explicitly {@link ModelClass.Embedding}.
|
|
10
|
-
*
|
|
11
|
-
* Two shapes of selection, each in a pure form (over an endpoint list the
|
|
12
|
-
* caller already holds) and an I/O wrapper (that lists `/serving-endpoints`
|
|
13
|
-
* first): ranking, which returns a match- then class-ordered list, and
|
|
14
|
-
* single-selection, which collapses to one id plus how it was reached and
|
|
15
|
-
* layers the operator-pinned fallback / static-floor safety net on top. A chat
|
|
16
|
-
* `modelClass` acts as a ceiling: that band and the less-capable chat bands
|
|
17
|
-
* below it are eligible (see {@link classesAtOrBelow}), so a `chat-balanced`
|
|
18
|
-
* ask can fall to `chat-fast` but never escalate to `chat-thinking`.
|
|
2
|
+
* Workspace-aware model selection wrappers.
|
|
19
3
|
*
|
|
20
4
|
* @module
|
|
21
5
|
*/
|
|
22
|
-
import {
|
|
6
|
+
import type { ModelQuery, RankedModel, ServingEndpointSummary } from "@dbx-tools/shared-model";
|
|
7
|
+
import { type ResolveModelInput, type ResolvedModelSelection } from "./_selection.ts";
|
|
23
8
|
import { type ResolvedModel, type ResolveModelOptions, type WorkspaceClientLike } from "./model-catalog.ts";
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Explicit model id / loose name (per-request override, agent / plugin
|
|
29
|
-
* default, or env var). When set it wins over `modelClass` and `fallbacks`.
|
|
30
|
-
*/
|
|
31
|
-
explicit?: string;
|
|
32
|
-
/**
|
|
33
|
-
* Fuzzy-match an `explicit` name against the live catalogue so loose names
|
|
34
|
-
* like `"claude sonnet"` resolve. Default `true`. When `false` the explicit
|
|
35
|
-
* input is returned verbatim (Databricks surfaces the canonical 404 if it
|
|
36
|
-
* doesn't exist).
|
|
37
|
-
*/
|
|
38
|
-
fuzzy?: boolean;
|
|
39
|
-
/** Rust fuzzy-distance threshold forwarded to the search match. */
|
|
40
|
-
threshold?: number;
|
|
41
|
-
/** Require a model that supports a complete function-tool round-trip. */
|
|
42
|
-
requiresTools?: boolean;
|
|
43
|
-
/**
|
|
44
|
-
* Chat capability class to resolve when no `explicit` id is given. The live
|
|
45
|
-
* catalogue is classified by its Foundation Model API scores and the top
|
|
46
|
-
* available model in the class (and the chat bands below it) wins, falling
|
|
47
|
-
* back to the class's small static list.
|
|
48
|
-
*/
|
|
49
|
-
modelClass?: ModelClass;
|
|
50
|
-
/**
|
|
51
|
-
* Operator-supplied fallback ids tried *first* in the no-explicit, no-class
|
|
52
|
-
* path (e.g. a regulated workspace pinned to an approved subset), ahead of
|
|
53
|
-
* the auto-classified catalogue.
|
|
54
|
-
*/
|
|
55
|
-
fallbacks?: readonly string[];
|
|
56
|
-
/**
|
|
57
|
-
* Refuse the static offline floor when the live catalogue has no match.
|
|
58
|
-
* Use for unpinned defaults that must always name a currently available
|
|
59
|
-
* endpoint.
|
|
60
|
-
*/
|
|
61
|
-
liveOnly?: boolean;
|
|
62
|
-
}
|
|
63
|
-
/** Outcome of {@link resolveModel}: the chosen id plus how it was reached. */
|
|
64
|
-
export interface ResolvedModelSelection {
|
|
65
|
-
modelId: string;
|
|
66
|
-
source: "explicit" | "fuzzy-match" | "class" | "fallback";
|
|
67
|
-
}
|
|
68
|
-
/** Intent + catalogue knobs passed to {@link selectModel}. */
|
|
9
|
+
export { lookupModels, rankModelId, resolveModel } from "./_selection.ts";
|
|
10
|
+
export type { ResolveModelInput, ResolvedModelSelection } from "./_selection.ts";
|
|
11
|
+
/** Intent plus catalogue cache controls passed to {@link selectModel}. */
|
|
69
12
|
export interface SelectModelInput extends ResolveModelInput {
|
|
70
|
-
/** TTL override for the cached `/serving-endpoints` listing, in ms. */
|
|
71
13
|
ttlMs?: number;
|
|
72
|
-
/** Trusted opaque identity of the credential used by the workspace client. */
|
|
73
14
|
cacheIdentity?: string;
|
|
74
15
|
}
|
|
75
|
-
/**
|
|
16
|
+
/** Query plus catalogue cache controls passed to {@link searchModels}. */
|
|
76
17
|
export interface SearchModelsInput extends ModelQuery {
|
|
77
|
-
/** TTL override for the cached `/serving-endpoints` listing, in ms. */
|
|
78
18
|
ttlMs?: number;
|
|
79
|
-
/** Trusted opaque identity of the credential used by the workspace client. */
|
|
80
19
|
cacheIdentity?: string;
|
|
81
20
|
}
|
|
82
|
-
/**
|
|
83
|
-
* Rank the live catalogue against a {@link ModelQuery}, best-first.
|
|
84
|
-
*
|
|
85
|
-
* Rust owns classification, fuzzy scoring, family-version ordering, preferred
|
|
86
|
-
* variants, class ceilings, tool filtering, and result limiting. Node retains
|
|
87
|
-
* the caller's endpoint objects so fields outside the ranking contract remain
|
|
88
|
-
* available unchanged.
|
|
89
|
-
*/
|
|
90
|
-
export declare function lookupModels(endpoints: readonly ServingEndpointSummary[], query?: ModelQuery): RankedModel[];
|
|
91
|
-
/**
|
|
92
|
-
* Collapse {@link lookupModels} to a single id: the closest endpoint to `search`
|
|
93
|
-
* in a catalogue snapshot, or the input verbatim when nothing scores within the
|
|
94
|
-
* threshold.
|
|
95
|
-
*
|
|
96
|
-
* The ranked counterpart to {@link resolveModelId}: equal
|
|
97
|
-
* match scores are broken by class and then within-class version, so a loose
|
|
98
|
-
* `"opus"` prefers `opus-5` over `opus-4-7` instead of picking whichever
|
|
99
|
-
* sibling appeared first. Returning the input unmatched (rather
|
|
100
|
-
* than a near neighbour) is deliberate - a deliberate endpoint id is never
|
|
101
|
-
* silently rewritten, and Databricks surfaces a clean 404.
|
|
102
|
-
*/
|
|
103
|
-
export declare function rankModelId(endpoints: readonly ServingEndpointSummary[], search: string, options?: ResolveModelOptions): ResolvedModel;
|
|
104
|
-
/**
|
|
105
|
-
* {@link rankModelId} against a catalogue the caller may be holding stale:
|
|
106
|
-
* match the loaded snapshot, and on a miss reload once with `force` and match
|
|
107
|
-
* again. That way a model deployed after the catalogue was cached still
|
|
108
|
-
* resolves on first use, without a restart and without giving up caching.
|
|
109
|
-
*
|
|
110
|
-
* The catalogue arrives as a loader rather than a client so the caller keeps
|
|
111
|
-
* ownership of *how* it is cached - {@link listServingEndpoints} and its
|
|
112
|
-
* `CacheManager`, a plain process-lifetime field in a CLI, or a test double.
|
|
113
|
-
* Only one reload is attempted: a genuinely unknown name should fail fast
|
|
114
|
-
* rather than re-list on every request.
|
|
115
|
-
*
|
|
116
|
-
* @param load - Returns the catalogue; `force` asks it to bypass its cache.
|
|
117
|
-
*/
|
|
21
|
+
/** Resolve against a potentially stale catalogue, refreshing once on a miss. */
|
|
118
22
|
export declare function rankModelIdLive(load: (force: boolean) => Promise<readonly ServingEndpointSummary[]>, search: string, options?: ResolveModelOptions): Promise<ResolvedModel>;
|
|
119
|
-
/**
|
|
120
|
-
* Rank a workspace's catalogue in one call: list its `/serving-endpoints`
|
|
121
|
-
* (cached) and run {@link lookupModels} over the result. The list counterpart to
|
|
122
|
-
* {@link selectModel}, for a consumer that wants the full ranked set (a model
|
|
123
|
-
* picker, a CLI) rather than a single id. Catalogue fetches fail loud: network
|
|
124
|
-
* / auth errors propagate so the caller sees the real SDK message.
|
|
125
|
-
*
|
|
126
|
-
* @param host - Workspace host used as the cache key. Pass the value resolved
|
|
127
|
-
* from `client.config.getHost()`.
|
|
128
|
-
*/
|
|
23
|
+
/** List and rank a workspace model catalogue. */
|
|
129
24
|
export declare function searchModels(client: WorkspaceClientLike, host: string, input?: SearchModelsInput): Promise<RankedModel[]>;
|
|
130
|
-
/**
|
|
131
|
-
* Resolve a model id for a workspace in one call: list its `/serving-endpoints`
|
|
132
|
-
* (cached) and run {@link resolveModel} over the result. This is the entry
|
|
133
|
-
* point for any consumer that holds a `WorkspaceClient` and just wants a usable
|
|
134
|
-
* model name - a Lakeflow job, a one-off script, or the Mastra plugin alike.
|
|
135
|
-
*
|
|
136
|
-
* Cheap exit: when an `explicit` name is given, `fuzzy` is off, and tool
|
|
137
|
-
* capability is not required, the catalogue is never fetched. Catalogue
|
|
138
|
-
* fetches otherwise fail loud: network / auth errors propagate so the caller
|
|
139
|
-
* sees the real SDK message instead of a silent fallback.
|
|
140
|
-
*
|
|
141
|
-
* @param host - Workspace host used as the cache key. Pass the value resolved
|
|
142
|
-
* from `client.config.getHost()`.
|
|
143
|
-
*/
|
|
25
|
+
/** List a workspace catalogue and resolve one model. */
|
|
144
26
|
export declare function selectModel(client: WorkspaceClientLike, host: string, input?: SelectModelInput): Promise<ResolvedModelSelection>;
|
|
145
|
-
/**
|
|
146
|
-
* Resolve a single model id from the live catalogue and caller intent,
|
|
147
|
-
* delegating the live selection to {@link lookupModels} with `limit: 1`.
|
|
148
|
-
*
|
|
149
|
-
* 1. **Explicit ask**: with `fuzzy` off, returned verbatim; otherwise
|
|
150
|
-
* fuzzy-ranked within the (optional) class ceiling and the best taken,
|
|
151
|
-
* falling back to the input verbatim when nothing matches.
|
|
152
|
-
* 2. **No explicit ask**: an operator-pinned `fallback` that exists in the live
|
|
153
|
-
* catalogue wins first. A class request ranks within that ceiling. A
|
|
154
|
-
* general request prefers the highest-ranked live GPT, then any ranked live
|
|
155
|
-
* chat model. The static {@link FALLBACK_MODEL_IDS} floor is used only when
|
|
156
|
-
* the catalogue yields nothing in range.
|
|
157
|
-
*/
|
|
158
|
-
export declare function resolveModel(endpoints: readonly ServingEndpointSummary[], input?: ResolveModelInput): ResolvedModelSelection;
|
|
159
|
-
export {};
|