| import type { TokenWithOffset } from '../api/generatedSchemas'; |
| import type { FrontendAnalyzeResult, FrontendToken } from '../api/GLTR_API'; |
| import { getDigitsMergeEnabled } from '../utils/digitsMergeManager'; |
| import { cloneFrontendToken, mergeTokensForRendering } from '../utils/tokenUtils'; |
| import { |
| validateTokenConsistency, |
| validateTokenProbabilities, |
| validateTokenPredictions |
| } from '../utils/dataValidation'; |
|
|
| |
| export const CHAT_DEFAULT_COMPLETION_MODEL = 'instruct'; |
|
|
| function normalizeServerTokens(raw: TokenWithOffset[]): FrontendToken[] { |
| return raw.map((t) => ({ |
| offset: t.offset, |
| raw: t.raw, |
| real_topk: t.real_topk ?? undefined, |
| pred_topk: Array.isArray(t.pred_topk) ? t.pred_topk : [] |
| })) as FrontendToken[]; |
| } |
|
|
| |
| |
| |
| |
| function buildFromServerBpeStrings( |
| completionText: string, |
| modelName: string | null | undefined, |
| serverBpe: TokenWithOffset[] |
| ): FrontendAnalyzeResult { |
| const safeText = completionText; |
|
|
| const tokensRaw = normalizeServerTokens(serverBpe); |
| const predErr = validateTokenPredictions(tokensRaw); |
| if (predErr) throw new Error(predErr); |
| const probErr = validateTokenProbabilities(tokensRaw); |
| if (probErr) throw new Error(probErr); |
| const consErr = validateTokenConsistency(tokensRaw, safeText, { allowOverlap: true }); |
| if (consErr) throw new Error(consErr); |
|
|
| const originalTokens = tokensRaw.map((t) => cloneFrontendToken(t)); |
| const bpeBpeMergedTokens = mergeTokensForRendering(originalTokens, safeText, { |
| digitMerge: getDigitsMergeEnabled(), |
| }); |
| const mergedErr = validateTokenConsistency(bpeBpeMergedTokens, safeText); |
| if (mergedErr) throw new Error(mergedErr); |
|
|
| return { |
| model: modelName ?? null, |
| error: null, |
| originalTokens, |
| bpeBpeMergedTokens, |
| bpe_strings: bpeBpeMergedTokens, |
| originalText: safeText |
| }; |
| } |
|
|
| |
| |
| |
| |
| |
| export function buildCompletionDisplayResult( |
| completionText: string, |
| modelName: string | null | undefined, |
| serverBpeStrings?: TokenWithOffset[] | null |
| ): FrontendAnalyzeResult { |
| const safeText = completionText; |
| const end = Array.from(safeText).length; |
|
|
| if (end === 0) { |
| return { |
| model: modelName ?? null, |
| bpe_strings: [], |
| originalTokens: [], |
| bpeBpeMergedTokens: [], |
| error: null, |
| originalText: '' |
| }; |
| } |
|
|
| if (!serverBpeStrings || serverBpeStrings.length === 0) { |
| throw new Error('Response missing info_radar.bpe_strings'); |
| } |
|
|
| return buildFromServerBpeStrings(safeText, modelName, serverBpeStrings); |
| } |
|
|