@mariozechner/pi 0.2.4 → 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,612 @@
1
+ import chalk from "chalk";
2
+ import { spawn } from "child_process";
3
+ import { readFileSync } from "fs";
4
+ import { dirname, join } from "path";
5
+ import { fileURLToPath } from "url";
6
+ import { getActivePod, loadConfig, saveConfig } from "../config.js";
7
+ import { getModelConfig, getModelName, isKnownModel } from "../model-configs.js";
8
+ import { sshExec } from "../ssh.js";
9
+ /**
10
+ * Get the pod to use (active or override)
11
+ */
12
+ const getPod = (podOverride) => {
13
+ if (podOverride) {
14
+ const config = loadConfig();
15
+ const pod = config.pods[podOverride];
16
+ if (!pod) {
17
+ console.error(chalk.red(`Pod '${podOverride}' not found`));
18
+ process.exit(1);
19
+ }
20
+ return { name: podOverride, pod };
21
+ }
22
+ const active = getActivePod();
23
+ if (!active) {
24
+ console.error(chalk.red("No active pod. Use 'pi pods active <name>' to set one."));
25
+ process.exit(1);
26
+ }
27
+ return active;
28
+ };
29
+ /**
30
+ * Find next available port starting from 8001
31
+ */
32
+ const getNextPort = (pod) => {
33
+ const usedPorts = Object.values(pod.models).map((m) => m.port);
34
+ let port = 8001;
35
+ while (usedPorts.includes(port)) {
36
+ port++;
37
+ }
38
+ return port;
39
+ };
40
+ /**
41
+ * Select GPUs for model deployment (round-robin)
42
+ */
43
+ const selectGPUs = (pod, count = 1) => {
44
+ if (count === pod.gpus.length) {
45
+ // Use all GPUs
46
+ return pod.gpus.map((g) => g.id);
47
+ }
48
+ // Count GPU usage across all models
49
+ const gpuUsage = new Map();
50
+ for (const gpu of pod.gpus) {
51
+ gpuUsage.set(gpu.id, 0);
52
+ }
53
+ for (const model of Object.values(pod.models)) {
54
+ for (const gpuId of model.gpu) {
55
+ gpuUsage.set(gpuId, (gpuUsage.get(gpuId) || 0) + 1);
56
+ }
57
+ }
58
+ // Sort GPUs by usage (least used first)
59
+ const sortedGPUs = Array.from(gpuUsage.entries())
60
+ .sort((a, b) => a[1] - b[1])
61
+ .map((entry) => entry[0]);
62
+ // Return the least used GPUs
63
+ return sortedGPUs.slice(0, count);
64
+ };
65
+ /**
66
+ * Start a model
67
+ */
68
+ export const startModel = async (modelId, name, options) => {
69
+ const { name: podName, pod } = getPod(options.pod);
70
+ // Validation
71
+ if (!pod.modelsPath) {
72
+ console.error(chalk.red("Pod does not have a models path configured"));
73
+ process.exit(1);
74
+ }
75
+ if (pod.models[name]) {
76
+ console.error(chalk.red(`Model '${name}' already exists on pod '${podName}'`));
77
+ process.exit(1);
78
+ }
79
+ const port = getNextPort(pod);
80
+ // Determine GPU allocation and vLLM args
81
+ let gpus = [];
82
+ let vllmArgs = [];
83
+ let modelConfig = null;
84
+ if (options.vllmArgs?.length) {
85
+ // Custom args override everything
86
+ vllmArgs = options.vllmArgs;
87
+ console.log(chalk.gray("Using custom vLLM args, GPU allocation managed by vLLM"));
88
+ }
89
+ else if (isKnownModel(modelId)) {
90
+ // Handle --gpus parameter for known models
91
+ if (options.gpus) {
92
+ // Validate GPU count
93
+ if (options.gpus > pod.gpus.length) {
94
+ console.error(chalk.red(`Error: Requested ${options.gpus} GPUs but pod only has ${pod.gpus.length}`));
95
+ process.exit(1);
96
+ }
97
+ // Try to find config for requested GPU count
98
+ modelConfig = getModelConfig(modelId, pod.gpus, options.gpus);
99
+ if (modelConfig) {
100
+ gpus = selectGPUs(pod, options.gpus);
101
+ vllmArgs = [...(modelConfig.args || [])];
102
+ }
103
+ else {
104
+ console.error(chalk.red(`Model '${getModelName(modelId)}' does not have a configuration for ${options.gpus} GPU(s)`));
105
+ console.error(chalk.yellow("Available configurations:"));
106
+ // Show available configurations
107
+ for (let gpuCount = 1; gpuCount <= pod.gpus.length; gpuCount++) {
108
+ const config = getModelConfig(modelId, pod.gpus, gpuCount);
109
+ if (config) {
110
+ console.error(chalk.gray(` - ${gpuCount} GPU(s)`));
111
+ }
112
+ }
113
+ process.exit(1);
114
+ }
115
+ }
116
+ else {
117
+ // Find best config for this hardware (original behavior)
118
+ for (let gpuCount = pod.gpus.length; gpuCount >= 1; gpuCount--) {
119
+ modelConfig = getModelConfig(modelId, pod.gpus, gpuCount);
120
+ if (modelConfig) {
121
+ gpus = selectGPUs(pod, gpuCount);
122
+ vllmArgs = [...(modelConfig.args || [])];
123
+ break;
124
+ }
125
+ }
126
+ if (!modelConfig) {
127
+ console.error(chalk.red(`Model '${getModelName(modelId)}' not compatible with this pod's GPUs`));
128
+ process.exit(1);
129
+ }
130
+ }
131
+ }
132
+ else {
133
+ // Unknown model
134
+ if (options.gpus) {
135
+ console.error(chalk.red("Error: --gpus can only be used with predefined models"));
136
+ console.error(chalk.yellow("For custom models, use --vllm with tensor-parallel-size or similar arguments"));
137
+ process.exit(1);
138
+ }
139
+ // Single GPU default
140
+ gpus = selectGPUs(pod, 1);
141
+ console.log(chalk.gray("Unknown model, defaulting to single GPU"));
142
+ }
143
+ // Apply memory/context overrides
144
+ if (!options.vllmArgs?.length) {
145
+ if (options.memory) {
146
+ const fraction = parseFloat(options.memory.replace("%", "")) / 100;
147
+ vllmArgs = vllmArgs.filter((arg) => !arg.includes("gpu-memory-utilization"));
148
+ vllmArgs.push("--gpu-memory-utilization", String(fraction));
149
+ }
150
+ if (options.context) {
151
+ const contextSizes = {
152
+ "4k": 4096,
153
+ "8k": 8192,
154
+ "16k": 16384,
155
+ "32k": 32768,
156
+ "64k": 65536,
157
+ "128k": 131072,
158
+ };
159
+ const maxTokens = contextSizes[options.context.toLowerCase()] || parseInt(options.context);
160
+ vllmArgs = vllmArgs.filter((arg) => !arg.includes("max-model-len"));
161
+ vllmArgs.push("--max-model-len", String(maxTokens));
162
+ }
163
+ }
164
+ // Show what we're doing
165
+ console.log(chalk.green(`Starting model '${name}' on pod '${podName}'...`));
166
+ console.log(`Model: ${modelId}`);
167
+ console.log(`Port: ${port}`);
168
+ console.log(`GPU(s): ${gpus.length ? gpus.join(", ") : "Managed by vLLM"}`);
169
+ if (modelConfig?.notes)
170
+ console.log(chalk.yellow(`Note: ${modelConfig.notes}`));
171
+ console.log("");
172
+ // Read and customize model_run.sh script with our values
173
+ const scriptPath = join(dirname(fileURLToPath(import.meta.url)), "../../scripts/model_run.sh");
174
+ let scriptContent = readFileSync(scriptPath, "utf-8");
175
+ // Replace placeholders - no escaping needed, heredoc with 'EOF' is literal
176
+ scriptContent = scriptContent
177
+ .replace("{{MODEL_ID}}", modelId)
178
+ .replace("{{NAME}}", name)
179
+ .replace("{{PORT}}", String(port))
180
+ .replace("{{VLLM_ARGS}}", vllmArgs.join(" "));
181
+ // Upload customized script
182
+ const result = await sshExec(pod.ssh, `cat > /tmp/model_run_${name}.sh << 'EOF'
183
+ ${scriptContent}
184
+ EOF
185
+ chmod +x /tmp/model_run_${name}.sh`);
186
+ // Prepare environment
187
+ const env = [
188
+ `HF_TOKEN='${process.env.HF_TOKEN}'`,
189
+ `PI_API_KEY='${process.env.PI_API_KEY}'`,
190
+ `HF_HUB_ENABLE_HF_TRANSFER=1`,
191
+ `VLLM_NO_USAGE_STATS=1`,
192
+ `PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True`,
193
+ `FORCE_COLOR=1`,
194
+ `TERM=xterm-256color`,
195
+ ...(gpus.length === 1 ? [`CUDA_VISIBLE_DEVICES=${gpus[0]}`] : []),
196
+ ...Object.entries(modelConfig?.env || {}).map(([k, v]) => `${k}='${v}'`),
197
+ ]
198
+ .map((e) => `export ${e}`)
199
+ .join("\n");
200
+ // Start the model runner with script command for pseudo-TTY (preserves colors)
201
+ // Note: We use script to preserve colors and create a log file
202
+ // setsid creates a new session so it survives SSH disconnection
203
+ const startCmd = `
204
+ ${env}
205
+ mkdir -p ~/.vllm_logs
206
+ # Create a wrapper that monitors the script command
207
+ cat > /tmp/model_wrapper_${name}.sh << 'WRAPPER'
208
+ #!/bin/bash
209
+ script -q -f -c "/tmp/model_run_${name}.sh" ~/.vllm_logs/${name}.log
210
+ exit_code=$?
211
+ echo "Script exited with code $exit_code" >> ~/.vllm_logs/${name}.log
212
+ exit $exit_code
213
+ WRAPPER
214
+ chmod +x /tmp/model_wrapper_${name}.sh
215
+ setsid /tmp/model_wrapper_${name}.sh </dev/null >/dev/null 2>&1 &
216
+ echo $!
217
+ exit 0
218
+ `;
219
+ const pidResult = await sshExec(pod.ssh, startCmd);
220
+ const pid = parseInt(pidResult.stdout.trim());
221
+ if (!pid) {
222
+ console.error(chalk.red("Failed to start model runner"));
223
+ process.exit(1);
224
+ }
225
+ // Save to config
226
+ const config = loadConfig();
227
+ config.pods[podName].models[name] = { model: modelId, port, gpu: gpus, pid };
228
+ saveConfig(config);
229
+ console.log(`Model runner started with PID: ${pid}`);
230
+ console.log("Streaming logs... (waiting for startup)\n");
231
+ // Small delay to ensure log file is created
232
+ await new Promise((resolve) => setTimeout(resolve, 500));
233
+ // Stream logs with color support, watching for startup complete
234
+ const sshParts = pod.ssh.split(" ");
235
+ const sshCommand = sshParts[0]; // "ssh"
236
+ const sshArgs = sshParts.slice(1); // ["root@86.38.238.55"]
237
+ const host = sshArgs[0].split("@")[1] || "localhost";
238
+ const tailCmd = `tail -f ~/.vllm_logs/${name}.log`;
239
+ // Build the full args array for spawn
240
+ const fullArgs = [...sshArgs, tailCmd];
241
+ const logProcess = spawn(sshCommand, fullArgs, {
242
+ stdio: ["inherit", "pipe", "pipe"], // capture stdout and stderr
243
+ env: { ...process.env, FORCE_COLOR: "1" },
244
+ });
245
+ let interrupted = false;
246
+ let startupComplete = false;
247
+ // Handle Ctrl+C
248
+ const sigintHandler = () => {
249
+ interrupted = true;
250
+ logProcess.kill();
251
+ };
252
+ process.on("SIGINT", sigintHandler);
253
+ // Process log output line by line
254
+ const processOutput = (data) => {
255
+ const lines = data.toString().split("\n");
256
+ for (const line of lines) {
257
+ if (line) {
258
+ console.log(line); // Echo the line to console
259
+ // Check for startup complete message
260
+ if (line.includes("Application startup complete")) {
261
+ startupComplete = true;
262
+ logProcess.kill(); // Stop tailing logs
263
+ }
264
+ }
265
+ }
266
+ };
267
+ logProcess.stdout?.on("data", processOutput);
268
+ logProcess.stderr?.on("data", processOutput);
269
+ await new Promise((resolve) => logProcess.on("exit", resolve));
270
+ process.removeListener("SIGINT", sigintHandler);
271
+ if (startupComplete) {
272
+ // Model started successfully - output connection details
273
+ console.log("\n" + chalk.green("✓ Model started successfully!"));
274
+ console.log("\n" + chalk.bold("Connection Details:"));
275
+ console.log(chalk.cyan("─".repeat(50)));
276
+ console.log(chalk.white("Base URL: ") + chalk.yellow(`http://${host}:${port}/v1`));
277
+ console.log(chalk.white("Model: ") + chalk.yellow(modelId));
278
+ console.log(chalk.white("API Key: ") + chalk.yellow(process.env.PI_API_KEY || "(not set)"));
279
+ console.log(chalk.cyan("─".repeat(50)));
280
+ console.log("\n" + chalk.bold("Export for shell:"));
281
+ console.log(chalk.gray(`export OPENAI_BASE_URL="http://${host}:${port}/v1"`));
282
+ console.log(chalk.gray(`export OPENAI_API_KEY="${process.env.PI_API_KEY || "your-api-key"}"`));
283
+ console.log(chalk.gray(`export OPENAI_MODEL="${modelId}"`));
284
+ console.log("\n" + chalk.bold("Example usage:"));
285
+ console.log(chalk.gray(`
286
+ # Python
287
+ from openai import OpenAI
288
+ client = OpenAI() # Uses env vars
289
+ response = client.chat.completions.create(
290
+ model="${modelId}",
291
+ messages=[{"role": "user", "content": "Hello!"}]
292
+ )
293
+
294
+ # CLI
295
+ curl $OPENAI_BASE_URL/chat/completions \\
296
+ -H "Authorization: Bearer $OPENAI_API_KEY" \\
297
+ -H "Content-Type: application/json" \\
298
+ -d '{"model":"${modelId}","messages":[{"role":"user","content":"Hi"}]}'`));
299
+ console.log("");
300
+ console.log(chalk.cyan(`Chat with model: pi agent ${name} "Your message"`));
301
+ console.log(chalk.cyan(`Interactive mode: pi agent ${name} -i`));
302
+ console.log(chalk.cyan(`Monitor logs: pi logs ${name}`));
303
+ console.log(chalk.cyan(`Stop model: pi stop ${name}`));
304
+ }
305
+ else if (interrupted) {
306
+ console.log(chalk.yellow("\n\nStopped monitoring. Model deployment continues in background."));
307
+ console.log(chalk.cyan(`Chat with model: pi agent ${name} "Your message"`));
308
+ console.log(chalk.cyan(`Check status: pi logs ${name}`));
309
+ console.log(chalk.cyan(`Stop model: pi stop ${name}`));
310
+ }
311
+ else {
312
+ console.log(chalk.yellow("\n\nLog stream ended. Model may still be running."));
313
+ console.log(chalk.cyan(`Chat with model: pi agent ${name} "Your message"`));
314
+ console.log(chalk.cyan(`Check status: pi logs ${name}`));
315
+ console.log(chalk.cyan(`Stop model: pi stop ${name}`));
316
+ }
317
+ };
318
+ /**
319
+ * Stop a model
320
+ */
321
+ export const stopModel = async (name, options) => {
322
+ const { name: podName, pod } = getPod(options.pod);
323
+ const model = pod.models[name];
324
+ if (!model) {
325
+ console.error(chalk.red(`Model '${name}' not found on pod '${podName}'`));
326
+ process.exit(1);
327
+ }
328
+ console.log(chalk.yellow(`Stopping model '${name}' on pod '${podName}'...`));
329
+ // Kill the script process and all its children
330
+ // Using pkill to kill the process and all children
331
+ const killCmd = `
332
+ # Kill the script process and all its children
333
+ pkill -TERM -P ${model.pid} 2>/dev/null || true
334
+ kill ${model.pid} 2>/dev/null || true
335
+ `;
336
+ await sshExec(pod.ssh, killCmd);
337
+ // Remove from config
338
+ const config = loadConfig();
339
+ delete config.pods[podName].models[name];
340
+ saveConfig(config);
341
+ console.log(chalk.green(`✓ Model '${name}' stopped`));
342
+ };
343
+ /**
344
+ * Stop all models on a pod
345
+ */
346
+ export const stopAllModels = async (options) => {
347
+ const { name: podName, pod } = getPod(options.pod);
348
+ const modelNames = Object.keys(pod.models);
349
+ if (modelNames.length === 0) {
350
+ console.log(`No models running on pod '${podName}'`);
351
+ return;
352
+ }
353
+ console.log(chalk.yellow(`Stopping ${modelNames.length} model(s) on pod '${podName}'...`));
354
+ // Kill all script processes and their children
355
+ const pids = Object.values(pod.models).map((m) => m.pid);
356
+ const killCmd = `
357
+ for PID in ${pids.join(" ")}; do
358
+ pkill -TERM -P $PID 2>/dev/null || true
359
+ kill $PID 2>/dev/null || true
360
+ done
361
+ `;
362
+ await sshExec(pod.ssh, killCmd);
363
+ // Clear all models from config
364
+ const config = loadConfig();
365
+ config.pods[podName].models = {};
366
+ saveConfig(config);
367
+ console.log(chalk.green(`✓ Stopped all models: ${modelNames.join(", ")}`));
368
+ };
369
+ /**
370
+ * List all models
371
+ */
372
+ export const listModels = async (options) => {
373
+ const { name: podName, pod } = getPod(options.pod);
374
+ const modelNames = Object.keys(pod.models);
375
+ if (modelNames.length === 0) {
376
+ console.log(`No models running on pod '${podName}'`);
377
+ return;
378
+ }
379
+ // Get pod SSH host for URL display
380
+ const sshParts = pod.ssh.split(" ");
381
+ const host = sshParts.find((p) => p.includes("@"))?.split("@")[1] || "unknown";
382
+ console.log(`Models on pod '${chalk.bold(podName)}':`);
383
+ for (const name of modelNames) {
384
+ const model = pod.models[name];
385
+ const gpuStr = model.gpu.length > 1
386
+ ? `GPUs ${model.gpu.join(",")}`
387
+ : model.gpu.length === 1
388
+ ? `GPU ${model.gpu[0]}`
389
+ : "GPU unknown";
390
+ console.log(` ${chalk.green(name)} - Port ${model.port} - ${gpuStr} - PID ${model.pid}`);
391
+ console.log(` Model: ${chalk.gray(model.model)}`);
392
+ console.log(` URL: ${chalk.cyan(`http://${host}:${model.port}/v1`)}`);
393
+ }
394
+ // Optionally verify processes are still running
395
+ console.log("");
396
+ console.log("Verifying processes...");
397
+ let anyDead = false;
398
+ for (const name of modelNames) {
399
+ const model = pod.models[name];
400
+ // Check both the wrapper process and if vLLM is responding
401
+ const checkCmd = `
402
+ # Check if wrapper process exists
403
+ if ps -p ${model.pid} > /dev/null 2>&1; then
404
+ # Process exists, now check if vLLM is responding
405
+ if curl -s -f http://localhost:${model.port}/health > /dev/null 2>&1; then
406
+ echo "running"
407
+ else
408
+ # Check if it's still starting up
409
+ if tail -n 20 ~/.vllm_logs/${name}.log 2>/dev/null | grep -q "ERROR\\|Failed\\|Cuda error\\|died"; then
410
+ echo "crashed"
411
+ else
412
+ echo "starting"
413
+ fi
414
+ fi
415
+ else
416
+ echo "dead"
417
+ fi
418
+ `;
419
+ const result = await sshExec(pod.ssh, checkCmd);
420
+ const status = result.stdout.trim();
421
+ if (status === "dead") {
422
+ console.log(chalk.red(` ${name}: Process ${model.pid} is not running`));
423
+ anyDead = true;
424
+ }
425
+ else if (status === "crashed") {
426
+ console.log(chalk.red(` ${name}: vLLM crashed (check logs with 'pi logs ${name}')`));
427
+ anyDead = true;
428
+ }
429
+ else if (status === "starting") {
430
+ console.log(chalk.yellow(` ${name}: Still starting up...`));
431
+ }
432
+ }
433
+ if (anyDead) {
434
+ console.log("");
435
+ console.log(chalk.yellow("Some models are not running. Clean up with:"));
436
+ console.log(chalk.cyan(" pi stop <name>"));
437
+ }
438
+ else {
439
+ console.log(chalk.green("✓ All processes verified"));
440
+ }
441
+ };
442
+ /**
443
+ * View model logs
444
+ */
445
+ export const viewLogs = async (name, options) => {
446
+ const { name: podName, pod } = getPod(options.pod);
447
+ const model = pod.models[name];
448
+ if (!model) {
449
+ console.error(chalk.red(`Model '${name}' not found on pod '${podName}'`));
450
+ process.exit(1);
451
+ }
452
+ console.log(chalk.green(`Streaming logs for '${name}' on pod '${podName}'...`));
453
+ console.log(chalk.gray("Press Ctrl+C to stop"));
454
+ console.log("");
455
+ // Stream logs with color preservation
456
+ const sshParts = pod.ssh.split(" ");
457
+ const sshCommand = sshParts[0]; // "ssh"
458
+ const sshArgs = sshParts.slice(1); // ["root@86.38.238.55"]
459
+ const tailCmd = `tail -f ~/.vllm_logs/${name}.log`;
460
+ const logProcess = spawn(sshCommand, [...sshArgs, tailCmd], {
461
+ stdio: "inherit",
462
+ env: {
463
+ ...process.env,
464
+ FORCE_COLOR: "1",
465
+ },
466
+ });
467
+ // Wait for process to exit
468
+ await new Promise((resolve) => {
469
+ logProcess.on("exit", () => resolve());
470
+ });
471
+ };
472
+ /**
473
+ * Show known models and their hardware requirements
474
+ */
475
+ export const showKnownModels = async () => {
476
+ const modelsJson = await import("../models.json", { assert: { type: "json" } });
477
+ const models = modelsJson.default.models;
478
+ // Get active pod info if available
479
+ const activePod = getActivePod();
480
+ let podGpuCount = 0;
481
+ let podGpuType = "";
482
+ if (activePod) {
483
+ podGpuCount = activePod.pod.gpus.length;
484
+ // Extract GPU type from name (e.g., "NVIDIA H200" -> "H200")
485
+ podGpuType = activePod.pod.gpus[0]?.name?.replace("NVIDIA", "")?.trim()?.split(" ")[0] || "";
486
+ console.log(chalk.bold(`Known Models for ${activePod.name} (${podGpuCount}x ${podGpuType || "GPU"}):\n`));
487
+ }
488
+ else {
489
+ console.log(chalk.bold("Known Models:\n"));
490
+ console.log(chalk.yellow("No active pod. Use 'pi pods active <name>' to filter compatible models.\n"));
491
+ }
492
+ console.log("Usage: pi start <model> --name <name> [options]\n");
493
+ // Group models by compatibility and family
494
+ const compatible = {};
495
+ const incompatible = {};
496
+ for (const [modelId, info] of Object.entries(models)) {
497
+ const modelInfo = info;
498
+ const family = modelInfo.name.split("-")[0] || "Other";
499
+ let isCompatible = false;
500
+ let compatibleConfig = "";
501
+ let minGpu = "Unknown";
502
+ let minNotes;
503
+ if (modelInfo.configs && modelInfo.configs.length > 0) {
504
+ // Sort configs by GPU count to find minimum
505
+ const sortedConfigs = [...modelInfo.configs].sort((a, b) => (a.gpuCount || 1) - (b.gpuCount || 1));
506
+ // Find minimum requirements
507
+ const minConfig = sortedConfigs[0];
508
+ const minGpuCount = minConfig.gpuCount || 1;
509
+ const gpuTypes = minConfig.gpuTypes?.join("/") || "H100/H200";
510
+ if (minGpuCount === 1) {
511
+ minGpu = `1x ${gpuTypes}`;
512
+ }
513
+ else {
514
+ minGpu = `${minGpuCount}x ${gpuTypes}`;
515
+ }
516
+ minNotes = minConfig.notes || modelInfo.notes;
517
+ // Check compatibility with active pod
518
+ if (activePod && podGpuCount > 0) {
519
+ // Find best matching config for this pod
520
+ for (const config of sortedConfigs) {
521
+ const configGpuCount = config.gpuCount || 1;
522
+ const configGpuTypes = config.gpuTypes || [];
523
+ // Check if we have enough GPUs
524
+ if (configGpuCount <= podGpuCount) {
525
+ // Check if GPU type matches (if specified)
526
+ if (configGpuTypes.length === 0 ||
527
+ configGpuTypes.some((type) => podGpuType.includes(type) || type.includes(podGpuType))) {
528
+ isCompatible = true;
529
+ if (configGpuCount === 1) {
530
+ compatibleConfig = `1x ${podGpuType}`;
531
+ }
532
+ else {
533
+ compatibleConfig = `${configGpuCount}x ${podGpuType}`;
534
+ }
535
+ minNotes = config.notes || modelInfo.notes;
536
+ break;
537
+ }
538
+ }
539
+ }
540
+ }
541
+ }
542
+ const modelEntry = {
543
+ id: modelId,
544
+ name: modelInfo.name,
545
+ notes: minNotes,
546
+ };
547
+ if (activePod && isCompatible) {
548
+ if (!compatible[family]) {
549
+ compatible[family] = [];
550
+ }
551
+ compatible[family].push({ ...modelEntry, config: compatibleConfig });
552
+ }
553
+ else {
554
+ if (!incompatible[family]) {
555
+ incompatible[family] = [];
556
+ }
557
+ incompatible[family].push({ ...modelEntry, minGpu });
558
+ }
559
+ }
560
+ // Display compatible models first
561
+ if (activePod && Object.keys(compatible).length > 0) {
562
+ console.log(chalk.green.bold("✓ Compatible Models:\n"));
563
+ const sortedFamilies = Object.keys(compatible).sort();
564
+ for (const family of sortedFamilies) {
565
+ console.log(chalk.cyan(`${family} Models:`));
566
+ const modelList = compatible[family].sort((a, b) => a.name.localeCompare(b.name));
567
+ for (const model of modelList) {
568
+ console.log(` ${chalk.green(model.id)}`);
569
+ console.log(` Name: ${model.name}`);
570
+ console.log(` Config: ${model.config}`);
571
+ if (model.notes) {
572
+ console.log(chalk.gray(` Note: ${model.notes}`));
573
+ }
574
+ console.log("");
575
+ }
576
+ }
577
+ }
578
+ // Display incompatible models
579
+ if (Object.keys(incompatible).length > 0) {
580
+ if (activePod && Object.keys(compatible).length > 0) {
581
+ console.log(chalk.red.bold("✗ Incompatible Models (need more/different GPUs):\n"));
582
+ }
583
+ const sortedFamilies = Object.keys(incompatible).sort();
584
+ for (const family of sortedFamilies) {
585
+ if (!activePod) {
586
+ console.log(chalk.cyan(`${family} Models:`));
587
+ }
588
+ else {
589
+ console.log(chalk.gray(`${family} Models:`));
590
+ }
591
+ const modelList = incompatible[family].sort((a, b) => a.name.localeCompare(b.name));
592
+ for (const model of modelList) {
593
+ const color = activePod ? chalk.gray : chalk.green;
594
+ console.log(` ${color(model.id)}`);
595
+ console.log(chalk.gray(` Name: ${model.name}`));
596
+ console.log(chalk.gray(` Min Hardware: ${model.minGpu}`));
597
+ if (model.notes && !activePod) {
598
+ console.log(chalk.gray(` Note: ${model.notes}`));
599
+ }
600
+ if (activePod) {
601
+ console.log(""); // Less verbose for incompatible models when filtered
602
+ }
603
+ else {
604
+ console.log("");
605
+ }
606
+ }
607
+ }
608
+ }
609
+ console.log(chalk.gray("\nFor unknown models, defaults to single GPU deployment."));
610
+ console.log(chalk.gray("Use --vllm to pass custom arguments to vLLM."));
611
+ };
612
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"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"}