release: v0.50.151 — credential_pool provider detection + Ollama Cloud support (PR #820 by @starship-s)
Surfaces providers added via credential_pool in the model dropdown. Ambient gh-cli tokens suppressed. _apply_provider_prefix helper extracted. Ollama Cloud display name + dynamic model list. looksLikeBareOllamaId heuristic tightened. Test isolation fixed. PR #820 by @starship-s.
This commit is contained in:
@@ -847,6 +847,7 @@ function applyBotName(){
|
||||
$('modelSelect').value=savedModel;
|
||||
// If the value didn't take (model not in list), clear the bad pref
|
||||
if($('modelSelect').value!==savedModel) localStorage.removeItem('hermes-webui-model');
|
||||
else if(typeof syncModelChip==='function') syncModelChip();
|
||||
}
|
||||
// Pre-load workspace list so sidebar name is correct from first render
|
||||
await loadWorkspaceList();
|
||||
|
||||
33
static/ui.js
33
static/ui.js
@@ -341,7 +341,7 @@ async function selectModelFromDropdown(value){
|
||||
if(!Array.from(sel.options).some(o=>o.value===value)){
|
||||
const opt=document.createElement('option');
|
||||
opt.value=value;
|
||||
opt.textContent=value.split('/').pop()||value;
|
||||
opt.textContent=getModelLabel(value);
|
||||
opt.dataset.custom='1';
|
||||
// Remove any previous custom option before adding new one
|
||||
sel.querySelectorAll('option[data-custom]').forEach(o=>o.remove());
|
||||
@@ -469,6 +469,23 @@ function scrollToBottom(){
|
||||
if(btn) btn.style.display='none';
|
||||
}
|
||||
|
||||
function _fmtOllamaLabel(mid){
|
||||
const [namePart, ...variantParts] = mid.split(':');
|
||||
const variant = variantParts.join(':');
|
||||
const _fmt = (s) => {
|
||||
const tokens = s.replace(/[-_]/g, ' ').split(' ');
|
||||
return tokens.map(t => {
|
||||
const alphaOnly = t.replace(/\./g, '');
|
||||
if (t.length <= 3 && /^[a-zA-Z.]+$/.test(t)) return t.toUpperCase();
|
||||
if (/^\d/.test(alphaOnly)) return t.toUpperCase();
|
||||
return t.charAt(0).toUpperCase() + t.slice(1);
|
||||
}).join(' ');
|
||||
};
|
||||
let label = _fmt(namePart);
|
||||
if (variant) label += ' (' + _fmt(variant) + ')';
|
||||
return label;
|
||||
}
|
||||
|
||||
function getModelLabel(modelId){
|
||||
if(!modelId) return 'Unknown';
|
||||
// Check dynamic labels first, then fall back to splitting the ID
|
||||
@@ -476,7 +493,19 @@ function getModelLabel(modelId){
|
||||
// Static fallback for common models
|
||||
const STATIC_LABELS={'openai/gpt-5.4-mini':'GPT-5.4 Mini','openai/gpt-4o':'GPT-4o','openai/o3':'o3','openai/o4-mini':'o4-mini','anthropic/claude-sonnet-4.6':'Sonnet 4.6','anthropic/claude-sonnet-4-5':'Sonnet 4.5','anthropic/claude-haiku-3-5':'Haiku 3.5','google/gemini-3.1-pro-preview':'Gemini 3.1 Pro','google/gemini-3-flash-preview':'Gemini 3 Flash','google/gemini-3.1-flash-lite-preview':'Gemini 3.1 Flash Lite','google/gemini-2.5-pro':'Gemini 2.5 Pro','google/gemini-2.5-flash':'Gemini 2.5 Flash','deepseek/deepseek-chat-v3-0324':'DeepSeek V3','meta-llama/llama-4-scout':'Llama 4 Scout'};
|
||||
if(STATIC_LABELS[modelId]) return STATIC_LABELS[modelId];
|
||||
return modelId.split('/').pop()||'Unknown';
|
||||
// Safe Ollama-tag fallback formatter before generic split('/').pop()
|
||||
let _last = modelId.split('/').pop() || modelId;
|
||||
// Strip @provider: prefix if present (e.g. @ollama-cloud:kimi-k2.6)
|
||||
if (_last.startsWith('@') && _last.includes(':')) _last = _last.split(':').slice(1).join(':');
|
||||
const looksLikeOllamaTag = /^[a-z0-9][\w.-]*:[\w.-]+$/i.test(_last);
|
||||
// Narrow: only apply Ollama formatter to IDs with explicit @ollama prefix or colon-tag format.
|
||||
// Avoids reformatting bare provider model IDs like claude-sonnet-4-6 or gpt-4o.
|
||||
const looksLikeBareOllamaId = modelId.startsWith('@ollama') || looksLikeOllamaTag;
|
||||
const ollamaLabel = _fmtOllamaLabel(_last);
|
||||
if ((modelId.startsWith('ollama/') || modelId.startsWith('@ollama') || looksLikeOllamaTag || looksLikeBareOllamaId) && ollamaLabel !== _last) {
|
||||
return ollamaLabel;
|
||||
}
|
||||
return _last || 'Unknown';
|
||||
}
|
||||
|
||||
function _stripXmlToolCallsDisplay(s){
|
||||
|
||||
Reference in New Issue
Block a user