diff --git a/public/scripts/logprobs.js b/public/scripts/logprobs.js index 2f0636a0e..255b10964 100644 --- a/public/scripts/logprobs.js +++ b/public/scripts/logprobs.js @@ -12,6 +12,7 @@ import { import { debounce, delay, getStringHash } from './utils.js'; import { decodeTextTokens, getTokenizerBestMatch } from './tokenizers.js'; import { power_user } from './power-user.js'; +import { textgenerationwebui_settings, textgen_types } from './textgen-settings.js'; const TINTS = 4; const MAX_MESSAGE_LOGPROBS = 100; @@ -139,9 +140,14 @@ function renderTopLogprobs() { const candidates = topLogprobs .sort(([, logA], [, logB]) => logB - logA) .map(([text, log]) => { - const probability = Math.exp(log); - sum += probability; - return [text, probability, log]; + if (textgenerationwebui_settings.type !== textgen_types.LLAMACPP) { + const probability = Math.exp(log); + sum += probability; + return [text, probability, log]; + } + else { + return [text, log, null]; + } }); candidates.push(['', 1 - sum, 0]); @@ -157,7 +163,9 @@ function renderTopLogprobs() { const tokenText = $('').text(`${toVisibleWhitespace(token)}`); const percentText = $('').text(`${(probability * 100).toFixed(2)}%`); container.append(tokenText, percentText); - container.attr('title', `logarithm: ${log}`); + if (log) { + container.attr('title', `logarithm: ${log}`); + } addKeyboardProps(container); if (token !== '') { container.click(() => onAlternativeClicked(state.selectedTokenLogprobs, token)); diff --git a/public/scripts/textgen-settings.js b/public/scripts/textgen-settings.js index b1a292e68..76262ed4e 100644 --- a/public/scripts/textgen-settings.js +++ b/public/scripts/textgen-settings.js @@ -694,7 +694,7 @@ async function generateTextGenWithStreaming(generate_data, signal) { } else { const newText = data?.choices?.[0]?.text || data?.content || ''; text += newText; - logprobs = parseTextgenLogprobs(newText, data.choices?.[0]?.logprobs); + logprobs = parseTextgenLogprobs(newText, data.choices?.[0]?.logprobs || data?.completion_probabilities); } yield { text, swipes, logprobs }; @@ -727,6 +727,14 @@ function parseTextgenLogprobs(token, logprobs) { const candidates = Object.entries(topLogprobs[0]); return { token, topLogprobs: candidates }; } + case LLAMACPP: { + /** @type {Record[]} */ + if (!logprobs?.length) { + return null; + } + const candidates = logprobs[0].probs.map(x => [ x.tok_str, x.prob ]); + return { token, topLogprobs: candidates }; + } default: return null; } @@ -867,6 +875,7 @@ export function getTextGenGenerationData(finalPrompt, maxTokens, isImpersonate, 'n_predict': maxTokens, 'mirostat': settings.mirostat_mode, 'ignore_eos': settings.ban_eos_token, + 'n_probs': power_user.request_token_probabilities ? 10 : undefined, }; const aphroditeParams = { 'n': canMultiSwipe ? settings.n : 1,