@inductiv/node-red-openai-api 0.3.6 → 0.3.8

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/lib.js CHANGED
@@ -22,6 +22,11 @@ var OpenaiApi = (function () {
22
22
  setApiBase(apiBase) {
23
23
  this.domain = apiBase;
24
24
  }
25
+
26
+ setOrganizationIdHeader(organizationId) {
27
+ this.organizationId = organizationId;
28
+ }
29
+
25
30
  setAuthHeaders(headerParams) {
26
31
  var headers = headerParams ? headerParams : {};
27
32
  if (!this.apiKey.isQuery && this.apiKey.headerOrQueryName) {
@@ -30,18 +35,22 @@ var OpenaiApi = (function () {
30
35
  return headers;
31
36
  }
32
37
 
33
- setNodeRef(node){
38
+ setNodeRef(node) {
34
39
  this.node = node;
35
40
  }
36
41
 
37
- getFromEndpoint(path, parameters, expectedQueryParams, customHeaders) {
42
+ getFromEndpoint(path, parameters, expectedQueryParams, customHeaders = {}) {
38
43
  return new Promise((resolve, reject) => {
39
44
  var domain = this.domain;
40
- var queryParameters = {},
41
- baseHeaders = {};
45
+ var organizationId = this.organizationId;
46
+ var queryParameters = {};
47
+ var baseHeaders = {};
42
48
 
43
49
  baseHeaders = this.setAuthHeaders(headers);
44
50
  baseHeaders["Accept"] = "application/json";
51
+ if (organizationId) {
52
+ customHeaders["OpenAI-Organization"] = organizationId;
53
+ }
45
54
 
46
55
  var headers = {
47
56
  ...baseHeaders,
@@ -78,26 +87,32 @@ var OpenaiApi = (function () {
78
87
  });
79
88
  });
80
89
  }
90
+
81
91
  postToEndpoint(
82
92
  path,
83
93
  parameters,
84
94
  expectedQueryParams,
85
95
  contentType,
86
96
  filePath,
87
- customHeaders,
97
+ customHeaders = {},
88
98
  ) {
89
99
  return new Promise((resolve, reject) => {
90
100
  const _path = require("path");
91
101
 
92
102
  parameters = parameters || {};
93
103
  var domain = this.domain;
104
+ var organizationId = this.organizationId;
94
105
  var queryParameters = {},
95
106
  baseHeaders = {},
96
107
  data;
97
108
 
98
- baseHeaders = this.setAuthHeaders({});
109
+ baseHeaders = this.setAuthHeaders(baseHeaders);
99
110
  baseHeaders["Accept"] = "application/json";
100
111
 
112
+ if (organizationId) {
113
+ customHeaders["OpenAI-Organization"] = organizationId;
114
+ }
115
+
101
116
  var headers = {
102
117
  ...baseHeaders,
103
118
  ...customHeaders,
@@ -153,26 +168,29 @@ var OpenaiApi = (function () {
153
168
  headers: headers,
154
169
  params: queryParameters,
155
170
  data: data,
156
- responseType: data.stream === true ? "stream" : "json"
171
+ responseType: data.stream === true ? "stream" : "json",
157
172
  };
158
173
 
159
174
  axios(config)
160
175
  .then((response) => {
161
176
  if (config.responseType === "stream") {
162
177
  // Handle the stream response
163
- response.data.on('data', (chunk) => {
164
- // Convert chunk from Uint8Array to string
165
- const chunkAsString = new TextDecoder().decode(chunk);
166
-
167
- // Emit converted data chunks as Node-RED messages
168
- this.node.send({ payload: chunkAsString });
169
- }).on('end', () => {
170
- // Handle the end of the stream
171
- resolve({ payload: "Stream ended" });
172
- }).on('error', (err) => {
173
- // Handle any errors
174
- reject(err);
175
- });
178
+ response.data
179
+ .on("data", (chunk) => {
180
+ // Convert chunk from Uint8Array to string
181
+ const chunkAsString = new TextDecoder().decode(chunk);
182
+
183
+ // Emit converted data chunks as Node-RED messages
184
+ this.node.send({ payload: chunkAsString });
185
+ })
186
+ .on("end", () => {
187
+ // Handle the end of the stream
188
+ resolve({ payload: "Stream ended" });
189
+ })
190
+ .on("error", (err) => {
191
+ // Handle any errors
192
+ reject(err);
193
+ });
176
194
  } else {
177
195
  // Handle non-stream response (e.g., JSON)
178
196
  resolve(response);
@@ -184,16 +202,26 @@ var OpenaiApi = (function () {
184
202
  });
185
203
  }
186
204
 
187
- deleteFromEndpoint(path, parameters, expectedQueryParams, customHeaders) {
205
+ deleteFromEndpoint(
206
+ path,
207
+ parameters,
208
+ expectedQueryParams,
209
+ customHeaders = {},
210
+ ) {
188
211
  return new Promise((resolve, reject) => {
189
212
  parameters = parameters || {};
190
213
  var domain = this.domain;
214
+ var organizationId = this.organizationId;
191
215
  var queryParameters = {},
192
216
  baseHeaders = {};
193
217
 
194
218
  baseHeaders = this.setAuthHeaders(headers);
195
219
  baseHeaders["Accept"] = "application/json";
196
220
 
221
+ if (organizationId) {
222
+ customHeaders["OpenAI-Organization"] = organizationId;
223
+ }
224
+
197
225
  var headers = {
198
226
  ...baseHeaders,
199
227
  ...customHeaders,
@@ -229,6 +257,7 @@ var OpenaiApi = (function () {
229
257
  });
230
258
  });
231
259
  }
260
+
232
261
  createChatCompletion(parameters) {
233
262
  const response = this.postToEndpoint("/chat/completions", parameters);
234
263
  return response;
@@ -315,14 +344,17 @@ var OpenaiApi = (function () {
315
344
  }
316
345
  deleteFile(parameters) {
317
346
  const file_id = parameters.body.file_id;
347
+ delete parameters.body.file_id;
318
348
  return this.deleteFromEndpoint(`/files/${file_id}`, parameters);
319
349
  }
320
350
  retrieveFile(parameters) {
321
351
  const file_id = parameters.body.file_id;
352
+ delete parameters.body.file_id;
322
353
  return this.getFromEndpoint(`/files/${file_id}`, parameters);
323
354
  }
324
355
  downloadFile(parameters) {
325
356
  const file_id = parameters.body.file_id;
357
+ delete parameters.body.file_id;
326
358
  return this.getFromEndpoint(`/files/${file_id}/content`, parameters);
327
359
  }
328
360
  createFineTuningJob(parameters) {
@@ -338,6 +370,7 @@ var OpenaiApi = (function () {
338
370
  }
339
371
  retrieveFineTuningJob(parameters) {
340
372
  const fine_tuning_job_id = parameters.body.fine_tuning_job_id;
373
+ delete parameters.body.fine_tuning_job_id;
341
374
  return this.getFromEndpoint(
342
375
  `/fine_tuning/jobs/${fine_tuning_job_id}`,
343
376
  parameters,
@@ -346,6 +379,7 @@ var OpenaiApi = (function () {
346
379
  listFineTuningEvents(parameters) {
347
380
  const expectedQueryParameters = ["after", "limit"];
348
381
  const fine_tuning_job_id = parameters.body.fine_tuning_job_id;
382
+ delete parameters.body.fine_tuning_job_id;
349
383
 
350
384
  return this.getFromEndpoint(
351
385
  `/fine_tuning/jobs/${fine_tuning_job_id}/events`,
@@ -355,6 +389,7 @@ var OpenaiApi = (function () {
355
389
  }
356
390
  cancelFineTuningJob(parameters) {
357
391
  const fine_tuning_job_id = parameters.body.fine_tuning_job_id;
392
+ delete parameters.body.fine_tuning_job_id;
358
393
  return this.postToEndpoint(
359
394
  `/fine_tuning/jobs/${fine_tuning_job_id}/cancel`,
360
395
  parameters,
@@ -365,12 +400,12 @@ var OpenaiApi = (function () {
365
400
  }
366
401
  retrieveModel(parameters) {
367
402
  const model = parameters.body.model;
368
-
403
+ delete parameters.body.model;
369
404
  return this.getFromEndpoint(`/models/${model}`, parameters);
370
405
  }
371
406
  deleteModel(parameters) {
372
407
  const model = parameters.body.model;
373
-
408
+ delete parameters.body.model;
374
409
  return this.deleteFromEndpoint(`/models/${model}`, parameters);
375
410
  }
376
411
  createModeration(parameters) {
@@ -401,9 +436,8 @@ var OpenaiApi = (function () {
401
436
  }
402
437
  getAssistant(parameters) {
403
438
  const assistantId = parameters.body.assistant_id;
404
-
405
- var customHeaders = { "OpenAI-Beta": "assistants=v1" };
406
-
439
+ const customHeaders = { "OpenAI-Beta": "assistants=v1" };
440
+ delete parameters.body.assistant_id;
407
441
  return this.getFromEndpoint(
408
442
  `/assistants/${assistantId}`,
409
443
  parameters,
@@ -414,7 +448,7 @@ var OpenaiApi = (function () {
414
448
  modifyAssistant(parameters) {
415
449
  const assistant_id = parameters.body.assistant_id;
416
450
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
417
-
451
+ delete parameters.body.assistant_id;
418
452
  return this.postToEndpoint(
419
453
  `/assistants/${assistant_id}`,
420
454
  parameters,
@@ -427,7 +461,7 @@ var OpenaiApi = (function () {
427
461
  deleteAssistant(parameters) {
428
462
  const assistant_id = parameters.body.assistant_id;
429
463
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
430
-
464
+ delete parameters.body.assistant_id;
431
465
  return this.deleteFromEndpoint(
432
466
  `/assistants/${assistant_id}`,
433
467
  parameters,
@@ -449,7 +483,7 @@ var OpenaiApi = (function () {
449
483
  getThread(parameters) {
450
484
  const threadId = parameters.body.thread_id;
451
485
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
452
-
486
+ delete parameters.body.thread_id;
453
487
  return this.getFromEndpoint(
454
488
  `/threads/${threadId}`,
455
489
  parameters,
@@ -460,7 +494,7 @@ var OpenaiApi = (function () {
460
494
  modifyThread(parameters) {
461
495
  const threadId = parameters.body.thread_id;
462
496
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
463
-
497
+ delete parameters.body.thread_id;
464
498
  return this.postToEndpoint(
465
499
  `/threads/${threadId}`,
466
500
  parameters,
@@ -473,7 +507,7 @@ var OpenaiApi = (function () {
473
507
  deleteThread(parameters) {
474
508
  const threadId = parameters.body.thread_id;
475
509
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
476
-
510
+ delete parameters.body.thread_id;
477
511
  return this.deleteFromEndpoint(
478
512
  `/threads/${threadId}`,
479
513
  parameters,
@@ -484,9 +518,8 @@ var OpenaiApi = (function () {
484
518
  listMessages(parameters) {
485
519
  const threadId = parameters.body.thread_id;
486
520
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
487
-
488
521
  const expectedQueryParameters = ["limit", "order", "after", "before"];
489
-
522
+ delete parameters.body.thread_id;
490
523
  return this.getFromEndpoint(
491
524
  `/threads/${threadId}/messages`,
492
525
  parameters,
@@ -497,7 +530,7 @@ var OpenaiApi = (function () {
497
530
  createMessage(parameters) {
498
531
  const threadId = parameters.body.thread_id;
499
532
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
500
-
533
+ delete parameters.body.thread_id;
501
534
  return this.postToEndpoint(
502
535
  `/threads/${threadId}/messages`,
503
536
  parameters,
@@ -511,7 +544,8 @@ var OpenaiApi = (function () {
511
544
  const threadId = parameters.body.thread_id;
512
545
  const messageId = parameters.body.message_id;
513
546
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
514
-
547
+ delete parameters.body.thread_id;
548
+ delete parameters.body.message_id;
515
549
  return this.getFromEndpoint(
516
550
  `/threads/${threadId}/messages/${messageId}`,
517
551
  parameters,
@@ -523,7 +557,8 @@ var OpenaiApi = (function () {
523
557
  const threadId = parameters.body.thread_id;
524
558
  const messageId = parameters.body.message_id;
525
559
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
526
-
560
+ delete parameters.body.thread_id;
561
+ delete parameters.body.message_id;
527
562
  return this.postToEndpoint(
528
563
  `/threads/${threadId}/messages/${messageId}`,
529
564
  parameters,
@@ -549,7 +584,7 @@ var OpenaiApi = (function () {
549
584
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
550
585
  const expectedQueryParameters = ["limit", "order", "after", "before"];
551
586
  const threadId = parameters.body.thread_id;
552
-
587
+ delete parameters.body.thread_id;
553
588
  return this.getFromEndpoint(
554
589
  `/threads/${threadId}/runs`,
555
590
  parameters,
@@ -560,7 +595,7 @@ var OpenaiApi = (function () {
560
595
  createRun(parameters) {
561
596
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
562
597
  const threadId = parameters.body.thread_id;
563
-
598
+ delete parameters.body.thread_id;
564
599
  return this.postToEndpoint(
565
600
  `/threads/${threadId}/runs`,
566
601
  parameters,
@@ -574,7 +609,8 @@ var OpenaiApi = (function () {
574
609
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
575
610
  const threadId = parameters.body.thread_id;
576
611
  const runId = parameters.body.run_id;
577
-
612
+ delete parameters.body.thread_id;
613
+ delete parameters.body.run_id;
578
614
  return this.getFromEndpoint(
579
615
  `/threads/${threadId}/runs/${runId}`,
580
616
  parameters,
@@ -586,7 +622,8 @@ var OpenaiApi = (function () {
586
622
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
587
623
  const threadId = parameters.body.thread_id;
588
624
  const runId = parameters.body.run_id;
589
-
625
+ delete parameters.body.thread_id;
626
+ delete parameters.body.run_id;
590
627
  return this.postToEndpoint(
591
628
  `/threads/${threadId}/runs/${runId}`,
592
629
  parameters,
@@ -600,7 +637,8 @@ var OpenaiApi = (function () {
600
637
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
601
638
  const threadId = parameters.body.thread_id;
602
639
  const runId = parameters.body.run_id;
603
-
640
+ delete parameters.body.thread_id;
641
+ delete parameters.body.run_id;
604
642
  return this.postToEndpoint(
605
643
  `/threads/${threadId}/runs/${runId}/submit_tool_outputs`,
606
644
  parameters,
@@ -614,7 +652,8 @@ var OpenaiApi = (function () {
614
652
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
615
653
  const threadId = parameters.body.thread_id;
616
654
  const runId = parameters.body.run_id;
617
-
655
+ delete parameters.body.thread_id;
656
+ delete parameters.body.run_id;
618
657
  return this.postToEndpoint(
619
658
  `/threads/${threadId}/runs/${runId}/cancel`,
620
659
  parameters,
@@ -629,7 +668,8 @@ var OpenaiApi = (function () {
629
668
  const threadId = parameters.body.thread_id;
630
669
  const runId = parameters.body.run_id;
631
670
  const expectedQueryParameters = ["limit", "order", "after", "before"];
632
-
671
+ delete parameters.body.thread_id;
672
+ delete parameters.body.run_id;
633
673
  return this.getFromEndpoint(
634
674
  `/threads/${threadId}/runs/${runId}/steps`,
635
675
  parameters,
@@ -642,7 +682,8 @@ var OpenaiApi = (function () {
642
682
  const threadId = parameters.body.thread_id;
643
683
  const runId = parameters.body.run_id;
644
684
  const stepId = parameters.body.step_id;
645
-
685
+ delete parameters.body.thread_id;
686
+ delete parameters.body.step_id;
646
687
  return this.getFromEndpoint(
647
688
  `/threads/${threadId}/runs/${runId}/steps/${stepId}`,
648
689
  parameters,
@@ -654,7 +695,7 @@ var OpenaiApi = (function () {
654
695
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
655
696
  const assistantId = parameters.body.assistant_id;
656
697
  const expectedQueryParameters = ["limit", "order", "after", "before"];
657
-
698
+ delete parameters.body.assistant_id;
658
699
  return this.getFromEndpoint(
659
700
  `/assistants/${assistantId}/files`,
660
701
  parameters,
@@ -665,7 +706,7 @@ var OpenaiApi = (function () {
665
706
  createAssistantFile(parameters) {
666
707
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
667
708
  const assistantId = parameters.body.assistant_id;
668
-
709
+ delete parameters.body.assistant_id;
669
710
  return this.postToEndpoint(
670
711
  `/assistants/${assistantId}/files`,
671
712
  parameters,
@@ -679,7 +720,8 @@ var OpenaiApi = (function () {
679
720
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
680
721
  const assistantId = parameters.body.assistant_id;
681
722
  const fileId = parameters.body.file_id;
682
-
723
+ delete parameters.body.assistant_id;
724
+ delete parameters.body.file_id;
683
725
  return this.getFromEndpoint(
684
726
  `/assistants/${assistantId}/files/${fileId}`,
685
727
  parameters,
@@ -691,7 +733,8 @@ var OpenaiApi = (function () {
691
733
  const customHeaders = { "OpenAI-Beta": "assistants=v1" };
692
734
  const assistantId = parameters.body.assistant_id;
693
735
  const fileId = parameters.body.file_id;
694
-
736
+ delete parameters.body.assistant_id;
737
+ delete parameters.body.file_id;
695
738
  return this.deleteFromEndpoint(
696
739
  `/assistants/${assistantId}/files/${fileId}`,
697
740
  parameters,
@@ -704,7 +747,8 @@ var OpenaiApi = (function () {
704
747
  const threadId = parameters.body.thread_id;
705
748
  const messageId = parameters.body.message_id;
706
749
  const expectedQueryParameters = ["limit", "order", "after", "before"];
707
-
750
+ delete parameters.body.thread_id;
751
+ delete parameters.body.message_id;
708
752
  return this.getFromEndpoint(
709
753
  `/threads/${threadId}/messages/${messageId}/files`,
710
754
  parameters,
@@ -717,7 +761,9 @@ var OpenaiApi = (function () {
717
761
  const threadId = parameters.body.thread_id;
718
762
  const messageId = parameters.body.message_id;
719
763
  const fileId = parameters.body.file_id;
720
-
764
+ delete parameters.body.thread_id;
765
+ delete parameters.body.message_id;
766
+ delete parameters.body.file_id;
721
767
  return this.getFromEndpoint(
722
768
  `/threads/${threadId}/messages/${messageId}/files/${fileId}`,
723
769
  parameters,
@@ -6,6 +6,7 @@
6
6
  "method": "Method",
7
7
  "host": "Host",
8
8
  "header": "Auth Header",
9
+ "organizationId": "Org Id",
9
10
  "apiKey": "API Key",
10
11
  "isQuery": "isQuery"
11
12
  },
package/node.html CHANGED
@@ -715,6 +715,7 @@
715
715
  defaults: {
716
716
  apiBase: { value: "https://api.openai.com/v1", required: true },
717
717
  secureApiKeyHeaderOrQueryName: { value: "Authorization" },
718
+ organizationId: { value: "" },
718
719
  secureApiKeyIsQuery: { value: false },
719
720
  name: { value: "" },
720
721
  },
@@ -753,6 +754,10 @@
753
754
  <label id="node-config-input-secureApiKeyValue-label" for="node-config-input-secureApiKeyValue"><i class="fa fa-lock"></i> <span data-i18n="OpenaiApi.label.apiKey"></span></label>
754
755
  <input type="password" id="node-config-input-secureApiKeyValue" placeholder="">
755
756
  </div>
757
+ <div class="form-row">
758
+ <label id="node-config-input-organizationId-label" for="node-config-input-organizationId"><i class="fa fa-list"></i> <span data-i18n="OpenaiApi.label.organizationId"></span></label>
759
+ <input type="text" id="node-config-input-organizationId" placeholder="OpenAI Organization Id">
760
+ </div>
756
761
  <div class="form-row">
757
762
  <label id="node-config-input-secureApiKeyIsQuery-label" for="node-config-input-secureApiKeyIsQuery"><i class="fa fa-dot-circle-o"></i> <span data-i18n="OpenaiApi.label.isQuery"></span></label>
758
763
  <select id="node-config-input-secureApiKeyIsQuery">
package/node.js CHANGED
@@ -15,6 +15,7 @@ module.exports = function (RED) {
15
15
  let client = new lib.OpenaiApi();
16
16
  if (!errorFlag && this.service) {
17
17
  client.setApiBase(this.service.apiBase);
18
+ client.setOrganizationIdHeader(this.service.organizationId);
18
19
  }
19
20
 
20
21
  if (!errorFlag && this.service && this.service.credentials && this.service.credentials.secureApiKeyValue) {
@@ -99,6 +100,7 @@ module.exports = function (RED) {
99
100
  this.apiBase = n.apiBase;
100
101
  this.secureApiKeyHeaderOrQueryName = n.secureApiKeyHeaderOrQueryName;
101
102
  this.secureApiKeyIsQuery = n.secureApiKeyIsQuery;
103
+ this.organizationId = n.organizationId;
102
104
  }
103
105
  }
104
106
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inductiv/node-red-openai-api",
3
- "version": "0.3.6",
3
+ "version": "0.3.8",
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": {