@inductiv/node-red-openai-api 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,11 +9,11 @@
9
9
 
10
10
  _@inductiv/node-red-openai-api_ offers a versatile and configurable Node-RED node, designed specifically for seamless integration with OpenAI's advanced platform services. It empowers you to effortlessly connect and orchestrate various OpenAI functionalities, leveraging the full power of Node-RED's sophisticated application nodes. Whether you're aiming to enhance your workflows with cutting-edge AI capabilities or create innovative applications, this node serves as your gateway to harnessing the latest in AI technology from OpenAI, all within the intuitive and flexible environment of Node-RED.
11
11
 
12
- ## New in Version 0.5.0
12
+ ## New in Version 0.7.0
13
13
 
14
- - Chat completion streaming responses are now returned in the `msg.payload` object, consistent with other
15
- endpont response structures.
16
- - Bug fixes.
14
+ - The ```createChatCompletion``` endpoint now retains top-level message (```msg```) properties in responses. This means that all custom message properties--aside from the `msg.payload` object--are returned from ```createChatCompletion``` requests.
15
+
16
+ Please report any issues [here on Github](https://github.com/allanbunch/node-red-openai-api/issues).
17
17
 
18
18
  ## Key Features
19
19
 
@@ -92,21 +92,15 @@ I very much appreciate community input and invite everyone to shape the future o
92
92
 
93
93
  ### Engage in Various Discussions
94
94
 
95
- - **Announcements**: Stay updated with the latest project news.
96
- - **General**: Share thoughts or seek advice on broader topics.
97
- - **Ideas**: Propose new features or improvements.
98
- - **Polls**: Participate in polls to influence project decisions.
99
- - **Q&A**: Get answers to your questions and share your expertise.
100
- - **Show and Tell**: Showcase your creative implementations and inspire others.
95
+ - **[Announcements](https://github.com/allanbunch/node-red-openai-api/discussions/categories/announcements)**: Stay updated with the latest project news.
96
+ - **[General](https://github.com/allanbunch/node-red-openai-api/discussions/categories/general)**: Share thoughts or seek advice on broader topics.
97
+ - **[Ideas](https://github.com/allanbunch/node-red-openai-api/discussions/categories/ideas)**: Propose new features or improvements.
98
+ - **[Polls](https://github.com/allanbunch/node-red-openai-api/discussions/categories/polls)**: Participate in polls to influence project decisions.
99
+ - **[Q&A](https://github.com/allanbunch/node-red-openai-api/discussions/categories/q-a)**: Get answers to your questions and share your expertise.
100
+ - **[Show and Tell](https://github.com/allanbunch/node-red-openai-api/discussions/categories/show-and-tell)**: Showcase your creative implementations and inspire others.
101
101
 
102
102
  Join the conversation [here](https://github.com/allanbunch/node-red-openai-api/discussions) and let's build a vibrant and collaborative community together!
103
103
 
104
104
  ## License
105
105
 
106
106
  [MIT](./LICENSE)
107
-
108
- ## Acknowledgements
109
-
110
- - [node-red-nodegen](https://github.com/node-red/node-red-nodegen)
111
- - For boilerplate code generation, though the auto-generated code has been largely refactored.
112
- - **Note:** This package uses `axios` in place of node-red-nodegen's `request` default.
package/lib.js CHANGED
@@ -17,10 +17,10 @@ let OpenaiApi = (function () {
17
17
 
18
18
  const openai = new OpenAI(clientParams);
19
19
  const response = await openai.chat.completions.create({
20
- ...parameters.payload,
20
+ ...parameters.msg.payload,
21
21
  });
22
22
 
23
- if (parameters.payload.stream) {
23
+ if (parameters.msg.payload.stream) {
24
24
  node.status({
25
25
  fill: "green",
26
26
  shape: "dot",
@@ -28,8 +28,9 @@ let OpenaiApi = (function () {
28
28
  });
29
29
  for await (const chunk of response) {
30
30
  if (typeof chunk === "object") {
31
- let payload = { payload: chunk };
32
- node.send(payload);
31
+ let msg = parameters.msg;
32
+ msg.payload = chunk;
33
+ node.send(msg);
33
34
  }
34
35
  }
35
36
  node.status({});
@@ -47,7 +48,7 @@ let OpenaiApi = (function () {
47
48
 
48
49
  const openai = new OpenAI(clientParams);
49
50
  const response = await openai.images.generate({
50
- ...parameters.payload,
51
+ ...parameters.msg.payload,
51
52
  });
52
53
 
53
54
  return response;
@@ -61,13 +62,17 @@ let OpenaiApi = (function () {
61
62
  };
62
63
  const openai = new OpenAI(clientParams);
63
64
 
64
- parameters.payload.image = fs.createReadStream(parameters.payload.image);
65
- if (parameters.payload.mask) {
66
- parameters.payload.mask = fs.createReadStream(parameters.payload.mask);
65
+ parameters.msg.payload.image = fs.createReadStream(
66
+ parameters.msg.payload.image,
67
+ );
68
+ if (parameters.msg.payload.mask) {
69
+ parameters.msg.payload.mask = fs.createReadStream(
70
+ parameters.msg.payload.mask,
71
+ );
67
72
  }
68
73
 
69
74
  const response = await openai.images.edit({
70
- ...parameters.payload,
75
+ ...parameters.msg.payload,
71
76
  });
72
77
 
73
78
  return response;
@@ -81,9 +86,11 @@ let OpenaiApi = (function () {
81
86
  };
82
87
  const openai = new OpenAI(clientParams);
83
88
 
84
- parameters.payload.image = fs.createReadStream(parameters.payload.image);
89
+ parameters.msg.payload.image = fs.createReadStream(
90
+ parameters.msg.payload.image,
91
+ );
85
92
  const response = await openai.images.createVariation({
86
- ...parameters.payload,
93
+ ...parameters.msg.payload,
87
94
  });
88
95
 
89
96
  return response;
@@ -98,7 +105,7 @@ let OpenaiApi = (function () {
98
105
  const openai = new OpenAI(clientParams);
99
106
 
100
107
  const response = await openai.embeddings.create({
101
- ...parameters.payload,
108
+ ...parameters.msg.payload,
102
109
  });
103
110
 
104
111
  return response;
@@ -112,7 +119,9 @@ let OpenaiApi = (function () {
112
119
  };
113
120
  const openai = new OpenAI(clientParams);
114
121
 
115
- const audio = await openai.audio.speech.create({ ...parameters.payload });
122
+ const audio = await openai.audio.speech.create({
123
+ ...parameters.msg.payload,
124
+ });
116
125
  const response = Buffer.from(await audio.arrayBuffer());
117
126
 
118
127
  return response;
@@ -126,10 +135,12 @@ let OpenaiApi = (function () {
126
135
  };
127
136
  const openai = new OpenAI(clientParams);
128
137
 
129
- parameters.payload.file = fs.createReadStream(parameters.payload.file);
138
+ parameters.msg.payload.file = fs.createReadStream(
139
+ parameters.msg.payload.file,
140
+ );
130
141
 
131
142
  const response = await openai.audio.transcriptions.create({
132
- ...parameters.payload,
143
+ ...parameters.msg.payload,
133
144
  });
134
145
 
135
146
  return response;
@@ -143,9 +154,11 @@ let OpenaiApi = (function () {
143
154
  };
144
155
  const openai = new OpenAI(clientParams);
145
156
 
146
- parameters.payload.file = fs.createReadStream(parameters.payload.file);
157
+ parameters.msg.payload.file = fs.createReadStream(
158
+ parameters.msg.payload.file,
159
+ );
147
160
  const response = await openai.audio.translations.create({
148
- ...parameters.payload,
161
+ ...parameters.msg.payload,
149
162
  });
150
163
 
151
164
  return response;
@@ -160,7 +173,7 @@ let OpenaiApi = (function () {
160
173
  const openai = new OpenAI(clientParams);
161
174
 
162
175
  const list = await openai.files.list({
163
- ...parameters.payload,
176
+ ...parameters.msg.payload,
164
177
  });
165
178
 
166
179
  let files = [];
@@ -179,13 +192,16 @@ let OpenaiApi = (function () {
179
192
  };
180
193
  const openai = new OpenAI(clientParams);
181
194
 
182
- parameters.payload.file = fs.createReadStream(parameters.payload.file);
195
+ parameters.msg.payload.file = fs.createReadStream(
196
+ parameters.msg.payload.file,
197
+ );
183
198
  const response = await openai.files.create({
184
- ...parameters.payload,
199
+ ...parameters.msg.payload,
185
200
  });
186
201
 
187
202
  return response;
188
203
  }
204
+
189
205
  async deleteFile(parameters) {
190
206
  const clientParams = {
191
207
  apiKey: parameters.apiKey,
@@ -195,11 +211,12 @@ let OpenaiApi = (function () {
195
211
  const openai = new OpenAI(clientParams);
196
212
 
197
213
  const response = await openai.files.del({
198
- ...parameters.payload,
214
+ ...parameters.msg.payload,
199
215
  });
200
216
 
201
217
  return response;
202
218
  }
219
+
203
220
  async retrieveFile(parameters) {
204
221
  const clientParams = {
205
222
  apiKey: parameters.apiKey,
@@ -208,15 +225,16 @@ let OpenaiApi = (function () {
208
225
  };
209
226
  const openai = new OpenAI(clientParams);
210
227
 
211
- const file_id = parameters.payload.file_id;
212
- delete parameters.payload.file_id;
228
+ const file_id = parameters.msg.payload.file_id;
229
+ delete parameters.msg.payload.file_id;
213
230
 
214
231
  const response = await openai.files.retrieve(file_id, {
215
- ...parameters.payload,
232
+ ...parameters.msg.payload,
216
233
  });
217
234
 
218
235
  return response;
219
236
  }
237
+
220
238
  async downloadFile(parameters) {
221
239
  const clientParams = {
222
240
  apiKey: parameters.apiKey,
@@ -225,15 +243,16 @@ let OpenaiApi = (function () {
225
243
  };
226
244
  const openai = new OpenAI(clientParams);
227
245
 
228
- const file_id = parameters.payload.file_id;
229
- delete parameters.payload.file_id;
246
+ const file_id = parameters.msg.payload.file_id;
247
+ delete parameters.msg.payload.file_id;
230
248
 
231
249
  const response = await openai.files.retrieveContent(file_id, {
232
- ...parameters.payload,
250
+ ...parameters.msg.payload,
233
251
  });
234
252
 
235
253
  return response;
236
254
  }
255
+
237
256
  async createFineTuningJob(parameters) {
238
257
  const clientParams = {
239
258
  apiKey: parameters.apiKey,
@@ -243,11 +262,12 @@ let OpenaiApi = (function () {
243
262
  const openai = new OpenAI(clientParams);
244
263
 
245
264
  const response = await openai.fineTuning.jobs.create({
246
- ...parameters.payload,
265
+ ...parameters.msg.payload,
247
266
  });
248
267
 
249
268
  return response;
250
269
  }
270
+
251
271
  async listPaginatedFineTuningJobs(parameters) {
252
272
  const clientParams = {
253
273
  apiKey: parameters.apiKey,
@@ -257,7 +277,7 @@ let OpenaiApi = (function () {
257
277
  const openai = new OpenAI(clientParams);
258
278
 
259
279
  const list = await openai.fineTuning.jobs.list({
260
- ...parameters.payload,
280
+ ...parameters.msg.payload,
261
281
  });
262
282
 
263
283
  let response = [];
@@ -267,6 +287,7 @@ let OpenaiApi = (function () {
267
287
 
268
288
  return response;
269
289
  }
290
+
270
291
  async retrieveFineTuningJob(parameters) {
271
292
  const clientParams = {
272
293
  apiKey: parameters.apiKey,
@@ -276,11 +297,12 @@ let OpenaiApi = (function () {
276
297
  const openai = new OpenAI(clientParams);
277
298
 
278
299
  const response = await openai.fineTuning.jobs.retrieve(
279
- parameters.payload.fine_tuning_job_id,
300
+ parameters.msg.payload.fine_tuning_job_id,
280
301
  );
281
302
 
282
303
  return response;
283
304
  }
305
+
284
306
  async listFineTuningEvents(parameters) {
285
307
  const clientParams = {
286
308
  apiKey: parameters.apiKey,
@@ -291,13 +313,14 @@ let OpenaiApi = (function () {
291
313
 
292
314
  let response = [];
293
315
  const list = await openai.fineTuning.jobs.listEvents(
294
- parameters.payload.fine_tuning_job_id,
316
+ parameters.msg.payload.fine_tuning_job_id,
295
317
  );
296
318
  for await (const fineTuneEvent of list) {
297
319
  response.push(fineTuneEvent);
298
320
  }
299
321
  return response;
300
322
  }
323
+
301
324
  async cancelFineTuningJob(parameters) {
302
325
  const clientParams = {
303
326
  apiKey: parameters.apiKey,
@@ -307,11 +330,12 @@ let OpenaiApi = (function () {
307
330
  const openai = new OpenAI(clientParams);
308
331
 
309
332
  const response = await openai.fineTuning.jobs.cancel(
310
- parameters.payload.fine_tuning_job_id,
333
+ parameters.msg.payload.fine_tuning_job_id,
311
334
  );
312
335
 
313
336
  return response;
314
337
  }
338
+
315
339
  async listModels(parameters) {
316
340
  const clientParams = {
317
341
  apiKey: parameters.apiKey,
@@ -324,6 +348,7 @@ let OpenaiApi = (function () {
324
348
 
325
349
  return response.body;
326
350
  }
351
+
327
352
  async retrieveModel(parameters) {
328
353
  const clientParams = {
329
354
  apiKey: parameters.apiKey,
@@ -332,11 +357,12 @@ let OpenaiApi = (function () {
332
357
  };
333
358
  const openai = new OpenAI(clientParams);
334
359
 
335
- const model = parameters.payload.model;
360
+ const model = parameters.msg.payload.model;
336
361
  const response = await openai.models.retrieve(model);
337
362
 
338
363
  return response;
339
364
  }
365
+
340
366
  async deleteModel(parameters) {
341
367
  const clientParams = {
342
368
  apiKey: parameters.apiKey,
@@ -345,11 +371,12 @@ let OpenaiApi = (function () {
345
371
  };
346
372
  const openai = new OpenAI(clientParams);
347
373
 
348
- const model = parameters.payload.model;
374
+ const model = parameters.msg.payload.model;
349
375
  const response = await openai.models.del(model);
350
376
 
351
377
  return response;
352
378
  }
379
+
353
380
  async createModeration(parameters) {
354
381
  const clientParams = {
355
382
  apiKey: parameters.apiKey,
@@ -358,9 +385,10 @@ let OpenaiApi = (function () {
358
385
  };
359
386
  const openai = new OpenAI(clientParams);
360
387
 
361
- const response = await openai.moderations.create(parameters.payload);
388
+ const response = await openai.moderations.create(parameters.msg.payload);
362
389
  return response;
363
390
  }
391
+
364
392
  async listAssistants(parameters) {
365
393
  const clientParams = {
366
394
  apiKey: parameters.apiKey,
@@ -370,11 +398,12 @@ let OpenaiApi = (function () {
370
398
  const openai = new OpenAI(clientParams);
371
399
 
372
400
  const response = await openai.beta.assistants.list({
373
- ...parameters.payload,
401
+ ...parameters.msg.payload,
374
402
  });
375
403
 
376
404
  return response.body;
377
405
  }
406
+
378
407
  async createAssistant(parameters) {
379
408
  const clientParams = {
380
409
  apiKey: parameters.apiKey,
@@ -384,11 +413,12 @@ let OpenaiApi = (function () {
384
413
  const openai = new OpenAI(clientParams);
385
414
 
386
415
  const response = await openai.beta.assistants.create({
387
- ...parameters.payload,
416
+ ...parameters.msg.payload,
388
417
  });
389
418
 
390
419
  return response;
391
420
  }
421
+
392
422
  async getAssistant(parameters) {
393
423
  const clientParams = {
394
424
  apiKey: parameters.apiKey,
@@ -397,11 +427,12 @@ let OpenaiApi = (function () {
397
427
  };
398
428
  const openai = new OpenAI(clientParams);
399
429
 
400
- const id = parameters.payload.assistant_id;
430
+ const id = parameters.msg.payload.assistant_id;
401
431
  const response = await openai.beta.assistants.retrieve(id);
402
432
 
403
433
  return response;
404
434
  }
435
+
405
436
  async modifyAssistant(parameters) {
406
437
  const clientParams = {
407
438
  apiKey: parameters.apiKey,
@@ -410,15 +441,16 @@ let OpenaiApi = (function () {
410
441
  };
411
442
  const openai = new OpenAI(clientParams);
412
443
 
413
- const id = parameters.payload.assistant_id;
414
- delete parameters.payload.assistant_id;
444
+ const id = parameters.msg.payload.assistant_id;
445
+ delete parameters.msg.payload.assistant_id;
415
446
 
416
447
  const response = await openai.beta.assistants.update(id, {
417
- ...parameters.payload,
448
+ ...parameters.msg.payload,
418
449
  });
419
450
 
420
451
  return response;
421
452
  }
453
+
422
454
  async deleteAssistant(parameters) {
423
455
  const clientParams = {
424
456
  apiKey: parameters.apiKey,
@@ -427,11 +459,12 @@ let OpenaiApi = (function () {
427
459
  };
428
460
  const openai = new OpenAI(clientParams);
429
461
 
430
- const id = parameters.payload.assistant_id;
462
+ const id = parameters.msg.payload.assistant_id;
431
463
  const response = await openai.beta.assistants.del(id);
432
464
 
433
465
  return response;
434
466
  }
467
+
435
468
  async createThread(parameters) {
436
469
  const clientParams = {
437
470
  apiKey: parameters.apiKey,
@@ -441,11 +474,12 @@ let OpenaiApi = (function () {
441
474
  const openai = new OpenAI(clientParams);
442
475
 
443
476
  const response = await openai.beta.threads.create({
444
- ...parameters.payload,
477
+ ...parameters.msg.payload,
445
478
  });
446
479
 
447
480
  return response;
448
481
  }
482
+
449
483
  async getThread(parameters) {
450
484
  const clientParams = {
451
485
  apiKey: parameters.apiKey,
@@ -454,11 +488,12 @@ let OpenaiApi = (function () {
454
488
  };
455
489
  const openai = new OpenAI(clientParams);
456
490
 
457
- const id = parameters.payload.thread_id;
491
+ const id = parameters.msg.payload.thread_id;
458
492
  const response = await openai.beta.threads.retrieve(id);
459
493
 
460
494
  return response;
461
495
  }
496
+
462
497
  async modifyThread(parameters) {
463
498
  const clientParams = {
464
499
  apiKey: parameters.apiKey,
@@ -467,15 +502,16 @@ let OpenaiApi = (function () {
467
502
  };
468
503
  const openai = new OpenAI(clientParams);
469
504
 
470
- const id = parameters.payload.thread_id;
471
- delete parameters.payload.thread_id;
505
+ const id = parameters.msg.payload.thread_id;
506
+ delete parameters.msg.payload.thread_id;
472
507
 
473
508
  const response = await openai.beta.threads.update(id, {
474
- ...parameters.payload,
509
+ ...parameters.msg.payload,
475
510
  });
476
511
 
477
512
  return response;
478
513
  }
514
+
479
515
  async deleteThread(parameters) {
480
516
  const clientParams = {
481
517
  apiKey: parameters.apiKey,
@@ -484,11 +520,12 @@ let OpenaiApi = (function () {
484
520
  };
485
521
  const openai = new OpenAI(clientParams);
486
522
 
487
- const id = parameters.payload.thread_id;
523
+ const id = parameters.msg.payload.thread_id;
488
524
  const response = await openai.beta.threads.del(id);
489
525
 
490
526
  return response;
491
527
  }
528
+
492
529
  async listMessages(parameters) {
493
530
  const clientParams = {
494
531
  apiKey: parameters.apiKey,
@@ -497,11 +534,12 @@ let OpenaiApi = (function () {
497
534
  };
498
535
  const openai = new OpenAI(clientParams);
499
536
 
500
- const id = parameters.payload.thread_id;
537
+ const id = parameters.msg.payload.thread_id;
501
538
  const response = await openai.beta.threads.messages.list(id);
502
539
 
503
540
  return response.body;
504
541
  }
542
+
505
543
  async createMessage(parameters) {
506
544
  const clientParams = {
507
545
  apiKey: parameters.apiKey,
@@ -510,15 +548,16 @@ let OpenaiApi = (function () {
510
548
  };
511
549
  const openai = new OpenAI(clientParams);
512
550
 
513
- const thread_id = parameters.payload.thread_id;
514
- delete parameters.payload.thread_id;
551
+ const thread_id = parameters.msg.payload.thread_id;
552
+ delete parameters.msg.payload.thread_id;
515
553
 
516
554
  const response = await openai.beta.threads.messages.create(thread_id, {
517
- ...parameters.payload,
555
+ ...parameters.msg.payload,
518
556
  });
519
557
 
520
558
  return response;
521
559
  }
560
+
522
561
  async getMessage(parameters) {
523
562
  const clientParams = {
524
563
  apiKey: parameters.apiKey,
@@ -527,8 +566,8 @@ let OpenaiApi = (function () {
527
566
  };
528
567
  const openai = new OpenAI(clientParams);
529
568
 
530
- const thread_id = parameters.payload.thread_id;
531
- const message_id = parameters.payload.message_id;
569
+ const thread_id = parameters.msg.payload.thread_id;
570
+ const message_id = parameters.msg.payload.message_id;
532
571
 
533
572
  const response = await openai.beta.threads.messages.retrieve(
534
573
  thread_id,
@@ -537,6 +576,7 @@ let OpenaiApi = (function () {
537
576
 
538
577
  return response;
539
578
  }
579
+
540
580
  async modifyMessage(parameters) {
541
581
  const clientParams = {
542
582
  apiKey: parameters.apiKey,
@@ -545,21 +585,22 @@ let OpenaiApi = (function () {
545
585
  };
546
586
  const openai = new OpenAI(clientParams);
547
587
 
548
- const thread_id = parameters.payload.thread_id;
549
- const message_id = parameters.payload.message_id;
550
- delete parameters.payload.thread_id;
551
- delete parameters.payload.message_id;
588
+ const thread_id = parameters.msg.payload.thread_id;
589
+ const message_id = parameters.msg.payload.message_id;
590
+ delete parameters.msg.payload.thread_id;
591
+ delete parameters.msg.payload.message_id;
552
592
 
553
593
  const response = await openai.beta.threads.messages.update(
554
594
  thread_id,
555
595
  message_id,
556
596
  {
557
- ...parameters.payload,
597
+ ...parameters.msg.payload,
558
598
  },
559
599
  );
560
600
 
561
601
  return response;
562
602
  }
603
+
563
604
  async createThreadAndRun(parameters) {
564
605
  const clientParams = {
565
606
  apiKey: parameters.apiKey,
@@ -569,11 +610,12 @@ let OpenaiApi = (function () {
569
610
  const openai = new OpenAI(clientParams);
570
611
 
571
612
  const response = await openai.beta.threads.createAndRun({
572
- ...parameters.payload,
613
+ ...parameters.msg.payload,
573
614
  });
574
615
 
575
616
  return response;
576
617
  }
618
+
577
619
  async listRuns(parameters) {
578
620
  const clientParams = {
579
621
  apiKey: parameters.apiKey,
@@ -582,15 +624,16 @@ let OpenaiApi = (function () {
582
624
  };
583
625
  const openai = new OpenAI(clientParams);
584
626
 
585
- const thred_id = parameters.payload.thread_id;
586
- delete parameters.payload.thread_id;
627
+ const thred_id = parameters.msg.payload.thread_id;
628
+ delete parameters.msg.payload.thread_id;
587
629
 
588
630
  const response = await openai.beta.threads.runs.list(thred_id, {
589
- ...parameters.payload,
631
+ ...parameters.msg.payload,
590
632
  });
591
633
 
592
634
  return response.body;
593
635
  }
636
+
594
637
  async createRun(parameters) {
595
638
  const clientParams = {
596
639
  apiKey: parameters.apiKey,
@@ -599,15 +642,16 @@ let OpenaiApi = (function () {
599
642
  };
600
643
  const openai = new OpenAI(clientParams);
601
644
 
602
- const thread_id = parameters.payload.thread_id;
603
- delete parameters.payload.thread_id;
645
+ const thread_id = parameters.msg.payload.thread_id;
646
+ delete parameters.msg.payload.thread_id;
604
647
 
605
648
  const response = await openai.beta.threads.runs.create(thread_id, {
606
- ...parameters.payload,
649
+ ...parameters.msg.payload,
607
650
  });
608
651
 
609
652
  return response;
610
653
  }
654
+
611
655
  async getRun(parameters) {
612
656
  const clientParams = {
613
657
  apiKey: parameters.apiKey,
@@ -616,10 +660,10 @@ let OpenaiApi = (function () {
616
660
  };
617
661
  const openai = new OpenAI(clientParams);
618
662
 
619
- const thread_id = parameters.payload.thread_id;
620
- const run_id = parameters.payload.run_id;
621
- delete parameters.payload.thread_id;
622
- delete parameters.payload.run_id;
663
+ const thread_id = parameters.msg.payload.thread_id;
664
+ const run_id = parameters.msg.payload.run_id;
665
+ delete parameters.msg.payload.thread_id;
666
+ delete parameters.msg.payload.run_id;
623
667
 
624
668
  const response = await openai.beta.threads.runs.retrieve(
625
669
  thread_id,
@@ -628,6 +672,7 @@ let OpenaiApi = (function () {
628
672
 
629
673
  return response;
630
674
  }
675
+
631
676
  async modifyRun(parameters) {
632
677
  const clientParams = {
633
678
  apiKey: parameters.apiKey,
@@ -636,21 +681,22 @@ let OpenaiApi = (function () {
636
681
  };
637
682
  const openai = new OpenAI(clientParams);
638
683
 
639
- const thread_id = parameters.payload.thread_id;
640
- const run_id = parameters.payload.run_id;
641
- delete parameters.payload.thread_id;
642
- delete parameters.payload.run_id;
684
+ const thread_id = parameters.msg.payload.thread_id;
685
+ const run_id = parameters.msg.payload.run_id;
686
+ delete parameters.msg.payload.thread_id;
687
+ delete parameters.msg.payload.run_id;
643
688
 
644
689
  const response = await openai.beta.threads.runs.update(
645
690
  thread_id,
646
691
  run_id,
647
692
  {
648
- ...parameters.payload,
693
+ ...parameters.msg.payload,
649
694
  },
650
695
  );
651
696
 
652
697
  return response;
653
698
  }
699
+
654
700
  async submitToolOuputsToRun(parameters) {
655
701
  const clientParams = {
656
702
  apiKey: parameters.apiKey,
@@ -659,21 +705,22 @@ let OpenaiApi = (function () {
659
705
  };
660
706
  const openai = new OpenAI(clientParams);
661
707
 
662
- const thread_id = parameters.payload.thread_id;
663
- const run_id = parameters.payload.run_id;
664
- delete parameters.payload.thread_id;
665
- delete parameters.payload.run_id;
708
+ const thread_id = parameters.msg.payload.thread_id;
709
+ const run_id = parameters.msg.payload.run_id;
710
+ delete parameters.msg.payload.thread_id;
711
+ delete parameters.msg.payload.run_id;
666
712
 
667
713
  const response = await openai.beta.threads.runs.submitToolOutputs(
668
714
  thread_id,
669
715
  run_id,
670
716
  {
671
- ...parameters.payload,
717
+ ...parameters.msg.payload,
672
718
  },
673
719
  );
674
720
 
675
721
  return response;
676
722
  }
723
+
677
724
  async cancelRun(parameters) {
678
725
  const clientParams = {
679
726
  apiKey: parameters.apiKey,
@@ -682,21 +729,22 @@ let OpenaiApi = (function () {
682
729
  };
683
730
  const openai = new OpenAI(clientParams);
684
731
 
685
- const thread_id = parameters.payload.thread_id;
686
- const run_id = parameters.payload.run_id;
687
- delete parameters.payload.thread_id;
688
- delete parameters.payload.run_id;
732
+ const thread_id = parameters.msg.payload.thread_id;
733
+ const run_id = parameters.msg.payload.run_id;
734
+ delete parameters.msg.payload.thread_id;
735
+ delete parameters.msg.payload.run_id;
689
736
 
690
737
  const response = await openai.beta.threads.runs.cancel(
691
738
  thread_id,
692
739
  run_id,
693
740
  {
694
- ...parameters.payload,
741
+ ...parameters.msg.payload,
695
742
  },
696
743
  );
697
744
 
698
745
  return response;
699
746
  }
747
+
700
748
  async listRunSteps(parameters) {
701
749
  const clientParams = {
702
750
  apiKey: parameters.apiKey,
@@ -705,21 +753,22 @@ let OpenaiApi = (function () {
705
753
  };
706
754
  const openai = new OpenAI(clientParams);
707
755
 
708
- const thread_id = parameters.payload.thread_id;
709
- const run_id = parameters.payload.run_id;
710
- delete parameters.payload.thread_id;
711
- delete parameters.payload.run_id;
756
+ const thread_id = parameters.msg.payload.thread_id;
757
+ const run_id = parameters.msg.payload.run_id;
758
+ delete parameters.msg.payload.thread_id;
759
+ delete parameters.msg.payload.run_id;
712
760
 
713
761
  const response = await openai.beta.threads.runs.steps.list(
714
762
  thread_id,
715
763
  run_id,
716
764
  {
717
- ...parameters.payload,
765
+ ...parameters.msg.payload,
718
766
  },
719
767
  );
720
768
 
721
769
  return response.body;
722
770
  }
771
+
723
772
  async getRunStep(parameters) {
724
773
  const clientParams = {
725
774
  apiKey: parameters.apiKey,
@@ -728,9 +777,9 @@ let OpenaiApi = (function () {
728
777
  };
729
778
  const openai = new OpenAI(clientParams);
730
779
 
731
- const thread_id = parameters.payload.thread_id;
732
- const run_id = parameters.payload.run_id;
733
- const step_id = parameters.payload.step_id;
780
+ const thread_id = parameters.msg.payload.thread_id;
781
+ const run_id = parameters.msg.payload.run_id;
782
+ const step_id = parameters.msg.payload.step_id;
734
783
 
735
784
  const response = await openai.beta.threads.runs.steps.retrieve(
736
785
  thread_id,
@@ -740,6 +789,7 @@ let OpenaiApi = (function () {
740
789
 
741
790
  return response;
742
791
  }
792
+
743
793
  async listAssistantFiles(parameters) {
744
794
  const clientParams = {
745
795
  apiKey: parameters.apiKey,
@@ -748,15 +798,16 @@ let OpenaiApi = (function () {
748
798
  };
749
799
  const openai = new OpenAI(clientParams);
750
800
 
751
- const assistant_id = parameters.payload.assistant_id;
752
- delete parameters.payload.assistant_id;
801
+ const assistant_id = parameters.msg.payload.assistant_id;
802
+ delete parameters.msg.payload.assistant_id;
753
803
 
754
804
  const response = await openai.beta.assistants.files.list(assistant_id, {
755
- ...parameters.payload,
805
+ ...parameters.msg.payload,
756
806
  });
757
807
 
758
808
  return response.body;
759
809
  }
810
+
760
811
  async createAssistantFile(parameters) {
761
812
  const clientParams = {
762
813
  apiKey: parameters.apiKey,
@@ -765,15 +816,16 @@ let OpenaiApi = (function () {
765
816
  };
766
817
  const openai = new OpenAI(clientParams);
767
818
 
768
- const assistant_id = parameters.payload.assistant_id;
769
- delete parameters.payload.assistant_id;
819
+ const assistant_id = parameters.msg.payload.assistant_id;
820
+ delete parameters.msg.payload.assistant_id;
770
821
 
771
822
  const response = await openai.beta.assistants.files.create(assistant_id, {
772
- ...parameters.payload,
823
+ ...parameters.msg.payload,
773
824
  });
774
825
 
775
826
  return response;
776
827
  }
828
+
777
829
  async getAssistantFile(parameters) {
778
830
  const clientParams = {
779
831
  apiKey: parameters.apiKey,
@@ -782,21 +834,22 @@ let OpenaiApi = (function () {
782
834
  };
783
835
  const openai = new OpenAI(clientParams);
784
836
 
785
- const assistant_id = parameters.payload.assistant_id;
786
- const file_id = parameters.payload.file_id;
787
- delete parameters.payload.assistant_id;
788
- delete parameters.payload.file_id;
837
+ const assistant_id = parameters.msg.payload.assistant_id;
838
+ const file_id = parameters.msg.payload.file_id;
839
+ delete parameters.msg.payload.assistant_id;
840
+ delete parameters.msg.payload.file_id;
789
841
 
790
842
  const response = await openai.beta.assistants.files.retrieve(
791
843
  assistant_id,
792
844
  file_id,
793
845
  {
794
- ...parameters.payload,
846
+ ...parameters.msg.payload,
795
847
  },
796
848
  );
797
849
 
798
850
  return response;
799
851
  }
852
+
800
853
  async deleteAssistantFile(parameters) {
801
854
  const clientParams = {
802
855
  apiKey: parameters.apiKey,
@@ -805,21 +858,22 @@ let OpenaiApi = (function () {
805
858
  };
806
859
  const openai = new OpenAI(clientParams);
807
860
 
808
- const assistant_id = parameters.payload.assistant_id;
809
- const file_id = parameters.payload.file_id;
810
- delete parameters.payload.assistant_id;
811
- delete parameters.payload.file_id;
861
+ const assistant_id = parameters.msg.payload.assistant_id;
862
+ const file_id = parameters.msg.payload.file_id;
863
+ delete parameters.msg.payload.assistant_id;
864
+ delete parameters.msg.payload.file_id;
812
865
 
813
866
  const response = await openai.beta.assistants.files.del(
814
867
  assistant_id,
815
868
  file_id,
816
869
  {
817
- ...parameters.payload,
870
+ ...parameters.msg.payload,
818
871
  },
819
872
  );
820
873
 
821
874
  return response;
822
875
  }
876
+
823
877
  async listMessageFiles(parameters) {
824
878
  const clientParams = {
825
879
  apiKey: parameters.apiKey,
@@ -828,21 +882,22 @@ let OpenaiApi = (function () {
828
882
  };
829
883
  const openai = new OpenAI(clientParams);
830
884
 
831
- const thread_id = parameters.payload.thread_id;
832
- const message_id = parameters.payload.message_id;
833
- delete parameters.payload.thread_id;
834
- delete parameters.payload.message_id;
885
+ const thread_id = parameters.msg.payload.thread_id;
886
+ const message_id = parameters.msg.payload.message_id;
887
+ delete parameters.msg.payload.thread_id;
888
+ delete parameters.msg.payload.message_id;
835
889
 
836
890
  const response = await openai.beta.threads.messages.files.list(
837
891
  thread_id,
838
892
  message_id,
839
893
  {
840
- ...parameters.payload,
894
+ ...parameters.msg.payload,
841
895
  },
842
896
  );
843
897
 
844
898
  return response;
845
899
  }
900
+
846
901
  async getMessageFile(parameters) {
847
902
  const clientParams = {
848
903
  apiKey: parameters.apiKey,
@@ -851,20 +906,20 @@ let OpenaiApi = (function () {
851
906
  };
852
907
  const openai = new OpenAI(clientParams);
853
908
 
854
- const thread_id = parameters.payload.thread_id;
855
- const message_id = parameters.payload.message_id;
856
- const file_id = parameters.payload.file_id;
909
+ const thread_id = parameters.msg.payload.thread_id;
910
+ const message_id = parameters.msg.payload.message_id;
911
+ const file_id = parameters.msg.payload.file_id;
857
912
 
858
- delete parameters.payload.thread_id;
859
- delete parameters.payload.message_id;
860
- delete parameters.payload.file_id;
913
+ delete parameters.msg.payload.thread_id;
914
+ delete parameters.msg.payload.message_id;
915
+ delete parameters.msg.payload.file_id;
861
916
 
862
917
  const response = await openai.beta.threads.messages.files.retrieve(
863
918
  thread_id,
864
919
  message_id,
865
920
  file_id,
866
921
  {
867
- ...parameters.payload,
922
+ ...parameters.msg.payload,
868
923
  },
869
924
  );
870
925
 
@@ -8,7 +8,8 @@
8
8
  "header": "Auth Header",
9
9
  "organizationId": "Org Id",
10
10
  "apiKey": "API Key",
11
- "isQuery": "isQuery"
11
+ "isQuery": "isQuery",
12
+ "property": "Property"
12
13
  },
13
14
  "status": {
14
15
  "requesting": "requesting",
package/node.html CHANGED
@@ -4,6 +4,8 @@
4
4
  color: "#B8B1FB",
5
5
  defaults: {
6
6
  name: { value: "" },
7
+ property: { value: "payload", required: true },
8
+ propertyType: { value: "msg" },
7
9
  service: { value: "", type: "Service Host", required: true },
8
10
  method: { value: "", required: true },
9
11
  },
@@ -22,8 +24,20 @@
22
24
  var methods = $("#node-input-method").children();
23
25
  var firstMethod = methods.first();
24
26
  $("#node-input-method").val(firstMethod.val());
27
+ };
28
+
29
+ // set the default property type value to "payload"
30
+ if (this.property === undefined) {
31
+ $("#node-input-property").val("payload");
25
32
  }
26
- },
33
+
34
+ $("#node-input-property").typedInput({
35
+ default: "msg",
36
+ value: "payload",
37
+ types:["msg", "flow", "global"],
38
+ typeField: "#node-input-propertyType"
39
+ })
40
+ }
27
41
  });
28
42
  </script>
29
43
 
@@ -49,6 +63,15 @@
49
63
  <input type="text" id="node-input-service" />
50
64
  </div>
51
65
 
66
+ <div class="form-row">
67
+ <label for="node-input-property"
68
+ ><i class="fa fa-ellipsis-h"></i>
69
+ <span data-i18n="OpenaiApi.label.property"></span
70
+ ></label>
71
+ <input type="text" id="node-input-property">
72
+ <input type="hidden" id="node-input-propertyType">
73
+ </div>
74
+
52
75
  <div class="form-row">
53
76
  <label for="node-input-method"
54
77
  ><i class="fa fa-tasks"></i>
@@ -2681,7 +2704,7 @@
2681
2704
  );
2682
2705
  if (!selected.val()) {
2683
2706
  $("#node-config-input-secureApiKeyIsQuery").val(false);
2684
- }
2707
+ };
2685
2708
  },
2686
2709
  });
2687
2710
  </script>
package/node.js CHANGED
@@ -5,21 +5,32 @@ module.exports = function (RED) {
5
5
  class OpenaiApiNode {
6
6
  constructor(config) {
7
7
  RED.nodes.createNode(this, config);
8
- this.service = RED.nodes.getNode(config.service);
9
- this.method = config.method;
10
8
 
11
9
  let node = this;
10
+ node.service = RED.nodes.getNode(config.service);
11
+ node.config = config;
12
12
 
13
13
  node.on("input", function (msg) {
14
14
  let client = new lib.OpenaiApi();
15
+ let payload;
15
16
 
16
- const serviceName = node.method; // Set the service name to call.
17
+ const propertyType = node.config.propertyType || "msg";
18
+ const propertyPath = node.config.property || "payload";
19
+
20
+ if (propertyType === "msg") {
21
+ payload = RED.util.getMessageProperty(msg, propertyPath);
22
+ } else {
23
+ // For flow and global contexts
24
+ payload = node.context()[propertyType].get(propertyPath);
25
+ }
26
+
27
+ const serviceName = node.config.method; // Set the service name to call.
17
28
  let serviceParametersObject = {
18
29
  organization: node.service.organizationId,
19
30
  apiBase: node.service.apiBase,
20
31
  apiKey: node.service.credentials.secureApiKeyValue || "",
21
32
  _node: node,
22
- payload: { ...msg.payload },
33
+ msg: msg,
23
34
  };
24
35
 
25
36
  // Dynamically call the function based on the service name
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inductiv/node-red-openai-api",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "Go beyond ChatGPT and DALL·E 3: this Node-RED node seamlessly integrates a range of OpenAI services, including Assistants, Threads, Vision, and Audio, enabling feature-rich enhancement of your AI workflows with any OpenAI REST API-compatible solution.",
5
5
  "main": "node.js",
6
6
  "engines": {
package/.eslintrc.json DELETED
@@ -1,12 +0,0 @@
1
- {
2
- "env": {
3
- "commonjs": true,
4
- "es2021": true,
5
- "node": true
6
- },
7
- "extends": "eslint:recommended",
8
- "parserOptions": {
9
- "ecmaVersion": "latest"
10
- },
11
- "rules": {}
12
- }
package/.prettierrc DELETED
@@ -1,4 +0,0 @@
1
- {
2
- "tabWidth": 2,
3
- "useTabs": false
4
- }