OpenRouter/MistralAI: Improve capability checks for tool calling and image inlining

40f4792b3286117227c09c4f1cc292bfdd189f59

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

2 files changed, +21 -2Ignore whitespace
public/scripts/openai.js+7 -2
@@ -3677,6 +3677,7 @@ async function getStatusOpen() {
3677 if (noValidateSources.includes(oai_settings.chat_completion_source)) {3677 if (noValidateSources.includes(oai_settings.chat_completion_source)) {
3678 let status = t`Key saved; press \"Test Message\" to verify.`;3678 let status = t`Key saved; press \"Test Message\" to verify.`;
3679 setOnlineStatus(status);3679 setOnlineStatus(status);
3680 updateFeatureSupportFlags();
3680 return resultCheckStatus();3681 return resultCheckStatus();
3681 }3682 }
36823683
@@ -3748,6 +3749,7 @@ async function getStatusOpen() {
3748 }3749 }
3749 }3750 }
37503751
3752 updateFeatureSupportFlags();
3751 return resultCheckStatus();3753 return resultCheckStatus();
3752}3754}
37533755
@@ -5427,11 +5429,11 @@ export function isImageInliningSupported() {
5427 case chat_completion_sources.CLAUDE:5429 case chat_completion_sources.CLAUDE:
5428 return visionSupportedModels.some(model => oai_settings.claude_model.includes(model));5430 return visionSupportedModels.some(model => oai_settings.claude_model.includes(model));
5429 case chat_completion_sources.OPENROUTER:5431 case chat_completion_sources.OPENROUTER:
5430 return true;5432 return (Array.isArray(model_list) && model_list.find(m => m.id === oai_settings.openrouter_model)?.architecture?.modality === 'text+image->text');
5431 case chat_completion_sources.CUSTOM:5433 case chat_completion_sources.CUSTOM:
5432 return true;5434 return true;
5433 case chat_completion_sources.MISTRALAI:5435 case chat_completion_sources.MISTRALAI:
5434 return visionSupportedModels.some(model => oai_settings.mistralai_model.includes(model));5436 return (Array.isArray(model_list) && model_list.find(m => m.id === oai_settings.mistralai_model)?.capabilities?.vision);
5435 case chat_completion_sources.COHERE:5437 case chat_completion_sources.COHERE:
5436 return visionSupportedModels.some(model => oai_settings.cohere_model.includes(model));5438 return visionSupportedModels.some(model => oai_settings.cohere_model.includes(model));
5437 case chat_completion_sources.XAI:5439 case chat_completion_sources.XAI:
@@ -6036,6 +6038,7 @@ export function initOpenAI() {
60366038
6037 $('#openai_image_inlining').on('input', function () {6039 $('#openai_image_inlining').on('input', function () {
6038 oai_settings.image_inlining = !!$(this).prop('checked');6040 oai_settings.image_inlining = !!$(this).prop('checked');
6041 updateFeatureSupportFlags();
6039 saveSettingsDebounced();6042 saveSettingsDebounced();
6040 });6043 });
60416044
@@ -6046,6 +6049,7 @@ export function initOpenAI() {
60466049
6047 $('#openai_video_inlining').on('input', function () {6050 $('#openai_video_inlining').on('input', function () {
6048 oai_settings.video_inlining = !!$(this).prop('checked');6051 oai_settings.video_inlining = !!$(this).prop('checked');
6052 updateFeatureSupportFlags();
6049 saveSettingsDebounced();6053 saveSettingsDebounced();
6050 });6054 });
60516055
@@ -6056,6 +6060,7 @@ export function initOpenAI() {
60566060
6057 $('#openai_function_calling').on('input', function () {6061 $('#openai_function_calling').on('input', function () {
6058 oai_settings.function_calling = !!$(this).prop('checked');6062 oai_settings.function_calling = !!$(this).prop('checked');
6063 updateFeatureSupportFlags();
6059 saveSettingsDebounced();6064 saveSettingsDebounced();
6060 });6065 });
60616066
public/scripts/tool-calling.js+14 -0
@@ -612,6 +612,20 @@ export class ToolManager {
612 }612 }
613 }613 }
614614
615 if (oai_settings.chat_completion_source === chat_completion_sources.OPENROUTER && Array.isArray(model_list)) {
616 const currentModel = model_list.find(model => model.id === oai_settings.openrouter_model);
617 if (Array.isArray(currentModel?.supported_parameters)) {
618 return currentModel.supported_parameters.includes('tools');
619 }
620 }
621
622 if (oai_settings.chat_completion_source === chat_completion_sources.MISTRALAI && Array.isArray(model_list)) {
623 const currentModel = model_list.find(model => model.id === oai_settings.mistralai_model);
624 if (currentModel && currentModel.capabilities) {
625 return currentModel.capabilities.function_calling;
626 }
627 }
628
615 const supportedSources = [629 const supportedSources = [
616 chat_completion_sources.OPENAI,630 chat_completion_sources.OPENAI,
617 chat_completion_sources.CUSTOM,631 chat_completion_sources.CUSTOM,