@mariozechner/pi 0.5.43 → 0.5.44
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/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/models.js +2 -2
- package/dist/commands/models.js.map +1 -1
- package/dist/commands/pods.js +1 -1
- package/dist/commands/pods.js.map +1 -1
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -257,7 +257,7 @@ try {
|
|
|
257
257
|
i++;
|
|
258
258
|
}
|
|
259
259
|
else if (args[i] === "--gpus" && i + 1 < args.length) {
|
|
260
|
-
gpus = parseInt(args[i + 1]);
|
|
260
|
+
gpus = parseInt(args[i + 1], 10);
|
|
261
261
|
if (Number.isNaN(gpus) || gpus < 1) {
|
|
262
262
|
console.error(chalk.red("--gpus must be a positive number"));
|
|
263
263
|
process.exit(1);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport chalk from \"chalk\";\nimport { spawn } from \"child_process\";\nimport { readFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { listModels, startModel, stopModel, viewLogs } from \"./commands/models.js\";\nimport { listPods, removePodCommand, setupPod, switchActivePod } from \"./commands/pods.js\";\nimport { promptModel } from \"./commands/prompt.js\";\nimport { getActivePod, loadConfig } from \"./config.js\";\nimport { sshExecStream } from \"./ssh.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst packageJson = JSON.parse(readFileSync(join(__dirname, \"../package.json\"), \"utf-8\"));\n\nfunction printHelp() {\n\tconsole.log(`pi v${packageJson.version} - Manage vLLM deployments on GPU pods\n\nPod Management:\n pi pods setup <name> \"<ssh>\" --mount \"<mount>\" Setup pod with mount command\n Options:\n --vllm release Install latest vLLM release >=0.10.0 (default)\n --vllm nightly Install vLLM nightly build (latest features)\n --vllm gpt-oss Install vLLM 0.10.1+gptoss with PyTorch nightly (GPT-OSS only)\n pi pods List all pods (* = active)\n pi pods active <name> Switch active pod\n pi pods remove <name> Remove pod from local config\n pi shell [<name>] Open shell on pod (active or specified)\n pi ssh [<name>] \"<command>\" Run SSH command on pod\n\nModel Management:\n pi start <model> --name <name> [options] Start a model\n --memory <percent> GPU memory allocation (30%, 50%, 90%)\n --context <size> Context window (4k, 8k, 16k, 32k, 64k, 128k)\n --gpus <count> Number of GPUs to use (predefined models only)\n --vllm <args...> Pass remaining args to vLLM (ignores other options)\n pi stop [<name>] Stop model (or all if no name)\n pi list List running models\n pi logs <name> Stream model logs\n pi agent <name> [\"<message>\"...] [options] Chat with model using agent & tools\n pi agent <name> [options] Interactive chat mode\n --continue, -c Continue previous session\n --json Output as JSONL\n (All pi-agent options are supported)\n\n All model commands support --pod <name> to override the active pod.\n\nEnvironment:\n HF_TOKEN HuggingFace token for model downloads\n PI_API_KEY API key for vLLM endpoints\n PI_CONFIG_DIR Config directory (default: ~/.pi)`);\n}\n\n// Parse command line arguments\nconst args = process.argv.slice(2);\n\nif (args.length === 0 || args[0] === \"--help\" || args[0] === \"-h\") {\n\tprintHelp();\n\tprocess.exit(0);\n}\n\nif (args[0] === \"--version\" || args[0] === \"-v\") {\n\tconsole.log(packageJson.version);\n\tprocess.exit(0);\n}\n\nconst command = args[0];\nconst subcommand = args[1];\n\n// Main command handler\ntry {\n\t// Handle \"pi pods\" commands\n\tif (command === \"pods\") {\n\t\tif (!subcommand) {\n\t\t\t// pi pods - list all pods\n\t\t\tlistPods();\n\t\t} else if (subcommand === \"setup\") {\n\t\t\t// pi pods setup <name> \"<ssh>\" [--mount \"<mount>\"] [--models-path <path>] [--vllm release|nightly|gpt-oss]\n\t\t\tconst name = args[2];\n\t\t\tconst sshCmd = args[3];\n\n\t\t\tif (!name || !sshCmd) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'Usage: pi pods setup <name> \"<ssh>\" [--mount \"<mount>\"] [--models-path <path>] [--vllm release|nightly|gpt-oss]',\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\t// Parse options\n\t\t\tconst options: { mount?: string; modelsPath?: string; vllm?: \"release\" | \"nightly\" | \"gpt-oss\" } = {};\n\t\t\tfor (let i = 4; i < args.length; i++) {\n\t\t\t\tif (args[i] === \"--mount\" && i + 1 < args.length) {\n\t\t\t\t\toptions.mount = args[i + 1];\n\t\t\t\t\ti++;\n\t\t\t\t} else if (args[i] === \"--models-path\" && i + 1 < args.length) {\n\t\t\t\t\toptions.modelsPath = args[i + 1];\n\t\t\t\t\ti++;\n\t\t\t\t} else if (args[i] === \"--vllm\" && i + 1 < args.length) {\n\t\t\t\t\tconst vllmType = args[i + 1];\n\t\t\t\t\tif (vllmType === \"release\" || vllmType === \"nightly\" || vllmType === \"gpt-oss\") {\n\t\t\t\t\t\toptions.vllm = vllmType;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error(chalk.red(`Invalid vLLM type: ${vllmType}`));\n\t\t\t\t\t\tconsole.error(\"Valid options: release, nightly, gpt-oss\");\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If --mount provided but no --models-path, try to extract path from mount command\n\t\t\tif (options.mount && !options.modelsPath) {\n\t\t\t\t// Extract last part of mount command as models path\n\t\t\t\tconst parts = options.mount.trim().split(\" \");\n\t\t\t\tconst lastPart = parts[parts.length - 1];\n\t\t\t\tif (lastPart?.startsWith(\"/\")) {\n\t\t\t\t\toptions.modelsPath = lastPart;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait setupPod(name, sshCmd, options);\n\t\t} else if (subcommand === \"active\") {\n\t\t\t// pi pods active <name>\n\t\t\tconst name = args[2];\n\t\t\tif (!name) {\n\t\t\t\tconsole.error(\"Usage: pi pods active <name>\");\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tswitchActivePod(name);\n\t\t} else if (subcommand === \"remove\") {\n\t\t\t// pi pods remove <name>\n\t\t\tconst name = args[2];\n\t\t\tif (!name) {\n\t\t\t\tconsole.error(\"Usage: pi pods remove <name>\");\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tremovePodCommand(name);\n\t\t} else {\n\t\t\tconsole.error(`Unknown pods subcommand: ${subcommand}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t} else {\n\t\t// Parse --pod override for model commands\n\t\tlet podOverride: string | undefined;\n\t\tconst podIndex = args.indexOf(\"--pod\");\n\t\tif (podIndex !== -1 && podIndex + 1 < args.length) {\n\t\t\tpodOverride = args[podIndex + 1];\n\t\t\t// Remove --pod and its value from args\n\t\t\targs.splice(podIndex, 2);\n\t\t}\n\n\t\t// Handle SSH/shell commands and model commands\n\t\tswitch (command) {\n\t\t\tcase \"shell\": {\n\t\t\t\t// pi shell [<name>] - open interactive shell\n\t\t\t\tconst podName = args[1];\n\t\t\t\tlet podInfo: { name: string; pod: import(\"./types.js\").Pod } | null = null;\n\n\t\t\t\tif (podName) {\n\t\t\t\t\tconst config = loadConfig();\n\t\t\t\t\tconst pod = config.pods[podName];\n\t\t\t\t\tif (pod) {\n\t\t\t\t\t\tpodInfo = { name: podName, pod };\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tpodInfo = getActivePod();\n\t\t\t\t}\n\n\t\t\t\tif (!podInfo) {\n\t\t\t\t\tif (podName) {\n\t\t\t\t\t\tconsole.error(chalk.red(`Pod '${podName}' not found`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error(chalk.red(\"No active pod. Use 'pi pods active <name>' to set one.\"));\n\t\t\t\t\t}\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\n\t\t\t\tconsole.log(chalk.green(`Connecting to pod '${podInfo.name}'...`));\n\n\t\t\t\t// Execute SSH in interactive mode\n\t\t\t\tconst sshArgs = podInfo.pod.ssh.split(\" \").slice(1); // Remove 'ssh' from command\n\t\t\t\tconst sshProcess = spawn(\"ssh\", sshArgs, {\n\t\t\t\t\tstdio: \"inherit\",\n\t\t\t\t\tenv: process.env,\n\t\t\t\t});\n\n\t\t\t\tsshProcess.on(\"exit\", (code) => {\n\t\t\t\t\tprocess.exit(code || 0);\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"ssh\": {\n\t\t\t\t// pi ssh [<name>] \"<command>\" - run command via SSH\n\t\t\t\tlet podName: string | undefined;\n\t\t\t\tlet sshCommand: string;\n\n\t\t\t\tif (args.length === 2) {\n\t\t\t\t\t// pi ssh \"<command>\" - use active pod\n\t\t\t\t\tsshCommand = args[1];\n\t\t\t\t} else if (args.length === 3) {\n\t\t\t\t\t// pi ssh <name> \"<command>\"\n\t\t\t\t\tpodName = args[1];\n\t\t\t\t\tsshCommand = args[2];\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('Usage: pi ssh [<name>] \"<command>\"');\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\n\t\t\t\tlet podInfo: { name: string; pod: import(\"./types.js\").Pod } | null = null;\n\n\t\t\t\tif (podName) {\n\t\t\t\t\tconst config = loadConfig();\n\t\t\t\t\tconst pod = config.pods[podName];\n\t\t\t\t\tif (pod) {\n\t\t\t\t\t\tpodInfo = { name: podName, pod };\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tpodInfo = getActivePod();\n\t\t\t\t}\n\n\t\t\t\tif (!podInfo) {\n\t\t\t\t\tif (podName) {\n\t\t\t\t\t\tconsole.error(chalk.red(`Pod '${podName}' not found`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error(chalk.red(\"No active pod. Use 'pi pods active <name>' to set one.\"));\n\t\t\t\t\t}\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\n\t\t\t\tconsole.log(chalk.gray(`Running on pod '${podInfo.name}': ${sshCommand}`));\n\n\t\t\t\t// Execute command and stream output\n\t\t\t\tconst exitCode = await sshExecStream(podInfo.pod.ssh, sshCommand);\n\t\t\t\tprocess.exit(exitCode);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"start\": {\n\t\t\t\t// pi start <model> --name <name> [options]\n\t\t\t\tconst modelId = args[1];\n\t\t\t\tif (!modelId) {\n\t\t\t\t\t// Show available models\n\t\t\t\t\tconst { showKnownModels } = await import(\"./commands/models.js\");\n\t\t\t\t\tawait showKnownModels();\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\n\t\t\t\t// Parse options\n\t\t\t\tlet name: string | undefined;\n\t\t\t\tlet memory: string | undefined;\n\t\t\t\tlet context: string | undefined;\n\t\t\t\tlet gpus: number | undefined;\n\t\t\t\tconst vllmArgs: string[] = [];\n\t\t\t\tlet inVllmArgs = false;\n\n\t\t\t\tfor (let i = 2; i < args.length; i++) {\n\t\t\t\t\tif (inVllmArgs) {\n\t\t\t\t\t\tvllmArgs.push(args[i]);\n\t\t\t\t\t} else if (args[i] === \"--name\" && i + 1 < args.length) {\n\t\t\t\t\t\tname = args[i + 1];\n\t\t\t\t\t\ti++;\n\t\t\t\t\t} else if (args[i] === \"--memory\" && i + 1 < args.length) {\n\t\t\t\t\t\tmemory = args[i + 1];\n\t\t\t\t\t\ti++;\n\t\t\t\t\t} else if (args[i] === \"--context\" && i + 1 < args.length) {\n\t\t\t\t\t\tcontext = args[i + 1];\n\t\t\t\t\t\ti++;\n\t\t\t\t\t} else if (args[i] === \"--gpus\" && i + 1 < args.length) {\n\t\t\t\t\t\tgpus = parseInt(args[i + 1]);\n\t\t\t\t\t\tif (Number.isNaN(gpus) || gpus < 1) {\n\t\t\t\t\t\t\tconsole.error(chalk.red(\"--gpus must be a positive number\"));\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti++;\n\t\t\t\t\t} else if (args[i] === \"--vllm\") {\n\t\t\t\t\t\tinVllmArgs = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!name) {\n\t\t\t\t\tconsole.error(\"--name is required\");\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\n\t\t\t\t// Warn if --vllm is used with other parameters\n\t\t\t\tif (vllmArgs.length > 0 && (memory || context || gpus)) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.yellow(\"⚠ Warning: --memory, --context, and --gpus are ignored when --vllm is specified\"),\n\t\t\t\t\t);\n\t\t\t\t\tconsole.log(chalk.yellow(\" Using only custom vLLM arguments\"));\n\t\t\t\t\tconsole.log(\"\");\n\t\t\t\t}\n\n\t\t\t\tawait startModel(modelId, name, {\n\t\t\t\t\tpod: podOverride,\n\t\t\t\t\tmemory,\n\t\t\t\t\tcontext,\n\t\t\t\t\tgpus,\n\t\t\t\t\tvllmArgs: vllmArgs.length > 0 ? vllmArgs : undefined,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"stop\": {\n\t\t\t\t// pi stop [name] - stop specific model or all models\n\t\t\t\tconst name = args[1];\n\t\t\t\tif (!name) {\n\t\t\t\t\t// Stop all models on the active pod\n\t\t\t\t\tconst { stopAllModels } = await import(\"./commands/models.js\");\n\t\t\t\t\tawait stopAllModels({ pod: podOverride });\n\t\t\t\t} else {\n\t\t\t\t\tawait stopModel(name, { pod: podOverride });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"list\":\n\t\t\t\t// pi list\n\t\t\t\tawait listModels({ pod: podOverride });\n\t\t\t\tbreak;\n\t\t\tcase \"logs\": {\n\t\t\t\t// pi logs <name>\n\t\t\t\tconst name = args[1];\n\t\t\t\tif (!name) {\n\t\t\t\t\tconsole.error(\"Usage: pi logs <name>\");\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tawait viewLogs(name, { pod: podOverride });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"agent\": {\n\t\t\t\t// pi agent <name> [messages...] [options]\n\t\t\t\tconst name = args[1];\n\t\t\t\tif (!name) {\n\t\t\t\t\tconsole.error(\"Usage: pi agent <name> [messages...] [options]\");\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\n\t\t\t\tconst apiKey = process.env.PI_API_KEY;\n\n\t\t\t\t// Pass all args after the model name\n\t\t\t\tconst agentArgs = args.slice(2);\n\n\t\t\t\t// If no messages provided, it's interactive mode\n\t\t\t\tawait promptModel(name, agentArgs, {\n\t\t\t\t\tpod: podOverride,\n\t\t\t\t\tapiKey,\n\t\t\t\t}).catch(() => {\n\t\t\t\t\t// Error already handled in promptModel, just exit cleanly\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tconsole.error(`Unknown command: ${command}`);\n\t\t\t\tprintHelp();\n\t\t\t\tprocess.exit(1);\n\t\t}\n\t}\n} catch (error) {\n\tconsole.error(\"Error:\", error);\n\tprocess.exit(1);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport chalk from \"chalk\";\nimport { spawn } from \"child_process\";\nimport { readFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { listModels, startModel, stopModel, viewLogs } from \"./commands/models.js\";\nimport { listPods, removePodCommand, setupPod, switchActivePod } from \"./commands/pods.js\";\nimport { promptModel } from \"./commands/prompt.js\";\nimport { getActivePod, loadConfig } from \"./config.js\";\nimport { sshExecStream } from \"./ssh.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst packageJson = JSON.parse(readFileSync(join(__dirname, \"../package.json\"), \"utf-8\"));\n\nfunction printHelp() {\n\tconsole.log(`pi v${packageJson.version} - Manage vLLM deployments on GPU pods\n\nPod Management:\n pi pods setup <name> \"<ssh>\" --mount \"<mount>\" Setup pod with mount command\n Options:\n --vllm release Install latest vLLM release >=0.10.0 (default)\n --vllm nightly Install vLLM nightly build (latest features)\n --vllm gpt-oss Install vLLM 0.10.1+gptoss with PyTorch nightly (GPT-OSS only)\n pi pods List all pods (* = active)\n pi pods active <name> Switch active pod\n pi pods remove <name> Remove pod from local config\n pi shell [<name>] Open shell on pod (active or specified)\n pi ssh [<name>] \"<command>\" Run SSH command on pod\n\nModel Management:\n pi start <model> --name <name> [options] Start a model\n --memory <percent> GPU memory allocation (30%, 50%, 90%)\n --context <size> Context window (4k, 8k, 16k, 32k, 64k, 128k)\n --gpus <count> Number of GPUs to use (predefined models only)\n --vllm <args...> Pass remaining args to vLLM (ignores other options)\n pi stop [<name>] Stop model (or all if no name)\n pi list List running models\n pi logs <name> Stream model logs\n pi agent <name> [\"<message>\"...] [options] Chat with model using agent & tools\n pi agent <name> [options] Interactive chat mode\n --continue, -c Continue previous session\n --json Output as JSONL\n (All pi-agent options are supported)\n\n All model commands support --pod <name> to override the active pod.\n\nEnvironment:\n HF_TOKEN HuggingFace token for model downloads\n PI_API_KEY API key for vLLM endpoints\n PI_CONFIG_DIR Config directory (default: ~/.pi)`);\n}\n\n// Parse command line arguments\nconst args = process.argv.slice(2);\n\nif (args.length === 0 || args[0] === \"--help\" || args[0] === \"-h\") {\n\tprintHelp();\n\tprocess.exit(0);\n}\n\nif (args[0] === \"--version\" || args[0] === \"-v\") {\n\tconsole.log(packageJson.version);\n\tprocess.exit(0);\n}\n\nconst command = args[0];\nconst subcommand = args[1];\n\n// Main command handler\ntry {\n\t// Handle \"pi pods\" commands\n\tif (command === \"pods\") {\n\t\tif (!subcommand) {\n\t\t\t// pi pods - list all pods\n\t\t\tlistPods();\n\t\t} else if (subcommand === \"setup\") {\n\t\t\t// pi pods setup <name> \"<ssh>\" [--mount \"<mount>\"] [--models-path <path>] [--vllm release|nightly|gpt-oss]\n\t\t\tconst name = args[2];\n\t\t\tconst sshCmd = args[3];\n\n\t\t\tif (!name || !sshCmd) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'Usage: pi pods setup <name> \"<ssh>\" [--mount \"<mount>\"] [--models-path <path>] [--vllm release|nightly|gpt-oss]',\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\t// Parse options\n\t\t\tconst options: { mount?: string; modelsPath?: string; vllm?: \"release\" | \"nightly\" | \"gpt-oss\" } = {};\n\t\t\tfor (let i = 4; i < args.length; i++) {\n\t\t\t\tif (args[i] === \"--mount\" && i + 1 < args.length) {\n\t\t\t\t\toptions.mount = args[i + 1];\n\t\t\t\t\ti++;\n\t\t\t\t} else if (args[i] === \"--models-path\" && i + 1 < args.length) {\n\t\t\t\t\toptions.modelsPath = args[i + 1];\n\t\t\t\t\ti++;\n\t\t\t\t} else if (args[i] === \"--vllm\" && i + 1 < args.length) {\n\t\t\t\t\tconst vllmType = args[i + 1];\n\t\t\t\t\tif (vllmType === \"release\" || vllmType === \"nightly\" || vllmType === \"gpt-oss\") {\n\t\t\t\t\t\toptions.vllm = vllmType;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error(chalk.red(`Invalid vLLM type: ${vllmType}`));\n\t\t\t\t\t\tconsole.error(\"Valid options: release, nightly, gpt-oss\");\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If --mount provided but no --models-path, try to extract path from mount command\n\t\t\tif (options.mount && !options.modelsPath) {\n\t\t\t\t// Extract last part of mount command as models path\n\t\t\t\tconst parts = options.mount.trim().split(\" \");\n\t\t\t\tconst lastPart = parts[parts.length - 1];\n\t\t\t\tif (lastPart?.startsWith(\"/\")) {\n\t\t\t\t\toptions.modelsPath = lastPart;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait setupPod(name, sshCmd, options);\n\t\t} else if (subcommand === \"active\") {\n\t\t\t// pi pods active <name>\n\t\t\tconst name = args[2];\n\t\t\tif (!name) {\n\t\t\t\tconsole.error(\"Usage: pi pods active <name>\");\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tswitchActivePod(name);\n\t\t} else if (subcommand === \"remove\") {\n\t\t\t// pi pods remove <name>\n\t\t\tconst name = args[2];\n\t\t\tif (!name) {\n\t\t\t\tconsole.error(\"Usage: pi pods remove <name>\");\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tremovePodCommand(name);\n\t\t} else {\n\t\t\tconsole.error(`Unknown pods subcommand: ${subcommand}`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t} else {\n\t\t// Parse --pod override for model commands\n\t\tlet podOverride: string | undefined;\n\t\tconst podIndex = args.indexOf(\"--pod\");\n\t\tif (podIndex !== -1 && podIndex + 1 < args.length) {\n\t\t\tpodOverride = args[podIndex + 1];\n\t\t\t// Remove --pod and its value from args\n\t\t\targs.splice(podIndex, 2);\n\t\t}\n\n\t\t// Handle SSH/shell commands and model commands\n\t\tswitch (command) {\n\t\t\tcase \"shell\": {\n\t\t\t\t// pi shell [<name>] - open interactive shell\n\t\t\t\tconst podName = args[1];\n\t\t\t\tlet podInfo: { name: string; pod: import(\"./types.js\").Pod } | null = null;\n\n\t\t\t\tif (podName) {\n\t\t\t\t\tconst config = loadConfig();\n\t\t\t\t\tconst pod = config.pods[podName];\n\t\t\t\t\tif (pod) {\n\t\t\t\t\t\tpodInfo = { name: podName, pod };\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tpodInfo = getActivePod();\n\t\t\t\t}\n\n\t\t\t\tif (!podInfo) {\n\t\t\t\t\tif (podName) {\n\t\t\t\t\t\tconsole.error(chalk.red(`Pod '${podName}' not found`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error(chalk.red(\"No active pod. Use 'pi pods active <name>' to set one.\"));\n\t\t\t\t\t}\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\n\t\t\t\tconsole.log(chalk.green(`Connecting to pod '${podInfo.name}'...`));\n\n\t\t\t\t// Execute SSH in interactive mode\n\t\t\t\tconst sshArgs = podInfo.pod.ssh.split(\" \").slice(1); // Remove 'ssh' from command\n\t\t\t\tconst sshProcess = spawn(\"ssh\", sshArgs, {\n\t\t\t\t\tstdio: \"inherit\",\n\t\t\t\t\tenv: process.env,\n\t\t\t\t});\n\n\t\t\t\tsshProcess.on(\"exit\", (code) => {\n\t\t\t\t\tprocess.exit(code || 0);\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"ssh\": {\n\t\t\t\t// pi ssh [<name>] \"<command>\" - run command via SSH\n\t\t\t\tlet podName: string | undefined;\n\t\t\t\tlet sshCommand: string;\n\n\t\t\t\tif (args.length === 2) {\n\t\t\t\t\t// pi ssh \"<command>\" - use active pod\n\t\t\t\t\tsshCommand = args[1];\n\t\t\t\t} else if (args.length === 3) {\n\t\t\t\t\t// pi ssh <name> \"<command>\"\n\t\t\t\t\tpodName = args[1];\n\t\t\t\t\tsshCommand = args[2];\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('Usage: pi ssh [<name>] \"<command>\"');\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\n\t\t\t\tlet podInfo: { name: string; pod: import(\"./types.js\").Pod } | null = null;\n\n\t\t\t\tif (podName) {\n\t\t\t\t\tconst config = loadConfig();\n\t\t\t\t\tconst pod = config.pods[podName];\n\t\t\t\t\tif (pod) {\n\t\t\t\t\t\tpodInfo = { name: podName, pod };\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tpodInfo = getActivePod();\n\t\t\t\t}\n\n\t\t\t\tif (!podInfo) {\n\t\t\t\t\tif (podName) {\n\t\t\t\t\t\tconsole.error(chalk.red(`Pod '${podName}' not found`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error(chalk.red(\"No active pod. Use 'pi pods active <name>' to set one.\"));\n\t\t\t\t\t}\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\n\t\t\t\tconsole.log(chalk.gray(`Running on pod '${podInfo.name}': ${sshCommand}`));\n\n\t\t\t\t// Execute command and stream output\n\t\t\t\tconst exitCode = await sshExecStream(podInfo.pod.ssh, sshCommand);\n\t\t\t\tprocess.exit(exitCode);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"start\": {\n\t\t\t\t// pi start <model> --name <name> [options]\n\t\t\t\tconst modelId = args[1];\n\t\t\t\tif (!modelId) {\n\t\t\t\t\t// Show available models\n\t\t\t\t\tconst { showKnownModels } = await import(\"./commands/models.js\");\n\t\t\t\t\tawait showKnownModels();\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t}\n\n\t\t\t\t// Parse options\n\t\t\t\tlet name: string | undefined;\n\t\t\t\tlet memory: string | undefined;\n\t\t\t\tlet context: string | undefined;\n\t\t\t\tlet gpus: number | undefined;\n\t\t\t\tconst vllmArgs: string[] = [];\n\t\t\t\tlet inVllmArgs = false;\n\n\t\t\t\tfor (let i = 2; i < args.length; i++) {\n\t\t\t\t\tif (inVllmArgs) {\n\t\t\t\t\t\tvllmArgs.push(args[i]);\n\t\t\t\t\t} else if (args[i] === \"--name\" && i + 1 < args.length) {\n\t\t\t\t\t\tname = args[i + 1];\n\t\t\t\t\t\ti++;\n\t\t\t\t\t} else if (args[i] === \"--memory\" && i + 1 < args.length) {\n\t\t\t\t\t\tmemory = args[i + 1];\n\t\t\t\t\t\ti++;\n\t\t\t\t\t} else if (args[i] === \"--context\" && i + 1 < args.length) {\n\t\t\t\t\t\tcontext = args[i + 1];\n\t\t\t\t\t\ti++;\n\t\t\t\t\t} else if (args[i] === \"--gpus\" && i + 1 < args.length) {\n\t\t\t\t\t\tgpus = parseInt(args[i + 1], 10);\n\t\t\t\t\t\tif (Number.isNaN(gpus) || gpus < 1) {\n\t\t\t\t\t\t\tconsole.error(chalk.red(\"--gpus must be a positive number\"));\n\t\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti++;\n\t\t\t\t\t} else if (args[i] === \"--vllm\") {\n\t\t\t\t\t\tinVllmArgs = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!name) {\n\t\t\t\t\tconsole.error(\"--name is required\");\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\n\t\t\t\t// Warn if --vllm is used with other parameters\n\t\t\t\tif (vllmArgs.length > 0 && (memory || context || gpus)) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.yellow(\"⚠ Warning: --memory, --context, and --gpus are ignored when --vllm is specified\"),\n\t\t\t\t\t);\n\t\t\t\t\tconsole.log(chalk.yellow(\" Using only custom vLLM arguments\"));\n\t\t\t\t\tconsole.log(\"\");\n\t\t\t\t}\n\n\t\t\t\tawait startModel(modelId, name, {\n\t\t\t\t\tpod: podOverride,\n\t\t\t\t\tmemory,\n\t\t\t\t\tcontext,\n\t\t\t\t\tgpus,\n\t\t\t\t\tvllmArgs: vllmArgs.length > 0 ? vllmArgs : undefined,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"stop\": {\n\t\t\t\t// pi stop [name] - stop specific model or all models\n\t\t\t\tconst name = args[1];\n\t\t\t\tif (!name) {\n\t\t\t\t\t// Stop all models on the active pod\n\t\t\t\t\tconst { stopAllModels } = await import(\"./commands/models.js\");\n\t\t\t\t\tawait stopAllModels({ pod: podOverride });\n\t\t\t\t} else {\n\t\t\t\t\tawait stopModel(name, { pod: podOverride });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"list\":\n\t\t\t\t// pi list\n\t\t\t\tawait listModels({ pod: podOverride });\n\t\t\t\tbreak;\n\t\t\tcase \"logs\": {\n\t\t\t\t// pi logs <name>\n\t\t\t\tconst name = args[1];\n\t\t\t\tif (!name) {\n\t\t\t\t\tconsole.error(\"Usage: pi logs <name>\");\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t\tawait viewLogs(name, { pod: podOverride });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"agent\": {\n\t\t\t\t// pi agent <name> [messages...] [options]\n\t\t\t\tconst name = args[1];\n\t\t\t\tif (!name) {\n\t\t\t\t\tconsole.error(\"Usage: pi agent <name> [messages...] [options]\");\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\n\t\t\t\tconst apiKey = process.env.PI_API_KEY;\n\n\t\t\t\t// Pass all args after the model name\n\t\t\t\tconst agentArgs = args.slice(2);\n\n\t\t\t\t// If no messages provided, it's interactive mode\n\t\t\t\tawait promptModel(name, agentArgs, {\n\t\t\t\t\tpod: podOverride,\n\t\t\t\t\tapiKey,\n\t\t\t\t}).catch(() => {\n\t\t\t\t\t// Error already handled in promptModel, just exit cleanly\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tconsole.error(`Unknown command: ${command}`);\n\t\t\t\tprintHelp();\n\t\t\t\tprocess.exit(1);\n\t\t}\n\t}\n} catch (error) {\n\tconsole.error(\"Error:\", error);\n\tprocess.exit(1);\n}\n"]}
|
package/dist/commands/models.js
CHANGED
|
@@ -156,7 +156,7 @@ export const startModel = async (modelId, name, options) => {
|
|
|
156
156
|
"64k": 65536,
|
|
157
157
|
"128k": 131072,
|
|
158
158
|
};
|
|
159
|
-
const maxTokens = contextSizes[options.context.toLowerCase()] || parseInt(options.context);
|
|
159
|
+
const maxTokens = contextSizes[options.context.toLowerCase()] || parseInt(options.context, 10);
|
|
160
160
|
vllmArgs = vllmArgs.filter((arg) => !arg.includes("max-model-len"));
|
|
161
161
|
vllmArgs.push("--max-model-len", String(maxTokens));
|
|
162
162
|
}
|
|
@@ -217,7 +217,7 @@ WRAPPER
|
|
|
217
217
|
exit 0
|
|
218
218
|
`;
|
|
219
219
|
const pidResult = await sshExec(pod.ssh, startCmd);
|
|
220
|
-
const pid = parseInt(pidResult.stdout.trim());
|
|
220
|
+
const pid = parseInt(pidResult.stdout.trim(), 10);
|
|
221
221
|
if (!pid) {
|
|
222
222
|
console.error(chalk.red("Failed to start model runner"));
|
|
223
223
|
process.exit(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\nimport { spawn } from \"child_process\";\nimport { readFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { getActivePod, loadConfig, saveConfig } from \"../config.js\";\nimport { getModelConfig, getModelName, isKnownModel } from \"../model-configs.js\";\nimport { sshExec } from \"../ssh.js\";\nimport type { Pod } from \"../types.js\";\n\n/**\n * Get the pod to use (active or override)\n */\nconst getPod = (podOverride?: string): { name: string; pod: Pod } => {\n\tif (podOverride) {\n\t\tconst config = loadConfig();\n\t\tconst pod = config.pods[podOverride];\n\t\tif (!pod) {\n\t\t\tconsole.error(chalk.red(`Pod '${podOverride}' not found`));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\treturn { name: podOverride, pod };\n\t}\n\n\tconst active = getActivePod();\n\tif (!active) {\n\t\tconsole.error(chalk.red(\"No active pod. Use 'pi pods active <name>' to set one.\"));\n\t\tprocess.exit(1);\n\t}\n\treturn active;\n};\n\n/**\n * Find next available port starting from 8001\n */\nconst getNextPort = (pod: Pod): number => {\n\tconst usedPorts = Object.values(pod.models).map((m) => m.port);\n\tlet port = 8001;\n\twhile (usedPorts.includes(port)) {\n\t\tport++;\n\t}\n\treturn port;\n};\n\n/**\n * Select GPUs for model deployment (round-robin)\n */\nconst selectGPUs = (pod: Pod, count: number = 1): number[] => {\n\tif (count === pod.gpus.length) {\n\t\t// Use all GPUs\n\t\treturn pod.gpus.map((g) => g.id);\n\t}\n\n\t// Count GPU usage across all models\n\tconst gpuUsage = new Map<number, number>();\n\tfor (const gpu of pod.gpus) {\n\t\tgpuUsage.set(gpu.id, 0);\n\t}\n\n\tfor (const model of Object.values(pod.models)) {\n\t\tfor (const gpuId of model.gpu) {\n\t\t\tgpuUsage.set(gpuId, (gpuUsage.get(gpuId) || 0) + 1);\n\t\t}\n\t}\n\n\t// Sort GPUs by usage (least used first)\n\tconst sortedGPUs = Array.from(gpuUsage.entries())\n\t\t.sort((a, b) => a[1] - b[1])\n\t\t.map((entry) => entry[0]);\n\n\t// Return the least used GPUs\n\treturn sortedGPUs.slice(0, count);\n};\n\n/**\n * Start a model\n */\nexport const startModel = async (\n\tmodelId: string,\n\tname: string,\n\toptions: {\n\t\tpod?: string;\n\t\tvllmArgs?: string[];\n\t\tmemory?: string;\n\t\tcontext?: string;\n\t\tgpus?: number;\n\t},\n) => {\n\tconst { name: podName, pod } = getPod(options.pod);\n\n\t// Validation\n\tif (!pod.modelsPath) {\n\t\tconsole.error(chalk.red(\"Pod does not have a models path configured\"));\n\t\tprocess.exit(1);\n\t}\n\tif (pod.models[name]) {\n\t\tconsole.error(chalk.red(`Model '${name}' already exists on pod '${podName}'`));\n\t\tprocess.exit(1);\n\t}\n\n\tconst port = getNextPort(pod);\n\n\t// Determine GPU allocation and vLLM args\n\tlet gpus: number[] = [];\n\tlet vllmArgs: string[] = [];\n\tlet modelConfig = null;\n\n\tif (options.vllmArgs?.length) {\n\t\t// Custom args override everything\n\t\tvllmArgs = options.vllmArgs;\n\t\tconsole.log(chalk.gray(\"Using custom vLLM args, GPU allocation managed by vLLM\"));\n\t} else if (isKnownModel(modelId)) {\n\t\t// Handle --gpus parameter for known models\n\t\tif (options.gpus) {\n\t\t\t// Validate GPU count\n\t\t\tif (options.gpus > pod.gpus.length) {\n\t\t\t\tconsole.error(chalk.red(`Error: Requested ${options.gpus} GPUs but pod only has ${pod.gpus.length}`));\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\t// Try to find config for requested GPU count\n\t\t\tmodelConfig = getModelConfig(modelId, pod.gpus, options.gpus);\n\t\t\tif (modelConfig) {\n\t\t\t\tgpus = selectGPUs(pod, options.gpus);\n\t\t\t\tvllmArgs = [...(modelConfig.args || [])];\n\t\t\t} else {\n\t\t\t\tconsole.error(\n\t\t\t\t\tchalk.red(`Model '${getModelName(modelId)}' does not have a configuration for ${options.gpus} GPU(s)`),\n\t\t\t\t);\n\t\t\t\tconsole.error(chalk.yellow(\"Available configurations:\"));\n\n\t\t\t\t// Show available configurations\n\t\t\t\tfor (let gpuCount = 1; gpuCount <= pod.gpus.length; gpuCount++) {\n\t\t\t\t\tconst config = getModelConfig(modelId, pod.gpus, gpuCount);\n\t\t\t\t\tif (config) {\n\t\t\t\t\t\tconsole.error(chalk.gray(` - ${gpuCount} GPU(s)`));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t} else {\n\t\t\t// Find best config for this hardware (original behavior)\n\t\t\tfor (let gpuCount = pod.gpus.length; gpuCount >= 1; gpuCount--) {\n\t\t\t\tmodelConfig = getModelConfig(modelId, pod.gpus, gpuCount);\n\t\t\t\tif (modelConfig) {\n\t\t\t\t\tgpus = selectGPUs(pod, gpuCount);\n\t\t\t\t\tvllmArgs = [...(modelConfig.args || [])];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!modelConfig) {\n\t\t\t\tconsole.error(chalk.red(`Model '${getModelName(modelId)}' not compatible with this pod's GPUs`));\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Unknown model\n\t\tif (options.gpus) {\n\t\t\tconsole.error(chalk.red(\"Error: --gpus can only be used with predefined models\"));\n\t\t\tconsole.error(chalk.yellow(\"For custom models, use --vllm with tensor-parallel-size or similar arguments\"));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\t// Single GPU default\n\t\tgpus = selectGPUs(pod, 1);\n\t\tconsole.log(chalk.gray(\"Unknown model, defaulting to single GPU\"));\n\t}\n\n\t// Apply memory/context overrides\n\tif (!options.vllmArgs?.length) {\n\t\tif (options.memory) {\n\t\t\tconst fraction = parseFloat(options.memory.replace(\"%\", \"\")) / 100;\n\t\t\tvllmArgs = vllmArgs.filter((arg) => !arg.includes(\"gpu-memory-utilization\"));\n\t\t\tvllmArgs.push(\"--gpu-memory-utilization\", String(fraction));\n\t\t}\n\t\tif (options.context) {\n\t\t\tconst contextSizes: Record<string, number> = {\n\t\t\t\t\"4k\": 4096,\n\t\t\t\t\"8k\": 8192,\n\t\t\t\t\"16k\": 16384,\n\t\t\t\t\"32k\": 32768,\n\t\t\t\t\"64k\": 65536,\n\t\t\t\t\"128k\": 131072,\n\t\t\t};\n\t\t\tconst maxTokens = contextSizes[options.context.toLowerCase()] || parseInt(options.context);\n\t\t\tvllmArgs = vllmArgs.filter((arg) => !arg.includes(\"max-model-len\"));\n\t\t\tvllmArgs.push(\"--max-model-len\", String(maxTokens));\n\t\t}\n\t}\n\n\t// Show what we're doing\n\tconsole.log(chalk.green(`Starting model '${name}' on pod '${podName}'...`));\n\tconsole.log(`Model: ${modelId}`);\n\tconsole.log(`Port: ${port}`);\n\tconsole.log(`GPU(s): ${gpus.length ? gpus.join(\", \") : \"Managed by vLLM\"}`);\n\tif (modelConfig?.notes) console.log(chalk.yellow(`Note: ${modelConfig.notes}`));\n\tconsole.log(\"\");\n\n\t// Read and customize model_run.sh script with our values\n\tconst scriptPath = join(dirname(fileURLToPath(import.meta.url)), \"../../scripts/model_run.sh\");\n\tlet scriptContent = readFileSync(scriptPath, \"utf-8\");\n\n\t// Replace placeholders - no escaping needed, heredoc with 'EOF' is literal\n\tscriptContent = scriptContent\n\t\t.replace(\"{{MODEL_ID}}\", modelId)\n\t\t.replace(\"{{NAME}}\", name)\n\t\t.replace(\"{{PORT}}\", String(port))\n\t\t.replace(\"{{VLLM_ARGS}}\", vllmArgs.join(\" \"));\n\n\t// Upload customized script\n\tconst result = await sshExec(\n\t\tpod.ssh,\n\t\t`cat > /tmp/model_run_${name}.sh << 'EOF'\n${scriptContent}\nEOF\nchmod +x /tmp/model_run_${name}.sh`,\n\t);\n\n\t// Prepare environment\n\tconst env = [\n\t\t`HF_TOKEN='${process.env.HF_TOKEN}'`,\n\t\t`PI_API_KEY='${process.env.PI_API_KEY}'`,\n\t\t`HF_HUB_ENABLE_HF_TRANSFER=1`,\n\t\t`VLLM_NO_USAGE_STATS=1`,\n\t\t`PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True`,\n\t\t`FORCE_COLOR=1`,\n\t\t`TERM=xterm-256color`,\n\t\t...(gpus.length === 1 ? [`CUDA_VISIBLE_DEVICES=${gpus[0]}`] : []),\n\t\t...Object.entries(modelConfig?.env || {}).map(([k, v]) => `${k}='${v}'`),\n\t]\n\t\t.map((e) => `export ${e}`)\n\t\t.join(\"\\n\");\n\n\t// Start the model runner with script command for pseudo-TTY (preserves colors)\n\t// Note: We use script to preserve colors and create a log file\n\t// setsid creates a new session so it survives SSH disconnection\n\tconst startCmd = `\n\t\t${env}\n\t\tmkdir -p ~/.vllm_logs\n\t\t# Create a wrapper that monitors the script command\n\t\tcat > /tmp/model_wrapper_${name}.sh << 'WRAPPER'\n#!/bin/bash\nscript -q -f -c \"/tmp/model_run_${name}.sh\" ~/.vllm_logs/${name}.log\nexit_code=$?\necho \"Script exited with code $exit_code\" >> ~/.vllm_logs/${name}.log\nexit $exit_code\nWRAPPER\n\t\tchmod +x /tmp/model_wrapper_${name}.sh\n\t\tsetsid /tmp/model_wrapper_${name}.sh </dev/null >/dev/null 2>&1 &\n\t\techo $!\n\t\texit 0\n\t`;\n\n\tconst pidResult = await sshExec(pod.ssh, startCmd);\n\tconst pid = parseInt(pidResult.stdout.trim());\n\tif (!pid) {\n\t\tconsole.error(chalk.red(\"Failed to start model runner\"));\n\t\tprocess.exit(1);\n\t}\n\n\t// Save to config\n\tconst config = loadConfig();\n\tconfig.pods[podName].models[name] = { model: modelId, port, gpu: gpus, pid };\n\tsaveConfig(config);\n\n\tconsole.log(`Model runner started with PID: ${pid}`);\n\tconsole.log(\"Streaming logs... (waiting for startup)\\n\");\n\n\t// Small delay to ensure log file is created\n\tawait new Promise((resolve) => setTimeout(resolve, 500));\n\n\t// Stream logs with color support, watching for startup complete\n\tconst sshParts = pod.ssh.split(\" \");\n\tconst sshCommand = sshParts[0]; // \"ssh\"\n\tconst sshArgs = sshParts.slice(1); // [\"root@86.38.238.55\"]\n\tconst host = sshArgs[0].split(\"@\")[1] || \"localhost\";\n\tconst tailCmd = `tail -f ~/.vllm_logs/${name}.log`;\n\n\t// Build the full args array for spawn\n\tconst fullArgs = [...sshArgs, tailCmd];\n\n\tconst logProcess = spawn(sshCommand, fullArgs, {\n\t\tstdio: [\"inherit\", \"pipe\", \"pipe\"], // capture stdout and stderr\n\t\tenv: { ...process.env, FORCE_COLOR: \"1\" },\n\t});\n\n\tlet interrupted = false;\n\tlet startupComplete = false;\n\tlet startupFailed = false;\n\tlet failureReason = \"\";\n\n\t// Handle Ctrl+C\n\tconst sigintHandler = () => {\n\t\tinterrupted = true;\n\t\tlogProcess.kill();\n\t};\n\tprocess.on(\"SIGINT\", sigintHandler);\n\n\t// Process log output line by line\n\tconst processOutput = (data: Buffer) => {\n\t\tconst lines = data.toString().split(\"\\n\");\n\t\tfor (const line of lines) {\n\t\t\tif (line) {\n\t\t\t\tconsole.log(line); // Echo the line to console\n\n\t\t\t\t// Check for startup complete message\n\t\t\t\tif (line.includes(\"Application startup complete\")) {\n\t\t\t\t\tstartupComplete = true;\n\t\t\t\t\tlogProcess.kill(); // Stop tailing logs\n\t\t\t\t}\n\n\t\t\t\t// Check for failure indicators\n\t\t\t\tif (line.includes(\"Model runner exiting with code\") && !line.includes(\"code 0\")) {\n\t\t\t\t\tstartupFailed = true;\n\t\t\t\t\tfailureReason = \"Model runner failed to start\";\n\t\t\t\t\tlogProcess.kill();\n\t\t\t\t}\n\t\t\t\tif (line.includes(\"Script exited with code\") && !line.includes(\"code 0\")) {\n\t\t\t\t\tstartupFailed = true;\n\t\t\t\t\tfailureReason = \"Script failed to execute\";\n\t\t\t\t\tlogProcess.kill();\n\t\t\t\t}\n\t\t\t\tif (line.includes(\"torch.OutOfMemoryError\") || line.includes(\"CUDA out of memory\")) {\n\t\t\t\t\tstartupFailed = true;\n\t\t\t\t\tfailureReason = \"Out of GPU memory (OOM)\";\n\t\t\t\t\t// Don't kill immediately - let it show more error context\n\t\t\t\t}\n\t\t\t\tif (line.includes(\"RuntimeError: Engine core initialization failed\")) {\n\t\t\t\t\tstartupFailed = true;\n\t\t\t\t\tfailureReason = \"vLLM engine initialization failed\";\n\t\t\t\t\tlogProcess.kill();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tlogProcess.stdout?.on(\"data\", processOutput);\n\tlogProcess.stderr?.on(\"data\", processOutput);\n\n\tawait new Promise<void>((resolve) => logProcess.on(\"exit\", resolve));\n\tprocess.removeListener(\"SIGINT\", sigintHandler);\n\n\tif (startupFailed) {\n\t\t// Model failed to start - clean up and report error\n\t\tconsole.log(\"\\n\" + chalk.red(`✗ Model failed to start: ${failureReason}`));\n\n\t\t// Remove the failed model from config\n\t\tconst config = loadConfig();\n\t\tdelete config.pods[podName].models[name];\n\t\tsaveConfig(config);\n\n\t\tconsole.log(chalk.yellow(\"\\nModel has been removed from configuration.\"));\n\n\t\t// Provide helpful suggestions based on failure reason\n\t\tif (failureReason.includes(\"OOM\") || failureReason.includes(\"memory\")) {\n\t\t\tconsole.log(\"\\n\" + chalk.bold(\"Suggestions:\"));\n\t\t\tconsole.log(\" • Try reducing GPU memory utilization: --memory 50%\");\n\t\t\tconsole.log(\" • Use a smaller context window: --context 4k\");\n\t\t\tconsole.log(\" • Use a quantized version of the model (e.g., FP8)\");\n\t\t\tconsole.log(\" • Use more GPUs with tensor parallelism\");\n\t\t\tconsole.log(\" • Try a smaller model variant\");\n\t\t}\n\n\t\tconsole.log(\"\\n\" + chalk.cyan('Check full logs: pi ssh \"tail -100 ~/.vllm_logs/' + name + '.log\"'));\n\t\tprocess.exit(1);\n\t} else if (startupComplete) {\n\t\t// Model started successfully - output connection details\n\t\tconsole.log(\"\\n\" + chalk.green(\"✓ Model started successfully!\"));\n\t\tconsole.log(\"\\n\" + chalk.bold(\"Connection Details:\"));\n\t\tconsole.log(chalk.cyan(\"─\".repeat(50)));\n\t\tconsole.log(chalk.white(\"Base URL: \") + chalk.yellow(`http://${host}:${port}/v1`));\n\t\tconsole.log(chalk.white(\"Model: \") + chalk.yellow(modelId));\n\t\tconsole.log(chalk.white(\"API Key: \") + chalk.yellow(process.env.PI_API_KEY || \"(not set)\"));\n\t\tconsole.log(chalk.cyan(\"─\".repeat(50)));\n\n\t\tconsole.log(\"\\n\" + chalk.bold(\"Export for shell:\"));\n\t\tconsole.log(chalk.gray(`export OPENAI_BASE_URL=\"http://${host}:${port}/v1\"`));\n\t\tconsole.log(chalk.gray(`export OPENAI_API_KEY=\"${process.env.PI_API_KEY || \"your-api-key\"}\"`));\n\t\tconsole.log(chalk.gray(`export OPENAI_MODEL=\"${modelId}\"`));\n\n\t\tconsole.log(\"\\n\" + chalk.bold(\"Example usage:\"));\n\t\tconsole.log(\n\t\t\tchalk.gray(`\n # Python\n from openai import OpenAI\n client = OpenAI() # Uses env vars\n response = client.chat.completions.create(\n model=\"${modelId}\",\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n )\n\n # CLI\n curl $OPENAI_BASE_URL/chat/completions \\\\\n -H \"Authorization: Bearer $OPENAI_API_KEY\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '{\"model\":\"${modelId}\",\"messages\":[{\"role\":\"user\",\"content\":\"Hi\"}]}'`),\n\t\t);\n\t\tconsole.log(\"\");\n\t\tconsole.log(chalk.cyan(`Chat with model: pi agent ${name} \"Your message\"`));\n\t\tconsole.log(chalk.cyan(`Interactive mode: pi agent ${name} -i`));\n\t\tconsole.log(chalk.cyan(`Monitor logs: pi logs ${name}`));\n\t\tconsole.log(chalk.cyan(`Stop model: pi stop ${name}`));\n\t} else if (interrupted) {\n\t\tconsole.log(chalk.yellow(\"\\n\\nStopped monitoring. Model deployment continues in background.\"));\n\t\tconsole.log(chalk.cyan(`Chat with model: pi agent ${name} \"Your message\"`));\n\t\tconsole.log(chalk.cyan(`Check status: pi logs ${name}`));\n\t\tconsole.log(chalk.cyan(`Stop model: pi stop ${name}`));\n\t} else {\n\t\tconsole.log(chalk.yellow(\"\\n\\nLog stream ended. Model may still be running.\"));\n\t\tconsole.log(chalk.cyan(`Chat with model: pi agent ${name} \"Your message\"`));\n\t\tconsole.log(chalk.cyan(`Check status: pi logs ${name}`));\n\t\tconsole.log(chalk.cyan(`Stop model: pi stop ${name}`));\n\t}\n};\n\n/**\n * Stop a model\n */\nexport const stopModel = async (name: string, options: { pod?: string }) => {\n\tconst { name: podName, pod } = getPod(options.pod);\n\n\tconst model = pod.models[name];\n\tif (!model) {\n\t\tconsole.error(chalk.red(`Model '${name}' not found on pod '${podName}'`));\n\t\tprocess.exit(1);\n\t}\n\n\tconsole.log(chalk.yellow(`Stopping model '${name}' on pod '${podName}'...`));\n\n\t// Kill the script process and all its children\n\t// Using pkill to kill the process and all children\n\tconst killCmd = `\n\t\t# Kill the script process and all its children\n\t\tpkill -TERM -P ${model.pid} 2>/dev/null || true\n\t\tkill ${model.pid} 2>/dev/null || true\n\t`;\n\tawait sshExec(pod.ssh, killCmd);\n\n\t// Remove from config\n\tconst config = loadConfig();\n\tdelete config.pods[podName].models[name];\n\tsaveConfig(config);\n\n\tconsole.log(chalk.green(`✓ Model '${name}' stopped`));\n};\n\n/**\n * Stop all models on a pod\n */\nexport const stopAllModels = async (options: { pod?: string }) => {\n\tconst { name: podName, pod } = getPod(options.pod);\n\n\tconst modelNames = Object.keys(pod.models);\n\tif (modelNames.length === 0) {\n\t\tconsole.log(`No models running on pod '${podName}'`);\n\t\treturn;\n\t}\n\n\tconsole.log(chalk.yellow(`Stopping ${modelNames.length} model(s) on pod '${podName}'...`));\n\n\t// Kill all script processes and their children\n\tconst pids = Object.values(pod.models).map((m) => m.pid);\n\tconst killCmd = `\n\t\tfor PID in ${pids.join(\" \")}; do\n\t\t\tpkill -TERM -P $PID 2>/dev/null || true\n\t\t\tkill $PID 2>/dev/null || true\n\t\tdone\n\t`;\n\tawait sshExec(pod.ssh, killCmd);\n\n\t// Clear all models from config\n\tconst config = loadConfig();\n\tconfig.pods[podName].models = {};\n\tsaveConfig(config);\n\n\tconsole.log(chalk.green(`✓ Stopped all models: ${modelNames.join(\", \")}`));\n};\n\n/**\n * List all models\n */\nexport const listModels = async (options: { pod?: string }) => {\n\tconst { name: podName, pod } = getPod(options.pod);\n\n\tconst modelNames = Object.keys(pod.models);\n\tif (modelNames.length === 0) {\n\t\tconsole.log(`No models running on pod '${podName}'`);\n\t\treturn;\n\t}\n\n\t// Get pod SSH host for URL display\n\tconst sshParts = pod.ssh.split(\" \");\n\tconst host = sshParts.find((p) => p.includes(\"@\"))?.split(\"@\")[1] || \"unknown\";\n\n\tconsole.log(`Models on pod '${chalk.bold(podName)}':`);\n\tfor (const name of modelNames) {\n\t\tconst model = pod.models[name];\n\t\tconst gpuStr =\n\t\t\tmodel.gpu.length > 1\n\t\t\t\t? `GPUs ${model.gpu.join(\",\")}`\n\t\t\t\t: model.gpu.length === 1\n\t\t\t\t\t? `GPU ${model.gpu[0]}`\n\t\t\t\t\t: \"GPU unknown\";\n\t\tconsole.log(` ${chalk.green(name)} - Port ${model.port} - ${gpuStr} - PID ${model.pid}`);\n\t\tconsole.log(` Model: ${chalk.gray(model.model)}`);\n\t\tconsole.log(` URL: ${chalk.cyan(`http://${host}:${model.port}/v1`)}`);\n\t}\n\n\t// Optionally verify processes are still running\n\tconsole.log(\"\");\n\tconsole.log(\"Verifying processes...\");\n\tlet anyDead = false;\n\tfor (const name of modelNames) {\n\t\tconst model = pod.models[name];\n\t\t// Check both the wrapper process and if vLLM is responding\n\t\tconst checkCmd = `\n\t\t\t# Check if wrapper process exists\n\t\t\tif ps -p ${model.pid} > /dev/null 2>&1; then\n\t\t\t\t# Process exists, now check if vLLM is responding\n\t\t\t\tif curl -s -f http://localhost:${model.port}/health > /dev/null 2>&1; then\n\t\t\t\t\techo \"running\"\n\t\t\t\telse\n\t\t\t\t\t# Check if it's still starting up\n\t\t\t\t\tif tail -n 20 ~/.vllm_logs/${name}.log 2>/dev/null | grep -q \"ERROR\\\\|Failed\\\\|Cuda error\\\\|died\"; then\n\t\t\t\t\t\techo \"crashed\"\n\t\t\t\t\telse\n\t\t\t\t\t\techo \"starting\"\n\t\t\t\t\tfi\n\t\t\t\tfi\n\t\t\telse\n\t\t\t\techo \"dead\"\n\t\t\tfi\n\t\t`;\n\t\tconst result = await sshExec(pod.ssh, checkCmd);\n\t\tconst status = result.stdout.trim();\n\t\tif (status === \"dead\") {\n\t\t\tconsole.log(chalk.red(` ${name}: Process ${model.pid} is not running`));\n\t\t\tanyDead = true;\n\t\t} else if (status === \"crashed\") {\n\t\t\tconsole.log(chalk.red(` ${name}: vLLM crashed (check logs with 'pi logs ${name}')`));\n\t\t\tanyDead = true;\n\t\t} else if (status === \"starting\") {\n\t\t\tconsole.log(chalk.yellow(` ${name}: Still starting up...`));\n\t\t}\n\t}\n\n\tif (anyDead) {\n\t\tconsole.log(\"\");\n\t\tconsole.log(chalk.yellow(\"Some models are not running. Clean up with:\"));\n\t\tconsole.log(chalk.cyan(\" pi stop <name>\"));\n\t} else {\n\t\tconsole.log(chalk.green(\"✓ All processes verified\"));\n\t}\n};\n\n/**\n * View model logs\n */\nexport const viewLogs = async (name: string, options: { pod?: string }) => {\n\tconst { name: podName, pod } = getPod(options.pod);\n\n\tconst model = pod.models[name];\n\tif (!model) {\n\t\tconsole.error(chalk.red(`Model '${name}' not found on pod '${podName}'`));\n\t\tprocess.exit(1);\n\t}\n\n\tconsole.log(chalk.green(`Streaming logs for '${name}' on pod '${podName}'...`));\n\tconsole.log(chalk.gray(\"Press Ctrl+C to stop\"));\n\tconsole.log(\"\");\n\n\t// Stream logs with color preservation\n\tconst sshParts = pod.ssh.split(\" \");\n\tconst sshCommand = sshParts[0]; // \"ssh\"\n\tconst sshArgs = sshParts.slice(1); // [\"root@86.38.238.55\"]\n\tconst tailCmd = `tail -f ~/.vllm_logs/${name}.log`;\n\n\tconst logProcess = spawn(sshCommand, [...sshArgs, tailCmd], {\n\t\tstdio: \"inherit\",\n\t\tenv: {\n\t\t\t...process.env,\n\t\t\tFORCE_COLOR: \"1\",\n\t\t},\n\t});\n\n\t// Wait for process to exit\n\tawait new Promise<void>((resolve) => {\n\t\tlogProcess.on(\"exit\", () => resolve());\n\t});\n};\n\n/**\n * Show known models and their hardware requirements\n */\nexport const showKnownModels = async () => {\n\tconst __filename = fileURLToPath(import.meta.url);\n\tconst __dirname = dirname(__filename);\n\tconst modelsJsonPath = join(__dirname, \"..\", \"models.json\");\n\tconst modelsJson = JSON.parse(readFileSync(modelsJsonPath, \"utf-8\"));\n\tconst models = modelsJson.models;\n\n\t// Get active pod info if available\n\tconst activePod = getActivePod();\n\tlet podGpuCount = 0;\n\tlet podGpuType = \"\";\n\n\tif (activePod) {\n\t\tpodGpuCount = activePod.pod.gpus.length;\n\t\t// Extract GPU type from name (e.g., \"NVIDIA H200\" -> \"H200\")\n\t\tpodGpuType = activePod.pod.gpus[0]?.name?.replace(\"NVIDIA\", \"\")?.trim()?.split(\" \")[0] || \"\";\n\n\t\tconsole.log(chalk.bold(`Known Models for ${activePod.name} (${podGpuCount}x ${podGpuType || \"GPU\"}):\\n`));\n\t} else {\n\t\tconsole.log(chalk.bold(\"Known Models:\\n\"));\n\t\tconsole.log(chalk.yellow(\"No active pod. Use 'pi pods active <name>' to filter compatible models.\\n\"));\n\t}\n\n\tconsole.log(\"Usage: pi start <model> --name <name> [options]\\n\");\n\n\t// Group models by compatibility and family\n\tconst compatible: Record<string, Array<{ id: string; name: string; config: string; notes?: string }>> = {};\n\tconst incompatible: Record<string, Array<{ id: string; name: string; minGpu: string; notes?: string }>> = {};\n\n\tfor (const [modelId, info] of Object.entries(models)) {\n\t\tconst modelInfo = info as any;\n\t\tconst family = modelInfo.name.split(\"-\")[0] || \"Other\";\n\n\t\tlet isCompatible = false;\n\t\tlet compatibleConfig = \"\";\n\t\tlet minGpu = \"Unknown\";\n\t\tlet minNotes: string | undefined;\n\n\t\tif (modelInfo.configs && modelInfo.configs.length > 0) {\n\t\t\t// Sort configs by GPU count to find minimum\n\t\t\tconst sortedConfigs = [...modelInfo.configs].sort((a: any, b: any) => (a.gpuCount || 1) - (b.gpuCount || 1));\n\n\t\t\t// Find minimum requirements\n\t\t\tconst minConfig = sortedConfigs[0];\n\t\t\tconst minGpuCount = minConfig.gpuCount || 1;\n\t\t\tconst gpuTypes = minConfig.gpuTypes?.join(\"/\") || \"H100/H200\";\n\n\t\t\tif (minGpuCount === 1) {\n\t\t\t\tminGpu = `1x ${gpuTypes}`;\n\t\t\t} else {\n\t\t\t\tminGpu = `${minGpuCount}x ${gpuTypes}`;\n\t\t\t}\n\n\t\t\tminNotes = minConfig.notes || modelInfo.notes;\n\n\t\t\t// Check compatibility with active pod\n\t\t\tif (activePod && podGpuCount > 0) {\n\t\t\t\t// Find best matching config for this pod\n\t\t\t\tfor (const config of sortedConfigs) {\n\t\t\t\t\tconst configGpuCount = config.gpuCount || 1;\n\t\t\t\t\tconst configGpuTypes = config.gpuTypes || [];\n\n\t\t\t\t\t// Check if we have enough GPUs\n\t\t\t\t\tif (configGpuCount <= podGpuCount) {\n\t\t\t\t\t\t// Check if GPU type matches (if specified)\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tconfigGpuTypes.length === 0 ||\n\t\t\t\t\t\t\tconfigGpuTypes.some((type: string) => podGpuType.includes(type) || type.includes(podGpuType))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tisCompatible = true;\n\t\t\t\t\t\t\tif (configGpuCount === 1) {\n\t\t\t\t\t\t\t\tcompatibleConfig = `1x ${podGpuType}`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcompatibleConfig = `${configGpuCount}x ${podGpuType}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tminNotes = config.notes || modelInfo.notes;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst modelEntry = {\n\t\t\tid: modelId,\n\t\t\tname: modelInfo.name,\n\t\t\tnotes: minNotes,\n\t\t};\n\n\t\tif (activePod && isCompatible) {\n\t\t\tif (!compatible[family]) {\n\t\t\t\tcompatible[family] = [];\n\t\t\t}\n\t\t\tcompatible[family].push({ ...modelEntry, config: compatibleConfig });\n\t\t} else {\n\t\t\tif (!incompatible[family]) {\n\t\t\t\tincompatible[family] = [];\n\t\t\t}\n\t\t\tincompatible[family].push({ ...modelEntry, minGpu });\n\t\t}\n\t}\n\n\t// Display compatible models first\n\tif (activePod && Object.keys(compatible).length > 0) {\n\t\tconsole.log(chalk.green.bold(\"✓ Compatible Models:\\n\"));\n\n\t\tconst sortedFamilies = Object.keys(compatible).sort();\n\t\tfor (const family of sortedFamilies) {\n\t\t\tconsole.log(chalk.cyan(`${family} Models:`));\n\n\t\t\tconst modelList = compatible[family].sort((a, b) => a.name.localeCompare(b.name));\n\n\t\t\tfor (const model of modelList) {\n\t\t\t\tconsole.log(` ${chalk.green(model.id)}`);\n\t\t\t\tconsole.log(` Name: ${model.name}`);\n\t\t\t\tconsole.log(` Config: ${model.config}`);\n\t\t\t\tif (model.notes) {\n\t\t\t\t\tconsole.log(chalk.gray(` Note: ${model.notes}`));\n\t\t\t\t}\n\t\t\t\tconsole.log(\"\");\n\t\t\t}\n\t\t}\n\t}\n\n\t// Display incompatible models\n\tif (Object.keys(incompatible).length > 0) {\n\t\tif (activePod && Object.keys(compatible).length > 0) {\n\t\t\tconsole.log(chalk.red.bold(\"✗ Incompatible Models (need more/different GPUs):\\n\"));\n\t\t}\n\n\t\tconst sortedFamilies = Object.keys(incompatible).sort();\n\t\tfor (const family of sortedFamilies) {\n\t\t\tif (!activePod) {\n\t\t\t\tconsole.log(chalk.cyan(`${family} Models:`));\n\t\t\t} else {\n\t\t\t\tconsole.log(chalk.gray(`${family} Models:`));\n\t\t\t}\n\n\t\t\tconst modelList = incompatible[family].sort((a, b) => a.name.localeCompare(b.name));\n\n\t\t\tfor (const model of modelList) {\n\t\t\t\tconst color = activePod ? chalk.gray : chalk.green;\n\t\t\t\tconsole.log(` ${color(model.id)}`);\n\t\t\t\tconsole.log(chalk.gray(` Name: ${model.name}`));\n\t\t\t\tconsole.log(chalk.gray(` Min Hardware: ${model.minGpu}`));\n\t\t\t\tif (model.notes && !activePod) {\n\t\t\t\t\tconsole.log(chalk.gray(` Note: ${model.notes}`));\n\t\t\t\t}\n\t\t\t\tif (activePod) {\n\t\t\t\t\tconsole.log(\"\"); // Less verbose for incompatible models when filtered\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(\"\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconsole.log(chalk.gray(\"\\nFor unknown models, defaults to single GPU deployment.\"));\n\tconsole.log(chalk.gray(\"Use --vllm to pass custom arguments to vLLM.\"));\n};\n"]}
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\nimport { spawn } from \"child_process\";\nimport { readFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { getActivePod, loadConfig, saveConfig } from \"../config.js\";\nimport { getModelConfig, getModelName, isKnownModel } from \"../model-configs.js\";\nimport { sshExec } from \"../ssh.js\";\nimport type { Pod } from \"../types.js\";\n\n/**\n * Get the pod to use (active or override)\n */\nconst getPod = (podOverride?: string): { name: string; pod: Pod } => {\n\tif (podOverride) {\n\t\tconst config = loadConfig();\n\t\tconst pod = config.pods[podOverride];\n\t\tif (!pod) {\n\t\t\tconsole.error(chalk.red(`Pod '${podOverride}' not found`));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\treturn { name: podOverride, pod };\n\t}\n\n\tconst active = getActivePod();\n\tif (!active) {\n\t\tconsole.error(chalk.red(\"No active pod. Use 'pi pods active <name>' to set one.\"));\n\t\tprocess.exit(1);\n\t}\n\treturn active;\n};\n\n/**\n * Find next available port starting from 8001\n */\nconst getNextPort = (pod: Pod): number => {\n\tconst usedPorts = Object.values(pod.models).map((m) => m.port);\n\tlet port = 8001;\n\twhile (usedPorts.includes(port)) {\n\t\tport++;\n\t}\n\treturn port;\n};\n\n/**\n * Select GPUs for model deployment (round-robin)\n */\nconst selectGPUs = (pod: Pod, count: number = 1): number[] => {\n\tif (count === pod.gpus.length) {\n\t\t// Use all GPUs\n\t\treturn pod.gpus.map((g) => g.id);\n\t}\n\n\t// Count GPU usage across all models\n\tconst gpuUsage = new Map<number, number>();\n\tfor (const gpu of pod.gpus) {\n\t\tgpuUsage.set(gpu.id, 0);\n\t}\n\n\tfor (const model of Object.values(pod.models)) {\n\t\tfor (const gpuId of model.gpu) {\n\t\t\tgpuUsage.set(gpuId, (gpuUsage.get(gpuId) || 0) + 1);\n\t\t}\n\t}\n\n\t// Sort GPUs by usage (least used first)\n\tconst sortedGPUs = Array.from(gpuUsage.entries())\n\t\t.sort((a, b) => a[1] - b[1])\n\t\t.map((entry) => entry[0]);\n\n\t// Return the least used GPUs\n\treturn sortedGPUs.slice(0, count);\n};\n\n/**\n * Start a model\n */\nexport const startModel = async (\n\tmodelId: string,\n\tname: string,\n\toptions: {\n\t\tpod?: string;\n\t\tvllmArgs?: string[];\n\t\tmemory?: string;\n\t\tcontext?: string;\n\t\tgpus?: number;\n\t},\n) => {\n\tconst { name: podName, pod } = getPod(options.pod);\n\n\t// Validation\n\tif (!pod.modelsPath) {\n\t\tconsole.error(chalk.red(\"Pod does not have a models path configured\"));\n\t\tprocess.exit(1);\n\t}\n\tif (pod.models[name]) {\n\t\tconsole.error(chalk.red(`Model '${name}' already exists on pod '${podName}'`));\n\t\tprocess.exit(1);\n\t}\n\n\tconst port = getNextPort(pod);\n\n\t// Determine GPU allocation and vLLM args\n\tlet gpus: number[] = [];\n\tlet vllmArgs: string[] = [];\n\tlet modelConfig = null;\n\n\tif (options.vllmArgs?.length) {\n\t\t// Custom args override everything\n\t\tvllmArgs = options.vllmArgs;\n\t\tconsole.log(chalk.gray(\"Using custom vLLM args, GPU allocation managed by vLLM\"));\n\t} else if (isKnownModel(modelId)) {\n\t\t// Handle --gpus parameter for known models\n\t\tif (options.gpus) {\n\t\t\t// Validate GPU count\n\t\t\tif (options.gpus > pod.gpus.length) {\n\t\t\t\tconsole.error(chalk.red(`Error: Requested ${options.gpus} GPUs but pod only has ${pod.gpus.length}`));\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\t// Try to find config for requested GPU count\n\t\t\tmodelConfig = getModelConfig(modelId, pod.gpus, options.gpus);\n\t\t\tif (modelConfig) {\n\t\t\t\tgpus = selectGPUs(pod, options.gpus);\n\t\t\t\tvllmArgs = [...(modelConfig.args || [])];\n\t\t\t} else {\n\t\t\t\tconsole.error(\n\t\t\t\t\tchalk.red(`Model '${getModelName(modelId)}' does not have a configuration for ${options.gpus} GPU(s)`),\n\t\t\t\t);\n\t\t\t\tconsole.error(chalk.yellow(\"Available configurations:\"));\n\n\t\t\t\t// Show available configurations\n\t\t\t\tfor (let gpuCount = 1; gpuCount <= pod.gpus.length; gpuCount++) {\n\t\t\t\t\tconst config = getModelConfig(modelId, pod.gpus, gpuCount);\n\t\t\t\t\tif (config) {\n\t\t\t\t\t\tconsole.error(chalk.gray(` - ${gpuCount} GPU(s)`));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t} else {\n\t\t\t// Find best config for this hardware (original behavior)\n\t\t\tfor (let gpuCount = pod.gpus.length; gpuCount >= 1; gpuCount--) {\n\t\t\t\tmodelConfig = getModelConfig(modelId, pod.gpus, gpuCount);\n\t\t\t\tif (modelConfig) {\n\t\t\t\t\tgpus = selectGPUs(pod, gpuCount);\n\t\t\t\t\tvllmArgs = [...(modelConfig.args || [])];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!modelConfig) {\n\t\t\t\tconsole.error(chalk.red(`Model '${getModelName(modelId)}' not compatible with this pod's GPUs`));\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Unknown model\n\t\tif (options.gpus) {\n\t\t\tconsole.error(chalk.red(\"Error: --gpus can only be used with predefined models\"));\n\t\t\tconsole.error(chalk.yellow(\"For custom models, use --vllm with tensor-parallel-size or similar arguments\"));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\t// Single GPU default\n\t\tgpus = selectGPUs(pod, 1);\n\t\tconsole.log(chalk.gray(\"Unknown model, defaulting to single GPU\"));\n\t}\n\n\t// Apply memory/context overrides\n\tif (!options.vllmArgs?.length) {\n\t\tif (options.memory) {\n\t\t\tconst fraction = parseFloat(options.memory.replace(\"%\", \"\")) / 100;\n\t\t\tvllmArgs = vllmArgs.filter((arg) => !arg.includes(\"gpu-memory-utilization\"));\n\t\t\tvllmArgs.push(\"--gpu-memory-utilization\", String(fraction));\n\t\t}\n\t\tif (options.context) {\n\t\t\tconst contextSizes: Record<string, number> = {\n\t\t\t\t\"4k\": 4096,\n\t\t\t\t\"8k\": 8192,\n\t\t\t\t\"16k\": 16384,\n\t\t\t\t\"32k\": 32768,\n\t\t\t\t\"64k\": 65536,\n\t\t\t\t\"128k\": 131072,\n\t\t\t};\n\t\t\tconst maxTokens = contextSizes[options.context.toLowerCase()] || parseInt(options.context, 10);\n\t\t\tvllmArgs = vllmArgs.filter((arg) => !arg.includes(\"max-model-len\"));\n\t\t\tvllmArgs.push(\"--max-model-len\", String(maxTokens));\n\t\t}\n\t}\n\n\t// Show what we're doing\n\tconsole.log(chalk.green(`Starting model '${name}' on pod '${podName}'...`));\n\tconsole.log(`Model: ${modelId}`);\n\tconsole.log(`Port: ${port}`);\n\tconsole.log(`GPU(s): ${gpus.length ? gpus.join(\", \") : \"Managed by vLLM\"}`);\n\tif (modelConfig?.notes) console.log(chalk.yellow(`Note: ${modelConfig.notes}`));\n\tconsole.log(\"\");\n\n\t// Read and customize model_run.sh script with our values\n\tconst scriptPath = join(dirname(fileURLToPath(import.meta.url)), \"../../scripts/model_run.sh\");\n\tlet scriptContent = readFileSync(scriptPath, \"utf-8\");\n\n\t// Replace placeholders - no escaping needed, heredoc with 'EOF' is literal\n\tscriptContent = scriptContent\n\t\t.replace(\"{{MODEL_ID}}\", modelId)\n\t\t.replace(\"{{NAME}}\", name)\n\t\t.replace(\"{{PORT}}\", String(port))\n\t\t.replace(\"{{VLLM_ARGS}}\", vllmArgs.join(\" \"));\n\n\t// Upload customized script\n\tconst result = await sshExec(\n\t\tpod.ssh,\n\t\t`cat > /tmp/model_run_${name}.sh << 'EOF'\n${scriptContent}\nEOF\nchmod +x /tmp/model_run_${name}.sh`,\n\t);\n\n\t// Prepare environment\n\tconst env = [\n\t\t`HF_TOKEN='${process.env.HF_TOKEN}'`,\n\t\t`PI_API_KEY='${process.env.PI_API_KEY}'`,\n\t\t`HF_HUB_ENABLE_HF_TRANSFER=1`,\n\t\t`VLLM_NO_USAGE_STATS=1`,\n\t\t`PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True`,\n\t\t`FORCE_COLOR=1`,\n\t\t`TERM=xterm-256color`,\n\t\t...(gpus.length === 1 ? [`CUDA_VISIBLE_DEVICES=${gpus[0]}`] : []),\n\t\t...Object.entries(modelConfig?.env || {}).map(([k, v]) => `${k}='${v}'`),\n\t]\n\t\t.map((e) => `export ${e}`)\n\t\t.join(\"\\n\");\n\n\t// Start the model runner with script command for pseudo-TTY (preserves colors)\n\t// Note: We use script to preserve colors and create a log file\n\t// setsid creates a new session so it survives SSH disconnection\n\tconst startCmd = `\n\t\t${env}\n\t\tmkdir -p ~/.vllm_logs\n\t\t# Create a wrapper that monitors the script command\n\t\tcat > /tmp/model_wrapper_${name}.sh << 'WRAPPER'\n#!/bin/bash\nscript -q -f -c \"/tmp/model_run_${name}.sh\" ~/.vllm_logs/${name}.log\nexit_code=$?\necho \"Script exited with code $exit_code\" >> ~/.vllm_logs/${name}.log\nexit $exit_code\nWRAPPER\n\t\tchmod +x /tmp/model_wrapper_${name}.sh\n\t\tsetsid /tmp/model_wrapper_${name}.sh </dev/null >/dev/null 2>&1 &\n\t\techo $!\n\t\texit 0\n\t`;\n\n\tconst pidResult = await sshExec(pod.ssh, startCmd);\n\tconst pid = parseInt(pidResult.stdout.trim(), 10);\n\tif (!pid) {\n\t\tconsole.error(chalk.red(\"Failed to start model runner\"));\n\t\tprocess.exit(1);\n\t}\n\n\t// Save to config\n\tconst config = loadConfig();\n\tconfig.pods[podName].models[name] = { model: modelId, port, gpu: gpus, pid };\n\tsaveConfig(config);\n\n\tconsole.log(`Model runner started with PID: ${pid}`);\n\tconsole.log(\"Streaming logs... (waiting for startup)\\n\");\n\n\t// Small delay to ensure log file is created\n\tawait new Promise((resolve) => setTimeout(resolve, 500));\n\n\t// Stream logs with color support, watching for startup complete\n\tconst sshParts = pod.ssh.split(\" \");\n\tconst sshCommand = sshParts[0]; // \"ssh\"\n\tconst sshArgs = sshParts.slice(1); // [\"root@86.38.238.55\"]\n\tconst host = sshArgs[0].split(\"@\")[1] || \"localhost\";\n\tconst tailCmd = `tail -f ~/.vllm_logs/${name}.log`;\n\n\t// Build the full args array for spawn\n\tconst fullArgs = [...sshArgs, tailCmd];\n\n\tconst logProcess = spawn(sshCommand, fullArgs, {\n\t\tstdio: [\"inherit\", \"pipe\", \"pipe\"], // capture stdout and stderr\n\t\tenv: { ...process.env, FORCE_COLOR: \"1\" },\n\t});\n\n\tlet interrupted = false;\n\tlet startupComplete = false;\n\tlet startupFailed = false;\n\tlet failureReason = \"\";\n\n\t// Handle Ctrl+C\n\tconst sigintHandler = () => {\n\t\tinterrupted = true;\n\t\tlogProcess.kill();\n\t};\n\tprocess.on(\"SIGINT\", sigintHandler);\n\n\t// Process log output line by line\n\tconst processOutput = (data: Buffer) => {\n\t\tconst lines = data.toString().split(\"\\n\");\n\t\tfor (const line of lines) {\n\t\t\tif (line) {\n\t\t\t\tconsole.log(line); // Echo the line to console\n\n\t\t\t\t// Check for startup complete message\n\t\t\t\tif (line.includes(\"Application startup complete\")) {\n\t\t\t\t\tstartupComplete = true;\n\t\t\t\t\tlogProcess.kill(); // Stop tailing logs\n\t\t\t\t}\n\n\t\t\t\t// Check for failure indicators\n\t\t\t\tif (line.includes(\"Model runner exiting with code\") && !line.includes(\"code 0\")) {\n\t\t\t\t\tstartupFailed = true;\n\t\t\t\t\tfailureReason = \"Model runner failed to start\";\n\t\t\t\t\tlogProcess.kill();\n\t\t\t\t}\n\t\t\t\tif (line.includes(\"Script exited with code\") && !line.includes(\"code 0\")) {\n\t\t\t\t\tstartupFailed = true;\n\t\t\t\t\tfailureReason = \"Script failed to execute\";\n\t\t\t\t\tlogProcess.kill();\n\t\t\t\t}\n\t\t\t\tif (line.includes(\"torch.OutOfMemoryError\") || line.includes(\"CUDA out of memory\")) {\n\t\t\t\t\tstartupFailed = true;\n\t\t\t\t\tfailureReason = \"Out of GPU memory (OOM)\";\n\t\t\t\t\t// Don't kill immediately - let it show more error context\n\t\t\t\t}\n\t\t\t\tif (line.includes(\"RuntimeError: Engine core initialization failed\")) {\n\t\t\t\t\tstartupFailed = true;\n\t\t\t\t\tfailureReason = \"vLLM engine initialization failed\";\n\t\t\t\t\tlogProcess.kill();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tlogProcess.stdout?.on(\"data\", processOutput);\n\tlogProcess.stderr?.on(\"data\", processOutput);\n\n\tawait new Promise<void>((resolve) => logProcess.on(\"exit\", resolve));\n\tprocess.removeListener(\"SIGINT\", sigintHandler);\n\n\tif (startupFailed) {\n\t\t// Model failed to start - clean up and report error\n\t\tconsole.log(\"\\n\" + chalk.red(`✗ Model failed to start: ${failureReason}`));\n\n\t\t// Remove the failed model from config\n\t\tconst config = loadConfig();\n\t\tdelete config.pods[podName].models[name];\n\t\tsaveConfig(config);\n\n\t\tconsole.log(chalk.yellow(\"\\nModel has been removed from configuration.\"));\n\n\t\t// Provide helpful suggestions based on failure reason\n\t\tif (failureReason.includes(\"OOM\") || failureReason.includes(\"memory\")) {\n\t\t\tconsole.log(\"\\n\" + chalk.bold(\"Suggestions:\"));\n\t\t\tconsole.log(\" • Try reducing GPU memory utilization: --memory 50%\");\n\t\t\tconsole.log(\" • Use a smaller context window: --context 4k\");\n\t\t\tconsole.log(\" • Use a quantized version of the model (e.g., FP8)\");\n\t\t\tconsole.log(\" • Use more GPUs with tensor parallelism\");\n\t\t\tconsole.log(\" • Try a smaller model variant\");\n\t\t}\n\n\t\tconsole.log(\"\\n\" + chalk.cyan('Check full logs: pi ssh \"tail -100 ~/.vllm_logs/' + name + '.log\"'));\n\t\tprocess.exit(1);\n\t} else if (startupComplete) {\n\t\t// Model started successfully - output connection details\n\t\tconsole.log(\"\\n\" + chalk.green(\"✓ Model started successfully!\"));\n\t\tconsole.log(\"\\n\" + chalk.bold(\"Connection Details:\"));\n\t\tconsole.log(chalk.cyan(\"─\".repeat(50)));\n\t\tconsole.log(chalk.white(\"Base URL: \") + chalk.yellow(`http://${host}:${port}/v1`));\n\t\tconsole.log(chalk.white(\"Model: \") + chalk.yellow(modelId));\n\t\tconsole.log(chalk.white(\"API Key: \") + chalk.yellow(process.env.PI_API_KEY || \"(not set)\"));\n\t\tconsole.log(chalk.cyan(\"─\".repeat(50)));\n\n\t\tconsole.log(\"\\n\" + chalk.bold(\"Export for shell:\"));\n\t\tconsole.log(chalk.gray(`export OPENAI_BASE_URL=\"http://${host}:${port}/v1\"`));\n\t\tconsole.log(chalk.gray(`export OPENAI_API_KEY=\"${process.env.PI_API_KEY || \"your-api-key\"}\"`));\n\t\tconsole.log(chalk.gray(`export OPENAI_MODEL=\"${modelId}\"`));\n\n\t\tconsole.log(\"\\n\" + chalk.bold(\"Example usage:\"));\n\t\tconsole.log(\n\t\t\tchalk.gray(`\n # Python\n from openai import OpenAI\n client = OpenAI() # Uses env vars\n response = client.chat.completions.create(\n model=\"${modelId}\",\n messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n )\n\n # CLI\n curl $OPENAI_BASE_URL/chat/completions \\\\\n -H \"Authorization: Bearer $OPENAI_API_KEY\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -d '{\"model\":\"${modelId}\",\"messages\":[{\"role\":\"user\",\"content\":\"Hi\"}]}'`),\n\t\t);\n\t\tconsole.log(\"\");\n\t\tconsole.log(chalk.cyan(`Chat with model: pi agent ${name} \"Your message\"`));\n\t\tconsole.log(chalk.cyan(`Interactive mode: pi agent ${name} -i`));\n\t\tconsole.log(chalk.cyan(`Monitor logs: pi logs ${name}`));\n\t\tconsole.log(chalk.cyan(`Stop model: pi stop ${name}`));\n\t} else if (interrupted) {\n\t\tconsole.log(chalk.yellow(\"\\n\\nStopped monitoring. Model deployment continues in background.\"));\n\t\tconsole.log(chalk.cyan(`Chat with model: pi agent ${name} \"Your message\"`));\n\t\tconsole.log(chalk.cyan(`Check status: pi logs ${name}`));\n\t\tconsole.log(chalk.cyan(`Stop model: pi stop ${name}`));\n\t} else {\n\t\tconsole.log(chalk.yellow(\"\\n\\nLog stream ended. Model may still be running.\"));\n\t\tconsole.log(chalk.cyan(`Chat with model: pi agent ${name} \"Your message\"`));\n\t\tconsole.log(chalk.cyan(`Check status: pi logs ${name}`));\n\t\tconsole.log(chalk.cyan(`Stop model: pi stop ${name}`));\n\t}\n};\n\n/**\n * Stop a model\n */\nexport const stopModel = async (name: string, options: { pod?: string }) => {\n\tconst { name: podName, pod } = getPod(options.pod);\n\n\tconst model = pod.models[name];\n\tif (!model) {\n\t\tconsole.error(chalk.red(`Model '${name}' not found on pod '${podName}'`));\n\t\tprocess.exit(1);\n\t}\n\n\tconsole.log(chalk.yellow(`Stopping model '${name}' on pod '${podName}'...`));\n\n\t// Kill the script process and all its children\n\t// Using pkill to kill the process and all children\n\tconst killCmd = `\n\t\t# Kill the script process and all its children\n\t\tpkill -TERM -P ${model.pid} 2>/dev/null || true\n\t\tkill ${model.pid} 2>/dev/null || true\n\t`;\n\tawait sshExec(pod.ssh, killCmd);\n\n\t// Remove from config\n\tconst config = loadConfig();\n\tdelete config.pods[podName].models[name];\n\tsaveConfig(config);\n\n\tconsole.log(chalk.green(`✓ Model '${name}' stopped`));\n};\n\n/**\n * Stop all models on a pod\n */\nexport const stopAllModels = async (options: { pod?: string }) => {\n\tconst { name: podName, pod } = getPod(options.pod);\n\n\tconst modelNames = Object.keys(pod.models);\n\tif (modelNames.length === 0) {\n\t\tconsole.log(`No models running on pod '${podName}'`);\n\t\treturn;\n\t}\n\n\tconsole.log(chalk.yellow(`Stopping ${modelNames.length} model(s) on pod '${podName}'...`));\n\n\t// Kill all script processes and their children\n\tconst pids = Object.values(pod.models).map((m) => m.pid);\n\tconst killCmd = `\n\t\tfor PID in ${pids.join(\" \")}; do\n\t\t\tpkill -TERM -P $PID 2>/dev/null || true\n\t\t\tkill $PID 2>/dev/null || true\n\t\tdone\n\t`;\n\tawait sshExec(pod.ssh, killCmd);\n\n\t// Clear all models from config\n\tconst config = loadConfig();\n\tconfig.pods[podName].models = {};\n\tsaveConfig(config);\n\n\tconsole.log(chalk.green(`✓ Stopped all models: ${modelNames.join(\", \")}`));\n};\n\n/**\n * List all models\n */\nexport const listModels = async (options: { pod?: string }) => {\n\tconst { name: podName, pod } = getPod(options.pod);\n\n\tconst modelNames = Object.keys(pod.models);\n\tif (modelNames.length === 0) {\n\t\tconsole.log(`No models running on pod '${podName}'`);\n\t\treturn;\n\t}\n\n\t// Get pod SSH host for URL display\n\tconst sshParts = pod.ssh.split(\" \");\n\tconst host = sshParts.find((p) => p.includes(\"@\"))?.split(\"@\")[1] || \"unknown\";\n\n\tconsole.log(`Models on pod '${chalk.bold(podName)}':`);\n\tfor (const name of modelNames) {\n\t\tconst model = pod.models[name];\n\t\tconst gpuStr =\n\t\t\tmodel.gpu.length > 1\n\t\t\t\t? `GPUs ${model.gpu.join(\",\")}`\n\t\t\t\t: model.gpu.length === 1\n\t\t\t\t\t? `GPU ${model.gpu[0]}`\n\t\t\t\t\t: \"GPU unknown\";\n\t\tconsole.log(` ${chalk.green(name)} - Port ${model.port} - ${gpuStr} - PID ${model.pid}`);\n\t\tconsole.log(` Model: ${chalk.gray(model.model)}`);\n\t\tconsole.log(` URL: ${chalk.cyan(`http://${host}:${model.port}/v1`)}`);\n\t}\n\n\t// Optionally verify processes are still running\n\tconsole.log(\"\");\n\tconsole.log(\"Verifying processes...\");\n\tlet anyDead = false;\n\tfor (const name of modelNames) {\n\t\tconst model = pod.models[name];\n\t\t// Check both the wrapper process and if vLLM is responding\n\t\tconst checkCmd = `\n\t\t\t# Check if wrapper process exists\n\t\t\tif ps -p ${model.pid} > /dev/null 2>&1; then\n\t\t\t\t# Process exists, now check if vLLM is responding\n\t\t\t\tif curl -s -f http://localhost:${model.port}/health > /dev/null 2>&1; then\n\t\t\t\t\techo \"running\"\n\t\t\t\telse\n\t\t\t\t\t# Check if it's still starting up\n\t\t\t\t\tif tail -n 20 ~/.vllm_logs/${name}.log 2>/dev/null | grep -q \"ERROR\\\\|Failed\\\\|Cuda error\\\\|died\"; then\n\t\t\t\t\t\techo \"crashed\"\n\t\t\t\t\telse\n\t\t\t\t\t\techo \"starting\"\n\t\t\t\t\tfi\n\t\t\t\tfi\n\t\t\telse\n\t\t\t\techo \"dead\"\n\t\t\tfi\n\t\t`;\n\t\tconst result = await sshExec(pod.ssh, checkCmd);\n\t\tconst status = result.stdout.trim();\n\t\tif (status === \"dead\") {\n\t\t\tconsole.log(chalk.red(` ${name}: Process ${model.pid} is not running`));\n\t\t\tanyDead = true;\n\t\t} else if (status === \"crashed\") {\n\t\t\tconsole.log(chalk.red(` ${name}: vLLM crashed (check logs with 'pi logs ${name}')`));\n\t\t\tanyDead = true;\n\t\t} else if (status === \"starting\") {\n\t\t\tconsole.log(chalk.yellow(` ${name}: Still starting up...`));\n\t\t}\n\t}\n\n\tif (anyDead) {\n\t\tconsole.log(\"\");\n\t\tconsole.log(chalk.yellow(\"Some models are not running. Clean up with:\"));\n\t\tconsole.log(chalk.cyan(\" pi stop <name>\"));\n\t} else {\n\t\tconsole.log(chalk.green(\"✓ All processes verified\"));\n\t}\n};\n\n/**\n * View model logs\n */\nexport const viewLogs = async (name: string, options: { pod?: string }) => {\n\tconst { name: podName, pod } = getPod(options.pod);\n\n\tconst model = pod.models[name];\n\tif (!model) {\n\t\tconsole.error(chalk.red(`Model '${name}' not found on pod '${podName}'`));\n\t\tprocess.exit(1);\n\t}\n\n\tconsole.log(chalk.green(`Streaming logs for '${name}' on pod '${podName}'...`));\n\tconsole.log(chalk.gray(\"Press Ctrl+C to stop\"));\n\tconsole.log(\"\");\n\n\t// Stream logs with color preservation\n\tconst sshParts = pod.ssh.split(\" \");\n\tconst sshCommand = sshParts[0]; // \"ssh\"\n\tconst sshArgs = sshParts.slice(1); // [\"root@86.38.238.55\"]\n\tconst tailCmd = `tail -f ~/.vllm_logs/${name}.log`;\n\n\tconst logProcess = spawn(sshCommand, [...sshArgs, tailCmd], {\n\t\tstdio: \"inherit\",\n\t\tenv: {\n\t\t\t...process.env,\n\t\t\tFORCE_COLOR: \"1\",\n\t\t},\n\t});\n\n\t// Wait for process to exit\n\tawait new Promise<void>((resolve) => {\n\t\tlogProcess.on(\"exit\", () => resolve());\n\t});\n};\n\n/**\n * Show known models and their hardware requirements\n */\nexport const showKnownModels = async () => {\n\tconst __filename = fileURLToPath(import.meta.url);\n\tconst __dirname = dirname(__filename);\n\tconst modelsJsonPath = join(__dirname, \"..\", \"models.json\");\n\tconst modelsJson = JSON.parse(readFileSync(modelsJsonPath, \"utf-8\"));\n\tconst models = modelsJson.models;\n\n\t// Get active pod info if available\n\tconst activePod = getActivePod();\n\tlet podGpuCount = 0;\n\tlet podGpuType = \"\";\n\n\tif (activePod) {\n\t\tpodGpuCount = activePod.pod.gpus.length;\n\t\t// Extract GPU type from name (e.g., \"NVIDIA H200\" -> \"H200\")\n\t\tpodGpuType = activePod.pod.gpus[0]?.name?.replace(\"NVIDIA\", \"\")?.trim()?.split(\" \")[0] || \"\";\n\n\t\tconsole.log(chalk.bold(`Known Models for ${activePod.name} (${podGpuCount}x ${podGpuType || \"GPU\"}):\\n`));\n\t} else {\n\t\tconsole.log(chalk.bold(\"Known Models:\\n\"));\n\t\tconsole.log(chalk.yellow(\"No active pod. Use 'pi pods active <name>' to filter compatible models.\\n\"));\n\t}\n\n\tconsole.log(\"Usage: pi start <model> --name <name> [options]\\n\");\n\n\t// Group models by compatibility and family\n\tconst compatible: Record<string, Array<{ id: string; name: string; config: string; notes?: string }>> = {};\n\tconst incompatible: Record<string, Array<{ id: string; name: string; minGpu: string; notes?: string }>> = {};\n\n\tfor (const [modelId, info] of Object.entries(models)) {\n\t\tconst modelInfo = info as any;\n\t\tconst family = modelInfo.name.split(\"-\")[0] || \"Other\";\n\n\t\tlet isCompatible = false;\n\t\tlet compatibleConfig = \"\";\n\t\tlet minGpu = \"Unknown\";\n\t\tlet minNotes: string | undefined;\n\n\t\tif (modelInfo.configs && modelInfo.configs.length > 0) {\n\t\t\t// Sort configs by GPU count to find minimum\n\t\t\tconst sortedConfigs = [...modelInfo.configs].sort((a: any, b: any) => (a.gpuCount || 1) - (b.gpuCount || 1));\n\n\t\t\t// Find minimum requirements\n\t\t\tconst minConfig = sortedConfigs[0];\n\t\t\tconst minGpuCount = minConfig.gpuCount || 1;\n\t\t\tconst gpuTypes = minConfig.gpuTypes?.join(\"/\") || \"H100/H200\";\n\n\t\t\tif (minGpuCount === 1) {\n\t\t\t\tminGpu = `1x ${gpuTypes}`;\n\t\t\t} else {\n\t\t\t\tminGpu = `${minGpuCount}x ${gpuTypes}`;\n\t\t\t}\n\n\t\t\tminNotes = minConfig.notes || modelInfo.notes;\n\n\t\t\t// Check compatibility with active pod\n\t\t\tif (activePod && podGpuCount > 0) {\n\t\t\t\t// Find best matching config for this pod\n\t\t\t\tfor (const config of sortedConfigs) {\n\t\t\t\t\tconst configGpuCount = config.gpuCount || 1;\n\t\t\t\t\tconst configGpuTypes = config.gpuTypes || [];\n\n\t\t\t\t\t// Check if we have enough GPUs\n\t\t\t\t\tif (configGpuCount <= podGpuCount) {\n\t\t\t\t\t\t// Check if GPU type matches (if specified)\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tconfigGpuTypes.length === 0 ||\n\t\t\t\t\t\t\tconfigGpuTypes.some((type: string) => podGpuType.includes(type) || type.includes(podGpuType))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tisCompatible = true;\n\t\t\t\t\t\t\tif (configGpuCount === 1) {\n\t\t\t\t\t\t\t\tcompatibleConfig = `1x ${podGpuType}`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcompatibleConfig = `${configGpuCount}x ${podGpuType}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tminNotes = config.notes || modelInfo.notes;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst modelEntry = {\n\t\t\tid: modelId,\n\t\t\tname: modelInfo.name,\n\t\t\tnotes: minNotes,\n\t\t};\n\n\t\tif (activePod && isCompatible) {\n\t\t\tif (!compatible[family]) {\n\t\t\t\tcompatible[family] = [];\n\t\t\t}\n\t\t\tcompatible[family].push({ ...modelEntry, config: compatibleConfig });\n\t\t} else {\n\t\t\tif (!incompatible[family]) {\n\t\t\t\tincompatible[family] = [];\n\t\t\t}\n\t\t\tincompatible[family].push({ ...modelEntry, minGpu });\n\t\t}\n\t}\n\n\t// Display compatible models first\n\tif (activePod && Object.keys(compatible).length > 0) {\n\t\tconsole.log(chalk.green.bold(\"✓ Compatible Models:\\n\"));\n\n\t\tconst sortedFamilies = Object.keys(compatible).sort();\n\t\tfor (const family of sortedFamilies) {\n\t\t\tconsole.log(chalk.cyan(`${family} Models:`));\n\n\t\t\tconst modelList = compatible[family].sort((a, b) => a.name.localeCompare(b.name));\n\n\t\t\tfor (const model of modelList) {\n\t\t\t\tconsole.log(` ${chalk.green(model.id)}`);\n\t\t\t\tconsole.log(` Name: ${model.name}`);\n\t\t\t\tconsole.log(` Config: ${model.config}`);\n\t\t\t\tif (model.notes) {\n\t\t\t\t\tconsole.log(chalk.gray(` Note: ${model.notes}`));\n\t\t\t\t}\n\t\t\t\tconsole.log(\"\");\n\t\t\t}\n\t\t}\n\t}\n\n\t// Display incompatible models\n\tif (Object.keys(incompatible).length > 0) {\n\t\tif (activePod && Object.keys(compatible).length > 0) {\n\t\t\tconsole.log(chalk.red.bold(\"✗ Incompatible Models (need more/different GPUs):\\n\"));\n\t\t}\n\n\t\tconst sortedFamilies = Object.keys(incompatible).sort();\n\t\tfor (const family of sortedFamilies) {\n\t\t\tif (!activePod) {\n\t\t\t\tconsole.log(chalk.cyan(`${family} Models:`));\n\t\t\t} else {\n\t\t\t\tconsole.log(chalk.gray(`${family} Models:`));\n\t\t\t}\n\n\t\t\tconst modelList = incompatible[family].sort((a, b) => a.name.localeCompare(b.name));\n\n\t\t\tfor (const model of modelList) {\n\t\t\t\tconst color = activePod ? chalk.gray : chalk.green;\n\t\t\t\tconsole.log(` ${color(model.id)}`);\n\t\t\t\tconsole.log(chalk.gray(` Name: ${model.name}`));\n\t\t\t\tconsole.log(chalk.gray(` Min Hardware: ${model.minGpu}`));\n\t\t\t\tif (model.notes && !activePod) {\n\t\t\t\t\tconsole.log(chalk.gray(` Note: ${model.notes}`));\n\t\t\t\t}\n\t\t\t\tif (activePod) {\n\t\t\t\t\tconsole.log(\"\"); // Less verbose for incompatible models when filtered\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(\"\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconsole.log(chalk.gray(\"\\nFor unknown models, defaults to single GPU deployment.\"));\n\tconsole.log(chalk.gray(\"Use --vllm to pass custom arguments to vLLM.\"));\n};\n"]}
|
package/dist/commands/pods.js
CHANGED
|
@@ -117,7 +117,7 @@ export const setupPod = async (name, sshCmd, options) => {
|
|
|
117
117
|
const [id, name, memory] = line.split(",").map((s) => s.trim());
|
|
118
118
|
if (id !== undefined) {
|
|
119
119
|
gpus.push({
|
|
120
|
-
id: parseInt(id),
|
|
120
|
+
id: parseInt(id, 10),
|
|
121
121
|
name: name || "Unknown",
|
|
122
122
|
memory: memory || "Unknown",
|
|
123
123
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pods.js","sourceRoot":"","sources":["../../src/commands/pods.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { addPod, loadConfig, removePod, setActivePod } from \"../config.js\";\nimport { scpFile, sshExec, sshExecStream } from \"../ssh.js\";\nimport type { GPU, Pod } from \"../types.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * List all pods\n */\nexport const listPods = () => {\n\tconst config = loadConfig();\n\tconst podNames = Object.keys(config.pods);\n\n\tif (podNames.length === 0) {\n\t\tconsole.log(\"No pods configured. Use 'pi pods setup' to add a pod.\");\n\t\treturn;\n\t}\n\n\tconsole.log(\"Configured pods:\");\n\tfor (const name of podNames) {\n\t\tconst pod = config.pods[name];\n\t\tconst isActive = config.active === name;\n\t\tconst marker = isActive ? chalk.green(\"*\") : \" \";\n\t\tconst gpuCount = pod.gpus?.length || 0;\n\t\tconst gpuInfo = gpuCount > 0 ? `${gpuCount}x ${pod.gpus[0].name}` : \"no GPUs detected\";\n\t\tconst vllmInfo = pod.vllmVersion ? ` (vLLM: ${pod.vllmVersion})` : \"\";\n\t\tconsole.log(`${marker} ${chalk.bold(name)} - ${gpuInfo}${vllmInfo} - ${pod.ssh}`);\n\t\tif (pod.modelsPath) {\n\t\t\tconsole.log(` Models: ${pod.modelsPath}`);\n\t\t}\n\t\tif (pod.vllmVersion === \"gpt-oss\") {\n\t\t\tconsole.log(chalk.yellow(` ⚠️ GPT-OSS build - only for GPT-OSS models`));\n\t\t}\n\t}\n};\n\n/**\n * Setup a new pod\n */\nexport const setupPod = async (\n\tname: string,\n\tsshCmd: string,\n\toptions: { mount?: string; modelsPath?: string; vllm?: \"release\" | \"nightly\" | \"gpt-oss\" },\n) => {\n\t// Validate environment variables\n\tconst hfToken = process.env.HF_TOKEN;\n\tconst vllmApiKey = process.env.PI_API_KEY;\n\n\tif (!hfToken) {\n\t\tconsole.error(chalk.red(\"ERROR: HF_TOKEN environment variable is required\"));\n\t\tconsole.error(\"Get a token from: https://huggingface.co/settings/tokens\");\n\t\tconsole.error(\"Then run: export HF_TOKEN=your_token_here\");\n\t\tprocess.exit(1);\n\t}\n\n\tif (!vllmApiKey) {\n\t\tconsole.error(chalk.red(\"ERROR: PI_API_KEY environment variable is required\"));\n\t\tconsole.error(\"Set an API key: export PI_API_KEY=your_api_key_here\");\n\t\tprocess.exit(1);\n\t}\n\n\t// Determine models path\n\tlet modelsPath = options.modelsPath;\n\tif (!modelsPath && options.mount) {\n\t\t// Extract path from mount command if not explicitly provided\n\t\t// e.g., \"mount -t nfs ... /mnt/sfs\" -> \"/mnt/sfs\"\n\t\tconst parts = options.mount.split(\" \");\n\t\tmodelsPath = parts[parts.length - 1];\n\t}\n\n\tif (!modelsPath) {\n\t\tconsole.error(chalk.red(\"ERROR: --models-path is required (or must be extractable from --mount)\"));\n\t\tprocess.exit(1);\n\t}\n\n\tconsole.log(chalk.green(`Setting up pod '${name}'...`));\n\tconsole.log(`SSH: ${sshCmd}`);\n\tconsole.log(`Models path: ${modelsPath}`);\n\tconsole.log(\n\t\t`vLLM version: ${options.vllm || \"release\"} ${options.vllm === \"gpt-oss\" ? chalk.yellow(\"(GPT-OSS special build)\") : \"\"}`,\n\t);\n\tif (options.mount) {\n\t\tconsole.log(`Mount command: ${options.mount}`);\n\t}\n\tconsole.log(\"\");\n\n\t// Test SSH connection\n\tconsole.log(\"Testing SSH connection...\");\n\tconst testResult = await sshExec(sshCmd, \"echo 'SSH OK'\");\n\tif (testResult.exitCode !== 0) {\n\t\tconsole.error(chalk.red(\"Failed to connect via SSH\"));\n\t\tconsole.error(testResult.stderr);\n\t\tprocess.exit(1);\n\t}\n\tconsole.log(chalk.green(\"✓ SSH connection successful\"));\n\n\t// Copy setup script\n\tconsole.log(\"Copying setup script...\");\n\tconst scriptPath = join(__dirname, \"../../scripts/pod_setup.sh\");\n\tconst success = await scpFile(sshCmd, scriptPath, \"/tmp/pod_setup.sh\");\n\tif (!success) {\n\t\tconsole.error(chalk.red(\"Failed to copy setup script\"));\n\t\tprocess.exit(1);\n\t}\n\tconsole.log(chalk.green(\"✓ Setup script copied\"));\n\n\t// Build setup command\n\tlet setupCmd = `bash /tmp/pod_setup.sh --models-path '${modelsPath}' --hf-token '${hfToken}' --vllm-api-key '${vllmApiKey}'`;\n\tif (options.mount) {\n\t\tsetupCmd += ` --mount '${options.mount}'`;\n\t}\n\t// Add vLLM version flag\n\tconst vllmVersion = options.vllm || \"release\";\n\tsetupCmd += ` --vllm '${vllmVersion}'`;\n\n\t// Run setup script\n\tconsole.log(\"\");\n\tconsole.log(chalk.yellow(\"Running setup (this will take 2-5 minutes)...\"));\n\tconsole.log(\"\");\n\n\t// Use forceTTY to preserve colors from apt, pip, etc.\n\tconst exitCode = await sshExecStream(sshCmd, setupCmd, { forceTTY: true });\n\tif (exitCode !== 0) {\n\t\tconsole.error(chalk.red(\"\\nSetup failed. Check the output above for errors.\"));\n\t\tprocess.exit(1);\n\t}\n\n\t// Parse GPU info from setup output\n\tconsole.log(\"\");\n\tconsole.log(\"Detecting GPU configuration...\");\n\tconst gpuResult = await sshExec(sshCmd, \"nvidia-smi --query-gpu=index,name,memory.total --format=csv,noheader\");\n\n\tconst gpus: GPU[] = [];\n\tif (gpuResult.exitCode === 0 && gpuResult.stdout) {\n\t\tconst lines = gpuResult.stdout.trim().split(\"\\n\");\n\t\tfor (const line of lines) {\n\t\t\tconst [id, name, memory] = line.split(\",\").map((s) => s.trim());\n\t\t\tif (id !== undefined) {\n\t\t\t\tgpus.push({\n\t\t\t\t\tid: parseInt(id),\n\t\t\t\t\tname: name || \"Unknown\",\n\t\t\t\t\tmemory: memory || \"Unknown\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tconsole.log(chalk.green(`✓ Detected ${gpus.length} GPU(s)`));\n\tfor (const gpu of gpus) {\n\t\tconsole.log(` GPU ${gpu.id}: ${gpu.name} (${gpu.memory})`);\n\t}\n\n\t// Save pod configuration\n\tconst pod: Pod = {\n\t\tssh: sshCmd,\n\t\tgpus,\n\t\tmodels: {},\n\t\tmodelsPath,\n\t\tvllmVersion: options.vllm || \"release\",\n\t};\n\n\taddPod(name, pod);\n\tconsole.log(\"\");\n\tconsole.log(chalk.green(`✓ Pod '${name}' setup complete and set as active pod`));\n\tconsole.log(\"\");\n\tconsole.log(\"You can now deploy models with:\");\n\tconsole.log(chalk.cyan(` pi start <model> --name <name>`));\n};\n\n/**\n * Switch active pod\n */\nexport const switchActivePod = (name: string) => {\n\tconst config = loadConfig();\n\tif (!config.pods[name]) {\n\t\tconsole.error(chalk.red(`Pod '${name}' not found`));\n\t\tconsole.log(\"\\nAvailable pods:\");\n\t\tfor (const podName of Object.keys(config.pods)) {\n\t\t\tconsole.log(` ${podName}`);\n\t\t}\n\t\tprocess.exit(1);\n\t}\n\n\tsetActivePod(name);\n\tconsole.log(chalk.green(`✓ Switched active pod to '${name}'`));\n};\n\n/**\n * Remove a pod from config\n */\nexport const removePodCommand = (name: string) => {\n\tconst config = loadConfig();\n\tif (!config.pods[name]) {\n\t\tconsole.error(chalk.red(`Pod '${name}' not found`));\n\t\tprocess.exit(1);\n\t}\n\n\tremovePod(name);\n\tconsole.log(chalk.green(`✓ Removed pod '${name}' from configuration`));\n\tconsole.log(chalk.yellow(\"Note: This only removes the local configuration. The remote pod is not affected.\"));\n};\n"]}
|
|
1
|
+
{"version":3,"file":"pods.js","sourceRoot":"","sources":["../../src/commands/pods.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { addPod, loadConfig, removePod, setActivePod } from \"../config.js\";\nimport { scpFile, sshExec, sshExecStream } from \"../ssh.js\";\nimport type { GPU, Pod } from \"../types.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * List all pods\n */\nexport const listPods = () => {\n\tconst config = loadConfig();\n\tconst podNames = Object.keys(config.pods);\n\n\tif (podNames.length === 0) {\n\t\tconsole.log(\"No pods configured. Use 'pi pods setup' to add a pod.\");\n\t\treturn;\n\t}\n\n\tconsole.log(\"Configured pods:\");\n\tfor (const name of podNames) {\n\t\tconst pod = config.pods[name];\n\t\tconst isActive = config.active === name;\n\t\tconst marker = isActive ? chalk.green(\"*\") : \" \";\n\t\tconst gpuCount = pod.gpus?.length || 0;\n\t\tconst gpuInfo = gpuCount > 0 ? `${gpuCount}x ${pod.gpus[0].name}` : \"no GPUs detected\";\n\t\tconst vllmInfo = pod.vllmVersion ? ` (vLLM: ${pod.vllmVersion})` : \"\";\n\t\tconsole.log(`${marker} ${chalk.bold(name)} - ${gpuInfo}${vllmInfo} - ${pod.ssh}`);\n\t\tif (pod.modelsPath) {\n\t\t\tconsole.log(` Models: ${pod.modelsPath}`);\n\t\t}\n\t\tif (pod.vllmVersion === \"gpt-oss\") {\n\t\t\tconsole.log(chalk.yellow(` ⚠️ GPT-OSS build - only for GPT-OSS models`));\n\t\t}\n\t}\n};\n\n/**\n * Setup a new pod\n */\nexport const setupPod = async (\n\tname: string,\n\tsshCmd: string,\n\toptions: { mount?: string; modelsPath?: string; vllm?: \"release\" | \"nightly\" | \"gpt-oss\" },\n) => {\n\t// Validate environment variables\n\tconst hfToken = process.env.HF_TOKEN;\n\tconst vllmApiKey = process.env.PI_API_KEY;\n\n\tif (!hfToken) {\n\t\tconsole.error(chalk.red(\"ERROR: HF_TOKEN environment variable is required\"));\n\t\tconsole.error(\"Get a token from: https://huggingface.co/settings/tokens\");\n\t\tconsole.error(\"Then run: export HF_TOKEN=your_token_here\");\n\t\tprocess.exit(1);\n\t}\n\n\tif (!vllmApiKey) {\n\t\tconsole.error(chalk.red(\"ERROR: PI_API_KEY environment variable is required\"));\n\t\tconsole.error(\"Set an API key: export PI_API_KEY=your_api_key_here\");\n\t\tprocess.exit(1);\n\t}\n\n\t// Determine models path\n\tlet modelsPath = options.modelsPath;\n\tif (!modelsPath && options.mount) {\n\t\t// Extract path from mount command if not explicitly provided\n\t\t// e.g., \"mount -t nfs ... /mnt/sfs\" -> \"/mnt/sfs\"\n\t\tconst parts = options.mount.split(\" \");\n\t\tmodelsPath = parts[parts.length - 1];\n\t}\n\n\tif (!modelsPath) {\n\t\tconsole.error(chalk.red(\"ERROR: --models-path is required (or must be extractable from --mount)\"));\n\t\tprocess.exit(1);\n\t}\n\n\tconsole.log(chalk.green(`Setting up pod '${name}'...`));\n\tconsole.log(`SSH: ${sshCmd}`);\n\tconsole.log(`Models path: ${modelsPath}`);\n\tconsole.log(\n\t\t`vLLM version: ${options.vllm || \"release\"} ${options.vllm === \"gpt-oss\" ? chalk.yellow(\"(GPT-OSS special build)\") : \"\"}`,\n\t);\n\tif (options.mount) {\n\t\tconsole.log(`Mount command: ${options.mount}`);\n\t}\n\tconsole.log(\"\");\n\n\t// Test SSH connection\n\tconsole.log(\"Testing SSH connection...\");\n\tconst testResult = await sshExec(sshCmd, \"echo 'SSH OK'\");\n\tif (testResult.exitCode !== 0) {\n\t\tconsole.error(chalk.red(\"Failed to connect via SSH\"));\n\t\tconsole.error(testResult.stderr);\n\t\tprocess.exit(1);\n\t}\n\tconsole.log(chalk.green(\"✓ SSH connection successful\"));\n\n\t// Copy setup script\n\tconsole.log(\"Copying setup script...\");\n\tconst scriptPath = join(__dirname, \"../../scripts/pod_setup.sh\");\n\tconst success = await scpFile(sshCmd, scriptPath, \"/tmp/pod_setup.sh\");\n\tif (!success) {\n\t\tconsole.error(chalk.red(\"Failed to copy setup script\"));\n\t\tprocess.exit(1);\n\t}\n\tconsole.log(chalk.green(\"✓ Setup script copied\"));\n\n\t// Build setup command\n\tlet setupCmd = `bash /tmp/pod_setup.sh --models-path '${modelsPath}' --hf-token '${hfToken}' --vllm-api-key '${vllmApiKey}'`;\n\tif (options.mount) {\n\t\tsetupCmd += ` --mount '${options.mount}'`;\n\t}\n\t// Add vLLM version flag\n\tconst vllmVersion = options.vllm || \"release\";\n\tsetupCmd += ` --vllm '${vllmVersion}'`;\n\n\t// Run setup script\n\tconsole.log(\"\");\n\tconsole.log(chalk.yellow(\"Running setup (this will take 2-5 minutes)...\"));\n\tconsole.log(\"\");\n\n\t// Use forceTTY to preserve colors from apt, pip, etc.\n\tconst exitCode = await sshExecStream(sshCmd, setupCmd, { forceTTY: true });\n\tif (exitCode !== 0) {\n\t\tconsole.error(chalk.red(\"\\nSetup failed. Check the output above for errors.\"));\n\t\tprocess.exit(1);\n\t}\n\n\t// Parse GPU info from setup output\n\tconsole.log(\"\");\n\tconsole.log(\"Detecting GPU configuration...\");\n\tconst gpuResult = await sshExec(sshCmd, \"nvidia-smi --query-gpu=index,name,memory.total --format=csv,noheader\");\n\n\tconst gpus: GPU[] = [];\n\tif (gpuResult.exitCode === 0 && gpuResult.stdout) {\n\t\tconst lines = gpuResult.stdout.trim().split(\"\\n\");\n\t\tfor (const line of lines) {\n\t\t\tconst [id, name, memory] = line.split(\",\").map((s) => s.trim());\n\t\t\tif (id !== undefined) {\n\t\t\t\tgpus.push({\n\t\t\t\t\tid: parseInt(id, 10),\n\t\t\t\t\tname: name || \"Unknown\",\n\t\t\t\t\tmemory: memory || \"Unknown\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tconsole.log(chalk.green(`✓ Detected ${gpus.length} GPU(s)`));\n\tfor (const gpu of gpus) {\n\t\tconsole.log(` GPU ${gpu.id}: ${gpu.name} (${gpu.memory})`);\n\t}\n\n\t// Save pod configuration\n\tconst pod: Pod = {\n\t\tssh: sshCmd,\n\t\tgpus,\n\t\tmodels: {},\n\t\tmodelsPath,\n\t\tvllmVersion: options.vllm || \"release\",\n\t};\n\n\taddPod(name, pod);\n\tconsole.log(\"\");\n\tconsole.log(chalk.green(`✓ Pod '${name}' setup complete and set as active pod`));\n\tconsole.log(\"\");\n\tconsole.log(\"You can now deploy models with:\");\n\tconsole.log(chalk.cyan(` pi start <model> --name <name>`));\n};\n\n/**\n * Switch active pod\n */\nexport const switchActivePod = (name: string) => {\n\tconst config = loadConfig();\n\tif (!config.pods[name]) {\n\t\tconsole.error(chalk.red(`Pod '${name}' not found`));\n\t\tconsole.log(\"\\nAvailable pods:\");\n\t\tfor (const podName of Object.keys(config.pods)) {\n\t\t\tconsole.log(` ${podName}`);\n\t\t}\n\t\tprocess.exit(1);\n\t}\n\n\tsetActivePod(name);\n\tconsole.log(chalk.green(`✓ Switched active pod to '${name}'`));\n};\n\n/**\n * Remove a pod from config\n */\nexport const removePodCommand = (name: string) => {\n\tconst config = loadConfig();\n\tif (!config.pods[name]) {\n\t\tconsole.error(chalk.red(`Pod '${name}' not found`));\n\t\tprocess.exit(1);\n\t}\n\n\tremovePod(name);\n\tconsole.log(chalk.green(`✓ Removed pod '${name}' from configuration`));\n\tconsole.log(chalk.yellow(\"Note: This only removes the local configuration. The remote pod is not affected.\"));\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mariozechner/pi",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.44",
|
|
4
4
|
"description": "CLI tool for managing vLLM deployments on GPU pods",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"node": ">=20.0.0"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@mariozechner/pi-agent": "^0.5.
|
|
37
|
+
"@mariozechner/pi-agent": "^0.5.44",
|
|
38
38
|
"chalk": "^5.5.0"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {}
|