Groq: Pull models list from endpoint

86bac00a812fb3e2b822f74dfc39e20ddd61da49

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

3 files changed, +47 -30Ignore whitespace
public/index.html+11 -29
@@ -3468,35 +3468,17 @@
3468 </div>3468 </div>
3469 <h4 data-i18n="Groq Model">Groq Model</h4>3469 <h4 data-i18n="Groq Model">Groq Model</h4>
3470 <select id="model_groq_select">3470 <select id="model_groq_select">
3471 <optgroup label="Alibaba Cloud">3471 <option value="qwen/qwen3-32b">qwen/qwen3-32b</option>
3472 <option value="qwen-2.5-32b">qwen-2.5-32b</option>3472 <option value="deepseek-r1-distill-llama-70b">deepseek-r1-distill-llama-70b</option>
3473 <option value="qwen-2.5-coder-32b">qwen-2.5-coder-32b</option>3473 <option value="gemma2-9b-it">gemma2-9b-it</option>
3474 </optgroup>3474 <option value="meta-llama/llama-4-scout-17b-16e-instruct">meta-llama/llama-4-scout-17b-16e-instruct</option>
3475 <optgroup label="DeepSeek">3475 <option value="meta-llama/llama-4-maverick-17b-128e-instruct">meta-llama/llama-4-maverick-17b-128e-instruct</option>
3476 <option value="deepseek-r1-distill-qwen-32b">deepseek-r1-distill-qwen-32b</option>3476 <option value="llama-3.1-8b-instant">llama-3.1-8b-instant</option>
3477 <option value="deepseek-r1-distill-llama-70b">deepseek-r1-distill-llama-70b</option>3477 <option value="llama-3.3-70b-versatile">llama-3.3-70b-versatile </option>
3478 </optgroup>3478 <option value="llama-guard-3-8b">llama-guard-3-8b</option>
3479 <optgroup label="Google">3479 <option value="llama3-70b-8192">llama3-70b-8192</option>
3480 <option value="gemma2-9b-it">gemma2-9b-it</option>3480 <option value="llama3-8b-8192">llama3-8b-8192</option>
3481 </optgroup>3481 <option value="mistral-saba-24b">mistral-saba-24b</option>
3482 <optgroup label="Meta">
3483 <option value="meta-llama/llama-4-scout-17b-16e-instruct">meta-llama/llama-4-scout-17b-16e-instruct</option>
3484 <option value="meta-llama/llama-4-maverick-17b-128e-instruct">meta-llama/llama-4-maverick-17b-128e-instruct</option>
3485 <option value="llama-3.1-8b-instant">llama-3.1-8b-instant</option>
3486 <option value="llama-3.2-11b-vision-preview">llama-3.2-11b-vision-preview </option>
3487 <option value="llama-3.2-1b-preview">llama-3.2-1b-preview </option>
3488 <option value="llama-3.2-3b-preview">llama-3.2-3b-preview </option>
3489 <option value="llama-3.2-90b-vision-preview">llama-3.2-90b-vision-preview </option>
3490 <option value="llama-3.3-70b-specdec">llama-3.3-70b-specdec</option>
3491 <option value="llama-3.3-70b-versatile">llama-3.3-70b-versatile </option>
3492 <option value="llama-guard-3-8b">llama-guard-3-8b</option>
3493 <option value="llama3-70b-8192">llama3-70b-8192</option>
3494 <option value="llama3-8b-8192">llama3-8b-8192</option>
3495 </optgroup>
3496 <optgroup label="Mistral AI">
3497 <option value="mistral-saba-24b">mistral-saba-24b</option>
3498 <option value="mixtral-8x7b-32768">mixtral-8x7b-32768</option>
3499 </optgroup>
3500 </select>3482 </select>
3501 </div>3483 </div>
3502 <div id="nanogpt_form" data-source="nanogpt">3484 <div id="nanogpt_form" data-source="nanogpt">
public/scripts/openai.js+32 -1
@@ -1978,6 +1978,24 @@ function saveModelList(data) {
19781978
1979 $('#model_google_select').val(oai_settings.google_model).trigger('change');1979 $('#model_google_select').val(oai_settings.google_model).trigger('change');
1980 }1980 }
1981
1982 if (oai_settings.chat_completion_source === chat_completion_sources.GROQ) {
1983 $('#model_groq_select').empty();
1984 model_list.forEach((model) => {
1985 $('#model_groq_select').append(
1986 $('<option>', {
1987 value: model.id,
1988 text: model.id,
1989 }));
1990 });
1991
1992 const selectedModel = model_list.find(model => model.id === oai_settings.groq_model);
1993 if (model_list.length > 0 && (!selectedModel || !oai_settings.groq_model)) {
1994 oai_settings.groq_model = model_list[0].id;
1995 }
1996
1997 $('#model_groq_select').val(oai_settings.groq_model).trigger('change');
1998 }
1981}1999}
19822000
1983function appendOpenRouterOptions(model_list, groupModels = false, sort = false) {2001function appendOpenRouterOptions(model_list, groupModels = false, sort = false) {
@@ -3827,7 +3845,6 @@ async function getStatusOpen() {
3827 chat_completion_sources.AI21,3845 chat_completion_sources.AI21,
3828 chat_completion_sources.VERTEXAI,3846 chat_completion_sources.VERTEXAI,
3829 chat_completion_sources.PERPLEXITY,3847 chat_completion_sources.PERPLEXITY,
3830 chat_completion_sources.GROQ,
3831 ];3848 ];
3832 if (noValidateSources.includes(oai_settings.chat_completion_source)) {3849 if (noValidateSources.includes(oai_settings.chat_completion_source)) {
3833 let status = t`Key saved; press \"Test Message\" to verify.`;3850 let status = t`Key saved; press \"Test Message\" to verify.`;
@@ -4649,6 +4666,13 @@ function getGroqMaxContext(model, isUnlocked) {
4649 return unlocked_max;4666 return unlocked_max;
4650 }4667 }
46514668
4669 if (Array.isArray(model_list) && model_list.length > 0) {
4670 const contextLength = model_list.find((record) => record.id === model)?.context_window;
4671 if (contextLength) {
4672 return contextLength;
4673 }
4674 }
4675
4652 const contextMap = {4676 const contextMap = {
4653 'gemma2-9b-it': max_8k,4677 'gemma2-9b-it': max_8k,
4654 'llama-3.3-70b-versatile': max_128k,4678 'llama-3.3-70b-versatile': max_128k,
@@ -4669,6 +4693,9 @@ function getGroqMaxContext(model, isUnlocked) {
4669 'mistral-saba-24b': max_32k,4693 'mistral-saba-24b': max_32k,
4670 'meta-llama/llama-4-scout-17b-16e-instruct': max_128k,4694 'meta-llama/llama-4-scout-17b-16e-instruct': max_128k,
4671 'meta-llama/llama-4-maverick-17b-128e-instruct': max_128k,4695 'meta-llama/llama-4-maverick-17b-128e-instruct': max_128k,
4696 'compound-beta': max_128k,
4697 'compound-beta-mini': max_128k,
4698 'qwen/qwen3-32b': max_128k,
4672 };4699 };
46734700
4674 // Return context size if model found, otherwise default to 128k4701 // Return context size if model found, otherwise default to 128k
@@ -4762,6 +4789,10 @@ async function onModelChange() {
4762 }4789 }
47634790
4764 if ($(this).is('#model_groq_select')) {4791 if ($(this).is('#model_groq_select')) {
4792 if (!value) {
4793 console.debug('Null Groq model selected. Ignoring.');
4794 return;
4795 }
4765 console.log('Groq model changed to', value);4796 console.log('Groq model changed to', value);
4766 oai_settings.groq_model = value;4797 oai_settings.groq_model = value;
4767 }4798 }
src/endpoints/backends/chat-completions.js+4 -0
@@ -1192,6 +1192,10 @@ router.post('/status', async function (request, statusResponse) {
1192 apiUrl = 'https://text.pollinations.ai';1192 apiUrl = 'https://text.pollinations.ai';
1193 apiKey = 'NONE';1193 apiKey = 'NONE';
1194 headers = {};1194 headers = {};
1195 } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.GROQ) {
1196 apiUrl = API_GROQ;
1197 apiKey = readSecret(request.user.directories, SECRET_KEYS.GROQ);
1198 headers = {};
1195 } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.MAKERSUITE) {1199 } else if (request.body.chat_completion_source === CHAT_COMPLETION_SOURCES.MAKERSUITE) {
1196 apiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.MAKERSUITE);1200 apiKey = request.body.reverse_proxy ? request.body.proxy_password : readSecret(request.user.directories, SECRET_KEYS.MAKERSUITE);
1197 apiUrl = trimTrailingSlash(request.body.reverse_proxy || API_MAKERSUITE);1201 apiUrl = trimTrailingSlash(request.body.reverse_proxy || API_MAKERSUITE);