@mariozechner/pi 0.1.5 → 0.5.0

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.
@@ -0,0 +1,21 @@
1
+ /**
2
+ * List all pods
3
+ */
4
+ export declare const listPods: () => void;
5
+ /**
6
+ * Setup a new pod
7
+ */
8
+ export declare const setupPod: (name: string, sshCmd: string, options: {
9
+ mount?: string;
10
+ modelsPath?: string;
11
+ vllm?: "release" | "nightly" | "gpt-oss";
12
+ }) => Promise<void>;
13
+ /**
14
+ * Switch active pod
15
+ */
16
+ export declare const switchActivePod: (name: string) => void;
17
+ /**
18
+ * Remove a pod from config
19
+ */
20
+ export declare const removePodCommand: (name: string) => void;
21
+ //# sourceMappingURL=pods.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pods.d.ts","sourceRoot":"","sources":["../../src/commands/pods.ts"],"names":[],"mappings":"AAUA;;GAEG;AACH,eAAO,MAAM,QAAQ,YAyBpB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,GACpB,MAAM,MAAM,EACZ,QAAQ,MAAM,EACd,SAAS;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAA;CAAE,kBA6H1F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,SAa3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,SAU5C,CAAC"}
@@ -0,0 +1,175 @@
1
+ import chalk from "chalk";
2
+ import { dirname, join } from "path";
3
+ import { fileURLToPath } from "url";
4
+ import { addPod, loadConfig, removePod, setActivePod } from "../config.js";
5
+ import { scpFile, sshExec, sshExecStream } from "../ssh.js";
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+ /**
9
+ * List all pods
10
+ */
11
+ export const listPods = () => {
12
+ const config = loadConfig();
13
+ const podNames = Object.keys(config.pods);
14
+ if (podNames.length === 0) {
15
+ console.log("No pods configured. Use 'pi pods setup' to add a pod.");
16
+ return;
17
+ }
18
+ console.log("Configured pods:");
19
+ for (const name of podNames) {
20
+ const pod = config.pods[name];
21
+ const isActive = config.active === name;
22
+ const marker = isActive ? chalk.green("*") : " ";
23
+ const gpuCount = pod.gpus?.length || 0;
24
+ const gpuInfo = gpuCount > 0 ? `${gpuCount}x ${pod.gpus[0].name}` : "no GPUs detected";
25
+ const vllmInfo = pod.vllmVersion ? ` (vLLM: ${pod.vllmVersion})` : "";
26
+ console.log(`${marker} ${chalk.bold(name)} - ${gpuInfo}${vllmInfo} - ${pod.ssh}`);
27
+ if (pod.modelsPath) {
28
+ console.log(` Models: ${pod.modelsPath}`);
29
+ }
30
+ if (pod.vllmVersion === "gpt-oss") {
31
+ console.log(chalk.yellow(` ⚠️ GPT-OSS build - only for GPT-OSS models`));
32
+ }
33
+ }
34
+ };
35
+ /**
36
+ * Setup a new pod
37
+ */
38
+ export const setupPod = async (name, sshCmd, options) => {
39
+ // Validate environment variables
40
+ const hfToken = process.env.HF_TOKEN;
41
+ const vllmApiKey = process.env.PI_API_KEY;
42
+ if (!hfToken) {
43
+ console.error(chalk.red("ERROR: HF_TOKEN environment variable is required"));
44
+ console.error("Get a token from: https://huggingface.co/settings/tokens");
45
+ console.error("Then run: export HF_TOKEN=your_token_here");
46
+ process.exit(1);
47
+ }
48
+ if (!vllmApiKey) {
49
+ console.error(chalk.red("ERROR: PI_API_KEY environment variable is required"));
50
+ console.error("Set an API key: export PI_API_KEY=your_api_key_here");
51
+ process.exit(1);
52
+ }
53
+ // Determine models path
54
+ let modelsPath = options.modelsPath;
55
+ if (!modelsPath && options.mount) {
56
+ // Extract path from mount command if not explicitly provided
57
+ // e.g., "mount -t nfs ... /mnt/sfs" -> "/mnt/sfs"
58
+ const parts = options.mount.split(" ");
59
+ modelsPath = parts[parts.length - 1];
60
+ }
61
+ if (!modelsPath) {
62
+ console.error(chalk.red("ERROR: --models-path is required (or must be extractable from --mount)"));
63
+ process.exit(1);
64
+ }
65
+ console.log(chalk.green(`Setting up pod '${name}'...`));
66
+ console.log(`SSH: ${sshCmd}`);
67
+ console.log(`Models path: ${modelsPath}`);
68
+ console.log(`vLLM version: ${options.vllm || "release"} ${options.vllm === "gpt-oss" ? chalk.yellow("(GPT-OSS special build)") : ""}`);
69
+ if (options.mount) {
70
+ console.log(`Mount command: ${options.mount}`);
71
+ }
72
+ console.log("");
73
+ // Test SSH connection
74
+ console.log("Testing SSH connection...");
75
+ const testResult = await sshExec(sshCmd, "echo 'SSH OK'");
76
+ if (testResult.exitCode !== 0) {
77
+ console.error(chalk.red("Failed to connect via SSH"));
78
+ console.error(testResult.stderr);
79
+ process.exit(1);
80
+ }
81
+ console.log(chalk.green("✓ SSH connection successful"));
82
+ // Copy setup script
83
+ console.log("Copying setup script...");
84
+ const scriptPath = join(__dirname, "../../scripts/pod_setup.sh");
85
+ const success = await scpFile(sshCmd, scriptPath, "/tmp/pod_setup.sh");
86
+ if (!success) {
87
+ console.error(chalk.red("Failed to copy setup script"));
88
+ process.exit(1);
89
+ }
90
+ console.log(chalk.green("✓ Setup script copied"));
91
+ // Build setup command
92
+ let setupCmd = `bash /tmp/pod_setup.sh --models-path '${modelsPath}' --hf-token '${hfToken}' --vllm-api-key '${vllmApiKey}'`;
93
+ if (options.mount) {
94
+ setupCmd += ` --mount '${options.mount}'`;
95
+ }
96
+ // Add vLLM version flag
97
+ const vllmVersion = options.vllm || "release";
98
+ setupCmd += ` --vllm '${vllmVersion}'`;
99
+ // Run setup script
100
+ console.log("");
101
+ console.log(chalk.yellow("Running setup (this will take 2-5 minutes)..."));
102
+ console.log("");
103
+ // Use forceTTY to preserve colors from apt, pip, etc.
104
+ const exitCode = await sshExecStream(sshCmd, setupCmd, { forceTTY: true });
105
+ if (exitCode !== 0) {
106
+ console.error(chalk.red("\nSetup failed. Check the output above for errors."));
107
+ process.exit(1);
108
+ }
109
+ // Parse GPU info from setup output
110
+ console.log("");
111
+ console.log("Detecting GPU configuration...");
112
+ const gpuResult = await sshExec(sshCmd, "nvidia-smi --query-gpu=index,name,memory.total --format=csv,noheader");
113
+ const gpus = [];
114
+ if (gpuResult.exitCode === 0 && gpuResult.stdout) {
115
+ const lines = gpuResult.stdout.trim().split("\n");
116
+ for (const line of lines) {
117
+ const [id, name, memory] = line.split(",").map((s) => s.trim());
118
+ if (id !== undefined) {
119
+ gpus.push({
120
+ id: parseInt(id),
121
+ name: name || "Unknown",
122
+ memory: memory || "Unknown",
123
+ });
124
+ }
125
+ }
126
+ }
127
+ console.log(chalk.green(`✓ Detected ${gpus.length} GPU(s)`));
128
+ for (const gpu of gpus) {
129
+ console.log(` GPU ${gpu.id}: ${gpu.name} (${gpu.memory})`);
130
+ }
131
+ // Save pod configuration
132
+ const pod = {
133
+ ssh: sshCmd,
134
+ gpus,
135
+ models: {},
136
+ modelsPath,
137
+ vllmVersion: options.vllm || "release",
138
+ };
139
+ addPod(name, pod);
140
+ console.log("");
141
+ console.log(chalk.green(`✓ Pod '${name}' setup complete and set as active pod`));
142
+ console.log("");
143
+ console.log("You can now deploy models with:");
144
+ console.log(chalk.cyan(` pi start <model> --name <name>`));
145
+ };
146
+ /**
147
+ * Switch active pod
148
+ */
149
+ export const switchActivePod = (name) => {
150
+ const config = loadConfig();
151
+ if (!config.pods[name]) {
152
+ console.error(chalk.red(`Pod '${name}' not found`));
153
+ console.log("\nAvailable pods:");
154
+ for (const podName of Object.keys(config.pods)) {
155
+ console.log(` ${podName}`);
156
+ }
157
+ process.exit(1);
158
+ }
159
+ setActivePod(name);
160
+ console.log(chalk.green(`✓ Switched active pod to '${name}'`));
161
+ };
162
+ /**
163
+ * Remove a pod from config
164
+ */
165
+ export const removePodCommand = (name) => {
166
+ const config = loadConfig();
167
+ if (!config.pods[name]) {
168
+ console.error(chalk.red(`Pod '${name}' not found`));
169
+ process.exit(1);
170
+ }
171
+ removePod(name);
172
+ console.log(chalk.green(`✓ Removed pod '${name}' from configuration`));
173
+ console.log(chalk.yellow("Note: This only removes the local configuration. The remote pod is not affected."));
174
+ };
175
+ //# sourceMappingURL=pods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pods.js","sourceRoot":"","sources":["../../src/commands/pods.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface PromptOptions {
2
+ pod?: string;
3
+ apiKey?: string;
4
+ }
5
+ export declare function promptModel(modelName: string, userArgs: string[], opts?: PromptOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"AAQA,UAAU,aAAa;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,aAAkB,iBAmEhG"}
@@ -0,0 +1,55 @@
1
+ import { main as agentMain } from "@mariozechner/pi-agent";
2
+ import chalk from "chalk";
3
+ import { getActivePod, loadConfig } from "../config.js";
4
+ // ────────────────────────────────────────────────────────────────────────────────
5
+ // Main prompt function
6
+ // ────────────────────────────────────────────────────────────────────────────────
7
+ export async function promptModel(modelName, userArgs, opts = {}) {
8
+ // Get pod and model configuration
9
+ const activePod = opts.pod ? { name: opts.pod, pod: loadConfig().pods[opts.pod] } : getActivePod();
10
+ if (!activePod) {
11
+ console.error(chalk.red("No active pod. Use 'pi pods active <name>' to set one."));
12
+ process.exit(1);
13
+ }
14
+ const { name: podName, pod } = activePod;
15
+ const modelConfig = pod.models[modelName];
16
+ if (!modelConfig) {
17
+ console.error(chalk.red(`Model '${modelName}' not found on pod '${podName}'`));
18
+ process.exit(1);
19
+ }
20
+ // Extract host from SSH string
21
+ const host = pod.ssh
22
+ .split(" ")
23
+ .find((p) => p.includes("@"))
24
+ ?.split("@")[1] ?? "localhost";
25
+ // Build the system prompt for code navigation
26
+ const systemPrompt = `You help the user understand and navigate the codebase in the current working directory.
27
+
28
+ You can read files, list directories, and execute shell commands via the respective tools.
29
+
30
+ Do not output file contents you read via the read_file tool directly, unless asked to.
31
+
32
+ Do not output markdown tables as part of your responses.
33
+
34
+ Keep your responses concise and relevant to the user's request.
35
+
36
+ File paths you output must include line numbers where possible, e.g. "src/index.ts:10-20" for lines 10 to 20 in src/index.ts.
37
+
38
+ Current working directory: ${process.cwd()}`;
39
+ // Build arguments for agent main function
40
+ const args = [];
41
+ // Add base configuration that we control
42
+ args.push("--base-url", `http://${host}:${modelConfig.port}/v1`, "--model", modelConfig.model, "--api-key", opts.apiKey || process.env.PI_API_KEY || "dummy", "--api", modelConfig.model.toLowerCase().includes("gpt-oss") ? "responses" : "completions", "--system-prompt", systemPrompt);
43
+ // Pass through all user-provided arguments
44
+ // This includes messages, --continue, --json, etc.
45
+ args.push(...userArgs);
46
+ // Call agent main function directly
47
+ try {
48
+ await agentMain(args);
49
+ }
50
+ catch (err) {
51
+ console.error(chalk.red(`Agent error: ${err.message}`));
52
+ process.exit(1);
53
+ }
54
+ }
55
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/commands/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAWxD,mFAAmF;AACnF,uBAAuB;AACvB,mFAAmF;AAEnF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB,EAAE,QAAkB,EAAE,OAAsB,EAAE;IAChG,kCAAkC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;IAEnG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC;IACzC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAE1C,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,SAAS,uBAAuB,OAAO,GAAG,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,+BAA+B;IAC/B,MAAM,IAAI,GACT,GAAG,CAAC,GAAG;SACL,KAAK,CAAC,GAAG,CAAC;SACV,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC7B,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;IAEjC,8CAA8C;IAC9C,MAAM,YAAY,GAAG;;;;;;;;;;;;6BAYO,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;IAE5C,0CAA0C;IAC1C,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,yCAAyC;IACzC,IAAI,CAAC,IAAI,CACR,YAAY,EACZ,UAAU,IAAI,IAAI,WAAW,CAAC,IAAI,KAAK,EACvC,SAAS,EACT,WAAW,CAAC,KAAK,EACjB,WAAW,EACX,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,EAChD,OAAO,EACP,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,EACjF,iBAAiB,EACjB,YAAY,CACZ,CAAC;IAEF,2CAA2C;IAC3C,mDAAmD;IACnD,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IAEvB,oCAAoC;IACpC,IAAI,CAAC;QACJ,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Config, Pod } from "./types.js";
2
+ export declare const loadConfig: () => Config;
3
+ export declare const saveConfig: (config: Config) => void;
4
+ export declare const getActivePod: () => {
5
+ name: string;
6
+ pod: Pod;
7
+ } | null;
8
+ export declare const addPod: (name: string, pod: Pod) => void;
9
+ export declare const removePod: (name: string) => void;
10
+ export declare const setActivePod: (name: string) => void;
11
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAe9C,eAAO,MAAM,UAAU,QAAO,MAa7B,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,KAAG,IAQ3C,CAAC;AAEF,eAAO,MAAM,YAAY,QAAO;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,GAAG,CAAA;CAAE,GAAG,IAM5D,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,EAAE,KAAK,GAAG,KAAG,IAQ/C,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,IAQxC,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,IAQ3C,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,74 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
2
+ import { homedir } from "os";
3
+ import { join } from "path";
4
+ // Get config directory from env or use default
5
+ const getConfigDir = () => {
6
+ const configDir = process.env.PI_CONFIG_DIR || join(homedir(), ".pi");
7
+ if (!existsSync(configDir)) {
8
+ mkdirSync(configDir, { recursive: true });
9
+ }
10
+ return configDir;
11
+ };
12
+ const getConfigPath = () => {
13
+ return join(getConfigDir(), "pods.json");
14
+ };
15
+ export const loadConfig = () => {
16
+ const configPath = getConfigPath();
17
+ if (!existsSync(configPath)) {
18
+ // Return empty config if file doesn't exist
19
+ return { pods: {} };
20
+ }
21
+ try {
22
+ const data = readFileSync(configPath, "utf-8");
23
+ return JSON.parse(data);
24
+ }
25
+ catch (e) {
26
+ console.error(`Error reading config: ${e}`);
27
+ return { pods: {} };
28
+ }
29
+ };
30
+ export const saveConfig = (config) => {
31
+ const configPath = getConfigPath();
32
+ try {
33
+ writeFileSync(configPath, JSON.stringify(config, null, 2));
34
+ }
35
+ catch (e) {
36
+ console.error(`Error saving config: ${e}`);
37
+ process.exit(1);
38
+ }
39
+ };
40
+ export const getActivePod = () => {
41
+ const config = loadConfig();
42
+ if (!config.active || !config.pods[config.active]) {
43
+ return null;
44
+ }
45
+ return { name: config.active, pod: config.pods[config.active] };
46
+ };
47
+ export const addPod = (name, pod) => {
48
+ const config = loadConfig();
49
+ config.pods[name] = pod;
50
+ // If no active pod, make this one active
51
+ if (!config.active) {
52
+ config.active = name;
53
+ }
54
+ saveConfig(config);
55
+ };
56
+ export const removePod = (name) => {
57
+ const config = loadConfig();
58
+ delete config.pods[name];
59
+ // If this was the active pod, clear active
60
+ if (config.active === name) {
61
+ config.active = undefined;
62
+ }
63
+ saveConfig(config);
64
+ };
65
+ export const setActivePod = (name) => {
66
+ const config = loadConfig();
67
+ if (!config.pods[name]) {
68
+ console.error(`Pod '${name}' not found`);
69
+ process.exit(1);
70
+ }
71
+ config.active = name;
72
+ saveConfig(config);
73
+ };
74
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./types.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ // Main library exports
2
+ export * from "./types.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,cAAc,YAAY,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { GPU } from "./types.js";
2
+ /**
3
+ * Get the best configuration for a model based on available GPUs
4
+ */
5
+ export declare const getModelConfig: (modelId: string, gpus: GPU[], requestedGpuCount: number) => {
6
+ args: string[];
7
+ env?: Record<string, string>;
8
+ notes?: string;
9
+ } | null;
10
+ /**
11
+ * Check if a model is known
12
+ */
13
+ export declare const isKnownModel: (modelId: string) => boolean;
14
+ /**
15
+ * Get all known models
16
+ */
17
+ export declare const getKnownModels: () => string[];
18
+ /**
19
+ * Get model display name
20
+ */
21
+ export declare const getModelName: (modelId: string) => string;
22
+ //# sourceMappingURL=model-configs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-configs.d.ts","sourceRoot":"","sources":["../src/model-configs.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AA2BtC;;GAEG;AACH,eAAO,MAAM,cAAc,GAC1B,SAAS,MAAM,EACf,MAAM,GAAG,EAAE,EACX,mBAAmB,MAAM,KACvB;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAoDrE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,KAAG,OAE9C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,QAAO,MAAM,EAEvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,KAAG,MAE9C,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { readFileSync } from "fs";
2
+ import { dirname, join } from "path";
3
+ import { fileURLToPath } from "url";
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = dirname(__filename);
6
+ // Load models configuration - resolve relative to this file
7
+ const modelsJsonPath = join(__dirname, "models.json");
8
+ const modelsData = JSON.parse(readFileSync(modelsJsonPath, "utf-8"));
9
+ /**
10
+ * Get the best configuration for a model based on available GPUs
11
+ */
12
+ export const getModelConfig = (modelId, gpus, requestedGpuCount) => {
13
+ const modelInfo = modelsData.models[modelId];
14
+ if (!modelInfo) {
15
+ // Unknown model, no default config
16
+ return null;
17
+ }
18
+ // Extract GPU type from the first GPU name (e.g., "NVIDIA H200" -> "H200")
19
+ const gpuType = gpus[0]?.name?.replace("NVIDIA", "")?.trim()?.split(" ")[0] || "";
20
+ // Find best matching config
21
+ let bestConfig = null;
22
+ for (const config of modelInfo.configs) {
23
+ // Check GPU count
24
+ if (config.gpuCount !== requestedGpuCount) {
25
+ continue;
26
+ }
27
+ // Check GPU type if specified
28
+ if (config.gpuTypes && config.gpuTypes.length > 0) {
29
+ const typeMatches = config.gpuTypes.some((type) => gpuType.includes(type) || type.includes(gpuType));
30
+ if (!typeMatches) {
31
+ continue;
32
+ }
33
+ }
34
+ // This config matches
35
+ bestConfig = config;
36
+ break;
37
+ }
38
+ // If no exact match, try to find a config with just the right GPU count
39
+ if (!bestConfig) {
40
+ for (const config of modelInfo.configs) {
41
+ if (config.gpuCount === requestedGpuCount) {
42
+ bestConfig = config;
43
+ break;
44
+ }
45
+ }
46
+ }
47
+ if (!bestConfig) {
48
+ // No suitable config found
49
+ return null;
50
+ }
51
+ return {
52
+ args: [...bestConfig.args],
53
+ env: bestConfig.env ? { ...bestConfig.env } : undefined,
54
+ notes: bestConfig.notes || modelInfo.notes,
55
+ };
56
+ };
57
+ /**
58
+ * Check if a model is known
59
+ */
60
+ export const isKnownModel = (modelId) => {
61
+ return modelId in modelsData.models;
62
+ };
63
+ /**
64
+ * Get all known models
65
+ */
66
+ export const getKnownModels = () => {
67
+ return Object.keys(modelsData.models);
68
+ };
69
+ /**
70
+ * Get model display name
71
+ */
72
+ export const getModelName = (modelId) => {
73
+ return modelsData.models[modelId]?.name || modelId;
74
+ };
75
+ //# sourceMappingURL=model-configs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-configs.js","sourceRoot":"","sources":["../src/model-configs.ts"],"names":[],"mappings":"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"}