From 1013cb3a5d7bbf05937662aa595057cb38c068de Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 6 Apr 2026 19:43:07 +0100 Subject: [PATCH] refactor: dedupe openai data url helper --- extensions/openai/image-generation-provider.ts | 10 +++++----- extensions/openai/shared.ts | 4 ++++ extensions/openai/video-generation-provider.ts | 7 ++----- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/extensions/openai/image-generation-provider.ts b/extensions/openai/image-generation-provider.ts index 943b8fd9988..a40ba2c68ee 100644 --- a/extensions/openai/image-generation-provider.ts +++ b/extensions/openai/image-generation-provider.ts @@ -7,6 +7,7 @@ import { resolveProviderHttpRequestConfig, } from "openclaw/plugin-sdk/provider-http"; import { OPENAI_DEFAULT_IMAGE_MODEL as DEFAULT_OPENAI_IMAGE_MODEL } from "./default-models.js"; +import { toOpenAIDataUrl } from "./shared.js"; const DEFAULT_OPENAI_IMAGE_BASE_URL = "https://api.openai.com/v1"; const DEFAULT_OUTPUT_MIME = "image/png"; @@ -26,10 +27,6 @@ function resolveOpenAIBaseUrl(cfg: Parameters[0 return direct || DEFAULT_OPENAI_IMAGE_BASE_URL; } -function toDataUrl(buffer: Buffer, mimeType: string): string { - return `data:${mimeType};base64,${buffer.toString("base64")}`; -} - export function buildOpenAIImageGenerationProvider(): ImageGenerationProvider { return { id: "openai", @@ -100,7 +97,10 @@ export function buildOpenAIImageGenerationProvider(): ImageGenerationProvider { n: count, size, images: inputImages.map((image) => ({ - image_url: toDataUrl(image.buffer, image.mimeType?.trim() || DEFAULT_OUTPUT_MIME), + image_url: toOpenAIDataUrl( + image.buffer, + image.mimeType?.trim() || DEFAULT_OUTPUT_MIME, + ), })), }, timeoutMs: req.timeoutMs, diff --git a/extensions/openai/shared.ts b/extensions/openai/shared.ts index 839746e61a5..ae5e80bdeb8 100644 --- a/extensions/openai/shared.ts +++ b/extensions/openai/shared.ts @@ -6,6 +6,10 @@ import { export const OPENAI_API_BASE_URL = "https://api.openai.com/v1"; +export function toOpenAIDataUrl(buffer: Buffer, mimeType: string): string { + return `data:${mimeType};base64,${buffer.toString("base64")}`; +} + export function isOpenAIApiBaseUrl(baseUrl?: string): boolean { const trimmed = baseUrl?.trim(); if (!trimmed) { diff --git a/extensions/openai/video-generation-provider.ts b/extensions/openai/video-generation-provider.ts index acf9d1837bd..790aa116d95 100644 --- a/extensions/openai/video-generation-provider.ts +++ b/extensions/openai/video-generation-provider.ts @@ -11,6 +11,7 @@ import type { VideoGenerationProvider, VideoGenerationRequest, } from "openclaw/plugin-sdk/video-generation"; +import { toOpenAIDataUrl } from "./shared.js"; const DEFAULT_OPENAI_VIDEO_BASE_URL = "https://api.openai.com/v1"; const DEFAULT_OPENAI_VIDEO_MODEL = "sora-2"; @@ -46,10 +47,6 @@ function toBlobBytes(buffer: Buffer): ArrayBuffer { return arrayBuffer; } -function toDataUrl(buffer: Buffer, mimeType: string): string { - return `data:${mimeType};base64,${buffer.toString("base64")}`; -} - function resolveDurationSeconds(durationSeconds: number | undefined): "4" | "8" | "12" | undefined { if (typeof durationSeconds !== "number" || !Number.isFinite(durationSeconds)) { return undefined; @@ -265,7 +262,7 @@ export function buildOpenAIVideoGenerationProvider(): VideoGenerationProvider { ...(seconds ? { seconds } : {}), ...(size ? { size } : {}), input_reference: { - image_url: toDataUrl( + image_url: toOpenAIDataUrl( inputImage.buffer, inputImage.mimeType?.trim() || "image/png", ),