@workglow/openai 0.2.28 → 0.2.30
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 +71 -17
- package/dist/ai-provider/OpenAiProvider.d.ts.map +1 -1
- package/dist/ai-provider/OpenAiQueuedProvider.d.ts +69 -9
- package/dist/ai-provider/OpenAiQueuedProvider.d.ts.map +1 -1
- package/dist/ai-provider/common/OpenAI_Client.d.ts.map +1 -1
- package/dist/ai-provider/common/OpenAI_ModelSearch.d.ts.map +1 -1
- package/dist/ai-provider/common/OpenAI_ToolCalling.d.ts.map +1 -1
- package/dist/ai-provider-runtime.browser.js +70 -158
- package/dist/ai-provider-runtime.browser.js.map +7 -7
- package/dist/ai-provider-runtime.js +70 -158
- package/dist/ai-provider-runtime.js.map +7 -7
- package/dist/ai-provider.browser.js +21 -22
- package/dist/ai-provider.browser.js.map +3 -3
- package/dist/ai-provider.js +32 -35
- package/dist/ai-provider.js.map +5 -5
- package/package.json +33 -13
|
@@ -4,24 +4,78 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { AiProvider } from "@workglow/ai/worker";
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
declare const OpenAiProvider_base: new (tasks?: Record<string, import("@workglow/ai").AiProviderRunFn<any, any, {
|
|
8
|
+
description?: string | undefined;
|
|
9
|
+
metadata?: {
|
|
10
|
+
[x: string]: unknown;
|
|
11
|
+
} | undefined;
|
|
12
|
+
model_id?: string | undefined;
|
|
13
|
+
provider: "OPENAI";
|
|
14
|
+
provider_config: {
|
|
15
|
+
base_url?: string | undefined;
|
|
16
|
+
credential_key?: string | undefined;
|
|
17
|
+
model_name: string;
|
|
18
|
+
organization?: string | undefined;
|
|
19
|
+
};
|
|
20
|
+
tasks?: string[] | undefined;
|
|
21
|
+
title?: string | undefined;
|
|
22
|
+
}>> | undefined, streamTasks?: Record<string, import("@workglow/ai").AiProviderStreamFn<any, any, {
|
|
23
|
+
description?: string | undefined;
|
|
24
|
+
metadata?: {
|
|
25
|
+
[x: string]: unknown;
|
|
26
|
+
} | undefined;
|
|
27
|
+
model_id?: string | undefined;
|
|
28
|
+
provider: "OPENAI";
|
|
29
|
+
provider_config: {
|
|
30
|
+
base_url?: string | undefined;
|
|
31
|
+
credential_key?: string | undefined;
|
|
32
|
+
model_name: string;
|
|
33
|
+
organization?: string | undefined;
|
|
34
|
+
};
|
|
35
|
+
tasks?: string[] | undefined;
|
|
36
|
+
title?: string | undefined;
|
|
37
|
+
}>> | undefined, previewTasks?: Record<string, import("@workglow/ai").AiProviderPreviewRunFn<any, any, {
|
|
38
|
+
description?: string | undefined;
|
|
39
|
+
metadata?: {
|
|
40
|
+
[x: string]: unknown;
|
|
41
|
+
} | undefined;
|
|
42
|
+
model_id?: string | undefined;
|
|
43
|
+
provider: "OPENAI";
|
|
44
|
+
provider_config: {
|
|
45
|
+
base_url?: string | undefined;
|
|
46
|
+
credential_key?: string | undefined;
|
|
47
|
+
model_name: string;
|
|
48
|
+
organization?: string | undefined;
|
|
49
|
+
};
|
|
50
|
+
tasks?: string[] | undefined;
|
|
51
|
+
title?: string | undefined;
|
|
52
|
+
}>> | undefined) => AiProvider<{
|
|
53
|
+
description?: string | undefined;
|
|
54
|
+
metadata?: {
|
|
55
|
+
[x: string]: unknown;
|
|
56
|
+
} | undefined;
|
|
57
|
+
model_id?: string | undefined;
|
|
58
|
+
provider: "OPENAI";
|
|
59
|
+
provider_config: {
|
|
60
|
+
base_url?: string | undefined;
|
|
61
|
+
credential_key?: string | undefined;
|
|
62
|
+
model_name: string;
|
|
63
|
+
organization?: string | undefined;
|
|
64
|
+
};
|
|
65
|
+
tasks?: string[] | undefined;
|
|
66
|
+
title?: string | undefined;
|
|
67
|
+
}> & {
|
|
68
|
+
readonly name: string;
|
|
69
|
+
readonly displayName: string;
|
|
70
|
+
readonly isLocal: boolean;
|
|
71
|
+
readonly supportsBrowser: boolean;
|
|
72
|
+
readonly taskTypes: readonly ["TextGenerationTask", "TextEmbeddingTask", "TextRewriterTask", "TextSummaryTask", "CountTokensTask", "ModelInfoTask", "StructuredGenerationTask", "ToolCallingTask", "ModelSearchTask"];
|
|
73
|
+
};
|
|
9
74
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* Supports text generation, text embedding, text rewriting, and text summarization
|
|
13
|
-
* via the OpenAI API using the `openai` SDK.
|
|
14
|
-
*
|
|
15
|
-
* Task run functions are injected via the constructor so that the `openai` SDK
|
|
16
|
-
* is only imported where actually needed (inline mode, worker server), not on
|
|
17
|
-
* the main thread in worker mode.
|
|
75
|
+
* Worker-server registration for OpenAI cloud models. Imports `AiProvider`
|
|
76
|
+
* from `@workglow/ai/worker` so the SDK is only loaded in the worker.
|
|
18
77
|
*/
|
|
19
|
-
export declare class OpenAiProvider extends
|
|
20
|
-
readonly name = "OPENAI";
|
|
21
|
-
readonly displayName = "OpenAI";
|
|
22
|
-
readonly isLocal = false;
|
|
23
|
-
readonly supportsBrowser = true;
|
|
24
|
-
readonly taskTypes: readonly ["TextGenerationTask", "TextEmbeddingTask", "TextRewriterTask", "TextSummaryTask", "CountTokensTask", "ModelInfoTask", "StructuredGenerationTask", "ToolCallingTask", "ModelSearchTask"];
|
|
25
|
-
constructor(tasks?: Record<string, AiProviderRunFn<any, any, OpenAiModelConfig>>, streamTasks?: Record<string, AiProviderStreamFn<any, any, OpenAiModelConfig>>, previewTasks?: Record<string, AiProviderPreviewRunFn<any, any, OpenAiModelConfig>>);
|
|
78
|
+
export declare class OpenAiProvider extends OpenAiProvider_base {
|
|
26
79
|
}
|
|
80
|
+
export {};
|
|
27
81
|
//# sourceMappingURL=OpenAiProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAiProvider.d.ts","sourceRoot":"","sources":["../../src/ai-provider/OpenAiProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"OpenAiProvider.d.ts","sourceRoot":"","sources":["../../src/ai-provider/OpenAiProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBjD;;;GAGG;AACH,qBAAa,cAAe,SAAQ,mBAOlC;CAAG"}
|
|
@@ -4,15 +4,75 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { AiProvider } from "@workglow/ai";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
declare const OpenAiQueuedProvider_base: new (tasks?: Record<string, import("@workglow/ai").AiProviderRunFn<any, any, {
|
|
8
|
+
description?: string | undefined;
|
|
9
|
+
metadata?: {
|
|
10
|
+
[x: string]: unknown;
|
|
11
|
+
} | undefined;
|
|
12
|
+
model_id?: string | undefined;
|
|
13
|
+
provider: "OPENAI";
|
|
14
|
+
provider_config: {
|
|
15
|
+
base_url?: string | undefined;
|
|
16
|
+
credential_key?: string | undefined;
|
|
17
|
+
model_name: string;
|
|
18
|
+
organization?: string | undefined;
|
|
19
|
+
};
|
|
20
|
+
tasks?: string[] | undefined;
|
|
21
|
+
title?: string | undefined;
|
|
22
|
+
}>> | undefined, streamTasks?: Record<string, import("@workglow/ai").AiProviderStreamFn<any, any, {
|
|
23
|
+
description?: string | undefined;
|
|
24
|
+
metadata?: {
|
|
25
|
+
[x: string]: unknown;
|
|
26
|
+
} | undefined;
|
|
27
|
+
model_id?: string | undefined;
|
|
28
|
+
provider: "OPENAI";
|
|
29
|
+
provider_config: {
|
|
30
|
+
base_url?: string | undefined;
|
|
31
|
+
credential_key?: string | undefined;
|
|
32
|
+
model_name: string;
|
|
33
|
+
organization?: string | undefined;
|
|
34
|
+
};
|
|
35
|
+
tasks?: string[] | undefined;
|
|
36
|
+
title?: string | undefined;
|
|
37
|
+
}>> | undefined, previewTasks?: Record<string, import("@workglow/ai").AiProviderPreviewRunFn<any, any, {
|
|
38
|
+
description?: string | undefined;
|
|
39
|
+
metadata?: {
|
|
40
|
+
[x: string]: unknown;
|
|
41
|
+
} | undefined;
|
|
42
|
+
model_id?: string | undefined;
|
|
43
|
+
provider: "OPENAI";
|
|
44
|
+
provider_config: {
|
|
45
|
+
base_url?: string | undefined;
|
|
46
|
+
credential_key?: string | undefined;
|
|
47
|
+
model_name: string;
|
|
48
|
+
organization?: string | undefined;
|
|
49
|
+
};
|
|
50
|
+
tasks?: string[] | undefined;
|
|
51
|
+
title?: string | undefined;
|
|
52
|
+
}>> | undefined) => AiProvider<{
|
|
53
|
+
description?: string | undefined;
|
|
54
|
+
metadata?: {
|
|
55
|
+
[x: string]: unknown;
|
|
56
|
+
} | undefined;
|
|
57
|
+
model_id?: string | undefined;
|
|
58
|
+
provider: "OPENAI";
|
|
59
|
+
provider_config: {
|
|
60
|
+
base_url?: string | undefined;
|
|
61
|
+
credential_key?: string | undefined;
|
|
62
|
+
model_name: string;
|
|
63
|
+
organization?: string | undefined;
|
|
64
|
+
};
|
|
65
|
+
tasks?: string[] | undefined;
|
|
66
|
+
title?: string | undefined;
|
|
67
|
+
}> & {
|
|
68
|
+
readonly name: string;
|
|
69
|
+
readonly displayName: string;
|
|
70
|
+
readonly isLocal: boolean;
|
|
71
|
+
readonly supportsBrowser: boolean;
|
|
15
72
|
readonly taskTypes: readonly ["TextGenerationTask", "TextEmbeddingTask", "TextRewriterTask", "TextSummaryTask", "CountTokensTask", "ModelInfoTask", "StructuredGenerationTask", "ToolCallingTask", "ModelSearchTask", "ImageGenerateTask", "ImageEditTask"];
|
|
16
|
-
|
|
73
|
+
};
|
|
74
|
+
/** Main-thread registration (inline or worker-backed). No queue — uses direct execution. */
|
|
75
|
+
export declare class OpenAiQueuedProvider extends OpenAiQueuedProvider_base {
|
|
17
76
|
}
|
|
77
|
+
export {};
|
|
18
78
|
//# sourceMappingURL=OpenAiQueuedProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAiQueuedProvider.d.ts","sourceRoot":"","sources":["../../src/ai-provider/OpenAiQueuedProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC
|
|
1
|
+
{"version":3,"file":"OpenAiQueuedProvider.d.ts","sourceRoot":"","sources":["../../src/ai-provider/OpenAiQueuedProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmB1C,4FAA4F;AAC5F,qBAAa,oBAAqB,SAAQ,yBAOxC;CAAG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAI_Client.d.ts","sourceRoot":"","sources":["../../../src/ai-provider/common/OpenAI_Client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"OpenAI_Client.d.ts","sourceRoot":"","sources":["../../../src/ai-provider/common/OpenAI_Client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAK9D,wBAAsB,aAAa,yBAFH,GAAG,KAAK,GAAG,EAS1C;AAUD,wBAAsB,SAAS,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,gBAoBnE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,GAAG,MAAM,CAMzE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAI_ModelSearch.d.ts","sourceRoot":"","sources":["../../../src/ai-provider/common/OpenAI_ModelSearch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,eAAe,EAEf,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"OpenAI_ModelSearch.d.ts","sourceRoot":"","sources":["../../../src/ai-provider/common/OpenAI_ModelSearch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,eAAe,EAEf,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,cAAc,CAAC;AAuEtB,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,oBAAoB,EACpB,qBAAqB,CAUtB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAI_ToolCalling.d.ts","sourceRoot":"","sources":["../../../src/ai-provider/common/OpenAI_ToolCalling.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"OpenAI_ToolCalling.d.ts","sourceRoot":"","sources":["../../../src/ai-provider/common/OpenAI_ToolCalling.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,cAAc,CAAC;AAQtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CA2BlB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,kBAAkB,CACxD,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CAuBlB,CAAC"}
|
|
@@ -7,31 +7,29 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
7
7
|
});
|
|
8
8
|
|
|
9
9
|
// src/ai-provider/common/OpenAI_Client.ts
|
|
10
|
+
import { isBrowserLike, loadProviderSdk, resolveApiKey } from "@workglow/ai-provider/common";
|
|
10
11
|
var _OpenAIClass;
|
|
11
12
|
async function loadOpenAISDK() {
|
|
12
13
|
if (!_OpenAIClass) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
_OpenAIClass = sdk.default;
|
|
16
|
-
} catch {
|
|
17
|
-
throw new Error("openai is required for OpenAI tasks. Install it with: bun add openai");
|
|
18
|
-
}
|
|
14
|
+
const sdk = await loadProviderSdk("openai", "OpenAI");
|
|
15
|
+
_OpenAIClass = sdk.default;
|
|
19
16
|
}
|
|
20
17
|
return _OpenAIClass;
|
|
21
18
|
}
|
|
22
19
|
async function getClient(model) {
|
|
23
20
|
const OpenAI = await loadOpenAISDK();
|
|
24
21
|
const config = model?.provider_config;
|
|
25
|
-
const apiKey =
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
const apiKey = resolveApiKey({
|
|
23
|
+
config,
|
|
24
|
+
envVar: "OPENAI_API_KEY",
|
|
25
|
+
providerLabel: "OpenAI"
|
|
26
|
+
});
|
|
29
27
|
try {
|
|
30
28
|
return new OpenAI({
|
|
31
29
|
apiKey,
|
|
32
30
|
baseURL: config?.base_url || undefined,
|
|
33
31
|
organization: config?.organization || undefined,
|
|
34
|
-
dangerouslyAllowBrowser:
|
|
32
|
+
dangerouslyAllowBrowser: isBrowserLike()
|
|
35
33
|
});
|
|
36
34
|
} catch (err) {
|
|
37
35
|
throw new Error(`Failed to create OpenAI client: ${err instanceof Error ? err.message : "unknown error"}`);
|
|
@@ -81,7 +79,7 @@ async function listOpenAiModels(credentialKey) {
|
|
|
81
79
|
});
|
|
82
80
|
const models = [];
|
|
83
81
|
for await (const m of client.models.list()) {
|
|
84
|
-
models.push({ label:
|
|
82
|
+
models.push({ label: m.id, value: m.id, description: m.owned_by });
|
|
85
83
|
}
|
|
86
84
|
models.sort((a, b) => {
|
|
87
85
|
const aGpt = a.value.startsWith("gpt") || a.value.startsWith("o1") ? 0 : 1;
|
|
@@ -98,7 +96,7 @@ function mapModelList(models) {
|
|
|
98
96
|
return {
|
|
99
97
|
id: m.value,
|
|
100
98
|
label: m.label,
|
|
101
|
-
description: "",
|
|
99
|
+
description: m.description ?? "",
|
|
102
100
|
record: {
|
|
103
101
|
model_id: m.value,
|
|
104
102
|
provider: OPENAI,
|
|
@@ -406,133 +404,49 @@ var OpenAI_TextSummary_Stream = async function* (input, model, signal) {
|
|
|
406
404
|
};
|
|
407
405
|
|
|
408
406
|
// src/ai-provider/common/OpenAI_ToolCalling.ts
|
|
409
|
-
import {
|
|
410
|
-
import {
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
if (toolChoice === "required")
|
|
417
|
-
return "required";
|
|
418
|
-
return { type: "function", function: { name: toolChoice } };
|
|
419
|
-
}
|
|
407
|
+
import { filterValidToolCalls, toOpenAIMessages } from "@workglow/ai/worker";
|
|
408
|
+
import {
|
|
409
|
+
accumulateOpenAIStream,
|
|
410
|
+
buildOpenAITools,
|
|
411
|
+
mapOpenAIToolChoice,
|
|
412
|
+
parseOpenAIToolCallMessage
|
|
413
|
+
} from "@workglow/ai-provider/common";
|
|
420
414
|
var OpenAI_ToolCalling = async (input, model, update_progress, signal) => {
|
|
421
415
|
update_progress(0, "Starting OpenAI tool calling");
|
|
422
416
|
const client = await getClient(model);
|
|
423
417
|
const modelName = getModelName(model);
|
|
424
|
-
const tools = input.tools
|
|
425
|
-
type: "function",
|
|
426
|
-
function: {
|
|
427
|
-
name: t.name,
|
|
428
|
-
description: buildToolDescription(t),
|
|
429
|
-
parameters: t.inputSchema
|
|
430
|
-
}
|
|
431
|
-
}));
|
|
418
|
+
const tools = buildOpenAITools(input.tools);
|
|
432
419
|
const messages = toOpenAIMessages(input);
|
|
433
|
-
const toolChoice = mapOpenAIToolChoice(input.toolChoice);
|
|
434
|
-
const
|
|
420
|
+
const toolChoice = mapOpenAIToolChoice(input.toolChoice, true);
|
|
421
|
+
const response = await client.chat.completions.create({
|
|
435
422
|
model: modelName,
|
|
436
423
|
messages,
|
|
437
424
|
max_completion_tokens: input.maxTokens,
|
|
438
|
-
temperature: input.temperature
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
const response = await client.chat.completions.create(params, { signal });
|
|
425
|
+
temperature: input.temperature,
|
|
426
|
+
tools,
|
|
427
|
+
tool_choice: toolChoice
|
|
428
|
+
}, { signal });
|
|
443
429
|
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
|
-
}
|
|
430
|
+
const toolCalls = parseOpenAIToolCallMessage(response.choices[0]?.message?.tool_calls);
|
|
468
431
|
update_progress(100, "Completed OpenAI tool calling");
|
|
469
432
|
return { text, toolCalls: filterValidToolCalls(toolCalls, input.tools) };
|
|
470
433
|
};
|
|
471
434
|
var OpenAI_ToolCalling_Stream = async function* (input, model, signal) {
|
|
472
435
|
const client = await getClient(model);
|
|
473
436
|
const modelName = getModelName(model);
|
|
474
|
-
const tools = input.tools
|
|
475
|
-
type: "function",
|
|
476
|
-
function: {
|
|
477
|
-
name: t.name,
|
|
478
|
-
description: buildToolDescription(t),
|
|
479
|
-
parameters: t.inputSchema
|
|
480
|
-
}
|
|
481
|
-
}));
|
|
437
|
+
const tools = buildOpenAITools(input.tools);
|
|
482
438
|
const messages = toOpenAIMessages(input);
|
|
483
|
-
const toolChoice = mapOpenAIToolChoice(input.toolChoice);
|
|
484
|
-
const toolOptions = toolChoice === undefined ? {} : { tools, tool_choice: toolChoice };
|
|
439
|
+
const toolChoice = mapOpenAIToolChoice(input.toolChoice, true);
|
|
485
440
|
const stream = await client.chat.completions.create({
|
|
486
441
|
model: modelName,
|
|
487
442
|
messages,
|
|
488
443
|
max_completion_tokens: input.maxTokens,
|
|
489
444
|
temperature: input.temperature,
|
|
490
445
|
stream: true,
|
|
491
|
-
|
|
446
|
+
tools,
|
|
447
|
+
tool_choice: toolChoice
|
|
492
448
|
}, { signal });
|
|
493
|
-
|
|
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: [] } };
|
|
449
|
+
yield* accumulateOpenAIStream(stream);
|
|
536
450
|
};
|
|
537
451
|
|
|
538
452
|
// src/ai-provider/common/OpenAI_ImageGenerate.ts
|
|
@@ -797,27 +711,26 @@ var OPENAI_PREVIEW_TASKS = {
|
|
|
797
711
|
|
|
798
712
|
// src/ai-provider/OpenAiQueuedProvider.ts
|
|
799
713
|
import { AiProvider } from "@workglow/ai";
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
}
|
|
714
|
+
import { createCloudProviderClass } from "@workglow/ai-provider/common";
|
|
715
|
+
var OPENAI_QUEUED_TASK_TYPES = [
|
|
716
|
+
"TextGenerationTask",
|
|
717
|
+
"TextEmbeddingTask",
|
|
718
|
+
"TextRewriterTask",
|
|
719
|
+
"TextSummaryTask",
|
|
720
|
+
"CountTokensTask",
|
|
721
|
+
"ModelInfoTask",
|
|
722
|
+
"StructuredGenerationTask",
|
|
723
|
+
"ToolCallingTask",
|
|
724
|
+
"ModelSearchTask",
|
|
725
|
+
"ImageGenerateTask",
|
|
726
|
+
"ImageEditTask"
|
|
727
|
+
];
|
|
728
|
+
|
|
729
|
+
class OpenAiQueuedProvider extends createCloudProviderClass(AiProvider, {
|
|
730
|
+
name: OPENAI,
|
|
731
|
+
displayName: "OpenAI",
|
|
732
|
+
taskTypes: OPENAI_QUEUED_TASK_TYPES
|
|
733
|
+
}) {
|
|
821
734
|
}
|
|
822
735
|
|
|
823
736
|
// src/ai-provider/registerOpenAiInline.browser.ts
|
|
@@ -830,25 +743,24 @@ import { registerProviderWorker } from "@workglow/ai-provider/common";
|
|
|
830
743
|
|
|
831
744
|
// src/ai-provider/OpenAiProvider.ts
|
|
832
745
|
import { AiProvider as AiProvider2 } from "@workglow/ai/worker";
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
}
|
|
746
|
+
import { createCloudProviderClass as createCloudProviderClass2 } from "@workglow/ai-provider/common";
|
|
747
|
+
var OPENAI_WORKER_TASK_TYPES = [
|
|
748
|
+
"TextGenerationTask",
|
|
749
|
+
"TextEmbeddingTask",
|
|
750
|
+
"TextRewriterTask",
|
|
751
|
+
"TextSummaryTask",
|
|
752
|
+
"CountTokensTask",
|
|
753
|
+
"ModelInfoTask",
|
|
754
|
+
"StructuredGenerationTask",
|
|
755
|
+
"ToolCallingTask",
|
|
756
|
+
"ModelSearchTask"
|
|
757
|
+
];
|
|
758
|
+
|
|
759
|
+
class OpenAiProvider extends createCloudProviderClass2(AiProvider2, {
|
|
760
|
+
name: OPENAI,
|
|
761
|
+
displayName: "OpenAI",
|
|
762
|
+
taskTypes: OPENAI_WORKER_TASK_TYPES
|
|
763
|
+
}) {
|
|
852
764
|
}
|
|
853
765
|
|
|
854
766
|
// src/ai-provider/registerOpenAiWorker.browser.ts
|
|
@@ -863,4 +775,4 @@ export {
|
|
|
863
775
|
getClient
|
|
864
776
|
};
|
|
865
777
|
|
|
866
|
-
//# debugId=
|
|
778
|
+
//# debugId=FE9863287875C6B364756E2164756E21
|