OpenRouter: Add Google image output parsing

5e4bb0415e2898560a904f46cce29c6765fc2f71

Cohee <18619528+Cohee1207@users.noreply.github.com>

3 files changed, +13 -3Ignore whitespace
public/script.js+7 -1
@@ -5237,7 +5237,13 @@ function extractImageFromData(data, { mainApi = null, chatCompletionSource = nul
52375237 return `data:${inlineData.mimeType};base64,${inlineData.data}`;
52385238 }
52395239 } break;
5240-
5240+ case chat_completion_sources.OPENROUTER: {
5241+ const imageUrl = data?.choices[0]?.message?.images?.find(x => x.type === 'image_url')?.image_url?.url;
5242+ if (isDataURL(imageUrl)) {
5243+ return imageUrl;
5244+ }
5245+ // TODO: Handle remote URLs
5246+ }
52415247 }
52425248 } break;
52435249 }
public/scripts/openai.js+5 -1
@@ -2466,6 +2466,10 @@ export function getStreamingReply(data, state, { chatCompletionSource = null, ov
24662466 }
24672467 return data.choices?.[0]?.delta?.content || '';
24682468 } else if (chat_completion_source === chat_completion_sources.OPENROUTER) {
2469+ const imageUrl = data?.choices?.[0]?.delta?.images?.find(x => x.type === 'image_url')?.image_url?.url;
2470+ if (imageUrl) {
2471+ state.image = imageUrl;
2472+ }
24692473 if (show_thoughts) {
24702474 state.reasoning += (data.choices?.filter(x => x?.delta?.reasoning)?.[0]?.delta?.reasoning || '');
24712475 }
@@ -5495,7 +5499,7 @@ export function isImageInliningSupported() {
54955499 case chat_completion_sources.CLAUDE:
54965500 return visionSupportedModels.some(model => oai_settings.claude_model.includes(model));
54975501 case chat_completion_sources.OPENROUTER:
54985502 return (Array.isArray(model_list) && ['text+image->text+image', 'text+image->text'].includes(model_list.find(m => m.id === oai_settings.openrouter_model)?.architecture?.modality === 'text+image->text'));
54995503 case chat_completion_sources.CUSTOM:
55005504 return true;
55015505 case chat_completion_sources.MISTRALAI:
src/endpoints/openrouter.js+1 -1
@@ -47,7 +47,7 @@ router.post('/models/multimodal', async (_req, res) => {
4747 /** @type {any} */
4848 const data = await response.json();
4949 const models = data?.data || [];
5050 const multimodalModels = models.filter(m => m?.architecture?.modality === ['text+image->text+image', 'text+image->text'].includes(m?.architecture?.modality)).map(m => m.id);
5151
5252 return res.json(multimodalModels);
5353 } catch (error) {