@dbx-tools/shared-model 0.9.4 → 0.9.6

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
@@ -1,25 +1,19 @@
1
1
  # @dbx-tools/shared-model
2
2
 
3
- Browser-safe model-selection contract and classifier.
3
+ Browser-safe model-selection contracts generated from the canonical model
4
+ owner.
4
5
 
5
6
  Import this package when UI code, route handlers, tools, or tests need to
6
- validate model lookup requests, type ranked model responses, or classify serving
7
- endpoints without talking to Databricks. Live workspace listing and fuzzy
8
- resolution live in [`@dbx-tools/model`](../../node/model).
7
+ validate model lookup requests or type ranked model responses without talking
8
+ to Databricks. Normalization, classification, capability policy, ranking, and
9
+ fuzzy resolution are exposed through [`@dbx-tools/model`](../../node/model).
9
10
 
10
11
  Key features:
11
12
 
12
- - Shared `ModelClass` taxonomy for chat-thinking, chat-balanced, chat-fast, and
13
- embedding workloads.
14
- - Browser-safe zod schemas for lookup requests, endpoint summaries, ranked
15
- results, and profile metadata.
16
- - Endpoint classifier that groups serving endpoints by score profile and family
17
- naming conventions, plus `classify.endpointCapabilities` for chat / embedding
18
- / tool-calling capability flags.
19
- - Version/family parsing helpers for model catalogues and tests.
13
+ - Generated `ModelClass`, endpoint, query, status, profile, ranking, and
14
+ reasoning-effort contracts as browser-safe TypeScript and zod.
20
15
  - Human-readable endpoint display names via `display.toModelDisplayName`.
21
- - OpenAI wire contracts: chat message/tool-call types plus a Responses API
22
- translator, so a proxy, a route, and a UI all speak the same payload shapes.
16
+ - Browser-safe OpenAI Chat message and tool-call contracts.
23
17
  - Types that match the server selection API without depending on the Databricks
24
18
  SDK.
25
19
 
@@ -34,12 +28,9 @@ display.toModelDisplayName("x", "Claude 4.6 (Preview)"); // provided name wins
34
28
  ```
35
29
 
36
30
  `ServingEndpointSummary.displayName` is the optional friendly label for the
37
- picker; `name` stays the invoke id. A Databricks-provided name (a
38
- `display_name`/`displayName`/`name` endpoint tag, or an external-model name
39
- extracted in [`@dbx-tools/model`](../../node/model)'s `serving.ts`) wins;
40
- otherwise the pure helper strips leading vendor prefixes and title-cases via
41
- `@dbx-tools/shared-core`'s tokenizer. It flows through `GET /models`
42
- automatically, and the UI picker shows `displayName ?? name`.
31
+ picker; `name` stays the invoke id. A Databricks-provided name wins. Otherwise,
32
+ the pure helper strips leading vendor prefixes and title-cases through
33
+ `@dbx-tools/shared-core`'s tokenizer.
43
34
 
44
35
  ## Validate A Model Lookup Request
45
36
 
@@ -58,135 +49,38 @@ Use `model.ModelQuerySchema` for route query/body validation and agent tool
58
49
  inputs. It keeps client model pickers and backend resolution endpoints on the
59
50
  same request shape.
60
51
 
61
- ## Type Ranked Results
52
+ ## Use Classified Endpoint Catalogues
62
53
 
63
54
  ```ts
64
- import { model, type RankedModel } from "@dbx-tools/shared-model";
65
-
66
- const ranked: RankedModel = model.RankedModelSchema.parse(response);
67
- ```
68
-
69
- `model.ServingEndpointSummarySchema` describes the stable endpoint fields exposed
70
- to clients: endpoint name, parsed family, task, state, optional profile scores,
71
- classified class, `supportsTools`, provider service names, Rust-derived
72
- reasoning-effort wire values, lifecycle status, and embedding dimension.
73
- `requiresTools: true` filters
74
- search/ranking to endpoints that can complete both a function call and the
75
- subsequent `function_call_output` replay.
76
-
77
- ## Classify Endpoint Catalogues
78
-
79
- ```ts
80
- import { classify, model } from "@dbx-tools/shared-model";
81
-
82
- const byClass = classify.classifyEndpoints(endpoints);
83
- const fast = byClass[model.ModelClass.ChatFast];
84
- const agentModels = endpoints.filter((endpoint) => classify.endpointCapabilities(endpoint).tools);
85
- ```
86
-
87
- Databricks currently exposes no tool-capability attribute in the endpoint list
88
- or OpenAPI schema. `supportsTools` therefore uses a conservative, live-verified
89
- provider-family policy: GPT (except GPT-OSS), Claude, Qwen, GLM, and Llama.
90
- Gemini is excluded because its Open Responses tool-result replay requires a
91
- thought signature the wire does not currently accept; GPT-OSS rejects Responses
92
- passthrough. An explicit `supportsTools` stamp overrides the family fallback.
93
-
94
- The classifier uses Foundation Model API quality/speed/cost scores when present
95
- and family-name heuristics when scores are missing. This is useful for client
96
- grouping, tests, and offline catalogue analysis.
97
-
98
- ## Parse Model Families
99
-
100
- ```ts
101
- const family = classify.classifyByFamily("databricks-claude-sonnet-4-6");
102
- const version = classify.versionTuple("llama-3-1-70b");
103
- ```
104
-
105
- Family parsing helps callers bucket custom lists or explain why an endpoint
106
- landed in a class before the live workspace scores are available.
107
-
108
- ## Ask What An Endpoint Can Do
109
-
110
- ```ts
111
- const caps = classify.endpointCapabilities(endpoint);
112
- if (caps.chat) offerInChatPicker(endpoint);
113
- ```
114
-
115
- Capability comes from the Databricks task hint (`llm/v1/chat` /
116
- `llm/v1/embeddings`) with the classified class as the fallback for endpoints
117
- Databricks left untagged. Filter on this rather than comparing raw `task`
118
- strings, so every picker, CLI, and route agrees on what "chat-capable" means.
119
-
120
- ## Translate The OpenAI Responses API
121
-
122
- ```ts
123
- import { openaiResponses } from "@dbx-tools/shared-model";
124
-
125
- const { chat, stream } = openaiResponses.responsesToChat(requestBody);
126
- // ... POST `chat` to the endpoint's invocations URL ...
127
- const response = openaiResponses.chatToResponse(completion, modelId);
128
- ```
129
-
130
- Databricks serving endpoints speak Chat Completions; some clients (the Codex
131
- CLI, for one) speak only the Responses API. `openaiResponses` bridges the two in
132
- both directions, including a streaming translator
133
- (`createResponsesStreamTranslator`) that lifts `chat.completion.chunk` SSE into
134
- the Responses event stream, and `readResponsesOutput` for pulling the answer and
135
- its citations back out of a native Responses reply. Pure functions over plain
136
- JSON, so the same translation runs in a proxy, a server route, or a test.
137
-
138
- ## Sanitize A Replayed Conversation
139
-
140
- ```ts
141
- import { openaiResponses } from "@dbx-tools/shared-model";
55
+ import { model } from "@dbx-tools/shared-model";
142
56
 
143
- const body = openaiResponses.sanitizeOpenResponsesRequest(requestBody);
57
+ const fast = endpoints.filter((endpoint) => endpoint.class === model.ModelClass.ChatFast);
58
+ const agentModels = endpoints.filter((endpoint) => endpoint.supportsTools);
144
59
  ```
145
60
 
146
- `/open-responses` (the cross-provider path used for Claude and Gemini) rejects
147
- content parts that its own previous turn produced: an `output_text` part replayed
148
- as input fails with `Open Responses input content part type 'output_text' is not
149
- supported`. `sanitizeOpenResponsesRequest` rewrites `output_*` parts back to their
150
- `input_*` form and drops extended-thinking parts before the body goes out.
151
-
152
- The thinking-block types live in one exported constant,
153
- `openaiResponses.REASONING_TYPES`. Both wire sanitizers (this one and the Chat
154
- Completions sanitizer in [`@dbx-tools/appkit-mastra`](../../node/appkit-mastra))
155
- must strip exactly the same set: Anthropic signs `redacted_thinking` blocks, so a
156
- replay in which one path mutates a block the other preserved is rejected
157
- outright. Import the constant rather than re-listing the types.
61
+ The server stamps class and capability fields before returning `/models`.
62
+ Browser clients consume those fields directly; model-family policy does not run
63
+ in the browser.
158
64
 
159
65
  ## Strip Fields Databricks Rejects
160
66
 
161
67
  ```ts
162
68
  import { openaiChat } from "@dbx-tools/shared-model";
163
69
 
164
- const dropped = openaiChat.stripUnsupportedChatFields(body); // mutates `body`
70
+ const dropped = openaiChat.stripUnsupportedChatFields(body);
165
71
  ```
166
72
 
167
- Databricks Model Serving validates the chat body strictly: one unrecognized
168
- top-level key fails the entire turn rather than being ignored. An OpenAI client
169
- that sends `parallel_tool_calls` gets back
170
- `parallel_tool_calls: Extra inputs are not permitted` and no completion at all.
171
-
172
- `stripUnsupportedChatFields` deletes the known offenders in place and returns
173
- what it removed, so a caller can log the difference. Reach for it on any path
174
- that forwards a client body largely as-is; a translator that copies fields
175
- one-by-one (`openaiResponses.responsesToChat`) already can't leak them. Pass
176
- `extra` names to cover a workspace that rejects something not yet in
177
- `openaiChat.UNSUPPORTED_CHAT_FIELDS`.
73
+ Databricks Model Serving validates Chat Completions bodies strictly.
74
+ `stripUnsupportedChatFields` deletes known unsupported fields in place and
75
+ returns the removed names so a caller can log the difference.
178
76
 
179
77
  ## Modules
180
78
 
181
- - `model` - `ModelClass`, reasoning-effort wire schema, and inferred types for
182
- profiles, endpoint summaries, lookup requests, and ranked results.
183
- - `classify` - family parsing, version tuple parsing, endpoint classification,
184
- and capability flags.
79
+ - `model` - model classes, reasoning-effort schema, endpoint summaries, lookup
80
+ requests, and ranked results.
185
81
  - `display` - human-readable endpoint labels.
186
- - `openaiChat` - Chat Completions message / tool-call types,
187
- `chatContentParts`, `chatContentToText`, and `stripUnsupportedChatFields`.
188
- - `openaiResponses` - Responses API translation in both directions, plus
189
- `sanitizeOpenResponsesRequest` and the shared `REASONING_TYPES` constant.
82
+ - `openaiChat` - Chat Completions message and tool-call types, content helpers,
83
+ and rejected-field sanitization.
190
84
 
191
85
  Server-side selection, cache, and fuzzy endpoint matching are in
192
86
  [`@dbx-tools/model`](../../node/model).
package/index.ts CHANGED
@@ -3,16 +3,11 @@
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/shared-model";
6
- export const PACKAGE_VERSION = "0.9.4";
7
- export * as classify from "./src/classify.ts";
6
+ export const PACKAGE_VERSION = "0.9.6";
8
7
  export * as display from "./src/display.ts";
9
8
  export * as model from "./src/model.ts";
10
9
  export * as openaiChat from "./src/openai-chat.ts";
11
- export * as openaiResponses from "./src/openai-responses.ts";
12
- export type { EndpointCapabilities, FamilyClass } from "./src/classify.ts";
13
- export { ModelClass, ModelClassSchema, ModelProfileSchema, ReasoningEffortSchema, ModelStatusSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.ts";
14
- export type { ModelProfile, ReasoningEffort, ModelStatus, ServingEndpointSummary, ModelQuery, RankedModel } from "./src/model.ts";
10
+ export { ModelClass, ReasoningEffortValues, ModelClassSchema, ModelProfileSchema, ReasoningEffortSchema, ModelStatusSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.ts";
11
+ export type { ModelProfile, ModelQuery, ModelStatus, RankedModel, ReasoningEffort, ServingEndpointSummary } from "./src/model.ts";
15
12
  export { UNSUPPORTED_CHAT_FIELDS } from "./src/openai-chat.ts";
16
13
  export type { ChatRole, ChatContentPart, ChatToolCallFunction, ChatToolCall, ChatMessage, ChatContentToTextOptions } from "./src/openai-chat.ts";
17
- export { REASONING_TYPES } from "./src/openai-responses.ts";
18
- export type { ResponsesStreamTranslator, ResponsesCitation, ResponsesOutput } from "./src/openai-responses.ts";
package/lib/index.d.ts CHANGED
@@ -1,14 +1,9 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/shared-model";
2
- export declare const PACKAGE_VERSION = "0.9.4";
3
- export * as classify from "./src/classify.ts";
2
+ export declare const PACKAGE_VERSION = "0.9.6";
4
3
  export * as display from "./src/display.ts";
5
4
  export * as model from "./src/model.ts";
6
5
  export * as openaiChat from "./src/openai-chat.ts";
7
- export * as openaiResponses from "./src/openai-responses.ts";
8
- export type { EndpointCapabilities, FamilyClass } from "./src/classify.ts";
9
- export { ModelClass, ModelClassSchema, ModelProfileSchema, ReasoningEffortSchema, ModelStatusSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.ts";
10
- export type { ModelProfile, ReasoningEffort, ModelStatus, ServingEndpointSummary, ModelQuery, RankedModel } from "./src/model.ts";
6
+ export { ModelClass, ReasoningEffortValues, ModelClassSchema, ModelProfileSchema, ReasoningEffortSchema, ModelStatusSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.ts";
7
+ export type { ModelProfile, ModelQuery, ModelStatus, RankedModel, ReasoningEffort, ServingEndpointSummary } from "./src/model.ts";
11
8
  export { UNSUPPORTED_CHAT_FIELDS } from "./src/openai-chat.ts";
12
9
  export type { ChatRole, ChatContentPart, ChatToolCallFunction, ChatToolCall, ChatMessage, ChatContentToTextOptions } from "./src/openai-chat.ts";
13
- export { REASONING_TYPES } from "./src/openai-responses.ts";
14
- export type { ResponsesStreamTranslator, ResponsesCitation, ResponsesOutput } from "./src/openai-responses.ts";
package/lib/index.js CHANGED
@@ -2,13 +2,10 @@
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/shared-model";
5
- export const PACKAGE_VERSION = "0.9.4";
6
- export * as classify from "./src/classify.js";
5
+ export const PACKAGE_VERSION = "0.9.6";
7
6
  export * as display from "./src/display.js";
8
7
  export * as model from "./src/model.js";
9
8
  export * as openaiChat from "./src/openai-chat.js";
10
- export * as openaiResponses from "./src/openai-responses.js";
11
- export { ModelClass, ModelClassSchema, ModelProfileSchema, ReasoningEffortSchema, ModelStatusSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.js";
9
+ export { ModelClass, ReasoningEffortValues, ModelClassSchema, ModelProfileSchema, ReasoningEffortSchema, ModelStatusSchema, ServingEndpointSummarySchema, ModelQuerySchema, RankedModelSchema } from "./src/model.js";
12
10
  export { UNSUPPORTED_CHAT_FIELDS } from "./src/openai-chat.js";
13
- export { REASONING_TYPES } from "./src/openai-responses.js";
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx5QkFBeUIsQ0FBQztBQUM1RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLGVBQWUsTUFBTSwyQkFBMkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLGlCQUFpQixFQUFFLDRCQUE0QixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0wsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS40XCI7XG5leHBvcnQgKiBhcyBjbGFzc2lmeSBmcm9tIFwiLi9zcmMvY2xhc3NpZnkudHNcIjtcbmV4cG9ydCAqIGFzIGRpc3BsYXkgZnJvbSBcIi4vc3JjL2Rpc3BsYXkudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVsIGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0ICogYXMgb3BlbmFpQ2hhdCBmcm9tIFwiLi9zcmMvb3BlbmFpLWNoYXQudHNcIjtcbmV4cG9ydCAqIGFzIG9wZW5haVJlc3BvbnNlcyBmcm9tIFwiLi9zcmMvb3BlbmFpLXJlc3BvbnNlcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBFbmRwb2ludENhcGFiaWxpdGllcywgRmFtaWx5Q2xhc3MgfSBmcm9tIFwiLi9zcmMvY2xhc3NpZnkudHNcIjtcbmV4cG9ydCB7IE1vZGVsQ2xhc3MsIE1vZGVsQ2xhc3NTY2hlbWEsIE1vZGVsUHJvZmlsZVNjaGVtYSwgUmVhc29uaW5nRWZmb3J0U2NoZW1hLCBNb2RlbFN0YXR1c1NjaGVtYSwgU2VydmluZ0VuZHBvaW50U3VtbWFyeVNjaGVtYSwgTW9kZWxRdWVyeVNjaGVtYSwgUmFua2VkTW9kZWxTY2hlbWEgfSBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxQcm9maWxlLCBSZWFzb25pbmdFZmZvcnQsIE1vZGVsU3RhdHVzLCBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LCBNb2RlbFF1ZXJ5LCBSYW5rZWRNb2RlbCB9IGZyb20gXCIuL3NyYy9tb2RlbC50c1wiO1xuZXhwb3J0IHsgVU5TVVBQT1JURURfQ0hBVF9GSUVMRFMgfSBmcm9tIFwiLi9zcmMvb3BlbmFpLWNoYXQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2hhdFJvbGUsIENoYXRDb250ZW50UGFydCwgQ2hhdFRvb2xDYWxsRnVuY3Rpb24sIENoYXRUb29sQ2FsbCwgQ2hhdE1lc3NhZ2UsIENoYXRDb250ZW50VG9UZXh0T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9vcGVuYWktY2hhdC50c1wiO1xuZXhwb3J0IHsgUkVBU09OSU5HX1RZUEVTIH0gZnJvbSBcIi4vc3JjL29wZW5haS1yZXNwb25zZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgUmVzcG9uc2VzU3RyZWFtVHJhbnNsYXRvciwgUmVzcG9uc2VzQ2l0YXRpb24sIFJlc3BvbnNlc091dHB1dCB9IGZyb20gXCIuL3NyYy9vcGVuYWktcmVzcG9uc2VzLnRzXCI7XG4iXX0=
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx5QkFBeUIsQ0FBQztBQUM1RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssVUFBVSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsNEJBQTRCLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0TixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuNlwiO1xuZXhwb3J0ICogYXMgZGlzcGxheSBmcm9tIFwiLi9zcmMvZGlzcGxheS50c1wiO1xuZXhwb3J0ICogYXMgbW9kZWwgZnJvbSBcIi4vc3JjL21vZGVsLnRzXCI7XG5leHBvcnQgKiBhcyBvcGVuYWlDaGF0IGZyb20gXCIuL3NyYy9vcGVuYWktY2hhdC50c1wiO1xuZXhwb3J0IHsgTW9kZWxDbGFzcywgUmVhc29uaW5nRWZmb3J0VmFsdWVzLCBNb2RlbENsYXNzU2NoZW1hLCBNb2RlbFByb2ZpbGVTY2hlbWEsIFJlYXNvbmluZ0VmZm9ydFNjaGVtYSwgTW9kZWxTdGF0dXNTY2hlbWEsIFNlcnZpbmdFbmRwb2ludFN1bW1hcnlTY2hlbWEsIE1vZGVsUXVlcnlTY2hlbWEsIFJhbmtlZE1vZGVsU2NoZW1hIH0gZnJvbSBcIi4vc3JjL21vZGVsLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsUHJvZmlsZSwgTW9kZWxRdWVyeSwgTW9kZWxTdGF0dXMsIFJhbmtlZE1vZGVsLCBSZWFzb25pbmdFZmZvcnQsIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfSBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCB7IFVOU1VQUE9SVEVEX0NIQVRfRklFTERTIH0gZnJvbSBcIi4vc3JjL29wZW5haS1jaGF0LnRzXCI7XG5leHBvcnQgdHlwZSB7IENoYXRSb2xlLCBDaGF0Q29udGVudFBhcnQsIENoYXRUb29sQ2FsbEZ1bmN0aW9uLCBDaGF0VG9vbENhbGwsIENoYXRNZXNzYWdlLCBDaGF0Q29udGVudFRvVGV4dE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb3BlbmFpLWNoYXQudHNcIjtcbiJdfQ==
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * @module
11
11
  */
12
- import { string } from "@dbx-tools/shared-core";
12
+ import { stringUtils } from "@dbx-tools/shared-core";
13
13
  /**
14
14
  * Vendor / namespace prefixes stripped from a tokenized endpoint name
15
15
  * before title-casing. Lowercased tokens; matched only as leading tokens
@@ -50,7 +50,7 @@ const SEGMENT_SPLIT = /[-_.\s/]+/;
50
50
  * toModelDisplayName("x", "Claude 4.6 (Preview)") // provided wins
51
51
  */
52
52
  export function toModelDisplayName(name, provided) {
53
- const providedTrimmed = string.trimToNull(provided);
53
+ const providedTrimmed = stringUtils.trimToNull(provided);
54
54
  if (providedTrimmed)
55
55
  return providedTrimmed;
56
56
  const segments = name.split(SEGMENT_SPLIT).filter(Boolean);
@@ -89,7 +89,7 @@ export function toModelDisplayName(name, provided) {
89
89
  }
90
90
  /** Title-case one name segment, uppercasing acronyms and gluing size units. */
91
91
  function renderSegment(segment) {
92
- const tokens = [...string.tokenizeWithOptions({ capitalize: true }, segment)];
92
+ const tokens = [...stringUtils.tokenizeWithOptions({ capitalize: true }, segment)];
93
93
  const out = [];
94
94
  for (let i = 0; i < tokens.length; i += 1) {
95
95
  const token = tokens[i];
@@ -103,4 +103,4 @@ function renderSegment(segment) {
103
103
  }
104
104
  return out.join(" ");
105
105
  }
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaXNwbGF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFaEQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFFdEUsa0ZBQWtGO0FBQ2xGLE1BQU0sdUJBQXVCLEdBQTJCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0FBRXpFOzs7OztHQUtHO0FBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBRTdFLG1GQUFtRjtBQUNuRixNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUU1QyxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQVksRUFBRSxRQUF3QjtJQUN2RSxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BELElBQUksZUFBZTtRQUFFLE9BQU8sZUFBZSxDQUFDO0lBRTVDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNELHNFQUFzRTtJQUN0RSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxPQUFPLEtBQUssR0FB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QyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIdW1hbi1yZWFkYWJsZSBtb2RlbCBkaXNwbGF5IG5hbWVzLiBQdXJlIChubyBOb2RlLW9ubHkgaW1wb3J0cykgc28gYVxuICogYnJvd3NlciBjbGllbnQgY2FuIGxhYmVsIGEgYC9tb2RlbHNgIHJlc3BvbnNlIHdpdGhvdXQgc2VydmVyIGRlcHMuXG4gKlxuICogVGhlIGVuZHBvaW50IGBuYW1lYCBpcyB0aGUgaW52b2tlIGlkIChlLmcuIGBkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02YCk7XG4gKiB0aGlzIGRlcml2ZXMgYSBmcmllbmRseSBsYWJlbCBmcm9tIGl0LiBQcmVmZXIgYSBEYXRhYnJpY2tzLXByb3ZpZGVkIG5hbWVcbiAqIChhIGRpc3BsYXktbmFtZSB0YWcgb3IgYW4gZXh0ZXJuYWwtbW9kZWwgbmFtZSkgd2hlbiB0aGUgc2VydmVyIGhhcyBvbmUgLVxuICogc2VlIGBAZGJ4LXRvb2xzL21vZGVsYCdzIHNlcnZpbmcgbGlzdGVyLCB3aGljaCBwYXNzZXMgaXQgYXMgYHByb3ZpZGVkYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbi8qKlxuICogVmVuZG9yIC8gbmFtZXNwYWNlIHByZWZpeGVzIHN0cmlwcGVkIGZyb20gYSB0b2tlbml6ZWQgZW5kcG9pbnQgbmFtZVxuICogYmVmb3JlIHRpdGxlLWNhc2luZy4gTG93ZXJjYXNlZCB0b2tlbnM7IG1hdGNoZWQgb25seSBhcyBsZWFkaW5nIHRva2Vuc1xuICogc28gYSBsZWdpdGltYXRlIG1pZC1uYW1lIHRva2VuIGlzIG5ldmVyIGRyb3BwZWQuIGBhaWAgaXMgc3RyaXBwZWQgT05MWVxuICogYXMgdGhlIHNlY29uZCBoYWxmIG9mIHRoZSBgc3lzdGVtLmFpLipgIGJ1aWx0aW4gbmFtZXNwYWNlIChoYW5kbGVkXG4gKiBiZWxvdyksIG5ldmVyIG9uIGl0cyBvd24gLSBzbyBhIG1vZGVsIGxpdGVyYWxseSBuYW1lZCBgLi4uLWFpLS4uLmBcbiAqIGtlZXBzIGl0cyBcIkFJXCIgd29yZCB2aWEgdGhlIHRva2VuaXplcidzIGJ1aWx0LWluIGNhc2luZyBvdmVycmlkZS5cbiAqL1xuY29uc3QgU1RSSVBfTEVBRElOR19UT0tFTlMgPSBuZXcgU2V0KFtcImRhdGFicmlja3NcIiwgXCJzeXN0ZW1cIiwgXCJkYnhcIl0pO1xuXG4vKiogYGFpYCBpcyBzdHJpcHBlZCBvbmx5IGFzIHRoZSBgc3lzdGVtLmFpLipgIG5hbWVzcGFjZSBoYWxmIChhZnRlciBgc3lzdGVtYCkuICovXG5jb25zdCBOQU1FU1BBQ0VfU0VDT05EX1RPS0VOUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgc3lzdGVtOiBcImFpXCIgfTtcblxuLyoqXG4gKiBTZWdtZW50LWludGVybmFsIHRva2VucyByZW5kZXJlZCBmdWxseSB1cHBlcmNhc2VkIChhY3JvbnltcyksIG5vdFxuICogdGl0bGUtY2FzZWQuIGBhaWAgaXMgaW50ZW50aW9uYWxseSBvbWl0dGVkOiB0aGUgc2hhcmVkIHRva2VuaXplciBhbHJlYWR5XG4gKiBmb3JjZS1jYXNlcyBgYWlgIC0+IGBBSWAgdmlhIGl0cyB7QGxpbmsgc3RyaW5nLlRva2VuaXplT3B0aW9uc30gYGNhcGl0YWxpemVgXG4gKiBvdmVycmlkZSwgd2hpY2ggYHJlbmRlclNlZ21lbnRgIGFsd2F5cyBwYXNzZXMuXG4gKi9cbmNvbnN0IEFDUk9OWU1TID0gbmV3IFNldChbXCJncHRcIiwgXCJndGVcIiwgXCJiZ2VcIiwgXCJkYnJ4XCIsIFwib3NzXCIsIFwibGxtXCIsIFwibW9lXCJdKTtcblxuLyoqIFBhcmFtZXRlci1jb3VudCB1bml0IGxldHRlcnMgZ2x1ZWQgdG8gYSBwcmVjZWRpbmcgbnVtYmVyIChgMTIwYmAgLT4gYDEyMEJgKS4gKi9cbmNvbnN0IFNJWkVfVU5JVFMgPSBuZXcgU2V0KFtcImJcIiwgXCJtXCIsIFwia1wiXSk7XG5cbmNvbnN0IFNFR01FTlRfU1BMSVQgPSAvWy1fLlxccy9dKy87XG5cbi8qKlxuICogRGVyaXZlIGEgaHVtYW4tcmVhZGFibGUgZGlzcGxheSBuYW1lIGZvciBhIHNlcnZpbmcgZW5kcG9pbnQuXG4gKlxuICogV2hlbiBgcHJvdmlkZWRgIGlzIGEgbm9uLWJsYW5rIHN0cmluZyAoYSBEYXRhYnJpY2tzIGRpc3BsYXktbmFtZSB0YWcgb3JcbiAqIGV4dGVybmFsLW1vZGVsIG5hbWUpLCBpdCB3aW5zIHZlcmJhdGltICh0cmltbWVkKS4gT3RoZXJ3aXNlIHRoZSBlbmRwb2ludFxuICogYG5hbWVgIGlzIGh1bWFuaXplZDogbGVhZGluZyB2ZW5kb3IgcHJlZml4ZXMgKGBkYXRhYnJpY2tzYCwgdGhlXG4gKiBgc3lzdGVtLmFpYCBuYW1lc3BhY2UsIGBkYnhgKSBhcmUgZHJvcHBlZCwgdGhlbiBlYWNoIGAtYC9gX2AvYC5gLXNlcGFyYXRlZFxuICogc2VnbWVudCBpcyB0aXRsZS1jYXNlZCAoYWNyb255bXMgbGlrZSBHUFQvR1RFL0JHRSB1cHBlcmNhc2VkLCBcIkFJXCIga2VwdCksXG4gKiBydW5zIG9mIHB1cmVseS1udW1lcmljIHNlZ21lbnRzIGFyZSBqb2luZWQgaW50byBhIGRvdHRlZCB2ZXJzaW9uXG4gKiAoYC4uLi00LTZgIC0+IFwiNC42XCIpLCBhbmQgYSBzaXplIHVuaXQgZ2x1ZWQgdG8gaXRzIG51bWJlciAoYDEyMGJgIC0+XG4gKiBcIjEyMEJcIikuIEZhbGxzIGJhY2sgdG8gdGhlIHRyaW1tZWQgcmF3IGBuYW1lYCBpZiBzdHJpcHBpbmcgbGVhdmVzIG5vdGhpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqIHRvTW9kZWxEaXNwbGF5TmFtZShcImRhdGFicmlja3MtY2xhdWRlLXNvbm5ldC00LTZcIikgLy8gXCJDbGF1ZGUgU29ubmV0IDQuNlwiXG4gKiB0b01vZGVsRGlzcGxheU5hbWUoXCJkYXRhYnJpY2tzLWdwdC1vc3MtMTIwYlwiKSAgICAgIC8vIFwiR1BUIE9TUyAxMjBCXCJcbiAqIHRvTW9kZWxEaXNwbGF5TmFtZShcInN5c3RlbS5haS5iZ2VfbGFyZ2VfZW5cIikgICAgICAgLy8gXCJCR0UgTGFyZ2UgRW5cIlxuICogdG9Nb2RlbERpc3BsYXlOYW1lKFwieFwiLCBcIkNsYXVkZSA0LjYgKFByZXZpZXcpXCIpICAgIC8vIHByb3ZpZGVkIHdpbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvTW9kZWxEaXNwbGF5TmFtZShuYW1lOiBzdHJpbmcsIHByb3ZpZGVkPzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XG4gIGNvbnN0IHByb3ZpZGVkVHJpbW1lZCA9IHN0cmluZy50cmltVG9OdWxsKHByb3ZpZGVkKTtcbiAgaWYgKHByb3ZpZGVkVHJpbW1lZCkgcmV0dXJuIHByb3ZpZGVkVHJpbW1lZDtcblxuICBjb25zdCBzZWdtZW50cyA9IG5hbWUuc3BsaXQoU0VHTUVOVF9TUExJVCkuZmlsdGVyKEJvb2xlYW4pO1xuICAvLyBEcm9wIGtub3duIHZlbmRvci9uYW1lc3BhY2UgcHJlZml4ZXMgb25seSB3aGlsZSB0aGV5IGxlYWQgdGhlIGxpc3QuXG4gIGxldCBzdGFydCA9IDA7XG4gIHdoaWxlIChzdGFydCA8IHNlZ21lbnRzLmxlbmd0aCkge1xuICAgIGNvbnN0IGxvd2VyID0gc2VnbWVudHNbc3RhcnRdIS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghU1RSSVBfTEVBRElOR19UT0tFTlMuaGFzKGxvd2VyKSkgYnJlYWs7XG4gICAgLy8gQ29uc3VtZSB0aGUgbmFtZXNwYWNlJ3Mgc2Vjb25kIHRva2VuIHRvbyAoZS5nLiB0aGUgYGFpYCBvZiBgc3lzdGVtLmFpYCkuXG4gICAgaWYgKE5BTUVTUEFDRV9TRUNPTkRfVE9LRU5TW2xvd2VyXSA9PT0gc2VnbWVudHNbc3RhcnQgKyAxXT8udG9Mb3dlckNhc2UoKSkge1xuICAgICAgc3RhcnQgKz0gMTtcbiAgICB9XG4gICAgc3RhcnQgKz0gMTtcbiAgfVxuICBjb25zdCBrZXB0ID0gc2VnbWVudHMuc2xpY2Uoc3RhcnQpO1xuICBjb25zdCBzb3VyY2UgPSBrZXB0Lmxlbmd0aCA+IDAgPyBrZXB0IDogc2VnbWVudHM7XG5cbiAgY29uc3QgcGllY2VzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgdmVyc2lvblJ1bjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZmx1c2hWZXJzaW9uID0gKCkgPT4ge1xuICAgIGlmICh2ZXJzaW9uUnVuLmxlbmd0aCA+IDApIHtcbiAgICAgIHBpZWNlcy5wdXNoKHZlcnNpb25SdW4uam9pbihcIi5cIikpO1xuICAgICAgdmVyc2lvblJ1biA9IFtdO1xuICAgIH1cbiAgfTtcbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNvdXJjZSkge1xuICAgIGlmICgvXlxcZCskLy50ZXN0KHNlZ21lbnQpKSB7XG4gICAgICB2ZXJzaW9uUnVuLnB1c2goc2VnbWVudCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZmx1c2hWZXJzaW9uKCk7XG4gICAgcGllY2VzLnB1c2gocmVuZGVyU2VnbWVudChzZWdtZW50KSk7XG4gIH1cbiAgZmx1c2hWZXJzaW9uKCk7XG5cbiAgcmV0dXJuIHBpZWNlcy5qb2luKFwiIFwiKSB8fCBuYW1lLnRyaW0oKTtcbn1cblxuLyoqIFRpdGxlLWNhc2Ugb25lIG5hbWUgc2VnbWVudCwgdXBwZXJjYXNpbmcgYWNyb255bXMgYW5kIGdsdWluZyBzaXplIHVuaXRzLiAqL1xuZnVuY3Rpb24gcmVuZGVyU2VnbWVudChzZWdtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB0b2tlbnMgPSBbLi4uc3RyaW5nLnRva2VuaXplV2l0aE9wdGlvbnMoeyBjYXBpdGFsaXplOiB0cnVlIH0sIHNlZ21lbnQpXTtcbiAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2ldITtcbiAgICBjb25zdCBsb3dlciA9IHRva2VuLnRvTG93ZXJDYXNlKCk7XG4gICAgLy8gR2x1ZSBhIHNpemUgdW5pdCBvbnRvIHRoZSBwcmVjZWRpbmcgbnVtYmVyOiBgMTIwYCArIGBiYCAtPiBgMTIwQmAuXG4gICAgaWYgKFNJWkVfVU5JVFMuaGFzKGxvd2VyKSAmJiBvdXQubGVuZ3RoID4gMCAmJiAvXlxcZCskLy50ZXN0KG91dFtvdXQubGVuZ3RoIC0gMV0hKSkge1xuICAgICAgb3V0W291dC5sZW5ndGggLSAxXSA9IGAke291dFtvdXQubGVuZ3RoIC0gMV19JHtsb3dlci50b1VwcGVyQ2FzZSgpfWA7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgb3V0LnB1c2goQUNST05ZTVMuaGFzKGxvd2VyKSA/IGxvd2VyLnRvVXBwZXJDYXNlKCkgOiB0b2tlbik7XG4gIH1cbiAgcmV0dXJuIG91dC5qb2luKFwiIFwiKTtcbn1cbiJdfQ==
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaXNwbGF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFckQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFFdEUsa0ZBQWtGO0FBQ2xGLE1BQU0sdUJBQXVCLEdBQTJCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0FBRXpFOzs7OztHQUtHO0FBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBRTdFLG1GQUFtRjtBQUNuRixNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUU1QyxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQVksRUFBRSxRQUF3QjtJQUN2RSxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pELElBQUksZUFBZTtRQUFFLE9BQU8sZUFBZSxDQUFDO0lBRTVDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNELHNFQUFzRTtJQUN0RSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxPQUFPLEtBQUssR0FB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QyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIdW1hbi1yZWFkYWJsZSBtb2RlbCBkaXNwbGF5IG5hbWVzLiBQdXJlIChubyBOb2RlLW9ubHkgaW1wb3J0cykgc28gYVxuICogYnJvd3NlciBjbGllbnQgY2FuIGxhYmVsIGEgYC9tb2RlbHNgIHJlc3BvbnNlIHdpdGhvdXQgc2VydmVyIGRlcHMuXG4gKlxuICogVGhlIGVuZHBvaW50IGBuYW1lYCBpcyB0aGUgaW52b2tlIGlkIChlLmcuIGBkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02YCk7XG4gKiB0aGlzIGRlcml2ZXMgYSBmcmllbmRseSBsYWJlbCBmcm9tIGl0LiBQcmVmZXIgYSBEYXRhYnJpY2tzLXByb3ZpZGVkIG5hbWVcbiAqIChhIGRpc3BsYXktbmFtZSB0YWcgb3IgYW4gZXh0ZXJuYWwtbW9kZWwgbmFtZSkgd2hlbiB0aGUgc2VydmVyIGhhcyBvbmUgLVxuICogc2VlIGBAZGJ4LXRvb2xzL21vZGVsYCdzIHNlcnZpbmcgbGlzdGVyLCB3aGljaCBwYXNzZXMgaXQgYXMgYHByb3ZpZGVkYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuLyoqXG4gKiBWZW5kb3IgLyBuYW1lc3BhY2UgcHJlZml4ZXMgc3RyaXBwZWQgZnJvbSBhIHRva2VuaXplZCBlbmRwb2ludCBuYW1lXG4gKiBiZWZvcmUgdGl0bGUtY2FzaW5nLiBMb3dlcmNhc2VkIHRva2VuczsgbWF0Y2hlZCBvbmx5IGFzIGxlYWRpbmcgdG9rZW5zXG4gKiBzbyBhIGxlZ2l0aW1hdGUgbWlkLW5hbWUgdG9rZW4gaXMgbmV2ZXIgZHJvcHBlZC4gYGFpYCBpcyBzdHJpcHBlZCBPTkxZXG4gKiBhcyB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIGBzeXN0ZW0uYWkuKmAgYnVpbHRpbiBuYW1lc3BhY2UgKGhhbmRsZWRcbiAqIGJlbG93KSwgbmV2ZXIgb24gaXRzIG93biAtIHNvIGEgbW9kZWwgbGl0ZXJhbGx5IG5hbWVkIGAuLi4tYWktLi4uYFxuICoga2VlcHMgaXRzIFwiQUlcIiB3b3JkIHZpYSB0aGUgdG9rZW5pemVyJ3MgYnVpbHQtaW4gY2FzaW5nIG92ZXJyaWRlLlxuICovXG5jb25zdCBTVFJJUF9MRUFESU5HX1RPS0VOUyA9IG5ldyBTZXQoW1wiZGF0YWJyaWNrc1wiLCBcInN5c3RlbVwiLCBcImRieFwiXSk7XG5cbi8qKiBgYWlgIGlzIHN0cmlwcGVkIG9ubHkgYXMgdGhlIGBzeXN0ZW0uYWkuKmAgbmFtZXNwYWNlIGhhbGYgKGFmdGVyIGBzeXN0ZW1gKS4gKi9cbmNvbnN0IE5BTUVTUEFDRV9TRUNPTkRfVE9LRU5TOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBzeXN0ZW06IFwiYWlcIiB9O1xuXG4vKipcbiAqIFNlZ21lbnQtaW50ZXJuYWwgdG9rZW5zIHJlbmRlcmVkIGZ1bGx5IHVwcGVyY2FzZWQgKGFjcm9ueW1zKSwgbm90XG4gKiB0aXRsZS1jYXNlZC4gYGFpYCBpcyBpbnRlbnRpb25hbGx5IG9taXR0ZWQ6IHRoZSBzaGFyZWQgdG9rZW5pemVyIGFscmVhZHlcbiAqIGZvcmNlLWNhc2VzIGBhaWAgLT4gYEFJYCB2aWEgaXRzIHtAbGluayBzdHJpbmcuVG9rZW5pemVPcHRpb25zfSBgY2FwaXRhbGl6ZWBcbiAqIG92ZXJyaWRlLCB3aGljaCBgcmVuZGVyU2VnbWVudGAgYWx3YXlzIHBhc3Nlcy5cbiAqL1xuY29uc3QgQUNST05ZTVMgPSBuZXcgU2V0KFtcImdwdFwiLCBcImd0ZVwiLCBcImJnZVwiLCBcImRicnhcIiwgXCJvc3NcIiwgXCJsbG1cIiwgXCJtb2VcIl0pO1xuXG4vKiogUGFyYW1ldGVyLWNvdW50IHVuaXQgbGV0dGVycyBnbHVlZCB0byBhIHByZWNlZGluZyBudW1iZXIgKGAxMjBiYCAtPiBgMTIwQmApLiAqL1xuY29uc3QgU0laRV9VTklUUyA9IG5ldyBTZXQoW1wiYlwiLCBcIm1cIiwgXCJrXCJdKTtcblxuY29uc3QgU0VHTUVOVF9TUExJVCA9IC9bLV8uXFxzL10rLztcblxuLyoqXG4gKiBEZXJpdmUgYSBodW1hbi1yZWFkYWJsZSBkaXNwbGF5IG5hbWUgZm9yIGEgc2VydmluZyBlbmRwb2ludC5cbiAqXG4gKiBXaGVuIGBwcm92aWRlZGAgaXMgYSBub24tYmxhbmsgc3RyaW5nIChhIERhdGFicmlja3MgZGlzcGxheS1uYW1lIHRhZyBvclxuICogZXh0ZXJuYWwtbW9kZWwgbmFtZSksIGl0IHdpbnMgdmVyYmF0aW0gKHRyaW1tZWQpLiBPdGhlcndpc2UgdGhlIGVuZHBvaW50XG4gKiBgbmFtZWAgaXMgaHVtYW5pemVkOiBsZWFkaW5nIHZlbmRvciBwcmVmaXhlcyAoYGRhdGFicmlja3NgLCB0aGVcbiAqIGBzeXN0ZW0uYWlgIG5hbWVzcGFjZSwgYGRieGApIGFyZSBkcm9wcGVkLCB0aGVuIGVhY2ggYC1gL2BfYC9gLmAtc2VwYXJhdGVkXG4gKiBzZWdtZW50IGlzIHRpdGxlLWNhc2VkIChhY3JvbnltcyBsaWtlIEdQVC9HVEUvQkdFIHVwcGVyY2FzZWQsIFwiQUlcIiBrZXB0KSxcbiAqIHJ1bnMgb2YgcHVyZWx5LW51bWVyaWMgc2VnbWVudHMgYXJlIGpvaW5lZCBpbnRvIGEgZG90dGVkIHZlcnNpb25cbiAqIChgLi4uLTQtNmAgLT4gXCI0LjZcIiksIGFuZCBhIHNpemUgdW5pdCBnbHVlZCB0byBpdHMgbnVtYmVyIChgMTIwYmAgLT5cbiAqIFwiMTIwQlwiKS4gRmFsbHMgYmFjayB0byB0aGUgdHJpbW1lZCByYXcgYG5hbWVgIGlmIHN0cmlwcGluZyBsZWF2ZXMgbm90aGluZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogdG9Nb2RlbERpc3BsYXlOYW1lKFwiZGF0YWJyaWNrcy1jbGF1ZGUtc29ubmV0LTQtNlwiKSAvLyBcIkNsYXVkZSBTb25uZXQgNC42XCJcbiAqIHRvTW9kZWxEaXNwbGF5TmFtZShcImRhdGFicmlja3MtZ3B0LW9zcy0xMjBiXCIpICAgICAgLy8gXCJHUFQgT1NTIDEyMEJcIlxuICogdG9Nb2RlbERpc3BsYXlOYW1lKFwic3lzdGVtLmFpLmJnZV9sYXJnZV9lblwiKSAgICAgICAvLyBcIkJHRSBMYXJnZSBFblwiXG4gKiB0b01vZGVsRGlzcGxheU5hbWUoXCJ4XCIsIFwiQ2xhdWRlIDQuNiAoUHJldmlldylcIikgICAgLy8gcHJvdmlkZWQgd2luc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Nb2RlbERpc3BsYXlOYW1lKG5hbWU6IHN0cmluZywgcHJvdmlkZWQ/OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcbiAgY29uc3QgcHJvdmlkZWRUcmltbWVkID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm92aWRlZCk7XG4gIGlmIChwcm92aWRlZFRyaW1tZWQpIHJldHVybiBwcm92aWRlZFRyaW1tZWQ7XG5cbiAgY29uc3Qgc2VnbWVudHMgPSBuYW1lLnNwbGl0KFNFR01FTlRfU1BMSVQpLmZpbHRlcihCb29sZWFuKTtcbiAgLy8gRHJvcCBrbm93biB2ZW5kb3IvbmFtZXNwYWNlIHByZWZpeGVzIG9ubHkgd2hpbGUgdGhleSBsZWFkIHRoZSBsaXN0LlxuICBsZXQgc3RhcnQgPSAwO1xuICB3aGlsZSAoc3RhcnQgPCBzZWdtZW50cy5sZW5ndGgpIHtcbiAgICBjb25zdCBsb3dlciA9IHNlZ21lbnRzW3N0YXJ0XSEudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIVNUUklQX0xFQURJTkdfVE9LRU5TLmhhcyhsb3dlcikpIGJyZWFrO1xuICAgIC8vIENvbnN1bWUgdGhlIG5hbWVzcGFjZSdzIHNlY29uZCB0b2tlbiB0b28gKGUuZy4gdGhlIGBhaWAgb2YgYHN5c3RlbS5haWApLlxuICAgIGlmIChOQU1FU1BBQ0VfU0VDT05EX1RPS0VOU1tsb3dlcl0gPT09IHNlZ21lbnRzW3N0YXJ0ICsgMV0/LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHN0YXJ0ICs9IDE7XG4gICAgfVxuICAgIHN0YXJ0ICs9IDE7XG4gIH1cbiAgY29uc3Qga2VwdCA9IHNlZ21lbnRzLnNsaWNlKHN0YXJ0KTtcbiAgY29uc3Qgc291cmNlID0ga2VwdC5sZW5ndGggPiAwID8ga2VwdCA6IHNlZ21lbnRzO1xuXG4gIGNvbnN0IHBpZWNlczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IHZlcnNpb25SdW46IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGZsdXNoVmVyc2lvbiA9ICgpID0+IHtcbiAgICBpZiAodmVyc2lvblJ1bi5sZW5ndGggPiAwKSB7XG4gICAgICBwaWVjZXMucHVzaCh2ZXJzaW9uUnVuLmpvaW4oXCIuXCIpKTtcbiAgICAgIHZlcnNpb25SdW4gPSBbXTtcbiAgICB9XG4gIH07XG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzb3VyY2UpIHtcbiAgICBpZiAoL15cXGQrJC8udGVzdChzZWdtZW50KSkge1xuICAgICAgdmVyc2lvblJ1bi5wdXNoKHNlZ21lbnQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZsdXNoVmVyc2lvbigpO1xuICAgIHBpZWNlcy5wdXNoKHJlbmRlclNlZ21lbnQoc2VnbWVudCkpO1xuICB9XG4gIGZsdXNoVmVyc2lvbigpO1xuXG4gIHJldHVybiBwaWVjZXMuam9pbihcIiBcIikgfHwgbmFtZS50cmltKCk7XG59XG5cbi8qKiBUaXRsZS1jYXNlIG9uZSBuYW1lIHNlZ21lbnQsIHVwcGVyY2FzaW5nIGFjcm9ueW1zIGFuZCBnbHVpbmcgc2l6ZSB1bml0cy4gKi9cbmZ1bmN0aW9uIHJlbmRlclNlZ21lbnQoc2VnbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdG9rZW5zID0gWy4uLnN0cmluZ1V0aWxzLnRva2VuaXplV2l0aE9wdGlvbnMoeyBjYXBpdGFsaXplOiB0cnVlIH0sIHNlZ21lbnQpXTtcbiAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2ldITtcbiAgICBjb25zdCBsb3dlciA9IHRva2VuLnRvTG93ZXJDYXNlKCk7XG4gICAgLy8gR2x1ZSBhIHNpemUgdW5pdCBvbnRvIHRoZSBwcmVjZWRpbmcgbnVtYmVyOiBgMTIwYCArIGBiYCAtPiBgMTIwQmAuXG4gICAgaWYgKFNJWkVfVU5JVFMuaGFzKGxvd2VyKSAmJiBvdXQubGVuZ3RoID4gMCAmJiAvXlxcZCskLy50ZXN0KG91dFtvdXQubGVuZ3RoIC0gMV0hKSkge1xuICAgICAgb3V0W291dC5sZW5ndGggLSAxXSA9IGAke291dFtvdXQubGVuZ3RoIC0gMV19JHtsb3dlci50b1VwcGVyQ2FzZSgpfWA7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgb3V0LnB1c2goQUNST05ZTVMuaGFzKGxvd2VyKSA/IGxvd2VyLnRvVXBwZXJDYXNlKCkgOiB0b2tlbik7XG4gIH1cbiAgcmV0dXJuIG91dC5qb2luKFwiIFwiKTtcbn1cbiJdfQ==
@@ -0,0 +1,142 @@
1
+ export declare const ModelClass: {
2
+ readonly ChatThinking: "chat-thinking";
3
+ readonly ChatBalanced: "chat-balanced";
4
+ readonly ChatFast: "chat-fast";
5
+ readonly Embedding: "embedding";
6
+ };
7
+ export type ModelClass = "chat-thinking" | "chat-balanced" | "chat-fast" | "embedding";
8
+ export declare const ReasoningEffort: {
9
+ readonly None: "none";
10
+ readonly Minimal: "minimal";
11
+ readonly Low: "low";
12
+ readonly Medium: "medium";
13
+ readonly High: "high";
14
+ readonly Xhigh: "xhigh";
15
+ readonly Max: "max";
16
+ };
17
+ export type ReasoningEffort = "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
18
+ export type ModelProfile = {
19
+ /**
20
+ * Relative model quality score.
21
+ */
22
+ quality?: number;
23
+ /**
24
+ * Relative model speed score.
25
+ */
26
+ speed?: number;
27
+ /**
28
+ * Relative model cost score.
29
+ */
30
+ cost?: number;
31
+ };
32
+ export type ModelStatus = {
33
+ /**
34
+ * Whether Databricks lists the model as retired or deprecated.
35
+ *
36
+ * @default false
37
+ */
38
+ deprecated: boolean;
39
+ };
40
+ export type ServingEndpointSummary = {
41
+ /**
42
+ * Model Serving endpoint name used for invocation.
43
+ */
44
+ name: string;
45
+ /**
46
+ * Human-readable endpoint or model name.
47
+ */
48
+ displayName?: string;
49
+ /**
50
+ * Normalized model family parsed from the endpoint identities.
51
+ */
52
+ family?: string;
53
+ /**
54
+ * Endpoint task, such as chat or embeddings.
55
+ */
56
+ task?: string;
57
+ /**
58
+ * Endpoint readiness state.
59
+ */
60
+ state?: string;
61
+ /**
62
+ * Endpoint description supplied by Databricks.
63
+ */
64
+ description?: string;
65
+ /**
66
+ * Whether the endpoint supports tool calling.
67
+ */
68
+ supportsTools?: boolean;
69
+ /**
70
+ * AI Gateway model profile scores.
71
+ */
72
+ profile?: ModelProfile;
73
+ /**
74
+ * Intent-oriented endpoint class.
75
+ */
76
+ class?: ModelClass;
77
+ /**
78
+ * Provider names mapped to provider-specific model names.
79
+ */
80
+ serviceNames?: Record<string, string>;
81
+ /**
82
+ * Foundation model name reported by the served entity.
83
+ */
84
+ modelServiceName?: string;
85
+ /**
86
+ * Reasoning effort values accepted by the endpoint.
87
+ */
88
+ reasoningEfforts?: Array<ReasoningEffort>;
89
+ /**
90
+ * Retirement status for the served model.
91
+ */
92
+ status?: ModelStatus;
93
+ /**
94
+ * Embedding vector dimension measured by the caller, when available.
95
+ */
96
+ dimension?: number;
97
+ };
98
+ export type ModelQuery = {
99
+ /**
100
+ * Optional fuzzy model-name search.
101
+ */
102
+ search?: string;
103
+ /**
104
+ * Requested model-class ceiling, or the exact embedding class.
105
+ */
106
+ modelClass?: ModelClass;
107
+ /**
108
+ * Whether candidates must support tool calling.
109
+ */
110
+ requiresTools?: boolean;
111
+ /**
112
+ * Whether retired models remain eligible.
113
+ */
114
+ includeDeprecated?: boolean;
115
+ /**
116
+ * Maximum number of results.
117
+ *
118
+ * @schema number().int().min(1).max(50).optional()
119
+ */
120
+ limit?: number;
121
+ /**
122
+ * Maximum fuzzy-match distance.
123
+ *
124
+ * @minimum 0
125
+ * @maximum 1
126
+ */
127
+ threshold?: number;
128
+ };
129
+ export type RankedModel = {
130
+ /**
131
+ * Matching endpoint metadata.
132
+ */
133
+ endpoint: ServingEndpointSummary;
134
+ /**
135
+ * Intent-oriented endpoint class.
136
+ */
137
+ modelClass: ModelClass;
138
+ /**
139
+ * Fuzzy-match distance, where lower values are closer.
140
+ */
141
+ score?: number;
142
+ };
@@ -0,0 +1,17 @@
1
+ // Generated from packages/rs/model. Do not edit.
2
+ export const ModelClass = {
3
+ ChatThinking: "chat-thinking",
4
+ ChatBalanced: "chat-balanced",
5
+ ChatFast: "chat-fast",
6
+ Embedding: "embedding",
7
+ };
8
+ export const ReasoningEffort = {
9
+ None: "none",
10
+ Minimal: "minimal",
11
+ Low: "low",
12
+ Medium: "medium",
13
+ High: "high",
14
+ Xhigh: "xhigh",
15
+ Max: "max",
16
+ };
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NvbnRyYWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nZW5lcmF0ZWQvX2NvbnRyYWN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpREFBaUQ7QUFFakQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLFlBQVksRUFBRSxlQUFlO0lBQzdCLFlBQVksRUFBRSxlQUFlO0lBQzdCLFFBQVEsRUFBRSxXQUFXO0lBQ3JCLFNBQVMsRUFBRSxXQUFXO0NBQ2QsQ0FBQztBQUdYLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUM3QixJQUFJLEVBQUUsTUFBTTtJQUNaLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLEdBQUcsRUFBRSxLQUFLO0lBQ1YsTUFBTSxFQUFFLFFBQVE7SUFDaEIsSUFBSSxFQUFFLE1BQU07SUFDWixLQUFLLEVBQUUsT0FBTztJQUNkLEdBQUcsRUFBRSxLQUFLO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBmcm9tIHBhY2thZ2VzL3JzL21vZGVsLiBEbyBub3QgZWRpdC5cblxuZXhwb3J0IGNvbnN0IE1vZGVsQ2xhc3MgPSB7XG4gIENoYXRUaGlua2luZzogXCJjaGF0LXRoaW5raW5nXCIsXG4gIENoYXRCYWxhbmNlZDogXCJjaGF0LWJhbGFuY2VkXCIsXG4gIENoYXRGYXN0OiBcImNoYXQtZmFzdFwiLFxuICBFbWJlZGRpbmc6IFwiZW1iZWRkaW5nXCIsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgTW9kZWxDbGFzcyA9IFwiY2hhdC10aGlua2luZ1wiIHwgXCJjaGF0LWJhbGFuY2VkXCIgfCBcImNoYXQtZmFzdFwiIHwgXCJlbWJlZGRpbmdcIjtcblxuZXhwb3J0IGNvbnN0IFJlYXNvbmluZ0VmZm9ydCA9IHtcbiAgTm9uZTogXCJub25lXCIsXG4gIE1pbmltYWw6IFwibWluaW1hbFwiLFxuICBMb3c6IFwibG93XCIsXG4gIE1lZGl1bTogXCJtZWRpdW1cIixcbiAgSGlnaDogXCJoaWdoXCIsXG4gIFhoaWdoOiBcInhoaWdoXCIsXG4gIE1heDogXCJtYXhcIixcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBSZWFzb25pbmdFZmZvcnQgPSBcIm5vbmVcIiB8IFwibWluaW1hbFwiIHwgXCJsb3dcIiB8IFwibWVkaXVtXCIgfCBcImhpZ2hcIiB8IFwieGhpZ2hcIiB8IFwibWF4XCI7XG5cbmV4cG9ydCB0eXBlIE1vZGVsUHJvZmlsZSA9IHsgXG4vKipcbiAqIFJlbGF0aXZlIG1vZGVsIHF1YWxpdHkgc2NvcmUuXG4gKi9cbnF1YWxpdHk/OiBudW1iZXIsIFxuLyoqXG4gKiBSZWxhdGl2ZSBtb2RlbCBzcGVlZCBzY29yZS5cbiAqL1xuc3BlZWQ/OiBudW1iZXIsIFxuLyoqXG4gKiBSZWxhdGl2ZSBtb2RlbCBjb3N0IHNjb3JlLlxuICovXG5jb3N0PzogbnVtYmVyLCB9O1xuXG5leHBvcnQgdHlwZSBNb2RlbFN0YXR1cyA9IHsgXG4vKipcbiAqIFdoZXRoZXIgRGF0YWJyaWNrcyBsaXN0cyB0aGUgbW9kZWwgYXMgcmV0aXJlZCBvciBkZXByZWNhdGVkLlxuICpcbiAqIEBkZWZhdWx0IGZhbHNlXG4gKi9cbmRlcHJlY2F0ZWQ6IGJvb2xlYW4sIH07XG5cbmV4cG9ydCB0eXBlIFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgPSB7IFxuLyoqXG4gKiBNb2RlbCBTZXJ2aW5nIGVuZHBvaW50IG5hbWUgdXNlZCBmb3IgaW52b2NhdGlvbi5cbiAqL1xubmFtZTogc3RyaW5nLCBcbi8qKlxuICogSHVtYW4tcmVhZGFibGUgZW5kcG9pbnQgb3IgbW9kZWwgbmFtZS5cbiAqL1xuZGlzcGxheU5hbWU/OiBzdHJpbmcsIFxuLyoqXG4gKiBOb3JtYWxpemVkIG1vZGVsIGZhbWlseSBwYXJzZWQgZnJvbSB0aGUgZW5kcG9pbnQgaWRlbnRpdGllcy5cbiAqL1xuZmFtaWx5Pzogc3RyaW5nLCBcbi8qKlxuICogRW5kcG9pbnQgdGFzaywgc3VjaCBhcyBjaGF0IG9yIGVtYmVkZGluZ3MuXG4gKi9cbnRhc2s/OiBzdHJpbmcsIFxuLyoqXG4gKiBFbmRwb2ludCByZWFkaW5lc3Mgc3RhdGUuXG4gKi9cbnN0YXRlPzogc3RyaW5nLCBcbi8qKlxuICogRW5kcG9pbnQgZGVzY3JpcHRpb24gc3VwcGxpZWQgYnkgRGF0YWJyaWNrcy5cbiAqL1xuZGVzY3JpcHRpb24/OiBzdHJpbmcsIFxuLyoqXG4gKiBXaGV0aGVyIHRoZSBlbmRwb2ludCBzdXBwb3J0cyB0b29sIGNhbGxpbmcuXG4gKi9cbnN1cHBvcnRzVG9vbHM/OiBib29sZWFuLCBcbi8qKlxuICogQUkgR2F0ZXdheSBtb2RlbCBwcm9maWxlIHNjb3Jlcy5cbiAqL1xucHJvZmlsZT86IE1vZGVsUHJvZmlsZSwgXG4vKipcbiAqIEludGVudC1vcmllbnRlZCBlbmRwb2ludCBjbGFzcy5cbiAqL1xuY2xhc3M/OiBNb2RlbENsYXNzLCBcbi8qKlxuICogUHJvdmlkZXIgbmFtZXMgbWFwcGVkIHRvIHByb3ZpZGVyLXNwZWNpZmljIG1vZGVsIG5hbWVzLlxuICovXG5zZXJ2aWNlTmFtZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBcbi8qKlxuICogRm91bmRhdGlvbiBtb2RlbCBuYW1lIHJlcG9ydGVkIGJ5IHRoZSBzZXJ2ZWQgZW50aXR5LlxuICovXG5tb2RlbFNlcnZpY2VOYW1lPzogc3RyaW5nLCBcbi8qKlxuICogUmVhc29uaW5nIGVmZm9ydCB2YWx1ZXMgYWNjZXB0ZWQgYnkgdGhlIGVuZHBvaW50LlxuICovXG5yZWFzb25pbmdFZmZvcnRzPzogQXJyYXk8UmVhc29uaW5nRWZmb3J0PiwgXG4vKipcbiAqIFJldGlyZW1lbnQgc3RhdHVzIGZvciB0aGUgc2VydmVkIG1vZGVsLlxuICovXG5zdGF0dXM/OiBNb2RlbFN0YXR1cywgXG4vKipcbiAqIEVtYmVkZGluZyB2ZWN0b3IgZGltZW5zaW9uIG1lYXN1cmVkIGJ5IHRoZSBjYWxsZXIsIHdoZW4gYXZhaWxhYmxlLlxuICovXG5kaW1lbnNpb24/OiBudW1iZXIsIH07XG5cbmV4cG9ydCB0eXBlIE1vZGVsUXVlcnkgPSB7IFxuLyoqXG4gKiBPcHRpb25hbCBmdXp6eSBtb2RlbC1uYW1lIHNlYXJjaC5cbiAqL1xuc2VhcmNoPzogc3RyaW5nLCBcbi8qKlxuICogUmVxdWVzdGVkIG1vZGVsLWNsYXNzIGNlaWxpbmcsIG9yIHRoZSBleGFjdCBlbWJlZGRpbmcgY2xhc3MuXG4gKi9cbm1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzLCBcbi8qKlxuICogV2hldGhlciBjYW5kaWRhdGVzIG11c3Qgc3VwcG9ydCB0b29sIGNhbGxpbmcuXG4gKi9cbnJlcXVpcmVzVG9vbHM/OiBib29sZWFuLCBcbi8qKlxuICogV2hldGhlciByZXRpcmVkIG1vZGVscyByZW1haW4gZWxpZ2libGUuXG4gKi9cbmluY2x1ZGVEZXByZWNhdGVkPzogYm9vbGVhbiwgXG4vKipcbiAqIE1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMuXG4gKlxuICogQHNjaGVtYSBudW1iZXIoKS5pbnQoKS5taW4oMSkubWF4KDUwKS5vcHRpb25hbCgpXG4gKi9cbmxpbWl0PzogbnVtYmVyLCBcbi8qKlxuICogTWF4aW11bSBmdXp6eS1tYXRjaCBkaXN0YW5jZS5cbiAqXG4gKiBAbWluaW11bSAwXG4gKiBAbWF4aW11bSAxXG4gKi9cbnRocmVzaG9sZD86IG51bWJlciwgfTtcblxuZXhwb3J0IHR5cGUgUmFua2VkTW9kZWwgPSB7IFxuLyoqXG4gKiBNYXRjaGluZyBlbmRwb2ludCBtZXRhZGF0YS5cbiAqL1xuZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksIFxuLyoqXG4gKiBJbnRlbnQtb3JpZW50ZWQgZW5kcG9pbnQgY2xhc3MuXG4gKi9cbm1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3MsIFxuLyoqXG4gKiBGdXp6eS1tYXRjaCBkaXN0YW5jZSwgd2hlcmUgbG93ZXIgdmFsdWVzIGFyZSBjbG9zZXIuXG4gKi9cbnNjb3JlPzogbnVtYmVyLCB9O1xuIl19
@@ -0,0 +1,67 @@
1
+ import { z } from "zod";
2
+ export declare const modelClassSchema: z.ZodUnion<readonly [z.ZodLiteral<"chat-thinking">, z.ZodLiteral<"chat-balanced">, z.ZodLiteral<"chat-fast">, z.ZodLiteral<"embedding">]>;
3
+ export declare const reasoningEffortSchema: z.ZodUnion<readonly [z.ZodLiteral<"none">, z.ZodLiteral<"minimal">, z.ZodLiteral<"low">, z.ZodLiteral<"medium">, z.ZodLiteral<"high">, z.ZodLiteral<"xhigh">, z.ZodLiteral<"max">]>;
4
+ export declare const modelProfileSchema: z.ZodObject<{
5
+ quality: z.ZodOptional<z.ZodNumber>;
6
+ speed: z.ZodOptional<z.ZodNumber>;
7
+ cost: z.ZodOptional<z.ZodNumber>;
8
+ }, z.core.$strip>;
9
+ export declare const modelStatusSchema: z.ZodObject<{
10
+ deprecated: z.ZodDefault<z.ZodBoolean>;
11
+ }, z.core.$strip>;
12
+ export declare const servingEndpointSummarySchema: z.ZodObject<{
13
+ name: z.ZodString;
14
+ displayName: z.ZodOptional<z.ZodString>;
15
+ family: z.ZodOptional<z.ZodString>;
16
+ task: z.ZodOptional<z.ZodString>;
17
+ state: z.ZodOptional<z.ZodString>;
18
+ description: z.ZodOptional<z.ZodString>;
19
+ supportsTools: z.ZodOptional<z.ZodBoolean>;
20
+ profile: z.ZodOptional<z.ZodObject<{
21
+ quality: z.ZodOptional<z.ZodNumber>;
22
+ speed: z.ZodOptional<z.ZodNumber>;
23
+ cost: z.ZodOptional<z.ZodNumber>;
24
+ }, z.core.$strip>>;
25
+ class: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"chat-thinking">, z.ZodLiteral<"chat-balanced">, z.ZodLiteral<"chat-fast">, z.ZodLiteral<"embedding">]>>;
26
+ serviceNames: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
27
+ modelServiceName: z.ZodOptional<z.ZodString>;
28
+ reasoningEfforts: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodLiteral<"none">, z.ZodLiteral<"minimal">, z.ZodLiteral<"low">, z.ZodLiteral<"medium">, z.ZodLiteral<"high">, z.ZodLiteral<"xhigh">, z.ZodLiteral<"max">]>>>;
29
+ status: z.ZodOptional<z.ZodObject<{
30
+ deprecated: z.ZodDefault<z.ZodBoolean>;
31
+ }, z.core.$strip>>;
32
+ dimension: z.ZodOptional<z.ZodNumber>;
33
+ }, z.core.$strip>;
34
+ export declare const modelQuerySchema: z.ZodObject<{
35
+ search: z.ZodOptional<z.ZodString>;
36
+ modelClass: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"chat-thinking">, z.ZodLiteral<"chat-balanced">, z.ZodLiteral<"chat-fast">, z.ZodLiteral<"embedding">]>>;
37
+ requiresTools: z.ZodOptional<z.ZodBoolean>;
38
+ includeDeprecated: z.ZodOptional<z.ZodBoolean>;
39
+ limit: z.ZodOptional<z.ZodNumber>;
40
+ threshold: z.ZodOptional<z.ZodNumber>;
41
+ }, z.core.$strip>;
42
+ export declare const rankedModelSchema: z.ZodObject<{
43
+ endpoint: z.ZodObject<{
44
+ name: z.ZodString;
45
+ displayName: z.ZodOptional<z.ZodString>;
46
+ family: z.ZodOptional<z.ZodString>;
47
+ task: z.ZodOptional<z.ZodString>;
48
+ state: z.ZodOptional<z.ZodString>;
49
+ description: z.ZodOptional<z.ZodString>;
50
+ supportsTools: z.ZodOptional<z.ZodBoolean>;
51
+ profile: z.ZodOptional<z.ZodObject<{
52
+ quality: z.ZodOptional<z.ZodNumber>;
53
+ speed: z.ZodOptional<z.ZodNumber>;
54
+ cost: z.ZodOptional<z.ZodNumber>;
55
+ }, z.core.$strip>>;
56
+ class: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"chat-thinking">, z.ZodLiteral<"chat-balanced">, z.ZodLiteral<"chat-fast">, z.ZodLiteral<"embedding">]>>;
57
+ serviceNames: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
58
+ modelServiceName: z.ZodOptional<z.ZodString>;
59
+ reasoningEfforts: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodLiteral<"none">, z.ZodLiteral<"minimal">, z.ZodLiteral<"low">, z.ZodLiteral<"medium">, z.ZodLiteral<"high">, z.ZodLiteral<"xhigh">, z.ZodLiteral<"max">]>>>;
60
+ status: z.ZodOptional<z.ZodObject<{
61
+ deprecated: z.ZodDefault<z.ZodBoolean>;
62
+ }, z.core.$strip>>;
63
+ dimension: z.ZodOptional<z.ZodNumber>;
64
+ }, z.core.$strip>;
65
+ modelClass: z.ZodUnion<readonly [z.ZodLiteral<"chat-thinking">, z.ZodLiteral<"chat-balanced">, z.ZodLiteral<"chat-fast">, z.ZodLiteral<"embedding">]>;
66
+ score: z.ZodOptional<z.ZodNumber>;
67
+ }, z.core.$strip>;