Groq: Pull models list from endpoint
| @@ -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"> |
| @@ -1978,6 +1978,24 @@ function saveModelList(data) { | |||
| 1978 | 1978 | ||
| 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 | } |
| 1982 | 2000 | ||
| 1983 | function appendOpenRouterOptions(model_list, groupModels = false, sort = false) { | 2001 | function 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 | } |
| 4651 | 4668 | ||
| 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 | }; |
| 4673 | 4700 | ||
| 4674 | // Return context size if model found, otherwise default to 128k | 4701 | // Return context size if model found, otherwise default to 128k |
| @@ -4762,6 +4789,10 @@ async function onModelChange() { | |||
| 4762 | } | 4789 | } |
| 4763 | 4790 | ||
| 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 | } |
| @@ -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); |