@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 +19 -12
- package/index.model-gateway.ts +1 -1
- package/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/index.model-gateway.d.ts +1 -1
- package/lib/index.model-gateway.js +2 -2
- package/lib/src/model-gateway/cli.d.ts +1 -0
- package/lib/src/model-gateway/cli.js +31 -4
- package/lib/src/model-gateway/server.d.ts +2 -0
- package/lib/src/model-gateway/server.js +40 -2
- package/package.json +23 -23
- package/src/model-gateway/cli.ts +30 -2
- package/src/model-gateway/server.ts +48 -0
package/README.md
CHANGED
|
@@ -653,18 +653,25 @@ dbx model-gateway [options] [command]
|
|
|
653
653
|
|
|
654
654
|
#### Options
|
|
655
655
|
|
|
656
|
-
| Option
|
|
657
|
-
|
|
|
658
|
-
| `-v, --version`
|
|
659
|
-
| `--model <value>`
|
|
660
|
-
| `--model-class <value>`
|
|
661
|
-
| `--
|
|
662
|
-
| `--
|
|
663
|
-
|
|
|
664
|
-
| `--
|
|
665
|
-
| `--
|
|
666
|
-
|
|
|
667
|
-
| `--
|
|
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
|
|
package/index.model-gateway.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
38
|
-
"@dbx-tools/appkit-generator": "^0.9.
|
|
39
|
-
"@dbx-tools/appkit-memory": "^0.9.
|
|
40
|
-
"@dbx-tools/appkit-model-gateway": "^0.9.
|
|
41
|
-
"@dbx-tools/appkit-web-search": "^0.9.
|
|
42
|
-
"@dbx-tools/auth": "^0.9.
|
|
43
|
-
"@dbx-tools/auth-gate": "^0.9.
|
|
44
|
-
"@dbx-tools/cli-args": "^0.9.
|
|
45
|
-
"@dbx-tools/cli-service": "^0.9.
|
|
46
|
-
"@dbx-tools/core": "^0.9.
|
|
47
|
-
"@dbx-tools/databricks": "^0.9.
|
|
48
|
-
"@dbx-tools/email": "^0.9.
|
|
49
|
-
"@dbx-tools/lakebase": "^0.9.
|
|
50
|
-
"@dbx-tools/postgres": "^0.9.
|
|
51
|
-
"@dbx-tools/shared-auth": "^0.9.
|
|
52
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
53
|
-
"@dbx-tools/shared-email": "^0.9.
|
|
54
|
-
"@dbx-tools/shared-generator": "^0.9.
|
|
55
|
-
"@dbx-tools/shared-genie-code": "^0.9.
|
|
56
|
-
"@dbx-tools/shared-graphiti": "^0.9.
|
|
57
|
-
"@dbx-tools/shared-model-gateway": "^0.9.
|
|
58
|
-
"@dbx-tools/tunnel": "^0.9.
|
|
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.
|
|
122
|
+
"version": "0.9.176",
|
|
123
123
|
"types": "./lib/index.d.ts",
|
|
124
124
|
"dbxToolsConfig": {
|
|
125
125
|
"tags": [
|
package/src/model-gateway/cli.ts
CHANGED
|
@@ -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
|
+
}
|