@dbx-tools/cli 0.9.175 → 0.9.176

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
@@ -653,18 +653,25 @@ dbx model-gateway [options] [command]
653
653
 
654
654
  #### Options
655
655
 
656
- | Option | Description |
657
- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
658
- | `-v, --version` | output the version number |
659
- | `--model <value>` | Optional fuzzy or exact model name. (env: MODEL) |
660
- | `--model-class <value>` | Optional model capability class used when selecting a default model. (choices: "chat-thinking", "chat-balanced", "chat-fast", "embedding", env: MODEL_CLASS) |
661
- | `--prefer-system-models` | Prefer system.ai services over serving endpoints for non-exact model selection. (default: false, env: PREFER_SYSTEM_MODELS) |
662
- | `--no-prefer-system-models` | Disable prefer system.ai services over serving endpoints for non-exact model selection. |
663
- | `-l, --listen <value>` | Loopback listener address. (default: tcp://localhost:4000, env: LISTEN) |
664
- | `--profile <value>` | Databricks profile used for model discovery and requests. (env: DATABRICKS_CONFIG_PROFILE) |
665
- | `--body-limit <value>` | Maximum JSON request body size. (default: "100mb", env: BODY_LIMIT) |
666
- | `-r, --runtime-info` | Print runtime implementation metadata. (default: false, env: RUNTIME_INFO) |
667
- | `--no-runtime-info` | Disable print runtime implementation metadata. |
656
+ | Option | Description |
657
+ | -------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
658
+ | `-v, --version` | output the version number |
659
+ | `--model <value>` | Optional fuzzy or exact model name. (env: MODEL) |
660
+ | `--model-class <value>` | Optional model capability class used when selecting a default model. (choices: "chat-thinking", "chat-balanced", "chat-fast", "embedding", env: MODEL_CLASS) |
661
+ | `--smart-router <value>` | Smart Router mode: auto advertises it only when available, true requires it, and false disables it. (choices: "auto", "true", "false", default: "auto", env: SMART_ROUTER) |
662
+ | `--smart-router-timeout-ms <value>` | Maximum milliseconds allowed for one Databricks Smart Router request. (default: 10000, env: SMART_ROUTER_TIMEOUT_MS) |
663
+ | `--smart-router-context-token-budget <value>` | o200k_base token budget used to build Smart Router task context. (default: 4096, env: SMART_ROUTER_CONTEXT_TOKEN_BUDGET) |
664
+ | `--smart-router-probe-ttl-ms <value>` | Milliseconds a successful memoized Smart Router capability probe remains valid. (default: 300000, env: SMART_ROUTER_PROBE_TTL_MS) |
665
+ | `--smart-router-probe-refresh-interval-ms <value>` | Milliseconds between unref'd background refreshes of cached Smart Router probes. (default: 3600000, env: SMART_ROUTER_PROBE_REFRESH_INTERVAL_MS) |
666
+ | `--smart-router-route-ttl-seconds <value>` | Seconds a logical turn remains pinned to its Smart Router-selected model. (default: 21600, env: SMART_ROUTER_ROUTE_TTL_SECONDS) |
667
+ | `--prefer-system-models` | Prefer system.ai services over serving endpoints for non-exact model selection. (default: false, env: PREFER_SYSTEM_MODELS) |
668
+ | `--no-prefer-system-models` | Disable prefer system.ai services over serving endpoints for non-exact model selection. |
669
+ | `-l, --listen <value>` | Loopback listener address. (default: tcp://localhost:4000, env: LISTEN) |
670
+ | `--profile <value>` | Databricks profile used for model discovery and requests. (env: DATABRICKS_CONFIG_PROFILE) |
671
+ | `--body-limit <value>` | Maximum JSON request body size. (default: "100mb", env: BODY_LIMIT) |
672
+ | `-r, --runtime-info` | Print runtime implementation metadata. (default: false, env: RUNTIME_INFO) |
673
+ | `--no-runtime-info` | Disable print runtime implementation metadata. |
674
+ | `--select-model-from <value>` | Select a Smart Router model from a JSON or text file; use - for standard input. (env: SELECT_MODEL_FROM) |
668
675
 
669
676
  #### Commands
670
677
 
@@ -6,4 +6,4 @@ export * as cli from "./src/model-gateway/cli.ts";
6
6
  export * as server from "./src/model-gateway/server.ts";
7
7
  export { modelGatewayServiceDefinition, buildProgram } from "./src/model-gateway/cli.ts";
8
8
  export type { ModelGatewayCliDependencies } from "./src/model-gateway/cli.ts";
9
- export { modelGatewayServerOptions, gatewayBearerMiddleware, startModelGateway } from "./src/model-gateway/server.ts";
9
+ export { modelGatewayServerOptions, gatewayBearerMiddleware, startModelGateway, selectSmartRouterModel } from "./src/model-gateway/server.ts";
package/index.ts CHANGED
@@ -3,7 +3,7 @@
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/cli";
6
- export const PACKAGE_VERSION = "0.9.175";
6
+ export const PACKAGE_VERSION = "0.9.176";
7
7
  export * as bootstrap from "./src/bootstrap.ts";
8
8
  export * as bun from "./src/bun.ts";
9
9
  export * as cli from "./src/cli.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/cli";
2
- export declare const PACKAGE_VERSION = "0.9.175";
2
+ export declare const PACKAGE_VERSION = "0.9.176";
3
3
  export * as bootstrap from "./src/bootstrap.ts";
4
4
  export * as bun from "./src/bun.ts";
5
5
  export * as cli from "./src/cli.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
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/cli";
5
- export const PACKAGE_VERSION = "0.9.175";
5
+ export const PACKAGE_VERSION = "0.9.176";
6
6
  export * as bootstrap from "./src/bootstrap.js";
7
7
  export * as bun from "./src/bun.js";
8
8
  export * as cli from "./src/cli.js";
@@ -11,4 +11,4 @@ export { ensureEngineCurrent, bootstrapWorkspace, seedToolchain, runInitialSynth
11
11
  export { bunRegistryArgs, bunUsesRegistry, childEnv, resolveBunArgv, runBun, ensureWorkspaceReady, runProjen } from "./src/bun.js";
12
12
  export { prepareAndRunProjen, buildProgram, buildDocumentationProgram, runCli } from "./src/cli.js";
13
13
  export { findWorkspaceRoot, needsBootstrap, needsInstall, needsToolchain, workspaceRoot, rootLabel } from "./src/root.js";
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUNuRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RyxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbkksT0FBTyxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSx5QkFBeUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2NsaVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjE3NVwiO1xuZXhwb3J0ICogYXMgYm9vdHN0cmFwIGZyb20gXCIuL3NyYy9ib290c3RyYXAudHNcIjtcbmV4cG9ydCAqIGFzIGJ1biBmcm9tIFwiLi9zcmMvYnVuLnRzXCI7XG5leHBvcnQgKiBhcyBjbGkgZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0ICogYXMgcm9vdCBmcm9tIFwiLi9zcmMvcm9vdC50c1wiO1xuZXhwb3J0IHsgZW5zdXJlRW5naW5lQ3VycmVudCwgYm9vdHN0cmFwV29ya3NwYWNlLCBzZWVkVG9vbGNoYWluLCBydW5Jbml0aWFsU3ludGggfSBmcm9tIFwiLi9zcmMvYm9vdHN0cmFwLnRzXCI7XG5leHBvcnQgeyBidW5SZWdpc3RyeUFyZ3MsIGJ1blVzZXNSZWdpc3RyeSwgY2hpbGRFbnYsIHJlc29sdmVCdW5Bcmd2LCBydW5CdW4sIGVuc3VyZVdvcmtzcGFjZVJlYWR5LCBydW5Qcm9qZW4gfSBmcm9tIFwiLi9zcmMvYnVuLnRzXCI7XG5leHBvcnQgeyBwcmVwYXJlQW5kUnVuUHJvamVuLCBidWlsZFByb2dyYW0sIGJ1aWxkRG9jdW1lbnRhdGlvblByb2dyYW0sIHJ1bkNsaSB9IGZyb20gXCIuL3NyYy9jbGkudHNcIjtcbmV4cG9ydCB7IGZpbmRXb3Jrc3BhY2VSb290LCBuZWVkc0Jvb3RzdHJhcCwgbmVlZHNJbnN0YWxsLCBuZWVkc1Rvb2xjaGFpbiwgd29ya3NwYWNlUm9vdCwgcm9vdExhYmVsIH0gZnJvbSBcIi4vc3JjL3Jvb3QudHNcIjtcbiJdfQ==
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUNuRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RyxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbkksT0FBTyxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSx5QkFBeUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2NsaVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjE3NlwiO1xuZXhwb3J0ICogYXMgYm9vdHN0cmFwIGZyb20gXCIuL3NyYy9ib290c3RyYXAudHNcIjtcbmV4cG9ydCAqIGFzIGJ1biBmcm9tIFwiLi9zcmMvYnVuLnRzXCI7XG5leHBvcnQgKiBhcyBjbGkgZnJvbSBcIi4vc3JjL2NsaS50c1wiO1xuZXhwb3J0ICogYXMgcm9vdCBmcm9tIFwiLi9zcmMvcm9vdC50c1wiO1xuZXhwb3J0IHsgZW5zdXJlRW5naW5lQ3VycmVudCwgYm9vdHN0cmFwV29ya3NwYWNlLCBzZWVkVG9vbGNoYWluLCBydW5Jbml0aWFsU3ludGggfSBmcm9tIFwiLi9zcmMvYm9vdHN0cmFwLnRzXCI7XG5leHBvcnQgeyBidW5SZWdpc3RyeUFyZ3MsIGJ1blVzZXNSZWdpc3RyeSwgY2hpbGRFbnYsIHJlc29sdmVCdW5Bcmd2LCBydW5CdW4sIGVuc3VyZVdvcmtzcGFjZVJlYWR5LCBydW5Qcm9qZW4gfSBmcm9tIFwiLi9zcmMvYnVuLnRzXCI7XG5leHBvcnQgeyBwcmVwYXJlQW5kUnVuUHJvamVuLCBidWlsZFByb2dyYW0sIGJ1aWxkRG9jdW1lbnRhdGlvblByb2dyYW0sIHJ1bkNsaSB9IGZyb20gXCIuL3NyYy9jbGkudHNcIjtcbmV4cG9ydCB7IGZpbmRXb3Jrc3BhY2VSb290LCBuZWVkc0Jvb3RzdHJhcCwgbmVlZHNJbnN0YWxsLCBuZWVkc1Rvb2xjaGFpbiwgd29ya3NwYWNlUm9vdCwgcm9vdExhYmVsIH0gZnJvbSBcIi4vc3JjL3Jvb3QudHNcIjtcbiJdfQ==
@@ -2,4 +2,4 @@ export * as cli from "./src/model-gateway/cli.ts";
2
2
  export * as server from "./src/model-gateway/server.ts";
3
3
  export { modelGatewayServiceDefinition, buildProgram } from "./src/model-gateway/cli.ts";
4
4
  export type { ModelGatewayCliDependencies } from "./src/model-gateway/cli.ts";
5
- export { modelGatewayServerOptions, gatewayBearerMiddleware, startModelGateway } from "./src/model-gateway/server.ts";
5
+ export { modelGatewayServerOptions, gatewayBearerMiddleware, startModelGateway, selectSmartRouterModel } from "./src/model-gateway/server.ts";
@@ -4,5 +4,5 @@
4
4
  export * as cli from "./src/model-gateway/cli.js";
5
5
  export * as server from "./src/model-gateway/server.js";
6
6
  export { modelGatewayServiceDefinition, buildProgram } from "./src/model-gateway/cli.js";
7
- export { modelGatewayServerOptions, gatewayBearerMiddleware, startModelGateway } from "./src/model-gateway/server.js";
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubW9kZWwtZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2luZGV4Lm1vZGVsLWdhdGV3YXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkNBQTJDO0FBQzNDLG1EQUFtRDtBQUNuRCx3RUFBd0U7QUFFeEUsT0FBTyxLQUFLLEdBQUcsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRCxPQUFPLEtBQUssTUFBTSxNQUFNLCtCQUErQixDQUFDO0FBQ3hELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV6RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCAqIGFzIGNsaSBmcm9tIFwiLi9zcmMvbW9kZWwtZ2F0ZXdheS9jbGkudHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZlciBmcm9tIFwiLi9zcmMvbW9kZWwtZ2F0ZXdheS9zZXJ2ZXIudHNcIjtcbmV4cG9ydCB7IG1vZGVsR2F0ZXdheVNlcnZpY2VEZWZpbml0aW9uLCBidWlsZFByb2dyYW0gfSBmcm9tIFwiLi9zcmMvbW9kZWwtZ2F0ZXdheS9jbGkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5Q2xpRGVwZW5kZW5jaWVzIH0gZnJvbSBcIi4vc3JjL21vZGVsLWdhdGV3YXkvY2xpLnRzXCI7XG5leHBvcnQgeyBtb2RlbEdhdGV3YXlTZXJ2ZXJPcHRpb25zLCBnYXRld2F5QmVhcmVyTWlkZGxld2FyZSwgc3RhcnRNb2RlbEdhdGV3YXkgfSBmcm9tIFwiLi9zcmMvbW9kZWwtZ2F0ZXdheS9zZXJ2ZXIudHNcIjtcbiJdfQ==
7
+ export { modelGatewayServerOptions, gatewayBearerMiddleware, startModelGateway, selectSmartRouterModel } from "./src/model-gateway/server.js";
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubW9kZWwtZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2luZGV4Lm1vZGVsLWdhdGV3YXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkNBQTJDO0FBQzNDLG1EQUFtRDtBQUNuRCx3RUFBd0U7QUFFeEUsT0FBTyxLQUFLLEdBQUcsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRCxPQUFPLEtBQUssTUFBTSxNQUFNLCtCQUErQixDQUFDO0FBQ3hELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV6RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCAqIGFzIGNsaSBmcm9tIFwiLi9zcmMvbW9kZWwtZ2F0ZXdheS9jbGkudHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZlciBmcm9tIFwiLi9zcmMvbW9kZWwtZ2F0ZXdheS9zZXJ2ZXIudHNcIjtcbmV4cG9ydCB7IG1vZGVsR2F0ZXdheVNlcnZpY2VEZWZpbml0aW9uLCBidWlsZFByb2dyYW0gfSBmcm9tIFwiLi9zcmMvbW9kZWwtZ2F0ZXdheS9jbGkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5Q2xpRGVwZW5kZW5jaWVzIH0gZnJvbSBcIi4vc3JjL21vZGVsLWdhdGV3YXkvY2xpLnRzXCI7XG5leHBvcnQgeyBtb2RlbEdhdGV3YXlTZXJ2ZXJPcHRpb25zLCBnYXRld2F5QmVhcmVyTWlkZGxld2FyZSwgc3RhcnRNb2RlbEdhdGV3YXksIHNlbGVjdFNtYXJ0Um91dGVyTW9kZWwgfSBmcm9tIFwiLi9zcmMvbW9kZWwtZ2F0ZXdheS9zZXJ2ZXIudHNcIjtcbiJdfQ==
@@ -9,6 +9,7 @@ import { Command } from "commander";
9
9
  /** Injectable foreground gateway boundary for CLI tests. */
10
10
  export interface ModelGatewayCliDependencies {
11
11
  start(options: ModelGatewayOptions): Promise<void>;
12
+ select?(options: ModelGatewayOptions, input: unknown): Promise<Readonly<Record<string, unknown>>>;
12
13
  /** Optional service CLI boundary for tests and embedding. */
13
14
  readonly service?: CliServiceCliDependencies;
14
15
  }
@@ -3,18 +3,20 @@
3
3
  *
4
4
  * @module
5
5
  */
6
+ import { readFile } from "node:fs/promises";
6
7
  import { addArgs, parseArgs, serializeArgs } from "@dbx-tools/cli-args";
7
8
  import { buildServiceCommand, defineService, } from "@dbx-tools/cli-service";
8
9
  import { ModelGatewayCliOptionsSchema, resolveModelGatewayCliOptions, } from "@dbx-tools/shared-model-gateway";
9
10
  import { Command } from "commander";
10
- import { startModelGateway } from "./server.js";
11
+ import { selectSmartRouterModel, startModelGateway } from "./server.js";
11
12
  import { PACKAGE_VERSION } from "../../index.js";
12
13
  const DEFAULT_DEPENDENCIES = {
13
14
  start: startModelGateway,
15
+ select: selectSmartRouterModel,
14
16
  };
15
17
  /** Build the tray-only model-gateway service definition. */
16
18
  export function modelGatewayServiceDefinition(options = {}) {
17
- const { runtimeInfo: _, bearerToken: _bearerToken, ...resolved } = resolveModelGatewayCliOptions(options);
19
+ const { runtimeInfo: _, bearerToken: _bearerToken, selectModelFrom: _selectModelFrom, ...resolved } = resolveModelGatewayCliOptions(options);
18
20
  const host = urlHost(resolved.listen.host);
19
21
  return defineService(import.meta.url, {
20
22
  id: "dbx-tools.cli-model-gateway",
@@ -44,7 +46,13 @@ export function buildProgram(name = "dbx model-gateway", dependencies = DEFAULT_
44
46
  process.stdout.write(`${JSON.stringify({ implementation: "typescript-appkit", version })}\n`);
45
47
  return;
46
48
  }
47
- const { runtimeInfo: _, ...serverOptions } = options;
49
+ const { runtimeInfo: _, selectModelFrom, ...serverOptions } = options;
50
+ if (selectModelFrom) {
51
+ const input = await readSelectionInput(selectModelFrom);
52
+ const selected = await (dependencies.select ?? selectSmartRouterModel)(serverOptions, input);
53
+ process.stdout.write(`${JSON.stringify(selected, null, 2)}\n`);
54
+ return;
55
+ }
48
56
  await dependencies.start(serverOptions);
49
57
  });
50
58
  const serviceCommand = buildServiceCommand(() => {
@@ -59,4 +67,23 @@ function modelGatewayOptions(command) {
59
67
  function urlHost(host) {
60
68
  return host.includes(":") ? `[${host}]` : host;
61
69
  }
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vZGVsLWdhdGV3YXkvY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQ0wsbUJBQW1CLEVBRW5CLGFBQWEsR0FFZCxNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFDTCw0QkFBNEIsRUFDNUIsNkJBQTZCLEdBRzlCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBU2pELE1BQU0sb0JBQW9CLEdBQWdDO0lBQ3hELEtBQUssRUFBRSxpQkFBaUI7Q0FDekIsQ0FBQztBQUVGLDREQUE0RDtBQUM1RCxNQUFNLFVBQVUsNkJBQTZCLENBQzNDLFVBQStCLEVBQUU7SUFFakMsTUFBTSxFQUNKLFdBQVcsRUFBRSxDQUFDLEVBQ2QsV0FBVyxFQUFFLFlBQVksRUFDekIsR0FBRyxRQUFRLEVBQ1osR0FBRyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNwQyxFQUFFLEVBQUUsNkJBQTZCO1FBQ2pDLElBQUksRUFBRSxtQkFBbUI7UUFDekIsT0FBTyxFQUFFO1lBQ1AsT0FBTyxFQUFFLG1CQUFtQjtZQUM1QixTQUFTLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQztTQUNuQztRQUNELElBQUksRUFBRTtZQUNKO2dCQUNFLElBQUksRUFBRSxLQUFLO2dCQUNYLEtBQUssRUFBRSxRQUFRO2dCQUNmLEdBQUcsRUFBRSxVQUFVLElBQUksSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWTthQUN4RDtTQUNGO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixNQUFNLFVBQVUsWUFBWSxDQUMxQixJQUFJLEdBQUcsbUJBQW1CLEVBQzFCLGVBQTRDLG9CQUFvQjtJQUVoRSxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUM7SUFDaEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUNyQixJQUFJLE9BQU8sRUFBRTtTQUNWLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDVixXQUFXLENBQUMsbURBQW1ELENBQUM7U0FDaEUsT0FBTyxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsRUFDcEMsNEJBQTRCLENBQzdCLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2xCLE1BQU0sT0FBTyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5RixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUcsYUFBYSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQ3JELE1BQU0sWUFBWSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sY0FBYyxHQUFHLG1CQUFtQixDQUFDLEdBQUcsRUFBRTtRQUM5QyxPQUFPLDZCQUE2QixDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QixPQUFPLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLE9BQWdCO0lBQzNDLE9BQU8sU0FBUyxDQUFDLE9BQU8sRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxJQUFZO0lBQzNCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZvcmVncm91bmQgYGRieCBtb2RlbC1nYXRld2F5YCBjb21tYW5kLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBhZGRBcmdzLCBwYXJzZUFyZ3MsIHNlcmlhbGl6ZUFyZ3MgfSBmcm9tIFwiQGRieC10b29scy9jbGktYXJnc1wiO1xuaW1wb3J0IHtcbiAgYnVpbGRTZXJ2aWNlQ29tbWFuZCxcbiAgdHlwZSBDbGlTZXJ2aWNlQ2xpRGVwZW5kZW5jaWVzLFxuICBkZWZpbmVTZXJ2aWNlLFxuICB0eXBlIENsaVNlcnZpY2VEZWZpbml0aW9uLFxufSBmcm9tIFwiQGRieC10b29scy9jbGktc2VydmljZVwiO1xuaW1wb3J0IHtcbiAgTW9kZWxHYXRld2F5Q2xpT3B0aW9uc1NjaGVtYSxcbiAgcmVzb2x2ZU1vZGVsR2F0ZXdheUNsaU9wdGlvbnMsXG4gIHR5cGUgTW9kZWxHYXRld2F5Q2xpT3B0aW9ucyxcbiAgdHlwZSBNb2RlbEdhdGV3YXlPcHRpb25zLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcblxuaW1wb3J0IHsgc3RhcnRNb2RlbEdhdGV3YXkgfSBmcm9tIFwiLi9zZXJ2ZXIudHNcIjtcbmltcG9ydCB7IFBBQ0tBR0VfVkVSU0lPTiB9IGZyb20gXCIuLi8uLi9pbmRleC50c1wiO1xuXG4vKiogSW5qZWN0YWJsZSBmb3JlZ3JvdW5kIGdhdGV3YXkgYm91bmRhcnkgZm9yIENMSSB0ZXN0cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxHYXRld2F5Q2xpRGVwZW5kZW5jaWVzIHtcbiAgc3RhcnQob3B0aW9uczogTW9kZWxHYXRld2F5T3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBPcHRpb25hbCBzZXJ2aWNlIENMSSBib3VuZGFyeSBmb3IgdGVzdHMgYW5kIGVtYmVkZGluZy4gKi9cbiAgcmVhZG9ubHkgc2VydmljZT86IENsaVNlcnZpY2VDbGlEZXBlbmRlbmNpZXM7XG59XG5cbmNvbnN0IERFRkFVTFRfREVQRU5ERU5DSUVTOiBNb2RlbEdhdGV3YXlDbGlEZXBlbmRlbmNpZXMgPSB7XG4gIHN0YXJ0OiBzdGFydE1vZGVsR2F0ZXdheSxcbn07XG5cbi8qKiBCdWlsZCB0aGUgdHJheS1vbmx5IG1vZGVsLWdhdGV3YXkgc2VydmljZSBkZWZpbml0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsR2F0ZXdheVNlcnZpY2VEZWZpbml0aW9uKFxuICBvcHRpb25zOiBNb2RlbEdhdGV3YXlPcHRpb25zID0ge30sXG4pOiBDbGlTZXJ2aWNlRGVmaW5pdGlvbiB7XG4gIGNvbnN0IHtcbiAgICBydW50aW1lSW5mbzogXyxcbiAgICBiZWFyZXJUb2tlbjogX2JlYXJlclRva2VuLFxuICAgIC4uLnJlc29sdmVkXG4gIH0gPSByZXNvbHZlTW9kZWxHYXRld2F5Q2xpT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgaG9zdCA9IHVybEhvc3QocmVzb2x2ZWQubGlzdGVuLmhvc3QpO1xuICByZXR1cm4gZGVmaW5lU2VydmljZShpbXBvcnQubWV0YS51cmwsIHtcbiAgICBpZDogXCJkYngtdG9vbHMuY2xpLW1vZGVsLWdhdGV3YXlcIixcbiAgICBuYW1lOiBcImRieCBtb2RlbCBnYXRld2F5XCIsXG4gICAgY29tbWFuZDoge1xuICAgICAgYmluTmFtZTogXCJkYngtbW9kZWwtZ2F0ZXdheVwiLFxuICAgICAgYXJndW1lbnRzOiBzZXJpYWxpemVBcmdzKHJlc29sdmVkKSxcbiAgICB9LFxuICAgIG1lbnU6IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJ1cmxcIixcbiAgICAgICAgbGFiZWw6IFwiTW9kZWxzXCIsXG4gICAgICAgIHVybDogYGh0dHA6Ly8ke2hvc3R9OiR7cmVzb2x2ZWQubGlzdGVuLnBvcnR9L3YxL21vZGVsc2AsXG4gICAgICB9LFxuICAgIF0sXG4gIH0pO1xufVxuXG4vKiogQnVpbGQgZm9yZWdyb3VuZCBhbmQgc2VydmljZSBtb2RlbC1nYXRld2F5IGNvbW1hbmRzIHdpdGhvdXQgc3RhcnRpbmcgYSBzZXJ2ZXIuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQcm9ncmFtKFxuICBuYW1lID0gXCJkYnggbW9kZWwtZ2F0ZXdheVwiLFxuICBkZXBlbmRlbmNpZXM6IE1vZGVsR2F0ZXdheUNsaURlcGVuZGVuY2llcyA9IERFRkFVTFRfREVQRU5ERU5DSUVTLFxuKTogQ29tbWFuZCB7XG4gIGNvbnN0IHZlcnNpb24gPSBQQUNLQUdFX1ZFUlNJT047XG4gIGNvbnN0IHByb2dyYW0gPSBhZGRBcmdzKFxuICAgIG5ldyBDb21tYW5kKClcbiAgICAgIC5uYW1lKG5hbWUpXG4gICAgICAuZGVzY3JpcHRpb24oXCJSdW4gb3IgbWFuYWdlIHRoZSBBcHBLaXQgRGF0YWJyaWNrcyBtb2RlbCBnYXRld2F5XCIpXG4gICAgICAudmVyc2lvbih2ZXJzaW9uLCBcIi12LCAtLXZlcnNpb25cIiksXG4gICAgTW9kZWxHYXRld2F5Q2xpT3B0aW9uc1NjaGVtYSxcbiAgKS5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBtb2RlbEdhdGV3YXlPcHRpb25zKHByb2dyYW0pO1xuICAgIGlmIChvcHRpb25zLnJ1bnRpbWVJbmZvKSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgJHtKU09OLnN0cmluZ2lmeSh7IGltcGxlbWVudGF0aW9uOiBcInR5cGVzY3JpcHQtYXBwa2l0XCIsIHZlcnNpb24gfSl9XFxuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgcnVudGltZUluZm86IF8sIC4uLnNlcnZlck9wdGlvbnMgfSA9IG9wdGlvbnM7XG4gICAgYXdhaXQgZGVwZW5kZW5jaWVzLnN0YXJ0KHNlcnZlck9wdGlvbnMpO1xuICB9KTtcbiAgY29uc3Qgc2VydmljZUNvbW1hbmQgPSBidWlsZFNlcnZpY2VDb21tYW5kKCgpID0+IHtcbiAgICByZXR1cm4gbW9kZWxHYXRld2F5U2VydmljZURlZmluaXRpb24obW9kZWxHYXRld2F5T3B0aW9ucyhwcm9ncmFtKSk7XG4gIH0sIGRlcGVuZGVuY2llcy5zZXJ2aWNlKTtcbiAgcHJvZ3JhbS5hZGRDb21tYW5kKHNlcnZpY2VDb21tYW5kKTtcbiAgcmV0dXJuIHByb2dyYW07XG59XG5cbmZ1bmN0aW9uIG1vZGVsR2F0ZXdheU9wdGlvbnMoY29tbWFuZDogQ29tbWFuZCk6IE1vZGVsR2F0ZXdheUNsaU9wdGlvbnMge1xuICByZXR1cm4gcGFyc2VBcmdzKGNvbW1hbmQsIE1vZGVsR2F0ZXdheUNsaU9wdGlvbnNTY2hlbWEpO1xufVxuXG5mdW5jdGlvbiB1cmxIb3N0KGhvc3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBob3N0LmluY2x1ZGVzKFwiOlwiKSA/IGBbJHtob3N0fV1gIDogaG9zdDtcbn1cbiJdfQ==
70
+ async function readSelectionInput(path) {
71
+ const text = path === "-" ? await readStandardInput() : await readFile(path, "utf8");
72
+ const trimmed = text.trim();
73
+ if (!trimmed)
74
+ throw new Error("Smart Router selection input is empty");
75
+ try {
76
+ return JSON.parse(trimmed);
77
+ }
78
+ catch {
79
+ return text;
80
+ }
81
+ }
82
+ async function readStandardInput() {
83
+ process.stdin.setEncoding("utf8");
84
+ let text = "";
85
+ for await (const chunk of process.stdin)
86
+ text += chunk;
87
+ return text;
88
+ }
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vZGVsLWdhdGV3YXkvY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUNMLG1CQUFtQixFQUVuQixhQUFhLEdBRWQsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLDZCQUE2QixHQUc5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVVqRCxNQUFNLG9CQUFvQixHQUFnQztJQUN4RCxLQUFLLEVBQUUsaUJBQWlCO0lBQ3hCLE1BQU0sRUFBRSxzQkFBc0I7Q0FDL0IsQ0FBQztBQUVGLDREQUE0RDtBQUM1RCxNQUFNLFVBQVUsNkJBQTZCLENBQzNDLFVBQStCLEVBQUU7SUFFakMsTUFBTSxFQUNKLFdBQVcsRUFBRSxDQUFDLEVBQ2QsV0FBVyxFQUFFLFlBQVksRUFDekIsZUFBZSxFQUFFLGdCQUFnQixFQUNqQyxHQUFHLFFBQVEsRUFDWixHQUFHLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ3BDLEVBQUUsRUFBRSw2QkFBNkI7UUFDakMsSUFBSSxF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QUFPLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVCLElBQUksQ0FBQyxPQUFPO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQ3ZFLElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQVksQ0FBQztJQUN4QyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELEtBQUssVUFBVSxpQkFBaUI7SUFDOUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2QsSUFBSSxLQUFLLEVBQUUsTUFBTSxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUs7UUFBRSxJQUFJLElBQUksS0FBSyxDQUFDO0lBQ3ZELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRm9yZWdyb3VuZCBgZGJ4IG1vZGVsLWdhdGV3YXlgIGNvbW1hbmQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGFkZEFyZ3MsIHBhcnNlQXJncywgc2VyaWFsaXplQXJncyB9IGZyb20gXCJAZGJ4LXRvb2xzL2NsaS1hcmdzXCI7XG5pbXBvcnQge1xuICBidWlsZFNlcnZpY2VDb21tYW5kLFxuICB0eXBlIENsaVNlcnZpY2VDbGlEZXBlbmRlbmNpZXMsXG4gIGRlZmluZVNlcnZpY2UsXG4gIHR5cGUgQ2xpU2VydmljZURlZmluaXRpb24sXG59IGZyb20gXCJAZGJ4LXRvb2xzL2NsaS1zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICBNb2RlbEdhdGV3YXlDbGlPcHRpb25zU2NoZW1hLFxuICByZXNvbHZlTW9kZWxHYXRld2F5Q2xpT3B0aW9ucyxcbiAgdHlwZSBNb2RlbEdhdGV3YXlDbGlPcHRpb25zLFxuICB0eXBlIE1vZGVsR2F0ZXdheU9wdGlvbnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbC1nYXRld2F5XCI7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuXG5pbXBvcnQgeyBzZWxlY3RTbWFydFJvdXRlck1vZGVsLCBzdGFydE1vZGVsR2F0ZXdheSB9IGZyb20gXCIuL3NlcnZlci50c1wiO1xuaW1wb3J0IHsgUEFDS0FHRV9WRVJTSU9OIH0gZnJvbSBcIi4uLy4uL2luZGV4LnRzXCI7XG5cbi8qKiBJbmplY3RhYmxlIGZvcmVncm91bmQgZ2F0ZXdheSBib3VuZGFyeSBmb3IgQ0xJIHRlc3RzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEdhdGV3YXlDbGlEZXBlbmRlbmNpZXMge1xuICBzdGFydChvcHRpb25zOiBNb2RlbEdhdGV3YXlPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcbiAgc2VsZWN0PyhvcHRpb25zOiBNb2RlbEdhdGV3YXlPcHRpb25zLCBpbnB1dDogdW5rbm93bik6IFByb21pc2U8UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+PjtcbiAgLyoqIE9wdGlvbmFsIHNlcnZpY2UgQ0xJIGJvdW5kYXJ5IGZvciB0ZXN0cyBhbmQgZW1iZWRkaW5nLiAqL1xuICByZWFkb25seSBzZXJ2aWNlPzogQ2xpU2VydmljZUNsaURlcGVuZGVuY2llcztcbn1cblxuY29uc3QgREVGQVVMVF9ERVBFTkRFTkNJRVM6IE1vZGVsR2F0ZXdheUNsaURlcGVuZGVuY2llcyA9IHtcbiAgc3RhcnQ6IHN0YXJ0TW9kZWxHYXRld2F5LFxuICBzZWxlY3Q6IHNlbGVjdFNtYXJ0Um91dGVyTW9kZWwsXG59O1xuXG4vKiogQnVpbGQgdGhlIHRyYXktb25seSBtb2RlbC1nYXRld2F5IHNlcnZpY2UgZGVmaW5pdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2RlbEdhdGV3YXlTZXJ2aWNlRGVmaW5pdGlvbihcbiAgb3B0aW9uczogTW9kZWxHYXRld2F5T3B0aW9ucyA9IHt9LFxuKTogQ2xpU2VydmljZURlZmluaXRpb24ge1xuICBjb25zdCB7XG4gICAgcnVudGltZUluZm86IF8sXG4gICAgYmVhcmVyVG9rZW46IF9iZWFyZXJUb2tlbixcbiAgICBzZWxlY3RNb2RlbEZyb206IF9zZWxlY3RNb2RlbEZyb20sXG4gICAgLi4ucmVzb2x2ZWRcbiAgfSA9IHJlc29sdmVNb2RlbEdhdGV3YXlDbGlPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBob3N0ID0gdXJsSG9zdChyZXNvbHZlZC5saXN0ZW4uaG9zdCk7XG4gIHJldHVybiBkZWZpbmVTZXJ2aWNlKGltcG9ydC5tZXRhLnVybCwge1xuICAgIGlkOiBcImRieC10b29scy5jbGktbW9kZWwtZ2F0ZXdheVwiLFxuICAgIG5hbWU6IFwiZGJ4IG1vZGVsIGdhdGV3YXlcIixcbiAgICBjb21tYW5kOiB7XG4gICAgICBiaW5OYW1lOiBcImRieC1tb2RlbC1nYXRld2F5XCIsXG4gICAgICBhcmd1bWVudHM6IHNlcmlhbGl6ZUFyZ3MocmVzb2x2ZWQpLFxuICAgIH0sXG4gICAgbWVudTogW1xuICAgICAge1xuICAgICAgICB0eXBlOiBcInVybFwiLFxuICAgICAgICBsYWJlbDogXCJNb2RlbHNcIixcbiAgICAgICAgdXJsOiBgaHR0cDovLyR7aG9zdH06JHtyZXNvbHZlZC5saXN0ZW4ucG9ydH0vdjEvbW9kZWxzYCxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSk7XG59XG5cbi8qKiBCdWlsZCBmb3JlZ3JvdW5kIGFuZCBzZXJ2aWNlIG1vZGVsLWdhdGV3YXkgY29tbWFuZHMgd2l0aG91dCBzdGFydGluZyBhIHNlcnZlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByb2dyYW0oXG4gIG5hbWUgPSBcImRieCBtb2RlbC1nYXRld2F5XCIsXG4gIGRlcGVuZGVuY2llczogTW9kZWxHYXRld2F5Q2xpRGVwZW5kZW5jaWVzID0gREVGQVVMVF9ERVBFTkRFTkNJRVMsXG4pOiBDb21tYW5kIHtcbiAgY29uc3QgdmVyc2lvbiA9IFBBQ0tBR0VfVkVSU0lPTjtcbiAgY29uc3QgcHJvZ3JhbSA9IGFkZEFyZ3MoXG4gICAgbmV3IENvbW1hbmQoKVxuICAgICAgLm5hbWUobmFtZSlcbiAgICAgIC5kZXNjcmlwdGlvbihcIlJ1biBvciBtYW5hZ2UgdGhlIEFwcEtpdCBEYXRhYnJpY2tzIG1vZGVsIGdhdGV3YXlcIilcbiAgICAgIC52ZXJzaW9uKHZlcnNpb24sIFwiLXYsIC0tdmVyc2lvblwiKSxcbiAgICBNb2RlbEdhdGV3YXlDbGlPcHRpb25zU2NoZW1hLFxuICApLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IG1vZGVsR2F0ZXdheU9wdGlvbnMocHJvZ3JhbSk7XG4gICAgaWYgKG9wdGlvbnMucnVudGltZUluZm8pIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke0pTT04uc3RyaW5naWZ5KHsgaW1wbGVtZW50YXRpb246IFwidHlwZXNjcmlwdC1hcHBraXRcIiwgdmVyc2lvbiB9KX1cXG5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBydW50aW1lSW5mbzogXywgc2VsZWN0TW9kZWxGcm9tLCAuLi5zZXJ2ZXJPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgIGlmIChzZWxlY3RNb2RlbEZyb20pIHtcbiAgICAgIGNvbnN0IGlucHV0ID0gYXdhaXQgcmVhZFNlbGVjdGlvbklucHV0KHNlbGVjdE1vZGVsRnJvbSk7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9IGF3YWl0IChkZXBlbmRlbmNpZXMuc2VsZWN0ID8/IHNlbGVjdFNtYXJ0Um91dGVyTW9kZWwpKHNlcnZlck9wdGlvbnMsIGlucHV0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke0pTT04uc3RyaW5naWZ5KHNlbGVjdGVkLCBudWxsLCAyKX1cXG5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZGVwZW5kZW5jaWVzLnN0YXJ0KHNlcnZlck9wdGlvbnMpO1xuICB9KTtcbiAgY29uc3Qgc2VydmljZUNvbW1hbmQgPSBidWlsZFNlcnZpY2VDb21tYW5kKCgpID0+IHtcbiAgICByZXR1cm4gbW9kZWxHYXRld2F5U2VydmljZURlZmluaXRpb24obW9kZWxHYXRld2F5T3B0aW9ucyhwcm9ncmFtKSk7XG4gIH0sIGRlcGVuZGVuY2llcy5zZXJ2aWNlKTtcbiAgcHJvZ3JhbS5hZGRDb21tYW5kKHNlcnZpY2VDb21tYW5kKTtcbiAgcmV0dXJuIHByb2dyYW07XG59XG5cbmZ1bmN0aW9uIG1vZGVsR2F0ZXdheU9wdGlvbnMoY29tbWFuZDogQ29tbWFuZCk6IE1vZGVsR2F0ZXdheUNsaU9wdGlvbnMge1xuICByZXR1cm4gcGFyc2VBcmdzKGNvbW1hbmQsIE1vZGVsR2F0ZXdheUNsaU9wdGlvbnNTY2hlbWEpO1xufVxuXG5mdW5jdGlvbiB1cmxIb3N0KGhvc3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBob3N0LmluY2x1ZGVzKFwiOlwiKSA/IGBbJHtob3N0fV1gIDogaG9zdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFNlbGVjdGlvbklucHV0KHBhdGg6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCB0ZXh0ID0gcGF0aCA9PT0gXCItXCIgPyBhd2FpdCByZWFkU3RhbmRhcmRJbnB1dCgpIDogYXdhaXQgcmVhZEZpbGUocGF0aCwgXCJ1dGY4XCIpO1xuICBjb25zdCB0cmltbWVkID0gdGV4dC50cmltKCk7XG4gIGlmICghdHJpbW1lZCkgdGhyb3cgbmV3IEVycm9yKFwiU21hcnQgUm91dGVyIHNlbGVjdGlvbiBpbnB1dCBpcyBlbXB0eVwiKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0cmltbWVkKSBhcyB1bmtub3duO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkU3RhbmRhcmRJbnB1dCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICBwcm9jZXNzLnN0ZGluLnNldEVuY29kaW5nKFwidXRmOFwiKTtcbiAgbGV0IHRleHQgPSBcIlwiO1xuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHByb2Nlc3Muc3RkaW4pIHRleHQgKz0gY2h1bms7XG4gIHJldHVybiB0ZXh0O1xufVxuIl19
@@ -13,4 +13,6 @@ export declare function modelGatewayServerOptions(options?: ModelGatewayOptions)
13
13
  export declare function gatewayBearerMiddleware(token: string): express.RequestHandler;
14
14
  /** Start the foreground model gateway and keep its AppKit server active. */
15
15
  export declare function startModelGateway(options?: ModelGatewayOptions): Promise<void>;
16
+ /** Select one concrete model from arbitrary file/stdin content and exit. */
17
+ export declare function selectSmartRouterModel(options: ModelGatewayOptions, input: unknown): Promise<Readonly<Record<string, unknown>>>;
16
18
  export {};
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { createHash, timingSafeEqual } from "node:crypto";
7
7
  import { createApp, server } from "@databricks/appkit";
8
- import { ModelGateway, sendHealth, sendInference, sendModels, } from "@dbx-tools/appkit-model-gateway";
8
+ import { ModelGateway, SmartRouterService, SMART_ROUTER_DEFAULT_SETTINGS, DatabricksModelRegistry, sendHealth, sendInference, sendModels, smartRouterCandidates, } from "@dbx-tools/appkit-model-gateway";
9
9
  import { createWorkspaceClient } from "@dbx-tools/databricks";
10
10
  import { resolveModelGatewayOptions, } from "@dbx-tools/shared-model-gateway";
11
11
  /** Resolve AppKit server settings for the loopback model gateway. */
@@ -48,6 +48,12 @@ export function gatewayBearerMiddleware(token) {
48
48
  export async function startModelGateway(options = {}) {
49
49
  const resolved = resolveModelGatewayOptions(options);
50
50
  const gateway = new ModelGateway({
51
+ smartRouter: resolved.smartRouter,
52
+ smartRouterContextTokenBudget: resolved.smartRouterContextTokenBudget,
53
+ smartRouterProbeRefreshIntervalMs: resolved.smartRouterProbeRefreshIntervalMs,
54
+ smartRouterProbeTtlMs: resolved.smartRouterProbeTtlMs,
55
+ smartRouterRouteTtlSeconds: resolved.smartRouterRouteTtlSeconds,
56
+ smartRouterTimeoutMs: resolved.smartRouterTimeoutMs,
51
57
  ...(resolved.model ? { model: resolved.model } : {}),
52
58
  ...(resolved.modelClass ? { modelClass: resolved.modelClass } : {}),
53
59
  preferSystemModels: resolved.preferSystemModels,
@@ -83,4 +89,36 @@ export async function startModelGateway(options = {}) {
83
89
  },
84
90
  });
85
91
  }
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vZGVsLWdhdGV3YXkvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCxZQUFZLEVBQ1osVUFBVSxFQUNWLGFBQWEsRUFDYixVQUFVLEdBQ1gsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsMEJBQTBCLEdBRzNCLE1BQU0saUNBQWlDLENBQUM7QUFLekMscUVBQXFFO0FBQ3JFLE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxVQUErQixFQUFFO0lBQ3pFLE9BQU8sbUJBQW1CLENBQUMsMEJBQTBCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxPQUFvQztJQUMvRCxPQUFPO1FBQ0wsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1FBQzVCLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUk7UUFDekIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSTtLQUMxQixDQUFDO0FBQ0osQ0FBQztBQUVELGlGQUFpRjtBQUNqRixNQUFNLFVBQVUsdUJBQXVCLENBQUMsS0FBYTtJQUNuRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzdELE9BQU8sQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ2pDLE1BQU0sYUFBYSxHQUFHLE9BQU8s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QUFDO29CQUN0QyxDQUFDLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDO2lCQUMvQixFQUFFLENBQUM7b0JBQ1gsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUU7d0JBQzNDLEtBQUssYUFBYSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUMzRCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRm9yZWdyb3VuZCBtb2RlbC1nYXRld2F5IHNlcnZlciBvd25lZCBieSB0aGUgQ0xJIHBhY2thZ2UuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2gsIHRpbWluZ1NhZmVFcXVhbCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgY3JlYXRlQXBwLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQge1xuICBNb2RlbEdhdGV3YXksXG4gIHNlbmRIZWFsdGgsXG4gIHNlbmRJbmZlcmVuY2UsXG4gIHNlbmRNb2RlbHMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tb2RlbC1nYXRld2F5XCI7XG5pbXBvcnQgeyBjcmVhdGVXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRieC10b29scy9kYXRhYnJpY2tzXCI7XG5pbXBvcnQge1xuICByZXNvbHZlTW9kZWxHYXRld2F5T3B0aW9ucyxcbiAgdHlwZSBNb2RlbEdhdGV3YXlPcHRpb25zLFxuICB0eXBlIFJlc29sdmVkTW9kZWxHYXRld2F5T3B0aW9ucyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcbmltcG9ydCB0eXBlIGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcblxudHlwZSBBcHBLaXRTZXJ2ZXJPcHRpb25zID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczx0eXBlb2Ygc2VydmVyPlswXT47XG5cbi8qKiBSZXNvbHZlIEFwcEtpdCBzZXJ2ZXIgc2V0dGluZ3MgZm9yIHRoZSBsb29wYmFjayBtb2RlbCBnYXRld2F5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGVsR2F0ZXdheVNlcnZlck9wdGlvbnMob3B0aW9uczogTW9kZWxHYXRld2F5T3B0aW9ucyA9IHt9KTogQXBwS2l0U2VydmVyT3B0aW9ucyB7XG4gIHJldHVybiBhcHBLaXRTZXJ2ZXJPcHRpb25zKHJlc29sdmVNb2RlbEdhdGV3YXlPcHRpb25zKG9wdGlvbnMpKTtcbn1cblxuZnVuY3Rpb24gYXBwS2l0U2VydmVyT3B0aW9ucyhvcHRpb25zOiBSZXNvbHZlZE1vZGVsR2F0ZXdheU9wdGlvbnMpOiBBcHBLaXRTZXJ2ZXJPcHRpb25zIHtcbiAgcmV0dXJuIHtcbiAgICBib2R5TGltaXQ6IG9wdGlvbnMuYm9keUxpbWl0LFxuICAgIGhvc3Q6IG9wdGlvbnMubGlzdGVuLmhvc3QsXG4gICAgcG9ydDogb3B0aW9ucy5saXN0ZW4ucG9ydCxcbiAgfTtcbn1cblxuLyoqIFJlcXVpcmUgb25lIGJlYXJlciB0b2tlbiB3aXRob3V0IHJldGFpbmluZyBvciBsb2dnaW5nIHJlcXVlc3QgY3JlZGVudGlhbHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2F0ZXdheUJlYXJlck1pZGRsZXdhcmUodG9rZW46IHN0cmluZyk6IGV4cHJlc3MuUmVxdWVzdEhhbmRsZXIge1xuICBjb25zdCBleHBlY3RlZCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKHRva2VuKS5kaWdlc3QoKTtcbiAgcmV0dXJuIChyZXF1ZXN0LCByZXNwb25zZSwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IGF1dGhvcml6YXRpb24gPSByZXF1ZXN0LmhlYWRlcihcImF1dGhvcml6YXRpb25cIik7XG4gICAgY29uc3QgbWF0Y2ggPSAvXkJlYXJlclxccysoLispJC9pLmV4ZWMoYXV0aG9yaXphdGlvbiA/PyBcIlwiKTtcbiAgICBjb25zdCBhY3R1YWwgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgICAudXBkYXRlKG1hdGNoPy5bMV0gPz8gXCJcIilcbiAgICAgIC5kaWdlc3QoKTtcbiAgICBpZiAobWF0Y2ggJiYgdGltaW5nU2FmZUVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpKSB7XG4gICAgICBuZXh0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlc3BvbnNlXG4gICAgICAuc3RhdHVzKDQwMSlcbiAgICAgIC5zZXRIZWFkZXIoXCJ3d3ctYXV0aGVudGljYXRlXCIsIFwiQmVhcmVyXCIpXG4gICAgICAuanNvbih7XG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgbWVzc2FnZTogXCJJbnZhbGlkIG9yIG1pc3NpbmcgbW9kZWwtZ2F0ZXdheSBiZWFyZXIgdG9rZW4uXCIsXG4gICAgICAgICAgdHlwZTogXCJhdXRoZW50aWNhdGlvbl9lcnJvclwiLFxuICAgICAgICAgIGNvZGU6IFwiaW52YWxpZF9iZWFyZXJfdG9rZW5cIixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9O1xufVxuXG4vKiogU3RhcnQgdGhlIGZvcmVncm91bmQgbW9kZWwgZ2F0ZXdheSBhbmQga2VlcCBpdHMgQXBwS2l0IHNlcnZlciBhY3RpdmUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRNb2RlbEdhdGV3YXkob3B0aW9uczogTW9kZWxHYXRld2F5T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZU1vZGVsR2F0ZXdheU9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGdhdGV3YXkgPSBuZXcgTW9kZWxHYXRld2F5KHtcbiAgICAuLi4ocmVzb2x2ZWQubW9kZWwgPyB7IG1vZGVsOiByZXNvbHZlZC5tb2RlbCB9IDoge30pLFxuICAgIC4uLihyZXNvbHZlZC5tb2RlbENsYXNzID8geyBtb2RlbENsYXNzOiByZXNvbHZlZC5tb2RlbENsYXNzIH0gOiB7fSksXG4gICAgcHJlZmVyU3lzdGVtTW9kZWxzOiByZXNvbHZlZC5wcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gIH0pO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCBjcmVhdGVXb3Jrc3BhY2VDbGllbnQoe1xuICAgIC4uLihyZXNvbHZlZC5wcm9maWxlID8geyBwcm9maWxlOiByZXNvbHZlZC5wcm9maWxlIH0gOiB7fSksXG4gIH0pO1xuICBhd2FpdCBjcmVhdGVBcHAoe1xuICAgIGNsaWVudCxcbiAgICBwbHVnaW5zOiBbc2VydmVyKGFwcEtpdFNlcnZlck9wdGlvbnMocmVzb2x2ZWQpKV0sXG4gICAgb25QbHVnaW5zUmVhZHkoYXBwa2l0KSB7XG4gICAgICBhcHBraXQuc2VydmVyLmV4dGVuZCgoYXBwbGljYXRpb24pID0+IHtcbiAgICAgICAgaWYgKHJlc29sdmVkLmJlYXJlclRva2VuKSB7XG4gICAgICAgICAgYXBwbGljYXRpb24udXNlKGdhdGV3YXlCZWFyZXJNaWRkbGV3YXJlKHJlc29sdmVkLmJlYXJlclRva2VuKSk7XG4gICAgICAgIH1cbiAgICAgICAgYXBwbGljYXRpb24uZ2V0KFwiL2FwaS9oZWFsdGh6XCIsIChfcmVxdWVzdCwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBzZW5kSGVhbHRoKHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGFwcGxpY2F0aW9uLmdldChcIi92MS9tb2RlbHNcIiwgKHJlcXVlc3QsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdm9pZCBzZW5kTW9kZWxzKGdhdGV3YXksIHJlcXVlc3QsIHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3QgW3BhdGgsIHByb3RvY29sXSBvZiBbXG4gICAgICAgICAgW1wiL3YxL2NoYXQvY29tcGxldGlvbnNcIiwgXCJvcGVuYWktY2hhdFwiXSxcbiAgICAgICAgICBbXCIvdjEvcmVzcG9uc2VzXCIsIFwib3BlbmFpLXJlc3BvbnNlc1wiXSxcbiAgICAgICAgICBbXCIvdjEvbWVzc2FnZXNcIiwgXCJhbnRocm9waWMtbWVzc2FnZXNcIl0sXG4gICAgICAgICAgW1wiL3YxL2VtYmVkZGluZ3NcIiwgXCJvcGVuYWktZW1iZWRkaW5nc1wiXSxcbiAgICAgICAgXSBhcyBjb25zdCkge1xuICAgICAgICAgIGFwcGxpY2F0aW9uLnBvc3QocGF0aCwgKHJlcXVlc3QsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICB2b2lkIHNlbmRJbmZlcmVuY2UoZ2F0ZXdheSwgcHJvdG9jb2wsIHJlcXVlc3QsIHJlc3BvbnNlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
92
+ /** Select one concrete model from arbitrary file/stdin content and exit. */
93
+ export async function selectSmartRouterModel(options, input) {
94
+ const resolved = resolveModelGatewayOptions(options);
95
+ const client = await createWorkspaceClient({
96
+ ...(resolved.profile ? { profile: resolved.profile } : {}),
97
+ });
98
+ const registry = new DatabricksModelRegistry({
99
+ client,
100
+ preferSystemModels: resolved.preferSystemModels,
101
+ });
102
+ const targets = (await registry.list()).filter((target) => target.capabilities.chat && target.capabilities.aiGatewayCodex);
103
+ const candidates = smartRouterCandidates(targets, "codex");
104
+ const service = new SmartRouterService({
105
+ ...SMART_ROUTER_DEFAULT_SETTINGS,
106
+ contextTokenBudget: resolved.smartRouterContextTokenBudget,
107
+ probeRefreshIntervalMs: resolved.smartRouterProbeRefreshIntervalMs,
108
+ probeTtlMs: resolved.smartRouterProbeTtlMs,
109
+ routeTtlSeconds: resolved.smartRouterRouteTtlSeconds,
110
+ timeoutMs: resolved.smartRouterTimeoutMs,
111
+ });
112
+ const selected = await service.select(input, candidates, { client });
113
+ return {
114
+ model: selected.value.id,
115
+ modelServiceName: selected.value.modelServiceName,
116
+ routeModel: selected.routeModel,
117
+ harness: selected.harness,
118
+ routerName: selected.routerName,
119
+ latencyMs: selected.latencyMs,
120
+ ...(selected.rationale ? { rationale: selected.rationale } : {}),
121
+ ...(selected.params ? { params: selected.params } : {}),
122
+ };
123
+ }
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vZGVsLWdhdGV3YXkvc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCxZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLDZCQUE2QixFQUM3Qix1QkFBdUIsRUFDdkIsVUFBVSxFQUNWLGFBQWEsRUFDYixVQUFVLEVBQ1YscUJBQXFCLEdBQ3RCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUNMLDBCQUEwQixHQUczQixNQUFNLGlDQUFpQyxDQUFDO0FBS3pDLHFFQUFxRTtBQUNyRSxNQUFNLFVBQVUseUJBQXlCLENBQUMsVUFBK0IsRUFBRTtJQUN6RSxPQUFPLG1CQUFtQixDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsT0FBb0M7SUFDL0QsT0FBTztRQUNMLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztRQUM1QixJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJO1FBQ3pCLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUk7S0FDMUIsQ0FBQztBQUNKLENBQUM7QUFFRCxpRkFBaUY7QUFDakYsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEtBQWE7SUFDbkQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM3RCxPQUFPLENBQUMsT0FBTyxFQUFF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LFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3hELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGb3JlZ3JvdW5kIG1vZGVsLWdhdGV3YXkgc2VydmVyIG93bmVkIGJ5IHRoZSBDTEkgcGFja2FnZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlSGFzaCwgdGltaW5nU2FmZUVxdWFsIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBjcmVhdGVBcHAsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIE1vZGVsR2F0ZXdheSxcbiAgU21hcnRSb3V0ZXJTZXJ2aWNlLFxuICBTTUFSVF9ST1VURVJfREVGQVVMVF9TRVRUSU5HUyxcbiAgRGF0YWJyaWNrc01vZGVsUmVnaXN0cnksXG4gIHNlbmRIZWFsdGgsXG4gIHNlbmRJbmZlcmVuY2UsXG4gIHNlbmRNb2RlbHMsXG4gIHNtYXJ0Um91dGVyQ2FuZGlkYXRlcyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1vZGVsLWdhdGV3YXlcIjtcbmltcG9ydCB7IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGJ4LXRvb2xzL2RhdGFicmlja3NcIjtcbmltcG9ydCB7XG4gIHJlc29sdmVNb2RlbEdhdGV3YXlPcHRpb25zLFxuICB0eXBlIE1vZGVsR2F0ZXdheU9wdGlvbnMsXG4gIHR5cGUgUmVzb2x2ZWRNb2RlbEdhdGV3YXlPcHRpb25zLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG50eXBlIEFwcEtpdFNlcnZlck9wdGlvbnMgPSBOb25OdWxsYWJsZTxQYXJhbWV0ZXJzPHR5cGVvZiBzZXJ2ZXI+WzBdPjtcblxuLyoqIFJlc29sdmUgQXBwS2l0IHNlcnZlciBzZXR0aW5ncyBmb3IgdGhlIGxvb3BiYWNrIG1vZGVsIGdhdGV3YXkuICovXG5leHBvcnQgZnVuY3Rpb24gbW9kZWxHYXRld2F5U2VydmVyT3B0aW9ucyhvcHRpb25zOiBNb2RlbEdhdGV3YXlPcHRpb25zID0ge30pOiBBcHBLaXRTZXJ2ZXJPcHRpb25zIHtcbiAgcmV0dXJuIGFwcEtpdFNlcnZlck9wdGlvbnMocmVzb2x2ZU1vZGVsR2F0ZXdheU9wdGlvbnMob3B0aW9ucykpO1xufVxuXG5mdW5jdGlvbiBhcHBLaXRTZXJ2ZXJPcHRpb25zKG9wdGlvbnM6IFJlc29sdmVkTW9kZWxHYXRld2F5T3B0aW9ucyk6IEFwcEtpdFNlcnZlck9wdGlvbnMge1xuICByZXR1cm4ge1xuICAgIGJvZHlMaW1pdDogb3B0aW9ucy5ib2R5TGltaXQsXG4gICAgaG9zdDogb3B0aW9ucy5saXN0ZW4uaG9zdCxcbiAgICBwb3J0OiBvcHRpb25zLmxpc3Rlbi5wb3J0LFxuICB9O1xufVxuXG4vKiogUmVxdWlyZSBvbmUgYmVhcmVyIHRva2VuIHdpdGhvdXQgcmV0YWluaW5nIG9yIGxvZ2dpbmcgcmVxdWVzdCBjcmVkZW50aWFscy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnYXRld2F5QmVhcmVyTWlkZGxld2FyZSh0b2tlbjogc3RyaW5nKTogZXhwcmVzcy5SZXF1ZXN0SGFuZGxlciB7XG4gIGNvbnN0IGV4cGVjdGVkID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUodG9rZW4pLmRpZ2VzdCgpO1xuICByZXR1cm4gKHJlcXVlc3QsIHJlc3BvbnNlLCBuZXh0KSA9PiB7XG4gICAgY29uc3QgYXV0aG9yaXphdGlvbiA9IHJlcXVlc3QuaGVhZGVyKFwiYXV0aG9yaXphdGlvblwiKTtcbiAgICBjb25zdCBtYXRjaCA9IC9eQmVhcmVyXFxzKyguKykkL2kuZXhlYyhhdXRob3JpemF0aW9uID8/IFwiXCIpO1xuICAgIGNvbnN0IGFjdHVhbCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAgIC51cGRhdGUobWF0Y2g/LlsxXSA/PyBcIlwiKVxuICAgICAgLmRpZ2VzdCgpO1xuICAgIGlmIChtYXRjaCAmJiB0aW1pbmdTYWZlRXF1YWwoYWN0dWFsLCBleHBlY3RlZCkpIHtcbiAgICAgIG5leHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzcG9uc2VcbiAgICAgIC5zdGF0dXMoNDAxKVxuICAgICAgLnNldEhlYWRlcihcInd3dy1hdXRoZW50aWNhdGVcIiwgXCJCZWFyZXJcIilcbiAgICAgIC5qc29uKHtcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBtZXNzYWdlOiBcIkludmFsaWQgb3IgbWlzc2luZyBtb2RlbC1nYXRld2F5IGJlYXJlciB0b2tlbi5cIixcbiAgICAgICAgICB0eXBlOiBcImF1dGhlbnRpY2F0aW9uX2Vycm9yXCIsXG4gICAgICAgICAgY29kZTogXCJpbnZhbGlkX2JlYXJlcl90b2tlblwiLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH07XG59XG5cbi8qKiBTdGFydCB0aGUgZm9yZWdyb3VuZCBtb2RlbCBnYXRld2F5IGFuZCBrZWVwIGl0cyBBcHBLaXQgc2VydmVyIGFjdGl2ZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydE1vZGVsR2F0ZXdheShvcHRpb25zOiBNb2RlbEdhdGV3YXlPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlTW9kZWxHYXRld2F5T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgZ2F0ZXdheSA9IG5ldyBNb2RlbEdhdGV3YXkoe1xuICAgIHNtYXJ0Um91dGVyOiByZXNvbHZlZC5zbWFydFJvdXRlcixcbiAgICBzbWFydFJvdXRlckNvbnRleHRUb2tlbkJ1ZGdldDogcmVzb2x2ZWQuc21hcnRSb3V0ZXJDb250ZXh0VG9rZW5CdWRnZXQsXG4gICAgc21hcnRSb3V0ZXJQcm9iZVJlZnJlc2hJbnRlcnZhbE1zOiByZXNvbHZlZC5zbWFydFJvdXRlclByb2JlUmVmcmVzaEludGVydmFsTXMsXG4gICAgc21hcnRSb3V0ZXJQcm9iZVR0bE1zOiByZXNvbHZlZC5zbWFydFJvdXRlclByb2JlVHRsTXMsXG4gICAgc21hcnRSb3V0ZXJSb3V0ZVR0bFNlY29uZHM6IHJlc29sdmVkLnNtYXJ0Um91dGVyUm91dGVUdGxTZWNvbmRzLFxuICAgIHNtYXJ0Um91dGVyVGltZW91dE1zOiByZXNvbHZlZC5zbWFydFJvdXRlclRpbWVvdXRNcyxcbiAgICAuLi4ocmVzb2x2ZWQubW9kZWwgPyB7IG1vZGVsOiByZXNvbHZlZC5tb2RlbCB9IDoge30pLFxuICAgIC4uLihyZXNvbHZlZC5tb2RlbENsYXNzID8geyBtb2RlbENsYXNzOiByZXNvbHZlZC5tb2RlbENsYXNzIH0gOiB7fSksXG4gICAgcHJlZmVyU3lzdGVtTW9kZWxzOiByZXNvbHZlZC5wcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gIH0pO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCBjcmVhdGVXb3Jrc3BhY2VDbGllbnQoe1xuICAgIC4uLihyZXNvbHZlZC5wcm9maWxlID8geyBwcm9maWxlOiByZXNvbHZlZC5wcm9maWxlIH0gOiB7fSksXG4gIH0pO1xuICBhd2FpdCBjcmVhdGVBcHAoe1xuICAgIGNsaWVudCxcbiAgICBwbHVnaW5zOiBbc2VydmVyKGFwcEtpdFNlcnZlck9wdGlvbnMocmVzb2x2ZWQpKV0sXG4gICAgb25QbHVnaW5zUmVhZHkoYXBwa2l0KSB7XG4gICAgICBhcHBraXQuc2VydmVyLmV4dGVuZCgoYXBwbGljYXRpb24pID0+IHtcbiAgICAgICAgaWYgKHJlc29sdmVkLmJlYXJlclRva2VuKSB7XG4gICAgICAgICAgYXBwbGljYXRpb24udXNlKGdhdGV3YXlCZWFyZXJNaWRkbGV3YXJlKHJlc29sdmVkLmJlYXJlclRva2VuKSk7XG4gICAgICAgIH1cbiAgICAgICAgYXBwbGljYXRpb24uZ2V0KFwiL2FwaS9oZWFsdGh6XCIsIChfcmVxdWVzdCwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBzZW5kSGVhbHRoKHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGFwcGxpY2F0aW9uLmdldChcIi92MS9tb2RlbHNcIiwgKHJlcXVlc3QsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdm9pZCBzZW5kTW9kZWxzKGdhdGV3YXksIHJlcXVlc3QsIHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3QgW3BhdGgsIHByb3RvY29sXSBvZiBbXG4gICAgICAgICAgW1wiL3YxL2NoYXQvY29tcGxldGlvbnNcIiwgXCJvcGVuYWktY2hhdFwiXSxcbiAgICAgICAgICBbXCIvdjEvcmVzcG9uc2VzXCIsIFwib3BlbmFpLXJlc3BvbnNlc1wiXSxcbiAgICAgICAgICBbXCIvdjEvbWVzc2FnZXNcIiwgXCJhbnRocm9waWMtbWVzc2FnZXNcIl0sXG4gICAgICAgICAgW1wiL3YxL2VtYmVkZGluZ3NcIiwgXCJvcGVuYWktZW1iZWRkaW5nc1wiXSxcbiAgICAgICAgXSBhcyBjb25zdCkge1xuICAgICAgICAgIGFwcGxpY2F0aW9uLnBvc3QocGF0aCwgKHJlcXVlc3QsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICB2b2lkIHNlbmRJbmZlcmVuY2UoZ2F0ZXdheSwgcHJvdG9jb2wsIHJlcXVlc3QsIHJlc3BvbnNlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKiBTZWxlY3Qgb25lIGNvbmNyZXRlIG1vZGVsIGZyb20gYXJiaXRyYXJ5IGZpbGUvc3RkaW4gY29udGVudCBhbmQgZXhpdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWxlY3RTbWFydFJvdXRlck1vZGVsKFxuICBvcHRpb25zOiBNb2RlbEdhdGV3YXlPcHRpb25zLFxuICBpbnB1dDogdW5rbm93bixcbik6IFByb21pc2U8UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+PiB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZU1vZGVsR2F0ZXdheU9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCh7XG4gICAgLi4uKHJlc29sdmVkLnByb2ZpbGUgPyB7IHByb2ZpbGU6IHJlc29sdmVkLnByb2ZpbGUgfSA6IHt9KSxcbiAgfSk7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5KHtcbiAgICBjbGllbnQsXG4gICAgcHJlZmVyU3lzdGVtTW9kZWxzOiByZXNvbHZlZC5wcmVmZXJTeXN0ZW1Nb2RlbHMsXG4gIH0pO1xuICBjb25zdCB0YXJnZXRzID0gKGF3YWl0IHJlZ2lzdHJ5Lmxpc3QoKSkuZmlsdGVyKFxuICAgICh0YXJnZXQpID0+IHRhcmdldC5jYXBhYmlsaXRpZXMuY2hhdCAmJiB0YXJnZXQuY2FwYWJpbGl0aWVzLmFpR2F0ZXdheUNvZGV4LFxuICApO1xuICBjb25zdCBjYW5kaWRhdGVzID0gc21hcnRSb3V0ZXJDYW5kaWRhdGVzKHRhcmdldHMsIFwiY29kZXhcIik7XG4gIGNvbnN0IHNlcnZpY2UgPSBuZXcgU21hcnRSb3V0ZXJTZXJ2aWNlKHtcbiAgICAuLi5TTUFSVF9ST1VURVJfREVGQVVMVF9TRVRUSU5HUyxcbiAgICBjb250ZXh0VG9rZW5CdWRnZXQ6IHJlc29sdmVkLnNtYXJ0Um91dGVyQ29udGV4dFRva2VuQnVkZ2V0LFxuICAgIHByb2JlUmVmcmVzaEludGVydmFsTXM6IHJlc29sdmVkLnNtYXJ0Um91dGVyUHJvYmVSZWZyZXNoSW50ZXJ2YWxNcyxcbiAgICBwcm9iZVR0bE1zOiByZXNvbHZlZC5zbWFydFJvdXRlclByb2JlVHRsTXMsXG4gICAgcm91dGVUdGxTZWNvbmRzOiByZXNvbHZlZC5zbWFydFJvdXRlclJvdXRlVHRsU2Vjb25kcyxcbiAgICB0aW1lb3V0TXM6IHJlc29sdmVkLnNtYXJ0Um91dGVyVGltZW91dE1zLFxuICB9KTtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBhd2FpdCBzZXJ2aWNlLnNlbGVjdChpbnB1dCwgY2FuZGlkYXRlcywgeyBjbGllbnQgfSk7XG4gIHJldHVybiB7XG4gICAgbW9kZWw6IHNlbGVjdGVkLnZhbHVlLmlkLFxuICAgIG1vZGVsU2VydmljZU5hbWU6IHNlbGVjdGVkLnZhbHVlLm1vZGVsU2VydmljZU5hbWUsXG4gICAgcm91dGVNb2RlbDogc2VsZWN0ZWQucm91dGVNb2RlbCxcbiAgICBoYXJuZXNzOiBzZWxlY3RlZC5oYXJuZXNzLFxuICAgIHJvdXRlck5hbWU6IHNlbGVjdGVkLnJvdXRlck5hbWUsXG4gICAgbGF0ZW5jeU1zOiBzZWxlY3RlZC5sYXRlbmN5TXMsXG4gICAgLi4uKHNlbGVjdGVkLnJhdGlvbmFsZSA/IHsgcmF0aW9uYWxlOiBzZWxlY3RlZC5yYXRpb25hbGUgfSA6IHt9KSxcbiAgICAuLi4oc2VsZWN0ZWQucGFyYW1zID8geyBwYXJhbXM6IHNlbGVjdGVkLnBhcmFtcyB9IDoge30pLFxuICB9O1xufVxuIl19
package/package.json CHANGED
@@ -34,28 +34,28 @@
34
34
  "dependencies": {
35
35
  "@clack/prompts": "^1.7.0",
36
36
  "@databricks/appkit": "0.81.0",
37
- "@dbx-tools/appkit": "^0.9.175",
38
- "@dbx-tools/appkit-generator": "^0.9.175",
39
- "@dbx-tools/appkit-memory": "^0.9.175",
40
- "@dbx-tools/appkit-model-gateway": "^0.9.175",
41
- "@dbx-tools/appkit-web-search": "^0.9.175",
42
- "@dbx-tools/auth": "^0.9.175",
43
- "@dbx-tools/auth-gate": "^0.9.175",
44
- "@dbx-tools/cli-args": "^0.9.175",
45
- "@dbx-tools/cli-service": "^0.9.175",
46
- "@dbx-tools/core": "^0.9.175",
47
- "@dbx-tools/databricks": "^0.9.175",
48
- "@dbx-tools/email": "^0.9.175",
49
- "@dbx-tools/lakebase": "^0.9.175",
50
- "@dbx-tools/postgres": "^0.9.175",
51
- "@dbx-tools/shared-auth": "^0.9.175",
52
- "@dbx-tools/shared-core": "^0.9.175",
53
- "@dbx-tools/shared-email": "^0.9.175",
54
- "@dbx-tools/shared-generator": "^0.9.175",
55
- "@dbx-tools/shared-genie-code": "^0.9.175",
56
- "@dbx-tools/shared-graphiti": "^0.9.175",
57
- "@dbx-tools/shared-model-gateway": "^0.9.175",
58
- "@dbx-tools/tunnel": "^0.9.175",
37
+ "@dbx-tools/appkit": "^0.9.176",
38
+ "@dbx-tools/appkit-generator": "^0.9.176",
39
+ "@dbx-tools/appkit-memory": "^0.9.176",
40
+ "@dbx-tools/appkit-model-gateway": "^0.9.176",
41
+ "@dbx-tools/appkit-web-search": "^0.9.176",
42
+ "@dbx-tools/auth": "^0.9.176",
43
+ "@dbx-tools/auth-gate": "^0.9.176",
44
+ "@dbx-tools/cli-args": "^0.9.176",
45
+ "@dbx-tools/cli-service": "^0.9.176",
46
+ "@dbx-tools/core": "^0.9.176",
47
+ "@dbx-tools/databricks": "^0.9.176",
48
+ "@dbx-tools/email": "^0.9.176",
49
+ "@dbx-tools/lakebase": "^0.9.176",
50
+ "@dbx-tools/postgres": "^0.9.176",
51
+ "@dbx-tools/shared-auth": "^0.9.176",
52
+ "@dbx-tools/shared-core": "^0.9.176",
53
+ "@dbx-tools/shared-email": "^0.9.176",
54
+ "@dbx-tools/shared-generator": "^0.9.176",
55
+ "@dbx-tools/shared-genie-code": "^0.9.176",
56
+ "@dbx-tools/shared-graphiti": "^0.9.176",
57
+ "@dbx-tools/shared-model-gateway": "^0.9.176",
58
+ "@dbx-tools/tunnel": "^0.9.176",
59
59
  "commander": "^15.0.0",
60
60
  "concurrently": "^10.0.3",
61
61
  "get-port": "^7.1.0",
@@ -119,7 +119,7 @@
119
119
  "./package.json": "./package.json"
120
120
  }
121
121
  },
122
- "version": "0.9.175",
122
+ "version": "0.9.176",
123
123
  "types": "./lib/index.d.ts",
124
124
  "dbxToolsConfig": {
125
125
  "tags": [
@@ -4,6 +4,7 @@
4
4
  * @module
5
5
  */
6
6
 
7
+ import { readFile } from "node:fs/promises";
7
8
  import { addArgs, parseArgs, serializeArgs } from "@dbx-tools/cli-args";
8
9
  import {
9
10
  buildServiceCommand,
@@ -19,18 +20,20 @@ import {
19
20
  } from "@dbx-tools/shared-model-gateway";
20
21
  import { Command } from "commander";
21
22
 
22
- import { startModelGateway } from "./server.ts";
23
+ import { selectSmartRouterModel, startModelGateway } from "./server.ts";
23
24
  import { PACKAGE_VERSION } from "../../index.ts";
24
25
 
25
26
  /** Injectable foreground gateway boundary for CLI tests. */
26
27
  export interface ModelGatewayCliDependencies {
27
28
  start(options: ModelGatewayOptions): Promise<void>;
29
+ select?(options: ModelGatewayOptions, input: unknown): Promise<Readonly<Record<string, unknown>>>;
28
30
  /** Optional service CLI boundary for tests and embedding. */
29
31
  readonly service?: CliServiceCliDependencies;
30
32
  }
31
33
 
32
34
  const DEFAULT_DEPENDENCIES: ModelGatewayCliDependencies = {
33
35
  start: startModelGateway,
36
+ select: selectSmartRouterModel,
34
37
  };
35
38
 
36
39
  /** Build the tray-only model-gateway service definition. */
@@ -40,6 +43,7 @@ export function modelGatewayServiceDefinition(
40
43
  const {
41
44
  runtimeInfo: _,
42
45
  bearerToken: _bearerToken,
46
+ selectModelFrom: _selectModelFrom,
43
47
  ...resolved
44
48
  } = resolveModelGatewayCliOptions(options);
45
49
  const host = urlHost(resolved.listen.host);
@@ -78,7 +82,13 @@ export function buildProgram(
78
82
  process.stdout.write(`${JSON.stringify({ implementation: "typescript-appkit", version })}\n`);
79
83
  return;
80
84
  }
81
- const { runtimeInfo: _, ...serverOptions } = options;
85
+ const { runtimeInfo: _, selectModelFrom, ...serverOptions } = options;
86
+ if (selectModelFrom) {
87
+ const input = await readSelectionInput(selectModelFrom);
88
+ const selected = await (dependencies.select ?? selectSmartRouterModel)(serverOptions, input);
89
+ process.stdout.write(`${JSON.stringify(selected, null, 2)}\n`);
90
+ return;
91
+ }
82
92
  await dependencies.start(serverOptions);
83
93
  });
84
94
  const serviceCommand = buildServiceCommand(() => {
@@ -95,3 +105,21 @@ function modelGatewayOptions(command: Command): ModelGatewayCliOptions {
95
105
  function urlHost(host: string): string {
96
106
  return host.includes(":") ? `[${host}]` : host;
97
107
  }
108
+
109
+ async function readSelectionInput(path: string): Promise<unknown> {
110
+ const text = path === "-" ? await readStandardInput() : await readFile(path, "utf8");
111
+ const trimmed = text.trim();
112
+ if (!trimmed) throw new Error("Smart Router selection input is empty");
113
+ try {
114
+ return JSON.parse(trimmed) as unknown;
115
+ } catch {
116
+ return text;
117
+ }
118
+ }
119
+
120
+ async function readStandardInput(): Promise<string> {
121
+ process.stdin.setEncoding("utf8");
122
+ let text = "";
123
+ for await (const chunk of process.stdin) text += chunk;
124
+ return text;
125
+ }
@@ -8,9 +8,13 @@ import { createHash, timingSafeEqual } from "node:crypto";
8
8
  import { createApp, server } from "@databricks/appkit";
9
9
  import {
10
10
  ModelGateway,
11
+ SmartRouterService,
12
+ SMART_ROUTER_DEFAULT_SETTINGS,
13
+ DatabricksModelRegistry,
11
14
  sendHealth,
12
15
  sendInference,
13
16
  sendModels,
17
+ smartRouterCandidates,
14
18
  } from "@dbx-tools/appkit-model-gateway";
15
19
  import { createWorkspaceClient } from "@dbx-tools/databricks";
16
20
  import {
@@ -65,6 +69,12 @@ export function gatewayBearerMiddleware(token: string): express.RequestHandler {
65
69
  export async function startModelGateway(options: ModelGatewayOptions = {}): Promise<void> {
66
70
  const resolved = resolveModelGatewayOptions(options);
67
71
  const gateway = new ModelGateway({
72
+ smartRouter: resolved.smartRouter,
73
+ smartRouterContextTokenBudget: resolved.smartRouterContextTokenBudget,
74
+ smartRouterProbeRefreshIntervalMs: resolved.smartRouterProbeRefreshIntervalMs,
75
+ smartRouterProbeTtlMs: resolved.smartRouterProbeTtlMs,
76
+ smartRouterRouteTtlSeconds: resolved.smartRouterRouteTtlSeconds,
77
+ smartRouterTimeoutMs: resolved.smartRouterTimeoutMs,
68
78
  ...(resolved.model ? { model: resolved.model } : {}),
69
79
  ...(resolved.modelClass ? { modelClass: resolved.modelClass } : {}),
70
80
  preferSystemModels: resolved.preferSystemModels,
@@ -100,3 +110,41 @@ export async function startModelGateway(options: ModelGatewayOptions = {}): Prom
100
110
  },
101
111
  });
102
112
  }
113
+
114
+ /** Select one concrete model from arbitrary file/stdin content and exit. */
115
+ export async function selectSmartRouterModel(
116
+ options: ModelGatewayOptions,
117
+ input: unknown,
118
+ ): Promise<Readonly<Record<string, unknown>>> {
119
+ const resolved = resolveModelGatewayOptions(options);
120
+ const client = await createWorkspaceClient({
121
+ ...(resolved.profile ? { profile: resolved.profile } : {}),
122
+ });
123
+ const registry = new DatabricksModelRegistry({
124
+ client,
125
+ preferSystemModels: resolved.preferSystemModels,
126
+ });
127
+ const targets = (await registry.list()).filter(
128
+ (target) => target.capabilities.chat && target.capabilities.aiGatewayCodex,
129
+ );
130
+ const candidates = smartRouterCandidates(targets, "codex");
131
+ const service = new SmartRouterService({
132
+ ...SMART_ROUTER_DEFAULT_SETTINGS,
133
+ contextTokenBudget: resolved.smartRouterContextTokenBudget,
134
+ probeRefreshIntervalMs: resolved.smartRouterProbeRefreshIntervalMs,
135
+ probeTtlMs: resolved.smartRouterProbeTtlMs,
136
+ routeTtlSeconds: resolved.smartRouterRouteTtlSeconds,
137
+ timeoutMs: resolved.smartRouterTimeoutMs,
138
+ });
139
+ const selected = await service.select(input, candidates, { client });
140
+ return {
141
+ model: selected.value.id,
142
+ modelServiceName: selected.value.modelServiceName,
143
+ routeModel: selected.routeModel,
144
+ harness: selected.harness,
145
+ routerName: selected.routerName,
146
+ latencyMs: selected.latencyMs,
147
+ ...(selected.rationale ? { rationale: selected.rationale } : {}),
148
+ ...(selected.params ? { params: selected.params } : {}),
149
+ };
150
+ }