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 () {
549 await processEndpoint('pollinations', '/api/backends/chat-completions/multimodal-models/pollinations');549 await processEndpoint('pollinations', '/api/backends/chat-completions/multimodal-models/pollinations');
550 await processEndpoint('nanogpt', '/api/backends/chat-completions/multimodal-models/nanogpt');550 await processEndpoint('nanogpt', '/api/backends/chat-completions/multimodal-models/nanogpt');
551 await processEndpoint('electronhub', '/api/backends/chat-completions/multimodal-models/electronhub');551 await processEndpoint('electronhub', '/api/backends/chat-completions/multimodal-models/electronhub');
552 await processEndpoint('mistral', '/api/backends/chat-completions/multimodal-models/mistral');
552 }553 }
553554
554 await addSettings();555 await addSettings();
public/scripts/extensions/caption/settings.html+1 -12
@@ -42,21 +42,10 @@
42 <div class="flex1 flex-container flexFlowColumn flexNoGap">42 <div class="flex1 flex-container flexFlowColumn flexNoGap">
43 <label for="caption_multimodal_model" data-i18n="Model">Model</label>43 <label for="caption_multimodal_model" data-i18n="Model">Model</label>
44 <select id="caption_multimodal_model" class="flex1 text_pole">44 <select id="caption_multimodal_model" class="flex1 text_pole">
45 <!-- AI/ML API, OpenRouter, Pollinations, NanoGPT are added externally by JavaScript -->45 <!-- AI/ML API, OpenRouter, Pollinations, NanoGPT, Mistral are added externally by JavaScript -->
46 <option data-type="cohere" value="c4ai-aya-vision-8b">c4ai-aya-vision-8b</option>46 <option data-type="cohere" value="c4ai-aya-vision-8b">c4ai-aya-vision-8b</option>
47 <option data-type="cohere" value="c4ai-aya-vision-32b">c4ai-aya-vision-32b</option>47 <option data-type="cohere" value="c4ai-aya-vision-32b">c4ai-aya-vision-32b</option>
48 <option data-type="cohere" value="command-a-vision-07-2025">command-a-vision-07-2025</option>48 <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>
60 <option data-type="moonshot" value="moonshot-v1-8k-vision-preview">moonshot-v1-8k-vision-preview</option>49 <option data-type="moonshot" value="moonshot-v1-8k-vision-preview">moonshot-v1-8k-vision-preview</option>
61 <option data-type="moonshot" value="moonshot-v1-32k-vision-preview">moonshot-v1-32k-vision-preview</option>50 <option data-type="moonshot" value="moonshot-v1-32k-vision-preview">moonshot-v1-32k-vision-preview</option>
62 <option data-type="moonshot" value="moonshot-v1-128k-vision-preview">moonshot-v1-128k-vision-preview</option>51 <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) => {
2210 }2210 }
2211});2211});
22122212
2213multimodalModels.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
2213router.use('/multimodal-models', multimodalModels);2241router.use('/multimodal-models', multimodalModels);