@workglow/openai 0.2.31 → 0.2.33
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 +44 -0
- package/dist/ai/OpenAiProvider.d.ts.map +1 -0
- package/dist/ai/OpenAiQueuedProvider.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_Chat.d.ts.map +1 -0
- package/dist/{ai-provider → ai}/common/OpenAI_Client.d.ts +3 -1
- package/dist/ai/common/OpenAI_Client.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_Constants.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_CountTokens.browser.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_CountTokens.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_ImageEdit.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_ImageGenerate.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_ImageValidation.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_JobRunFns.browser.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_JobRunFns.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_ModelInfo.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_ModelSchema.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_ModelSearch.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_StructuredGeneration.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_TextEmbedding.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_TextGeneration.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_TextRewriter.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_TextSummary.d.ts.map +1 -0
- package/dist/ai/common/OpenAI_ToolCalling.d.ts.map +1 -0
- package/dist/ai/index.browser.d.ts.map +1 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/registerOpenAi.d.ts.map +1 -0
- package/dist/ai/registerOpenAiInline.browser.d.ts.map +1 -0
- package/dist/ai/registerOpenAiInline.d.ts.map +1 -0
- package/dist/ai/registerOpenAiWorker.browser.d.ts.map +1 -0
- package/dist/ai/registerOpenAiWorker.d.ts.map +1 -0
- package/dist/{ai-provider → ai}/runtime.browser.d.ts +1 -1
- package/dist/ai/runtime.browser.d.ts.map +1 -0
- package/dist/{ai-provider → ai}/runtime.d.ts +1 -1
- package/dist/ai/runtime.d.ts.map +1 -0
- package/dist/{ai-provider-runtime.d.ts → ai-runtime.browser.d.ts} +2 -2
- package/dist/ai-runtime.browser.d.ts.map +1 -0
- package/dist/{ai-provider-runtime.browser.js → ai-runtime.browser.js} +37 -37
- package/dist/ai-runtime.browser.js.map +27 -0
- package/dist/{ai-provider.d.ts → ai-runtime.d.ts} +2 -2
- package/dist/ai-runtime.d.ts.map +1 -0
- package/dist/{ai-provider-runtime.js → ai-runtime.js} +39 -39
- package/dist/ai-runtime.js.map +29 -0
- package/dist/{ai-provider.browser.d.ts → ai.browser.d.ts} +2 -2
- package/dist/ai.browser.d.ts.map +1 -0
- package/dist/{ai-provider.browser.js → ai.browser.js} +9 -9
- package/dist/{ai-provider.browser.js.map → ai.browser.js.map} +4 -4
- package/dist/ai.d.ts +7 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/{ai-provider.js → ai.js} +20 -20
- package/dist/ai.js.map +16 -0
- package/package.json +28 -33
- package/dist/ai-provider/OpenAiProvider.d.ts.map +0 -1
- package/dist/ai-provider/OpenAiQueuedProvider.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_Chat.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_Client.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_Constants.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_CountTokens.browser.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_CountTokens.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_ImageEdit.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_ImageGenerate.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_ImageValidation.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_JobRunFns.browser.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_JobRunFns.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_ModelInfo.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_ModelSchema.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_ModelSearch.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_StructuredGeneration.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_TextEmbedding.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_TextGeneration.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_TextRewriter.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_TextSummary.d.ts.map +0 -1
- package/dist/ai-provider/common/OpenAI_ToolCalling.d.ts.map +0 -1
- package/dist/ai-provider/index.browser.d.ts.map +0 -1
- package/dist/ai-provider/index.d.ts.map +0 -1
- package/dist/ai-provider/registerOpenAi.d.ts.map +0 -1
- package/dist/ai-provider/registerOpenAiInline.browser.d.ts.map +0 -1
- package/dist/ai-provider/registerOpenAiInline.d.ts.map +0 -1
- package/dist/ai-provider/registerOpenAiWorker.browser.d.ts.map +0 -1
- package/dist/ai-provider/registerOpenAiWorker.d.ts.map +0 -1
- package/dist/ai-provider/runtime.browser.d.ts.map +0 -1
- package/dist/ai-provider/runtime.d.ts.map +0 -1
- package/dist/ai-provider-runtime.browser.d.ts +0 -7
- package/dist/ai-provider-runtime.browser.d.ts.map +0 -1
- package/dist/ai-provider-runtime.browser.js.map +0 -27
- package/dist/ai-provider-runtime.d.ts.map +0 -1
- package/dist/ai-provider-runtime.js.map +0 -29
- package/dist/ai-provider.browser.d.ts.map +0 -1
- package/dist/ai-provider.d.ts.map +0 -1
- package/dist/ai-provider.js.map +0 -16
- /package/dist/{ai-provider → ai}/OpenAiProvider.d.ts +0 -0
- /package/dist/{ai-provider → ai}/OpenAiQueuedProvider.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_Chat.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_Constants.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_CountTokens.browser.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_CountTokens.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_ImageEdit.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_ImageGenerate.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_ImageValidation.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_JobRunFns.browser.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_JobRunFns.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_ModelInfo.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_ModelSchema.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_ModelSearch.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_StructuredGeneration.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_TextEmbedding.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_TextGeneration.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_TextRewriter.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_TextSummary.d.ts +0 -0
- /package/dist/{ai-provider → ai}/common/OpenAI_ToolCalling.d.ts +0 -0
- /package/dist/{ai-provider → ai}/index.browser.d.ts +0 -0
- /package/dist/{ai-provider → ai}/index.d.ts +0 -0
- /package/dist/{ai-provider → ai}/registerOpenAi.d.ts +0 -0
- /package/dist/{ai-provider → ai}/registerOpenAiInline.browser.d.ts +0 -0
- /package/dist/{ai-provider → ai}/registerOpenAiInline.d.ts +0 -0
- /package/dist/{ai-provider → ai}/registerOpenAiWorker.browser.d.ts +0 -0
- /package/dist/{ai-provider → ai}/registerOpenAiWorker.d.ts +0 -0
|
@@ -6,15 +6,15 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
6
6
|
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
7
|
});
|
|
8
8
|
|
|
9
|
-
// src/ai
|
|
10
|
-
import { isBrowserLike,
|
|
11
|
-
var
|
|
9
|
+
// src/ai/common/OpenAI_Client.ts
|
|
10
|
+
import { isBrowserLike, resolveApiKey } from "@workglow/ai/provider-utils";
|
|
11
|
+
var _loadPromise;
|
|
12
12
|
async function loadOpenAISDK() {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
return
|
|
13
|
+
_loadPromise ??= import("openai").then((mod) => mod.default).catch(() => {
|
|
14
|
+
_loadPromise = undefined;
|
|
15
|
+
throw new Error("openai is required for OpenAI tasks. Install it with: bun add openai");
|
|
16
|
+
});
|
|
17
|
+
return _loadPromise;
|
|
18
18
|
}
|
|
19
19
|
async function getClient(model) {
|
|
20
20
|
const OpenAI = await loadOpenAISDK();
|
|
@@ -43,16 +43,16 @@ function getModelName(model) {
|
|
|
43
43
|
return name;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
// src/ai
|
|
47
|
-
import { registerProviderInline } from "@workglow/ai-
|
|
46
|
+
// src/ai/registerOpenAiInline.ts
|
|
47
|
+
import { registerProviderInline } from "@workglow/ai/provider-utils";
|
|
48
48
|
|
|
49
|
-
// src/ai
|
|
50
|
-
import { filterLabeledModelsByQuery } from "@workglow/ai-
|
|
49
|
+
// src/ai/common/OpenAI_ModelSearch.ts
|
|
50
|
+
import { filterLabeledModelsByQuery } from "@workglow/ai/provider-utils";
|
|
51
51
|
|
|
52
|
-
// src/ai
|
|
52
|
+
// src/ai/common/OpenAI_Constants.ts
|
|
53
53
|
var OPENAI = "OPENAI";
|
|
54
54
|
|
|
55
|
-
// src/ai
|
|
55
|
+
// src/ai/common/OpenAI_ModelSearch.ts
|
|
56
56
|
var OPENAI_FALLBACK = [
|
|
57
57
|
{ label: "gpt-image-2", value: "gpt-image-2" },
|
|
58
58
|
{ label: "dall-e-3", value: "dall-e-3" },
|
|
@@ -121,7 +121,7 @@ var OpenAI_ModelSearch = async (input) => {
|
|
|
121
121
|
return { results: mapModelList(models) };
|
|
122
122
|
};
|
|
123
123
|
|
|
124
|
-
// src/ai
|
|
124
|
+
// src/ai/common/OpenAI_Chat.ts
|
|
125
125
|
import { toOpenAIMessages } from "@workglow/ai/worker";
|
|
126
126
|
function buildParams(input, model) {
|
|
127
127
|
const messages = toOpenAIMessages({
|
|
@@ -161,7 +161,7 @@ var OpenAI_Chat_Stream = async function* (input, model, signal) {
|
|
|
161
161
|
yield { type: "finish", data: {} };
|
|
162
162
|
};
|
|
163
163
|
|
|
164
|
-
// src/ai
|
|
164
|
+
// src/ai/common/OpenAI_CountTokens.ts
|
|
165
165
|
var _tiktoken;
|
|
166
166
|
async function loadTiktoken() {
|
|
167
167
|
if (!_tiktoken) {
|
|
@@ -198,7 +198,7 @@ var OpenAI_CountTokens_Preview = async (input, model) => {
|
|
|
198
198
|
return OpenAI_CountTokens(input, model, () => {}, new AbortController().signal);
|
|
199
199
|
};
|
|
200
200
|
|
|
201
|
-
// src/ai
|
|
201
|
+
// src/ai/common/OpenAI_ModelInfo.ts
|
|
202
202
|
var OPENAI_EMBEDDING_DIMENSIONS = {
|
|
203
203
|
"text-embedding-3-small": { native_dimensions: 1536, mrl: true },
|
|
204
204
|
"text-embedding-3-large": { native_dimensions: 3072, mrl: true },
|
|
@@ -242,7 +242,7 @@ var OpenAI_ModelInfo = async (input, model) => {
|
|
|
242
242
|
};
|
|
243
243
|
};
|
|
244
244
|
|
|
245
|
-
// src/ai
|
|
245
|
+
// src/ai/common/OpenAI_StructuredGeneration.ts
|
|
246
246
|
import { parsePartialJson } from "@workglow/util/worker";
|
|
247
247
|
var OpenAI_StructuredGeneration = async (input, model, update_progress, signal, outputSchema) => {
|
|
248
248
|
update_progress(0, "Starting OpenAI structured generation");
|
|
@@ -306,7 +306,7 @@ var OpenAI_StructuredGeneration_Stream = async function* (input, model, signal,
|
|
|
306
306
|
yield { type: "finish", data: { object: finalObject } };
|
|
307
307
|
};
|
|
308
308
|
|
|
309
|
-
// src/ai
|
|
309
|
+
// src/ai/common/OpenAI_TextEmbedding.ts
|
|
310
310
|
import { getLogger } from "@workglow/util/worker";
|
|
311
311
|
var OpenAI_TextEmbedding = async (input, model, update_progress, signal) => {
|
|
312
312
|
const logger = getLogger();
|
|
@@ -329,7 +329,7 @@ var OpenAI_TextEmbedding = async (input, model, update_progress, signal) => {
|
|
|
329
329
|
return { vector: new Float32Array(response.data[0].embedding) };
|
|
330
330
|
};
|
|
331
331
|
|
|
332
|
-
// src/ai
|
|
332
|
+
// src/ai/common/OpenAI_TextGeneration.ts
|
|
333
333
|
import { getLogger as getLogger2 } from "@workglow/util/worker";
|
|
334
334
|
var OpenAI_TextGeneration = async (input, model, update_progress, signal) => {
|
|
335
335
|
const logger = getLogger2();
|
|
@@ -373,7 +373,7 @@ var OpenAI_TextGeneration_Stream = async function* (input, model, signal) {
|
|
|
373
373
|
yield { type: "finish", data: {} };
|
|
374
374
|
};
|
|
375
375
|
|
|
376
|
-
// src/ai
|
|
376
|
+
// src/ai/common/OpenAI_TextRewriter.ts
|
|
377
377
|
var OpenAI_TextRewriter = async (input, model, update_progress, signal) => {
|
|
378
378
|
update_progress(0, "Starting OpenAI text rewriting");
|
|
379
379
|
const client = await getClient(model);
|
|
@@ -408,7 +408,7 @@ var OpenAI_TextRewriter_Stream = async function* (input, model, signal) {
|
|
|
408
408
|
yield { type: "finish", data: {} };
|
|
409
409
|
};
|
|
410
410
|
|
|
411
|
-
// src/ai
|
|
411
|
+
// src/ai/common/OpenAI_TextSummary.ts
|
|
412
412
|
var OpenAI_TextSummary = async (input, model, update_progress, signal) => {
|
|
413
413
|
update_progress(0, "Starting OpenAI text summarization");
|
|
414
414
|
const client = await getClient(model);
|
|
@@ -443,14 +443,14 @@ var OpenAI_TextSummary_Stream = async function* (input, model, signal) {
|
|
|
443
443
|
yield { type: "finish", data: {} };
|
|
444
444
|
};
|
|
445
445
|
|
|
446
|
-
// src/ai
|
|
446
|
+
// src/ai/common/OpenAI_ToolCalling.ts
|
|
447
447
|
import { filterValidToolCalls, toOpenAIMessages as toOpenAIMessages2 } from "@workglow/ai/worker";
|
|
448
448
|
import {
|
|
449
449
|
accumulateOpenAIStream,
|
|
450
450
|
buildOpenAITools,
|
|
451
451
|
mapOpenAIToolChoice,
|
|
452
452
|
parseOpenAIToolCallMessage
|
|
453
|
-
} from "@workglow/ai-
|
|
453
|
+
} from "@workglow/ai/provider-utils";
|
|
454
454
|
var OpenAI_ToolCalling = async (input, model, update_progress, signal) => {
|
|
455
455
|
update_progress(0, "Starting OpenAI tool calling");
|
|
456
456
|
const client = await getClient(model);
|
|
@@ -489,10 +489,10 @@ var OpenAI_ToolCalling_Stream = async function* (input, model, signal) {
|
|
|
489
489
|
yield* accumulateOpenAIStream(stream);
|
|
490
490
|
};
|
|
491
491
|
|
|
492
|
-
// src/ai
|
|
492
|
+
// src/ai/common/OpenAI_ImageGenerate.ts
|
|
493
493
|
import { ImageGenerationContentPolicyError, ImageGenerationProviderError } from "@workglow/ai";
|
|
494
494
|
import { getLogger as getLogger3 } from "@workglow/util/worker";
|
|
495
|
-
import { dataUriToImageValue } from "@workglow/ai-
|
|
495
|
+
import { dataUriToImageValue } from "@workglow/ai/provider-utils";
|
|
496
496
|
function aspectRatioToSize(aspectRatio) {
|
|
497
497
|
switch (aspectRatio) {
|
|
498
498
|
case "16:9":
|
|
@@ -616,10 +616,10 @@ var OpenAI_ImageGenerate_Stream = async function* (input, model, signal) {
|
|
|
616
616
|
}
|
|
617
617
|
};
|
|
618
618
|
|
|
619
|
-
// src/ai
|
|
619
|
+
// src/ai/common/OpenAI_ImageEdit.ts
|
|
620
620
|
import { ImageGenerationContentPolicyError as ImageGenerationContentPolicyError2, ImageGenerationProviderError as ImageGenerationProviderError2 } from "@workglow/ai";
|
|
621
621
|
import { getLogger as getLogger4 } from "@workglow/util/worker";
|
|
622
|
-
import { dataUriToImageValue as dataUriToImageValue2, imageValueToPngBytes } from "@workglow/ai-
|
|
622
|
+
import { dataUriToImageValue as dataUriToImageValue2, imageValueToPngBytes } from "@workglow/ai/provider-utils";
|
|
623
623
|
function aspectRatioToSize2(aspectRatio) {
|
|
624
624
|
switch (aspectRatio) {
|
|
625
625
|
case "16:9":
|
|
@@ -722,7 +722,7 @@ var OpenAI_ImageEdit_Stream = async function* (input, model, signal) {
|
|
|
722
722
|
}
|
|
723
723
|
};
|
|
724
724
|
|
|
725
|
-
// src/ai
|
|
725
|
+
// src/ai/common/OpenAI_JobRunFns.ts
|
|
726
726
|
var OPENAI_TASKS = {
|
|
727
727
|
AiChatTask: OpenAI_Chat,
|
|
728
728
|
TextGenerationTask: OpenAI_TextGeneration,
|
|
@@ -751,9 +751,9 @@ var OPENAI_PREVIEW_TASKS = {
|
|
|
751
751
|
CountTokensTask: OpenAI_CountTokens_Preview
|
|
752
752
|
};
|
|
753
753
|
|
|
754
|
-
// src/ai
|
|
754
|
+
// src/ai/OpenAiQueuedProvider.ts
|
|
755
755
|
import { AiProvider } from "@workglow/ai";
|
|
756
|
-
import { createCloudProviderClass } from "@workglow/ai-
|
|
756
|
+
import { createCloudProviderClass } from "@workglow/ai/provider-utils";
|
|
757
757
|
var OPENAI_QUEUED_TASK_TYPES = [
|
|
758
758
|
"TextGenerationTask",
|
|
759
759
|
"TextEmbeddingTask",
|
|
@@ -775,7 +775,7 @@ class OpenAiQueuedProvider extends createCloudProviderClass(AiProvider, {
|
|
|
775
775
|
}) {
|
|
776
776
|
}
|
|
777
777
|
|
|
778
|
-
// src/ai
|
|
778
|
+
// src/ai/common/OpenAI_ImageValidation.ts
|
|
779
779
|
import { AiImageOutputTask, ProviderUnsupportedFeatureError } from "@workglow/ai";
|
|
780
780
|
function registerOpenAiImageValidator() {
|
|
781
781
|
AiImageOutputTask.registerProviderImageValidator(OPENAI, (taskType, input, model) => {
|
|
@@ -789,18 +789,18 @@ function registerOpenAiImageValidator() {
|
|
|
789
789
|
});
|
|
790
790
|
}
|
|
791
791
|
|
|
792
|
-
// src/ai
|
|
792
|
+
// src/ai/registerOpenAiInline.ts
|
|
793
793
|
async function registerOpenAiInline(options) {
|
|
794
794
|
registerOpenAiImageValidator();
|
|
795
795
|
await registerProviderInline(new OpenAiQueuedProvider(OPENAI_TASKS, OPENAI_STREAM_TASKS, OPENAI_PREVIEW_TASKS), "OpenAI", options);
|
|
796
796
|
}
|
|
797
797
|
|
|
798
|
-
// src/ai
|
|
799
|
-
import { registerProviderWorker } from "@workglow/ai-
|
|
798
|
+
// src/ai/registerOpenAiWorker.ts
|
|
799
|
+
import { registerProviderWorker } from "@workglow/ai/provider-utils";
|
|
800
800
|
|
|
801
|
-
// src/ai
|
|
801
|
+
// src/ai/OpenAiProvider.ts
|
|
802
802
|
import { AiProvider as AiProvider2 } from "@workglow/ai/worker";
|
|
803
|
-
import { createCloudProviderClass as createCloudProviderClass2 } from "@workglow/ai-
|
|
803
|
+
import { createCloudProviderClass as createCloudProviderClass2 } from "@workglow/ai/provider-utils";
|
|
804
804
|
var OPENAI_WORKER_TASK_TYPES = [
|
|
805
805
|
"TextGenerationTask",
|
|
806
806
|
"TextEmbeddingTask",
|
|
@@ -820,7 +820,7 @@ class OpenAiProvider extends createCloudProviderClass2(AiProvider2, {
|
|
|
820
820
|
}) {
|
|
821
821
|
}
|
|
822
822
|
|
|
823
|
-
// src/ai
|
|
823
|
+
// src/ai/registerOpenAiWorker.ts
|
|
824
824
|
async function registerOpenAiWorker() {
|
|
825
825
|
await registerProviderWorker((ws) => new OpenAiProvider(OPENAI_TASKS, OPENAI_STREAM_TASKS, OPENAI_PREVIEW_TASKS).registerOnWorkerServer(ws), "OpenAI");
|
|
826
826
|
}
|
|
@@ -832,4 +832,4 @@ export {
|
|
|
832
832
|
getClient
|
|
833
833
|
};
|
|
834
834
|
|
|
835
|
-
//# debugId=
|
|
835
|
+
//# debugId=5DF27E8E76883B5064756E2164756E21
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/ai/common/OpenAI_Client.ts", "../src/ai/registerOpenAiInline.ts", "../src/ai/common/OpenAI_ModelSearch.ts", "../src/ai/common/OpenAI_Constants.ts", "../src/ai/common/OpenAI_Chat.ts", "../src/ai/common/OpenAI_CountTokens.ts", "../src/ai/common/OpenAI_ModelInfo.ts", "../src/ai/common/OpenAI_StructuredGeneration.ts", "../src/ai/common/OpenAI_TextEmbedding.ts", "../src/ai/common/OpenAI_TextGeneration.ts", "../src/ai/common/OpenAI_TextRewriter.ts", "../src/ai/common/OpenAI_TextSummary.ts", "../src/ai/common/OpenAI_ToolCalling.ts", "../src/ai/common/OpenAI_ImageGenerate.ts", "../src/ai/common/OpenAI_ImageEdit.ts", "../src/ai/common/OpenAI_JobRunFns.ts", "../src/ai/OpenAiQueuedProvider.ts", "../src/ai/common/OpenAI_ImageValidation.ts", "../src/ai/registerOpenAiWorker.ts", "../src/ai/OpenAiProvider.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { isBrowserLike, resolveApiKey } from \"@workglow/ai/provider-utils\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype OpenAIClientClass = new (config: any) => any;\n\nlet _loadPromise: Promise<OpenAIClientClass> | undefined;\n\n// NOTE: we do not want to de-dup this in the provider-utils, vite wants direct import with string literals.\nexport async function loadOpenAISDK(): Promise<OpenAIClientClass> {\n _loadPromise ??= import(/* @vite-ignore */ \"openai\")\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .then((mod) => mod.default as OpenAIClientClass)\n .catch(() => {\n _loadPromise = undefined;\n throw new Error(\"openai is required for OpenAI tasks. Install it with: bun add openai\");\n });\n return _loadPromise;\n}\n\ninterface ResolvedProviderConfig {\n readonly credential_key?: string;\n readonly api_key?: string;\n readonly model_name?: string;\n readonly base_url?: string;\n readonly organization?: string;\n}\n\nexport async function getClient(model: OpenAiModelConfig | undefined) {\n const OpenAI = await loadOpenAISDK();\n const config = model?.provider_config as ResolvedProviderConfig | undefined;\n const apiKey = resolveApiKey({\n config,\n envVar: \"OPENAI_API_KEY\",\n providerLabel: \"OpenAI\",\n });\n try {\n return new OpenAI({\n apiKey,\n baseURL: config?.base_url || undefined,\n organization: config?.organization || undefined,\n dangerouslyAllowBrowser: isBrowserLike(),\n });\n } catch (err) {\n throw new Error(\n `Failed to create OpenAI client: ${err instanceof Error ? err.message : \"unknown error\"}`\n );\n }\n}\n\nexport function getModelName(model: OpenAiModelConfig | undefined): string {\n const name = model?.provider_config?.model_name;\n if (!name) {\n throw new Error(\"Missing model name in provider_config.model_name.\");\n }\n return name;\n}\n",
|
|
6
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRegisterOptions } from \"@workglow/ai\";\nimport { registerProviderInline } from \"@workglow/ai/provider-utils\";\nimport { OPENAI_PREVIEW_TASKS, OPENAI_STREAM_TASKS, OPENAI_TASKS } from \"./common/OpenAI_JobRunFns\";\nimport { OpenAiQueuedProvider } from \"./OpenAiQueuedProvider\";\nimport { registerOpenAiImageValidator } from \"./common/OpenAI_ImageValidation\";\n\nexport async function registerOpenAiInline(options?: AiProviderRegisterOptions): Promise<void> {\n registerOpenAiImageValidator();\n await registerProviderInline(\n new OpenAiQueuedProvider(OPENAI_TASKS, OPENAI_STREAM_TASKS, OPENAI_PREVIEW_TASKS),\n \"OpenAI\",\n options\n );\n}\n",
|
|
7
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n ModelSearchResultItem,\n ModelSearchTaskInput,\n ModelSearchTaskOutput,\n} from \"@workglow/ai\";\nimport { filterLabeledModelsByQuery } from \"@workglow/ai/provider-utils\";\nimport { getClient } from \"./OpenAI_Client\";\nimport { OPENAI } from \"./OpenAI_Constants\";\n\ninterface OpenAiModelListItem {\n readonly label: string;\n readonly value: string;\n readonly description?: string;\n}\n\nconst OPENAI_FALLBACK: Array<{ label: string; value: string }> = [\n { label: \"gpt-image-2\", value: \"gpt-image-2\" },\n { label: \"dall-e-3\", value: \"dall-e-3\" },\n { label: \"gpt-5.5\", value: \"gpt-5.5\" },\n { label: \"gpt-5.4-mini\", value: \"gpt-5.4-mini\" },\n { label: \"gpt-5.4-nano\", value: \"gpt-5.4-nano\" },\n { label: \"gpt-5\", value: \"gpt-5\" },\n { label: \"gpt-5-mini\", value: \"gpt-5-mini\" },\n { label: \"gpt-4o-mini\", value: \"gpt-4o-mini\" },\n { label: \"gpt-4-turbo\", value: \"gpt-4-turbo\" },\n { label: \"o3\", value: \"o3\" },\n { label: \"o3-mini\", value: \"o3-mini\" },\n { label: \"o1\", value: \"o1\" },\n { label: \"o1-mini\", value: \"o1-mini\" },\n];\n\nconst OPENAI_IMAGE_MODELS: Array<{ value: string; tasks: string[] }> = [\n { value: \"gpt-image-2\", tasks: [\"ImageGenerateTask\", \"ImageEditTask\"] },\n { value: \"dall-e-3\", tasks: [\"ImageGenerateTask\"] },\n];\n\nasync function listOpenAiModels(credentialKey: string): Promise<OpenAiModelListItem[]> {\n const client = await getClient({\n provider: OPENAI,\n provider_config: { model_name: \"\", credential_key: credentialKey },\n });\n const models: OpenAiModelListItem[] = [];\n for await (const m of client.models.list()) {\n models.push({ label: m.id, value: m.id, description: m.owned_by });\n }\n models.sort((a, b) => {\n const aGpt = a.value.startsWith(\"gpt\") || a.value.startsWith(\"o1\") ? 0 : 1;\n const bGpt = b.value.startsWith(\"gpt\") || b.value.startsWith(\"o1\") ? 0 : 1;\n if (aGpt !== bGpt) return aGpt - bGpt;\n return a.value.localeCompare(b.value);\n });\n return models;\n}\n\nfunction mapModelList(models: OpenAiModelListItem[]): ModelSearchResultItem[] {\n return models.map((m) => {\n const imageEntry = OPENAI_IMAGE_MODELS.find((i) => i.value === m.value);\n return {\n id: m.value,\n label: m.label,\n description: m.description ?? \"\",\n record: {\n model_id: m.value,\n provider: OPENAI,\n title: m.value,\n description: \"\",\n tasks: imageEntry?.tasks ?? [],\n provider_config: { model_name: m.value },\n metadata: {},\n },\n raw: m,\n };\n });\n}\n\nexport const OpenAI_ModelSearch: AiProviderRunFn<\n ModelSearchTaskInput,\n ModelSearchTaskOutput\n> = async (input) => {\n let models: OpenAiModelListItem[];\n if (!input.credential_key) {\n models = OPENAI_FALLBACK;\n } else {\n models = await listOpenAiModels(input.credential_key);\n }\n models = filterLabeledModelsByQuery(models, input.query);\n return { results: mapModelList(models) };\n};\n",
|
|
8
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport const OPENAI = \"OPENAI\";\n",
|
|
9
|
+
"/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiChatProviderInput,\n AiChatProviderOutput,\n AiProviderRunFn,\n AiProviderStreamFn,\n} from \"@workglow/ai\";\nimport { toOpenAIMessages } from \"@workglow/ai/worker\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport { getClient, getModelName } from \"./OpenAI_Client\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\nfunction buildParams(\n input: AiChatProviderInput,\n model: OpenAiModelConfig | undefined\n): Record<string, unknown> {\n // toOpenAIMessages accepts a ToolCallingTaskInput shape; synthesize one\n // with the fields it actually reads. Prompt is unused when messages present.\n const messages = toOpenAIMessages({\n messages: input.messages,\n systemPrompt: input.systemPrompt,\n prompt: \"\",\n tools: [],\n } as any);\n const params: Record<string, unknown> = {\n model: getModelName(model),\n messages,\n };\n if (input.temperature !== undefined) params.temperature = input.temperature;\n if (input.maxTokens !== undefined) params.max_completion_tokens = input.maxTokens;\n return params;\n}\n\nexport const OpenAI_Chat: AiProviderRunFn<\n AiChatProviderInput,\n AiChatProviderOutput,\n OpenAiModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"OpenAI chat turn\");\n const client = await getClient(model);\n const response = await client.chat.completions.create(buildParams(input, model) as any, {\n signal,\n });\n const text = (response as any).choices?.[0]?.message?.content ?? \"\";\n update_progress(100, \"Turn complete\");\n return { text };\n};\n\nexport const OpenAI_Chat_Stream: AiProviderStreamFn<\n AiChatProviderInput,\n AiChatProviderOutput,\n OpenAiModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<AiChatProviderOutput>> {\n const client = await getClient(model);\n const stream = await client.chat.completions.create(\n { ...buildParams(input, model), stream: true } as any,\n { signal }\n );\n for await (const chunk of stream as any) {\n const delta = (chunk as any).choices?.[0]?.delta?.content as string | undefined;\n if (delta) yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n yield { type: \"finish\", data: {} as AiChatProviderOutput };\n};\n",
|
|
10
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderPreviewRunFn,\n AiProviderRunFn,\n CountTokensTaskInput,\n CountTokensTaskOutput,\n} from \"@workglow/ai\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\nimport { getModelName } from \"./OpenAI_Client\";\nimport type { Tiktoken, TiktokenModel } from \"tiktoken\";\n\nlet _tiktoken: typeof import(\"tiktoken\") | undefined;\n\nasync function loadTiktoken() {\n if (!_tiktoken) {\n try {\n _tiktoken = await import(\"tiktoken\");\n } catch {\n throw new Error(\n \"tiktoken is required for OpenAI token counting. Install it with: bun add tiktoken\"\n );\n }\n }\n return _tiktoken;\n}\n\nconst _encoderCache = new Map<string, Tiktoken>();\n\nasync function getEncoder(modelName: string) {\n const tiktoken = await loadTiktoken();\n if (!_encoderCache.has(modelName)) {\n try {\n _encoderCache.set(modelName, tiktoken.encoding_for_model(modelName as TiktokenModel));\n } catch {\n const fallback = \"cl100k_base\";\n if (!_encoderCache.has(fallback)) {\n _encoderCache.set(fallback, tiktoken.get_encoding(fallback));\n }\n _encoderCache.set(modelName, _encoderCache.get(fallback)!);\n }\n }\n return _encoderCache.get(modelName)!;\n}\n\nexport const OpenAI_CountTokens: AiProviderRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n OpenAiModelConfig\n> = async (input, model) => {\n const enc = await getEncoder(getModelName(model));\n const tokens = enc.encode(input.text);\n return { count: tokens.length };\n};\n\nexport const OpenAI_CountTokens_Preview: AiProviderPreviewRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n OpenAiModelConfig\n> = async (input, model) => {\n return OpenAI_CountTokens(input, model, () => {}, new AbortController().signal);\n};\n",
|
|
11
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRunFn, ModelInfoTaskInput, ModelInfoTaskOutput } from \"@workglow/ai\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\n/** Known OpenAI embedding model dimensions. */\nconst OPENAI_EMBEDDING_DIMENSIONS: Record<string, { native_dimensions: number; mrl: boolean }> = {\n \"text-embedding-3-small\": { native_dimensions: 1536, mrl: true },\n \"text-embedding-3-large\": { native_dimensions: 3072, mrl: true },\n \"text-embedding-ada-002\": { native_dimensions: 1536, mrl: false },\n};\n\nexport const OpenAI_ModelInfo: AiProviderRunFn<\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n OpenAiModelConfig\n> = async (input, model) => {\n if (input.detail === \"dimensions\") {\n const pc = model?.provider_config as Record<string, unknown>;\n let native_dimensions =\n typeof pc?.native_dimensions === \"number\" ? pc.native_dimensions : undefined;\n let mrl = typeof pc?.mrl === \"boolean\" ? pc.mrl : undefined;\n\n // Lookup table fallback\n if (native_dimensions === undefined) {\n const modelName = (pc?.model_name as string) ?? \"\";\n const known = OPENAI_EMBEDDING_DIMENSIONS[modelName];\n if (known) {\n native_dimensions = known.native_dimensions;\n mrl = mrl ?? known.mrl;\n }\n }\n\n return {\n model: input.model,\n is_local: false,\n is_remote: true,\n supports_browser: true,\n supports_node: true,\n is_cached: false,\n is_loaded: false,\n file_sizes: null,\n ...(native_dimensions !== undefined ? { native_dimensions } : {}),\n ...(mrl !== undefined ? { mrl } : {}),\n };\n }\n\n return {\n model: input.model,\n is_local: false,\n is_remote: true,\n supports_browser: true,\n supports_node: true,\n is_cached: false,\n is_loaded: false,\n file_sizes: null,\n };\n};\n",
|
|
12
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport { parsePartialJson } from \"@workglow/util/worker\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\nimport { getClient, getModelName } from \"./OpenAI_Client\";\n\nexport const OpenAI_StructuredGeneration: AiProviderRunFn<\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n OpenAiModelConfig\n> = async (input, model, update_progress, signal, outputSchema) => {\n update_progress(0, \"Starting OpenAI structured generation\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const schema = input.outputSchema ?? outputSchema;\n\n const response = await client.chat.completions.create(\n {\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n response_format: {\n type: \"json_schema\" as any,\n json_schema: {\n name: \"structured_output\",\n schema: schema,\n strict: true,\n },\n } as any,\n max_completion_tokens: input.maxTokens,\n temperature: input.temperature,\n },\n { signal }\n );\n\n const content = response.choices[0]?.message?.content ?? \"{}\";\n update_progress(100, \"Completed OpenAI structured generation\");\n return { object: JSON.parse(content) };\n};\n\nexport const OpenAI_StructuredGeneration_Stream: AiProviderStreamFn<\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n OpenAiModelConfig\n> = async function* (\n input,\n model,\n signal,\n outputSchema\n): AsyncIterable<StreamEvent<StructuredGenerationTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const schema = input.outputSchema ?? outputSchema;\n\n const stream = await client.chat.completions.create(\n {\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n response_format: {\n type: \"json_schema\" as any,\n json_schema: {\n name: \"structured_output\",\n schema: schema,\n strict: true,\n },\n } as any,\n max_completion_tokens: input.maxTokens,\n temperature: input.temperature,\n stream: true,\n },\n { signal }\n );\n\n let accumulatedJson = \"\";\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content ?? \"\";\n if (delta) {\n accumulatedJson += delta;\n const partial = parsePartialJson(accumulatedJson);\n if (partial !== undefined) {\n yield { type: \"object-delta\", port: \"object\", objectDelta: partial };\n }\n }\n }\n\n let finalObject: Record<string, unknown>;\n try {\n finalObject = JSON.parse(accumulatedJson);\n } catch {\n finalObject = parsePartialJson(accumulatedJson) ?? {};\n }\n yield { type: \"finish\", data: { object: finalObject } as StructuredGenerationTaskOutput };\n};\n",
|
|
13
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n} from \"@workglow/ai\";\nimport { getLogger } from \"@workglow/util/worker\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\nimport { getClient, getModelName } from \"./OpenAI_Client\";\n\nexport const OpenAI_TextEmbedding: AiProviderRunFn<\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n OpenAiModelConfig\n> = async (input, model, update_progress, signal) => {\n const logger = getLogger();\n const timerLabel = `openai:TextEmbedding:${model?.provider_config?.model_name}`;\n logger.time(timerLabel, { model: model?.provider_config?.model_name });\n\n update_progress(0, \"Starting OpenAI text embedding\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.embeddings.create(\n {\n model: modelName,\n input: input.text,\n },\n { signal }\n );\n\n update_progress(100, \"Completed OpenAI text embedding\");\n logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name });\n\n if (Array.isArray(input.text)) {\n return {\n vector: response.data.map(\n (item: { embedding: number[] }) => new Float32Array(item.embedding)\n ),\n };\n }\n return { vector: new Float32Array(response.data[0].embedding) };\n};\n",
|
|
14
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport { getLogger } from \"@workglow/util/worker\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\nimport { getClient, getModelName } from \"./OpenAI_Client\";\n\nexport const OpenAI_TextGeneration: AiProviderRunFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n OpenAiModelConfig\n> = async (input, model, update_progress, signal) => {\n const logger = getLogger();\n const timerLabel = `openai:TextGeneration:${model?.provider_config?.model_name}`;\n logger.time(timerLabel, { model: model?.provider_config?.model_name });\n\n update_progress(0, \"Starting OpenAI text generation\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.chat.completions.create(\n {\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n max_completion_tokens: input.maxTokens,\n temperature: input.temperature,\n top_p: input.topP,\n frequency_penalty: input.frequencyPenalty,\n presence_penalty: input.presencePenalty,\n },\n { signal }\n );\n\n update_progress(100, \"Completed OpenAI text generation\");\n logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name });\n return { text: response.choices[0]?.message?.content ?? \"\" };\n};\n\nexport const OpenAI_TextGeneration_Stream: AiProviderStreamFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n OpenAiModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextGenerationTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = await client.chat.completions.create(\n {\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n max_completion_tokens: input.maxTokens,\n temperature: input.temperature,\n top_p: input.topP,\n frequency_penalty: input.frequencyPenalty,\n presence_penalty: input.presencePenalty,\n stream: true,\n },\n { signal }\n );\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content ?? \"\";\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextGenerationTaskOutput };\n};\n",
|
|
15
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\nimport { getClient, getModelName } from \"./OpenAI_Client\";\n\nexport const OpenAI_TextRewriter: AiProviderRunFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n OpenAiModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting OpenAI text rewriting\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.chat.completions.create(\n {\n model: modelName,\n messages: [\n { role: \"system\", content: input.prompt },\n { role: \"user\", content: input.text },\n ],\n },\n { signal }\n );\n\n update_progress(100, \"Completed OpenAI text rewriting\");\n return { text: response.choices[0]?.message?.content ?? \"\" };\n};\n\nexport const OpenAI_TextRewriter_Stream: AiProviderStreamFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n OpenAiModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextRewriterTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = await client.chat.completions.create(\n {\n model: modelName,\n messages: [\n { role: \"system\", content: input.prompt },\n { role: \"user\", content: input.text },\n ],\n stream: true,\n },\n { signal }\n );\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content ?? \"\";\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextRewriterTaskOutput };\n};\n",
|
|
16
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\nimport { getClient, getModelName } from \"./OpenAI_Client\";\n\nexport const OpenAI_TextSummary: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n OpenAiModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting OpenAI text summarization\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.chat.completions.create(\n {\n model: modelName,\n messages: [\n { role: \"system\", content: \"Summarize the following text concisely.\" },\n { role: \"user\", content: input.text },\n ],\n },\n { signal }\n );\n\n update_progress(100, \"Completed OpenAI text summarization\");\n return { text: response.choices[0]?.message?.content ?? \"\" };\n};\n\nexport const OpenAI_TextSummary_Stream: AiProviderStreamFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n OpenAiModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextSummaryTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = await client.chat.completions.create(\n {\n model: modelName,\n messages: [\n { role: \"system\", content: \"Summarize the following text concisely.\" },\n { role: \"user\", content: input.text },\n ],\n stream: true,\n },\n { signal }\n );\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content ?? \"\";\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextSummaryTaskOutput };\n};\n",
|
|
17
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { filterValidToolCalls, toOpenAIMessages } from \"@workglow/ai/worker\";\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport {\n accumulateOpenAIStream,\n buildOpenAITools,\n mapOpenAIToolChoice,\n parseOpenAIToolCallMessage,\n} from \"@workglow/ai/provider-utils\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\nimport { getClient, getModelName } from \"./OpenAI_Client\";\n\nexport const OpenAI_ToolCalling: AiProviderRunFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n OpenAiModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting OpenAI tool calling\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const tools = buildOpenAITools(input.tools);\n const messages = toOpenAIMessages(input);\n const toolChoice = mapOpenAIToolChoice(input.toolChoice, true);\n\n const response = await client.chat.completions.create(\n {\n model: modelName,\n messages,\n max_completion_tokens: input.maxTokens,\n temperature: input.temperature,\n tools,\n tool_choice: toolChoice,\n },\n { signal }\n );\n\n const text = response.choices[0]?.message?.content ?? \"\";\n const toolCalls = parseOpenAIToolCallMessage(response.choices[0]?.message?.tool_calls);\n\n update_progress(100, \"Completed OpenAI tool calling\");\n return { text, toolCalls: filterValidToolCalls(toolCalls, input.tools) };\n};\n\nexport const OpenAI_ToolCalling_Stream: AiProviderStreamFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n OpenAiModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<ToolCallingTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const tools = buildOpenAITools(input.tools);\n const messages = toOpenAIMessages(input);\n const toolChoice = mapOpenAIToolChoice(input.toolChoice, true);\n\n const stream = await client.chat.completions.create(\n {\n model: modelName,\n messages,\n max_completion_tokens: input.maxTokens,\n temperature: input.temperature,\n stream: true,\n tools,\n tool_choice: toolChoice,\n },\n { signal }\n );\n\n yield* accumulateOpenAIStream(stream);\n};\n",
|
|
18
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n ImageGenerateTaskInput,\n ImageGenerateTaskOutput,\n ModelConfig,\n} from \"@workglow/ai\";\nimport { ImageGenerationContentPolicyError, ImageGenerationProviderError } from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { ImageValue } from \"@workglow/util/media\";\nimport { getLogger } from \"@workglow/util/worker\";\n\nimport { dataUriToImageValue } from \"@workglow/ai/provider-utils\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\nimport { getClient, getModelName } from \"./OpenAI_Client\";\n\n/** Maps the normalized aspect ratio to gpt-image-2 / DALL-E supported sizes. */\nfunction aspectRatioToSize(\n aspectRatio: string | undefined\n): \"1024x1024\" | \"1024x1536\" | \"1536x1024\" {\n switch (aspectRatio) {\n case \"16:9\":\n case \"4:3\":\n return \"1536x1024\";\n case \"9:16\":\n case \"3:4\":\n return \"1024x1536\";\n case \"1:1\":\n default:\n return \"1024x1024\";\n }\n}\n\nasync function decodeB64Png(b64: string): Promise<ImageValue> {\n return dataUriToImageValue(`data:image/png;base64,${b64}`);\n}\n\nfunction modelIdOf(model: ModelConfig | undefined): string {\n return (\n model?.model_id ??\n (model?.provider_config as { model_name?: string } | undefined)?.model_name ??\n \"openai\"\n );\n}\n\n/** Non-streaming path. Used for DALL-E or when streaming is not requested. */\nexport const OpenAI_ImageGenerate: AiProviderRunFn<\n ImageGenerateTaskInput,\n ImageGenerateTaskOutput,\n OpenAiModelConfig\n> = async (input, model, update_progress, signal) => {\n const logger = getLogger();\n const timer = `openai:ImageGenerate:${getModelName(model)}`;\n logger.time(timer);\n update_progress(0, \"Starting OpenAI image generation\");\n\n const client = await getClient(model);\n const modelName = getModelName(model);\n const size = aspectRatioToSize(input.aspectRatio);\n\n try {\n const resp = await client.images.generate(\n {\n model: modelName,\n prompt: input.prompt,\n size,\n quality: input.quality as\n | \"standard\"\n | \"hd\"\n | \"low\"\n | \"medium\"\n | \"high\"\n | \"auto\"\n | undefined,\n n: 1,\n response_format: \"b64_json\",\n ...(input.providerOptions ?? {}),\n } as Parameters<typeof client.images.generate>[0],\n { signal }\n );\n\n const b64 = resp.data?.[0]?.b64_json;\n if (!b64) {\n throw new ImageGenerationProviderError(modelIdOf(model), \"Empty response (no b64_json)\");\n }\n const image = await decodeB64Png(b64);\n update_progress(100, \"Completed OpenAI image generation\");\n logger.timeEnd(timer);\n return { image };\n } catch (err) {\n if (\n err instanceof ImageGenerationProviderError ||\n err instanceof ImageGenerationContentPolicyError\n ) {\n throw err;\n }\n const msg = err instanceof Error ? err.message : \"unknown error\";\n if (/safety|policy|moderation/i.test(msg)) {\n throw new ImageGenerationContentPolicyError(modelIdOf(model), msg);\n }\n throw new ImageGenerationProviderError(modelIdOf(model), msg, { cause: err as Error });\n }\n};\n\n/**\n * Streaming path. Yields snapshot events for each partial + final image, then finish.\n * Uses SDK v6+ streaming support: `stream: true` + `partial_images: 3` on GPT image models.\n * DALL-E 3 does not support streaming (the SDK overload for stream=true is not valid for it),\n * so this function falls back to the non-streaming path for DALL-E models.\n */\nexport const OpenAI_ImageGenerate_Stream: AiProviderStreamFn<\n ImageGenerateTaskInput,\n ImageGenerateTaskOutput,\n OpenAiModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<ImageGenerateTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n const size = aspectRatioToSize(input.aspectRatio);\n\n // DALL-E 2 and DALL-E 3 do not support streaming — fall back to non-streaming.\n if (modelName.startsWith(\"dall-e\")) {\n try {\n const resp = await (client.images.generate as Function)(\n {\n model: modelName,\n prompt: input.prompt,\n size,\n quality: input.quality,\n n: 1,\n response_format: \"b64_json\",\n ...(input.providerOptions ?? {}),\n },\n { signal }\n );\n const b64 = resp.data?.[0]?.b64_json;\n if (!b64) {\n throw new ImageGenerationProviderError(modelIdOf(model), \"Empty response (no b64_json)\");\n }\n const image = await decodeB64Png(b64);\n yield { type: \"snapshot\", data: { image } } as StreamEvent<ImageGenerateTaskOutput>;\n yield { type: \"finish\", data: {} as ImageGenerateTaskOutput };\n return;\n } catch (err) {\n if (\n err instanceof ImageGenerationProviderError ||\n err instanceof ImageGenerationContentPolicyError\n ) {\n throw err;\n }\n const msg = err instanceof Error ? err.message : \"unknown error\";\n if (/safety|policy|moderation/i.test(msg)) {\n throw new ImageGenerationContentPolicyError(modelIdOf(model), msg);\n }\n throw new ImageGenerationProviderError(modelIdOf(model), msg, { cause: err as Error });\n }\n }\n\n // GPT image models support streaming.\n try {\n const stream = await client.images.generate(\n {\n model: modelName,\n prompt: input.prompt,\n size,\n quality: input.quality as \"low\" | \"medium\" | \"high\" | \"auto\" | undefined,\n n: 1,\n stream: true,\n partial_images: 3,\n ...(input.providerOptions ?? {}),\n },\n { signal }\n );\n\n for await (const event of stream) {\n if (signal.aborted) return;\n const b64 = event.b64_json;\n if (!b64) continue;\n const image = await decodeB64Png(b64);\n yield { type: \"snapshot\", data: { image } } as StreamEvent<ImageGenerateTaskOutput>;\n }\n yield { type: \"finish\", data: {} as ImageGenerateTaskOutput };\n } catch (err) {\n if (\n err instanceof ImageGenerationProviderError ||\n err instanceof ImageGenerationContentPolicyError\n ) {\n throw err;\n }\n const msg = err instanceof Error ? err.message : \"unknown error\";\n if (/safety|policy|moderation/i.test(msg)) {\n throw new ImageGenerationContentPolicyError(modelIdOf(model), msg);\n }\n throw new ImageGenerationProviderError(modelIdOf(model), msg, { cause: err as Error });\n }\n};\n",
|
|
19
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n ImageEditTaskInput,\n ImageEditTaskOutput,\n ModelConfig,\n} from \"@workglow/ai\";\nimport { ImageGenerationContentPolicyError, ImageGenerationProviderError } from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { ImageValue } from \"@workglow/util/media\";\nimport { getLogger } from \"@workglow/util/worker\";\n\nimport { dataUriToImageValue, imageValueToPngBytes } from \"@workglow/ai/provider-utils\";\nimport { getClient, getModelName } from \"./OpenAI_Client\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\ntype OpenAiImageInput = ImageValue | string;\n\nfunction aspectRatioToSize(\n aspectRatio: string | undefined\n): \"1024x1024\" | \"1024x1536\" | \"1536x1024\" {\n switch (aspectRatio) {\n case \"16:9\":\n case \"4:3\":\n return \"1536x1024\";\n case \"9:16\":\n case \"3:4\":\n return \"1024x1536\";\n case \"1:1\":\n default:\n return \"1024x1024\";\n }\n}\n\nfunction modelIdOf(model: ModelConfig | undefined): string {\n return (\n model?.model_id ??\n (model?.provider_config as { model_name?: string } | undefined)?.model_name ??\n \"openai\"\n );\n}\n\n/**\n * Encode an inbound `ImageValue` (or a serialized data URI from the worker\n * boundary) to PNG bytes wrapped in a File suitable for the OpenAI multipart\n * upload. Uses `OpenAI.toFile` when available (SDK v4+), otherwise falls\n * back to `new File(...)`.\n */\nasync function gpuImageToOpenAiFile(image: OpenAiImageInput, name: string): Promise<unknown> {\n const bytes = await imageValueToPngBytes(image);\n // Copy to a plain ArrayBuffer to avoid SharedArrayBuffer typing issues with BlobPart.\n const buffer: ArrayBuffer =\n bytes.buffer instanceof ArrayBuffer\n ? bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)\n : new Uint8Array(bytes).buffer;\n const sdk = (await import(\"openai\")) as unknown as {\n toFile?: (input: unknown, name?: string, options?: { type?: string }) => Promise<unknown>;\n };\n if (typeof sdk.toFile === \"function\") {\n return sdk.toFile(new Blob([buffer], { type: \"image/png\" }), name, { type: \"image/png\" });\n }\n return new File([buffer], name, { type: \"image/png\" });\n}\n\nasync function decodeB64Png(b64: string): Promise<ImageValue> {\n return dataUriToImageValue(`data:image/png;base64,${b64}`);\n}\n\nasync function buildEditPayload(\n input: ImageEditTaskInput,\n model: OpenAiModelConfig | undefined\n): Promise<Record<string, unknown>> {\n const modelName = getModelName(model);\n // image/mask/additionalImages may be data URI strings when the input crossed\n // the worker boundary via AiImageOutputTask.getJobInput materialization.\n const primary = await gpuImageToOpenAiFile(\n input.image as unknown as OpenAiImageInput,\n \"image.png\"\n );\n const additionalFiles =\n input.additionalImages && (input.additionalImages as OpenAiImageInput[]).length > 0\n ? await Promise.all(\n (input.additionalImages as OpenAiImageInput[]).map((g, i) =>\n gpuImageToOpenAiFile(g, `image-${i + 1}.png`)\n )\n )\n : [];\n const imageField = additionalFiles.length === 0 ? primary : [primary, ...additionalFiles];\n\n const payload: Record<string, unknown> = {\n model: modelName,\n prompt: input.prompt,\n image: imageField,\n size: aspectRatioToSize(input.aspectRatio),\n quality: input.quality,\n n: 1,\n ...(input.providerOptions ?? {}),\n };\n if (input.mask) {\n payload.mask = await gpuImageToOpenAiFile(\n input.mask as unknown as OpenAiImageInput,\n \"mask.png\"\n );\n }\n return payload;\n}\n\nexport const OpenAI_ImageEdit: AiProviderRunFn<\n ImageEditTaskInput,\n ImageEditTaskOutput,\n OpenAiModelConfig\n> = async (input, model, update_progress, signal) => {\n const logger = getLogger();\n const timer = `openai:ImageEdit:${getModelName(model)}`;\n logger.time(timer);\n update_progress(0, \"Starting OpenAI image edit\");\n\n const client = await getClient(model);\n\n try {\n const payload = await buildEditPayload(input, model);\n const resp = (await (client.images.edit as Function)(payload, { signal })) as {\n data?: Array<{ b64_json?: string }>;\n };\n const b64 = resp.data?.[0]?.b64_json;\n if (!b64) {\n throw new ImageGenerationProviderError(modelIdOf(model), \"Empty response (no b64_json)\");\n }\n const image = await decodeB64Png(b64);\n update_progress(100, \"Completed OpenAI image edit\");\n logger.timeEnd(timer);\n return { image };\n } catch (err) {\n if (\n err instanceof ImageGenerationProviderError ||\n err instanceof ImageGenerationContentPolicyError\n ) {\n throw err;\n }\n const msg = err instanceof Error ? err.message : \"unknown error\";\n if (/safety|policy|moderation/i.test(msg)) {\n throw new ImageGenerationContentPolicyError(modelIdOf(model), msg);\n }\n throw new ImageGenerationProviderError(modelIdOf(model), msg, { cause: err as Error });\n }\n};\n\n/**\n * Streaming edit path. Yields snapshot events for each partial + final image, then finish.\n * SDK v6.35+ supports `stream: true` on `images.edit` for GPT image models.\n */\nexport const OpenAI_ImageEdit_Stream: AiProviderStreamFn<\n ImageEditTaskInput,\n ImageEditTaskOutput,\n OpenAiModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<ImageEditTaskOutput>> {\n const client = await getClient(model);\n\n try {\n const payload = await buildEditPayload(input, model);\n const stream = (await (client.images.edit as Function)(\n { ...payload, stream: true, partial_images: 3 },\n { signal }\n )) as AsyncIterable<{ b64_json?: string }>;\n\n for await (const event of stream) {\n if (signal.aborted) return;\n const b64 = event.b64_json;\n if (!b64) continue;\n const image = await decodeB64Png(b64);\n yield { type: \"snapshot\", data: { image } } as StreamEvent<ImageEditTaskOutput>;\n }\n yield { type: \"finish\", data: {} as ImageEditTaskOutput };\n } catch (err) {\n if (\n err instanceof ImageGenerationProviderError ||\n err instanceof ImageGenerationContentPolicyError\n ) {\n throw err;\n }\n const msg = err instanceof Error ? err.message : \"unknown error\";\n if (/safety|policy|moderation/i.test(msg)) {\n throw new ImageGenerationContentPolicyError(modelIdOf(model), msg);\n }\n throw new ImageGenerationProviderError(modelIdOf(model), msg, { cause: err as Error });\n }\n};\n",
|
|
20
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderPreviewRunFn, AiProviderRunFn, AiProviderStreamFn } from \"@workglow/ai\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\nimport { OpenAI_ModelSearch } from \"./OpenAI_ModelSearch\";\n\nexport { loadOpenAISDK, getClient, getModelName } from \"./OpenAI_Client\";\n\nimport { OpenAI_Chat, OpenAI_Chat_Stream } from \"./OpenAI_Chat\";\nimport { OpenAI_CountTokens, OpenAI_CountTokens_Preview } from \"./OpenAI_CountTokens\";\nimport { OpenAI_ModelInfo } from \"./OpenAI_ModelInfo\";\nimport {\n OpenAI_StructuredGeneration,\n OpenAI_StructuredGeneration_Stream,\n} from \"./OpenAI_StructuredGeneration\";\nimport { OpenAI_TextEmbedding } from \"./OpenAI_TextEmbedding\";\nimport { OpenAI_TextGeneration, OpenAI_TextGeneration_Stream } from \"./OpenAI_TextGeneration\";\nimport { OpenAI_TextRewriter, OpenAI_TextRewriter_Stream } from \"./OpenAI_TextRewriter\";\nimport { OpenAI_TextSummary, OpenAI_TextSummary_Stream } from \"./OpenAI_TextSummary\";\nimport { OpenAI_ToolCalling, OpenAI_ToolCalling_Stream } from \"./OpenAI_ToolCalling\";\nimport { OpenAI_ImageGenerate, OpenAI_ImageGenerate_Stream } from \"./OpenAI_ImageGenerate\";\nimport { OpenAI_ImageEdit, OpenAI_ImageEdit_Stream } from \"./OpenAI_ImageEdit\";\n\nexport const OPENAI_TASKS: Record<string, AiProviderRunFn<any, any, OpenAiModelConfig>> = {\n AiChatTask: OpenAI_Chat,\n TextGenerationTask: OpenAI_TextGeneration,\n ModelInfoTask: OpenAI_ModelInfo,\n TextEmbeddingTask: OpenAI_TextEmbedding,\n TextRewriterTask: OpenAI_TextRewriter,\n TextSummaryTask: OpenAI_TextSummary,\n CountTokensTask: OpenAI_CountTokens,\n StructuredGenerationTask: OpenAI_StructuredGeneration,\n ToolCallingTask: OpenAI_ToolCalling,\n ModelSearchTask: OpenAI_ModelSearch,\n ImageGenerateTask: OpenAI_ImageGenerate,\n ImageEditTask: OpenAI_ImageEdit,\n};\n\nexport const OPENAI_STREAM_TASKS: Record<\n string,\n AiProviderStreamFn<any, any, OpenAiModelConfig>\n> = {\n AiChatTask: OpenAI_Chat_Stream,\n TextGenerationTask: OpenAI_TextGeneration_Stream,\n TextRewriterTask: OpenAI_TextRewriter_Stream,\n TextSummaryTask: OpenAI_TextSummary_Stream,\n StructuredGenerationTask: OpenAI_StructuredGeneration_Stream,\n ToolCallingTask: OpenAI_ToolCalling_Stream,\n ImageGenerateTask: OpenAI_ImageGenerate_Stream,\n ImageEditTask: OpenAI_ImageEdit_Stream,\n};\n\nexport const OPENAI_PREVIEW_TASKS: Record<\n string,\n AiProviderPreviewRunFn<any, any, OpenAiModelConfig>\n> = {\n CountTokensTask: OpenAI_CountTokens_Preview,\n};\n",
|
|
21
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AiProvider } from \"@workglow/ai\";\nimport { createCloudProviderClass } from \"@workglow/ai/provider-utils\";\nimport { OPENAI } from \"./common/OpenAI_Constants\";\nimport type { OpenAiModelConfig } from \"./common/OpenAI_ModelSchema\";\n\nconst OPENAI_QUEUED_TASK_TYPES = [\n \"TextGenerationTask\",\n \"TextEmbeddingTask\",\n \"TextRewriterTask\",\n \"TextSummaryTask\",\n \"CountTokensTask\",\n \"ModelInfoTask\",\n \"StructuredGenerationTask\",\n \"ToolCallingTask\",\n \"ModelSearchTask\",\n \"ImageGenerateTask\",\n \"ImageEditTask\",\n] as const;\n\n/** Main-thread registration (inline or worker-backed). No queue — uses direct execution. */\nexport class OpenAiQueuedProvider extends createCloudProviderClass<\n OpenAiModelConfig,\n typeof OPENAI_QUEUED_TASK_TYPES\n>(AiProvider, {\n name: OPENAI,\n displayName: \"OpenAI\",\n taskTypes: OPENAI_QUEUED_TASK_TYPES,\n}) {}\n",
|
|
22
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AiImageOutputTask, ProviderUnsupportedFeatureError } from \"@workglow/ai\";\nimport type { ModelConfig } from \"@workglow/ai\";\n\nimport { OPENAI } from \"./OpenAI_Constants\";\n\n/**\n * Registers the OpenAI per-provider image validator. Called at provider registration time\n * (both inline and worker-backed paths) so it runs on the main thread before any dispatch.\n *\n * Currently validates:\n * - DALL-E 2 + non-empty `additionalImages` → throws (single-image edit only).\n * DALL-E 3 + ImageEditTask is rejected upstream by the model registry task-array check.\n */\nexport function registerOpenAiImageValidator(): void {\n AiImageOutputTask.registerProviderImageValidator(\n OPENAI,\n (taskType, input, model: ModelConfig) => {\n if (taskType !== \"ImageEditTask\") return;\n const modelName =\n (model.provider_config as { model_name?: string } | undefined)?.model_name ?? \"\";\n const additional = input[\"additionalImages\"] as unknown[] | undefined;\n if (modelName.startsWith(\"dall-e-2\") && Array.isArray(additional) && additional.length > 0) {\n throw new ProviderUnsupportedFeatureError(\n \"additionalImages\",\n model.model_id ?? modelName,\n \"DALL-E 2 only supports single-image edits\"\n );\n }\n }\n );\n}\n",
|
|
23
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { registerProviderWorker } from \"@workglow/ai/provider-utils\";\nimport { OPENAI_PREVIEW_TASKS, OPENAI_STREAM_TASKS, OPENAI_TASKS } from \"./common/OpenAI_JobRunFns\";\nimport { OpenAiProvider } from \"./OpenAiProvider\";\n\nexport async function registerOpenAiWorker(): Promise<void> {\n await registerProviderWorker(\n (ws) =>\n new OpenAiProvider(\n OPENAI_TASKS,\n OPENAI_STREAM_TASKS,\n OPENAI_PREVIEW_TASKS\n ).registerOnWorkerServer(ws),\n \"OpenAI\"\n );\n}\n",
|
|
24
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AiProvider } from \"@workglow/ai/worker\";\nimport { createCloudProviderClass } from \"@workglow/ai/provider-utils\";\nimport { OPENAI } from \"./common/OpenAI_Constants\";\nimport type { OpenAiModelConfig } from \"./common/OpenAI_ModelSchema\";\n\nconst OPENAI_WORKER_TASK_TYPES = [\n \"TextGenerationTask\",\n \"TextEmbeddingTask\",\n \"TextRewriterTask\",\n \"TextSummaryTask\",\n \"CountTokensTask\",\n \"ModelInfoTask\",\n \"StructuredGenerationTask\",\n \"ToolCallingTask\",\n \"ModelSearchTask\",\n] as const;\n\n/**\n * Worker-server registration for OpenAI cloud models. Imports `AiProvider`\n * from `@workglow/ai/worker` so the SDK is only loaded in the worker.\n */\nexport class OpenAiProvider extends createCloudProviderClass<\n OpenAiModelConfig,\n typeof OPENAI_WORKER_TASK_TYPES\n>(AiProvider, {\n name: OPENAI,\n displayName: \"OpenAI\",\n taskTypes: OPENAI_WORKER_TASK_TYPES,\n}) {}\n"
|
|
25
|
+
],
|
|
26
|
+
"mappings": "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",
|
|
27
|
+
"debugId": "5DF27E8E76883B5064756E2164756E21",
|
|
28
|
+
"names": []
|
|
29
|
+
}
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
export * from "./ai
|
|
7
|
-
//# sourceMappingURL=ai
|
|
6
|
+
export * from "./ai/index.browser";
|
|
7
|
+
//# sourceMappingURL=ai.browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.browser.d.ts","sourceRoot":"","sources":["../src/ai.browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,oBAAoB,CAAC"}
|
|
@@ -6,10 +6,10 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
6
6
|
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
7
|
});
|
|
8
8
|
|
|
9
|
-
// src/ai
|
|
9
|
+
// src/ai/common/OpenAI_Constants.ts
|
|
10
10
|
var OPENAI = "OPENAI";
|
|
11
11
|
|
|
12
|
-
// src/ai
|
|
12
|
+
// src/ai/common/OpenAI_ModelSchema.ts
|
|
13
13
|
import { ModelConfigSchema, ModelRecordSchema } from "@workglow/ai/worker";
|
|
14
14
|
var OpenAiModelSchema = {
|
|
15
15
|
type: "object",
|
|
@@ -68,12 +68,12 @@ var OpenAiModelConfigSchema = {
|
|
|
68
68
|
additionalProperties: false
|
|
69
69
|
};
|
|
70
70
|
|
|
71
|
-
// src/ai
|
|
72
|
-
import { registerProviderWithWorker } from "@workglow/ai-
|
|
71
|
+
// src/ai/registerOpenAi.ts
|
|
72
|
+
import { registerProviderWithWorker } from "@workglow/ai/provider-utils";
|
|
73
73
|
|
|
74
|
-
// src/ai
|
|
74
|
+
// src/ai/OpenAiQueuedProvider.ts
|
|
75
75
|
import { AiProvider } from "@workglow/ai";
|
|
76
|
-
import { createCloudProviderClass } from "@workglow/ai-
|
|
76
|
+
import { createCloudProviderClass } from "@workglow/ai/provider-utils";
|
|
77
77
|
var OPENAI_QUEUED_TASK_TYPES = [
|
|
78
78
|
"TextGenerationTask",
|
|
79
79
|
"TextEmbeddingTask",
|
|
@@ -95,7 +95,7 @@ class OpenAiQueuedProvider extends createCloudProviderClass(AiProvider, {
|
|
|
95
95
|
}) {
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
// src/ai
|
|
98
|
+
// src/ai/common/OpenAI_ImageValidation.ts
|
|
99
99
|
import { AiImageOutputTask, ProviderUnsupportedFeatureError } from "@workglow/ai";
|
|
100
100
|
function registerOpenAiImageValidator() {
|
|
101
101
|
AiImageOutputTask.registerProviderImageValidator(OPENAI, (taskType, input, model) => {
|
|
@@ -109,7 +109,7 @@ function registerOpenAiImageValidator() {
|
|
|
109
109
|
});
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
// src/ai
|
|
112
|
+
// src/ai/registerOpenAi.ts
|
|
113
113
|
async function registerOpenAi(options) {
|
|
114
114
|
registerOpenAiImageValidator();
|
|
115
115
|
await registerProviderWithWorker(new OpenAiQueuedProvider, "OpenAI", options);
|
|
@@ -122,4 +122,4 @@ export {
|
|
|
122
122
|
OPENAI
|
|
123
123
|
};
|
|
124
124
|
|
|
125
|
-
//# debugId=
|
|
125
|
+
//# debugId=E377DE95035F778064756E2164756E21
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/ai
|
|
3
|
+
"sources": ["../src/ai/common/OpenAI_Constants.ts", "../src/ai/common/OpenAI_ModelSchema.ts", "../src/ai/registerOpenAi.ts", "../src/ai/OpenAiQueuedProvider.ts", "../src/ai/common/OpenAI_ImageValidation.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport const OPENAI = \"OPENAI\";\n",
|
|
6
6
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ModelConfigSchema, ModelRecordSchema } from \"@workglow/ai/worker\";\nimport { DataPortSchemaObject, FromSchema } from \"@workglow/util/worker\";\nimport { OPENAI } from \"./OpenAI_Constants\";\n\nexport const OpenAiModelSchema = {\n type: \"object\",\n properties: {\n provider: {\n const: OPENAI,\n description: \"Discriminator: OpenAI cloud provider.\",\n },\n provider_config: {\n type: \"object\",\n description: \"OpenAI-specific configuration.\",\n properties: {\n model_name: {\n type: \"string\",\n description: \"The OpenAI model identifier (e.g., 'gpt-4o', 'text-embedding-3-small').\",\n },\n credential_key: {\n type: \"string\",\n format: \"credential\",\n description: \"Key to look up in the credential store for the API key.\",\n \"x-ui-hidden\": true,\n },\n base_url: {\n type: \"string\",\n description: \"Base URL for the OpenAI API. Useful for Azure OpenAI or proxy servers.\",\n default: \"https://api.openai.com/v1\",\n },\n organization: {\n type: \"string\",\n description: \"OpenAI organization ID (optional).\",\n },\n },\n required: [\"model_name\"],\n additionalProperties: false,\n },\n },\n required: [\"provider\", \"provider_config\"],\n additionalProperties: true,\n} as const satisfies DataPortSchemaObject;\n\nexport const OpenAiModelRecordSchema = {\n type: \"object\",\n properties: {\n ...ModelRecordSchema.properties,\n ...OpenAiModelSchema.properties,\n },\n required: [...ModelRecordSchema.required, ...OpenAiModelSchema.required],\n additionalProperties: false,\n} as const satisfies DataPortSchemaObject;\n\nexport type OpenAiModelRecord = FromSchema<typeof OpenAiModelRecordSchema>;\n\nexport const OpenAiModelConfigSchema = {\n type: \"object\",\n properties: {\n ...ModelConfigSchema.properties,\n ...OpenAiModelSchema.properties,\n },\n required: [...ModelConfigSchema.required, ...OpenAiModelSchema.required],\n additionalProperties: false,\n} as const satisfies DataPortSchemaObject;\n\nexport type OpenAiModelConfig = FromSchema<typeof OpenAiModelConfigSchema>;\n",
|
|
7
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRegisterOptions } from \"@workglow/ai\";\nimport { registerProviderWithWorker } from \"@workglow/ai-
|
|
8
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AiProvider } from \"@workglow/ai\";\nimport { createCloudProviderClass } from \"@workglow/ai-
|
|
7
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRegisterOptions } from \"@workglow/ai\";\nimport { registerProviderWithWorker } from \"@workglow/ai/provider-utils\";\nimport { OpenAiQueuedProvider } from \"./OpenAiQueuedProvider\";\nimport { registerOpenAiImageValidator } from \"./common/OpenAI_ImageValidation\";\n\nexport async function registerOpenAi(\n options: AiProviderRegisterOptions & {\n worker: Worker | (() => Worker);\n }\n): Promise<void> {\n registerOpenAiImageValidator();\n await registerProviderWithWorker(new OpenAiQueuedProvider(), \"OpenAI\", options);\n}\n",
|
|
8
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AiProvider } from \"@workglow/ai\";\nimport { createCloudProviderClass } from \"@workglow/ai/provider-utils\";\nimport { OPENAI } from \"./common/OpenAI_Constants\";\nimport type { OpenAiModelConfig } from \"./common/OpenAI_ModelSchema\";\n\nconst OPENAI_QUEUED_TASK_TYPES = [\n \"TextGenerationTask\",\n \"TextEmbeddingTask\",\n \"TextRewriterTask\",\n \"TextSummaryTask\",\n \"CountTokensTask\",\n \"ModelInfoTask\",\n \"StructuredGenerationTask\",\n \"ToolCallingTask\",\n \"ModelSearchTask\",\n \"ImageGenerateTask\",\n \"ImageEditTask\",\n] as const;\n\n/** Main-thread registration (inline or worker-backed). No queue — uses direct execution. */\nexport class OpenAiQueuedProvider extends createCloudProviderClass<\n OpenAiModelConfig,\n typeof OPENAI_QUEUED_TASK_TYPES\n>(AiProvider, {\n name: OPENAI,\n displayName: \"OpenAI\",\n taskTypes: OPENAI_QUEUED_TASK_TYPES,\n}) {}\n",
|
|
9
9
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AiImageOutputTask, ProviderUnsupportedFeatureError } from \"@workglow/ai\";\nimport type { ModelConfig } from \"@workglow/ai\";\n\nimport { OPENAI } from \"./OpenAI_Constants\";\n\n/**\n * Registers the OpenAI per-provider image validator. Called at provider registration time\n * (both inline and worker-backed paths) so it runs on the main thread before any dispatch.\n *\n * Currently validates:\n * - DALL-E 2 + non-empty `additionalImages` → throws (single-image edit only).\n * DALL-E 3 + ImageEditTask is rejected upstream by the model registry task-array check.\n */\nexport function registerOpenAiImageValidator(): void {\n AiImageOutputTask.registerProviderImageValidator(\n OPENAI,\n (taskType, input, model: ModelConfig) => {\n if (taskType !== \"ImageEditTask\") return;\n const modelName =\n (model.provider_config as { model_name?: string } | undefined)?.model_name ?? \"\";\n const additional = input[\"additionalImages\"] as unknown[] | undefined;\n if (modelName.startsWith(\"dall-e-2\") && Array.isArray(additional) && additional.length > 0) {\n throw new ProviderUnsupportedFeatureError(\n \"additionalImages\",\n model.model_id ?? modelName,\n \"DALL-E 2 only supports single-image edits\"\n );\n }\n }\n );\n}\n"
|
|
10
10
|
],
|
|
11
11
|
"mappings": ";;;;;;;;;AAMO,IAAM,SAAS;;;ACAtB;AAIO,IAAM,oBAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,YAAY;AAAA,IACV,UAAU;AAAA,MACR,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,QACV,YAAY;AAAA,UACV,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,gBAAgB;AAAA,UACd,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,eAAe;AAAA,QACjB;AAAA,QACA,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,SAAS;AAAA,QACX;AAAA,QACA,cAAc;AAAA,UACZ,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,UAAU,CAAC,YAAY;AAAA,MACvB,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA,UAAU,CAAC,YAAY,iBAAiB;AAAA,EACxC,sBAAsB;AACxB;AAEO,IAAM,0BAA0B;AAAA,EACrC,MAAM;AAAA,EACN,YAAY;AAAA,OACP,kBAAkB;AAAA,OAClB,kBAAkB;AAAA,EACvB;AAAA,EACA,UAAU,CAAC,GAAG,kBAAkB,UAAU,GAAG,kBAAkB,QAAQ;AAAA,EACvE,sBAAsB;AACxB;AAIO,IAAM,0BAA0B;AAAA,EACrC,MAAM;AAAA,EACN,YAAY;AAAA,OACP,kBAAkB;AAAA,OAClB,kBAAkB;AAAA,EACvB;AAAA,EACA,UAAU,CAAC,GAAG,kBAAkB,UAAU,GAAG,kBAAkB,QAAQ;AAAA,EACvE,sBAAsB;AACxB;;;AC9DA;;;ACDA;AACA;AAIA,IAAM,2BAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAAA;AAGO,MAAM,6BAA6B,yBAGxC,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AACb,CAAC,EAAE;AAAC;;;AC3BJ;AAaO,SAAS,4BAA4B,GAAS;AAAA,EACnD,kBAAkB,+BAChB,QACA,CAAC,UAAU,OAAO,UAAuB;AAAA,IACvC,IAAI,aAAa;AAAA,MAAiB;AAAA,IAClC,MAAM,YACH,MAAM,iBAAyD,cAAc;AAAA,IAChF,MAAM,aAAa,MAAM;AAAA,IACzB,IAAI,UAAU,WAAW,UAAU,KAAK,MAAM,QAAQ,UAAU,KAAK,WAAW,SAAS,GAAG;AAAA,MAC1F,MAAM,IAAI,gCACR,oBACA,MAAM,YAAY,WAClB,2CACF;AAAA,IACF;AAAA,GAEJ;AAAA;;;AFxBF,eAAsB,cAAc,CAClC,SAGe;AAAA,EACf,6BAA6B;AAAA,EAC7B,MAAM,2BAA2B,IAAI,sBAAwB,UAAU,OAAO;AAAA;",
|
|
12
|
-
"debugId": "
|
|
12
|
+
"debugId": "E377DE95035F778064756E2164756E21",
|
|
13
13
|
"names": []
|
|
14
14
|
}
|
package/dist/ai.d.ts
ADDED
package/dist/ai.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC"}
|
|
@@ -6,10 +6,10 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
6
6
|
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
7
|
});
|
|
8
8
|
|
|
9
|
-
// src/ai
|
|
9
|
+
// src/ai/common/OpenAI_Constants.ts
|
|
10
10
|
var OPENAI = "OPENAI";
|
|
11
11
|
|
|
12
|
-
// src/ai
|
|
12
|
+
// src/ai/common/OpenAI_ImageValidation.ts
|
|
13
13
|
import { AiImageOutputTask, ProviderUnsupportedFeatureError } from "@workglow/ai";
|
|
14
14
|
function registerOpenAiImageValidator() {
|
|
15
15
|
AiImageOutputTask.registerProviderImageValidator(OPENAI, (taskType, input, model) => {
|
|
@@ -23,7 +23,7 @@ function registerOpenAiImageValidator() {
|
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
// src/ai
|
|
26
|
+
// src/ai/common/OpenAI_ModelSchema.ts
|
|
27
27
|
import { ModelConfigSchema, ModelRecordSchema } from "@workglow/ai/worker";
|
|
28
28
|
var OpenAiModelSchema = {
|
|
29
29
|
type: "object",
|
|
@@ -82,18 +82,18 @@ var OpenAiModelConfigSchema = {
|
|
|
82
82
|
additionalProperties: false
|
|
83
83
|
};
|
|
84
84
|
|
|
85
|
-
// src/ai
|
|
86
|
-
import { filterLabeledModelsByQuery } from "@workglow/ai-
|
|
85
|
+
// src/ai/common/OpenAI_ModelSearch.ts
|
|
86
|
+
import { filterLabeledModelsByQuery } from "@workglow/ai/provider-utils";
|
|
87
87
|
|
|
88
|
-
// src/ai
|
|
89
|
-
import { isBrowserLike,
|
|
90
|
-
var
|
|
88
|
+
// src/ai/common/OpenAI_Client.ts
|
|
89
|
+
import { isBrowserLike, resolveApiKey } from "@workglow/ai/provider-utils";
|
|
90
|
+
var _loadPromise;
|
|
91
91
|
async function loadOpenAISDK() {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
return
|
|
92
|
+
_loadPromise ??= import("openai").then((mod) => mod.default).catch(() => {
|
|
93
|
+
_loadPromise = undefined;
|
|
94
|
+
throw new Error("openai is required for OpenAI tasks. Install it with: bun add openai");
|
|
95
|
+
});
|
|
96
|
+
return _loadPromise;
|
|
97
97
|
}
|
|
98
98
|
async function getClient(model) {
|
|
99
99
|
const OpenAI = await loadOpenAISDK();
|
|
@@ -122,7 +122,7 @@ function getModelName(model) {
|
|
|
122
122
|
return name;
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
// src/ai
|
|
125
|
+
// src/ai/common/OpenAI_ModelSearch.ts
|
|
126
126
|
var OPENAI_FALLBACK = [
|
|
127
127
|
{ label: "gpt-image-2", value: "gpt-image-2" },
|
|
128
128
|
{ label: "dall-e-3", value: "dall-e-3" },
|
|
@@ -191,12 +191,12 @@ var OpenAI_ModelSearch = async (input) => {
|
|
|
191
191
|
return { results: mapModelList(models) };
|
|
192
192
|
};
|
|
193
193
|
|
|
194
|
-
// src/ai
|
|
195
|
-
import { registerProviderWithWorker } from "@workglow/ai-
|
|
194
|
+
// src/ai/registerOpenAi.ts
|
|
195
|
+
import { registerProviderWithWorker } from "@workglow/ai/provider-utils";
|
|
196
196
|
|
|
197
|
-
// src/ai
|
|
197
|
+
// src/ai/OpenAiQueuedProvider.ts
|
|
198
198
|
import { AiProvider } from "@workglow/ai";
|
|
199
|
-
import { createCloudProviderClass } from "@workglow/ai-
|
|
199
|
+
import { createCloudProviderClass } from "@workglow/ai/provider-utils";
|
|
200
200
|
var OPENAI_QUEUED_TASK_TYPES = [
|
|
201
201
|
"TextGenerationTask",
|
|
202
202
|
"TextEmbeddingTask",
|
|
@@ -218,7 +218,7 @@ class OpenAiQueuedProvider extends createCloudProviderClass(AiProvider, {
|
|
|
218
218
|
}) {
|
|
219
219
|
}
|
|
220
220
|
|
|
221
|
-
// src/ai
|
|
221
|
+
// src/ai/registerOpenAi.ts
|
|
222
222
|
async function registerOpenAi(options) {
|
|
223
223
|
registerOpenAiImageValidator();
|
|
224
224
|
await registerProviderWithWorker(new OpenAiQueuedProvider, "OpenAI", options);
|
|
@@ -233,4 +233,4 @@ export {
|
|
|
233
233
|
OPENAI
|
|
234
234
|
};
|
|
235
235
|
|
|
236
|
-
//# debugId=
|
|
236
|
+
//# debugId=FF32F432A0E2ACB064756E2164756E21
|