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