diff --git a/open-sse/translator/helpers/imageHelper.js b/open-sse/translator/helpers/imageHelper.js index 1df04d8d..f4288dd4 100644 --- a/open-sse/translator/helpers/imageHelper.js +++ b/open-sse/translator/helpers/imageHelper.js @@ -1,3 +1,8 @@ +// Build a base64 data URI from mime + base64 payload +export function encodeDataUri(mimeType, base64) { + return `data:${mimeType};base64,${base64}`; +} + /** * Fetch a remote image URL and return it as a base64 data URI. * Used when upstream providers (Codex, etc.) require inline base64 images diff --git a/open-sse/translator/request/antigravity-to-openai.js b/open-sse/translator/request/antigravity-to-openai.js index 9a3b5d21..8cd239e4 100644 --- a/open-sse/translator/request/antigravity-to-openai.js +++ b/open-sse/translator/request/antigravity-to-openai.js @@ -1,6 +1,7 @@ import { register } from "../index.js"; import { FORMATS } from "../formats.js"; import { adjustMaxTokens } from "../helpers/maxTokensHelper.js"; +import { encodeDataUri } from "../helpers/imageHelper.js"; // Convert Antigravity request to OpenAI format // Antigravity body: { project, model, userAgent, requestType, requestId, request: { contents, systemInstruction, tools, toolConfig, generationConfig, sessionId } } @@ -156,7 +157,7 @@ function convertContent(content) { textParts.push({ type: "image_url", image_url: { - url: `data:${part.inlineData.mimeType};base64,${part.inlineData.data}` + url: encodeDataUri(part.inlineData.mimeType, part.inlineData.data) } }); } diff --git a/open-sse/translator/request/claude-to-openai.js b/open-sse/translator/request/claude-to-openai.js index 0f8e7bb5..97f6db5f 100644 --- a/open-sse/translator/request/claude-to-openai.js +++ b/open-sse/translator/request/claude-to-openai.js @@ -1,6 +1,7 @@ import { register } from "../index.js"; import { FORMATS } from "../formats.js"; import { adjustMaxTokens } from "../helpers/maxTokensHelper.js"; +import { encodeDataUri } from "../helpers/imageHelper.js"; function stripAnthropicBillingHeader(text) { if (typeof text !== "string") return ""; @@ -140,7 +141,7 @@ function convertClaudeMessage(msg) { parts.push({ type: "image_url", image_url: { - url: `data:${block.source.media_type};base64,${block.source.data}` + url: encodeDataUri(block.source.media_type, block.source.data) } }); } diff --git a/open-sse/translator/request/gemini-to-openai.js b/open-sse/translator/request/gemini-to-openai.js index 5b3d0f01..4cff05bd 100644 --- a/open-sse/translator/request/gemini-to-openai.js +++ b/open-sse/translator/request/gemini-to-openai.js @@ -1,6 +1,7 @@ import { register } from "../index.js"; import { FORMATS } from "../formats.js"; import { adjustMaxTokens } from "../helpers/maxTokensHelper.js"; +import { encodeDataUri } from "../helpers/imageHelper.js"; // Convert Gemini request to OpenAI format export function geminiToOpenAIRequest(model, body, stream) { @@ -88,7 +89,7 @@ function convertGeminiContent(content) { parts.push({ type: "image_url", image_url: { - url: `data:${part.inlineData.mimeType};base64,${part.inlineData.data}` + url: encodeDataUri(part.inlineData.mimeType, part.inlineData.data) } }); } diff --git a/open-sse/translator/response/gemini-to-openai.js b/open-sse/translator/response/gemini-to-openai.js index f7161d28..2a5d670c 100644 --- a/open-sse/translator/response/gemini-to-openai.js +++ b/open-sse/translator/response/gemini-to-openai.js @@ -3,6 +3,7 @@ import { FORMATS } from "../formats.js"; import { buildChunk } from "../helpers/chunkBuilder.js"; import { buildUsage } from "../helpers/usageHelper.js"; import { reasoningDelta } from "../helpers/reasoningHelper.js"; +import { encodeDataUri } from "../helpers/imageHelper.js"; // Build chunk meta for current gemini state function chunkMeta(state) { @@ -116,7 +117,7 @@ export function geminiToOpenAIResponse(chunk, state) { { images: [{ type: "image_url", - image_url: { url: `data:${mimeType};base64,${inlineData.data}` } + image_url: { url: encodeDataUri(mimeType, inlineData.data) } }] }, null