@workglow/openai 0.2.29 → 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.
@@ -4,24 +4,78 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { AiProvider } from "@workglow/ai/worker";
7
- import type { AiProviderPreviewRunFn, AiProviderRunFn, AiProviderStreamFn } from "@workglow/ai/worker";
8
- import type { OpenAiModelConfig } from "./common/OpenAI_ModelSchema";
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
- * AI provider for OpenAI cloud models.
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 AiProvider<OpenAiModelConfig> {
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;AACjD,OAAO,KAAK,EACV,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;;;;;;;GASG;AACH,qBAAa,cAAe,SAAQ,UAAU,CAAC,iBAAiB,CAAC;IAC/D,QAAQ,CAAC,IAAI,YAAU;IACvB,QAAQ,CAAC,WAAW,YAAY;IAChC,QAAQ,CAAC,OAAO,SAAS;IACzB,QAAQ,CAAC,eAAe,QAAQ;IAEhC,QAAQ,CAAC,SAAS,YAChB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,0BAA0B,EAC1B,iBAAiB,EACjB,iBAAiB,EACR;IAEX,YACE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC,EACpE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAC7E,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAGnF;CACF"}
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
- import type { AiProviderPreviewRunFn, AiProviderRunFn, AiProviderStreamFn } from "@workglow/ai";
8
- import type { OpenAiModelConfig } from "./common/OpenAI_ModelSchema";
9
- /** Main-thread registration (inline or worker-backed). No queue — uses direct execution. */
10
- export declare class OpenAiQueuedProvider extends AiProvider<OpenAiModelConfig> {
11
- readonly name = "OPENAI";
12
- readonly displayName = "OpenAI";
13
- readonly isLocal = false;
14
- readonly supportsBrowser = true;
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
- constructor(tasks?: Record<string, AiProviderRunFn<any, any, OpenAiModelConfig>>, streamTasks?: Record<string, AiProviderStreamFn<any, any, OpenAiModelConfig>>, previewTasks?: Record<string, AiProviderPreviewRunFn<any, any, OpenAiModelConfig>>);
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;AAC1C,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEhG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,4FAA4F;AAC5F,qBAAa,oBAAqB,SAAQ,UAAU,CAAC,iBAAiB,CAAC;IACrE,QAAQ,CAAC,IAAI,YAAU;IACvB,QAAQ,CAAC,WAAW,YAAY;IAChC,QAAQ,CAAC,OAAO,SAAS;IACzB,QAAQ,CAAC,eAAe,QAAQ;IAEhC,QAAQ,CAAC,SAAS,YAChB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,0BAA0B,EAC1B,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACN;IAEX,YACE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC,EACpE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAC7E,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAGnF;CACF"}
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;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAK9D,wBAAsB,aAAa,yBAFH,GAAG,KAAK,GAAG,EAY1C;AAUD,wBAAsB,SAAS,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,gBAyBnE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,GAAG,MAAM,CAMzE"}
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_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,EAGtB,MAAM,cAAc,CAAC;AAGtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAY9D,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CA0DlB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,kBAAkB,CACxD,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CA2ElB,CAAC"}
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
- 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
- }
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 = 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
- }
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: typeof globalThis.document !== "undefined" || "WorkerGlobalScope" in globalThis
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"}`);
@@ -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 { 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
- }
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.map((t) => ({
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 params = {
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
- params.tools = tools;
441
- params.tool_choice = toolChoice;
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.map((t) => ({
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
- ...toolOptions
446
+ tools,
447
+ tool_choice: toolChoice
492
448
  }, { 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: [] } };
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
- 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
- }
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
- 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
- }
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=8B298CD215D7760D64756E2164756E21
778
+ //# debugId=FE9863287875C6B364756E2164756E21