@workglow/openai 0.2.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-provider/OpenAiProvider.d.ts +27 -0
- package/dist/ai-provider/OpenAiProvider.d.ts.map +1 -0
- package/dist/ai-provider/OpenAiQueuedProvider.d.ts +18 -0
- package/dist/ai-provider/OpenAiQueuedProvider.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_Chat.d.ts +10 -0
- package/dist/ai-provider/common/OpenAI_Chat.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_Client.d.ts +10 -0
- package/dist/ai-provider/common/OpenAI_Client.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_Constants.d.ts +7 -0
- package/dist/ai-provider/common/OpenAI_Constants.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_CountTokens.browser.d.ts +10 -0
- package/dist/ai-provider/common/OpenAI_CountTokens.browser.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_CountTokens.d.ts +10 -0
- package/dist/ai-provider/common/OpenAI_CountTokens.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_ImageEdit.d.ts +14 -0
- package/dist/ai-provider/common/OpenAI_ImageEdit.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_ImageGenerate.d.ts +17 -0
- package/dist/ai-provider/common/OpenAI_ImageGenerate.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_ImageValidation.d.ts +15 -0
- package/dist/ai-provider/common/OpenAI_ImageValidation.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_JobRunFns.browser.d.ts +12 -0
- package/dist/ai-provider/common/OpenAI_JobRunFns.browser.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_JobRunFns.d.ts +12 -0
- package/dist/ai-provider/common/OpenAI_JobRunFns.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_ModelInfo.d.ts +9 -0
- package/dist/ai-provider/common/OpenAI_ModelInfo.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_ModelSchema.d.ts +167 -0
- package/dist/ai-provider/common/OpenAI_ModelSchema.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_ModelSearch.d.ts +8 -0
- package/dist/ai-provider/common/OpenAI_ModelSearch.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_StructuredGeneration.d.ts +10 -0
- package/dist/ai-provider/common/OpenAI_StructuredGeneration.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_TextEmbedding.d.ts +9 -0
- package/dist/ai-provider/common/OpenAI_TextEmbedding.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_TextGeneration.d.ts +10 -0
- package/dist/ai-provider/common/OpenAI_TextGeneration.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_TextRewriter.d.ts +10 -0
- package/dist/ai-provider/common/OpenAI_TextRewriter.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_TextSummary.d.ts +10 -0
- package/dist/ai-provider/common/OpenAI_TextSummary.d.ts.map +1 -0
- package/dist/ai-provider/common/OpenAI_ToolCalling.d.ts +10 -0
- package/dist/ai-provider/common/OpenAI_ToolCalling.d.ts.map +1 -0
- package/dist/ai-provider/index.browser.d.ts +9 -0
- package/dist/ai-provider/index.browser.d.ts.map +1 -0
- package/dist/ai-provider/index.d.ts +11 -0
- package/dist/ai-provider/index.d.ts.map +1 -0
- package/dist/ai-provider/registerOpenAi.d.ts +10 -0
- package/dist/ai-provider/registerOpenAi.d.ts.map +1 -0
- package/dist/ai-provider/registerOpenAiInline.browser.d.ts +8 -0
- package/dist/ai-provider/registerOpenAiInline.browser.d.ts.map +1 -0
- package/dist/ai-provider/registerOpenAiInline.d.ts +8 -0
- package/dist/ai-provider/registerOpenAiInline.d.ts.map +1 -0
- package/dist/ai-provider/registerOpenAiWorker.browser.d.ts +7 -0
- package/dist/ai-provider/registerOpenAiWorker.browser.d.ts.map +1 -0
- package/dist/ai-provider/registerOpenAiWorker.d.ts +7 -0
- package/dist/ai-provider/registerOpenAiWorker.d.ts.map +1 -0
- package/dist/ai-provider/runtime.browser.d.ts +15 -0
- package/dist/ai-provider/runtime.browser.d.ts.map +1 -0
- package/dist/ai-provider/runtime.d.ts +16 -0
- package/dist/ai-provider/runtime.d.ts.map +1 -0
- package/dist/ai-provider-runtime.browser.d.ts +7 -0
- package/dist/ai-provider-runtime.browser.d.ts.map +1 -0
- package/dist/ai-provider-runtime.browser.js +866 -0
- package/dist/ai-provider-runtime.browser.js.map +27 -0
- package/dist/ai-provider-runtime.d.ts +7 -0
- package/dist/ai-provider-runtime.d.ts.map +1 -0
- package/dist/ai-provider-runtime.js +923 -0
- package/dist/ai-provider-runtime.js.map +29 -0
- package/dist/ai-provider.browser.d.ts +7 -0
- package/dist/ai-provider.browser.d.ts.map +1 -0
- package/dist/ai-provider.browser.js +126 -0
- package/dist/ai-provider.browser.js.map +14 -0
- package/dist/ai-provider.d.ts +7 -0
- package/dist/ai-provider.d.ts.map +1 -0
- package/dist/ai-provider.js +239 -0
- package/dist/ai-provider.js.map +16 -0
- package/package.json +72 -0
|
@@ -0,0 +1,866 @@
|
|
|
1
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
+
}) : x)(function(x) {
|
|
4
|
+
if (typeof require !== "undefined")
|
|
5
|
+
return require.apply(this, arguments);
|
|
6
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
// src/ai-provider/common/OpenAI_Client.ts
|
|
10
|
+
var _OpenAIClass;
|
|
11
|
+
async function loadOpenAISDK() {
|
|
12
|
+
if (!_OpenAIClass) {
|
|
13
|
+
try {
|
|
14
|
+
const sdk = await import("openai");
|
|
15
|
+
_OpenAIClass = sdk.default;
|
|
16
|
+
} catch {
|
|
17
|
+
throw new Error("openai is required for OpenAI tasks. Install it with: bun add openai");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return _OpenAIClass;
|
|
21
|
+
}
|
|
22
|
+
async function getClient(model) {
|
|
23
|
+
const OpenAI = await loadOpenAISDK();
|
|
24
|
+
const config = model?.provider_config;
|
|
25
|
+
const apiKey = config?.credential_key || config?.api_key || (typeof process !== "undefined" ? process.env?.OPENAI_API_KEY : undefined);
|
|
26
|
+
if (!apiKey) {
|
|
27
|
+
throw new Error("Missing OpenAI API key: set provider_config.credential_key or the OPENAI_API_KEY environment variable.");
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
return new OpenAI({
|
|
31
|
+
apiKey,
|
|
32
|
+
baseURL: config?.base_url || undefined,
|
|
33
|
+
organization: config?.organization || undefined,
|
|
34
|
+
dangerouslyAllowBrowser: typeof globalThis.document !== "undefined" || "WorkerGlobalScope" in globalThis
|
|
35
|
+
});
|
|
36
|
+
} catch (err) {
|
|
37
|
+
throw new Error(`Failed to create OpenAI client: ${err instanceof Error ? err.message : "unknown error"}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function getModelName(model) {
|
|
41
|
+
const name = model?.provider_config?.model_name;
|
|
42
|
+
if (!name) {
|
|
43
|
+
throw new Error("Missing model name in provider_config.model_name.");
|
|
44
|
+
}
|
|
45
|
+
return name;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/ai-provider/registerOpenAiInline.browser.ts
|
|
49
|
+
import { registerProviderInline } from "@workglow/ai-provider/common";
|
|
50
|
+
|
|
51
|
+
// src/ai-provider/common/OpenAI_ModelSearch.ts
|
|
52
|
+
import { filterLabeledModelsByQuery } from "@workglow/ai-provider/common";
|
|
53
|
+
|
|
54
|
+
// src/ai-provider/common/OpenAI_Constants.ts
|
|
55
|
+
var OPENAI = "OPENAI";
|
|
56
|
+
|
|
57
|
+
// src/ai-provider/common/OpenAI_ModelSearch.ts
|
|
58
|
+
var OPENAI_FALLBACK = [
|
|
59
|
+
{ label: "gpt-image-2", value: "gpt-image-2" },
|
|
60
|
+
{ label: "dall-e-3", value: "dall-e-3" },
|
|
61
|
+
{ label: "gpt-5.5", value: "gpt-5.5" },
|
|
62
|
+
{ label: "gpt-5.4-mini", value: "gpt-5.4-mini" },
|
|
63
|
+
{ label: "gpt-5.4-nano", value: "gpt-5.4-nano" },
|
|
64
|
+
{ label: "gpt-5", value: "gpt-5" },
|
|
65
|
+
{ label: "gpt-5-mini", value: "gpt-5-mini" },
|
|
66
|
+
{ label: "gpt-4o-mini", value: "gpt-4o-mini" },
|
|
67
|
+
{ label: "gpt-4-turbo", value: "gpt-4-turbo" },
|
|
68
|
+
{ label: "o3", value: "o3" },
|
|
69
|
+
{ label: "o3-mini", value: "o3-mini" },
|
|
70
|
+
{ label: "o1", value: "o1" },
|
|
71
|
+
{ label: "o1-mini", value: "o1-mini" }
|
|
72
|
+
];
|
|
73
|
+
var OPENAI_IMAGE_MODELS = [
|
|
74
|
+
{ value: "gpt-image-2", tasks: ["ImageGenerateTask", "ImageEditTask"] },
|
|
75
|
+
{ value: "dall-e-3", tasks: ["ImageGenerateTask"] }
|
|
76
|
+
];
|
|
77
|
+
async function listOpenAiModels(credentialKey) {
|
|
78
|
+
const client = await getClient({
|
|
79
|
+
provider: OPENAI,
|
|
80
|
+
provider_config: { model_name: "", credential_key: credentialKey }
|
|
81
|
+
});
|
|
82
|
+
const models = [];
|
|
83
|
+
for await (const m of client.models.list()) {
|
|
84
|
+
models.push({ label: `${m.id} ${m.owned_by}`, value: m.id });
|
|
85
|
+
}
|
|
86
|
+
models.sort((a, b) => {
|
|
87
|
+
const aGpt = a.value.startsWith("gpt") || a.value.startsWith("o1") ? 0 : 1;
|
|
88
|
+
const bGpt = b.value.startsWith("gpt") || b.value.startsWith("o1") ? 0 : 1;
|
|
89
|
+
if (aGpt !== bGpt)
|
|
90
|
+
return aGpt - bGpt;
|
|
91
|
+
return a.value.localeCompare(b.value);
|
|
92
|
+
});
|
|
93
|
+
return models;
|
|
94
|
+
}
|
|
95
|
+
function mapModelList(models) {
|
|
96
|
+
return models.map((m) => {
|
|
97
|
+
const imageEntry = OPENAI_IMAGE_MODELS.find((i) => i.value === m.value);
|
|
98
|
+
return {
|
|
99
|
+
id: m.value,
|
|
100
|
+
label: m.label,
|
|
101
|
+
description: "",
|
|
102
|
+
record: {
|
|
103
|
+
model_id: m.value,
|
|
104
|
+
provider: OPENAI,
|
|
105
|
+
title: m.value,
|
|
106
|
+
description: "",
|
|
107
|
+
tasks: imageEntry?.tasks ?? [],
|
|
108
|
+
provider_config: { model_name: m.value },
|
|
109
|
+
metadata: {}
|
|
110
|
+
},
|
|
111
|
+
raw: m
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
var OpenAI_ModelSearch = async (input) => {
|
|
116
|
+
let models;
|
|
117
|
+
if (!input.credential_key) {
|
|
118
|
+
models = OPENAI_FALLBACK;
|
|
119
|
+
} else {
|
|
120
|
+
models = await listOpenAiModels(input.credential_key);
|
|
121
|
+
}
|
|
122
|
+
models = filterLabeledModelsByQuery(models, input.query);
|
|
123
|
+
return { results: mapModelList(models) };
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
// src/ai-provider/common/OpenAI_CountTokens.browser.ts
|
|
127
|
+
var _tiktoken;
|
|
128
|
+
async function loadTiktoken() {
|
|
129
|
+
if (!_tiktoken) {
|
|
130
|
+
try {
|
|
131
|
+
_tiktoken = await import("js-tiktoken");
|
|
132
|
+
} catch {
|
|
133
|
+
throw new Error("js-tiktoken is required for OpenAI token counting in the browser. Install it with: bun add js-tiktoken");
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return _tiktoken;
|
|
137
|
+
}
|
|
138
|
+
var _encoderCache = new Map;
|
|
139
|
+
async function getEncoder(modelName) {
|
|
140
|
+
const tiktoken = await loadTiktoken();
|
|
141
|
+
if (!_encoderCache.has(modelName)) {
|
|
142
|
+
try {
|
|
143
|
+
_encoderCache.set(modelName, tiktoken.encodingForModel(modelName));
|
|
144
|
+
} catch {
|
|
145
|
+
const fallback = "cl100k_base";
|
|
146
|
+
if (!_encoderCache.has(fallback)) {
|
|
147
|
+
_encoderCache.set(fallback, tiktoken.getEncoding(fallback));
|
|
148
|
+
}
|
|
149
|
+
_encoderCache.set(modelName, _encoderCache.get(fallback));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return _encoderCache.get(modelName);
|
|
153
|
+
}
|
|
154
|
+
var OpenAI_CountTokens = async (input, model) => {
|
|
155
|
+
const enc = await getEncoder(getModelName(model));
|
|
156
|
+
const tokens = enc.encode(input.text);
|
|
157
|
+
return { count: tokens.length };
|
|
158
|
+
};
|
|
159
|
+
var OpenAI_CountTokens_Preview = async (input, model) => {
|
|
160
|
+
return OpenAI_CountTokens(input, model, () => {}, new AbortController().signal);
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
// src/ai-provider/common/OpenAI_ModelInfo.ts
|
|
164
|
+
var OPENAI_EMBEDDING_DIMENSIONS = {
|
|
165
|
+
"text-embedding-3-small": { native_dimensions: 1536, mrl: true },
|
|
166
|
+
"text-embedding-3-large": { native_dimensions: 3072, mrl: true },
|
|
167
|
+
"text-embedding-ada-002": { native_dimensions: 1536, mrl: false }
|
|
168
|
+
};
|
|
169
|
+
var OpenAI_ModelInfo = async (input, model) => {
|
|
170
|
+
if (input.detail === "dimensions") {
|
|
171
|
+
const pc = model?.provider_config;
|
|
172
|
+
let native_dimensions = typeof pc?.native_dimensions === "number" ? pc.native_dimensions : undefined;
|
|
173
|
+
let mrl = typeof pc?.mrl === "boolean" ? pc.mrl : undefined;
|
|
174
|
+
if (native_dimensions === undefined) {
|
|
175
|
+
const modelName = pc?.model_name ?? "";
|
|
176
|
+
const known = OPENAI_EMBEDDING_DIMENSIONS[modelName];
|
|
177
|
+
if (known) {
|
|
178
|
+
native_dimensions = known.native_dimensions;
|
|
179
|
+
mrl = mrl ?? known.mrl;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
model: input.model,
|
|
184
|
+
is_local: false,
|
|
185
|
+
is_remote: true,
|
|
186
|
+
supports_browser: true,
|
|
187
|
+
supports_node: true,
|
|
188
|
+
is_cached: false,
|
|
189
|
+
is_loaded: false,
|
|
190
|
+
file_sizes: null,
|
|
191
|
+
...native_dimensions !== undefined ? { native_dimensions } : {},
|
|
192
|
+
...mrl !== undefined ? { mrl } : {}
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
model: input.model,
|
|
197
|
+
is_local: false,
|
|
198
|
+
is_remote: true,
|
|
199
|
+
supports_browser: true,
|
|
200
|
+
supports_node: true,
|
|
201
|
+
is_cached: false,
|
|
202
|
+
is_loaded: false,
|
|
203
|
+
file_sizes: null
|
|
204
|
+
};
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
// src/ai-provider/common/OpenAI_StructuredGeneration.ts
|
|
208
|
+
import { parsePartialJson } from "@workglow/util/worker";
|
|
209
|
+
var OpenAI_StructuredGeneration = async (input, model, update_progress, signal, outputSchema) => {
|
|
210
|
+
update_progress(0, "Starting OpenAI structured generation");
|
|
211
|
+
const client = await getClient(model);
|
|
212
|
+
const modelName = getModelName(model);
|
|
213
|
+
const schema = input.outputSchema ?? outputSchema;
|
|
214
|
+
const response = await client.chat.completions.create({
|
|
215
|
+
model: modelName,
|
|
216
|
+
messages: [{ role: "user", content: input.prompt }],
|
|
217
|
+
response_format: {
|
|
218
|
+
type: "json_schema",
|
|
219
|
+
json_schema: {
|
|
220
|
+
name: "structured_output",
|
|
221
|
+
schema,
|
|
222
|
+
strict: true
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
max_completion_tokens: input.maxTokens,
|
|
226
|
+
temperature: input.temperature
|
|
227
|
+
}, { signal });
|
|
228
|
+
const content = response.choices[0]?.message?.content ?? "{}";
|
|
229
|
+
update_progress(100, "Completed OpenAI structured generation");
|
|
230
|
+
return { object: JSON.parse(content) };
|
|
231
|
+
};
|
|
232
|
+
var OpenAI_StructuredGeneration_Stream = async function* (input, model, signal, outputSchema) {
|
|
233
|
+
const client = await getClient(model);
|
|
234
|
+
const modelName = getModelName(model);
|
|
235
|
+
const schema = input.outputSchema ?? outputSchema;
|
|
236
|
+
const stream = await client.chat.completions.create({
|
|
237
|
+
model: modelName,
|
|
238
|
+
messages: [{ role: "user", content: input.prompt }],
|
|
239
|
+
response_format: {
|
|
240
|
+
type: "json_schema",
|
|
241
|
+
json_schema: {
|
|
242
|
+
name: "structured_output",
|
|
243
|
+
schema,
|
|
244
|
+
strict: true
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
max_completion_tokens: input.maxTokens,
|
|
248
|
+
temperature: input.temperature,
|
|
249
|
+
stream: true
|
|
250
|
+
}, { signal });
|
|
251
|
+
let accumulatedJson = "";
|
|
252
|
+
for await (const chunk of stream) {
|
|
253
|
+
const delta = chunk.choices[0]?.delta?.content ?? "";
|
|
254
|
+
if (delta) {
|
|
255
|
+
accumulatedJson += delta;
|
|
256
|
+
const partial = parsePartialJson(accumulatedJson);
|
|
257
|
+
if (partial !== undefined) {
|
|
258
|
+
yield { type: "object-delta", port: "object", objectDelta: partial };
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
let finalObject;
|
|
263
|
+
try {
|
|
264
|
+
finalObject = JSON.parse(accumulatedJson);
|
|
265
|
+
} catch {
|
|
266
|
+
finalObject = parsePartialJson(accumulatedJson) ?? {};
|
|
267
|
+
}
|
|
268
|
+
yield { type: "finish", data: { object: finalObject } };
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
// src/ai-provider/common/OpenAI_TextEmbedding.ts
|
|
272
|
+
import { getLogger } from "@workglow/util/worker";
|
|
273
|
+
var OpenAI_TextEmbedding = async (input, model, update_progress, signal) => {
|
|
274
|
+
const logger = getLogger();
|
|
275
|
+
const timerLabel = `openai:TextEmbedding:${model?.provider_config?.model_name}`;
|
|
276
|
+
logger.time(timerLabel, { model: model?.provider_config?.model_name });
|
|
277
|
+
update_progress(0, "Starting OpenAI text embedding");
|
|
278
|
+
const client = await getClient(model);
|
|
279
|
+
const modelName = getModelName(model);
|
|
280
|
+
const response = await client.embeddings.create({
|
|
281
|
+
model: modelName,
|
|
282
|
+
input: input.text
|
|
283
|
+
}, { signal });
|
|
284
|
+
update_progress(100, "Completed OpenAI text embedding");
|
|
285
|
+
logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name });
|
|
286
|
+
if (Array.isArray(input.text)) {
|
|
287
|
+
return {
|
|
288
|
+
vector: response.data.map((item) => new Float32Array(item.embedding))
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
return { vector: new Float32Array(response.data[0].embedding) };
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
// src/ai-provider/common/OpenAI_TextGeneration.ts
|
|
295
|
+
import { getLogger as getLogger2 } from "@workglow/util/worker";
|
|
296
|
+
var OpenAI_TextGeneration = async (input, model, update_progress, signal) => {
|
|
297
|
+
const logger = getLogger2();
|
|
298
|
+
const timerLabel = `openai:TextGeneration:${model?.provider_config?.model_name}`;
|
|
299
|
+
logger.time(timerLabel, { model: model?.provider_config?.model_name });
|
|
300
|
+
update_progress(0, "Starting OpenAI text generation");
|
|
301
|
+
const client = await getClient(model);
|
|
302
|
+
const modelName = getModelName(model);
|
|
303
|
+
const response = await client.chat.completions.create({
|
|
304
|
+
model: modelName,
|
|
305
|
+
messages: [{ role: "user", content: input.prompt }],
|
|
306
|
+
max_completion_tokens: input.maxTokens,
|
|
307
|
+
temperature: input.temperature,
|
|
308
|
+
top_p: input.topP,
|
|
309
|
+
frequency_penalty: input.frequencyPenalty,
|
|
310
|
+
presence_penalty: input.presencePenalty
|
|
311
|
+
}, { signal });
|
|
312
|
+
update_progress(100, "Completed OpenAI text generation");
|
|
313
|
+
logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name });
|
|
314
|
+
return { text: response.choices[0]?.message?.content ?? "" };
|
|
315
|
+
};
|
|
316
|
+
var OpenAI_TextGeneration_Stream = async function* (input, model, signal) {
|
|
317
|
+
const client = await getClient(model);
|
|
318
|
+
const modelName = getModelName(model);
|
|
319
|
+
const stream = await client.chat.completions.create({
|
|
320
|
+
model: modelName,
|
|
321
|
+
messages: [{ role: "user", content: input.prompt }],
|
|
322
|
+
max_completion_tokens: input.maxTokens,
|
|
323
|
+
temperature: input.temperature,
|
|
324
|
+
top_p: input.topP,
|
|
325
|
+
frequency_penalty: input.frequencyPenalty,
|
|
326
|
+
presence_penalty: input.presencePenalty,
|
|
327
|
+
stream: true
|
|
328
|
+
}, { signal });
|
|
329
|
+
for await (const chunk of stream) {
|
|
330
|
+
const delta = chunk.choices[0]?.delta?.content ?? "";
|
|
331
|
+
if (delta) {
|
|
332
|
+
yield { type: "text-delta", port: "text", textDelta: delta };
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
yield { type: "finish", data: {} };
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
// src/ai-provider/common/OpenAI_TextRewriter.ts
|
|
339
|
+
var OpenAI_TextRewriter = async (input, model, update_progress, signal) => {
|
|
340
|
+
update_progress(0, "Starting OpenAI text rewriting");
|
|
341
|
+
const client = await getClient(model);
|
|
342
|
+
const modelName = getModelName(model);
|
|
343
|
+
const response = await client.chat.completions.create({
|
|
344
|
+
model: modelName,
|
|
345
|
+
messages: [
|
|
346
|
+
{ role: "system", content: input.prompt },
|
|
347
|
+
{ role: "user", content: input.text }
|
|
348
|
+
]
|
|
349
|
+
}, { signal });
|
|
350
|
+
update_progress(100, "Completed OpenAI text rewriting");
|
|
351
|
+
return { text: response.choices[0]?.message?.content ?? "" };
|
|
352
|
+
};
|
|
353
|
+
var OpenAI_TextRewriter_Stream = async function* (input, model, signal) {
|
|
354
|
+
const client = await getClient(model);
|
|
355
|
+
const modelName = getModelName(model);
|
|
356
|
+
const stream = await client.chat.completions.create({
|
|
357
|
+
model: modelName,
|
|
358
|
+
messages: [
|
|
359
|
+
{ role: "system", content: input.prompt },
|
|
360
|
+
{ role: "user", content: input.text }
|
|
361
|
+
],
|
|
362
|
+
stream: true
|
|
363
|
+
}, { signal });
|
|
364
|
+
for await (const chunk of stream) {
|
|
365
|
+
const delta = chunk.choices[0]?.delta?.content ?? "";
|
|
366
|
+
if (delta) {
|
|
367
|
+
yield { type: "text-delta", port: "text", textDelta: delta };
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
yield { type: "finish", data: {} };
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
// src/ai-provider/common/OpenAI_TextSummary.ts
|
|
374
|
+
var OpenAI_TextSummary = async (input, model, update_progress, signal) => {
|
|
375
|
+
update_progress(0, "Starting OpenAI text summarization");
|
|
376
|
+
const client = await getClient(model);
|
|
377
|
+
const modelName = getModelName(model);
|
|
378
|
+
const response = await client.chat.completions.create({
|
|
379
|
+
model: modelName,
|
|
380
|
+
messages: [
|
|
381
|
+
{ role: "system", content: "Summarize the following text concisely." },
|
|
382
|
+
{ role: "user", content: input.text }
|
|
383
|
+
]
|
|
384
|
+
}, { signal });
|
|
385
|
+
update_progress(100, "Completed OpenAI text summarization");
|
|
386
|
+
return { text: response.choices[0]?.message?.content ?? "" };
|
|
387
|
+
};
|
|
388
|
+
var OpenAI_TextSummary_Stream = async function* (input, model, signal) {
|
|
389
|
+
const client = await getClient(model);
|
|
390
|
+
const modelName = getModelName(model);
|
|
391
|
+
const stream = await client.chat.completions.create({
|
|
392
|
+
model: modelName,
|
|
393
|
+
messages: [
|
|
394
|
+
{ role: "system", content: "Summarize the following text concisely." },
|
|
395
|
+
{ role: "user", content: input.text }
|
|
396
|
+
],
|
|
397
|
+
stream: true
|
|
398
|
+
}, { signal });
|
|
399
|
+
for await (const chunk of stream) {
|
|
400
|
+
const delta = chunk.choices[0]?.delta?.content ?? "";
|
|
401
|
+
if (delta) {
|
|
402
|
+
yield { type: "text-delta", port: "text", textDelta: delta };
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
yield { type: "finish", data: {} };
|
|
406
|
+
};
|
|
407
|
+
|
|
408
|
+
// src/ai-provider/common/OpenAI_ToolCalling.ts
|
|
409
|
+
import { buildToolDescription, filterValidToolCalls, toOpenAIMessages } from "@workglow/ai/worker";
|
|
410
|
+
import { parsePartialJson as parsePartialJson2 } from "@workglow/util/worker";
|
|
411
|
+
function mapOpenAIToolChoice(toolChoice) {
|
|
412
|
+
if (!toolChoice || toolChoice === "auto")
|
|
413
|
+
return "auto";
|
|
414
|
+
if (toolChoice === "none")
|
|
415
|
+
return "none";
|
|
416
|
+
if (toolChoice === "required")
|
|
417
|
+
return "required";
|
|
418
|
+
return { type: "function", function: { name: toolChoice } };
|
|
419
|
+
}
|
|
420
|
+
var OpenAI_ToolCalling = async (input, model, update_progress, signal) => {
|
|
421
|
+
update_progress(0, "Starting OpenAI tool calling");
|
|
422
|
+
const client = await getClient(model);
|
|
423
|
+
const modelName = getModelName(model);
|
|
424
|
+
const tools = input.tools.map((t) => ({
|
|
425
|
+
type: "function",
|
|
426
|
+
function: {
|
|
427
|
+
name: t.name,
|
|
428
|
+
description: buildToolDescription(t),
|
|
429
|
+
parameters: t.inputSchema
|
|
430
|
+
}
|
|
431
|
+
}));
|
|
432
|
+
const messages = toOpenAIMessages(input);
|
|
433
|
+
const toolChoice = mapOpenAIToolChoice(input.toolChoice);
|
|
434
|
+
const params = {
|
|
435
|
+
model: modelName,
|
|
436
|
+
messages,
|
|
437
|
+
max_completion_tokens: input.maxTokens,
|
|
438
|
+
temperature: input.temperature
|
|
439
|
+
};
|
|
440
|
+
params.tools = tools;
|
|
441
|
+
params.tool_choice = toolChoice;
|
|
442
|
+
const response = await client.chat.completions.create(params, { signal });
|
|
443
|
+
const text = response.choices[0]?.message?.content ?? "";
|
|
444
|
+
const toolCalls = [];
|
|
445
|
+
for (const tc of response.choices[0]?.message?.tool_calls ?? []) {
|
|
446
|
+
if (!("function" in tc))
|
|
447
|
+
continue;
|
|
448
|
+
const id = tc.id;
|
|
449
|
+
const name = tc.function.name;
|
|
450
|
+
let inputArgs = {};
|
|
451
|
+
const rawArgs = tc.function.arguments;
|
|
452
|
+
if (typeof rawArgs === "string") {
|
|
453
|
+
try {
|
|
454
|
+
inputArgs = JSON.parse(rawArgs);
|
|
455
|
+
} catch {
|
|
456
|
+
try {
|
|
457
|
+
const partial = parsePartialJson2(rawArgs);
|
|
458
|
+
if (partial && typeof partial === "object") {
|
|
459
|
+
inputArgs = partial;
|
|
460
|
+
}
|
|
461
|
+
} catch {
|
|
462
|
+
inputArgs = {};
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
toolCalls.push({ id, name, input: inputArgs });
|
|
467
|
+
}
|
|
468
|
+
update_progress(100, "Completed OpenAI tool calling");
|
|
469
|
+
return { text, toolCalls: filterValidToolCalls(toolCalls, input.tools) };
|
|
470
|
+
};
|
|
471
|
+
var OpenAI_ToolCalling_Stream = async function* (input, model, signal) {
|
|
472
|
+
const client = await getClient(model);
|
|
473
|
+
const modelName = getModelName(model);
|
|
474
|
+
const tools = input.tools.map((t) => ({
|
|
475
|
+
type: "function",
|
|
476
|
+
function: {
|
|
477
|
+
name: t.name,
|
|
478
|
+
description: buildToolDescription(t),
|
|
479
|
+
parameters: t.inputSchema
|
|
480
|
+
}
|
|
481
|
+
}));
|
|
482
|
+
const messages = toOpenAIMessages(input);
|
|
483
|
+
const toolChoice = mapOpenAIToolChoice(input.toolChoice);
|
|
484
|
+
const toolOptions = toolChoice === undefined ? {} : { tools, tool_choice: toolChoice };
|
|
485
|
+
const stream = await client.chat.completions.create({
|
|
486
|
+
model: modelName,
|
|
487
|
+
messages,
|
|
488
|
+
max_completion_tokens: input.maxTokens,
|
|
489
|
+
temperature: input.temperature,
|
|
490
|
+
stream: true,
|
|
491
|
+
...toolOptions
|
|
492
|
+
}, { signal });
|
|
493
|
+
const toolCallAccumulator = new Map;
|
|
494
|
+
for await (const chunk of stream) {
|
|
495
|
+
const choice = chunk.choices[0];
|
|
496
|
+
if (!choice)
|
|
497
|
+
continue;
|
|
498
|
+
const contentDelta = choice.delta?.content ?? "";
|
|
499
|
+
if (contentDelta) {
|
|
500
|
+
yield { type: "text-delta", port: "text", textDelta: contentDelta };
|
|
501
|
+
}
|
|
502
|
+
const tcDeltas = choice.delta?.tool_calls;
|
|
503
|
+
if (Array.isArray(tcDeltas)) {
|
|
504
|
+
for (const tcDelta of tcDeltas) {
|
|
505
|
+
const idx = tcDelta.index;
|
|
506
|
+
if (!toolCallAccumulator.has(idx)) {
|
|
507
|
+
toolCallAccumulator.set(idx, {
|
|
508
|
+
id: tcDelta.id ?? "",
|
|
509
|
+
name: tcDelta.function?.name ?? "",
|
|
510
|
+
arguments: ""
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
const acc = toolCallAccumulator.get(idx);
|
|
514
|
+
if (tcDelta.id)
|
|
515
|
+
acc.id = tcDelta.id;
|
|
516
|
+
if (tcDelta.function?.name)
|
|
517
|
+
acc.name = tcDelta.function.name;
|
|
518
|
+
if (tcDelta.function?.arguments)
|
|
519
|
+
acc.arguments += tcDelta.function.arguments;
|
|
520
|
+
let parsedInput;
|
|
521
|
+
try {
|
|
522
|
+
parsedInput = JSON.parse(acc.arguments);
|
|
523
|
+
} catch {
|
|
524
|
+
const partial = parsePartialJson2(acc.arguments);
|
|
525
|
+
parsedInput = partial ?? {};
|
|
526
|
+
}
|
|
527
|
+
yield {
|
|
528
|
+
type: "object-delta",
|
|
529
|
+
port: "toolCalls",
|
|
530
|
+
objectDelta: [{ id: acc.id, name: acc.name, input: parsedInput }]
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
yield { type: "finish", data: { text: "", toolCalls: [] } };
|
|
536
|
+
};
|
|
537
|
+
|
|
538
|
+
// src/ai-provider/common/OpenAI_ImageGenerate.ts
|
|
539
|
+
import { ImageGenerationContentPolicyError, ImageGenerationProviderError } from "@workglow/ai";
|
|
540
|
+
import { getLogger as getLogger3 } from "@workglow/util/worker";
|
|
541
|
+
import { dataUriToImageValue } from "@workglow/ai-provider/common";
|
|
542
|
+
function aspectRatioToSize(aspectRatio) {
|
|
543
|
+
switch (aspectRatio) {
|
|
544
|
+
case "16:9":
|
|
545
|
+
case "4:3":
|
|
546
|
+
return "1536x1024";
|
|
547
|
+
case "9:16":
|
|
548
|
+
case "3:4":
|
|
549
|
+
return "1024x1536";
|
|
550
|
+
case "1:1":
|
|
551
|
+
default:
|
|
552
|
+
return "1024x1024";
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
async function decodeB64Png(b64) {
|
|
556
|
+
return dataUriToImageValue(`data:image/png;base64,${b64}`);
|
|
557
|
+
}
|
|
558
|
+
function modelIdOf(model) {
|
|
559
|
+
return model?.model_id ?? model?.provider_config?.model_name ?? "openai";
|
|
560
|
+
}
|
|
561
|
+
var OpenAI_ImageGenerate = async (input, model, update_progress, signal) => {
|
|
562
|
+
const logger = getLogger3();
|
|
563
|
+
const timer = `openai:ImageGenerate:${getModelName(model)}`;
|
|
564
|
+
logger.time(timer);
|
|
565
|
+
update_progress(0, "Starting OpenAI image generation");
|
|
566
|
+
const client = await getClient(model);
|
|
567
|
+
const modelName = getModelName(model);
|
|
568
|
+
const size = aspectRatioToSize(input.aspectRatio);
|
|
569
|
+
try {
|
|
570
|
+
const resp = await client.images.generate({
|
|
571
|
+
model: modelName,
|
|
572
|
+
prompt: input.prompt,
|
|
573
|
+
size,
|
|
574
|
+
quality: input.quality,
|
|
575
|
+
n: 1,
|
|
576
|
+
response_format: "b64_json",
|
|
577
|
+
...input.providerOptions ?? {}
|
|
578
|
+
}, { signal });
|
|
579
|
+
const b64 = resp.data?.[0]?.b64_json;
|
|
580
|
+
if (!b64) {
|
|
581
|
+
throw new ImageGenerationProviderError(modelIdOf(model), "Empty response (no b64_json)");
|
|
582
|
+
}
|
|
583
|
+
const image = await decodeB64Png(b64);
|
|
584
|
+
update_progress(100, "Completed OpenAI image generation");
|
|
585
|
+
logger.timeEnd(timer);
|
|
586
|
+
return { image };
|
|
587
|
+
} catch (err) {
|
|
588
|
+
if (err instanceof ImageGenerationProviderError || err instanceof ImageGenerationContentPolicyError) {
|
|
589
|
+
throw err;
|
|
590
|
+
}
|
|
591
|
+
const msg = err instanceof Error ? err.message : "unknown error";
|
|
592
|
+
if (/safety|policy|moderation/i.test(msg)) {
|
|
593
|
+
throw new ImageGenerationContentPolicyError(modelIdOf(model), msg);
|
|
594
|
+
}
|
|
595
|
+
throw new ImageGenerationProviderError(modelIdOf(model), msg, { cause: err });
|
|
596
|
+
}
|
|
597
|
+
};
|
|
598
|
+
var OpenAI_ImageGenerate_Stream = async function* (input, model, signal) {
|
|
599
|
+
const client = await getClient(model);
|
|
600
|
+
const modelName = getModelName(model);
|
|
601
|
+
const size = aspectRatioToSize(input.aspectRatio);
|
|
602
|
+
if (modelName.startsWith("dall-e")) {
|
|
603
|
+
try {
|
|
604
|
+
const resp = await client.images.generate({
|
|
605
|
+
model: modelName,
|
|
606
|
+
prompt: input.prompt,
|
|
607
|
+
size,
|
|
608
|
+
quality: input.quality,
|
|
609
|
+
n: 1,
|
|
610
|
+
response_format: "b64_json",
|
|
611
|
+
...input.providerOptions ?? {}
|
|
612
|
+
}, { signal });
|
|
613
|
+
const b64 = resp.data?.[0]?.b64_json;
|
|
614
|
+
if (!b64) {
|
|
615
|
+
throw new ImageGenerationProviderError(modelIdOf(model), "Empty response (no b64_json)");
|
|
616
|
+
}
|
|
617
|
+
const image = await decodeB64Png(b64);
|
|
618
|
+
yield { type: "snapshot", data: { image } };
|
|
619
|
+
yield { type: "finish", data: {} };
|
|
620
|
+
return;
|
|
621
|
+
} catch (err) {
|
|
622
|
+
if (err instanceof ImageGenerationProviderError || err instanceof ImageGenerationContentPolicyError) {
|
|
623
|
+
throw err;
|
|
624
|
+
}
|
|
625
|
+
const msg = err instanceof Error ? err.message : "unknown error";
|
|
626
|
+
if (/safety|policy|moderation/i.test(msg)) {
|
|
627
|
+
throw new ImageGenerationContentPolicyError(modelIdOf(model), msg);
|
|
628
|
+
}
|
|
629
|
+
throw new ImageGenerationProviderError(modelIdOf(model), msg, { cause: err });
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
try {
|
|
633
|
+
const stream = await client.images.generate({
|
|
634
|
+
model: modelName,
|
|
635
|
+
prompt: input.prompt,
|
|
636
|
+
size,
|
|
637
|
+
quality: input.quality,
|
|
638
|
+
n: 1,
|
|
639
|
+
stream: true,
|
|
640
|
+
partial_images: 3,
|
|
641
|
+
...input.providerOptions ?? {}
|
|
642
|
+
}, { signal });
|
|
643
|
+
for await (const event of stream) {
|
|
644
|
+
if (signal.aborted)
|
|
645
|
+
return;
|
|
646
|
+
const b64 = event.b64_json;
|
|
647
|
+
if (!b64)
|
|
648
|
+
continue;
|
|
649
|
+
const image = await decodeB64Png(b64);
|
|
650
|
+
yield { type: "snapshot", data: { image } };
|
|
651
|
+
}
|
|
652
|
+
yield { type: "finish", data: {} };
|
|
653
|
+
} catch (err) {
|
|
654
|
+
if (err instanceof ImageGenerationProviderError || err instanceof ImageGenerationContentPolicyError) {
|
|
655
|
+
throw err;
|
|
656
|
+
}
|
|
657
|
+
const msg = err instanceof Error ? err.message : "unknown error";
|
|
658
|
+
if (/safety|policy|moderation/i.test(msg)) {
|
|
659
|
+
throw new ImageGenerationContentPolicyError(modelIdOf(model), msg);
|
|
660
|
+
}
|
|
661
|
+
throw new ImageGenerationProviderError(modelIdOf(model), msg, { cause: err });
|
|
662
|
+
}
|
|
663
|
+
};
|
|
664
|
+
|
|
665
|
+
// src/ai-provider/common/OpenAI_ImageEdit.ts
|
|
666
|
+
import { ImageGenerationContentPolicyError as ImageGenerationContentPolicyError2, ImageGenerationProviderError as ImageGenerationProviderError2 } from "@workglow/ai";
|
|
667
|
+
import { getLogger as getLogger4 } from "@workglow/util/worker";
|
|
668
|
+
import { dataUriToImageValue as dataUriToImageValue2, imageValueToPngBytes } from "@workglow/ai-provider/common";
|
|
669
|
+
function aspectRatioToSize2(aspectRatio) {
|
|
670
|
+
switch (aspectRatio) {
|
|
671
|
+
case "16:9":
|
|
672
|
+
case "4:3":
|
|
673
|
+
return "1536x1024";
|
|
674
|
+
case "9:16":
|
|
675
|
+
case "3:4":
|
|
676
|
+
return "1024x1536";
|
|
677
|
+
case "1:1":
|
|
678
|
+
default:
|
|
679
|
+
return "1024x1024";
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
function modelIdOf2(model) {
|
|
683
|
+
return model?.model_id ?? model?.provider_config?.model_name ?? "openai";
|
|
684
|
+
}
|
|
685
|
+
async function gpuImageToOpenAiFile(image, name) {
|
|
686
|
+
const bytes = await imageValueToPngBytes(image);
|
|
687
|
+
const buffer = bytes.buffer instanceof ArrayBuffer ? bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) : new Uint8Array(bytes).buffer;
|
|
688
|
+
const sdk = await import("openai");
|
|
689
|
+
if (typeof sdk.toFile === "function") {
|
|
690
|
+
return sdk.toFile(new Blob([buffer], { type: "image/png" }), name, { type: "image/png" });
|
|
691
|
+
}
|
|
692
|
+
return new File([buffer], name, { type: "image/png" });
|
|
693
|
+
}
|
|
694
|
+
async function decodeB64Png2(b64) {
|
|
695
|
+
return dataUriToImageValue2(`data:image/png;base64,${b64}`);
|
|
696
|
+
}
|
|
697
|
+
async function buildEditPayload(input, model) {
|
|
698
|
+
const modelName = getModelName(model);
|
|
699
|
+
const primary = await gpuImageToOpenAiFile(input.image, "image.png");
|
|
700
|
+
const additionalFiles = input.additionalImages && input.additionalImages.length > 0 ? await Promise.all(input.additionalImages.map((g, i) => gpuImageToOpenAiFile(g, `image-${i + 1}.png`))) : [];
|
|
701
|
+
const imageField = additionalFiles.length === 0 ? primary : [primary, ...additionalFiles];
|
|
702
|
+
const payload = {
|
|
703
|
+
model: modelName,
|
|
704
|
+
prompt: input.prompt,
|
|
705
|
+
image: imageField,
|
|
706
|
+
size: aspectRatioToSize2(input.aspectRatio),
|
|
707
|
+
quality: input.quality,
|
|
708
|
+
n: 1,
|
|
709
|
+
...input.providerOptions ?? {}
|
|
710
|
+
};
|
|
711
|
+
if (input.mask) {
|
|
712
|
+
payload.mask = await gpuImageToOpenAiFile(input.mask, "mask.png");
|
|
713
|
+
}
|
|
714
|
+
return payload;
|
|
715
|
+
}
|
|
716
|
+
var OpenAI_ImageEdit = async (input, model, update_progress, signal) => {
|
|
717
|
+
const logger = getLogger4();
|
|
718
|
+
const timer = `openai:ImageEdit:${getModelName(model)}`;
|
|
719
|
+
logger.time(timer);
|
|
720
|
+
update_progress(0, "Starting OpenAI image edit");
|
|
721
|
+
const client = await getClient(model);
|
|
722
|
+
try {
|
|
723
|
+
const payload = await buildEditPayload(input, model);
|
|
724
|
+
const resp = await client.images.edit(payload, { signal });
|
|
725
|
+
const b64 = resp.data?.[0]?.b64_json;
|
|
726
|
+
if (!b64) {
|
|
727
|
+
throw new ImageGenerationProviderError2(modelIdOf2(model), "Empty response (no b64_json)");
|
|
728
|
+
}
|
|
729
|
+
const image = await decodeB64Png2(b64);
|
|
730
|
+
update_progress(100, "Completed OpenAI image edit");
|
|
731
|
+
logger.timeEnd(timer);
|
|
732
|
+
return { image };
|
|
733
|
+
} catch (err) {
|
|
734
|
+
if (err instanceof ImageGenerationProviderError2 || err instanceof ImageGenerationContentPolicyError2) {
|
|
735
|
+
throw err;
|
|
736
|
+
}
|
|
737
|
+
const msg = err instanceof Error ? err.message : "unknown error";
|
|
738
|
+
if (/safety|policy|moderation/i.test(msg)) {
|
|
739
|
+
throw new ImageGenerationContentPolicyError2(modelIdOf2(model), msg);
|
|
740
|
+
}
|
|
741
|
+
throw new ImageGenerationProviderError2(modelIdOf2(model), msg, { cause: err });
|
|
742
|
+
}
|
|
743
|
+
};
|
|
744
|
+
var OpenAI_ImageEdit_Stream = async function* (input, model, signal) {
|
|
745
|
+
const client = await getClient(model);
|
|
746
|
+
try {
|
|
747
|
+
const payload = await buildEditPayload(input, model);
|
|
748
|
+
const stream = await client.images.edit({ ...payload, stream: true, partial_images: 3 }, { signal });
|
|
749
|
+
for await (const event of stream) {
|
|
750
|
+
if (signal.aborted)
|
|
751
|
+
return;
|
|
752
|
+
const b64 = event.b64_json;
|
|
753
|
+
if (!b64)
|
|
754
|
+
continue;
|
|
755
|
+
const image = await decodeB64Png2(b64);
|
|
756
|
+
yield { type: "snapshot", data: { image } };
|
|
757
|
+
}
|
|
758
|
+
yield { type: "finish", data: {} };
|
|
759
|
+
} catch (err) {
|
|
760
|
+
if (err instanceof ImageGenerationProviderError2 || err instanceof ImageGenerationContentPolicyError2) {
|
|
761
|
+
throw err;
|
|
762
|
+
}
|
|
763
|
+
const msg = err instanceof Error ? err.message : "unknown error";
|
|
764
|
+
if (/safety|policy|moderation/i.test(msg)) {
|
|
765
|
+
throw new ImageGenerationContentPolicyError2(modelIdOf2(model), msg);
|
|
766
|
+
}
|
|
767
|
+
throw new ImageGenerationProviderError2(modelIdOf2(model), msg, { cause: err });
|
|
768
|
+
}
|
|
769
|
+
};
|
|
770
|
+
|
|
771
|
+
// src/ai-provider/common/OpenAI_JobRunFns.browser.ts
|
|
772
|
+
var OPENAI_TASKS = {
|
|
773
|
+
TextGenerationTask: OpenAI_TextGeneration,
|
|
774
|
+
ModelInfoTask: OpenAI_ModelInfo,
|
|
775
|
+
TextEmbeddingTask: OpenAI_TextEmbedding,
|
|
776
|
+
TextRewriterTask: OpenAI_TextRewriter,
|
|
777
|
+
TextSummaryTask: OpenAI_TextSummary,
|
|
778
|
+
CountTokensTask: OpenAI_CountTokens,
|
|
779
|
+
StructuredGenerationTask: OpenAI_StructuredGeneration,
|
|
780
|
+
ToolCallingTask: OpenAI_ToolCalling,
|
|
781
|
+
ModelSearchTask: OpenAI_ModelSearch,
|
|
782
|
+
ImageGenerateTask: OpenAI_ImageGenerate,
|
|
783
|
+
ImageEditTask: OpenAI_ImageEdit
|
|
784
|
+
};
|
|
785
|
+
var OPENAI_STREAM_TASKS = {
|
|
786
|
+
TextGenerationTask: OpenAI_TextGeneration_Stream,
|
|
787
|
+
TextRewriterTask: OpenAI_TextRewriter_Stream,
|
|
788
|
+
TextSummaryTask: OpenAI_TextSummary_Stream,
|
|
789
|
+
StructuredGenerationTask: OpenAI_StructuredGeneration_Stream,
|
|
790
|
+
ToolCallingTask: OpenAI_ToolCalling_Stream,
|
|
791
|
+
ImageGenerateTask: OpenAI_ImageGenerate_Stream,
|
|
792
|
+
ImageEditTask: OpenAI_ImageEdit_Stream
|
|
793
|
+
};
|
|
794
|
+
var OPENAI_PREVIEW_TASKS = {
|
|
795
|
+
CountTokensTask: OpenAI_CountTokens_Preview
|
|
796
|
+
};
|
|
797
|
+
|
|
798
|
+
// src/ai-provider/OpenAiQueuedProvider.ts
|
|
799
|
+
import { AiProvider } from "@workglow/ai";
|
|
800
|
+
class OpenAiQueuedProvider extends AiProvider {
|
|
801
|
+
name = OPENAI;
|
|
802
|
+
displayName = "OpenAI";
|
|
803
|
+
isLocal = false;
|
|
804
|
+
supportsBrowser = true;
|
|
805
|
+
taskTypes = [
|
|
806
|
+
"TextGenerationTask",
|
|
807
|
+
"TextEmbeddingTask",
|
|
808
|
+
"TextRewriterTask",
|
|
809
|
+
"TextSummaryTask",
|
|
810
|
+
"CountTokensTask",
|
|
811
|
+
"ModelInfoTask",
|
|
812
|
+
"StructuredGenerationTask",
|
|
813
|
+
"ToolCallingTask",
|
|
814
|
+
"ModelSearchTask",
|
|
815
|
+
"ImageGenerateTask",
|
|
816
|
+
"ImageEditTask"
|
|
817
|
+
];
|
|
818
|
+
constructor(tasks, streamTasks, previewTasks) {
|
|
819
|
+
super(tasks, streamTasks, previewTasks);
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
// src/ai-provider/registerOpenAiInline.browser.ts
|
|
824
|
+
async function registerOpenAiInline(options) {
|
|
825
|
+
await registerProviderInline(new OpenAiQueuedProvider(OPENAI_TASKS, OPENAI_STREAM_TASKS, OPENAI_PREVIEW_TASKS), "OpenAI", options);
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
// src/ai-provider/registerOpenAiWorker.browser.ts
|
|
829
|
+
import { registerProviderWorker } from "@workglow/ai-provider/common";
|
|
830
|
+
|
|
831
|
+
// src/ai-provider/OpenAiProvider.ts
|
|
832
|
+
import { AiProvider as AiProvider2 } from "@workglow/ai/worker";
|
|
833
|
+
class OpenAiProvider extends AiProvider2 {
|
|
834
|
+
name = OPENAI;
|
|
835
|
+
displayName = "OpenAI";
|
|
836
|
+
isLocal = false;
|
|
837
|
+
supportsBrowser = true;
|
|
838
|
+
taskTypes = [
|
|
839
|
+
"TextGenerationTask",
|
|
840
|
+
"TextEmbeddingTask",
|
|
841
|
+
"TextRewriterTask",
|
|
842
|
+
"TextSummaryTask",
|
|
843
|
+
"CountTokensTask",
|
|
844
|
+
"ModelInfoTask",
|
|
845
|
+
"StructuredGenerationTask",
|
|
846
|
+
"ToolCallingTask",
|
|
847
|
+
"ModelSearchTask"
|
|
848
|
+
];
|
|
849
|
+
constructor(tasks, streamTasks, previewTasks) {
|
|
850
|
+
super(tasks, streamTasks, previewTasks);
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
// src/ai-provider/registerOpenAiWorker.browser.ts
|
|
855
|
+
async function registerOpenAiWorker() {
|
|
856
|
+
await registerProviderWorker((ws) => new OpenAiProvider(OPENAI_TASKS, OPENAI_STREAM_TASKS, OPENAI_PREVIEW_TASKS).registerOnWorkerServer(ws), "OpenAI");
|
|
857
|
+
}
|
|
858
|
+
export {
|
|
859
|
+
registerOpenAiWorker,
|
|
860
|
+
registerOpenAiInline,
|
|
861
|
+
loadOpenAISDK,
|
|
862
|
+
getModelName,
|
|
863
|
+
getClient
|
|
864
|
+
};
|
|
865
|
+
|
|
866
|
+
//# debugId=745FF611DF3171FC64756E2164756E21
|