Mistral: Load caption models from endpoint

068ddd7c941e248004558615176b7a7a8069e1ba

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

3 files changed, +30 -12Showing whitespace changes
public/scripts/extensions/caption/index.js+1 -0
@@ -549,6 +549,7 @@ jQuery(async function () {
549549 await processEndpoint('pollinations', '/api/backends/chat-completions/multimodal-models/pollinations');
550550 await processEndpoint('nanogpt', '/api/backends/chat-completions/multimodal-models/nanogpt');
551551 await processEndpoint('electronhub', '/api/backends/chat-completions/multimodal-models/electronhub');
552+ await processEndpoint('mistral', '/api/backends/chat-completions/multimodal-models/mistral');
552553 }
553554
554555 await addSettings();
public/scripts/extensions/caption/settings.html+1 -12
@@ -42,21 +42,10 @@
4242 <div class="flex1 flex-container flexFlowColumn flexNoGap">
4343 <label for="caption_multimodal_model" data-i18n="Model">Model</label>
4444 <select id="caption_multimodal_model" class="flex1 text_pole">
4545 <!-- AI/ML API, OpenRouter, Pollinations, NanoGPT, Mistral are added externally by JavaScript -->
4646 <option data-type="cohere" value="c4ai-aya-vision-8b">c4ai-aya-vision-8b</option>
4747 <option data-type="cohere" value="c4ai-aya-vision-32b">c4ai-aya-vision-32b</option>
4848 <option data-type="cohere" value="command-a-vision-07-2025">command-a-vision-07-2025</option>
49- <option data-type="mistral" value="pixtral-12b-latest">pixtral-12b-latest</option>
50- <option data-type="mistral" value="pixtral-12b-2409">pixtral-12b-2409</option>
51- <option data-type="mistral" value="pixtral-large-latest">pixtral-large-latest</option>
52- <option data-type="mistral" value="pixtral-large-2411">pixtral-large-2411</option>
53- <option data-type="mistral" value="mistral-large-pixtral-2411">mistral-large-pixtral-2411</option>
54- <option data-type="mistral" value="mistral-small-2503">mistral-small-2503</option>
55- <option data-type="mistral" value="mistral-small-2506">mistral-small-2506</option>
56- <option data-type="mistral" value="mistral-small-latest">mistral-small-latest</option>
57- <option data-type="mistral" value="mistral-medium-latest">mistral-medium-latest</option>
58- <option data-type="mistral" value="mistral-medium-2505">mistral-medium-2505</option>
59- <option data-type="mistral" value="mistral-medium-2508">mistral-medium-2508</option>
6049 <option data-type="moonshot" value="moonshot-v1-8k-vision-preview">moonshot-v1-8k-vision-preview</option>
6150 <option data-type="moonshot" value="moonshot-v1-32k-vision-preview">moonshot-v1-32k-vision-preview</option>
6251 <option data-type="moonshot" value="moonshot-v1-128k-vision-preview">moonshot-v1-128k-vision-preview</option>
src/endpoints/backends/chat-completions.js+28 -0
@@ -2210,4 +2210,32 @@ multimodalModels.post('/electronhub', async (_req, res) => {
22102210 }
22112211});
22122212
2213+multimodalModels.post('/mistral', async (req, res) => {
2214+ try {
2215+ const key = readSecret(req.user.directories, SECRET_KEYS.MISTRALAI);
2216+
2217+ if (!key) {
2218+ return res.json([]);
2219+ }
2220+
2221+ const response = await fetch('https://api.mistral.ai/v1/models', {
2222+ headers: {
2223+ 'Authorization': `Bearer ${key}`,
2224+ },
2225+ });
2226+
2227+ if (!response.ok) {
2228+ return res.json([]);
2229+ }
2230+
2231+ /** @type {any} */
2232+ const data = await response.json();
2233+ const multimodalModels = data.data.filter(m => m.capabilities?.vision).map(m => m.id);
2234+ return res.json(multimodalModels);
2235+ } catch (error) {
2236+ console.error(error);
2237+ return res.sendStatus(500);
2238+ }
2239+});
2240+
22132241router.use('/multimodal-models', multimodalModels);