comfyui-node 1.6.1 → 1.6.3
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/.tsbuildinfo +1 -1
- package/dist/call-wrapper.js +856 -856
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/multipool/client-registry.d.ts +32 -11
- package/dist/multipool/client-registry.d.ts.map +1 -1
- package/dist/multipool/client-registry.js +135 -8
- package/dist/multipool/client-registry.js.map +1 -1
- package/dist/multipool/helpers.d.ts +5 -0
- package/dist/multipool/helpers.d.ts.map +1 -0
- package/dist/multipool/helpers.js +53 -0
- package/dist/multipool/helpers.js.map +1 -0
- package/dist/multipool/index.d.ts +2 -1
- package/dist/multipool/index.d.ts.map +1 -1
- package/dist/multipool/index.js +2 -1
- package/dist/multipool/index.js.map +1 -1
- package/dist/multipool/interfaces.d.ts +25 -0
- package/dist/multipool/interfaces.d.ts.map +1 -1
- package/dist/multipool/job-profiler.d.ts +128 -0
- package/dist/multipool/job-profiler.d.ts.map +1 -0
- package/dist/multipool/job-profiler.js +222 -0
- package/dist/multipool/job-profiler.js.map +1 -0
- package/dist/multipool/job-queue-processor.d.ts +27 -11
- package/dist/multipool/job-queue-processor.d.ts.map +1 -1
- package/dist/multipool/job-queue-processor.js +196 -9
- package/dist/multipool/job-queue-processor.js.map +1 -1
- package/dist/multipool/job-state-registry.d.ts +67 -0
- package/dist/multipool/job-state-registry.d.ts.map +1 -0
- package/dist/multipool/job-state-registry.js +283 -0
- package/dist/multipool/job-state-registry.js.map +1 -0
- package/dist/multipool/logger.d.ts +30 -0
- package/dist/multipool/logger.d.ts.map +1 -0
- package/dist/multipool/logger.js +75 -0
- package/dist/multipool/logger.js.map +1 -0
- package/dist/multipool/multi-workflow-pool.d.ts +86 -7
- package/dist/multipool/multi-workflow-pool.d.ts.map +1 -1
- package/dist/multipool/multi-workflow-pool.js +365 -13
- package/dist/multipool/multi-workflow-pool.js.map +1 -1
- package/dist/multipool/pool-event-manager.d.ts +10 -10
- package/dist/multipool/tests/client-registry-api-demo.d.ts +7 -0
- package/dist/multipool/tests/client-registry-api-demo.d.ts.map +1 -0
- package/dist/multipool/tests/client-registry-api-demo.js +136 -0
- package/dist/multipool/tests/client-registry-api-demo.js.map +1 -0
- package/dist/multipool/tests/client-registry.spec.d.ts +2 -0
- package/dist/multipool/tests/client-registry.spec.d.ts.map +1 -0
- package/dist/multipool/tests/client-registry.spec.js +191 -0
- package/dist/multipool/tests/client-registry.spec.js.map +1 -0
- package/dist/multipool/tests/error-classification-tests.d.ts +2 -0
- package/dist/multipool/tests/error-classification-tests.d.ts.map +1 -0
- package/dist/multipool/tests/error-classification-tests.js +374 -0
- package/dist/multipool/tests/error-classification-tests.js.map +1 -0
- package/dist/multipool/tests/event-forwarding-demo.d.ts +7 -0
- package/dist/multipool/tests/event-forwarding-demo.d.ts.map +1 -0
- package/dist/multipool/tests/event-forwarding-demo.js +88 -0
- package/dist/multipool/tests/event-forwarding-demo.js.map +1 -0
- package/dist/multipool/tests/helpers.spec.d.ts +2 -0
- package/dist/multipool/tests/helpers.spec.d.ts.map +1 -0
- package/dist/multipool/tests/helpers.spec.js +100 -0
- package/dist/multipool/tests/helpers.spec.js.map +1 -0
- package/dist/multipool/tests/job-queue-processor.spec.d.ts +2 -0
- package/dist/multipool/tests/job-queue-processor.spec.d.ts.map +1 -0
- package/dist/multipool/tests/job-queue-processor.spec.js +89 -0
- package/dist/multipool/tests/job-queue-processor.spec.js.map +1 -0
- package/dist/multipool/tests/job-state-registry.d.ts +16 -16
- package/dist/multipool/tests/job-state-registry.js +23 -23
- package/dist/multipool/tests/job-state-registry.spec.d.ts +2 -0
- package/dist/multipool/tests/job-state-registry.spec.d.ts.map +1 -0
- package/dist/multipool/tests/job-state-registry.spec.js +143 -0
- package/dist/multipool/tests/job-state-registry.spec.js.map +1 -0
- package/dist/multipool/tests/multipool-basic.d.ts +11 -1
- package/dist/multipool/tests/multipool-basic.d.ts.map +1 -1
- package/dist/multipool/tests/multipool-basic.js +140 -2
- package/dist/multipool/tests/multipool-basic.js.map +1 -1
- package/dist/multipool/tests/profiling-demo.d.ts +7 -0
- package/dist/multipool/tests/profiling-demo.d.ts.map +1 -0
- package/dist/multipool/tests/profiling-demo.js +88 -0
- package/dist/multipool/tests/profiling-demo.js.map +1 -0
- package/dist/multipool/tests/prompt-generator.d.ts +10 -0
- package/dist/multipool/tests/prompt-generator.d.ts.map +1 -0
- package/dist/multipool/tests/prompt-generator.js +26 -0
- package/dist/multipool/tests/prompt-generator.js.map +1 -0
- package/dist/multipool/tests/test-helpers.d.ts +4 -0
- package/dist/multipool/tests/test-helpers.d.ts.map +1 -0
- package/dist/multipool/tests/test-helpers.js +10 -0
- package/dist/multipool/tests/test-helpers.js.map +1 -0
- package/dist/multipool/tests/two-stage-edit-simulation.d.ts +32 -0
- package/dist/multipool/tests/two-stage-edit-simulation.d.ts.map +1 -0
- package/dist/multipool/tests/two-stage-edit-simulation.js +299 -0
- package/dist/multipool/tests/two-stage-edit-simulation.js.map +1 -0
- package/dist/multipool/workflow.d.ts +178 -173
- package/dist/multipool/workflow.d.ts.map +1 -1
- package/dist/multipool/workflow.js +333 -271
- package/dist/multipool/workflow.js.map +1 -1
- package/dist/pool/SmartPool.d.ts +143 -143
- package/dist/pool/SmartPool.js +676 -676
- package/dist/pool/SmartPoolV2.d.ts +119 -119
- package/dist/pool/SmartPoolV2.js +586 -586
- package/dist/pool/WorkflowPool.d.ts +202 -202
- package/dist/pool/WorkflowPool.d.ts.map +1 -1
- package/dist/pool/WorkflowPool.js +845 -840
- package/dist/pool/WorkflowPool.js.map +1 -1
- package/dist/pool/client/ClientManager.d.ts +86 -86
- package/dist/pool/client/ClientManager.js +215 -215
- package/dist/pool/index.d.ts +9 -11
- package/dist/pool/index.d.ts.map +1 -1
- package/dist/pool/index.js +3 -5
- package/dist/pool/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, jest } from "bun:test";
|
|
2
|
+
import { ClientRegistry } from "../client-registry.js";
|
|
3
|
+
// Mock dependencies
|
|
4
|
+
const createPoolMock = () => ({});
|
|
5
|
+
const createLoggerMock = () => ({
|
|
6
|
+
debug: jest.fn(),
|
|
7
|
+
error: jest.fn(),
|
|
8
|
+
});
|
|
9
|
+
const createWorkflowMock = (hash) => {
|
|
10
|
+
const mock = {
|
|
11
|
+
structureHash: hash,
|
|
12
|
+
updateHash: jest.fn(),
|
|
13
|
+
};
|
|
14
|
+
mock.updateHash.mockImplementation(() => {
|
|
15
|
+
mock.structureHash = "mock-hash";
|
|
16
|
+
});
|
|
17
|
+
return mock;
|
|
18
|
+
};
|
|
19
|
+
describe("ClientRegistry", () => {
|
|
20
|
+
let poolMock;
|
|
21
|
+
let loggerMock;
|
|
22
|
+
let registry;
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
poolMock = createPoolMock();
|
|
25
|
+
loggerMock = createLoggerMock();
|
|
26
|
+
registry = new ClientRegistry(poolMock, loggerMock);
|
|
27
|
+
jest.clearAllMocks();
|
|
28
|
+
});
|
|
29
|
+
describe("addClient", () => {
|
|
30
|
+
it("should add a client without options", () => {
|
|
31
|
+
const clientUrl = "http://localhost:8188";
|
|
32
|
+
registry.addClient(clientUrl);
|
|
33
|
+
expect(registry.clients.has(clientUrl)).toBe(true);
|
|
34
|
+
const client = registry.clients.get(clientUrl);
|
|
35
|
+
expect(client.url).toBe(clientUrl);
|
|
36
|
+
expect(client.state).toBe("idle");
|
|
37
|
+
expect(client.nodeName).toBe("localhost");
|
|
38
|
+
expect(client.priority).toBeUndefined();
|
|
39
|
+
expect(client.workflowAffinity).toBeUndefined();
|
|
40
|
+
});
|
|
41
|
+
it("should add a client with priority", () => {
|
|
42
|
+
const clientUrl = "http://localhost:8188";
|
|
43
|
+
registry.addClient(clientUrl, { priority: 5 });
|
|
44
|
+
const client = registry.clients.get(clientUrl);
|
|
45
|
+
expect(client.priority).toBe(5);
|
|
46
|
+
});
|
|
47
|
+
it("should add a client with workflow affinity", () => {
|
|
48
|
+
const clientUrl = "http://localhost:8188";
|
|
49
|
+
const workflow = createWorkflowMock("hash1");
|
|
50
|
+
registry.addClient(clientUrl, { workflowAffinity: [workflow] });
|
|
51
|
+
const client = registry.clients.get(clientUrl);
|
|
52
|
+
expect(client.workflowAffinity).toEqual(new Set(["hash1"]));
|
|
53
|
+
expect(registry.workflowAffinityMap.get("hash1")).toEqual(new Set([clientUrl]));
|
|
54
|
+
});
|
|
55
|
+
it("should update hash if not present in workflow", () => {
|
|
56
|
+
const clientUrl = "http://localhost:8188";
|
|
57
|
+
const workflow = createWorkflowMock(); // no hash
|
|
58
|
+
registry.addClient(clientUrl, { workflowAffinity: [workflow] });
|
|
59
|
+
expect(workflow.updateHash).toHaveBeenCalled();
|
|
60
|
+
const client = registry.clients.get(clientUrl);
|
|
61
|
+
expect(client.workflowAffinity).toEqual(new Set(["mock-hash"]));
|
|
62
|
+
});
|
|
63
|
+
it("should throw error if workflow has no hash after update", () => {
|
|
64
|
+
const clientUrl = "http://localhost:8188";
|
|
65
|
+
const workflow = createWorkflowMock();
|
|
66
|
+
workflow.updateHash.mockImplementation(() => {
|
|
67
|
+
// don't set hash
|
|
68
|
+
});
|
|
69
|
+
expect(() => registry.addClient(clientUrl, { workflowAffinity: [workflow] })).toThrow("Workflow must have a valid structure hash for affinity.");
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe("removeClient", () => {
|
|
73
|
+
it("should remove a client", () => {
|
|
74
|
+
const clientUrl = "http://localhost:8188";
|
|
75
|
+
registry.addClient(clientUrl);
|
|
76
|
+
expect(registry.clients.has(clientUrl)).toBe(true);
|
|
77
|
+
registry.removeClient(clientUrl);
|
|
78
|
+
expect(registry.clients.has(clientUrl)).toBe(false);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe("getQueueStatus", () => {
|
|
82
|
+
it("should return queue status for existing client", async () => {
|
|
83
|
+
const clientUrl = "http://localhost:8188";
|
|
84
|
+
registry.addClient(clientUrl);
|
|
85
|
+
const mockQueue = { queue_running: [], queue_pending: [] };
|
|
86
|
+
const client = registry.clients.get(clientUrl);
|
|
87
|
+
jest.spyOn(client.api, 'getQueue').mockResolvedValue(mockQueue);
|
|
88
|
+
const result = await registry.getQueueStatus(clientUrl);
|
|
89
|
+
expect(result).toBe(mockQueue);
|
|
90
|
+
});
|
|
91
|
+
it("should throw error for non-existing client", async () => {
|
|
92
|
+
await expect(registry.getQueueStatus("http://nonexistent:8188")).rejects.toThrow("Client http://nonexistent:8188 not found");
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe("getOptimalClient", () => {
|
|
96
|
+
it("should return null if no workflow hash", () => {
|
|
97
|
+
const workflow = createWorkflowMock();
|
|
98
|
+
workflow.updateHash.mockImplementation(() => {
|
|
99
|
+
// no hash
|
|
100
|
+
});
|
|
101
|
+
expect(() => registry.getOptimalClient(workflow)).toThrow("Workflow must have a valid structure hash.");
|
|
102
|
+
});
|
|
103
|
+
it("should return null if no suitable idle clients with affinity", () => {
|
|
104
|
+
const workflow = createWorkflowMock("hash1");
|
|
105
|
+
registry.addClient("http://client1:8188", { workflowAffinity: [workflow] });
|
|
106
|
+
registry.clients.get("http://client1:8188").state = "busy";
|
|
107
|
+
const result = registry.getOptimalClient(workflow);
|
|
108
|
+
expect(result).toBeNull();
|
|
109
|
+
expect(loggerMock.debug).toHaveBeenCalledWith("No suitable clients found for workflow hash1.");
|
|
110
|
+
});
|
|
111
|
+
it("should return the highest priority idle client with affinity", () => {
|
|
112
|
+
const workflow = createWorkflowMock("hash1");
|
|
113
|
+
registry.addClient("http://client1:8188", { workflowAffinity: [workflow], priority: 1 });
|
|
114
|
+
registry.addClient("http://client2:8188", { workflowAffinity: [workflow], priority: 3 });
|
|
115
|
+
registry.addClient("http://client3:8188", { workflowAffinity: [workflow], priority: 2 });
|
|
116
|
+
const result = registry.getOptimalClient(workflow);
|
|
117
|
+
expect(result.url).toBe("http://client2:8188"); // highest priority
|
|
118
|
+
});
|
|
119
|
+
it("should return idle client even if no affinity specified", () => {
|
|
120
|
+
const workflow = createWorkflowMock("hash1");
|
|
121
|
+
registry.addClient("http://client1:8188"); // no affinity
|
|
122
|
+
registry.clients.get("http://client1:8188").workflowAffinity = undefined; // ensure no affinity
|
|
123
|
+
// Since no affinity, suitableClients will be empty
|
|
124
|
+
const result = registry.getOptimalClient(workflow);
|
|
125
|
+
expect(result).toBeNull();
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
describe("hasClientsForWorkflow", () => {
|
|
129
|
+
it("should return true if clients have affinity for workflow", () => {
|
|
130
|
+
const workflow = createWorkflowMock("hash1");
|
|
131
|
+
registry.addClient("http://client1:8188", { workflowAffinity: [workflow] });
|
|
132
|
+
expect(registry.hasClientsForWorkflow("hash1")).toBe(true);
|
|
133
|
+
});
|
|
134
|
+
it("should return false if no clients have affinity", () => {
|
|
135
|
+
expect(registry.hasClientsForWorkflow("hash1")).toBe(false);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
describe("getOptimalIdleClient", () => {
|
|
139
|
+
it("should return the highest priority idle client", async () => {
|
|
140
|
+
registry.addClient("http://client1:8188", { priority: 1 });
|
|
141
|
+
registry.addClient("http://client2:8188", { priority: 3 });
|
|
142
|
+
registry.addClient("http://client3:8188", { priority: 2 });
|
|
143
|
+
// Mock getQueue to return empty for all clients
|
|
144
|
+
for (const client of registry.clients.values()) {
|
|
145
|
+
jest.spyOn(client.api, 'getQueue').mockResolvedValue({ queue_running: [], queue_pending: [] });
|
|
146
|
+
}
|
|
147
|
+
const result = await registry.getOptimalIdleClient(createWorkflowMock());
|
|
148
|
+
expect(result.url).toBe("http://client2:8188");
|
|
149
|
+
});
|
|
150
|
+
it("should return null if no idle clients", async () => {
|
|
151
|
+
registry.addClient("http://client1:8188");
|
|
152
|
+
registry.clients.get("http://client1:8188").state = "busy";
|
|
153
|
+
const result = await registry.getOptimalIdleClient(createWorkflowMock());
|
|
154
|
+
expect(result).toBeNull();
|
|
155
|
+
});
|
|
156
|
+
it("should check queue state and update client state", async () => {
|
|
157
|
+
registry.addClient("http://client1:8188");
|
|
158
|
+
const client = registry.clients.get("http://client1:8188");
|
|
159
|
+
jest.spyOn(client.api, 'getQueue').mockResolvedValue({ queue_running: [{}], queue_pending: [] });
|
|
160
|
+
const result = await registry.getOptimalIdleClient(createWorkflowMock());
|
|
161
|
+
expect(client.state).toBe("busy");
|
|
162
|
+
expect(result).toBeNull();
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
describe("markClientIncompatibleWithWorkflow", () => {
|
|
166
|
+
it("should remove affinity for the workflow", () => {
|
|
167
|
+
const workflow = createWorkflowMock("hash1");
|
|
168
|
+
registry.addClient("http://client1:8188", { workflowAffinity: [workflow] });
|
|
169
|
+
registry.markClientIncompatibleWithWorkflow("http://client1:8188", "hash1");
|
|
170
|
+
const client = registry.clients.get("http://client1:8188");
|
|
171
|
+
expect(client.workflowAffinity.has("hash1")).toBe(false);
|
|
172
|
+
expect(registry.workflowAffinityMap.has("hash1")).toBe(false);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe("getAllEligibleClientsForWorkflow", () => {
|
|
176
|
+
it("should return clients with affinity for the workflow", () => {
|
|
177
|
+
const workflow = createWorkflowMock("hash1");
|
|
178
|
+
registry.addClient("http://client1:8188", { workflowAffinity: [workflow] });
|
|
179
|
+
registry.addClient("http://client2:8188");
|
|
180
|
+
const result = registry.getAllEligibleClientsForWorkflow(workflow);
|
|
181
|
+
expect(result).toHaveLength(1);
|
|
182
|
+
expect(result[0].url).toBe("http://client1:8188");
|
|
183
|
+
});
|
|
184
|
+
it("should throw if workflow has no hash", () => {
|
|
185
|
+
const workflow = createWorkflowMock();
|
|
186
|
+
workflow.updateHash.mockImplementation(() => { });
|
|
187
|
+
expect(() => registry.getAllEligibleClientsForWorkflow(workflow)).toThrow("Workflow must have a valid structure hash.");
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
//# sourceMappingURL=client-registry.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-registry.spec.js","sourceRoot":"","sources":["../../../src/multipool/tests/client-registry.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-classification-tests.d.ts","sourceRoot":"","sources":["../../../src/multipool/tests/error-classification-tests.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import { MultiWorkflowPool } from "src/multipool/multi-workflow-pool.js";
|
|
2
|
+
import { Workflow } from "src/multipool/workflow.js";
|
|
3
|
+
/**
|
|
4
|
+
* Error Classification Validation Tests
|
|
5
|
+
*
|
|
6
|
+
* This script validates the error classification logic by intentionally triggering
|
|
7
|
+
* different types of errors from real ComfyUI servers.
|
|
8
|
+
*
|
|
9
|
+
* Test Cases:
|
|
10
|
+
* 1. Missing Model Error (workflow_incompatibility)
|
|
11
|
+
* 2. Missing Custom Node Error (workflow_incompatibility)
|
|
12
|
+
* 3. Invalid Input Error (transient)
|
|
13
|
+
* 4. Connection Error (connection)
|
|
14
|
+
*/
|
|
15
|
+
const pool = new MultiWorkflowPool();
|
|
16
|
+
// Add your real ComfyUI servers here
|
|
17
|
+
pool.addClient("http://server1:8188", {
|
|
18
|
+
workflowAffinity: [],
|
|
19
|
+
priority: 1
|
|
20
|
+
});
|
|
21
|
+
pool.addClient("http://server2:8188", {
|
|
22
|
+
workflowAffinity: [],
|
|
23
|
+
priority: 1
|
|
24
|
+
});
|
|
25
|
+
pool.addClient("http://server3:8188", {
|
|
26
|
+
workflowAffinity: [],
|
|
27
|
+
priority: 1
|
|
28
|
+
});
|
|
29
|
+
await pool.init();
|
|
30
|
+
console.log("\n" + "=".repeat(80));
|
|
31
|
+
console.log("ERROR CLASSIFICATION VALIDATION TESTS");
|
|
32
|
+
console.log("=".repeat(80) + "\n");
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// TEST 1: Missing Model Error (should be classified as workflow_incompatibility)
|
|
35
|
+
// ============================================================================
|
|
36
|
+
async function testMissingModel() {
|
|
37
|
+
console.log("\n📋 TEST 1: Missing Model Error");
|
|
38
|
+
console.log("-".repeat(80));
|
|
39
|
+
const workflow = new Workflow({
|
|
40
|
+
"1": {
|
|
41
|
+
"inputs": {
|
|
42
|
+
"text": "beautiful landscape"
|
|
43
|
+
},
|
|
44
|
+
"class_type": "CLIPTextEncode",
|
|
45
|
+
"_meta": {
|
|
46
|
+
"title": "CLIP Text Encode (Prompt)"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"2": {
|
|
50
|
+
"inputs": {
|
|
51
|
+
"ckpt_name": "this_model_definitely_does_not_exist_anywhere_12345.safetensors"
|
|
52
|
+
},
|
|
53
|
+
"class_type": "CheckpointLoaderSimple",
|
|
54
|
+
"_meta": {
|
|
55
|
+
"title": "Load Checkpoint"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"3": {
|
|
59
|
+
"inputs": {
|
|
60
|
+
"seed": 12345,
|
|
61
|
+
"steps": 20,
|
|
62
|
+
"cfg": 7.0,
|
|
63
|
+
"sampler_name": "euler",
|
|
64
|
+
"scheduler": "normal",
|
|
65
|
+
"denoise": 1.0,
|
|
66
|
+
"model": ["2", 0],
|
|
67
|
+
"positive": ["1", 0],
|
|
68
|
+
"negative": ["1", 0],
|
|
69
|
+
"latent_image": ["4", 0]
|
|
70
|
+
},
|
|
71
|
+
"class_type": "KSampler",
|
|
72
|
+
"_meta": {
|
|
73
|
+
"title": "KSampler"
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"4": {
|
|
77
|
+
"inputs": {
|
|
78
|
+
"width": 512,
|
|
79
|
+
"height": 512,
|
|
80
|
+
"batch_size": 1
|
|
81
|
+
},
|
|
82
|
+
"class_type": "EmptyLatentImage",
|
|
83
|
+
"_meta": {
|
|
84
|
+
"title": "Empty Latent Image"
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"5": {
|
|
88
|
+
"inputs": {
|
|
89
|
+
"samples": ["3", 0],
|
|
90
|
+
"vae": ["2", 2]
|
|
91
|
+
},
|
|
92
|
+
"class_type": "VAEDecode",
|
|
93
|
+
"_meta": {
|
|
94
|
+
"title": "VAE Decode"
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
"6": {
|
|
98
|
+
"inputs": {
|
|
99
|
+
"filename_prefix": "ComfyUI",
|
|
100
|
+
"images": ["5", 0]
|
|
101
|
+
},
|
|
102
|
+
"class_type": "SaveImage",
|
|
103
|
+
"_meta": {
|
|
104
|
+
"title": "Save Image"
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
try {
|
|
109
|
+
const jobId = await pool.submitJob(workflow);
|
|
110
|
+
console.log(`Submitted job: ${jobId}`);
|
|
111
|
+
const result = await pool.waitForJobCompletion(jobId);
|
|
112
|
+
if (result.status === "failed") {
|
|
113
|
+
console.log("✅ Test PASSED: Job failed as expected");
|
|
114
|
+
console.log(`Error classification should be: workflow_incompatibility`);
|
|
115
|
+
console.log(`Actual error:`, result.error);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
console.log("❌ Test FAILED: Job should have failed but didn't");
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
console.log("❌ Test ERROR:", error);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// ============================================================================
|
|
126
|
+
// TEST 2: Missing Custom Node Error (should be classified as workflow_incompatibility)
|
|
127
|
+
// ============================================================================
|
|
128
|
+
async function testMissingCustomNode() {
|
|
129
|
+
console.log("\n📋 TEST 2: Missing Custom Node Error");
|
|
130
|
+
console.log("-".repeat(80));
|
|
131
|
+
const workflow = new Workflow({
|
|
132
|
+
"1": {
|
|
133
|
+
"inputs": {
|
|
134
|
+
"some_input": "test"
|
|
135
|
+
},
|
|
136
|
+
"class_type": "NonExistentCustomNode_XYZ_12345",
|
|
137
|
+
"_meta": {
|
|
138
|
+
"title": "This Node Does Not Exist"
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
"2": {
|
|
142
|
+
"inputs": {
|
|
143
|
+
"filename_prefix": "test",
|
|
144
|
+
"images": ["1", 0]
|
|
145
|
+
},
|
|
146
|
+
"class_type": "SaveImage",
|
|
147
|
+
"_meta": {
|
|
148
|
+
"title": "Save Image"
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
try {
|
|
153
|
+
const jobId = await pool.submitJob(workflow);
|
|
154
|
+
console.log(`Submitted job: ${jobId}`);
|
|
155
|
+
const result = await pool.waitForJobCompletion(jobId);
|
|
156
|
+
if (result.status === "failed") {
|
|
157
|
+
console.log("✅ Test PASSED: Job failed as expected");
|
|
158
|
+
console.log(`Error classification should be: workflow_incompatibility`);
|
|
159
|
+
console.log(`Actual error:`, result.error);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
console.log("❌ Test FAILED: Job should have failed but didn't");
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
console.log("❌ Test ERROR:", error);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// ============================================================================
|
|
170
|
+
// TEST 3: Invalid Input Error (should be classified as transient)
|
|
171
|
+
// ============================================================================
|
|
172
|
+
async function testInvalidInput() {
|
|
173
|
+
console.log("\n📋 TEST 3: Invalid Input Error");
|
|
174
|
+
console.log("-".repeat(80));
|
|
175
|
+
const workflow = new Workflow({
|
|
176
|
+
"1": {
|
|
177
|
+
"inputs": {
|
|
178
|
+
"width": -999999, // Negative width should cause validation error
|
|
179
|
+
"height": -999999, // Negative height should cause validation error
|
|
180
|
+
"batch_size": 1
|
|
181
|
+
},
|
|
182
|
+
"class_type": "EmptyLatentImage",
|
|
183
|
+
"_meta": {
|
|
184
|
+
"title": "Empty Latent Image"
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
"2": {
|
|
188
|
+
"inputs": {
|
|
189
|
+
"filename_prefix": "test",
|
|
190
|
+
"images": ["1", 0]
|
|
191
|
+
},
|
|
192
|
+
"class_type": "SaveImage",
|
|
193
|
+
"_meta": {
|
|
194
|
+
"title": "Save Image"
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
try {
|
|
199
|
+
const jobId = await pool.submitJob(workflow);
|
|
200
|
+
console.log(`Submitted job: ${jobId}`);
|
|
201
|
+
const result = await pool.waitForJobCompletion(jobId);
|
|
202
|
+
if (result.status === "failed") {
|
|
203
|
+
console.log("✅ Test PASSED: Job failed as expected");
|
|
204
|
+
console.log(`Error classification should be: transient`);
|
|
205
|
+
console.log(`Actual error:`, result.error);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
console.log("❌ Test FAILED: Job should have failed but didn't");
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
console.log("❌ Test ERROR:", error);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// ============================================================================
|
|
216
|
+
// TEST 4: Connection Error (should be classified as connection)
|
|
217
|
+
// ============================================================================
|
|
218
|
+
async function testConnectionError() {
|
|
219
|
+
console.log("\n📋 TEST 4: Connection Error");
|
|
220
|
+
console.log("-".repeat(80));
|
|
221
|
+
const isolatedPool = new MultiWorkflowPool();
|
|
222
|
+
// Add a client that definitely doesn't exist
|
|
223
|
+
isolatedPool.addClient("http://this-server-does-not-exist-12345:8188", {
|
|
224
|
+
workflowAffinity: [],
|
|
225
|
+
priority: 1
|
|
226
|
+
});
|
|
227
|
+
try {
|
|
228
|
+
console.log("Attempting to connect to non-existent server...");
|
|
229
|
+
await isolatedPool.init();
|
|
230
|
+
console.log("❌ Test FAILED: Should have failed to connect");
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
console.log("✅ Test PASSED: Connection failed as expected");
|
|
234
|
+
console.log(`Error classification should be: connection`);
|
|
235
|
+
console.log(`Actual error:`, error);
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
await isolatedPool.shutdown();
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// ============================================================================
|
|
242
|
+
// TEST 5: Missing LoRA Error (should be classified as workflow_incompatibility)
|
|
243
|
+
// ============================================================================
|
|
244
|
+
async function testMissingLoRA() {
|
|
245
|
+
console.log("\n📋 TEST 5: Missing LoRA Error");
|
|
246
|
+
console.log("-".repeat(80));
|
|
247
|
+
const workflow = new Workflow({
|
|
248
|
+
"1": {
|
|
249
|
+
"inputs": {
|
|
250
|
+
"text": "beautiful landscape"
|
|
251
|
+
},
|
|
252
|
+
"class_type": "CLIPTextEncode",
|
|
253
|
+
"_meta": {
|
|
254
|
+
"title": "CLIP Text Encode"
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
"2": {
|
|
258
|
+
"inputs": {
|
|
259
|
+
"ckpt_name": "novaAnimeXL_ilV125.safetensors" // Use a model that exists on the servers
|
|
260
|
+
},
|
|
261
|
+
"class_type": "CheckpointLoaderSimple",
|
|
262
|
+
"_meta": {
|
|
263
|
+
"title": "Load Checkpoint"
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
"3": {
|
|
267
|
+
"inputs": {
|
|
268
|
+
"lora_name": "this_lora_does_not_exist_12345.safetensors",
|
|
269
|
+
"strength_model": 1.0,
|
|
270
|
+
"strength_clip": 1.0,
|
|
271
|
+
"model": ["2", 0],
|
|
272
|
+
"clip": ["2", 1]
|
|
273
|
+
},
|
|
274
|
+
"class_type": "LoraLoader",
|
|
275
|
+
"_meta": {
|
|
276
|
+
"title": "Load LoRA"
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
"4": {
|
|
280
|
+
"inputs": {
|
|
281
|
+
"width": 512,
|
|
282
|
+
"height": 512,
|
|
283
|
+
"batch_size": 1
|
|
284
|
+
},
|
|
285
|
+
"class_type": "EmptyLatentImage",
|
|
286
|
+
"_meta": {
|
|
287
|
+
"title": "Empty Latent Image"
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
"5": {
|
|
291
|
+
"inputs": {
|
|
292
|
+
"seed": 12345,
|
|
293
|
+
"steps": 20,
|
|
294
|
+
"cfg": 7.0,
|
|
295
|
+
"sampler_name": "euler",
|
|
296
|
+
"scheduler": "normal",
|
|
297
|
+
"denoise": 1.0,
|
|
298
|
+
"model": ["3", 0],
|
|
299
|
+
"positive": ["1", 0],
|
|
300
|
+
"negative": ["1", 0],
|
|
301
|
+
"latent_image": ["4", 0]
|
|
302
|
+
},
|
|
303
|
+
"class_type": "KSampler",
|
|
304
|
+
"_meta": {
|
|
305
|
+
"title": "KSampler"
|
|
306
|
+
}
|
|
307
|
+
},
|
|
308
|
+
"6": {
|
|
309
|
+
"inputs": {
|
|
310
|
+
"samples": ["5", 0],
|
|
311
|
+
"vae": ["2", 2]
|
|
312
|
+
},
|
|
313
|
+
"class_type": "VAEDecode",
|
|
314
|
+
"_meta": {
|
|
315
|
+
"title": "VAE Decode"
|
|
316
|
+
}
|
|
317
|
+
},
|
|
318
|
+
"7": {
|
|
319
|
+
"inputs": {
|
|
320
|
+
"filename_prefix": "ComfyUI",
|
|
321
|
+
"images": ["6", 0]
|
|
322
|
+
},
|
|
323
|
+
"class_type": "SaveImage",
|
|
324
|
+
"_meta": {
|
|
325
|
+
"title": "Save Image"
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
try {
|
|
330
|
+
const jobId = await pool.submitJob(workflow);
|
|
331
|
+
console.log(`Submitted job: ${jobId}`);
|
|
332
|
+
const result = await pool.waitForJobCompletion(jobId);
|
|
333
|
+
if (result.status === "failed") {
|
|
334
|
+
console.log("✅ Test PASSED: Job failed as expected");
|
|
335
|
+
console.log(`Error classification should be: workflow_incompatibility`);
|
|
336
|
+
console.log(`Actual error:`, result.error);
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
console.log("❌ Test FAILED: Job should have failed but didn't");
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
console.log("❌ Test ERROR:", error);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// ============================================================================
|
|
347
|
+
// Run all tests
|
|
348
|
+
// ============================================================================
|
|
349
|
+
async function runAllTests() {
|
|
350
|
+
try {
|
|
351
|
+
await testMissingModel();
|
|
352
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
353
|
+
await testMissingCustomNode();
|
|
354
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
355
|
+
await testInvalidInput();
|
|
356
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
357
|
+
await testMissingLoRA();
|
|
358
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
359
|
+
await testConnectionError();
|
|
360
|
+
console.log("\n" + "=".repeat(80));
|
|
361
|
+
console.log("ALL TESTS COMPLETED");
|
|
362
|
+
console.log("=".repeat(80) + "\n");
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
console.error("Fatal error during tests:", error);
|
|
366
|
+
}
|
|
367
|
+
finally {
|
|
368
|
+
await pool.shutdown();
|
|
369
|
+
process.exit(0);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
// Run the tests
|
|
373
|
+
runAllTests();
|
|
374
|
+
//# sourceMappingURL=error-classification-tests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-classification-tests.js","sourceRoot":"","sources":["../../../src/multipool/tests/error-classification-tests.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-forwarding-demo.d.ts","sourceRoot":"","sources":["../../../src/multipool/tests/event-forwarding-demo.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|