@dbx-tools/model 0.9.5 → 0.9.7

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 CHANGED
@@ -103,12 +103,12 @@ class policy.
103
103
  ## Work With A Held Catalogue
104
104
 
105
105
  When you already have endpoint summaries, use the pure resolver functions from
106
- `resolve` and `serving` without another workspace call:
106
+ `resolve` and `modelCatalog` without another workspace call:
107
107
 
108
108
  ```ts
109
- import { resolve, serving } from "@dbx-tools/model";
109
+ import { modelCatalog, resolve } from "@dbx-tools/model";
110
110
 
111
- const endpoints = await serving.listServingEndpoints(client, host);
111
+ const endpoints = await modelCatalog.listServingEndpoints(client, host);
112
112
  const ranked = resolve.lookupModels(endpoints, { search: "sonnet", limit: 3 });
113
113
  const picked = resolve.resolveModel(endpoints, {
114
114
  explicit: "claude sonnet",
@@ -124,14 +124,14 @@ when the requested class is `embedding`.
124
124
  ## List And Cache Serving Endpoints
125
125
 
126
126
  ```ts
127
- import { serving } from "@dbx-tools/model";
127
+ import { modelCatalog } from "@dbx-tools/model";
128
128
 
129
- const endpoints = await serving.listServingEndpoints(client, host, {
129
+ const endpoints = await modelCatalog.listServingEndpoints(client, host, {
130
130
  ttlMs: 5 * 60_000,
131
131
  });
132
132
 
133
- const raw = await serving.listServingEndpointsUncached(client);
134
- await serving.clearServingEndpointsCache(host);
133
+ const raw = await modelCatalog.listServingEndpointsUncached(client);
134
+ await modelCatalog.clearServingEndpointsCache(host);
135
135
  ```
136
136
 
137
137
  `listServingEndpoints()` uses AppKit's `CacheManager`, enriches endpoints with
package/index.ts CHANGED
@@ -3,17 +3,17 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/model";
6
- export const PACKAGE_VERSION = "0.9.5";
6
+ export const PACKAGE_VERSION = "0.9.7";
7
7
  export * as classes from "./src/classes.ts";
8
8
  export * as fallback from "./src/fallback.ts";
9
9
  export * as invoke from "./src/invoke.ts";
10
+ export * as modelCatalog from "./src/model-catalog.ts";
10
11
  export * as policy from "./src/policy.ts";
11
12
  export * as resolve from "./src/resolve.ts";
12
- export * as serving from "./src/serving.ts";
13
13
  export { CHAT_CLASS_ORDER, MODEL_CLASS_ORDER } from "./src/classes.ts";
14
14
  export { FALLBACK_MODEL_IDS } from "./src/fallback.ts";
15
15
  export { INVOCATIONS_SUFFIX, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH } from "./src/invoke.ts";
16
16
  export type { AuthenticatingClientLike } from "./src/invoke.ts";
17
+ export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/model-catalog.ts";
18
+ export type { WorkspaceClientLike, ListServingEndpointsOptions, ResolvedModel, ResolveModelOptions, ScoredEndpoint } from "./src/model-catalog.ts";
17
19
  export type { ResolveModelInput, ResolvedModelSelection, SelectModelInput, SearchModelsInput } from "./src/resolve.ts";
18
- export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/serving.ts";
19
- export type { WorkspaceClientLike, ListServingEndpointsOptions, ResolvedModel, ResolveModelOptions, ScoredEndpoint } from "./src/serving.ts";
package/lib/index.d.ts CHANGED
@@ -1,15 +1,15 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/model";
2
- export declare const PACKAGE_VERSION = "0.9.5";
2
+ export declare const PACKAGE_VERSION = "0.9.7";
3
3
  export * as classes from "./src/classes.ts";
4
4
  export * as fallback from "./src/fallback.ts";
5
5
  export * as invoke from "./src/invoke.ts";
6
+ export * as modelCatalog from "./src/model-catalog.ts";
6
7
  export * as policy from "./src/policy.ts";
7
8
  export * as resolve from "./src/resolve.ts";
8
- export * as serving from "./src/serving.ts";
9
9
  export { CHAT_CLASS_ORDER, MODEL_CLASS_ORDER } from "./src/classes.ts";
10
10
  export { FALLBACK_MODEL_IDS } from "./src/fallback.ts";
11
11
  export { INVOCATIONS_SUFFIX, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH } from "./src/invoke.ts";
12
12
  export type { AuthenticatingClientLike } from "./src/invoke.ts";
13
+ export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/model-catalog.ts";
14
+ export type { WorkspaceClientLike, ListServingEndpointsOptions, ResolvedModel, ResolveModelOptions, ScoredEndpoint } from "./src/model-catalog.ts";
13
15
  export type { ResolveModelInput, ResolvedModelSelection, SelectModelInput, SearchModelsInput } from "./src/resolve.ts";
14
- export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/serving.ts";
15
- export type { WorkspaceClientLike, ListServingEndpointsOptions, ResolvedModel, ResolveModelOptions, ScoredEndpoint } from "./src/serving.ts";
package/lib/index.js CHANGED
@@ -2,15 +2,15 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/model";
5
- export const PACKAGE_VERSION = "0.9.5";
5
+ export const PACKAGE_VERSION = "0.9.7";
6
6
  export * as classes from "./src/classes.js";
7
7
  export * as fallback from "./src/fallback.js";
8
8
  export * as invoke from "./src/invoke.js";
9
+ export * as modelCatalog from "./src/model-catalog.js";
9
10
  export * as policy from "./src/policy.js";
10
11
  export * as resolve from "./src/resolve.js";
11
- export * as serving from "./src/serving.js";
12
12
  export { CHAT_CLASS_ORDER, MODEL_CLASS_ORDER } from "./src/classes.js";
13
13
  export { FALLBACK_MODEL_IDS } from "./src/fallback.js";
14
14
  export { INVOCATIONS_SUFFIX, RESPONSES_PATH, OPEN_RESPONSES_PATH, CHAT_COMPLETIONS_PATH } from "./src/invoke.js";
15
- export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/serving.js";
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUdqSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS41XCI7XG5leHBvcnQgKiBhcyBjbGFzc2VzIGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgKiBhcyBmYWxsYmFjayBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCAqIGFzIGludm9rZSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgKiBhcyBwb2xpY3kgZnJvbSBcIi4vc3JjL3BvbGljeS50c1wiO1xuZXhwb3J0ICogYXMgcmVzb2x2ZSBmcm9tIFwiLi9zcmMvcmVzb2x2ZS50c1wiO1xuZXhwb3J0ICogYXMgc2VydmluZyBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuZXhwb3J0IHsgQ0hBVF9DTEFTU19PUkRFUiwgTU9ERUxfQ0xBU1NfT1JERVIgfSBmcm9tIFwiLi9zcmMvY2xhc3Nlcy50c1wiO1xuZXhwb3J0IHsgRkFMTEJBQ0tfTU9ERUxfSURTIH0gZnJvbSBcIi4vc3JjL2ZhbGxiYWNrLnRzXCI7XG5leHBvcnQgeyBJTlZPQ0FUSU9OU19TVUZGSVgsIFJFU1BPTlNFU19QQVRILCBPUEVOX1JFU1BPTlNFU19QQVRILCBDSEFUX0NPTVBMRVRJT05TX1BBVEggfSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dGhlbnRpY2F0aW5nQ2xpZW50TGlrZSB9IGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgUmVzb2x2ZU1vZGVsSW5wdXQsIFJlc29sdmVkTW9kZWxTZWxlY3Rpb24sIFNlbGVjdE1vZGVsSW5wdXQsIFNlYXJjaE1vZGVsc0lucHV0IH0gZnJvbSBcIi4vc3JjL3Jlc29sdmUudHNcIjtcbmV4cG9ydCB7IERFRkFVTFRfTU9ERUxfQ0FDSEVfVFRMX01TLCBERUZBVUxUX0ZVWlpZX1RIUkVTSE9MRCB9IGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudExpa2UsIExpc3RTZXJ2aW5nRW5kcG9pbnRzT3B0aW9ucywgUmVzb2x2ZWRNb2RlbCwgUmVzb2x2ZU1vZGVsT3B0aW9ucywgU2NvcmVkRW5kcG9pbnQgfSBmcm9tIFwiLi9zcmMvc2VydmluZy50c1wiO1xuIl19
15
+ export { DEFAULT_MODEL_CACHE_TTL_MS, DEFAULT_FUZZY_THRESHOLD } from "./src/model-catalog.js";
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS43XCI7XG5leHBvcnQgKiBhcyBjbGFzc2VzIGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgKiBhcyBmYWxsYmFjayBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCAqIGFzIGludm9rZSBmcm9tIFwiLi9zcmMvaW52b2tlLnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbENhdGFsb2cgZnJvbSBcIi4vc3JjL21vZGVsLWNhdGFsb2cudHNcIjtcbmV4cG9ydCAqIGFzIHBvbGljeSBmcm9tIFwiLi9zcmMvcG9saWN5LnRzXCI7XG5leHBvcnQgKiBhcyByZXNvbHZlIGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG5leHBvcnQgeyBDSEFUX0NMQVNTX09SREVSLCBNT0RFTF9DTEFTU19PUkRFUiB9IGZyb20gXCIuL3NyYy9jbGFzc2VzLnRzXCI7XG5leHBvcnQgeyBGQUxMQkFDS19NT0RFTF9JRFMgfSBmcm9tIFwiLi9zcmMvZmFsbGJhY2sudHNcIjtcbmV4cG9ydCB7IElOVk9DQVRJT05TX1NVRkZJWCwgUkVTUE9OU0VTX1BBVEgsIE9QRU5fUkVTUE9OU0VTX1BBVEgsIENIQVRfQ09NUExFVElPTlNfUEFUSCB9IGZyb20gXCIuL3NyYy9pbnZva2UudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXV0aGVudGljYXRpbmdDbGllbnRMaWtlIH0gZnJvbSBcIi4vc3JjL2ludm9rZS50c1wiO1xuZXhwb3J0IHsgREVGQVVMVF9NT0RFTF9DQUNIRV9UVExfTVMsIERFRkFVTFRfRlVaWllfVEhSRVNIT0xEIH0gZnJvbSBcIi4vc3JjL21vZGVsLWNhdGFsb2cudHNcIjtcbmV4cG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50TGlrZSwgTGlzdFNlcnZpbmdFbmRwb2ludHNPcHRpb25zLCBSZXNvbHZlZE1vZGVsLCBSZXNvbHZlTW9kZWxPcHRpb25zLCBTY29yZWRFbmRwb2ludCB9IGZyb20gXCIuL3NyYy9tb2RlbC1jYXRhbG9nLnRzXCI7XG5leHBvcnQgdHlwZSB7IFJlc29sdmVNb2RlbElucHV0LCBSZXNvbHZlZE1vZGVsU2VsZWN0aW9uLCBTZWxlY3RNb2RlbElucHV0LCBTZWFyY2hNb2RlbHNJbnB1dCB9IGZyb20gXCIuL3NyYy9yZXNvbHZlLnRzXCI7XG4iXX0=
@@ -0,0 +1,14 @@
1
+ import { model, type ModelQuery, type RankedModel, type ServingEndpointSummary } from "@dbx-tools/shared-model";
2
+ type ModelClass = model.ModelClass;
3
+ interface NativeRankingOptions {
4
+ readonly includeDeprecated?: boolean;
5
+ readonly modelClass?: ModelClass;
6
+ readonly task?: string;
7
+ }
8
+ /** Rank public endpoint records through the Rust-owned model policy. */
9
+ export declare function rankEndpoints(endpoints: readonly ServingEndpointSummary[], query?: ModelQuery, options?: NativeRankingOptions): RankedModel[];
10
+ /** Classify chat and embedding endpoints through the Rust-owned policy. */
11
+ export declare function classifyEndpointClasses(endpoints: readonly ServingEndpointSummary[]): ReadonlyMap<string, ModelClass>;
12
+ /** Normalize serialized SDK endpoint records through the Rust-owned catalogue policy. */
13
+ export declare function normalizeEndpoints(endpoints: readonly unknown[]): ServingEndpointSummary[];
14
+ export {};
@@ -0,0 +1,124 @@
1
+ import { ModelClass as NativeModelClass, ReasoningEffort as NativeReasoningEffort, normalizeServingEndpointsJson, rankModels as rankModelsWithRust, } from "@dbx-tools/model-rs";
2
+ import { model, } from "@dbx-tools/shared-model";
3
+ const MODEL_CLASS_TO_NATIVE = {
4
+ [model.ModelClass.ChatThinking]: NativeModelClass.ChatThinking,
5
+ [model.ModelClass.ChatBalanced]: NativeModelClass.ChatBalanced,
6
+ [model.ModelClass.ChatFast]: NativeModelClass.ChatFast,
7
+ [model.ModelClass.Embedding]: NativeModelClass.Embedding,
8
+ };
9
+ const REASONING_EFFORT_TO_NATIVE = {
10
+ none: NativeReasoningEffort.None,
11
+ minimal: NativeReasoningEffort.Minimal,
12
+ low: NativeReasoningEffort.Low,
13
+ medium: NativeReasoningEffort.Medium,
14
+ high: NativeReasoningEffort.High,
15
+ xhigh: NativeReasoningEffort.Xhigh,
16
+ max: NativeReasoningEffort.Max,
17
+ };
18
+ const REASONING_EFFORT_FROM_NATIVE = {
19
+ [NativeReasoningEffort.None]: "none",
20
+ [NativeReasoningEffort.Minimal]: "minimal",
21
+ [NativeReasoningEffort.Low]: "low",
22
+ [NativeReasoningEffort.Medium]: "medium",
23
+ [NativeReasoningEffort.High]: "high",
24
+ [NativeReasoningEffort.Xhigh]: "xhigh",
25
+ [NativeReasoningEffort.Max]: "max",
26
+ };
27
+ /** Rank public endpoint records through the Rust-owned model policy. */
28
+ export function rankEndpoints(endpoints, query = {}, options = {}) {
29
+ const endpointsByName = new Map(endpoints.map((endpoint) => [endpoint.name, endpoint]));
30
+ return rankModelsWithRust(endpoints.map((endpoint) => toNativeEndpoint(endpoint, options)), toNativeQuery(query, options.includeDeprecated ?? false)).map((ranked) => {
31
+ const endpoint = endpointsByName.get(ranked.endpoint.name);
32
+ if (!endpoint) {
33
+ throw new Error(`Rust model ranking returned unknown endpoint "${ranked.endpoint.name}"`);
34
+ }
35
+ return {
36
+ endpoint,
37
+ modelClass: fromNativeClass(ranked.modelClass),
38
+ ...(ranked.score !== undefined ? { score: ranked.score } : {}),
39
+ };
40
+ });
41
+ }
42
+ /** Classify chat and embedding endpoints through the Rust-owned policy. */
43
+ export function classifyEndpointClasses(endpoints) {
44
+ const chat = rankEndpoints(endpoints, {}, { includeDeprecated: true });
45
+ const embeddings = rankEndpoints(endpoints, { modelClass: model.ModelClass.Embedding }, { includeDeprecated: true });
46
+ return new Map([...chat, ...embeddings].map((ranked) => [ranked.endpoint.name, ranked.modelClass]));
47
+ }
48
+ /** Normalize serialized SDK endpoint records through the Rust-owned catalogue policy. */
49
+ export function normalizeEndpoints(endpoints) {
50
+ return normalizeServingEndpointsJson(JSON.stringify({ endpoints })).map(fromNativeEndpoint);
51
+ }
52
+ function toNativeQuery(query, includeDeprecated) {
53
+ return {
54
+ search: query.search,
55
+ modelClass: query.modelClass === undefined ? undefined : MODEL_CLASS_TO_NATIVE[query.modelClass],
56
+ requiresTools: query.requiresTools,
57
+ includeDeprecated: includeDeprecated || undefined,
58
+ limit: query.limit,
59
+ threshold: query.threshold,
60
+ };
61
+ }
62
+ function toNativeEndpoint(endpoint, options) {
63
+ const modelClass = options.modelClass ?? endpoint.class;
64
+ return {
65
+ name: endpoint.name,
66
+ displayName: endpoint.displayName,
67
+ family: endpoint.family,
68
+ task: options.task ?? endpoint.task,
69
+ state: endpoint.state,
70
+ description: endpoint.description,
71
+ supportsTools: endpoint.supportsTools,
72
+ profile: endpoint.profile,
73
+ modelClass: modelClass === undefined ? undefined : MODEL_CLASS_TO_NATIVE[modelClass],
74
+ serviceNames: new Map(Object.entries(endpoint.serviceNames ?? {})),
75
+ modelServiceName: endpoint.modelServiceName,
76
+ reasoningEfforts: (endpoint.reasoningEfforts ?? []).map((effort) => {
77
+ const native = REASONING_EFFORT_TO_NATIVE[effort];
78
+ if (native === undefined)
79
+ throw new Error(`Unknown reasoning effort "${effort}"`);
80
+ return native;
81
+ }),
82
+ status: { deprecated: endpoint.status?.deprecated ?? false },
83
+ dimension: endpoint.dimension,
84
+ };
85
+ }
86
+ function fromNativeEndpoint(endpoint) {
87
+ return {
88
+ name: endpoint.name,
89
+ ...(endpoint.displayName !== undefined ? { displayName: endpoint.displayName } : {}),
90
+ ...(endpoint.family !== undefined ? { family: endpoint.family } : {}),
91
+ ...(endpoint.task !== undefined ? { task: endpoint.task } : {}),
92
+ ...(endpoint.state !== undefined ? { state: endpoint.state } : {}),
93
+ ...(endpoint.description !== undefined ? { description: endpoint.description } : {}),
94
+ ...(endpoint.supportsTools !== undefined ? { supportsTools: endpoint.supportsTools } : {}),
95
+ ...(endpoint.profile !== undefined ? { profile: endpoint.profile } : {}),
96
+ ...(endpoint.modelClass !== undefined ? { class: fromNativeClass(endpoint.modelClass) } : {}),
97
+ ...(endpoint.serviceNames.size > 0
98
+ ? { serviceNames: Object.fromEntries(endpoint.serviceNames) }
99
+ : {}),
100
+ ...(endpoint.modelServiceName !== undefined
101
+ ? { modelServiceName: endpoint.modelServiceName }
102
+ : {}),
103
+ ...(endpoint.reasoningEfforts.length > 0
104
+ ? {
105
+ reasoningEfforts: endpoint.reasoningEfforts.map((effort) => REASONING_EFFORT_FROM_NATIVE[effort]),
106
+ }
107
+ : {}),
108
+ status: { deprecated: endpoint.status.deprecated },
109
+ ...(endpoint.dimension !== undefined ? { dimension: endpoint.dimension } : {}),
110
+ };
111
+ }
112
+ function fromNativeClass(modelClass) {
113
+ switch (modelClass) {
114
+ case NativeModelClass.ChatThinking:
115
+ return model.ModelClass.ChatThinking;
116
+ case NativeModelClass.ChatBalanced:
117
+ return model.ModelClass.ChatBalanced;
118
+ case NativeModelClass.ChatFast:
119
+ return model.ModelClass.ChatFast;
120
+ case NativeModelClass.Embedding:
121
+ return model.ModelClass.Embedding;
122
+ }
123
+ }
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX25hdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fbmF0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLElBQUksZ0JBQWdCLEVBQzlCLGVBQWUsSUFBSSxxQkFBcUIsRUFDeEMsNkJBQTZCLEVBQzdCLFVBQVUsSUFBSSxrQkFBa0IsR0FHakMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsS0FBSyxHQUtOLE1BQU0seUJBQXlCLENBQUM7QUFJakMsTUFBTSxxQkFBcUIsR0FBbUQ7SUFDNUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLGdCQUFnQixDQUFDLFlBQVk7SUFDOUQsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLGdCQUFnQixDQUFDLFlBQVk7SUFDOUQsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLFFBQVE7SUFDdEQsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLFNBQVM7Q0FDekQsQ0FBQztBQUVGLE1BQU0sMEJBQTBCLEdBQW9EO0lBQ2xGLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxJQUFJO0lBQ2hDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxPQUFPO0lBQ3RDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQyxHQUFHO0lBQzlCLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxNQUFNO0lBQ3BDLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxJQUFJO0lBQ2hDLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxLQUFLO0lBQ2xDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQyxHQUFHO0NBQy9CLENBQUM7QUFFRixNQUFNLDRCQUE0QixHQUE2RDtJQUM3RixDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU07SUFDcEMsQ0FBQyxxQkFBcUIs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RSxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUNsRCxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQy9FLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsVUFBNEI7SUFDbkQsUUFBUSxVQUFVLEVBQUUsQ0FBQztRQUNuQixLQUFLLGdCQUFnQixDQUFDLFlBQVk7WUFDaEMsT0FBTyxLQUFLLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztRQUN2QyxLQUFLLGdCQUFnQixDQUFDLFlBQVk7WUFDaEMsT0FBTyxLQUFLLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztRQUN2QyxLQUFLLGdCQUFnQixDQUFDLFFBQVE7WUFDNUIsT0FBTyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUNuQyxLQUFLLGdCQUFnQixDQUFDLFNBQVM7WUFDN0IsT0FBTyxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztJQUN0QyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIE1vZGVsQ2xhc3MgYXMgTmF0aXZlTW9kZWxDbGFzcyxcbiAgUmVhc29uaW5nRWZmb3J0IGFzIE5hdGl2ZVJlYXNvbmluZ0VmZm9ydCxcbiAgbm9ybWFsaXplU2VydmluZ0VuZHBvaW50c0pzb24sXG4gIHJhbmtNb2RlbHMgYXMgcmFua01vZGVsc1dpdGhSdXN0LFxuICB0eXBlIE1vZGVsUXVlcnkgYXMgTmF0aXZlTW9kZWxRdWVyeSxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IGFzIE5hdGl2ZVNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsLXJzXCI7XG5pbXBvcnQge1xuICBtb2RlbCxcbiAgdHlwZSBNb2RlbFF1ZXJ5LFxuICB0eXBlIFJhbmtlZE1vZGVsLFxuICB0eXBlIFJlYXNvbmluZ0VmZm9ydCxcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcblxudHlwZSBNb2RlbENsYXNzID0gbW9kZWwuTW9kZWxDbGFzcztcblxuY29uc3QgTU9ERUxfQ0xBU1NfVE9fTkFUSVZFOiBSZWFkb25seTxSZWNvcmQ8TW9kZWxDbGFzcywgTmF0aXZlTW9kZWxDbGFzcz4+ID0ge1xuICBbbW9kZWwuTW9kZWxDbGFzcy5DaGF0VGhpbmtpbmddOiBOYXRpdmVNb2RlbENsYXNzLkNoYXRUaGlua2luZyxcbiAgW21vZGVsLk1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkXTogTmF0aXZlTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQsXG4gIFttb2RlbC5Nb2RlbENsYXNzLkNoYXRGYXN0XTogTmF0aXZlTW9kZWxDbGFzcy5DaGF0RmFzdCxcbiAgW21vZGVsLk1vZGVsQ2xhc3MuRW1iZWRkaW5nXTogTmF0aXZlTW9kZWxDbGFzcy5FbWJlZGRpbmcsXG59O1xuXG5jb25zdCBSRUFTT05JTkdfRUZGT1JUX1RPX05BVElWRTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgTmF0aXZlUmVhc29uaW5nRWZmb3J0Pj4gPSB7XG4gIG5vbmU6IE5hdGl2ZVJlYXNvbmluZ0VmZm9ydC5Ob25lLFxuICBtaW5pbWFsOiBOYXRpdmVSZWFzb25pbmdFZmZvcnQuTWluaW1hbCxcbiAgbG93OiBOYXRpdmVSZWFzb25pbmdFZmZvcnQuTG93LFxuICBtZWRpdW06IE5hdGl2ZVJlYXNvbmluZ0VmZm9ydC5NZWRpdW0sXG4gIGhpZ2g6IE5hdGl2ZVJlYXNvbmluZ0VmZm9ydC5IaWdoLFxuICB4aGlnaDogTmF0aXZlUmVhc29uaW5nRWZmb3J0LlhoaWdoLFxuICBtYXg6IE5hdGl2ZVJlYXNvbmluZ0VmZm9ydC5NYXgsXG59O1xuXG5jb25zdCBSRUFTT05JTkdfRUZGT1JUX0ZST01fTkFUSVZFOiBSZWFkb25seTxSZWNvcmQ8TmF0aXZlUmVhc29uaW5nRWZmb3J0LCBSZWFzb25pbmdFZmZvcnQ+PiA9IHtcbiAgW05hdGl2ZVJlYXNvbmluZ0VmZm9ydC5Ob25lXTogXCJub25lXCIsXG4gIFtOYXRpdmVSZWFzb25pbmdFZmZvcnQuTWluaW1hbF06IFwibWluaW1hbFwiLFxuICBbTmF0aXZlUmVhc29uaW5nRWZmb3J0Lkxvd106IFwibG93XCIsXG4gIFtOYXRpdmVSZWFzb25pbmdFZmZvcnQuTWVkaXVtXTogXCJtZWRpdW1cIixcbiAgW05hdGl2ZVJlYXNvbmluZ0VmZm9ydC5IaWdoXTogXCJoaWdoXCIsXG4gIFtOYXRpdmVSZWFzb25pbmdFZmZvcnQuWGhpZ2hdOiBcInhoaWdoXCIsXG4gIFtOYXRpdmVSZWFzb25pbmdFZmZvcnQuTWF4XTogXCJtYXhcIixcbn07XG5cbmludGVyZmFjZSBOYXRpdmVSYW5raW5nT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGluY2x1ZGVEZXByZWNhdGVkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZWxDbGFzcz86IE1vZGVsQ2xhc3M7XG4gIHJlYWRvbmx5IHRhc2s/OiBzdHJpbmc7XG59XG5cbi8qKiBSYW5rIHB1YmxpYyBlbmRwb2ludCByZWNvcmRzIHRocm91Z2ggdGhlIFJ1c3Qtb3duZWQgbW9kZWwgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmtFbmRwb2ludHMoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICBxdWVyeTogTW9kZWxRdWVyeSA9IHt9LFxuICBvcHRpb25zOiBOYXRpdmVSYW5raW5nT3B0aW9ucyA9IHt9LFxuKTogUmFua2VkTW9kZWxbXSB7XG4gIGNvbnN0IGVuZHBvaW50c0J5TmFtZSA9IG5ldyBNYXAoZW5kcG9pbnRzLm1hcCgoZW5kcG9pbnQpID0+IFtlbmRwb2ludC5uYW1lLCBlbmRwb2ludF0pKTtcbiAgcmV0dXJuIHJhbmtNb2RlbHNXaXRoUnVzdChcbiAgICBlbmRwb2ludHMubWFwKChlbmRwb2ludCkgPT4gdG9OYXRpdmVFbmRwb2ludChlbmRwb2ludCwgb3B0aW9ucykpLFxuICAgIHRvTmF0aXZlUXVlcnkocXVlcnksIG9wdGlvbnMuaW5jbHVkZURlcHJlY2F0ZWQgPz8gZmFsc2UpLFxuICApLm1hcCgocmFua2VkKSA9PiB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBlbmRwb2ludHNCeU5hbWUuZ2V0KHJhbmtlZC5lbmRwb2ludC5uYW1lKTtcbiAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJ1c3QgbW9kZWwgcmFua2luZyByZXR1cm5lZCB1bmtub3duIGVuZHBvaW50IFwiJHtyYW5rZWQuZW5kcG9pbnQubmFtZX1cImApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZW5kcG9pbnQsXG4gICAgICBtb2RlbENsYXNzOiBmcm9tTmF0aXZlQ2xhc3MocmFua2VkLm1vZGVsQ2xhc3MpLFxuICAgICAgLi4uKHJhbmtlZC5zY29yZSAhPT0gdW5kZWZpbmVkID8geyBzY29yZTogcmFua2VkLnNjb3JlIH0gOiB7fSksXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKiBDbGFzc2lmeSBjaGF0IGFuZCBlbWJlZGRpbmcgZW5kcG9pbnRzIHRocm91Z2ggdGhlIFJ1c3Qtb3duZWQgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5RW5kcG9pbnRDbGFzc2VzKFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbik6IFJlYWRvbmx5TWFwPHN0cmluZywgTW9kZWxDbGFzcz4ge1xuICBjb25zdCBjaGF0ID0gcmFua0VuZHBvaW50cyhlbmRwb2ludHMsIHt9LCB7IGluY2x1ZGVEZXByZWNhdGVkOiB0cnVlIH0pO1xuICBjb25zdCBlbWJlZGRpbmdzID0gcmFua0VuZHBvaW50cyhcbiAgICBlbmRwb2ludHMsXG4gICAgeyBtb2RlbENsYXNzOiBtb2RlbC5Nb2RlbENsYXNzLkVtYmVkZGluZyB9LFxuICAgIHsgaW5jbHVkZURlcHJlY2F0ZWQ6IHRydWUgfSxcbiAgKTtcbiAgcmV0dXJuIG5ldyBNYXAoXG4gICAgWy4uLmNoYXQsIC4uLmVtYmVkZGluZ3NdLm1hcCgocmFua2VkKSA9PiBbcmFua2VkLmVuZHBvaW50Lm5hbWUsIHJhbmtlZC5tb2RlbENsYXNzXSksXG4gICk7XG59XG5cbi8qKiBOb3JtYWxpemUgc2VyaWFsaXplZCBTREsgZW5kcG9pbnQgcmVjb3JkcyB0aHJvdWdoIHRoZSBSdXN0LW93bmVkIGNhdGFsb2d1ZSBwb2xpY3kuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRW5kcG9pbnRzKGVuZHBvaW50czogcmVhZG9ubHkgdW5rbm93bltdKTogU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZVNlcnZpbmdFbmRwb2ludHNKc29uKEpTT04uc3RyaW5naWZ5KHsgZW5kcG9pbnRzIH0pKS5tYXAoZnJvbU5hdGl2ZUVuZHBvaW50KTtcbn1cblxuZnVuY3Rpb24gdG9OYXRpdmVRdWVyeShxdWVyeTogTW9kZWxRdWVyeSwgaW5jbHVkZURlcHJlY2F0ZWQ6IGJvb2xlYW4pOiBOYXRpdmVNb2RlbFF1ZXJ5IHtcbiAgcmV0dXJuIHtcbiAgICBzZWFyY2g6IHF1ZXJ5LnNlYXJjaCxcbiAgICBtb2RlbENsYXNzOlxuICAgICAgcXVlcnkubW9kZWxDbGFzcyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogTU9ERUxfQ0xBU1NfVE9fTkFUSVZFW3F1ZXJ5Lm1vZGVsQ2xhc3NdLFxuICAgIHJlcXVpcmVzVG9vbHM6IHF1ZXJ5LnJlcXVpcmVzVG9vbHMsXG4gICAgaW5jbHVkZURlcHJlY2F0ZWQ6IGluY2x1ZGVEZXByZWNhdGVkIHx8IHVuZGVmaW5lZCxcbiAgICBsaW1pdDogcXVlcnkubGltaXQsXG4gICAgdGhyZXNob2xkOiBxdWVyeS50aHJlc2hvbGQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRvTmF0aXZlRW5kcG9pbnQoXG4gIGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBvcHRpb25zOiBOYXRpdmVSYW5raW5nT3B0aW9ucyxcbik6IE5hdGl2ZVNlcnZpbmdFbmRwb2ludFN1bW1hcnkge1xuICBjb25zdCBtb2RlbENsYXNzID0gb3B0aW9ucy5tb2RlbENsYXNzID8/IGVuZHBvaW50LmNsYXNzO1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGVuZHBvaW50Lm5hbWUsXG4gICAgZGlzcGxheU5hbWU6IGVuZHBvaW50LmRpc3BsYXlOYW1lLFxuICAgIGZhbWlseTogZW5kcG9pbnQuZmFtaWx5LFxuICAgIHRhc2s6IG9wdGlvbnMudGFzayA/PyBlbmRwb2ludC50YXNrLFxuICAgIHN0YXRlOiBlbmRwb2ludC5zdGF0ZSxcbiAgICBkZXNjcmlwdGlvbjogZW5kcG9pbnQuZGVzY3JpcHRpb24sXG4gICAgc3VwcG9ydHNUb29sczogZW5kcG9pbnQuc3VwcG9ydHNUb29scyxcbiAgICBwcm9maWxlOiBlbmRwb2ludC5wcm9maWxlLFxuICAgIG1vZGVsQ2xhc3M6IG1vZGVsQ2xhc3MgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE1PREVMX0NMQVNTX1RPX05BVElWRVttb2RlbENsYXNzXSxcbiAgICBzZXJ2aWNlTmFtZXM6IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoZW5kcG9pbnQuc2VydmljZU5hbWVzID8/IHt9KSksXG4gICAgbW9kZWxTZXJ2aWNlTmFtZTogZW5kcG9pbnQubW9kZWxTZXJ2aWNlTmFtZSxcbiAgICByZWFzb25pbmdFZmZvcnRzOiAoZW5kcG9pbnQucmVhc29uaW5nRWZmb3J0cyA/PyBbXSkubWFwKChlZmZvcnQpID0+IHtcbiAgICAgIGNvbnN0IG5hdGl2ZSA9IFJFQVNPTklOR19FRkZPUlRfVE9fTkFUSVZFW2VmZm9ydF07XG4gICAgICBpZiAobmF0aXZlID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByZWFzb25pbmcgZWZmb3J0IFwiJHtlZmZvcnR9XCJgKTtcbiAgICAgIHJldHVybiBuYXRpdmU7XG4gICAgfSksXG4gICAgc3RhdHVzOiB7IGRlcHJlY2F0ZWQ6IGVuZHBvaW50LnN0YXR1cz8uZGVwcmVjYXRlZCA/PyBmYWxzZSB9LFxuICAgIGRpbWVuc2lvbjogZW5kcG9pbnQuZGltZW5zaW9uLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmcm9tTmF0aXZlRW5kcG9pbnQoZW5kcG9pbnQ6IE5hdGl2ZVNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBlbmRwb2ludC5uYW1lLFxuICAgIC4uLihlbmRwb2ludC5kaXNwbGF5TmFtZSAhPT0gdW5kZWZpbmVkID8geyBkaXNwbGF5TmFtZTogZW5kcG9pbnQuZGlzcGxheU5hbWUgfSA6IHt9KSxcbiAgICAuLi4oZW5kcG9pbnQuZmFtaWx5ICE9PSB1bmRlZmluZWQgPyB7IGZhbWlseTogZW5kcG9pbnQuZmFtaWx5IH0gOiB7fSksXG4gICAgLi4uKGVuZHBvaW50LnRhc2sgIT09IHVuZGVmaW5lZCA/IHsgdGFzazogZW5kcG9pbnQudGFzayB9IDoge30pLFxuICAgIC4uLihlbmRwb2ludC5zdGF0ZSAhPT0gdW5kZWZpbmVkID8geyBzdGF0ZTogZW5kcG9pbnQuc3RhdGUgfSA6IHt9KSxcbiAgICAuLi4oZW5kcG9pbnQuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCA/IHsgZGVzY3JpcHRpb246IGVuZHBvaW50LmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgLi4uKGVuZHBvaW50LnN1cHBvcnRzVG9vbHMgIT09IHVuZGVmaW5lZCA/IHsgc3VwcG9ydHNUb29sczogZW5kcG9pbnQuc3VwcG9ydHNUb29scyB9IDoge30pLFxuICAgIC4uLihlbmRwb2ludC5wcm9maWxlICE9PSB1bmRlZmluZWQgPyB7IHByb2ZpbGU6IGVuZHBvaW50LnByb2ZpbGUgfSA6IHt9KSxcbiAgICAuLi4oZW5kcG9pbnQubW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkID8geyBjbGFzczogZnJvbU5hdGl2ZUNsYXNzKGVuZHBvaW50Lm1vZGVsQ2xhc3MpIH0gOiB7fSksXG4gICAgLi4uKGVuZHBvaW50LnNlcnZpY2VOYW1lcy5zaXplID4gMFxuICAgICAgPyB7IHNlcnZpY2VOYW1lczogT2JqZWN0LmZyb21FbnRyaWVzKGVuZHBvaW50LnNlcnZpY2VOYW1lcykgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IG1vZGVsU2VydmljZU5hbWU6IGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKGVuZHBvaW50LnJlYXNvbmluZ0VmZm9ydHMubGVuZ3RoID4gMFxuICAgICAgPyB7XG4gICAgICAgICAgcmVhc29uaW5nRWZmb3J0czogZW5kcG9pbnQucmVhc29uaW5nRWZmb3J0cy5tYXAoXG4gICAgICAgICAgICAoZWZmb3J0KSA9PiBSRUFTT05JTkdfRUZGT1JUX0ZST01fTkFUSVZFW2VmZm9ydF0sXG4gICAgICAgICAgKSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgc3RhdHVzOiB7IGRlcHJlY2F0ZWQ6IGVuZHBvaW50LnN0YXR1cy5kZXByZWNhdGVkIH0sXG4gICAgLi4uKGVuZHBvaW50LmRpbWVuc2lvbiAhPT0gdW5kZWZpbmVkID8geyBkaW1lbnNpb246IGVuZHBvaW50LmRpbWVuc2lvbiB9IDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmcm9tTmF0aXZlQ2xhc3MobW9kZWxDbGFzczogTmF0aXZlTW9kZWxDbGFzcyk6IE1vZGVsQ2xhc3Mge1xuICBzd2l0Y2ggKG1vZGVsQ2xhc3MpIHtcbiAgICBjYXNlIE5hdGl2ZU1vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nOlxuICAgICAgcmV0dXJuIG1vZGVsLk1vZGVsQ2xhc3MuQ2hhdFRoaW5raW5nO1xuICAgIGNhc2UgTmF0aXZlTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQ6XG4gICAgICByZXR1cm4gbW9kZWwuTW9kZWxDbGFzcy5DaGF0QmFsYW5jZWQ7XG4gICAgY2FzZSBOYXRpdmVNb2RlbENsYXNzLkNoYXRGYXN0OlxuICAgICAgcmV0dXJuIG1vZGVsLk1vZGVsQ2xhc3MuQ2hhdEZhc3Q7XG4gICAgY2FzZSBOYXRpdmVNb2RlbENsYXNzLkVtYmVkZGluZzpcbiAgICAgIHJldHVybiBtb2RlbC5Nb2RlbENsYXNzLkVtYmVkZGluZztcbiAgfVxufVxuIl19
@@ -11,7 +11,12 @@
11
11
  */
12
12
  import { model } from "@dbx-tools/shared-model";
13
13
  type ModelClass = model.ModelClass;
14
- declare const ModelClass: typeof model.ModelClass;
14
+ declare const ModelClass: {
15
+ readonly ChatThinking: "chat-thinking";
16
+ readonly ChatBalanced: "chat-balanced";
17
+ readonly ChatFast: "chat-fast";
18
+ readonly Embedding: "embedding";
19
+ };
15
20
  /**
16
21
  * Chat capability ladder in descending order - most capable
17
22
  * ({@link ModelClass.ChatThinking}) first, least ({@link ModelClass.ChatFast})
@@ -5,27 +5,30 @@
5
5
  * token, the service principal can't list, or the workspace is unreachable -
6
6
  * the resolver still has to name *some* endpoint. This module holds that floor:
7
7
  * a small, hard-coded set of well-known Foundation Model API endpoint names,
8
- * each bucketed into a chat {@link ModelClass} by the shared
9
- * {@link classify.classifyByFamily} heuristic (no classes are hard-coded here)
8
+ * each bucketed into a chat {@link ModelClass} by the Rust family policy
10
9
  * and ordered best-first.
11
10
  *
12
11
  * This is deliberately *server-only*. A browser client never talks to
13
12
  * Databricks directly - it always goes through this server - so it has nothing
14
13
  * to fall back to and must not assume a stale, baked-in model list; it consumes
15
- * the live `/models` response instead. The pure classifier
16
- * ({@link classify.classifyEndpoints}) is what the client shares.
14
+ * the classified live `/models` response instead.
17
15
  *
18
16
  * @module
19
17
  */
20
18
  import { model } from "@dbx-tools/shared-model";
21
19
  type ModelClass = model.ModelClass;
22
- declare const ModelClass: typeof model.ModelClass;
20
+ declare const ModelClass: {
21
+ readonly ChatThinking: "chat-thinking";
22
+ readonly ChatBalanced: "chat-balanced";
23
+ readonly ChatFast: "chat-fast";
24
+ readonly Embedding: "embedding";
25
+ };
23
26
  /**
24
27
  * Static fallback model ids for a chat class, drawn from the small built-in
25
28
  * {@link FALLBACK_MODEL_NAMES} list and ordered best-first by family rank. Sync
26
29
  * and workspace-independent: this is the *fallback opinion* used to seed default
27
30
  * lists or when the live catalogue is unreachable - live resolution prefers
28
- * {@link classify.classifyEndpoints}. Returns `[]` for
31
+ * the Rust-classified workspace catalogue. Returns `[]` for
29
32
  * {@link ModelClass.Embedding} (the floor is chat-only).
30
33
  */
31
34
  export declare function modelsForClass(cls: ModelClass): readonly string[];
@@ -5,23 +5,22 @@
5
5
  * token, the service principal can't list, or the workspace is unreachable -
6
6
  * the resolver still has to name *some* endpoint. This module holds that floor:
7
7
  * a small, hard-coded set of well-known Foundation Model API endpoint names,
8
- * each bucketed into a chat {@link ModelClass} by the shared
9
- * {@link classify.classifyByFamily} heuristic (no classes are hard-coded here)
8
+ * each bucketed into a chat {@link ModelClass} by the Rust family policy
10
9
  * and ordered best-first.
11
10
  *
12
11
  * This is deliberately *server-only*. A browser client never talks to
13
12
  * Databricks directly - it always goes through this server - so it has nothing
14
13
  * to fall back to and must not assume a stale, baked-in model list; it consumes
15
- * the live `/models` response instead. The pure classifier
16
- * ({@link classify.classifyEndpoints}) is what the client shares.
14
+ * the classified live `/models` response instead.
17
15
  *
18
16
  * @module
19
17
  */
20
- import { classify, model } from "@dbx-tools/shared-model";
18
+ import { model } from "@dbx-tools/shared-model";
19
+ import { rankEndpoints } from "./_native.js";
21
20
  const { ModelClass } = model;
22
21
  /**
23
22
  * Small, last-resort set of well-known Foundation Model API endpoint names,
24
- * ordered best-first within each class by {@link classify.classifyByFamily}.
23
+ * ordered best-first within each class by the Rust model ranker.
25
24
  * Used only as the floor when the live `/serving-endpoints` catalogue can't be
26
25
  * read at resolve time; the live, score-driven classification supersedes it
27
26
  * whenever the workspace listing is available. Classes are not hard-coded here
@@ -38,19 +37,22 @@ const FALLBACK_MODEL_NAMES = [
38
37
  "databricks-gpt-5-nano",
39
38
  "databricks-meta-llama-3-1-8b-instruct",
40
39
  ];
40
+ const FALLBACK_ENDPOINTS = FALLBACK_MODEL_NAMES.map((name) => ({
41
+ name,
42
+ task: "llm/v1/chat",
43
+ }));
41
44
  /**
42
45
  * Static fallback model ids for a chat class, drawn from the small built-in
43
46
  * {@link FALLBACK_MODEL_NAMES} list and ordered best-first by family rank. Sync
44
47
  * and workspace-independent: this is the *fallback opinion* used to seed default
45
48
  * lists or when the live catalogue is unreachable - live resolution prefers
46
- * {@link classify.classifyEndpoints}. Returns `[]` for
49
+ * the Rust-classified workspace catalogue. Returns `[]` for
47
50
  * {@link ModelClass.Embedding} (the floor is chat-only).
48
51
  */
49
52
  export function modelsForClass(cls) {
50
- return FALLBACK_MODEL_NAMES.map((name) => ({ name, c: classify.classifyByFamily(name) }))
51
- .filter((x) => x.c !== null && x.c.class === cls)
52
- .sort((a, b) => b.c.rank - a.c.rank)
53
- .map((x) => x.name);
53
+ return rankEndpoints(FALLBACK_ENDPOINTS, { modelClass: cls })
54
+ .filter((ranked) => ranked.modelClass === cls)
55
+ .map((ranked) => ranked.endpoint.name);
54
56
  }
55
57
  /** Top static fallback model id for a chat class. */
56
58
  export function modelForClass(cls) {
@@ -66,4 +68,4 @@ export const FALLBACK_MODEL_IDS = [
66
68
  ...modelsForClass(ModelClass.ChatBalanced),
67
69
  ...modelsForClass(ModelClass.ChatFast),
68
70
  ];
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFsbGJhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmFsbGJhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFvQixNQUFNLHlCQUF5QixDQUFDO0FBRzVFLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFFN0I7Ozs7Ozs7R0FPRztBQUNILE1BQU0sb0JBQW9CLEdBQXNCO0lBQzlDLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5QixvQkFBb0I7SUFDcEIsd0NBQXdDO0lBQ3hDLDZCQUE2QjtJQUM3Qix1QkFBdUI7SUFDdkIsdUNBQXVDO0NBQ3hDLENBQUM7QUFFRjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFlO0lBQzVDLE9BQU8sb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3RGLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBeUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQztTQUN2RixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUNuQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QixDQUFDO0FBRUQscURBQXFEO0FBQ3JELE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBZTtJQUMzQyxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQztBQUNqQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFzQjtJQUNuRCxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO0lBQzFDLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUM7SUFDMUMsR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztDQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZXJ2ZXItc2lkZSBvZmZsaW5lIGZhbGxiYWNrIG9waW5pb24gZm9yIG1vZGVsIHNlbGVjdGlvbi5cbiAqXG4gKiBXaGVuIHRoZSBsaXZlIGAvc2VydmluZy1lbmRwb2ludHNgIGNhdGFsb2d1ZSBjYW4ndCBiZSByZWFkIGF0IGFsbCAtIG5vIHVzZXJcbiAqIHRva2VuLCB0aGUgc2VydmljZSBwcmluY2lwYWwgY2FuJ3QgbGlzdCwgb3IgdGhlIHdvcmtzcGFjZSBpcyB1bnJlYWNoYWJsZSAtXG4gKiB0aGUgcmVzb2x2ZXIgc3RpbGwgaGFzIHRvIG5hbWUgKnNvbWUqIGVuZHBvaW50LiBUaGlzIG1vZHVsZSBob2xkcyB0aGF0IGZsb29yOlxuICogYSBzbWFsbCwgaGFyZC1jb2RlZCBzZXQgb2Ygd2VsbC1rbm93biBGb3VuZGF0aW9uIE1vZGVsIEFQSSBlbmRwb2ludCBuYW1lcyxcbiAqIGVhY2ggYnVja2V0ZWQgaW50byBhIGNoYXQge0BsaW5rIE1vZGVsQ2xhc3N9IGJ5IHRoZSBzaGFyZWRcbiAqIHtAbGluayBjbGFzc2lmeS5jbGFzc2lmeUJ5RmFtaWx5fSBoZXVyaXN0aWMgKG5vIGNsYXNzZXMgYXJlIGhhcmQtY29kZWQgaGVyZSlcbiAqIGFuZCBvcmRlcmVkIGJlc3QtZmlyc3QuXG4gKlxuICogVGhpcyBpcyBkZWxpYmVyYXRlbHkgKnNlcnZlci1vbmx5Ki4gQSBicm93c2VyIGNsaWVudCBuZXZlciB0YWxrcyB0b1xuICogRGF0YWJyaWNrcyBkaXJlY3RseSAtIGl0IGFsd2F5cyBnb2VzIHRocm91Z2ggdGhpcyBzZXJ2ZXIgLSBzbyBpdCBoYXMgbm90aGluZ1xuICogdG8gZmFsbCBiYWNrIHRvIGFuZCBtdXN0IG5vdCBhc3N1bWUgYSBzdGFsZSwgYmFrZWQtaW4gbW9kZWwgbGlzdDsgaXQgY29uc3VtZXNcbiAqIHRoZSBsaXZlIGAvbW9kZWxzYCByZXNwb25zZSBpbnN0ZWFkLiBUaGUgcHVyZSBjbGFzc2lmaWVyXG4gKiAoe0BsaW5rIGNsYXNzaWZ5LmNsYXNzaWZ5RW5kcG9pbnRzfSkgaXMgd2hhdCB0aGUgY2xpZW50IHNoYXJlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY2xhc3NpZnksIG1vZGVsLCB0eXBlIEZhbWlseUNsYXNzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5cbnR5cGUgTW9kZWxDbGFzcyA9IG1vZGVsLk1vZGVsQ2xhc3M7XG5jb25zdCB7IE1vZGVsQ2xhc3MgfSA9IG1vZGVsO1xuXG4vKipcbiAqIFNtYWxsLCBsYXN0LXJlc29ydCBzZXQgb2Ygd2VsbC1rbm93biBGb3VuZGF0aW9uIE1vZGVsIEFQSSBlbmRwb2ludCBuYW1lcyxcbiAqIG9yZGVyZWQgYmVzdC1maXJzdCB3aXRoaW4gZWFjaCBjbGFzcyBieSB7QGxpbmsgY2xhc3NpZnkuY2xhc3NpZnlCeUZhbWlseX0uXG4gKiBVc2VkIG9ubHkgYXMgdGhlIGZsb29yIHdoZW4gdGhlIGxpdmUgYC9zZXJ2aW5nLWVuZHBvaW50c2AgY2F0YWxvZ3VlIGNhbid0IGJlXG4gKiByZWFkIGF0IHJlc29sdmUgdGltZTsgdGhlIGxpdmUsIHNjb3JlLWRyaXZlbiBjbGFzc2lmaWNhdGlvbiBzdXBlcnNlZGVzIGl0XG4gKiB3aGVuZXZlciB0aGUgd29ya3NwYWNlIGxpc3RpbmcgaXMgYXZhaWxhYmxlLiBDbGFzc2VzIGFyZSBub3QgaGFyZC1jb2RlZCBoZXJlXG4gKiAtIGVhY2ggbmFtZSBpcyBjbGFzc2lmaWVkIGJ5IGZhbWlseSBoZXVyaXN0aWMuXG4gKi9cbmNvbnN0IEZBTExCQUNLX01PREVMX05BTUVTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgXCJkYXRhYnJpY2tzLWNsYXVkZS1vcHVzLTQtOFwiLFxuICBcImRhdGFicmlja3MtZ3B0LTUtNS1wcm9cIixcbiAgXCJkYXRhYnJpY2tzLWdlbWluaS0zLTEtcHJvXCIsXG4gIFwiZGF0YWJyaWNrcy1jbGF1ZGUtc29ubmV0LTQtNlwiLFxuICBcImRhdGFicmlja3MtZ3B0LTUtNVwiLFxuICBcImRhdGFicmlja3MtbWV0YS1sbGFtYS0zLTMtNzBiLWluc3RydWN0XCIsXG4gIFwiZGF0YWJyaWNrcy1jbGF1ZGUtaGFpa3UtNC01XCIsXG4gIFwiZGF0YWJyaWNrcy1ncHQtNS1uYW5vXCIsXG4gIFwiZGF0YWJyaWNrcy1tZXRhLWxsYW1hLTMtMS04Yi1pbnN0cnVjdFwiLFxuXTtcblxuLyoqXG4gKiBTdGF0aWMgZmFsbGJhY2sgbW9kZWwgaWRzIGZvciBhIGNoYXQgY2xhc3MsIGRyYXduIGZyb20gdGhlIHNtYWxsIGJ1aWx0LWluXG4gKiB7QGxpbmsgRkFMTEJBQ0tfTU9ERUxfTkFNRVN9IGxpc3QgYW5kIG9yZGVyZWQgYmVzdC1maXJzdCBieSBmYW1pbHkgcmFuay4gU3luY1xuICogYW5kIHdvcmtzcGFjZS1pbmRlcGVuZGVudDogdGhpcyBpcyB0aGUgKmZhbGxiYWNrIG9waW5pb24qIHVzZWQgdG8gc2VlZCBkZWZhdWx0XG4gKiBsaXN0cyBvciB3aGVuIHRoZSBsaXZlIGNhdGFsb2d1ZSBpcyB1bnJlYWNoYWJsZSAtIGxpdmUgcmVzb2x1dGlvbiBwcmVmZXJzXG4gKiB7QGxpbmsgY2xhc3NpZnkuY2xhc3NpZnlFbmRwb2ludHN9LiBSZXR1cm5zIGBbXWAgZm9yXG4gKiB7QGxpbmsgTW9kZWxDbGFzcy5FbWJlZGRpbmd9ICh0aGUgZmxvb3IgaXMgY2hhdC1vbmx5KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsc0ZvckNsYXNzKGNsczogTW9kZWxDbGFzcyk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgcmV0dXJuIEZBTExCQUNLX01PREVMX05BTUVTLm1hcCgobmFtZSkgPT4gKHsgbmFtZSwgYzogY2xhc3NpZnkuY2xhc3NpZnlCeUZhbWlseShuYW1lKSB9KSlcbiAgICAuZmlsdGVyKCh4KTogeCBpcyB7IG5hbWU6IHN0cmluZzsgYzogRmFtaWx5Q2xhc3MgfSA9PiB4LmMgIT09IG51bGwgJiYgeC5jLmNsYXNzID09PSBjbHMpXG4gICAgLnNvcnQoKGEsIGIpID0+IGIuYy5yYW5rIC0gYS5jLnJhbmspXG4gICAgLm1hcCgoeCkgPT4geC5uYW1lKTtcbn1cblxuLyoqIFRvcCBzdGF0aWMgZmFsbGJhY2sgbW9kZWwgaWQgZm9yIGEgY2hhdCBjbGFzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbEZvckNsYXNzKGNsczogTW9kZWxDbGFzcyk6IHN0cmluZyB7XG4gIHJldHVybiBtb2RlbHNGb3JDbGFzcyhjbHMpWzBdITtcbn1cblxuLyoqXG4gKiBQcmlvcml0eS1vcmRlcmVkIGZhbGxiYWNrIGNoYWluIChDaGF0VGhpbmtpbmcgLT4gQ2hhdEJhbGFuY2VkIC0+IENoYXRGYXN0KVxuICogb3ZlciB0aGUgc21hbGwgYnVpbHQtaW4gbGlzdC4gVGhlIGZsb29yIHdhbGtlZCBhdCByZXNvbHZlIHRpbWUgd2hlbiBubyBhZ2VudFxuICogLyBwbHVnaW4gLyBlbnYgLyByZXF1ZXN0IG1vZGVsIGlzIHNldCAqYW5kKiB0aGUgbGl2ZSBjYXRhbG9ndWUgeWllbGRzIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBGQUxMQkFDS19NT0RFTF9JRFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAuLi5tb2RlbHNGb3JDbGFzcyhNb2RlbENsYXNzLkNoYXRUaGlua2luZyksXG4gIC4uLm1vZGVsc0ZvckNsYXNzKE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKSxcbiAgLi4ubW9kZWxzRm9yQ2xhc3MoTW9kZWxDbGFzcy5DaGF0RmFzdCksXG5dO1xuIl19
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFsbGJhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmFsbGJhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUErQixNQUFNLHlCQUF5QixDQUFDO0FBRTdFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHN0MsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQztBQUU3Qjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxvQkFBb0IsR0FBc0I7SUFDOUMsNEJBQTRCO0lBQzVCLHdCQUF3QjtJQUN4QiwyQkFBMkI7SUFDM0IsOEJBQThCO0lBQzlCLG9CQUFvQjtJQUNwQix3Q0FBd0M7SUFDeEMsNkJBQTZCO0lBQzdCLHVCQUF1QjtJQUN2Qix1Q0FBdUM7Q0FDeEMsQ0FBQztBQUVGLE1BQU0sa0JBQWtCLEdBQXNDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNoRyxJQUFJO0lBQ0osSUFBSSxFQUFFLGFBQWE7Q0FDcEIsQ0FBQyxDQUFDLENBQUM7QUFFSjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFlO0lBQzVDLE9BQU8sYUFBYSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDO1NBQzFELE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsS0FBSyxHQUFHLENBQUM7U0FDN0MsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFFRCxxREFBcUQ7QUFDckQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxHQUFlO0lBQzNDLE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFDO0FBQ2pDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQXNCO0lBQ25ELEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUM7SUFDMUMsR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztJQUMxQyxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO0NBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlcnZlci1zaWRlIG9mZmxpbmUgZmFsbGJhY2sgb3BpbmlvbiBmb3IgbW9kZWwgc2VsZWN0aW9uLlxuICpcbiAqIFdoZW4gdGhlIGxpdmUgYC9zZXJ2aW5nLWVuZHBvaW50c2AgY2F0YWxvZ3VlIGNhbid0IGJlIHJlYWQgYXQgYWxsIC0gbm8gdXNlclxuICogdG9rZW4sIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCBjYW4ndCBsaXN0LCBvciB0aGUgd29ya3NwYWNlIGlzIHVucmVhY2hhYmxlIC1cbiAqIHRoZSByZXNvbHZlciBzdGlsbCBoYXMgdG8gbmFtZSAqc29tZSogZW5kcG9pbnQuIFRoaXMgbW9kdWxlIGhvbGRzIHRoYXQgZmxvb3I6XG4gKiBhIHNtYWxsLCBoYXJkLWNvZGVkIHNldCBvZiB3ZWxsLWtub3duIEZvdW5kYXRpb24gTW9kZWwgQVBJIGVuZHBvaW50IG5hbWVzLFxuICogZWFjaCBidWNrZXRlZCBpbnRvIGEgY2hhdCB7QGxpbmsgTW9kZWxDbGFzc30gYnkgdGhlIFJ1c3QgZmFtaWx5IHBvbGljeVxuICogYW5kIG9yZGVyZWQgYmVzdC1maXJzdC5cbiAqXG4gKiBUaGlzIGlzIGRlbGliZXJhdGVseSAqc2VydmVyLW9ubHkqLiBBIGJyb3dzZXIgY2xpZW50IG5ldmVyIHRhbGtzIHRvXG4gKiBEYXRhYnJpY2tzIGRpcmVjdGx5IC0gaXQgYWx3YXlzIGdvZXMgdGhyb3VnaCB0aGlzIHNlcnZlciAtIHNvIGl0IGhhcyBub3RoaW5nXG4gKiB0byBmYWxsIGJhY2sgdG8gYW5kIG11c3Qgbm90IGFzc3VtZSBhIHN0YWxlLCBiYWtlZC1pbiBtb2RlbCBsaXN0OyBpdCBjb25zdW1lc1xuICogdGhlIGNsYXNzaWZpZWQgbGl2ZSBgL21vZGVsc2AgcmVzcG9uc2UgaW5zdGVhZC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbW9kZWwsIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuXG5pbXBvcnQgeyByYW5rRW5kcG9pbnRzIH0gZnJvbSBcIi4vX25hdGl2ZS50c1wiO1xuXG50eXBlIE1vZGVsQ2xhc3MgPSBtb2RlbC5Nb2RlbENsYXNzO1xuY29uc3QgeyBNb2RlbENsYXNzIH0gPSBtb2RlbDtcblxuLyoqXG4gKiBTbWFsbCwgbGFzdC1yZXNvcnQgc2V0IG9mIHdlbGwta25vd24gRm91bmRhdGlvbiBNb2RlbCBBUEkgZW5kcG9pbnQgbmFtZXMsXG4gKiBvcmRlcmVkIGJlc3QtZmlyc3Qgd2l0aGluIGVhY2ggY2xhc3MgYnkgdGhlIFJ1c3QgbW9kZWwgcmFua2VyLlxuICogVXNlZCBvbmx5IGFzIHRoZSBmbG9vciB3aGVuIHRoZSBsaXZlIGAvc2VydmluZy1lbmRwb2ludHNgIGNhdGFsb2d1ZSBjYW4ndCBiZVxuICogcmVhZCBhdCByZXNvbHZlIHRpbWU7IHRoZSBsaXZlLCBzY29yZS1kcml2ZW4gY2xhc3NpZmljYXRpb24gc3VwZXJzZWRlcyBpdFxuICogd2hlbmV2ZXIgdGhlIHdvcmtzcGFjZSBsaXN0aW5nIGlzIGF2YWlsYWJsZS4gQ2xhc3NlcyBhcmUgbm90IGhhcmQtY29kZWQgaGVyZVxuICogLSBlYWNoIG5hbWUgaXMgY2xhc3NpZmllZCBieSBmYW1pbHkgaGV1cmlzdGljLlxuICovXG5jb25zdCBGQUxMQkFDS19NT0RFTF9OQU1FUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIFwiZGF0YWJyaWNrcy1jbGF1ZGUtb3B1cy00LThcIixcbiAgXCJkYXRhYnJpY2tzLWdwdC01LTUtcHJvXCIsXG4gIFwiZGF0YWJyaWNrcy1nZW1pbmktMy0xLXByb1wiLFxuICBcImRhdGFicmlja3MtY2xhdWRlLXNvbm5ldC00LTZcIixcbiAgXCJkYXRhYnJpY2tzLWdwdC01LTVcIixcbiAgXCJkYXRhYnJpY2tzLW1ldGEtbGxhbWEtMy0zLTcwYi1pbnN0cnVjdFwiLFxuICBcImRhdGFicmlja3MtY2xhdWRlLWhhaWt1LTQtNVwiLFxuICBcImRhdGFicmlja3MtZ3B0LTUtbmFub1wiLFxuICBcImRhdGFicmlja3MtbWV0YS1sbGFtYS0zLTEtOGItaW5zdHJ1Y3RcIixcbl07XG5cbmNvbnN0IEZBTExCQUNLX0VORFBPSU5UUzogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdID0gRkFMTEJBQ0tfTU9ERUxfTkFNRVMubWFwKChuYW1lKSA9PiAoe1xuICBuYW1lLFxuICB0YXNrOiBcImxsbS92MS9jaGF0XCIsXG59KSk7XG5cbi8qKlxuICogU3RhdGljIGZhbGxiYWNrIG1vZGVsIGlkcyBmb3IgYSBjaGF0IGNsYXNzLCBkcmF3biBmcm9tIHRoZSBzbWFsbCBidWlsdC1pblxuICoge0BsaW5rIEZBTExCQUNLX01PREVMX05BTUVTfSBsaXN0IGFuZCBvcmRlcmVkIGJlc3QtZmlyc3QgYnkgZmFtaWx5IHJhbmsuIFN5bmNcbiAqIGFuZCB3b3Jrc3BhY2UtaW5kZXBlbmRlbnQ6IHRoaXMgaXMgdGhlICpmYWxsYmFjayBvcGluaW9uKiB1c2VkIHRvIHNlZWQgZGVmYXVsdFxuICogbGlzdHMgb3Igd2hlbiB0aGUgbGl2ZSBjYXRhbG9ndWUgaXMgdW5yZWFjaGFibGUgLSBsaXZlIHJlc29sdXRpb24gcHJlZmVyc1xuICogdGhlIFJ1c3QtY2xhc3NpZmllZCB3b3Jrc3BhY2UgY2F0YWxvZ3VlLiBSZXR1cm5zIGBbXWAgZm9yXG4gKiB7QGxpbmsgTW9kZWxDbGFzcy5FbWJlZGRpbmd9ICh0aGUgZmxvb3IgaXMgY2hhdC1vbmx5KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsc0ZvckNsYXNzKGNsczogTW9kZWxDbGFzcyk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJhbmtFbmRwb2ludHMoRkFMTEJBQ0tfRU5EUE9JTlRTLCB7IG1vZGVsQ2xhc3M6IGNscyB9KVxuICAgIC5maWx0ZXIoKHJhbmtlZCkgPT4gcmFua2VkLm1vZGVsQ2xhc3MgPT09IGNscylcbiAgICAubWFwKChyYW5rZWQpID0+IHJhbmtlZC5lbmRwb2ludC5uYW1lKTtcbn1cblxuLyoqIFRvcCBzdGF0aWMgZmFsbGJhY2sgbW9kZWwgaWQgZm9yIGEgY2hhdCBjbGFzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbEZvckNsYXNzKGNsczogTW9kZWxDbGFzcyk6IHN0cmluZyB7XG4gIHJldHVybiBtb2RlbHNGb3JDbGFzcyhjbHMpWzBdITtcbn1cblxuLyoqXG4gKiBQcmlvcml0eS1vcmRlcmVkIGZhbGxiYWNrIGNoYWluIChDaGF0VGhpbmtpbmcgLT4gQ2hhdEJhbGFuY2VkIC0+IENoYXRGYXN0KVxuICogb3ZlciB0aGUgc21hbGwgYnVpbHQtaW4gbGlzdC4gVGhlIGZsb29yIHdhbGtlZCBhdCByZXNvbHZlIHRpbWUgd2hlbiBubyBhZ2VudFxuICogLyBwbHVnaW4gLyBlbnYgLyByZXF1ZXN0IG1vZGVsIGlzIHNldCAqYW5kKiB0aGUgbGl2ZSBjYXRhbG9ndWUgeWllbGRzIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBGQUxMQkFDS19NT0RFTF9JRFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAuLi5tb2RlbHNGb3JDbGFzcyhNb2RlbENsYXNzLkNoYXRUaGlua2luZyksXG4gIC4uLm1vZGVsc0ZvckNsYXNzKE1vZGVsQ2xhc3MuQ2hhdEJhbGFuY2VkKSxcbiAgLi4ubW9kZWxzRm9yQ2xhc3MoTW9kZWxDbGFzcy5DaGF0RmFzdCksXG5dO1xuIl19
@@ -1,15 +1,15 @@
1
1
  /**
2
2
  * Live Databricks Model Serving catalogue access.
3
3
  *
4
- * Lists the workspace's `/serving-endpoints` once per host and caches the
5
- * result with a TTL via AppKit's `CacheManager`, with concurrent callers
6
- * sharing one in-flight promise (the coalescing pattern of Python's
7
- * `cachetools-async`). Surfaces each endpoint as a stable
4
+ * Lists the workspace's `/serving-endpoints` and, when the caller supplies a
5
+ * trusted credential identity, caches the result per host and identity with a
6
+ * TTL via AppKit's `CacheManager`. Concurrent callers in the same scope share
7
+ * one in-flight promise. Surfaces each endpoint as a stable
8
8
  * {@link ServingEndpointSummary} - including the Foundation Model API
9
9
  * `quality` / `speed` / `cost` profile when present, the classified
10
10
  * {@link ModelClass}, and (for embedding endpoints) the measured vector
11
11
  * `dimension` - and snaps loose, human-typed names to real endpoint ids
12
- * through `fuse.js` extended search so tokens like `"claude sonnet"` resolve to
12
+ * through the Rust model ranker so tokens like `"claude sonnet"` resolve to
13
13
  * `databricks-claude-sonnet-4-6`.
14
14
  *
15
15
  * The class stamp and embedding dimension are computed once per cache load:
@@ -30,7 +30,7 @@ import { type ServingEndpointSummary } from "@dbx-tools/shared-model";
30
30
  export type WorkspaceClientLike = Pick<appkit.WorkspaceClientLike, "servingEndpoints">;
31
31
  /** Default TTL for the in-memory endpoint cache. Matches the Databricks SDK's session lifetime budget. */
32
32
  export declare const DEFAULT_MODEL_CACHE_TTL_MS: number;
33
- /** Default Fuse.js score threshold below which a fuzzy match is accepted. */
33
+ /** Default Rust distance threshold below which a fuzzy match is accepted. */
34
34
  export declare const DEFAULT_FUZZY_THRESHOLD = 0.4;
35
35
  /** Options for {@link listServingEndpoints}. */
36
36
  export interface ListServingEndpointsOptions {
@@ -39,6 +39,15 @@ export interface ListServingEndpointsOptions {
39
39
  * `CacheManager` as seconds.
40
40
  */
41
41
  ttlMs?: number;
42
+ /**
43
+ * Trusted identity of the credential used by `client`.
44
+ *
45
+ * The value is hashed before it enters the cache key and is never logged.
46
+ * Omit it when the caller cannot prove the credential identity; that call
47
+ * bypasses shared caching so one principal can never read another's
48
+ * catalogue.
49
+ */
50
+ cacheIdentity?: string;
42
51
  }
43
52
  /**
44
53
  * List Model Serving endpoints for the workspace owning `client`, routed
@@ -73,16 +82,15 @@ export declare function listServingEndpoints(client: WorkspaceClientLike, host:
73
82
  */
74
83
  export declare function listServingEndpointsUncached(client: WorkspaceClientLike): Promise<ServingEndpointSummary[]>;
75
84
  /**
76
- * Force-evict cached endpoint listings via AppKit's `CacheManager`. With a
77
- * `host` deletes that one workspace's entry; without one clears every cache
78
- * entry on the manager (since `CacheManager` doesn't expose a namespace-scoped
79
- * clear, this is the brute-force path - fine for tests, avoid in steady-state
80
- * code).
85
+ * Force-evict cached endpoint listings via AppKit's `CacheManager`. A host and
86
+ * identity delete only that principal's workspace entry. Because CacheManager
87
+ * cannot enumerate a namespace, omitting either value clears the complete
88
+ * manager and should be reserved for tests or administrative refreshes.
81
89
  */
82
- export declare function clearServingEndpointsCache(host?: string): Promise<void>;
90
+ export declare function clearServingEndpointsCache(host?: string, cacheIdentity?: string): Promise<void>;
83
91
  /**
84
92
  * Result of fuzzy-resolving a user-supplied model name against the live
85
- * endpoint list. `score` is Fuse.js's distance (`0` is exact, `1` is no match);
93
+ * endpoint list. `score` is the Rust ranker's distance (`0` is exact, `1` is no match);
86
94
  * `matched` is `false` when the score exceeds the configured threshold so
87
95
  * callers can fall back to the original input (Databricks will then return a
88
96
  * clean 404).
@@ -94,7 +102,7 @@ export interface ResolvedModel {
94
102
  }
95
103
  /** Options accepted by {@link resolveModelId} / {@link searchServingEndpoints}. */
96
104
  export interface ResolveModelOptions {
97
- /** Fuse.js threshold (0 = exact, 1 = anything). Default `0.4`. */
105
+ /** Fuzzy distance threshold (0 = exact, 1 = anything). Default `0.4`. */
98
106
  threshold?: number;
99
107
  /** Require a model verified for a complete function-tool round-trip. */
100
108
  requiresTools?: boolean;
@@ -102,7 +110,7 @@ export interface ResolveModelOptions {
102
110
  /** A serving endpoint paired with its fuzzy-match distance for a query. */
103
111
  export interface ScoredEndpoint {
104
112
  endpoint: ServingEndpointSummary;
105
- /** Fuse.js distance: `0` is exact, `1` is no match. */
113
+ /** Fuzzy distance: `0` is exact, `1` is no match. */
106
114
  score: number;
107
115
  }
108
116
  /**
@@ -110,11 +118,8 @@ export interface ScoredEndpoint {
110
118
  * (lowest score) first, keeping only those within `threshold`:
111
119
  *
112
120
  * 1. An exact name match short-circuits to a single `score: 0` result.
113
- * 2. Otherwise the input is tokenized (dashes / underscores / spaces become
114
- * separators) and fed through Fuse.js extended search, which AND-s each
115
- * token with fuzzy matching enabled - the "tokenized fuzzy match" a caller
116
- * reaches for when they type `"claude sonnet"` instead of the full endpoint
117
- * name.
121
+ * 2. Otherwise Rust tokenizes the input and scores every endpoint through the
122
+ * same fuzzy-distance policy used by {@link lookupModels}.
118
123
  *
119
124
  * Returns `[]` for an empty endpoint list or when `input` tokenizes to nothing,
120
125
  * so callers fall back to the raw input and let Databricks surface a clean 404.