2dai-sdk 1.4.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/LICENSE +21 -0
- package/README.md +1287 -0
- package/dist/client.d.ts +222 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +643 -0
- package/dist/client.js.map +1 -0
- package/dist/constants.d.ts +175 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +260 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +438 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1,643 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 2DAI SDK Client
|
|
4
|
+
* Official TypeScript/JavaScript client for 2DAI API
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.TwoDAIClient = void 0;
|
|
11
|
+
exports.createClient = createClient;
|
|
12
|
+
const ws_1 = __importDefault(require("ws"));
|
|
13
|
+
const axios_1 = __importDefault(require("axios"));
|
|
14
|
+
const constants_1 = require("./constants");
|
|
15
|
+
/**
|
|
16
|
+
* Main 2DAI SDK Client
|
|
17
|
+
*/
|
|
18
|
+
class TwoDAIClient {
|
|
19
|
+
apiKey;
|
|
20
|
+
baseUrl;
|
|
21
|
+
timeout;
|
|
22
|
+
debug;
|
|
23
|
+
axios;
|
|
24
|
+
// WebSocket properties
|
|
25
|
+
ws = null;
|
|
26
|
+
wsPingInterval = null;
|
|
27
|
+
wsReconnectAttempts = 0;
|
|
28
|
+
wsPendingRequests = new Map();
|
|
29
|
+
wsShouldReconnect = true;
|
|
30
|
+
wsAuthenticated = false;
|
|
31
|
+
wsConnecting = false;
|
|
32
|
+
wsClosingIntentionally = false;
|
|
33
|
+
wsOptions;
|
|
34
|
+
/**
|
|
35
|
+
* Create a new 2DAI SDK client
|
|
36
|
+
*
|
|
37
|
+
* @param options Client configuration options
|
|
38
|
+
*/
|
|
39
|
+
constructor(options) {
|
|
40
|
+
this.apiKey = options.apiKey;
|
|
41
|
+
this.baseUrl = options.baseUrl || constants_1.DEFAULT_BASE_URL;
|
|
42
|
+
this.timeout = options.timeout || constants_1.DEFAULT_TIMEOUT;
|
|
43
|
+
this.debug = options.debug || false;
|
|
44
|
+
// Initialize WebSocket options
|
|
45
|
+
this.wsOptions = {
|
|
46
|
+
autoReconnect: options.wsAutoReconnect ?? constants_1.WS_DEFAULTS.AUTO_RECONNECT,
|
|
47
|
+
reconnectIntervalMs: options.wsReconnectIntervalMs ?? constants_1.WS_DEFAULTS.RECONNECT_INTERVAL_MS,
|
|
48
|
+
maxReconnectDelayMs: options.wsMaxReconnectDelayMs ?? constants_1.WS_DEFAULTS.MAX_RECONNECT_DELAY_MS,
|
|
49
|
+
pingIntervalMs: options.wsPingIntervalMs ?? constants_1.WS_DEFAULTS.PING_INTERVAL_MS
|
|
50
|
+
};
|
|
51
|
+
// Validate API key format
|
|
52
|
+
if (!this.apiKey || !this.apiKey.startsWith('2dai_pk_')) {
|
|
53
|
+
throw new Error('Invalid API key format. Must start with "2dai_pk_"');
|
|
54
|
+
}
|
|
55
|
+
// Create axios instance with default config
|
|
56
|
+
this.axios = axios_1.default.create({
|
|
57
|
+
baseURL: this.baseUrl,
|
|
58
|
+
timeout: this.timeout,
|
|
59
|
+
headers: {
|
|
60
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
61
|
+
'Content-Type': 'application/json'
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
// Add response interceptor for error handling
|
|
65
|
+
this.axios.interceptors.response.use(response => response, error => {
|
|
66
|
+
if (error.response) {
|
|
67
|
+
const apiError = error.response.data.error || {
|
|
68
|
+
code: 'UNKNOWN_ERROR',
|
|
69
|
+
message: error.message
|
|
70
|
+
};
|
|
71
|
+
throw new Error(`[${apiError.code}] ${apiError.message}`);
|
|
72
|
+
}
|
|
73
|
+
throw error;
|
|
74
|
+
});
|
|
75
|
+
this.log('Client initialized', { baseUrl: this.baseUrl });
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Log debug messages
|
|
79
|
+
*/
|
|
80
|
+
log(message, data) {
|
|
81
|
+
if (this.debug) {
|
|
82
|
+
console.log(`[2DAI SDK] ${message}`, data || '');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Generate an image from a text prompt
|
|
87
|
+
*/
|
|
88
|
+
async generateImage(options) {
|
|
89
|
+
this.log('Generating image', { prompt: options.prompt });
|
|
90
|
+
try {
|
|
91
|
+
const response = await this.axios.post('/api/v1/generation/image', {
|
|
92
|
+
prompt: options.prompt,
|
|
93
|
+
negativePrompt: options.negativePrompt,
|
|
94
|
+
style: typeof options.style === 'string' ? options.style : options.style?.id,
|
|
95
|
+
format: typeof options.format === 'string' ? options.format : options.format?.id,
|
|
96
|
+
width: options.width,
|
|
97
|
+
height: options.height,
|
|
98
|
+
seed: options.seed
|
|
99
|
+
});
|
|
100
|
+
return {
|
|
101
|
+
success: response.data.success,
|
|
102
|
+
imageId: response.data.data.imageId,
|
|
103
|
+
width: response.data.data.width,
|
|
104
|
+
height: response.data.data.height,
|
|
105
|
+
seed: response.data.data.seed
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
this.log('Image generation error', error.message);
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Edit an existing image (img2img)
|
|
115
|
+
* Supports optional width/height for resizing the output image
|
|
116
|
+
* Note: The API does not support strength parameter - it uses fixed settings
|
|
117
|
+
*/
|
|
118
|
+
async editImage(imageId, options) {
|
|
119
|
+
this.log('Editing image', {
|
|
120
|
+
imageId,
|
|
121
|
+
prompt: options.prompt,
|
|
122
|
+
...(options.width !== undefined && { width: options.width }),
|
|
123
|
+
...(options.height !== undefined && { height: options.height }),
|
|
124
|
+
...(options.resizePad !== undefined && { resizePad: options.resizePad })
|
|
125
|
+
});
|
|
126
|
+
try {
|
|
127
|
+
const response = await this.axios.post('/api/v1/generation/image/edit', {
|
|
128
|
+
imageId,
|
|
129
|
+
prompt: options.prompt,
|
|
130
|
+
negativePrompt: options.negativePrompt,
|
|
131
|
+
seed: options.seed,
|
|
132
|
+
width: options.width,
|
|
133
|
+
height: options.height,
|
|
134
|
+
resizePad: options.resizePad
|
|
135
|
+
});
|
|
136
|
+
return {
|
|
137
|
+
success: response.data.success,
|
|
138
|
+
imageId: response.data.data.imageId,
|
|
139
|
+
width: response.data.data.width || 0,
|
|
140
|
+
height: response.data.data.height || 0,
|
|
141
|
+
seed: response.data.data.seed
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
this.log('Image edit error', error.message);
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* AI upscale an image (img2ximg)
|
|
151
|
+
* Uses AI to generate prompt automatically - no user prompt needed
|
|
152
|
+
*
|
|
153
|
+
* @param imageId Source image ID from CDN
|
|
154
|
+
* @param options Upscale options (factor: 2-4, default: 2)
|
|
155
|
+
*/
|
|
156
|
+
async upscaleImage(imageId, options = {}) {
|
|
157
|
+
this.log('Upscaling image', { imageId, factor: options.factor ?? 2 });
|
|
158
|
+
if (!imageId) {
|
|
159
|
+
throw new Error('imageId is required for upscaling');
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
const response = await this.axios.post('/api/v1/generation/image/upscale', {
|
|
163
|
+
imageId,
|
|
164
|
+
factor: options.factor ?? 2,
|
|
165
|
+
seed: options.seed
|
|
166
|
+
});
|
|
167
|
+
return {
|
|
168
|
+
success: response.data.success,
|
|
169
|
+
imageId: response.data.data.imageId,
|
|
170
|
+
width: response.data.data.width || 0,
|
|
171
|
+
height: response.data.data.height || 0,
|
|
172
|
+
seed: response.data.data.seed
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
this.log('Upscale error', error.message);
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Generate a video from an image
|
|
182
|
+
*/
|
|
183
|
+
async generateVideo(options) {
|
|
184
|
+
this.log('Generating video', { imageId: options.imageId, duration: options.duration });
|
|
185
|
+
if (!options.imageId) {
|
|
186
|
+
throw new Error('imageId is required for video generation');
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
const response = await this.axios.post('/api/v1/generation/video', {
|
|
190
|
+
imageId: options.imageId,
|
|
191
|
+
duration: options.duration ?? 5,
|
|
192
|
+
fps: options.fps ?? 16
|
|
193
|
+
});
|
|
194
|
+
return {
|
|
195
|
+
success: response.data.success,
|
|
196
|
+
videoId: response.data.data.videoId,
|
|
197
|
+
duration: response.data.data.duration,
|
|
198
|
+
fps: response.data.data.fps
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
this.log('Video generation error', error.message);
|
|
203
|
+
throw error;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Generate text using LLM
|
|
208
|
+
*/
|
|
209
|
+
async generateText(options) {
|
|
210
|
+
this.log('Generating text', {
|
|
211
|
+
prompt: options.prompt,
|
|
212
|
+
...(options.imageId && { imageId: options.imageId })
|
|
213
|
+
});
|
|
214
|
+
try {
|
|
215
|
+
const response = await this.axios.post('/api/v1/llm/generate', {
|
|
216
|
+
prompt: options.prompt,
|
|
217
|
+
system: options.system,
|
|
218
|
+
memory: options.memory,
|
|
219
|
+
jsonFormat: options.jsonFormat,
|
|
220
|
+
jsonTemplate: options.jsonTemplate,
|
|
221
|
+
useRandomSeed: options.useRandomSeed,
|
|
222
|
+
askKnowledge: options.askKnowledge,
|
|
223
|
+
useMarkdown: options.useMarkdown,
|
|
224
|
+
imageId: options.imageId
|
|
225
|
+
});
|
|
226
|
+
const llmData = response.data.data || {};
|
|
227
|
+
// Build response
|
|
228
|
+
const result = {
|
|
229
|
+
success: response.data.success,
|
|
230
|
+
response: llmData.json
|
|
231
|
+
? JSON.stringify(llmData.json)
|
|
232
|
+
: (llmData.text || ''),
|
|
233
|
+
inputTokens: llmData.inputTokens,
|
|
234
|
+
outputTokens: llmData.outputTokens,
|
|
235
|
+
totalTokens: llmData.tokensUsed
|
|
236
|
+
};
|
|
237
|
+
// Add parsed JSON if jsonFormat was requested
|
|
238
|
+
if (options.jsonFormat && llmData.json) {
|
|
239
|
+
result.json = llmData.json;
|
|
240
|
+
}
|
|
241
|
+
return result;
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
this.log('Text generation error', error.message);
|
|
245
|
+
throw error;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get API key settings
|
|
250
|
+
*/
|
|
251
|
+
async getSettings() {
|
|
252
|
+
this.log('Getting API key settings');
|
|
253
|
+
try {
|
|
254
|
+
const response = await this.axios.get('/api/v1/settings');
|
|
255
|
+
return response.data.data;
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
throw new Error(`Failed to get settings: ${error.message}`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Update API key watermark
|
|
263
|
+
*/
|
|
264
|
+
async updateWatermark(watermarkCdnId) {
|
|
265
|
+
this.log('Updating watermark', { watermarkCdnId });
|
|
266
|
+
try {
|
|
267
|
+
const response = await this.axios.put('/api/v1/settings', {
|
|
268
|
+
watermarkCdnId
|
|
269
|
+
});
|
|
270
|
+
return response.data.success;
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
throw new Error(`Failed to update watermark: ${error.message}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Check rate limits for all operations
|
|
278
|
+
*/
|
|
279
|
+
async checkLimits() {
|
|
280
|
+
this.log('Checking rate limits');
|
|
281
|
+
try {
|
|
282
|
+
const response = await this.axios.get('/api/v1/settings/rate-limits');
|
|
283
|
+
return response.data.data;
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
throw new Error(`Failed to check limits: ${error.message}`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Get health status of the API
|
|
291
|
+
*/
|
|
292
|
+
async health() {
|
|
293
|
+
this.log('Checking health');
|
|
294
|
+
try {
|
|
295
|
+
const response = await this.axios.get('/health');
|
|
296
|
+
return response.data;
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
throw new Error(`Failed to check health: ${error.message}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// ============================================================================
|
|
303
|
+
// WebSocket Methods
|
|
304
|
+
// ============================================================================
|
|
305
|
+
/**
|
|
306
|
+
* Connect to WebSocket server with auto-reconnect support
|
|
307
|
+
*/
|
|
308
|
+
async wsConnect() {
|
|
309
|
+
if (this.wsConnecting) {
|
|
310
|
+
this.log('WebSocket connection already in progress');
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
if (this.ws && this.ws.readyState === ws_1.default.OPEN) {
|
|
314
|
+
this.log('WebSocket already connected');
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
this.wsConnecting = true;
|
|
318
|
+
this.wsShouldReconnect = true;
|
|
319
|
+
const wsUrl = this.baseUrl.replace('http://', 'ws://').replace('https://', 'wss://') + '/ws/generation';
|
|
320
|
+
this.log('Connecting to WebSocket', { url: wsUrl });
|
|
321
|
+
return new Promise((resolve, reject) => {
|
|
322
|
+
this.ws = new ws_1.default(wsUrl);
|
|
323
|
+
this.ws.on('open', () => {
|
|
324
|
+
this.log('WebSocket connected, authenticating...');
|
|
325
|
+
this.wsAuthenticate();
|
|
326
|
+
});
|
|
327
|
+
this.ws.on('message', (data) => {
|
|
328
|
+
this.wsHandleMessage(data, resolve);
|
|
329
|
+
});
|
|
330
|
+
this.ws.on('close', (code) => {
|
|
331
|
+
this.wsConnecting = false;
|
|
332
|
+
this.wsHandleClose(code);
|
|
333
|
+
});
|
|
334
|
+
this.ws.on('error', (error) => {
|
|
335
|
+
this.wsConnecting = false;
|
|
336
|
+
this.log('WebSocket error', error.message);
|
|
337
|
+
if (!this.wsAuthenticated) {
|
|
338
|
+
reject(error);
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
this.ws.on('pong', () => {
|
|
342
|
+
this.log('Pong received from server');
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Authenticate with the WebSocket server
|
|
348
|
+
*/
|
|
349
|
+
wsAuthenticate() {
|
|
350
|
+
if (this.ws && this.ws.readyState === ws_1.default.OPEN) {
|
|
351
|
+
this.ws.send(JSON.stringify({
|
|
352
|
+
type: 'auth',
|
|
353
|
+
data: { apiKey: this.apiKey }
|
|
354
|
+
}));
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Handle incoming WebSocket messages
|
|
359
|
+
*/
|
|
360
|
+
wsHandleMessage(data, connectResolve) {
|
|
361
|
+
try {
|
|
362
|
+
const message = JSON.parse(data.toString());
|
|
363
|
+
this.log('WebSocket message', { type: message.type });
|
|
364
|
+
switch (message.type) {
|
|
365
|
+
case 'auth_success':
|
|
366
|
+
this.wsAuthenticated = true;
|
|
367
|
+
this.wsConnecting = false;
|
|
368
|
+
this.wsReconnectAttempts = 0;
|
|
369
|
+
this.wsStartPing();
|
|
370
|
+
this.log('WebSocket authenticated');
|
|
371
|
+
if (connectResolve) {
|
|
372
|
+
connectResolve();
|
|
373
|
+
}
|
|
374
|
+
break;
|
|
375
|
+
case 'error':
|
|
376
|
+
if (message.data?.code === 'AUTH_ERROR') {
|
|
377
|
+
this.log('WebSocket auth failed', message.data);
|
|
378
|
+
}
|
|
379
|
+
// Handle pending request errors
|
|
380
|
+
this.wsHandleError(message);
|
|
381
|
+
break;
|
|
382
|
+
case 'generation_complete':
|
|
383
|
+
this.wsHandleResult(message);
|
|
384
|
+
break;
|
|
385
|
+
case 'pong':
|
|
386
|
+
// Application-level pong (in addition to WebSocket pong)
|
|
387
|
+
break;
|
|
388
|
+
default:
|
|
389
|
+
this.log('Unhandled WebSocket message type', message.type);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
catch (error) {
|
|
393
|
+
this.log('Failed to parse WebSocket message', error);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Handle generation result
|
|
398
|
+
*/
|
|
399
|
+
wsHandleResult(message) {
|
|
400
|
+
const requestId = message.requestId;
|
|
401
|
+
if (requestId && this.wsPendingRequests.has(requestId)) {
|
|
402
|
+
const pending = this.wsPendingRequests.get(requestId);
|
|
403
|
+
this.wsPendingRequests.delete(requestId);
|
|
404
|
+
pending.resolve(message.data);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Handle error response
|
|
409
|
+
*/
|
|
410
|
+
wsHandleError(message) {
|
|
411
|
+
const requestId = message.requestId;
|
|
412
|
+
if (requestId && this.wsPendingRequests.has(requestId)) {
|
|
413
|
+
const pending = this.wsPendingRequests.get(requestId);
|
|
414
|
+
this.wsPendingRequests.delete(requestId);
|
|
415
|
+
pending.reject(new Error(message.data?.message || 'Unknown error'));
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Start ping interval to keep connection alive
|
|
420
|
+
*/
|
|
421
|
+
wsStartPing() {
|
|
422
|
+
this.wsStopPing(); // Clear any existing interval
|
|
423
|
+
this.wsPingInterval = setInterval(() => {
|
|
424
|
+
if (this.ws && this.ws.readyState === ws_1.default.OPEN) {
|
|
425
|
+
this.ws.ping();
|
|
426
|
+
this.log('Ping sent to server');
|
|
427
|
+
}
|
|
428
|
+
}, this.wsOptions.pingIntervalMs);
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Stop ping interval
|
|
432
|
+
*/
|
|
433
|
+
wsStopPing() {
|
|
434
|
+
if (this.wsPingInterval) {
|
|
435
|
+
clearInterval(this.wsPingInterval);
|
|
436
|
+
this.wsPingInterval = null;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Handle WebSocket close
|
|
441
|
+
*/
|
|
442
|
+
async wsHandleClose(code) {
|
|
443
|
+
this.wsStopPing();
|
|
444
|
+
this.wsAuthenticated = false;
|
|
445
|
+
if (!this.wsClosingIntentionally) {
|
|
446
|
+
this.log('WebSocket closed', { code });
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
449
|
+
this.wsClosingIntentionally = false; // Reset for next use
|
|
450
|
+
}
|
|
451
|
+
// Reconnect if not intentional close and auto-reconnect is enabled
|
|
452
|
+
if (code !== 1000 && this.wsShouldReconnect && this.wsOptions.autoReconnect) {
|
|
453
|
+
await this.wsReconnectWithBackoff();
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Reconnect with exponential backoff
|
|
458
|
+
*/
|
|
459
|
+
async wsReconnectWithBackoff() {
|
|
460
|
+
const delay = Math.min(this.wsOptions.reconnectIntervalMs * Math.pow(2, this.wsReconnectAttempts), this.wsOptions.maxReconnectDelayMs);
|
|
461
|
+
this.wsReconnectAttempts++;
|
|
462
|
+
this.log(`Reconnecting in ${delay}ms (attempt ${this.wsReconnectAttempts})`);
|
|
463
|
+
await new Promise(r => setTimeout(r, delay));
|
|
464
|
+
try {
|
|
465
|
+
await this.wsConnect();
|
|
466
|
+
this.wsRetryPending();
|
|
467
|
+
}
|
|
468
|
+
catch (error) {
|
|
469
|
+
this.log('Reconnection failed', error);
|
|
470
|
+
// Will trigger another reconnect via close handler
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Retry pending requests after reconnection
|
|
475
|
+
*/
|
|
476
|
+
wsRetryPending() {
|
|
477
|
+
for (const [id, { request }] of this.wsPendingRequests) {
|
|
478
|
+
this.log(`Retrying request ${id}`);
|
|
479
|
+
if (this.ws && this.ws.readyState === ws_1.default.OPEN) {
|
|
480
|
+
this.ws.send(JSON.stringify(request));
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Reject all pending requests
|
|
486
|
+
*/
|
|
487
|
+
wsRejectPending(reason) {
|
|
488
|
+
for (const [, { reject }] of this.wsPendingRequests) {
|
|
489
|
+
reject(new Error(reason));
|
|
490
|
+
}
|
|
491
|
+
this.wsPendingRequests.clear();
|
|
492
|
+
}
|
|
493
|
+
// Implementation
|
|
494
|
+
async wsSend(type, data, timeout = 180000) {
|
|
495
|
+
if (!this.ws || this.ws.readyState !== ws_1.default.OPEN) {
|
|
496
|
+
throw new Error('WebSocket not connected. Call wsConnect() first.');
|
|
497
|
+
}
|
|
498
|
+
const requestId = `req_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
|
|
499
|
+
const request = { type, data, requestId };
|
|
500
|
+
return new Promise((resolve, reject) => {
|
|
501
|
+
// Set timeout
|
|
502
|
+
const timer = setTimeout(() => {
|
|
503
|
+
this.wsPendingRequests.delete(requestId);
|
|
504
|
+
reject(new Error('Request timeout'));
|
|
505
|
+
}, timeout);
|
|
506
|
+
// Track pending request
|
|
507
|
+
this.wsPendingRequests.set(requestId, {
|
|
508
|
+
request,
|
|
509
|
+
resolve: (value) => {
|
|
510
|
+
clearTimeout(timer);
|
|
511
|
+
resolve(value);
|
|
512
|
+
},
|
|
513
|
+
reject: (reason) => {
|
|
514
|
+
clearTimeout(timer);
|
|
515
|
+
reject(reason);
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
// Send request
|
|
519
|
+
this.ws.send(JSON.stringify(request));
|
|
520
|
+
this.log('WebSocket request sent', { type, requestId });
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Generate an image via WebSocket (text2img or img2img)
|
|
525
|
+
*
|
|
526
|
+
* @example Text-to-Image
|
|
527
|
+
* ```typescript
|
|
528
|
+
* const result = await client.wsGenerateImage({
|
|
529
|
+
* prompt: 'A sunset over mountains',
|
|
530
|
+
* style: 'realistic',
|
|
531
|
+
* format: 'landscape'
|
|
532
|
+
* });
|
|
533
|
+
* console.log(result.result.imageId);
|
|
534
|
+
* ```
|
|
535
|
+
*
|
|
536
|
+
* @example Image-to-Image (edit)
|
|
537
|
+
* ```typescript
|
|
538
|
+
* const result = await client.wsGenerateImage({
|
|
539
|
+
* imageId: 'existing-image-id',
|
|
540
|
+
* prompt: 'add dramatic lighting'
|
|
541
|
+
* });
|
|
542
|
+
* ```
|
|
543
|
+
*/
|
|
544
|
+
async wsGenerateImage(data, timeout) {
|
|
545
|
+
return this.wsSend('generate_image', data, timeout);
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Generate a video from an image via WebSocket
|
|
549
|
+
*
|
|
550
|
+
* @example
|
|
551
|
+
* ```typescript
|
|
552
|
+
* const result = await client.wsGenerateVideo({
|
|
553
|
+
* imageId: 'source-image-id',
|
|
554
|
+
* duration: 5,
|
|
555
|
+
* fps: 16
|
|
556
|
+
* });
|
|
557
|
+
* console.log(result.result.videoId);
|
|
558
|
+
* ```
|
|
559
|
+
*/
|
|
560
|
+
async wsGenerateVideo(data, timeout) {
|
|
561
|
+
return this.wsSend('generate_video', data, timeout);
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* Generate text via LLM over WebSocket
|
|
565
|
+
*
|
|
566
|
+
* @example Basic
|
|
567
|
+
* ```typescript
|
|
568
|
+
* const result = await client.wsGenerateLlm({
|
|
569
|
+
* prompt: 'Explain TypeScript'
|
|
570
|
+
* });
|
|
571
|
+
* console.log(result.result.text);
|
|
572
|
+
* ```
|
|
573
|
+
*
|
|
574
|
+
* @example With system prompt and JSON output
|
|
575
|
+
* ```typescript
|
|
576
|
+
* const result = await client.wsGenerateLlm({
|
|
577
|
+
* prompt: 'List 3 programming languages',
|
|
578
|
+
* system: 'You are a helpful assistant',
|
|
579
|
+
* jsonFormat: true,
|
|
580
|
+
* jsonTemplate: { languages: 'array' }
|
|
581
|
+
* });
|
|
582
|
+
* console.log(result.result.json);
|
|
583
|
+
* ```
|
|
584
|
+
*/
|
|
585
|
+
async wsGenerateLlm(data, timeout) {
|
|
586
|
+
return this.wsSend('generate_llm', data, timeout);
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* AI upscale an image via WebSocket (img2ximg)
|
|
590
|
+
* Uses AI to generate prompt automatically - no user prompt needed
|
|
591
|
+
*
|
|
592
|
+
* @example
|
|
593
|
+
* ```typescript
|
|
594
|
+
* const result = await client.wsUpscaleImage({
|
|
595
|
+
* imageId: 'source-image-id',
|
|
596
|
+
* factor: 2
|
|
597
|
+
* });
|
|
598
|
+
* console.log(result.result.imageId, result.result.width, result.result.height);
|
|
599
|
+
* ```
|
|
600
|
+
*/
|
|
601
|
+
async wsUpscaleImage(data, timeout) {
|
|
602
|
+
return this.wsSend('generate_upscale', data, timeout);
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Check if WebSocket is connected
|
|
606
|
+
*/
|
|
607
|
+
wsIsConnected() {
|
|
608
|
+
return this.ws !== null && this.ws.readyState === ws_1.default.OPEN && this.wsAuthenticated;
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
611
|
+
* Close WebSocket connection and cleanup
|
|
612
|
+
*/
|
|
613
|
+
async close() {
|
|
614
|
+
this.log('Closing client');
|
|
615
|
+
this.wsShouldReconnect = false;
|
|
616
|
+
this.wsStopPing();
|
|
617
|
+
this.wsRejectPending('Client closed');
|
|
618
|
+
// Mark as intentional close to suppress logging
|
|
619
|
+
this.wsClosingIntentionally = true;
|
|
620
|
+
if (this.ws) {
|
|
621
|
+
this.ws.close(1000, 'Client closed');
|
|
622
|
+
this.ws = null;
|
|
623
|
+
}
|
|
624
|
+
this.wsAuthenticated = false;
|
|
625
|
+
this.wsConnecting = false;
|
|
626
|
+
this.wsReconnectAttempts = 0;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
exports.TwoDAIClient = TwoDAIClient;
|
|
630
|
+
/**
|
|
631
|
+
* Create a new 2DAI SDK client
|
|
632
|
+
*
|
|
633
|
+
* @param apiKey Your 2DAI API key
|
|
634
|
+
* @param options Optional client configuration
|
|
635
|
+
*/
|
|
636
|
+
function createClient(apiKey, options) {
|
|
637
|
+
return new TwoDAIClient({
|
|
638
|
+
apiKey,
|
|
639
|
+
...options
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
exports.default = TwoDAIClient;
|
|
643
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|