@workglow/openai 0.3.24 → 0.3.26

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.
@@ -2,28 +2,28 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/ai/common/OpenAI_Client.ts", "../src/ai/registerOpenAiInline.browser.ts", "../src/ai/common/OpenAI_CapabilitySets.ts", "../src/ai/common/OpenAI_CountTokens.browser.ts", "../src/ai/common/OpenAI_ImageEdit.ts", "../src/ai/common/OpenAI_ImageGenerate.ts", "../src/ai/common/OpenAI_ModelInfo.ts", "../src/ai/common/OpenAI_ModelSearch.ts", "../src/ai/common/OpenAI_Constants.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_JobRunFns.browser.ts", "../src/ai/OpenAiQueuedProvider.ts", "../src/ai/common/OpenAI_Capabilities.ts", "../src/ai/registerOpenAiWorker.browser.ts", "../src/ai/OpenAiProvider.ts"],
4
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, validateProviderBaseUrl } from \"@workglow/ai/provider-utils\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\n/**\n * Hostnames (or hostname suffixes) accepted for OpenAI `base_url` without\n * the explicit `trustedBaseUrl` opt-out. Includes Azure OpenAI tenants.\n */\nexport const OPENAI_ALLOWED_HOSTS: readonly string[] = [\"api.openai.com\", \".openai.azure.com\"];\n\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\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 * When `true`, accept the `base_url` even if its hostname is not in\n * {@link OPENAI_ALLOWED_HOSTS}. Use only for known-good custom enterprise\n * gateways. The URL still has to parse and use a safe scheme.\n */\n readonly trustedBaseUrl?: boolean;\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 // Throw before SDK construction on a rejected base_url so the API key is\n // never sent to an unvalidated host.\n const baseURL = validateProviderBaseUrl(config?.base_url, {\n vendor: \"openai\",\n allowHosts: OPENAI_ALLOWED_HOSTS,\n trustedBaseUrl: config?.trustedBaseUrl,\n providerLabel: \"OpenAI\",\n });\n try {\n return new OpenAI({\n apiKey,\n baseURL,\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",
5
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { isBrowserLike, resolveApiKey, validateProviderBaseUrl } from \"@workglow/ai/provider-utils\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\n/**\n * Hostnames (or hostname suffixes) accepted for OpenAI `base_url` without\n * the explicit `trustedBaseUrl` opt-out. Includes Azure OpenAI tenants.\n */\nexport const OPENAI_ALLOWED_HOSTS: readonly string[] = [\"api.openai.com\", \".openai.azure.com\"];\n\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\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 readonly prompt_cache_key?: string;\n readonly reasoning?: { readonly effort?: string; readonly mode?: string };\n /**\n * When `true`, accept the `base_url` even if its hostname is not in\n * {@link OPENAI_ALLOWED_HOSTS}. Use only for known-good custom enterprise\n * gateways. The URL still has to parse and use a safe scheme.\n */\n readonly trustedBaseUrl?: boolean;\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 // Throw before SDK construction on a rejected base_url so the API key is\n // never sent to an unvalidated host.\n const baseURL = validateProviderBaseUrl(config?.base_url, {\n vendor: \"openai\",\n allowHosts: OPENAI_ALLOWED_HOSTS,\n trustedBaseUrl: config?.trustedBaseUrl,\n providerLabel: \"OpenAI\",\n });\n try {\n return new OpenAI({\n apiKey,\n baseURL,\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\n/**\n * Resolves the configured `reasoning` object for reasoning-capable models\n * (the GPT-5.6 sol/terra/luna family and the o-series), sent verbatim as the\n * Responses `reasoning` parameter. Returns `undefined` when unset so\n * non-reasoning models and callers that don't opt in send no reasoning field.\n */\nexport function getReasoningConfig(\n model: OpenAiModelConfig | undefined\n): { effort?: string; mode?: string } | undefined {\n const reasoning = (model?.provider_config as ResolvedProviderConfig | undefined)?.reasoning;\n if (!reasoning || (reasoning.effort === undefined && reasoning.mode === undefined)) {\n return undefined;\n }\n return reasoning;\n}\n\n/** Deterministic 32-bit FNV-1a hash → 8-char hex. Worker-safe (no crypto import). */\nfunction fnv1aHex(input: string): string {\n let hash = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\n/**\n * Resolves the Responses `prompt_cache_key`. Uses an explicit\n * `provider_config.prompt_cache_key` override when set, otherwise derives a\n * stable key from the request's cache-relevant prefix (model + system\n * instructions + tools) so requests sharing that prefix converge on one key and\n * hit the cache. GPT-5.6 bills cache writes, so a stable key (not a random one)\n * is the cost-correct default.\n */\nexport function resolvePromptCacheKey(\n model: OpenAiModelConfig | undefined,\n params: { model?: unknown; instructions?: unknown; tools?: unknown }\n): string {\n const override = (model?.provider_config as ResolvedProviderConfig | undefined)?.prompt_cache_key;\n if (override) return override;\n const material = JSON.stringify([\n params.model ?? \"\",\n params.instructions ?? \"\",\n params.tools ?? null,\n ]);\n return `wg-${fnv1aHex(material)}`;\n}\n\n/**\n * Applies the per-request Responses fields common to every OpenAI text run-fn:\n * the model's `reasoning` config (when set) and a stable `prompt_cache_key`.\n * Mutates and returns `params` so callers can inline it into the create call.\n * Call this last, after model/instructions/tools are populated, so the cache\n * key sees the full prefix.\n */\nexport function finalizeResponsesRequest(\n model: OpenAiModelConfig | undefined,\n params: Record<string, unknown>\n): Record<string, unknown> {\n const reasoning = getReasoningConfig(model);\n if (reasoning !== undefined) params.reasoning = reasoning;\n params.prompt_cache_key = resolvePromptCacheKey(model, params);\n return params;\n}\n",
6
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_RUN_FNS } from \"./common/OpenAI_JobRunFns.browser\";\nimport { OpenAiQueuedProvider } from \"./OpenAiQueuedProvider\";\n\nexport async function registerOpenAiInline(options?: AiProviderRegisterOptions): Promise<void> {\n await registerProviderInline(\n new OpenAiQueuedProvider(OPENAI_RUN_FNS, OPENAI_PREVIEW_TASKS),\n \"OpenAI\",\n options\n );\n}\n",
7
7
  "/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { Capability } from \"@workglow/ai/worker\";\n\n/**\n * Single source of truth for OpenAI's capability sets.\n *\n * Both `OPENAI_RUN_FNS` (the worker-side registration list) and\n * `workerRunFnSpecs()` (the main-thread proxy declaration) derive their\n * `serves` arrays from these named exports. SDK-free so the main thread\n * can import without paying the OpenAI client cost.\n *\n * To add a new capability set: declare a new `as const` constant here,\n * then reference it from both `OPENAI_RUN_FNS` and `OPENAI_RUN_FN_SPECS`.\n */\nexport const OPENAI_TEXT_GENERATION = [\"text.generation\"] as const satisfies Capability[];\nexport const OPENAI_TOOL_USE = [\"text.generation\", \"tool-use\"] as const satisfies Capability[];\nexport const OPENAI_JSON_MODE = [\"text.generation\", \"json-mode\"] as const satisfies Capability[];\nexport const OPENAI_TEXT_REWRITER = [\"text.rewriter\"] as const satisfies Capability[];\nexport const OPENAI_TEXT_SUMMARY = [\"text.summary\"] as const satisfies Capability[];\nexport const OPENAI_TEXT_EMBEDDING = [\"text.embedding\"] as const satisfies Capability[];\nexport const OPENAI_IMAGE_GENERATION = [\"image.generation\"] as const satisfies Capability[];\nexport const OPENAI_IMAGE_EDITING = [\"image.editing\"] as const satisfies Capability[];\nexport const OPENAI_COUNT_TOKENS = [\"model.count-tokens\"] as const satisfies Capability[];\nexport const OPENAI_MODEL_SEARCH = [\"model.search\"] as const satisfies Capability[];\nexport const OPENAI_MODEL_INFO = [\"model.info\"] as const satisfies Capability[];\n\n/** Aggregated list — for `workerRunFnSpecs()` derivation. Order MUST match `OPENAI_RUN_FNS`. */\nexport const OPENAI_CAPABILITY_SETS = [\n OPENAI_TEXT_GENERATION,\n OPENAI_TOOL_USE,\n OPENAI_JSON_MODE,\n OPENAI_TEXT_REWRITER,\n OPENAI_TEXT_SUMMARY,\n OPENAI_TEXT_EMBEDDING,\n OPENAI_IMAGE_GENERATION,\n OPENAI_IMAGE_EDITING,\n OPENAI_COUNT_TOKENS,\n OPENAI_MODEL_SEARCH,\n OPENAI_MODEL_INFO,\n] as const;\n",
8
8
  "/**\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 { Tiktoken, TiktokenModel } from \"js-tiktoken\";\nimport { getModelName } from \"./OpenAI_Client\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\nlet _tiktoken: typeof import(\"js-tiktoken\") | undefined;\n\nasync function loadTiktoken() {\n if (!_tiktoken) {\n try {\n _tiktoken = await import(\"js-tiktoken\");\n } catch {\n throw new Error(\n \"js-tiktoken is required for OpenAI token counting in the browser. Install it with: bun add js-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.encodingForModel(modelName as TiktokenModel));\n } catch {\n const fallback = \"cl100k_base\";\n if (!_encoderCache.has(fallback)) {\n _encoderCache.set(fallback, tiktoken.getEncoding(fallback));\n }\n _encoderCache.set(modelName, _encoderCache.get(fallback)!);\n }\n }\n return _encoderCache.get(modelName)!;\n}\n\nasync function countTokens(\n input: CountTokensTaskInput,\n model: OpenAiModelConfig | undefined\n): Promise<CountTokensTaskOutput> {\n const enc = await getEncoder(getModelName(model));\n const tokens = enc.encode(input.text);\n return { count: tokens.length };\n}\n\n/**\n * One-shot run-fn for `[\"model.count-tokens\"]` in the browser.\n * Emits a single `finish` event carrying the token count.\n */\nexport const OpenAI_CountTokens_Stream: AiProviderRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n OpenAiModelConfig\n> = async (input, model, _signal, emit) => {\n const result = await countTokens(input, model);\n emit({ type: \"finish\", data: result });\n};\n\n/** Lightweight preview path used by `AiTask.executePreview()`. */\nexport const OpenAI_CountTokens_Preview: AiProviderPreviewRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n OpenAiModelConfig\n> = async (input, model) => {\n return countTokens(input, model);\n};\n",
9
9
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRunFn, ImageEditTaskInput, ImageEditTaskOutput } from \"@workglow/ai\";\nimport { ImageGenerationContentPolicyError, ImageGenerationProviderError } from \"@workglow/ai\";\nimport type { ImageValue } from \"@workglow/util/media\";\n\nimport {\n dataUriToImageValue,\n imageValueToPngBytes,\n modelIdForError,\n} 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\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\n/**\n * Streaming run-fn for `[\"image.editing\"]`. SDK v6.35+ supports\n * `stream: true` on `images.edit` for GPT image models — emits snapshot\n * events for each partial + final image, then finish.\n */\nexport const OpenAI_ImageEdit_Stream: AiProviderRunFn<\n ImageEditTaskInput,\n ImageEditTaskOutput,\n OpenAiModelConfig\n> = async (input, model, signal, emit) => {\n const client = await getClient(model);\n\n try {\n const payload = await buildEditPayload(input, model);\n const stream = await (\n client.images.edit as unknown as (\n body: Record<string, unknown>,\n options: { signal: AbortSignal }\n ) => Promise<AsyncIterable<{ b64_json?: string }>>\n )({ ...payload, stream: true, partial_images: 3 }, { signal });\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 emit({ type: \"snapshot\", data: { image } } as Parameters<typeof emit>[0]);\n }\n emit({ 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(modelIdForError(model, \"openai\"), msg);\n }\n throw new ImageGenerationProviderError(modelIdForError(model, \"openai\"), msg, {\n cause: err as Error,\n });\n }\n};\n",
10
10
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n ImageGenerateTaskInput,\n ImageGenerateTaskOutput,\n} from \"@workglow/ai\";\nimport { ImageGenerationContentPolicyError, ImageGenerationProviderError } from \"@workglow/ai\";\nimport type { ImageValue } from \"@workglow/util/media\";\n\nimport { dataUriToImageValue, modelIdForError } from \"@workglow/ai/provider-utils\";\nimport { getClient, getModelName } from \"./OpenAI_Client\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\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\n/**\n * Streaming run-fn for `[\"image.generation\"]`. GPT-image models support\n * native streaming via `stream: true` + `partial_images: 3` and emit a\n * `snapshot` event per partial frame plus a final snapshot. DALL-E models\n * do not support streaming so this falls back to a single non-streaming\n * call and emits one snapshot before finish.\n */\nexport const OpenAI_ImageGenerate_Stream: AiProviderRunFn<\n ImageGenerateTaskInput,\n ImageGenerateTaskOutput,\n OpenAiModelConfig\n> = async (input, model, signal, emit) => {\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 (\n client.images.generate as unknown as (\n body: Record<string, unknown>,\n options: { signal: AbortSignal }\n ) => Promise<{ data?: Array<{ b64_json?: string }> }>\n )(\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(\n modelIdForError(model, \"openai\"),\n \"Empty response (no b64_json)\"\n );\n }\n const image = await decodeB64Png(b64);\n emit({ type: \"snapshot\", data: { image } } as Parameters<typeof emit>[0]);\n emit({ 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(modelIdForError(model, \"openai\"), msg);\n }\n throw new ImageGenerationProviderError(modelIdForError(model, \"openai\"), msg, {\n cause: err as Error,\n });\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 emit({ type: \"snapshot\", data: { image } } as Parameters<typeof emit>[0]);\n }\n emit({ 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(modelIdForError(model, \"openai\"), msg);\n }\n throw new ImageGenerationProviderError(modelIdForError(model, \"openai\"), msg, {\n cause: err as Error,\n });\n }\n};\n",
11
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\n/**\n * One-shot run-fn for `[\"model.info\"]`. Returns a synchronous\n * info record from the in-process embedding-dimensions table; OpenAI does not\n * expose an HTTP endpoint for this metadata. Emits a single `finish` event.\n */\nexport const OpenAI_ModelInfo_Stream: AiProviderRunFn<\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n OpenAiModelConfig\n> = async (input, model, _signal, emit) => {\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 emit({\n type: \"finish\",\n data: {\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 return;\n }\n\n emit({\n type: \"finish\",\n data: {\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};\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 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; capabilities: string[] }> = [\n { value: \"gpt-image-2\", capabilities: [\"image.generation\", \"image.editing\"] },\n { value: \"dall-e-3\", capabilities: [\"image.generation\"] },\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 capabilities: imageEntry?.capabilities ?? [],\n provider_config: { model_name: m.value },\n metadata: {},\n },\n raw: m,\n };\n });\n}\n\n/**\n * One-shot run-fn for `[\"model.search\"]`. Emits a\n * single `finish` event with the search results. When no credential key is\n * provided, falls back to a curated static list of well-known OpenAI models.\n */\nexport const OpenAI_ModelSearch_Stream: AiProviderRunFn<\n ModelSearchTaskInput,\n ModelSearchTaskOutput\n> = async (input, _model, _signal, emit) => {\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 emit({ type: \"finish\", data: { results: mapModelList(models) } });\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 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.6\", value: \"gpt-5.6\" },\n { label: \"gpt-5.6-sol\", value: \"gpt-5.6-sol\" },\n { label: \"gpt-5.6-terra\", value: \"gpt-5.6-terra\" },\n { label: \"gpt-5.6-luna\", value: \"gpt-5.6-luna\" },\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; capabilities: string[] }> = [\n { value: \"gpt-image-2\", capabilities: [\"image.generation\", \"image.editing\"] },\n { value: \"dall-e-3\", capabilities: [\"image.generation\"] },\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 capabilities: imageEntry?.capabilities ?? [],\n provider_config: { model_name: m.value },\n metadata: {},\n },\n raw: m,\n };\n });\n}\n\n/**\n * One-shot run-fn for `[\"model.search\"]`. Emits a\n * single `finish` event with the search results. When no credential key is\n * provided, falls back to a curated static list of well-known OpenAI models.\n */\nexport const OpenAI_ModelSearch_Stream: AiProviderRunFn<\n ModelSearchTaskInput,\n ModelSearchTaskOutput\n> = async (input, _model, _signal, emit) => {\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 emit({ type: \"finish\", data: { results: mapModelList(models) } });\n};\n",
13
13
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport const OPENAI = \"OPENAI\";\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 StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n} from \"@workglow/ai\";\nimport { parsePartialJson } from \"@workglow/util/worker\";\nimport { getClient, getModelName } from \"./OpenAI_Client\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\n/**\n * Streaming run-fn for `[\"text.generation\", \"json-mode\"]`. Emits\n * `object-delta` events with progressively-completed partial JSON snapshots\n * on the `object` port, ending with a `finish` event carrying the parsed\n * final object.\n */\nexport const OpenAI_StructuredGeneration_Stream: AiProviderRunFn<\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n OpenAiModelConfig\n> = async (input, model, signal, emit, outputSchema) => {\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 never,\n json_schema: {\n name: \"structured_output\",\n schema: schema,\n strict: true,\n },\n } as never,\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 emit({ 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 emit({ type: \"finish\", data: { object: finalObject } as StructuredGenerationTaskOutput });\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 StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n} from \"@workglow/ai\";\nimport { isStrictCompatibleSchema } from \"@workglow/ai/provider-utils\";\nimport { parsePartialJson } from \"@workglow/util/worker\";\nimport { finalizeResponsesRequest, getClient, getModelName } from \"./OpenAI_Client\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\nexport { isStrictCompatibleSchema };\n\n/**\n * Streaming run-fn for `[\"text.generation\", \"json-mode\"]`. Emits\n * `object-delta` events with progressively-completed partial JSON snapshots\n * on the `object` port, ending with a `finish` event carrying the parsed\n * final object.\n */\nexport const OpenAI_StructuredGeneration_Stream: AiProviderRunFn<\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n OpenAiModelConfig\n> = async (input, model, signal, emit, outputSchema) => {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const schema = input.outputSchema ?? outputSchema;\n\n const params: Record<string, unknown> = {\n model: modelName,\n input: input.prompt,\n text: {\n format: {\n type: \"json_schema\",\n name: \"structured_output\",\n schema: schema,\n strict: isStrictCompatibleSchema(schema),\n },\n },\n };\n if (input.maxTokens !== undefined) params.max_output_tokens = input.maxTokens;\n if (input.temperature !== undefined) params.temperature = input.temperature;\n finalizeResponsesRequest(model, params);\n\n const stream = await client.responses.create(\n { ...params, stream: true } as Parameters<typeof client.responses.create>[0],\n { signal }\n );\n\n let accumulatedJson = \"\";\n let refusal = \"\";\n for await (const event of stream as AsyncIterable<{ type?: string; delta?: string }>) {\n if (event.type === \"response.output_text.delta\") {\n const delta = event.delta ?? \"\";\n if (delta) {\n accumulatedJson += delta;\n const partial = parsePartialJson(accumulatedJson);\n if (partial !== undefined) {\n emit({ type: \"object-delta\", port: \"object\", objectDelta: partial });\n }\n }\n } else if (event.type === \"response.refusal.delta\") {\n refusal += event.delta ?? \"\";\n }\n }\n\n if (refusal) {\n // Surface the refusal as a first-class event; the consumer completes with\n // the reserved `refusal` field instead of retrying against empty JSON.\n emit({ type: \"refusal\", refusal });\n }\n\n let finalObject: Record<string, unknown>;\n try {\n finalObject = JSON.parse(accumulatedJson);\n } catch {\n finalObject = parsePartialJson(accumulatedJson) ?? {};\n }\n emit({ type: \"finish\", data: { object: finalObject } as StructuredGenerationTaskOutput });\n};\n",
15
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 TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n} from \"@workglow/ai\";\nimport { getLogger } from \"@workglow/util/worker\";\nimport { getClient, getModelName } from \"./OpenAI_Client\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\n/**\n * One-shot run-fn for `[\"text.embedding\"]`. Calls the OpenAI\n * embeddings endpoint and emits a single `finish` event carrying the vector\n * (or array of vectors when `input.text` is an array).\n */\nexport const OpenAI_TextEmbedding_Stream: AiProviderRunFn<\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n OpenAiModelConfig\n> = async (input, model, signal, emit) => {\n const logger = getLogger();\n const timerLabel = `openai:TextEmbedding:${getModelName(model)}`;\n logger.time(timerLabel, { model: getModelName(model) });\n try {\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 const result: TextEmbeddingTaskOutput = Array.isArray(input.text)\n ? ({\n vector: response.data.map(\n (item: { embedding: number[] }) => new Float32Array(item.embedding)\n ),\n } as unknown as TextEmbeddingTaskOutput)\n : ({ vector: new Float32Array(response.data[0].embedding) } as TextEmbeddingTaskOutput);\n\n emit({ type: \"finish\", data: result });\n } finally {\n logger.timeEnd(timerLabel, { model: getModelName(model) });\n }\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 TextGenerationTaskInput,\n TextGenerationTaskOutput,\n} from \"@workglow/ai\";\nimport { toOpenAIMessages } from \"@workglow/ai/worker\";\nimport { getLogger } from \"@workglow/util/worker\";\nimport { getClient, getModelName } from \"./OpenAI_Client\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\n/**\n * Inputs that the unified `[\"text.generation\"]` runFn handles. Both\n * {@link TextGenerationTask} and {@link AiChatTask} declare\n * `requires: [\"text.generation\"]`, so the capability dispatcher routes both\n * here. AiChatTask supplies a populated `messages` array; TextGenerationTask\n * (and other simple prompt callers) supply a `prompt` string only.\n */\ninterface UnifiedTextGenerationInput extends TextGenerationTaskInput {\n readonly messages?: readonly unknown[];\n readonly systemPrompt?: string;\n}\n\n/**\n * Build the OpenAI chat-completion request parameters from the unified input\n * shape — preferring a populated `messages` array (AiChatTask) and falling\n * back to wrapping `prompt` as a single user message (TextGenerationTask).\n */\nfunction buildChatParams(\n input: UnifiedTextGenerationInput,\n model: OpenAiModelConfig | undefined\n): Record<string, unknown> {\n const hasMessages = Array.isArray(input.messages) && input.messages.length > 0;\n const messages = hasMessages\n ? toOpenAIMessages({\n messages: input.messages,\n systemPrompt: input.systemPrompt,\n prompt: \"\",\n tools: [],\n } as never)\n : [{ role: \"user\" as const, content: input.prompt }];\n\n const params: Record<string, unknown> = {\n model: getModelName(model),\n messages,\n };\n if (input.maxTokens !== undefined) params.max_completion_tokens = input.maxTokens;\n if (input.temperature !== undefined) params.temperature = input.temperature;\n if ((input as { topP?: number }).topP !== undefined)\n params.top_p = (input as { topP?: number }).topP;\n if ((input as { frequencyPenalty?: number }).frequencyPenalty !== undefined)\n params.frequency_penalty = (input as { frequencyPenalty?: number }).frequencyPenalty;\n if ((input as { presencePenalty?: number }).presencePenalty !== undefined)\n params.presence_penalty = (input as { presencePenalty?: number }).presencePenalty;\n return params;\n}\n\n/**\n * Streaming run-fn for the `[\"text.generation\"]` capability. Used by both\n * {@link TextGenerationTask} (prompt-only input) and {@link AiChatTask}\n * (full conversation history). Emits `text-delta` events on the `text` port\n * and a final empty `finish` event per the streaming convention (consumer\n * accumulates).\n */\nexport const OpenAI_TextGeneration_Stream: AiProviderRunFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n OpenAiModelConfig\n> = async (input, model, signal, emit) => {\n const logger = getLogger();\n const timerLabel = `openai:TextGeneration:${getModelName(model)}`;\n logger.time(timerLabel, { model: getModelName(model) });\n try {\n const client = await getClient(model);\n const params = buildChatParams(input as UnifiedTextGenerationInput, model);\n\n const stream = await client.chat.completions.create(\n { ...params, stream: true } as Parameters<typeof client.chat.completions.create>[0],\n { signal }\n );\n\n for await (const chunk of stream as AsyncIterable<{\n choices?: Array<{ delta?: { content?: string | null } }>;\n }>) {\n const delta = chunk.choices?.[0]?.delta?.content ?? \"\";\n if (delta) {\n emit({ type: \"text-delta\", port: \"text\", textDelta: delta });\n }\n }\n emit({ type: \"finish\", data: {} as TextGenerationTaskOutput });\n } finally {\n logger.timeEnd(timerLabel, { model: getModelName(model) });\n }\n};\n",
17
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRunFn, TextRewriterTaskInput, TextRewriterTaskOutput } from \"@workglow/ai\";\nimport { getClient, getModelName } from \"./OpenAI_Client\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\n/**\n * Streaming run-fn for `[\"text.rewriter\"]`. Emits `text-delta` events on\n * the `text` port and a final empty `finish` event.\n */\nexport const OpenAI_TextRewriter_Stream: AiProviderRunFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n OpenAiModelConfig\n> = async (input, model, signal, emit) => {\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 emit({ type: \"text-delta\", port: \"text\", textDelta: delta });\n }\n }\n emit({ type: \"finish\", data: {} as TextRewriterTaskOutput });\n};\n",
18
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRunFn, TextSummaryTaskInput, TextSummaryTaskOutput } from \"@workglow/ai\";\nimport { getClient, getModelName } from \"./OpenAI_Client\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\n/**\n * Streaming run-fn for `[\"text.summary\"]`. Emits `text-delta` events on\n * the `text` port and a final empty `finish` event.\n */\nexport const OpenAI_TextSummary_Stream: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n OpenAiModelConfig\n> = async (input, model, signal, emit) => {\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 emit({ type: \"text-delta\", port: \"text\", textDelta: delta });\n }\n }\n emit({ type: \"finish\", data: {} as TextSummaryTaskOutput });\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 ToolCallingTaskInput,\n ToolCallingTaskOutput,\n ToolCalls,\n} from \"@workglow/ai\";\nimport {\n accumulateOpenAIStream,\n buildOpenAITools,\n mapOpenAIToolChoice,\n} from \"@workglow/ai/provider-utils\";\nimport { filterValidToolCalls, toOpenAIMessages } from \"@workglow/ai/worker\";\nimport { getClient, getModelName } from \"./OpenAI_Client\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\n/**\n * Streaming run-fn for `[\"text.generation\", \"tool-use\"]`. Calls the OpenAI\n * chat-completions endpoint with `stream: true` and forwards delta events via\n * {@link accumulateOpenAIStream}, which emits `text-delta` and tool-call\n * `object-delta` events plus a final empty `finish`.\n *\n * Defence-in-depth: each tool-call `object-delta` is filtered against\n * `input.tools` so a hallucinated function name never reaches the consumer.\n */\nexport const OpenAI_ToolCalling_Stream: AiProviderRunFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n OpenAiModelConfig\n> = async (input, model, signal, emit) => {\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 await accumulateOpenAIStream(stream, (event) => {\n if (event.type === \"object-delta\" && event.port === \"toolCalls\") {\n const validated = filterValidToolCalls(event.objectDelta as ToolCalls, input.tools);\n if (validated.length > 0) {\n emit({ type: \"object-delta\", port: \"toolCalls\", objectDelta: validated });\n }\n return;\n }\n emit(event);\n });\n emit({ type: \"finish\", data: { text: \"\", toolCalls: [] } as ToolCallingTaskOutput });\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 TextGenerationTaskInput,\n TextGenerationTaskOutput,\n} from \"@workglow/ai\";\nimport { accumulateOpenAIResponsesStream, buildResponsesInput } from \"@workglow/ai/provider-utils\";\nimport { toOpenAIMessages } from \"@workglow/ai/worker\";\nimport { getLogger } from \"@workglow/util/worker\";\nimport { finalizeResponsesRequest, getClient, getModelName } from \"./OpenAI_Client\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\n/**\n * Inputs that the unified `[\"text.generation\"]` runFn handles. Both\n * {@link TextGenerationTask} and {@link AiChatTask} declare\n * `requires: [\"text.generation\"]`, so the capability dispatcher routes both\n * here. AiChatTask supplies a populated `messages` array; TextGenerationTask\n * (and other simple prompt callers) supply a `prompt` string only.\n */\ninterface UnifiedTextGenerationInput extends TextGenerationTaskInput {\n readonly messages?: readonly unknown[];\n readonly systemPrompt?: string;\n}\n\n/**\n * Build the OpenAI Responses request parameters from the unified input shape —\n * preferring a populated `messages` array (AiChatTask) and falling back to the\n * `prompt` string (TextGenerationTask). Note: the Responses API does not accept\n * `frequency_penalty` / `presence_penalty`, so those are not forwarded.\n */\nfunction buildResponsesParams(\n input: UnifiedTextGenerationInput,\n model: OpenAiModelConfig | undefined\n): Record<string, unknown> {\n const hasMessages = Array.isArray(input.messages) && input.messages.length > 0;\n const messages = hasMessages\n ? toOpenAIMessages({\n messages: input.messages,\n systemPrompt: input.systemPrompt,\n prompt: \"\",\n tools: [],\n } as never)\n : undefined;\n\n const { input: responsesInput, instructions } = buildResponsesInput({\n messages,\n prompt: hasMessages ? undefined : input.prompt,\n systemPrompt: hasMessages ? undefined : input.systemPrompt,\n });\n\n const params: Record<string, unknown> = {\n model: getModelName(model),\n input: responsesInput,\n };\n if (instructions !== undefined) params.instructions = instructions;\n if (input.maxTokens !== undefined) params.max_output_tokens = input.maxTokens;\n if (input.temperature !== undefined) params.temperature = input.temperature;\n if ((input as { topP?: number }).topP !== undefined)\n params.top_p = (input as { topP?: number }).topP;\n return params;\n}\n\n/**\n * Streaming run-fn for the `[\"text.generation\"]` capability. Used by both\n * {@link TextGenerationTask} (prompt-only input) and {@link AiChatTask}\n * (full conversation history). Emits `text-delta` events on the `text` port\n * and a final empty `finish` event per the streaming convention (consumer\n * accumulates).\n */\nexport const OpenAI_TextGeneration_Stream: AiProviderRunFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n OpenAiModelConfig\n> = async (input, model, signal, emit) => {\n const logger = getLogger();\n const timerLabel = `openai:TextGeneration:${getModelName(model)}`;\n logger.time(timerLabel, { model: getModelName(model) });\n try {\n const client = await getClient(model);\n const params = finalizeResponsesRequest(\n model,\n buildResponsesParams(input as UnifiedTextGenerationInput, model)\n );\n\n const stream = await client.responses.create(\n { ...params, stream: true } as Parameters<typeof client.responses.create>[0],\n { signal }\n );\n\n await accumulateOpenAIResponsesStream(stream as AsyncIterable<unknown>, emit);\n emit({ type: \"finish\", data: {} as TextGenerationTaskOutput });\n } finally {\n logger.timeEnd(timerLabel, { model: getModelName(model) });\n }\n};\n",
17
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRunFn, TextRewriterTaskInput, TextRewriterTaskOutput } from \"@workglow/ai\";\nimport { accumulateOpenAIResponsesStream } from \"@workglow/ai/provider-utils\";\nimport { finalizeResponsesRequest, getClient, getModelName } from \"./OpenAI_Client\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\n/**\n * Streaming run-fn for `[\"text.rewriter\"]`. Emits `text-delta` events on\n * the `text` port and a final empty `finish` event. The rewrite instruction\n * is sent as the Responses `instructions` (system) channel.\n */\nexport const OpenAI_TextRewriter_Stream: AiProviderRunFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n OpenAiModelConfig\n> = async (input, model, signal, emit) => {\n const client = await getClient(model);\n\n const params: Record<string, unknown> = {\n model: getModelName(model),\n instructions: input.prompt,\n input: input.text,\n };\n finalizeResponsesRequest(model, params);\n\n const stream = await client.responses.create(\n { ...params, stream: true } as Parameters<typeof client.responses.create>[0],\n { signal }\n );\n\n await accumulateOpenAIResponsesStream(stream as AsyncIterable<unknown>, emit);\n emit({ type: \"finish\", data: {} as TextRewriterTaskOutput });\n};\n",
18
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRunFn, TextSummaryTaskInput, TextSummaryTaskOutput } from \"@workglow/ai\";\nimport { accumulateOpenAIResponsesStream } from \"@workglow/ai/provider-utils\";\nimport { finalizeResponsesRequest, getClient, getModelName } from \"./OpenAI_Client\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\n/**\n * Streaming run-fn for `[\"text.summary\"]`. Emits `text-delta` events on\n * the `text` port and a final empty `finish` event.\n */\nexport const OpenAI_TextSummary_Stream: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n OpenAiModelConfig\n> = async (input, model, signal, emit) => {\n const client = await getClient(model);\n\n const params: Record<string, unknown> = {\n model: getModelName(model),\n instructions: \"Summarize the following text concisely.\",\n input: input.text,\n };\n finalizeResponsesRequest(model, params);\n\n const stream = await client.responses.create(\n { ...params, stream: true } as Parameters<typeof client.responses.create>[0],\n { signal }\n );\n\n await accumulateOpenAIResponsesStream(stream as AsyncIterable<unknown>, emit);\n emit({ type: \"finish\", data: {} as TextSummaryTaskOutput });\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 ToolCallingTaskInput,\n ToolCallingTaskOutput,\n ToolCalls,\n} from \"@workglow/ai\";\nimport {\n accumulateOpenAIResponsesStream,\n buildResponsesInput,\n buildResponsesTools,\n mapResponsesToolChoice,\n} from \"@workglow/ai/provider-utils\";\nimport { filterValidToolCalls, toOpenAIMessages } from \"@workglow/ai/worker\";\nimport { finalizeResponsesRequest, getClient, getModelName } from \"./OpenAI_Client\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\n/**\n * Streaming run-fn for `[\"text.generation\", \"tool-use\"]`. Calls the OpenAI\n * Responses endpoint with `stream: true` and forwards delta events via\n * {@link accumulateOpenAIResponsesStream}, which emits `text-delta` and tool-call\n * `object-delta` events plus a final empty `finish`.\n *\n * Defence-in-depth: each tool-call `object-delta` is filtered against\n * `input.tools` so a hallucinated function name never reaches the consumer.\n */\nexport const OpenAI_ToolCalling_Stream: AiProviderRunFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n OpenAiModelConfig\n> = async (input, model, signal, emit) => {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const tools = buildResponsesTools(input.tools);\n const { input: responsesInput, instructions } = buildResponsesInput({\n messages: toOpenAIMessages(input),\n });\n const toolChoice = mapResponsesToolChoice(input.toolChoice);\n\n const params: Record<string, unknown> = {\n model: modelName,\n input: responsesInput,\n tools,\n tool_choice: toolChoice,\n };\n if (instructions !== undefined) params.instructions = instructions;\n if (input.maxTokens !== undefined) params.max_output_tokens = input.maxTokens;\n if (input.temperature !== undefined) params.temperature = input.temperature;\n finalizeResponsesRequest(model, params);\n\n const stream = await client.responses.create(\n { ...params, stream: true } as Parameters<typeof client.responses.create>[0],\n { signal }\n );\n\n await accumulateOpenAIResponsesStream<ToolCallingTaskOutput>(\n stream as AsyncIterable<unknown>,\n (event) => {\n if (event.type === \"object-delta\" && event.port === \"toolCalls\") {\n const validated = filterValidToolCalls(event.objectDelta as ToolCalls, input.tools);\n if (validated.length > 0) {\n emit({ type: \"object-delta\", port: \"toolCalls\", objectDelta: validated });\n }\n return;\n }\n emit(event);\n }\n );\n emit({ type: \"finish\", data: { text: \"\", toolCalls: [] } as ToolCallingTaskOutput });\n};\n",
20
20
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderPreviewRunFn, AiProviderRunFnRegistration } from \"@workglow/ai\";\nimport {\n OPENAI_COUNT_TOKENS,\n OPENAI_IMAGE_EDITING,\n OPENAI_IMAGE_GENERATION,\n OPENAI_JSON_MODE,\n OPENAI_MODEL_INFO,\n OPENAI_MODEL_SEARCH,\n OPENAI_TEXT_EMBEDDING,\n OPENAI_TEXT_GENERATION,\n OPENAI_TEXT_REWRITER,\n OPENAI_TEXT_SUMMARY,\n OPENAI_TOOL_USE,\n} from \"./OpenAI_CapabilitySets\";\nimport type { OpenAiModelConfig } from \"./OpenAI_ModelSchema\";\n\nexport { getClient, getModelName, loadOpenAISDK } from \"./OpenAI_Client\";\n\nimport {\n OpenAI_CountTokens_Preview,\n OpenAI_CountTokens_Stream,\n} from \"./OpenAI_CountTokens.browser\";\nimport { OpenAI_ImageEdit_Stream } from \"./OpenAI_ImageEdit\";\nimport { OpenAI_ImageGenerate_Stream } from \"./OpenAI_ImageGenerate\";\nimport { OpenAI_ModelInfo_Stream } from \"./OpenAI_ModelInfo\";\nimport { OpenAI_ModelSearch_Stream } from \"./OpenAI_ModelSearch\";\nimport { OpenAI_StructuredGeneration_Stream } from \"./OpenAI_StructuredGeneration\";\nimport { OpenAI_TextEmbedding_Stream } from \"./OpenAI_TextEmbedding\";\nimport { OpenAI_TextGeneration_Stream } from \"./OpenAI_TextGeneration\";\nimport { OpenAI_TextRewriter_Stream } from \"./OpenAI_TextRewriter\";\nimport { OpenAI_TextSummary_Stream } from \"./OpenAI_TextSummary\";\nimport { OpenAI_ToolCalling_Stream } from \"./OpenAI_ToolCalling\";\n\n/**\n * Browser build of {@link OPENAI_RUN_FNS}. Identical to the node build\n * except for the count-tokens import (uses `js-tiktoken` rather than the\n * WASM `tiktoken` package).\n */\nexport const OPENAI_RUN_FNS: readonly AiProviderRunFnRegistration<any, any, OpenAiModelConfig>[] = [\n { serves: OPENAI_TEXT_GENERATION, runFn: OpenAI_TextGeneration_Stream },\n { serves: OPENAI_TOOL_USE, runFn: OpenAI_ToolCalling_Stream },\n { serves: OPENAI_JSON_MODE, runFn: OpenAI_StructuredGeneration_Stream },\n { serves: OPENAI_TEXT_REWRITER, runFn: OpenAI_TextRewriter_Stream },\n { serves: OPENAI_TEXT_SUMMARY, runFn: OpenAI_TextSummary_Stream },\n { serves: OPENAI_TEXT_EMBEDDING, runFn: OpenAI_TextEmbedding_Stream },\n { serves: OPENAI_IMAGE_GENERATION, runFn: OpenAI_ImageGenerate_Stream },\n { serves: OPENAI_IMAGE_EDITING, runFn: OpenAI_ImageEdit_Stream },\n { serves: OPENAI_COUNT_TOKENS, runFn: OpenAI_CountTokens_Stream },\n { serves: OPENAI_MODEL_SEARCH, runFn: OpenAI_ModelSearch_Stream },\n { serves: OPENAI_MODEL_INFO, runFn: OpenAI_ModelInfo_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
21
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { Capability, ModelRecord } from \"@workglow/ai\";\nimport { AiProvider } from \"@workglow/ai\";\nimport { createCloudProviderClass } from \"@workglow/ai/provider-utils\";\nimport { inferOpenAiCapabilities, openAiWorkerRunFnSpecs } from \"./common/OpenAI_Capabilities\";\nimport { OPENAI } from \"./common/OpenAI_Constants\";\nimport type { OpenAiModelConfig } from \"./common/OpenAI_ModelSchema\";\n\n/**\n * Main-thread registration shell for OpenAI. Used both for inline mode\n * (constructed with the run-fn registrations array) and worker-backed mode\n * (constructed empty so the base class registers worker proxies). No queue\n * is created — OpenAI uses {@link DirectExecutionStrategy}.\n */\nexport class OpenAiQueuedProvider extends createCloudProviderClass<OpenAiModelConfig>(AiProvider, {\n name: OPENAI,\n displayName: \"OpenAI\",\n}) {\n override inferCapabilities(model: ModelRecord): readonly Capability[] {\n return inferOpenAiCapabilities(model);\n }\n\n protected override workerRunFnSpecs(): readonly { serves: readonly Capability[] }[] {\n return openAiWorkerRunFnSpecs();\n }\n}\n",
22
22
  "/**\n * @license\n * Copyright 2026 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { Capability, ModelRecord } from \"@workglow/ai/worker\";\nimport { OPENAI_CAPABILITY_SETS } from \"./OpenAI_CapabilitySets\";\n\n/**\n * Closed list of capability-set specs the OpenAI provider serves. Derived\n * from {@link OPENAI_CAPABILITY_SETS}. Used by the main-thread provider\n * shells when registering worker-mode proxies so the dispatcher can route\n * requests to the worker proxy.\n */\nexport const OPENAI_RUN_FN_SPECS = OPENAI_CAPABILITY_SETS.map((serves) => ({ serves }));\n\nexport function openAiWorkerRunFnSpecs(): readonly { readonly serves: readonly Capability[] }[] {\n return OPENAI_RUN_FN_SPECS;\n}\n\n/**\n * Shape used by the model-name regexes — `model_id` is required, the rest\n * is loosely-typed metadata only used to opportunistically widen the\n * inferred capability set.\n */\ntype CapabilityHints = Pick<ModelRecord, \"model_id\" | \"provider_config\" | \"capabilities\">;\n\n/**\n * Heuristic capability inference for an OpenAI {@link ModelRecord}. Pattern-\n * matches the canonical OpenAI model id strings (and the `provider_config.\n * model_name` if present) to a closed set of {@link Capability}s. Falls back\n * to the model's stored `capabilities` array (or a baseline of search +\n * info) when no pattern matches.\n *\n * Main-thread method only — workers do not run capability inference.\n */\nexport function inferOpenAiCapabilities(model: CapabilityHints): readonly Capability[] {\n const id = String(\n model.model_id ??\n (model.provider_config as { model_name?: string } | undefined)?.model_name ??\n \"\"\n );\n\n // Embedding models — text-embedding-3-{small,large}, text-embedding-ada-002.\n if (/^text-embedding/i.test(id)) {\n return [\"text.embedding\", \"model.count-tokens\", \"model.info\", \"model.search\"];\n }\n\n // Image models — DALL-E and gpt-image families.\n if (/^dall-e/i.test(id)) {\n // DALL-E 2/3 do NOT support edit consistently — gpt-image-* does. Cover\n // generation only here; the gpt-image branch below adds editing.\n return [\"image.generation\", \"model.info\", \"model.search\"];\n }\n if (/^gpt-image/i.test(id)) {\n return [\"image.generation\", \"image.editing\", \"model.info\", \"model.search\"];\n }\n\n // Chat / reasoning models — gpt-3.5/4/4o/5/...; o-series reasoning models (o1, o3, o4, future).\n // GPT-4o, gpt-4-vision-*, gpt-4-turbo, and all o-series additionally accept image inputs.\n if (/^gpt-/i.test(id) || /^o\\d/i.test(id)) {\n const caps: Capability[] = [\n \"text.generation\",\n \"text.rewriter\",\n \"text.summary\",\n \"tool-use\",\n \"json-mode\",\n \"model.count-tokens\",\n \"model.info\",\n \"model.search\",\n ];\n const supportsVision =\n /gpt-4o|gpt-4\\.1|gpt-5|gpt-4-vision|gpt-4-turbo/i.test(id) || /^o\\d/i.test(id);\n if (supportsVision) {\n caps.push(\"vision-input\");\n }\n return caps;\n }\n\n // Unknown model — fall back to whatever the record declared, or just\n // expose the meta-ops so the model can still be searched / inspected.\n const declared = (model.capabilities as readonly Capability[] | undefined) ?? [];\n if (declared.length > 0) return declared;\n return [\"model.search\", \"model.info\"];\n}\n",
23
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_RUN_FNS } from \"./common/OpenAI_JobRunFns.browser\";\nimport { OpenAiProvider } from \"./OpenAiProvider\";\n\nexport async function registerOpenAiWorker(): Promise<void> {\n await registerProviderWorker(\n (ws) => new OpenAiProvider(OPENAI_RUN_FNS, OPENAI_PREVIEW_TASKS).registerOnWorkerServer(ws),\n \"OpenAI\"\n );\n}\n",
24
24
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { createCloudProviderClass } from \"@workglow/ai/provider-utils\";\nimport type { Capability, ModelRecord } from \"@workglow/ai/worker\";\nimport { AiProvider } from \"@workglow/ai/worker\";\nimport { inferOpenAiCapabilities, openAiWorkerRunFnSpecs } from \"./common/OpenAI_Capabilities\";\nimport { OPENAI } from \"./common/OpenAI_Constants\";\nimport type { OpenAiModelConfig } from \"./common/OpenAI_ModelSchema\";\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 *\n * The class extends the {@link createCloudProviderClass} mixin (which\n * supplies `name` / `displayName` / `isLocal` / `supportsBrowser`) and adds\n * the OpenAI-specific {@link AiProvider.inferCapabilities} and\n * {@link AiProvider.workerRunFnSpecs} overrides.\n */\nexport class OpenAiProvider extends createCloudProviderClass<OpenAiModelConfig>(AiProvider, {\n name: OPENAI,\n displayName: \"OpenAI\",\n}) {\n override inferCapabilities(model: ModelRecord): readonly Capability[] {\n return inferOpenAiCapabilities(model);\n }\n\n protected override workerRunFnSpecs(): readonly { serves: readonly Capability[] }[] {\n return openAiWorkerRunFnSpecs();\n }\n}\n"
25
25
  ],
26
- "mappings": "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",
27
- "debugId": "BA051CB6DDC4C72F64756E2164756E21",
26
+ "mappings": "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",
27
+ "debugId": "782BE63C8FCCC0A964756E2164756E21",
28
28
  "names": []
29
29
  }
@@ -49,6 +49,39 @@ function getModelName(model) {
49
49
  }
50
50
  return name;
51
51
  }
52
+ function getReasoningConfig(model) {
53
+ const reasoning = model?.provider_config?.reasoning;
54
+ if (!reasoning || reasoning.effort === undefined && reasoning.mode === undefined) {
55
+ return;
56
+ }
57
+ return reasoning;
58
+ }
59
+ function fnv1aHex(input) {
60
+ let hash = 2166136261;
61
+ for (let i = 0;i < input.length; i++) {
62
+ hash ^= input.charCodeAt(i);
63
+ hash = Math.imul(hash, 16777619);
64
+ }
65
+ return (hash >>> 0).toString(16).padStart(8, "0");
66
+ }
67
+ function resolvePromptCacheKey(model, params) {
68
+ const override = model?.provider_config?.prompt_cache_key;
69
+ if (override)
70
+ return override;
71
+ const material = JSON.stringify([
72
+ params.model ?? "",
73
+ params.instructions ?? "",
74
+ params.tools ?? null
75
+ ]);
76
+ return `wg-${fnv1aHex(material)}`;
77
+ }
78
+ function finalizeResponsesRequest(model, params) {
79
+ const reasoning = getReasoningConfig(model);
80
+ if (reasoning !== undefined)
81
+ params.reasoning = reasoning;
82
+ params.prompt_cache_key = resolvePromptCacheKey(model, params);
83
+ return params;
84
+ }
52
85
 
53
86
  // src/ai/registerOpenAiInline.ts
54
87
  import { registerProviderInline } from "@workglow/ai/provider-utils";
@@ -365,6 +398,10 @@ import { filterLabeledModelsByQuery } from "@workglow/ai/provider-utils";
365
398
  var OPENAI_FALLBACK = [
366
399
  { label: "gpt-image-2", value: "gpt-image-2" },
367
400
  { label: "dall-e-3", value: "dall-e-3" },
401
+ { label: "gpt-5.6", value: "gpt-5.6" },
402
+ { label: "gpt-5.6-sol", value: "gpt-5.6-sol" },
403
+ { label: "gpt-5.6-terra", value: "gpt-5.6-terra" },
404
+ { label: "gpt-5.6-luna", value: "gpt-5.6-luna" },
368
405
  { label: "gpt-5.5", value: "gpt-5.5" },
369
406
  { label: "gpt-5.4-mini", value: "gpt-5.4-mini" },
370
407
  { label: "gpt-5.4-nano", value: "gpt-5.4-nano" },
@@ -431,37 +468,49 @@ var OpenAI_ModelSearch_Stream = async (input, _model, _signal, emit) => {
431
468
  };
432
469
 
433
470
  // src/ai/common/OpenAI_StructuredGeneration.ts
471
+ import { isStrictCompatibleSchema } from "@workglow/ai/provider-utils";
434
472
  import { parsePartialJson } from "@workglow/util/worker";
435
473
  var OpenAI_StructuredGeneration_Stream = async (input, model, signal, emit, outputSchema) => {
436
474
  const client = await getClient(model);
437
475
  const modelName = getModelName(model);
438
476
  const schema = input.outputSchema ?? outputSchema;
439
- const stream = await client.chat.completions.create({
477
+ const params = {
440
478
  model: modelName,
441
- messages: [{ role: "user", content: input.prompt }],
442
- response_format: {
443
- type: "json_schema",
444
- json_schema: {
479
+ input: input.prompt,
480
+ text: {
481
+ format: {
482
+ type: "json_schema",
445
483
  name: "structured_output",
446
484
  schema,
447
- strict: true
485
+ strict: isStrictCompatibleSchema(schema)
448
486
  }
449
- },
450
- max_completion_tokens: input.maxTokens,
451
- temperature: input.temperature,
452
- stream: true
453
- }, { signal });
487
+ }
488
+ };
489
+ if (input.maxTokens !== undefined)
490
+ params.max_output_tokens = input.maxTokens;
491
+ if (input.temperature !== undefined)
492
+ params.temperature = input.temperature;
493
+ finalizeResponsesRequest(model, params);
494
+ const stream = await client.responses.create({ ...params, stream: true }, { signal });
454
495
  let accumulatedJson = "";
455
- for await (const chunk of stream) {
456
- const delta = chunk.choices[0]?.delta?.content ?? "";
457
- if (delta) {
458
- accumulatedJson += delta;
459
- const partial = parsePartialJson(accumulatedJson);
460
- if (partial !== undefined) {
461
- emit({ type: "object-delta", port: "object", objectDelta: partial });
496
+ let refusal = "";
497
+ for await (const event of stream) {
498
+ if (event.type === "response.output_text.delta") {
499
+ const delta = event.delta ?? "";
500
+ if (delta) {
501
+ accumulatedJson += delta;
502
+ const partial = parsePartialJson(accumulatedJson);
503
+ if (partial !== undefined) {
504
+ emit({ type: "object-delta", port: "object", objectDelta: partial });
505
+ }
462
506
  }
507
+ } else if (event.type === "response.refusal.delta") {
508
+ refusal += event.delta ?? "";
463
509
  }
464
510
  }
511
+ if (refusal) {
512
+ emit({ type: "refusal", refusal });
513
+ }
465
514
  let finalObject;
466
515
  try {
467
516
  finalObject = JSON.parse(accumulatedJson);
@@ -494,30 +543,34 @@ var OpenAI_TextEmbedding_Stream = async (input, model, signal, emit) => {
494
543
  };
495
544
 
496
545
  // src/ai/common/OpenAI_TextGeneration.ts
546
+ import { accumulateOpenAIResponsesStream, buildResponsesInput } from "@workglow/ai/provider-utils";
497
547
  import { toOpenAIMessages } from "@workglow/ai/worker";
498
548
  import { getLogger as getLogger2 } from "@workglow/util/worker";
499
- function buildChatParams(input, model) {
549
+ function buildResponsesParams(input, model) {
500
550
  const hasMessages = Array.isArray(input.messages) && input.messages.length > 0;
501
551
  const messages = hasMessages ? toOpenAIMessages({
502
552
  messages: input.messages,
503
553
  systemPrompt: input.systemPrompt,
504
554
  prompt: "",
505
555
  tools: []
506
- }) : [{ role: "user", content: input.prompt }];
556
+ }) : undefined;
557
+ const { input: responsesInput, instructions } = buildResponsesInput({
558
+ messages,
559
+ prompt: hasMessages ? undefined : input.prompt,
560
+ systemPrompt: hasMessages ? undefined : input.systemPrompt
561
+ });
507
562
  const params = {
508
563
  model: getModelName(model),
509
- messages
564
+ input: responsesInput
510
565
  };
566
+ if (instructions !== undefined)
567
+ params.instructions = instructions;
511
568
  if (input.maxTokens !== undefined)
512
- params.max_completion_tokens = input.maxTokens;
569
+ params.max_output_tokens = input.maxTokens;
513
570
  if (input.temperature !== undefined)
514
571
  params.temperature = input.temperature;
515
572
  if (input.topP !== undefined)
516
573
  params.top_p = input.topP;
517
- if (input.frequencyPenalty !== undefined)
518
- params.frequency_penalty = input.frequencyPenalty;
519
- if (input.presencePenalty !== undefined)
520
- params.presence_penalty = input.presencePenalty;
521
574
  return params;
522
575
  }
523
576
  var OpenAI_TextGeneration_Stream = async (input, model, signal, emit) => {
@@ -526,14 +579,9 @@ var OpenAI_TextGeneration_Stream = async (input, model, signal, emit) => {
526
579
  logger.time(timerLabel, { model: getModelName(model) });
527
580
  try {
528
581
  const client = await getClient(model);
529
- const params = buildChatParams(input, model);
530
- const stream = await client.chat.completions.create({ ...params, stream: true }, { signal });
531
- for await (const chunk of stream) {
532
- const delta = chunk.choices?.[0]?.delta?.content ?? "";
533
- if (delta) {
534
- emit({ type: "text-delta", port: "text", textDelta: delta });
535
- }
536
- }
582
+ const params = finalizeResponsesRequest(model, buildResponsesParams(input, model));
583
+ const stream = await client.responses.create({ ...params, stream: true }, { signal });
584
+ await accumulateOpenAIResponsesStream(stream, emit);
537
585
  emit({ type: "finish", data: {} });
538
586
  } finally {
539
587
  logger.timeEnd(timerLabel, { model: getModelName(model) });
@@ -541,70 +589,66 @@ var OpenAI_TextGeneration_Stream = async (input, model, signal, emit) => {
541
589
  };
542
590
 
543
591
  // src/ai/common/OpenAI_TextRewriter.ts
592
+ import { accumulateOpenAIResponsesStream as accumulateOpenAIResponsesStream2 } from "@workglow/ai/provider-utils";
544
593
  var OpenAI_TextRewriter_Stream = async (input, model, signal, emit) => {
545
594
  const client = await getClient(model);
546
- const modelName = getModelName(model);
547
- const stream = await client.chat.completions.create({
548
- model: modelName,
549
- messages: [
550
- { role: "system", content: input.prompt },
551
- { role: "user", content: input.text }
552
- ],
553
- stream: true
554
- }, { signal });
555
- for await (const chunk of stream) {
556
- const delta = chunk.choices[0]?.delta?.content ?? "";
557
- if (delta) {
558
- emit({ type: "text-delta", port: "text", textDelta: delta });
559
- }
560
- }
595
+ const params = {
596
+ model: getModelName(model),
597
+ instructions: input.prompt,
598
+ input: input.text
599
+ };
600
+ finalizeResponsesRequest(model, params);
601
+ const stream = await client.responses.create({ ...params, stream: true }, { signal });
602
+ await accumulateOpenAIResponsesStream2(stream, emit);
561
603
  emit({ type: "finish", data: {} });
562
604
  };
563
605
 
564
606
  // src/ai/common/OpenAI_TextSummary.ts
607
+ import { accumulateOpenAIResponsesStream as accumulateOpenAIResponsesStream3 } from "@workglow/ai/provider-utils";
565
608
  var OpenAI_TextSummary_Stream = async (input, model, signal, emit) => {
566
609
  const client = await getClient(model);
567
- const modelName = getModelName(model);
568
- const stream = await client.chat.completions.create({
569
- model: modelName,
570
- messages: [
571
- { role: "system", content: "Summarize the following text concisely." },
572
- { role: "user", content: input.text }
573
- ],
574
- stream: true
575
- }, { signal });
576
- for await (const chunk of stream) {
577
- const delta = chunk.choices[0]?.delta?.content ?? "";
578
- if (delta) {
579
- emit({ type: "text-delta", port: "text", textDelta: delta });
580
- }
581
- }
610
+ const params = {
611
+ model: getModelName(model),
612
+ instructions: "Summarize the following text concisely.",
613
+ input: input.text
614
+ };
615
+ finalizeResponsesRequest(model, params);
616
+ const stream = await client.responses.create({ ...params, stream: true }, { signal });
617
+ await accumulateOpenAIResponsesStream3(stream, emit);
582
618
  emit({ type: "finish", data: {} });
583
619
  };
584
620
 
585
621
  // src/ai/common/OpenAI_ToolCalling.ts
586
622
  import {
587
- accumulateOpenAIStream,
588
- buildOpenAITools,
589
- mapOpenAIToolChoice
623
+ accumulateOpenAIResponsesStream as accumulateOpenAIResponsesStream4,
624
+ buildResponsesInput as buildResponsesInput2,
625
+ buildResponsesTools,
626
+ mapResponsesToolChoice
590
627
  } from "@workglow/ai/provider-utils";
591
628
  import { filterValidToolCalls, toOpenAIMessages as toOpenAIMessages2 } from "@workglow/ai/worker";
592
629
  var OpenAI_ToolCalling_Stream = async (input, model, signal, emit) => {
593
630
  const client = await getClient(model);
594
631
  const modelName = getModelName(model);
595
- const tools = buildOpenAITools(input.tools);
596
- const messages = toOpenAIMessages2(input);
597
- const toolChoice = mapOpenAIToolChoice(input.toolChoice, true);
598
- const stream = await client.chat.completions.create({
632
+ const tools = buildResponsesTools(input.tools);
633
+ const { input: responsesInput, instructions } = buildResponsesInput2({
634
+ messages: toOpenAIMessages2(input)
635
+ });
636
+ const toolChoice = mapResponsesToolChoice(input.toolChoice);
637
+ const params = {
599
638
  model: modelName,
600
- messages,
601
- max_completion_tokens: input.maxTokens,
602
- temperature: input.temperature,
603
- stream: true,
639
+ input: responsesInput,
604
640
  tools,
605
641
  tool_choice: toolChoice
606
- }, { signal });
607
- await accumulateOpenAIStream(stream, (event) => {
642
+ };
643
+ if (instructions !== undefined)
644
+ params.instructions = instructions;
645
+ if (input.maxTokens !== undefined)
646
+ params.max_output_tokens = input.maxTokens;
647
+ if (input.temperature !== undefined)
648
+ params.temperature = input.temperature;
649
+ finalizeResponsesRequest(model, params);
650
+ const stream = await client.responses.create({ ...params, stream: true }, { signal });
651
+ await accumulateOpenAIResponsesStream4(stream, (event) => {
608
652
  if (event.type === "object-delta" && event.port === "toolCalls") {
609
653
  const validated = filterValidToolCalls(event.objectDelta, input.tools);
610
654
  if (validated.length > 0) {
@@ -720,12 +764,15 @@ async function registerOpenAiWorker() {
720
764
  await registerProviderWorker((ws) => new OpenAiProvider(OPENAI_RUN_FNS, OPENAI_PREVIEW_TASKS).registerOnWorkerServer(ws), "OpenAI");
721
765
  }
722
766
  export {
767
+ resolvePromptCacheKey,
723
768
  registerOpenAiWorker,
724
769
  registerOpenAiInline,
725
770
  loadOpenAISDK,
771
+ getReasoningConfig,
726
772
  getModelName,
727
773
  getClient,
774
+ finalizeResponsesRequest,
728
775
  OPENAI_ALLOWED_HOSTS
729
776
  };
730
777
 
731
- //# debugId=4C2BC64BAC478A2A64756E2164756E21
778
+ //# debugId=49585FBBBA6D7B0964756E2164756E21