comfyui-mcp 0.8.1 → 0.9.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/CHANGELOG.md +45 -0
- package/dist/comfyui/client.d.ts.map +1 -1
- package/dist/comfyui/client.js +53 -2
- package/dist/comfyui/client.js.map +1 -1
- package/dist/comfyui/cloud-client.d.ts +37 -0
- package/dist/comfyui/cloud-client.d.ts.map +1 -0
- package/dist/comfyui/cloud-client.js +190 -0
- package/dist/comfyui/cloud-client.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +80 -7
- package/dist/config.js.map +1 -1
- package/dist/experimental/chat-handler.d.ts +6 -19
- package/dist/experimental/chat-handler.d.ts.map +1 -1
- package/dist/experimental/chat-handler.js +36 -41
- package/dist/experimental/chat-handler.js.map +1 -1
- package/dist/experimental/provider-registry.d.ts +2 -6
- package/dist/experimental/provider-registry.d.ts.map +1 -1
- package/dist/experimental/provider-registry.js +36 -28
- package/dist/experimental/provider-registry.js.map +1 -1
- package/dist/services/health-check.d.ts.map +1 -1
- package/dist/services/health-check.js +7 -0
- package/dist/services/health-check.js.map +1 -1
- package/dist/services/job-watcher.d.ts.map +1 -1
- package/dist/services/job-watcher.js +59 -47
- package/dist/services/job-watcher.js.map +1 -1
- package/dist/services/storage/azure-blob.d.ts.map +1 -1
- package/dist/services/storage/azure-blob.js +18 -8
- package/dist/services/storage/azure-blob.js.map +1 -1
- package/dist/services/storage/s3.d.ts.map +1 -1
- package/dist/services/storage/s3.js +13 -4
- package/dist/services/storage/s3.js.map +1 -1
- package/dist/services/tunnel.d.ts.map +1 -1
- package/dist/services/tunnel.js +9 -1
- package/dist/services/tunnel.js.map +1 -1
- package/dist/utils/optional-dep.d.ts +5 -0
- package/dist/utils/optional-dep.d.ts.map +1 -0
- package/dist/utils/optional-dep.js +29 -0
- package/dist/utils/optional-dep.js.map +1 -0
- package/package.json +10 -8
package/dist/config.js
CHANGED
|
@@ -70,14 +70,38 @@ function detectComfyUIPaths() {
|
|
|
70
70
|
return existsSync(join(p, "models")) || existsSync(join(p, "custom_nodes"));
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
|
+
// Loopback hostnames for the smart-detection logic. When --comfyui-url points
|
|
74
|
+
// at a non-loopback host, the user is targeting a remote ComfyUI and the
|
|
75
|
+
// local-FS auto-detection would just create a deceptive footgun (filesystem
|
|
76
|
+
// fallbacks writing to an unrelated local install while the remote ComfyUI
|
|
77
|
+
// never sees the file).
|
|
78
|
+
const LOOPBACK_HOSTS = new Set([
|
|
79
|
+
"127.0.0.1",
|
|
80
|
+
"::1",
|
|
81
|
+
"localhost",
|
|
82
|
+
"0.0.0.0",
|
|
83
|
+
]);
|
|
84
|
+
function isLoopbackHost(host) {
|
|
85
|
+
if (!host)
|
|
86
|
+
return true; // No URL → assume local
|
|
87
|
+
return LOOPBACK_HOSTS.has(host.toLowerCase());
|
|
88
|
+
}
|
|
73
89
|
/**
|
|
74
90
|
* Resolve the ComfyUI path, with auto-detection fallback.
|
|
75
91
|
* Priority: COMFYUI_PATH env var > auto-detected paths.
|
|
76
|
-
*
|
|
92
|
+
*
|
|
93
|
+
* Smart-detection: if the user is targeting a remote ComfyUI (`--comfyui-url`
|
|
94
|
+
* points at a non-loopback host) or Comfy Cloud (`COMFYUI_API_KEY` is set),
|
|
95
|
+
* skip auto-detection — having COMFYUI_PATH point at an unrelated local
|
|
96
|
+
* install causes silent failures (see fix in 0.8.1 upload_*). An explicit
|
|
97
|
+
* COMFYUI_PATH env var still wins.
|
|
77
98
|
*/
|
|
78
|
-
function resolveComfyUIPath(envPath) {
|
|
99
|
+
function resolveComfyUIPath(envPath, opts) {
|
|
79
100
|
if (envPath)
|
|
80
101
|
return envPath;
|
|
102
|
+
if (opts.remoteUrl || opts.cloud) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
81
105
|
const detected = detectComfyUIPaths();
|
|
82
106
|
if (detected.length === 0)
|
|
83
107
|
return undefined;
|
|
@@ -151,27 +175,76 @@ const configSchema = z.object({
|
|
|
151
175
|
comfyuiPort: z.coerce.number().int().positive().optional(),
|
|
152
176
|
comfyuiSsl: z.coerce.boolean().default(false),
|
|
153
177
|
comfyuiPath: z.string().optional(),
|
|
178
|
+
comfyuiApiKey: z.string().optional(),
|
|
179
|
+
comfyuiCloudUrl: z.string().default("https://cloud.comfy.org"),
|
|
154
180
|
huggingfaceToken: z.string().optional(),
|
|
155
181
|
githubToken: z.string().optional(),
|
|
156
182
|
civitaiApiToken: z.string().optional(),
|
|
157
183
|
comfyApiKey: z.string().optional(),
|
|
158
184
|
});
|
|
159
185
|
const urlOverride = resolveUrlOverride();
|
|
186
|
+
const cloudApiKey = process.env.COMFYUI_API_KEY?.trim() || undefined;
|
|
187
|
+
const cloudActive = Boolean(cloudApiKey);
|
|
188
|
+
const remoteUrlActive = Boolean(urlOverride) && !isLoopbackHost(urlOverride?.host);
|
|
189
|
+
if (cloudActive) {
|
|
190
|
+
console.error(`[comfyui-mcp] Comfy Cloud mode enabled (COMFYUI_API_KEY set) — local FS/process tools will throw.`);
|
|
191
|
+
}
|
|
160
192
|
const parsedConfig = configSchema.parse({
|
|
161
193
|
comfyuiHost: urlOverride?.host ?? process.env.COMFYUI_HOST,
|
|
162
194
|
comfyuiPort: urlOverride?.port ?? (process.env.COMFYUI_PORT || undefined),
|
|
163
195
|
comfyuiSsl: urlOverride?.ssl ?? process.env.COMFYUI_SSL,
|
|
164
|
-
comfyuiPath: resolveComfyUIPath(process.env.COMFYUI_PATH
|
|
196
|
+
comfyuiPath: resolveComfyUIPath(process.env.COMFYUI_PATH, {
|
|
197
|
+
remoteUrl: remoteUrlActive,
|
|
198
|
+
cloud: cloudActive,
|
|
199
|
+
}),
|
|
200
|
+
comfyuiApiKey: cloudApiKey,
|
|
201
|
+
comfyuiCloudUrl: process.env.COMFYUI_CLOUD_URL,
|
|
165
202
|
huggingfaceToken: process.env.HUGGINGFACE_TOKEN,
|
|
166
203
|
githubToken: process.env.GITHUB_TOKEN,
|
|
167
204
|
civitaiApiToken: process.env.CIVITAI_API_TOKEN,
|
|
168
205
|
comfyApiKey: process.env.COMFY_API_KEY,
|
|
169
206
|
});
|
|
170
|
-
// Resolve port:
|
|
171
|
-
//
|
|
172
|
-
|
|
173
|
-
|
|
207
|
+
// Resolve port:
|
|
208
|
+
// - Cloud mode: no port needed (resolvedPort is a placeholder; getComfyUIApiHost()
|
|
209
|
+
// throws via requireLocalMode() in cloud mode so the value is never read).
|
|
210
|
+
// - Otherwise: explicit url/env wins, then auto-detect against the host.
|
|
211
|
+
let resolvedPort;
|
|
212
|
+
if (cloudActive) {
|
|
213
|
+
resolvedPort = parsedConfig.comfyuiPort ?? 0;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
resolvedPort = parsedConfig.comfyuiPort
|
|
217
|
+
?? (urlOverride ? urlOverride.port : await detectComfyUIPort(parsedConfig.comfyuiHost));
|
|
218
|
+
}
|
|
174
219
|
export const config = { ...parsedConfig, resolvedPort };
|
|
220
|
+
// ── Mode helpers ──────────────────────────────────────────────────────────
|
|
221
|
+
// Three modes, mutually exclusive in practice:
|
|
222
|
+
// - cloud: COMFYUI_API_KEY set → talk to Comfy Cloud over HTTPS+X-API-Key
|
|
223
|
+
// - remote: --comfyui-url points at a non-loopback host → talk to remote
|
|
224
|
+
// ComfyUI; local-FS/process tools should throw
|
|
225
|
+
// - local: everything else
|
|
226
|
+
// Tools that fundamentally need a local install (process control, manifest,
|
|
227
|
+
// model removal, etc.) MUST check config.comfyuiPath and throw clearly if
|
|
228
|
+
// undefined. The dispatcher in src/comfyui/client.ts handles cloud routing
|
|
229
|
+
// for HTTP-backed primitives.
|
|
230
|
+
export function isCloudMode() {
|
|
231
|
+
return Boolean(config.comfyuiApiKey);
|
|
232
|
+
}
|
|
233
|
+
export function isRemoteMode() {
|
|
234
|
+
return !isCloudMode() && remoteUrlActive;
|
|
235
|
+
}
|
|
236
|
+
export function isLocalMode() {
|
|
237
|
+
return !isCloudMode() && !isRemoteMode();
|
|
238
|
+
}
|
|
239
|
+
export function getCloudUrl() {
|
|
240
|
+
return config.comfyuiCloudUrl;
|
|
241
|
+
}
|
|
242
|
+
export function getApiKey() {
|
|
243
|
+
if (!config.comfyuiApiKey) {
|
|
244
|
+
throw new Error("Comfy Cloud API key not configured (COMFYUI_API_KEY).");
|
|
245
|
+
}
|
|
246
|
+
return config.comfyuiApiKey;
|
|
247
|
+
}
|
|
175
248
|
export function getComfyUIApiHost() {
|
|
176
249
|
return `${config.comfyuiHost}:${config.resolvedPort}`;
|
|
177
250
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* it on the server and feeds the result back into the model automatically.
|
|
5
|
-
*/
|
|
6
|
-
export declare const tools: {
|
|
7
|
-
generate_image: import("ai").Tool<{
|
|
8
|
-
prompt: string;
|
|
9
|
-
width?: number | undefined;
|
|
10
|
-
height?: number | undefined;
|
|
11
|
-
}, {
|
|
12
|
-
status: string;
|
|
13
|
-
prompt: string;
|
|
14
|
-
width: number;
|
|
15
|
-
height: number;
|
|
16
|
-
imageUrl: string;
|
|
17
|
-
note: string;
|
|
18
|
-
}>;
|
|
19
|
-
};
|
|
1
|
+
import type { LanguageModel, ToolSet } from "ai";
|
|
2
|
+
type AiModule = typeof import("ai");
|
|
3
|
+
export declare function buildTools(toolFn: AiModule["tool"]): ToolSet;
|
|
20
4
|
export interface ChatHandlerOptions {
|
|
21
5
|
/** Override the model (mainly for tests). Defaults to the provider registry. */
|
|
22
6
|
model?: LanguageModel;
|
|
@@ -24,6 +8,8 @@ export interface ChatHandlerOptions {
|
|
|
24
8
|
modelId?: string;
|
|
25
9
|
/** System prompt for the agent. */
|
|
26
10
|
system?: string;
|
|
11
|
+
/** Override the tool set (mainly for tests). Defaults to the POC tools. */
|
|
12
|
+
tools?: ToolSet;
|
|
27
13
|
}
|
|
28
14
|
/**
|
|
29
15
|
* Handle a chat request. Accepts a Fetch-style `Request` whose JSON body is
|
|
@@ -31,4 +17,5 @@ export interface ChatHandlerOptions {
|
|
|
31
17
|
* `Response` (UI message stream protocol).
|
|
32
18
|
*/
|
|
33
19
|
export declare function handleChatRequest(req: Request, options?: ChatHandlerOptions): Promise<Response>;
|
|
20
|
+
export {};
|
|
34
21
|
//# sourceMappingURL=chat-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-handler.d.ts","sourceRoot":"","sources":["../../src/experimental/chat-handler.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"chat-handler.d.ts","sourceRoot":"","sources":["../../src/experimental/chat-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,OAAO,EAER,MAAM,IAAI,CAAC;AAqBZ,KAAK,QAAQ,GAAG,cAAc,IAAI,CAAC,CAAC;AASpC,wBAAgB,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,CAwB5D;AAED,MAAM,WAAW,kBAAkB;IACjC,gFAAgF;IAChF,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAKD;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,OAAO,EACZ,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,QAAQ,CAAC,CAqBnB"}
|
|
@@ -1,43 +1,36 @@
|
|
|
1
|
-
import { convertToModelMessages, stepCountIs, streamText, tool, } from "ai";
|
|
2
1
|
import { z } from "zod";
|
|
3
2
|
import { resolveModel } from "./provider-registry.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
3
|
+
import { requireOptionalDep } from "../utils/optional-dep.js";
|
|
4
|
+
async function loadAi() {
|
|
5
|
+
return requireOptionalDep("ai", {
|
|
6
|
+
feature: "embedded-agent-panel POC",
|
|
7
|
+
installHint: "npm install ai @ai-sdk/anthropic @ai-sdk/google @ai-sdk/openai",
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
export function buildTools(toolFn) {
|
|
11
|
+
return {
|
|
12
|
+
generate_image: toolFn({
|
|
13
|
+
description: "Generate an image from a text prompt using ComfyUI. (POC stub — returns a placeholder result instead of running a real workflow.)",
|
|
14
|
+
inputSchema: z.object({
|
|
15
|
+
prompt: z.string().describe("The text prompt to generate an image from."),
|
|
16
|
+
width: z.number().int().positive().optional().describe("Image width in pixels."),
|
|
17
|
+
height: z.number().int().positive().optional().describe("Image height in pixels."),
|
|
18
|
+
}),
|
|
19
|
+
execute: async ({ prompt, width, height }) => {
|
|
20
|
+
// POC stub: real implementation will enqueue a ComfyUI workflow and
|
|
21
|
+
// return the resulting asset id / image URL.
|
|
22
|
+
return {
|
|
23
|
+
status: "stubbed",
|
|
24
|
+
prompt,
|
|
25
|
+
width: width ?? 1024,
|
|
26
|
+
height: height ?? 1024,
|
|
27
|
+
imageUrl: "https://example.invalid/poc-placeholder.png",
|
|
28
|
+
note: "Placeholder result from the POC. No real workflow was executed.",
|
|
29
|
+
};
|
|
30
|
+
},
|
|
26
31
|
}),
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
// return the resulting asset id / image URL.
|
|
30
|
-
return {
|
|
31
|
-
status: "stubbed",
|
|
32
|
-
prompt,
|
|
33
|
-
width: width ?? 1024,
|
|
34
|
-
height: height ?? 1024,
|
|
35
|
-
imageUrl: "https://example.invalid/poc-placeholder.png",
|
|
36
|
-
note: "Placeholder result from the POC. No real workflow was executed.",
|
|
37
|
-
};
|
|
38
|
-
},
|
|
39
|
-
}),
|
|
40
|
-
};
|
|
32
|
+
};
|
|
33
|
+
}
|
|
41
34
|
const DEFAULT_SYSTEM = "You are an assistant embedded in ComfyUI. You can generate images with the generate_image tool.";
|
|
42
35
|
/**
|
|
43
36
|
* Handle a chat request. Accepts a Fetch-style `Request` whose JSON body is
|
|
@@ -47,13 +40,15 @@ const DEFAULT_SYSTEM = "You are an assistant embedded in ComfyUI. You can genera
|
|
|
47
40
|
export async function handleChatRequest(req, options = {}) {
|
|
48
41
|
const body = (await req.json());
|
|
49
42
|
const messages = body.messages ?? [];
|
|
50
|
-
const
|
|
51
|
-
const
|
|
43
|
+
const ai = await loadAi();
|
|
44
|
+
const model = options.model ?? (await resolveModel(options.modelId ?? body.model));
|
|
45
|
+
const tools = options.tools ?? buildTools(ai.tool);
|
|
46
|
+
const result = ai.streamText({
|
|
52
47
|
model,
|
|
53
48
|
system: options.system ?? DEFAULT_SYSTEM,
|
|
54
|
-
messages: await convertToModelMessages(messages),
|
|
49
|
+
messages: await ai.convertToModelMessages(messages),
|
|
55
50
|
tools,
|
|
56
|
-
stopWhen: stepCountIs(5),
|
|
51
|
+
stopWhen: ai.stepCountIs(5),
|
|
57
52
|
});
|
|
58
53
|
return result.toUIMessageStreamResponse();
|
|
59
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-handler.js","sourceRoot":"","sources":["../../src/experimental/chat-handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chat-handler.js","sourceRoot":"","sources":["../../src/experimental/chat-handler.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAmB9D,KAAK,UAAU,MAAM;IACnB,OAAO,kBAAkB,CAAW,IAAI,EAAE;QACxC,OAAO,EAAE,0BAA0B;QACnC,WAAW,EAAE,gEAAgE;KAC9E,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAwB;IACjD,OAAO;QACL,cAAc,EAAE,MAAM,CAAC;YACrB,WAAW,EACT,mIAAmI;YACrI,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;gBACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;gBACzE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;gBAChF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;aACnF,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;gBAC3C,oEAAoE;gBACpE,6CAA6C;gBAC7C,OAAO;oBACL,MAAM,EAAE,SAAS;oBACjB,MAAM;oBACN,KAAK,EAAE,KAAK,IAAI,IAAI;oBACpB,MAAM,EAAE,MAAM,IAAI,IAAI;oBACtB,QAAQ,EAAE,6CAA6C;oBACvD,IAAI,EAAE,iEAAiE;iBACxE,CAAC;YACJ,CAAC;SACF,CAAC;KACe,CAAC;AACtB,CAAC;AAaD,MAAM,cAAc,GAClB,iGAAiG,CAAC;AAEpG;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAY,EACZ,UAA8B,EAAE;IAEhC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAG7B,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IAErC,MAAM,EAAE,GAAG,MAAM,MAAM,EAAE,CAAC;IAC1B,MAAM,KAAK,GACT,OAAO,CAAC,KAAK,IAAI,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAEnD,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC;QAC3B,KAAK;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,cAAc;QACxC,QAAQ,EAAE,MAAM,EAAE,CAAC,sBAAsB,CAAC,QAAQ,CAAC;QACnD,KAAK;QACL,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;KAC5B,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,yBAAyB,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
import type { LanguageModel } from "ai";
|
|
2
|
-
export declare
|
|
3
|
-
|
|
4
|
-
openai: import("@ai-sdk/openai").OpenAIProvider;
|
|
5
|
-
google: import("@ai-sdk/google").GoogleGenerativeAIProvider;
|
|
6
|
-
}, ":">;
|
|
7
|
-
export declare function resolveModel(id?: string): LanguageModel;
|
|
2
|
+
export declare function getRegistry(): Promise<import("ai").ProviderRegistryProvider<Record<string, import("@ai-sdk/provider").ProviderV3>, string>>;
|
|
3
|
+
export declare function resolveModel(id?: string): Promise<LanguageModel>;
|
|
8
4
|
//# sourceMappingURL=provider-registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-registry.d.ts","sourceRoot":"","sources":["../../src/experimental/provider-registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provider-registry.d.ts","sourceRoot":"","sources":["../../src/experimental/provider-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAuBxC,wBAAsB,WAAW,kHA6BhC;AAkBD,wBAAsB,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAStE"}
|
|
@@ -1,28 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
1
|
+
import { requireOptionalDep } from "../utils/optional-dep.js";
|
|
2
|
+
let registryPromise = null;
|
|
3
|
+
export async function getRegistry() {
|
|
4
|
+
if (!registryPromise) {
|
|
5
|
+
registryPromise = (async () => {
|
|
6
|
+
const [ai, anthropic, google, openai] = await Promise.all([
|
|
7
|
+
requireOptionalDep("ai", {
|
|
8
|
+
feature: "embedded-agent-panel POC",
|
|
9
|
+
installHint: "npm install ai @ai-sdk/anthropic @ai-sdk/google @ai-sdk/openai",
|
|
10
|
+
}),
|
|
11
|
+
requireOptionalDep("@ai-sdk/anthropic", {
|
|
12
|
+
feature: "Anthropic provider for the agent POC",
|
|
13
|
+
installHint: "npm install @ai-sdk/anthropic",
|
|
14
|
+
}),
|
|
15
|
+
requireOptionalDep("@ai-sdk/google", {
|
|
16
|
+
feature: "Google provider for the agent POC",
|
|
17
|
+
installHint: "npm install @ai-sdk/google",
|
|
18
|
+
}),
|
|
19
|
+
requireOptionalDep("@ai-sdk/openai", {
|
|
20
|
+
feature: "OpenAI provider for the agent POC",
|
|
21
|
+
installHint: "npm install @ai-sdk/openai",
|
|
22
|
+
}),
|
|
23
|
+
]);
|
|
24
|
+
return ai.createProviderRegistry({
|
|
25
|
+
anthropic: anthropic.anthropic,
|
|
26
|
+
openai: openai.openai,
|
|
27
|
+
google: google.google,
|
|
28
|
+
});
|
|
29
|
+
})();
|
|
30
|
+
}
|
|
31
|
+
return registryPromise;
|
|
32
|
+
}
|
|
20
33
|
const DEFAULT_MODEL = "anthropic:claude-sonnet-4-5";
|
|
21
|
-
/**
|
|
22
|
-
* The set of model ids a request is allowed to select: the server default
|
|
23
|
-
* (COMFYUI_MCP_AGENT_MODEL or DEFAULT_MODEL) plus any explicitly allow-listed
|
|
24
|
-
* via COMFYUI_MCP_AGENT_ALLOWED_MODELS (comma-separated `provider:model`).
|
|
25
|
-
*/
|
|
26
34
|
function allowedModels() {
|
|
27
35
|
const set = new Set([DEFAULT_MODEL]);
|
|
28
36
|
const envDefault = process.env.COMFYUI_MCP_AGENT_MODEL?.trim();
|
|
@@ -38,13 +46,13 @@ function allowedModels() {
|
|
|
38
46
|
}
|
|
39
47
|
return set;
|
|
40
48
|
}
|
|
41
|
-
export function resolveModel(id) {
|
|
49
|
+
export async function resolveModel(id) {
|
|
50
|
+
const registry = await getRegistry();
|
|
42
51
|
const fallback = process.env.COMFYUI_MCP_AGENT_MODEL?.trim() || DEFAULT_MODEL;
|
|
43
|
-
// Only honour a client-supplied model id if it is explicitly allow-listed.
|
|
44
|
-
// Otherwise ignore it and use the server default — this stops a leaked tunnel
|
|
45
|
-
// URL from letting a caller select arbitrary (expensive) models on your keys.
|
|
46
52
|
const requested = id?.trim();
|
|
47
53
|
const modelId = requested && allowedModels().has(requested) ? requested : fallback;
|
|
54
|
+
// languageModel()'s strict template-literal type doesn't cover arbitrary
|
|
55
|
+
// ids; we widen at the call site since we already gated by allowlist.
|
|
48
56
|
return registry.languageModel(modelId);
|
|
49
57
|
}
|
|
50
58
|
//# sourceMappingURL=provider-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../src/experimental/provider-registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../src/experimental/provider-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAoB9D,IAAI,eAAe,GAAmE,IAAI,CAAC;AAE3F,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,eAAe,GAAG,CAAC,KAAK,IAAI,EAAE;YAC5B,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACxD,kBAAkB,CAAW,IAAI,EAAE;oBACjC,OAAO,EAAE,0BAA0B;oBACnC,WAAW,EAAE,gEAAgE;iBAC9E,CAAC;gBACF,kBAAkB,CAAkB,mBAAmB,EAAE;oBACvD,OAAO,EAAE,sCAAsC;oBAC/C,WAAW,EAAE,+BAA+B;iBAC7C,CAAC;gBACF,kBAAkB,CAAe,gBAAgB,EAAE;oBACjD,OAAO,EAAE,mCAAmC;oBAC5C,WAAW,EAAE,4BAA4B;iBAC1C,CAAC;gBACF,kBAAkB,CAAe,gBAAgB,EAAE;oBACjD,OAAO,EAAE,mCAAmC;oBAC5C,WAAW,EAAE,4BAA4B;iBAC1C,CAAC;aACH,CAAC,CAAC;YACH,OAAO,EAAE,CAAC,sBAAsB,CAAC;gBAC/B,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC9B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC,CAAC;QACL,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,aAAa,GAAG,6BAA6B,CAAC;AAEpD,SAAS,aAAa;IACpB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAS,CAAC,aAAa,CAAC,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE,CAAC;IAC/D,IAAI,UAAU;QAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC;IAC3D,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAW;IAC5C,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE,IAAI,aAAa,CAAC;IAC9E,MAAM,SAAS,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC;IAC7B,MAAM,OAAO,GACX,SAAS,IAAI,aAAa,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IACrE,yEAAyE;IACzE,sEAAsE;IACtE,OAAO,QAAQ,CAAC,aAAa,CAAC,OAAuD,CAAC,CAAC;AACzF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-check.d.ts","sourceRoot":"","sources":["../../src/services/health-check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"health-check.d.ts","sourceRoot":"","sources":["../../src/services/health-check.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,kBAAkB;IACjC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,cAAc,CAClC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAuGjB"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// joaolvivas/comfyui-mcp-byjlucas@de82ecda (2026-05-12). Refactored to
|
|
5
5
|
// match this repo's service/tool split.
|
|
6
6
|
import { ConnectionError } from "../utils/errors.js";
|
|
7
|
+
import { isCloudMode } from "../config.js";
|
|
7
8
|
import { getClient, getQueue, getSystemStats } from "../comfyui/client.js";
|
|
8
9
|
const CRITICAL_MODEL_CATS = [
|
|
9
10
|
"checkpoints",
|
|
@@ -47,6 +48,12 @@ export async function runHealthCheck(options = {}) {
|
|
|
47
48
|
catch (err) {
|
|
48
49
|
lines.push(`**Queue**: ERROR — ${err instanceof Error ? err.message : err}`);
|
|
49
50
|
}
|
|
51
|
+
if (isCloudMode()) {
|
|
52
|
+
// Comfy Cloud has its own model library and no /internal/logs equivalent.
|
|
53
|
+
lines.push(`\n**Models**: managed by Comfy Cloud (not listable from this client)`);
|
|
54
|
+
lines.push(`**Recent errors**: not available in cloud mode`);
|
|
55
|
+
return lines.join("\n");
|
|
56
|
+
}
|
|
50
57
|
const client = getClient();
|
|
51
58
|
const modelLines = [];
|
|
52
59
|
let totalModelsSeen = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-check.js","sourceRoot":"","sources":["../../src/services/health-check.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"health-check.js","sourceRoot":"","sources":["../../src/services/health-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"job-watcher.d.ts","sourceRoot":"","sources":["../../src/services/job-watcher.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"job-watcher.d.ts","sourceRoot":"","sources":["../../src/services/job-watcher.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAU9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAGL,KAAK,cAAc,EAEpB,MAAM,kBAAkB,CAAC;AAI1B,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,aAAa,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,KAAK,CAAC;YACZ,QAAQ,EAAE,MAAM,CAAC;YACjB,SAAS,EAAE,MAAM,CAAC;YAClB,IAAI,EAAE,MAAM,CAAC;YACb,GAAG,EAAE,MAAM,CAAC;YACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,cAAc,CAAC;CAClC;AAgDD,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,GAChB,sBAAsB,CAyExB;AA6HD,eAAO,MAAM,UAAU;IACrB;;;;OAIG;oBACa,MAAM,aAAa,YAAY,GAAG,IAAI;IAmHtD;;OAEG;sBACe,MAAM,GAAG,IAAI;IAS/B;;OAEG;kBACW,MAAM,EAAE;IAItB;;OAEG;uBACsB,OAAO,CAAC,IAAI,CAAC;IA4BtC,oCAAoC;;CAIrC,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { mkdir, writeFile, readdir, unlink, stat } from "node:fs/promises";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { getClient, ensureConnected, getHistory, } from "../comfyui/client.js";
|
|
5
|
-
import { getComfyUIApiHost, getComfyUIProtocol } from "../config.js";
|
|
5
|
+
import { getCloudUrl, getComfyUIApiHost, getComfyUIProtocol, isCloudMode, } from "../config.js";
|
|
6
6
|
import { attachExecutionListeners } from "../comfyui/events.js";
|
|
7
7
|
import { logger } from "../utils/logger.js";
|
|
8
8
|
import { AssetRegistry } from "./asset-registry.js";
|
|
@@ -23,8 +23,12 @@ async function ensureCompletionsDir() {
|
|
|
23
23
|
await mkdir(COMPLETIONS_DIR, { recursive: true });
|
|
24
24
|
}
|
|
25
25
|
function buildImageUrl(filename, subfolder, type) {
|
|
26
|
-
const host = getComfyUIApiHost();
|
|
27
26
|
const params = new URLSearchParams({ filename, subfolder, type });
|
|
27
|
+
if (isCloudMode()) {
|
|
28
|
+
const base = getCloudUrl().replace(/\/+$/, "");
|
|
29
|
+
return `${base}/api/view?${params.toString()}`;
|
|
30
|
+
}
|
|
31
|
+
const host = getComfyUIApiHost();
|
|
28
32
|
return `${getComfyUIProtocol()}://${host}/view?${params.toString()}`;
|
|
29
33
|
}
|
|
30
34
|
export function buildCompletionNotification(promptId, entry, startTime) {
|
|
@@ -216,55 +220,63 @@ export const JobWatcher = {
|
|
|
216
220
|
workflow,
|
|
217
221
|
};
|
|
218
222
|
activeWatchers.set(promptId, state);
|
|
219
|
-
// ── WebSocket track (best-effort) ──
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
223
|
+
// ── WebSocket track (best-effort, local/remote only) ──
|
|
224
|
+
// Comfy Cloud has no WebSocket; rely on the HTTP polling track instead.
|
|
225
|
+
const skipWs = isCloudMode();
|
|
226
|
+
if (skipWs) {
|
|
227
|
+
logger.info("Cloud mode — skipping WS attach, polling-only", {
|
|
228
|
+
prompt_id: promptId,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
if (!skipWs)
|
|
232
|
+
try {
|
|
233
|
+
const client = getClient();
|
|
234
|
+
if (!client.closed) {
|
|
235
|
+
state.wsCleanup = attachExecutionListeners(client, promptId, {
|
|
236
|
+
onComplete: () => {
|
|
237
|
+
handleCompletion(promptId, state, "ws").catch((err) => logger.error("WS completion handler error", {
|
|
238
|
+
prompt_id: promptId,
|
|
239
|
+
error: err instanceof Error ? err.message : err,
|
|
240
|
+
}));
|
|
241
|
+
},
|
|
242
|
+
onError: () => {
|
|
243
|
+
handleCompletion(promptId, state, "ws").catch((err) => logger.error("WS error handler error", {
|
|
244
|
+
prompt_id: promptId,
|
|
245
|
+
error: err instanceof Error ? err.message : err,
|
|
246
|
+
}));
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
logger.info("WS listeners attached", { prompt_id: promptId });
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
logger.info("WS not connected, polling-only mode", {
|
|
253
|
+
prompt_id: promptId,
|
|
254
|
+
});
|
|
255
|
+
// Try to connect in background for future use
|
|
256
|
+
ensureConnected().then((client) => {
|
|
257
|
+
if (!state.completed) {
|
|
258
|
+
state.wsCleanup = attachExecutionListeners(client, promptId, {
|
|
259
|
+
onComplete: () => {
|
|
260
|
+
handleCompletion(promptId, state, "ws").catch(() => { });
|
|
261
|
+
},
|
|
262
|
+
onError: () => {
|
|
263
|
+
handleCompletion(promptId, state, "ws").catch(() => { });
|
|
264
|
+
},
|
|
265
|
+
});
|
|
266
|
+
logger.info("Late WS listeners attached", {
|
|
267
|
+
prompt_id: promptId,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}, () => {
|
|
271
|
+
// WS connection failed — polling will handle it
|
|
272
|
+
});
|
|
273
|
+
}
|
|
238
274
|
}
|
|
239
|
-
|
|
240
|
-
logger.info("WS
|
|
275
|
+
catch {
|
|
276
|
+
logger.info("WS setup failed, polling-only mode", {
|
|
241
277
|
prompt_id: promptId,
|
|
242
278
|
});
|
|
243
|
-
// Try to connect in background for future use
|
|
244
|
-
ensureConnected().then((client) => {
|
|
245
|
-
if (!state.completed) {
|
|
246
|
-
state.wsCleanup = attachExecutionListeners(client, promptId, {
|
|
247
|
-
onComplete: () => {
|
|
248
|
-
handleCompletion(promptId, state, "ws").catch(() => { });
|
|
249
|
-
},
|
|
250
|
-
onError: () => {
|
|
251
|
-
handleCompletion(promptId, state, "ws").catch(() => { });
|
|
252
|
-
},
|
|
253
|
-
});
|
|
254
|
-
logger.info("Late WS listeners attached", {
|
|
255
|
-
prompt_id: promptId,
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
}, () => {
|
|
259
|
-
// WS connection failed — polling will handle it
|
|
260
|
-
});
|
|
261
279
|
}
|
|
262
|
-
}
|
|
263
|
-
catch {
|
|
264
|
-
logger.info("WS setup failed, polling-only mode", {
|
|
265
|
-
prompt_id: promptId,
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
280
|
// ── Polling track ──
|
|
269
281
|
state.pollTimer = setInterval(() => {
|
|
270
282
|
if (state.completed)
|