Moonshot: Pull vision flag from model data Fixes #5068

0e5b4de10c6e8d123a8e0d22a8aef7992fed151b

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

4 files changed, +40 -6Ignore whitespace
public/scripts/extensions/caption/index.js+1 -0
@@ -623,6 +623,7 @@ jQuery(async function () {
623 await processEndpoint('electronhub', '/api/backends/chat-completions/multimodal-models/electronhub');623 await processEndpoint('electronhub', '/api/backends/chat-completions/multimodal-models/electronhub');
624 await processEndpoint('mistral', '/api/backends/chat-completions/multimodal-models/mistral');624 await processEndpoint('mistral', '/api/backends/chat-completions/multimodal-models/mistral');
625 await processEndpoint('xai', '/api/backends/chat-completions/multimodal-models/xai');625 await processEndpoint('xai', '/api/backends/chat-completions/multimodal-models/xai');
626 await processEndpoint('moonshot', '/api/backends/chat-completions/multimodal-models/moonshot');
626 }627 }
627628
628 await addSettings();629 await addSettings();
public/scripts/extensions/caption/settings.html+1 -4
@@ -49,13 +49,10 @@
49 </div>49 </div>
50 </label>50 </label>
51 <select id="caption_multimodal_model" class="flex1 text_pole">51 <select id="caption_multimodal_model" class="flex1 text_pole">
52 <!-- AI/ML API, OpenRouter, Pollinations, NanoGPT, Mistral, xAI are added externally by JavaScript -->52 <!-- AI/ML API, OpenRouter, Pollinations, NanoGPT, Mistral, xAI, Moonshot are added externally by JavaScript -->
53 <option data-type="cohere" value="c4ai-aya-vision-8b">c4ai-aya-vision-8b</option>53 <option data-type="cohere" value="c4ai-aya-vision-8b">c4ai-aya-vision-8b</option>
54 <option data-type="cohere" value="c4ai-aya-vision-32b">c4ai-aya-vision-32b</option>54 <option data-type="cohere" value="c4ai-aya-vision-32b">c4ai-aya-vision-32b</option>
55 <option data-type="cohere" value="command-a-vision-07-2025">command-a-vision-07-2025</option>55 <option data-type="cohere" value="command-a-vision-07-2025">command-a-vision-07-2025</option>
56 <option data-type="moonshot" value="moonshot-v1-8k-vision-preview">moonshot-v1-8k-vision-preview</option>
57 <option data-type="moonshot" value="moonshot-v1-32k-vision-preview">moonshot-v1-32k-vision-preview</option>
58 <option data-type="moonshot" value="moonshot-v1-128k-vision-preview">moonshot-v1-128k-vision-preview</option>
59 <option data-type="openai" value="gpt-5.2">gpt-5.2</option>56 <option data-type="openai" value="gpt-5.2">gpt-5.2</option>
60 <option data-type="openai" value="gpt-5.2-2025-12-11">gpt-5.2-2025-12-11</option>57 <option data-type="openai" value="gpt-5.2-2025-12-11">gpt-5.2-2025-12-11</option>
61 <option data-type="openai" value="gpt-5.2-chat-latest">gpt-5.2-chat-latest</option>58 <option data-type="openai" value="gpt-5.2-chat-latest">gpt-5.2-chat-latest</option>
public/scripts/openai.js+9 -2
@@ -4909,8 +4909,13 @@ function getMoonshotMaxContext(model, isUnlocked) {
4909 'moonshot-v1-32k-vision-preview': max_32k,4909 'moonshot-v1-32k-vision-preview': max_32k,
4910 'moonshot-v1-128k-vision-preview': max_128k,4910 'moonshot-v1-128k-vision-preview': max_128k,
4911 'kimi-k2-0711-preview': max_32k,4911 'kimi-k2-0711-preview': max_32k,
4912 'kimi-latest': max_32k,4912 'kimi-latest': max_256k,
4913 'kimi-thinking-preview': max_32k,4913 'kimi-thinking-preview': max_32k,
4914 'kimi-k2.5': max_256k,
4915 'kimi-k2-0905-preview': max_256k,
4916 'kimi-k2-turbo-preview': max_256k,
4917 'kimi-k2-thinking': max_256k,
4918 'kimi-k2-thinking-turbo': max_256k,
4914 };4919 };
49154920
4916 // Return context size if model found, otherwise default to 32k4921 // Return context size if model found, otherwise default to 32k
@@ -5837,6 +5842,8 @@ export function isImageInliningSupported() {
5837 'moonshot-v1-8k-vision-preview',5842 'moonshot-v1-8k-vision-preview',
5838 'moonshot-v1-32k-vision-preview',5843 'moonshot-v1-32k-vision-preview',
5839 'moonshot-v1-128k-vision-preview',5844 'moonshot-v1-128k-vision-preview',
5845 'kimi-k2.5',
5846 'kimi-latest',
5840 // Z.AI (GLM)5847 // Z.AI (GLM)
5841 'glm-4.5v',5848 'glm-4.5v',
5842 'glm-4.6v',5849 'glm-4.6v',
@@ -5888,7 +5895,7 @@ export function isImageInliningSupported() {
5888 case chat_completion_sources.COMETAPI:5895 case chat_completion_sources.COMETAPI:
5889 return true;5896 return true;
5890 case chat_completion_sources.MOONSHOT:5897 case chat_completion_sources.MOONSHOT:
5891 return visionSupportedModels.some(model => oai_settings.moonshot_model.includes(model));5898 return (Array.isArray(model_list) && model_list.find(m => m.id === oai_settings.moonshot_model)?.supports_image_in);
5892 case chat_completion_sources.NANOGPT:5899 case chat_completion_sources.NANOGPT:
5893 return (Array.isArray(model_list) && model_list.find(m => m.id === oai_settings.nanogpt_model)?.capabilities?.vision);5900 return (Array.isArray(model_list) && model_list.find(m => m.id === oai_settings.nanogpt_model)?.capabilities?.vision);
5894 case chat_completion_sources.ZAI:5901 case chat_completion_sources.ZAI:
src/endpoints/backends/chat-completions.js+29 -0
@@ -2615,6 +2615,35 @@ multimodalModels.post('/xai', async (req, res) => {
2615 }2615 }
2616});2616});
26172617
2618multimodalModels.post('/moonshot', async (req, res) => {
2619 try {
2620 const key = readSecret(req.user.directories, SECRET_KEYS.MOONSHOT);
2621
2622 if (!key) {
2623 return res.json([]);
2624 }
2625
2626 const response = await fetch('https://api.moonshot.ai/v1/models', {
2627 headers: {
2628 'Authorization': `Bearer ${key}`,
2629 },
2630 });
2631
2632 if (!response.ok) {
2633 return res.json([]);
2634 }
2635
2636 /** @type {any} */
2637 const data = await response.json();
2638
2639 const multimodalModels = data.data.filter(m => m.supports_image_in).map(m => m.id);
2640 return res.json(multimodalModels);
2641 } catch (error) {
2642 console.error(error);
2643 return res.sendStatus(500);
2644 }
2645});
2646
2618router.use('/multimodal-models', multimodalModels);2647router.use('/multimodal-models', multimodalModels);
26192648
2620router.post('/process', async function (request, response) {2649router.post('/process', async function (request, response) {