| 492 | 492 | |
| 493 | 493 | export function getNovelGenerationData(finalPrompt, settings, maxLength, isImpersonate, isContinue, _cfgValues, type) { |
| 494 | 494 | console.debug('NovelAI generation data for', type); |
| 495 | + const isKayra = nai_settings.model_novel.includes('kayra'); |
| 496 | + const isErato = nai_settings.model_novel.includes('erato'); |
| 495 | 497 | |
| 496 | 498 | const tokenizerType = getTokenizerTypeForModel(nai_settings.model_novel); |
| 499 | + const stoppingStrings = getStoppingStrings(isImpersonate, isContinue); |
| 500 | + |
| 501 | + // Llama 3 tokenizer, huh? |
| 502 | + if (isErato) { |
| 503 | + const additionalStopStrings = []; |
| 504 | + for (const stoppingString of stoppingStrings) { |
| 505 | + if (stoppingString.startsWith('\n')) { |
| 506 | + additionalStopStrings.push('.' + stoppingString); |
| 507 | + additionalStopStrings.push('!' + stoppingString); |
| 508 | + additionalStopStrings.push('?' + stoppingString); |
| 509 | + additionalStopStrings.push('*' + stoppingString); |
| 510 | + additionalStopStrings.push('"' + stoppingString); |
| 511 | + additionalStopStrings.push('_' + stoppingString); |
| 512 | + additionalStopStrings.push('...' + stoppingString); |
| 513 | + additionalStopStrings.push(')' + stoppingString); |
| 514 | + } |
| 515 | + } |
| 516 | + stoppingStrings.push(...additionalStopStrings); |
| 517 | + } |
| 518 | + |
| 497 | 519 | const stopSequences = (tokenizerType !== tokenizers.NONE) |
| 498 | | - ? getStoppingStrings(isImpersonate, isContinue) |
| 520 | + ? stoppingStrings.map(t => getTextTokens(tokenizerType, t)) |
| 499 | | - .map(t => getTextTokens(tokenizerType, t)) |
| 500 | 521 | : undefined; |
| 501 | 522 | |
| 502 | 523 | const badWordIds = (tokenizerType !== tokenizers.NONE) |