From 252bf56a9fc60b703d97267d5b8621e1be1466e8 Mon Sep 17 00:00:00 2001 From: decolua Date: Sat, 13 Jun 2026 21:23:32 +0700 Subject: [PATCH] =?UTF-8?q?refactor(translator):=20P4=20concern=20#2=20enc?= =?UTF-8?q?odeDataUri=20=E2=80=94=20dedupe=20base64=20data-uri=20building?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - imageHelper.encodeDataUri(mime, base64) replaces 5 inline `data:${m};base64,${d}` templates - Applied to gemini/claude/antigravity request + gemini response translators - Golden tests pass, identical output Co-authored-by: Cursor --- open-sse/translator/helpers/imageHelper.js | 5 +++++ open-sse/translator/request/antigravity-to-openai.js | 3 ++- open-sse/translator/request/claude-to-openai.js | 3 ++- open-sse/translator/request/gemini-to-openai.js | 3 ++- open-sse/translator/response/gemini-to-openai.js | 3 ++- 5 files changed, 13 insertions(+), 4 deletions(-) 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