comfyui-mcp 0.44.0 → 0.45.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/dist/config.js +3 -1
- package/dist/config.js.map +1 -1
- package/dist/orchestrator/ai-proposer.js +5 -0
- package/dist/orchestrator/ai-proposer.js.map +1 -1
- package/dist/orchestrator/antigravity-backend.js +394 -52
- package/dist/orchestrator/antigravity-backend.js.map +1 -1
- package/dist/orchestrator/claude-backend.js +13 -0
- package/dist/orchestrator/claude-backend.js.map +1 -1
- package/dist/orchestrator/codex-backend.js +12 -1
- package/dist/orchestrator/codex-backend.js.map +1 -1
- package/dist/orchestrator/gemini-backend.js +8 -1
- package/dist/orchestrator/gemini-backend.js.map +1 -1
- package/dist/orchestrator/grok-backend.js +4 -1
- package/dist/orchestrator/grok-backend.js.map +1 -1
- package/dist/orchestrator/index.js +53 -10
- package/dist/orchestrator/index.js.map +1 -1
- package/dist/orchestrator/panel-agent.js +21 -5
- package/dist/orchestrator/panel-agent.js.map +1 -1
- package/dist/orchestrator/panel-console-http.js +1 -0
- package/dist/orchestrator/panel-console-http.js.map +1 -1
- package/dist/orchestrator/panel-tools.js +140 -9
- package/dist/orchestrator/panel-tools.js.map +1 -1
- package/dist/services/ai-toolkit.js +260 -3
- package/dist/services/ai-toolkit.js.map +1 -1
- package/dist/services/missing-models.js +295 -0
- package/dist/services/missing-models.js.map +1 -0
- package/dist/services/openai-provider-registry.js +20 -1
- package/dist/services/openai-provider-registry.js.map +1 -1
- package/dist/services/panel-secrets.js +58 -7
- package/dist/services/panel-secrets.js.map +1 -1
- package/dist/services/runpod-client.js +157 -9
- package/dist/services/runpod-client.js.map +1 -1
- package/dist/services/runpod-ssh.js +594 -0
- package/dist/services/runpod-ssh.js.map +1 -0
- package/dist/services/runpod-watch.js +53 -12
- package/dist/services/runpod-watch.js.map +1 -1
- package/dist/services/trainer-bootstrap.js +142 -0
- package/dist/services/trainer-bootstrap.js.map +1 -0
- package/dist/services/training-config.js +4 -1
- package/dist/services/training-config.js.map +1 -1
- package/dist/services/training-jobs.js +1332 -253
- package/dist/services/training-jobs.js.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/missing-models.js +151 -0
- package/dist/tools/missing-models.js.map +1 -0
- package/dist/tools/runpod.js +7 -0
- package/dist/tools/runpod.js.map +1 -1
- package/dist/tools/train.js +138 -5
- package/dist/tools/train.js.map +1 -1
- package/docker/trainer/Dockerfile +4 -2
- package/package.json +1 -1
- package/scripts/gen-tool-docs.ts +36 -4
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
// link so a user creating their own pod credits our account.
|
|
4
4
|
//
|
|
5
5
|
// Auth: RUNPOD_API_KEY (loaded from ~/.comfyui-mcp/.env into process.env by
|
|
6
|
-
// src/config.ts). The key
|
|
7
|
-
//
|
|
6
|
+
// src/config.ts). The key is sent as an `Authorization: Bearer` header — NEVER
|
|
7
|
+
// in the URL (query strings leak into proxy/server logs) and NEVER logged.
|
|
8
8
|
//
|
|
9
9
|
// Referral: RunPod's referral attaches at signup/deploy via a `?ref=` link, NOT as
|
|
10
10
|
// a per-pod API parameter — so we surface the deploy link for pod CREATION while
|
|
@@ -53,20 +53,35 @@ function getApiKey() {
|
|
|
53
53
|
throw new RunpodAuthError();
|
|
54
54
|
return key;
|
|
55
55
|
}
|
|
56
|
+
/** Per-request timeout for RunPod API calls — a hung network must not pile up
|
|
57
|
+
* poller ticks or wedge a tool call forever. Override with RUNPOD_HTTP_TIMEOUT_MS. */
|
|
58
|
+
export const RUNPOD_HTTP_TIMEOUT_MS = (() => {
|
|
59
|
+
const v = Number(process.env.RUNPOD_HTTP_TIMEOUT_MS);
|
|
60
|
+
return Number.isFinite(v) && v > 0 ? v : 10_000;
|
|
61
|
+
})();
|
|
56
62
|
/** POST a GraphQL query to RunPod. Throws RunpodAuthError on 401, a descriptive
|
|
57
63
|
* Error on GraphQL/HTTP errors. The api_key never appears in thrown messages. */
|
|
58
64
|
export async function runpodGql(query, variables) {
|
|
59
65
|
const key = getApiKey();
|
|
60
66
|
let res;
|
|
61
67
|
try {
|
|
62
|
-
res = await fetch(
|
|
68
|
+
res = await fetch(RUNPOD_GRAPHQL_ENDPOINT, {
|
|
63
69
|
method: "POST",
|
|
64
|
-
headers: {
|
|
70
|
+
headers: {
|
|
71
|
+
"content-type": "application/json",
|
|
72
|
+
// Bearer header, NOT `?api_key=` in the URL — URLs land in logs.
|
|
73
|
+
authorization: `Bearer ${key}`,
|
|
74
|
+
},
|
|
65
75
|
body: JSON.stringify({ query, variables: variables ?? {} }),
|
|
76
|
+
signal: AbortSignal.timeout(RUNPOD_HTTP_TIMEOUT_MS),
|
|
66
77
|
});
|
|
67
78
|
}
|
|
68
79
|
catch (err) {
|
|
69
|
-
|
|
80
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
81
|
+
const timedOut = err instanceof Error && (err.name === "TimeoutError" || err.name === "AbortError");
|
|
82
|
+
throw new Error(timedOut
|
|
83
|
+
? `RunPod API request timed out after ${RUNPOD_HTTP_TIMEOUT_MS / 1000}s (${RUNPOD_GRAPHQL_ENDPOINT}).`
|
|
84
|
+
: `Could not reach RunPod (${RUNPOD_GRAPHQL_ENDPOINT}): ${msg}`);
|
|
70
85
|
}
|
|
71
86
|
if (res.status === 401)
|
|
72
87
|
throw new RunpodAuthError("RunPod rejected the API key (401). Check RUNPOD_API_KEY in ~/.comfyui-mcp/.env.");
|
|
@@ -152,22 +167,124 @@ async function deployOnce(cloudType, gpuTypeId, opts) {
|
|
|
152
167
|
volumeInGb: opts.volumeInGb ?? 60,
|
|
153
168
|
volumeMountPath: "/workspace",
|
|
154
169
|
// Guarantee ComfyUI is reachable through RunPod's HTTP proxy even if
|
|
155
|
-
// the template's port config drifts
|
|
156
|
-
|
|
170
|
+
// the template's port config drifts — AND expose ssh (22/tcp) so the
|
|
171
|
+
// pod-native trainer can drive ai-toolkit over it (codex finding:
|
|
172
|
+
// one-tap pods had no SSH endpoint and rejected every pod job).
|
|
173
|
+
ports: `${RUNPOD_COMFYUI_PORT}/http,22/tcp`,
|
|
174
|
+
// SSH auth for the trainer: the template injects this at boot.
|
|
175
|
+
...(opts.publicKey ? { env: [{ key: "PUBLIC_KEY", value: opts.publicKey }] } : {}),
|
|
157
176
|
},
|
|
158
177
|
});
|
|
159
178
|
const pod = data.podFindAndDeployOnDemand;
|
|
160
179
|
return pod?.id ? { ...pod, runtime: pod.runtime ?? null } : null;
|
|
161
180
|
}
|
|
181
|
+
/** Does this createPod failure PROVE RunPod did NOT create (and bill) a pod?
|
|
182
|
+
* Only an explicit capacity/availability/quota rejection from RunPod's own
|
|
183
|
+
* GraphQL layer qualifies — the server processed the mutation and refused it.
|
|
184
|
+
* Everything else (network drop, timeout, 5xx, parse failure, rate limit) is
|
|
185
|
+
* AMBIGUOUS: the billed mutation may have landed even though we never saw the
|
|
186
|
+
* response, so blindly retrying could spawn a second billable pod. */
|
|
187
|
+
export function isProvablyNotCreatedError(err) {
|
|
188
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
189
|
+
return NOT_CREATED_RE.test(msg);
|
|
190
|
+
}
|
|
191
|
+
// CONSERVATIVE by design: match ONLY RunPod's explicit capacity/availability/
|
|
192
|
+
// quota REJECTION clauses. An error we don't specifically recognize is treated
|
|
193
|
+
// as AMBIGUOUS (a pod MAY have been created) → the caller must NOT retry.
|
|
194
|
+
//
|
|
195
|
+
// The "…capacity" clauses carry a negative lookahead that EXCLUDES the "capacity
|
|
196
|
+
// information / details / data / status" wording used by AMBIGUOUS "status
|
|
197
|
+
// unknown" messages — e.g. "response contained no capacity information, so
|
|
198
|
+
// creation status is unknown" must NOT be read as a capacity rejection, or a
|
|
199
|
+
// lost-but-landed create would be retried and double-bill. Likewise the
|
|
200
|
+
// availability clauses require the concrete "instances available" phrasing, not
|
|
201
|
+
// any sentence containing "there are no …".
|
|
202
|
+
const CAP_NOISE = "(?!\\s+(?:information|informations|data|details?|info|status|unknown))";
|
|
203
|
+
const NOT_CREATED_RE = new RegExp([
|
|
204
|
+
"no longer any instances? available",
|
|
205
|
+
"there are no (?:longer any )?(?:gpu )?instances? available",
|
|
206
|
+
"no (?:gpu )?instances? (?:currently )?available",
|
|
207
|
+
`\\bno capacity${CAP_NOISE}`,
|
|
208
|
+
`(?:not enough|insufficient) (?:gpu )?capacity${CAP_NOISE}`,
|
|
209
|
+
"(?:not enough|insufficient) (?:gpu instances|gpus|instances)",
|
|
210
|
+
"out of stock",
|
|
211
|
+
"quota (?:exceeded|reached)",
|
|
212
|
+
].join("|"), "i");
|
|
213
|
+
/** Reconcile after an AMBIGUOUS create failure: did a NEW pod with the requested
|
|
214
|
+
* name appear (i.e. did the lost mutation actually land)? `priorIds` is the set
|
|
215
|
+
* of same-named pod ids that existed BEFORE this createPod call — null when we
|
|
216
|
+
* couldn't snapshot them, in which case we cannot tell new from pre-existing.
|
|
217
|
+
*
|
|
218
|
+
* CONCURRENCY HAZARD: pod name is NOT unique, so two concurrent createPod calls
|
|
219
|
+
* for the same default name ("comfyui-mcp") each see the OTHER's pod as "new".
|
|
220
|
+
* We therefore only attribute a pod to THIS call when EXACTLY ONE new same-named
|
|
221
|
+
* pod appeared; if several did, we fail closed (kind:"ambiguous") rather than
|
|
222
|
+
* risk claiming (and then managing/auto-stopping) a pod a different caller made.
|
|
223
|
+
*
|
|
224
|
+
* RESIDUAL LIMITATION (mis-attribution, NOT extra billing): the single-new-pod
|
|
225
|
+
* path can still claim a pod created by a CONCURRENT caller if THIS call failed
|
|
226
|
+
* before creating anything AND, in the same window, exactly one other same-named
|
|
227
|
+
* pod appeared. The claimed pod exists regardless (no extra spend); the only
|
|
228
|
+
* harm is that the wrong caller manages/auto-stops it. A fully correct fix needs
|
|
229
|
+
* a per-create idempotency token or a unique deploy name (a RunPod-API design
|
|
230
|
+
* change owned by the connector author). Tracked in issue #276 — see the note at
|
|
231
|
+
* the createPod call site (~line 400). Not blocking: the common single-caller
|
|
232
|
+
* path is correct and the multi-new-pod case is already fail-closed. */
|
|
233
|
+
async function reconcileCreatedPod(name, priorIds) {
|
|
234
|
+
if (!priorIds)
|
|
235
|
+
return { kind: "unknown" };
|
|
236
|
+
let created;
|
|
237
|
+
try {
|
|
238
|
+
const pods = await listPods();
|
|
239
|
+
created = pods.filter((p) => p.name === name && !priorIds.has(p.id));
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
return { kind: "unknown" }; // reconcile list failed — never retry blindly
|
|
243
|
+
}
|
|
244
|
+
if (created.length === 0)
|
|
245
|
+
return { kind: "none" };
|
|
246
|
+
if (created.length === 1)
|
|
247
|
+
return { kind: "one", pod: created[0] };
|
|
248
|
+
return { kind: "ambiguous", count: created.length };
|
|
249
|
+
}
|
|
162
250
|
/** Deploy a fresh on-demand pod from our template. Community GPU capacity is
|
|
163
251
|
* spotty, so unless a cloud type is pinned we try COMMUNITY (cheap) across each
|
|
164
252
|
* GPU type, then SECURE (reliable, pricier) — the first slot with capacity wins,
|
|
165
253
|
* so one-tap deploy survives community supply constraints. Throws a descriptive
|
|
166
254
|
* error listing what RunPod rejected if nothing is available. The returned pod
|
|
167
|
-
* is fresh (runtime null — still booting; follow with getPod/runpod_pod_connect).
|
|
255
|
+
* is fresh (runtime null — still booting; follow with getPod/runpod_pod_connect).
|
|
256
|
+
*
|
|
257
|
+
* BILLING SAFETY: podFindAndDeployOnDemand is a non-idempotent, BILLED mutation.
|
|
258
|
+
* We only move on to the next cloud/GPU slot when RunPod EXPLICITLY rejected the
|
|
259
|
+
* deploy (capacity/quota — provably nothing was created). On any AMBIGUOUS
|
|
260
|
+
* failure (network/timeout/5xx/parse — the pod may exist even though the
|
|
261
|
+
* response was lost) we reconcile by listing pods under the requested name: if
|
|
262
|
+
* this call's pod appeared, return it; otherwise fail WITHOUT retrying so a
|
|
263
|
+
* lost-response create can never fan out into extra billable pods. Auth errors
|
|
264
|
+
* surface immediately. */
|
|
168
265
|
export async function createPod(opts = {}) {
|
|
169
266
|
const gpuTypeIds = opts.gpuTypeIds?.length ? opts.gpuTypeIds : RUNPOD_DEFAULT_GPU_TYPES;
|
|
170
267
|
const cloudTypes = opts.cloudType ? [opts.cloudType] : ["COMMUNITY", "SECURE"];
|
|
268
|
+
// Mis-attribution mitigation (#276): pod name is NOT unique, so a shared
|
|
269
|
+
// default ("comfyui-mcp") let a lost-response reconcile claim a CONCURRENT
|
|
270
|
+
// caller's same-named pod. RunPod exposes no per-create idempotency token, so
|
|
271
|
+
// instead we default to a UNIQUE deploy name — then reconcileCreatedPod's
|
|
272
|
+
// `name` filter attributes exactly THIS call's pod and concurrent creates no
|
|
273
|
+
// longer collide. An explicitly-passed name keeps its old (shared) semantics:
|
|
274
|
+
// the caller opted in.
|
|
275
|
+
const name = opts.name ?? `comfyui-mcp-${Date.now().toString(36)}${Math.random().toString(36).slice(2, 6)}`;
|
|
276
|
+
// Ensure deployOnce sends the SAME name we reconcile against (its own default
|
|
277
|
+
// would otherwise be the shared "comfyui-mcp").
|
|
278
|
+
opts = { ...opts, name };
|
|
279
|
+
// Snapshot the ids of pods ALREADY carrying the requested name, so post-failure
|
|
280
|
+
// reconciliation can tell a pod THIS call created apart from a pre-existing one.
|
|
281
|
+
let priorIds = null;
|
|
282
|
+
try {
|
|
283
|
+
priorIds = new Set((await listPods()).filter((p) => p.name === name).map((p) => p.id));
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
priorIds = null; // snapshot unavailable → ambiguous failures become terminal
|
|
287
|
+
}
|
|
171
288
|
const attempts = [];
|
|
172
289
|
for (const cloudType of cloudTypes) {
|
|
173
290
|
for (const gpuTypeId of gpuTypeIds) {
|
|
@@ -178,7 +295,38 @@ export async function createPod(opts = {}) {
|
|
|
178
295
|
attempts.push(`${cloudType}/${gpuTypeId}: no capacity available`);
|
|
179
296
|
}
|
|
180
297
|
catch (err) {
|
|
181
|
-
|
|
298
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
299
|
+
// Auth rejection happens before any pod is created — surface it directly
|
|
300
|
+
// (retrying other slots with the same bad key is pointless).
|
|
301
|
+
if (err instanceof RunpodAuthError)
|
|
302
|
+
throw err;
|
|
303
|
+
if (isProvablyNotCreatedError(err)) {
|
|
304
|
+
// RunPod itself said "no capacity/quota" → nothing was created; the
|
|
305
|
+
// next cloud/GPU slot is safe to try.
|
|
306
|
+
attempts.push(`${cloudType}/${gpuTypeId}: ${msg}`);
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
// AMBIGUOUS failure: the billed mutation may have landed. Reconcile first.
|
|
310
|
+
const rec = await reconcileCreatedPod(name, priorIds);
|
|
311
|
+
// Exactly one new same-named pod → attribute it to this call. NOTE: a
|
|
312
|
+
// concurrent same-name create can make this mis-attribute (harm =
|
|
313
|
+
// wrong owner manages the pod, NOT extra billing); a proper fix needs a
|
|
314
|
+
// per-create idempotency key / unique deploy name — tracked in issue #276.
|
|
315
|
+
if (rec.kind === "one")
|
|
316
|
+
return rec.pod;
|
|
317
|
+
const suffix = attempts.length ? `\nEarlier attempts:\n${attempts.map((a) => ` • ${a}`).join("\n")}` : "";
|
|
318
|
+
if (rec.kind === "ambiguous") {
|
|
319
|
+
throw new Error(`RunPod pod creation on ${cloudType}/${gpuTypeId} failed ambiguously (${msg}) and ` +
|
|
320
|
+
`${rec.count} new pods named "${name}" appeared — likely a concurrent create raced ` +
|
|
321
|
+
`this one, so which pod belongs to this call can't be determined. NOT retrying and ` +
|
|
322
|
+
`NOT claiming any of them automatically (a wrong guess could auto-stop someone else's ` +
|
|
323
|
+
`pod or leak a billable one). Reconcile manually at console.runpod.io (or ` +
|
|
324
|
+
`runpod_pod_status).` + suffix);
|
|
325
|
+
}
|
|
326
|
+
throw new Error(`RunPod pod creation failed on ${cloudType}/${gpuTypeId} and it could not be confirmed ` +
|
|
327
|
+
`whether a pod was created (${msg}). NOT retrying automatically — a retry could create ` +
|
|
328
|
+
`a second billable pod. Check your pods at console.runpod.io (or runpod_pod_status) ` +
|
|
329
|
+
`before trying again.` + suffix);
|
|
182
330
|
}
|
|
183
331
|
}
|
|
184
332
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runpod-client.js","sourceRoot":"","sources":["../../src/services/runpod-client.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,iFAAiF;AACjF,6DAA6D;AAC7D,EAAE;AACF,4EAA4E;AAC5E
|
|
1
|
+
{"version":3,"file":"runpod-client.js","sourceRoot":"","sources":["../../src/services/runpod-client.ts"],"names":[],"mappings":"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"}
|