Skip to content

Commit 162d49a

Browse files
committed
fix: improve image URL parsing robustness across providers
1 parent d9b426d commit 162d49a

File tree

6 files changed

+45
-8
lines changed

6 files changed

+45
-8
lines changed

core/llm/llms/Anthropic.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,14 @@ class Anthropic extends BaseLLM {
107107
source: {
108108
type: "base64",
109109
media_type: getAnthropicMediaTypeFromDataUrl(part.imageUrl.url),
110-
data: part.imageUrl.url.split(",")[1],
110+
data: (() => {
111+
const urlParts = part.imageUrl.url.split(",");
112+
if(urlParts.length < 2) {
113+
throw new Error("Invalid data URL format: missing comma separator");
114+
}
115+
const [...base64Parts] = urlParts;
116+
return base64Parts.join(",");
117+
})(),
111118
},
112119
};
113120
});

core/llm/llms/Bedrock.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,12 @@ class Bedrock extends BaseLLM {
546546
blocks.push({ text: part.text });
547547
} else if (part.type === "imageUrl" && part.imageUrl) {
548548
try {
549-
const [mimeType, base64Data] = part.imageUrl.url.split(",");
549+
const urlParts = part.imageUrl.url.split(",");
550+
if(urlParts.length < 2) {
551+
throw new Error("Invalid data URL format: missing comma separator");
552+
}
553+
const [mimeType, ...base64Parts] = urlParts;
554+
const base64Data = base64Parts.join(",");
550555
const format = mimeType.split("/")[1]?.split(";")[0] || "jpeg";
551556
if (
552557
format === ImageFormat.JPEG ||

core/llm/llms/Gemini.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,14 @@ class Gemini extends BaseLLM {
191191
: {
192192
inlineData: {
193193
mimeType: "image/jpeg",
194-
data: part.imageUrl?.url.split(",")[1],
194+
data: (() => {
195+
const urlParts = part.imageUrl.url.split(",");
196+
if (urlParts.length < 2) {
197+
throw new Error("Invalid data URL format: missing comma separator");
198+
}
199+
const [, ...base64Parts] = urlParts;
200+
return base64Parts.join(",");
201+
})(),
195202
},
196203
};
197204
}

core/llm/llms/Ollama.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,15 @@ class Ollama extends BaseLLM implements ModelInstaller {
303303
const images: string[] = [];
304304
message.content.forEach((part) => {
305305
if (part.type === "imageUrl" && part.imageUrl) {
306-
const image = part.imageUrl?.url.split(",").at(-1);
306+
const image = (() => {
307+
if (!part.imageUrl?.url) return undefined;
308+
const urlParts = part.imageUrl.url.split(",");
309+
if (urlParts.length < 2) {
310+
throw new Error("Invalid data URL format: missing comma separator");
311+
}
312+
const [, ...base64Parts] = urlParts;
313+
return base64Parts.join(",");
314+
})();
307315
if (image) {
308316
images.push(image);
309317
}

packages/openai-adapters/src/apis/Anthropic.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,14 @@ export class AnthropicApi implements BaseLlmApi {
199199
source: {
200200
type: "base64",
201201
media_type: getAnthropicMediaTypeFromDataUrl(dataUrl),
202-
data: dataUrl.split(",")[1],
202+
data: (() => {
203+
const urlParts = dataUrl.split(",");
204+
if (urlParts.length < 2) {
205+
throw new Error("Invalid data URL format: missing comma separator");
206+
}
207+
const [, ...base64Parts] = urlParts;
208+
return base64Parts.join(",");
209+
})(),
203210
},
204211
});
205212
}

packages/openai-adapters/src/apis/Bedrock.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,12 @@ export class BedrockApi implements BaseLlmApi {
121121
case "image_url":
122122
default:
123123
try {
124-
const [mimeType, base64Data] = (
125-
part as ChatCompletionContentPartImage
126-
).image_url.url.split(",");
124+
const urlParts = (part as ChatCompletionContentPartImage).image_url.url.split(",");
125+
if(urlParts.length < 2) {
126+
throw new Error("Invalid data URL format: missing comma separator");
127+
}
128+
const [mimeType, ...base64Parts] = urlParts;
129+
const base64Data = base64Parts.join(",");
127130
const format = mimeType.split("/")[1]?.split(";")[0] || "jpeg";
128131
if (
129132
format === ImageFormat.JPEG ||

0 commit comments

Comments
 (0)