mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
Refactor probability checking conditions
- This changes the flow and checking of the conditions on probability roles. Bit "bigger" refactoring
This commit is contained in:
@@ -3764,32 +3764,50 @@ async function checkWorldInfo(chat, maxContext, isDryRun) {
|
|||||||
.sort((a, b) => sortedEntries.indexOf(a) - sortedEntries.indexOf(b));
|
.sort((a, b) => sortedEntries.indexOf(a) - sortedEntries.indexOf(b));
|
||||||
let newContent = '';
|
let newContent = '';
|
||||||
const textToScanTokens = await getTokenCountAsync(allActivatedText);
|
const textToScanTokens = await getTokenCountAsync(allActivatedText);
|
||||||
const probabilityChecksBefore = failedProbabilityChecks.size;
|
|
||||||
|
|
||||||
filterByInclusionGroups(newEntries, allActivatedEntries, buffer, scanState);
|
filterByInclusionGroups(newEntries, allActivatedEntries, buffer, scanState);
|
||||||
|
|
||||||
console.debug('[WI] --- PROBABILITY CHECKS ---');
|
console.debug('[WI] --- PROBABILITY CHECKS ---');
|
||||||
for (const entry of newEntries) {
|
for (const entry of newEntries) {
|
||||||
const rollValue = Math.random() * 100;
|
function verifyProbability() {
|
||||||
|
// If we don't need to roll, it's always true
|
||||||
|
if (!entry.useProbability || entry.probability === 100) {
|
||||||
|
console.debug(`WI entry ${entry.uid} does not use probability`);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (entry.useProbability && rollValue > entry.probability) {
|
|
||||||
const isSticky = timedEffects.isEffectActive('sticky', entry);
|
const isSticky = timedEffects.isEffectActive('sticky', entry);
|
||||||
if (!isSticky) {
|
if (isSticky) {
|
||||||
console.debug(`WI entry ${entry.uid} ${entry.key} failed probability check, skipping`);
|
console.debug(`WI entry ${entry.uid} is sticky, does not need to re-roll probability`);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rollValue = Math.random() * 100;
|
||||||
|
if (rollValue <= entry.probability) {
|
||||||
|
console.debug(`WI entry ${entry.uid} passed probability check of ${entry.probability}%`);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
failedProbabilityChecks.add(entry);
|
failedProbabilityChecks.add(entry);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const success = verifyProbability();
|
||||||
|
if (!success) {
|
||||||
|
console.debug(`WI entry ${entry.uid} failed probability check, removing from activated entries`, entry);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else { console.debug(`uid:${entry.uid} passed probability check, inserting to prompt`); }
|
|
||||||
|
|
||||||
// Substitute macros inline, for both this checking and also future processing
|
// Substitute macros inline, for both this checking and also future processing
|
||||||
entry.content = substituteParams(entry.content);
|
entry.content = substituteParams(entry.content);
|
||||||
newContent += `${entry.content}\n`;
|
newContent += `${entry.content}\n`;
|
||||||
|
|
||||||
if ((textToScanTokens + (await getTokenCountAsync(newContent))) >= budget) {
|
if ((textToScanTokens + (await getTokenCountAsync(newContent))) >= budget) {
|
||||||
console.debug('WI budget reached, stopping');
|
|
||||||
if (world_info_overflow_alert) {
|
if (world_info_overflow_alert) {
|
||||||
console.log('Alerting');
|
console.warn(`[WI] budget of ${budget} reached, stopping after ${allActivatedEntries.size} entries`);
|
||||||
toastr.warning(`World info budget reached after ${allActivatedEntries.size} entries.`, 'World Info');
|
toastr.warning(`World info budget reached after ${allActivatedEntries.size} entries.`, 'World Info');
|
||||||
|
} else {
|
||||||
|
console.debug(`[WI] budget of ${budget} reached, stopping after ${allActivatedEntries.size} entries`);
|
||||||
}
|
}
|
||||||
scanState = scan_state.NONE;
|
scanState = scan_state.NONE;
|
||||||
token_budget_overflowed = true;
|
token_budget_overflowed = true;
|
||||||
@@ -3797,28 +3815,33 @@ async function checkWorldInfo(chat, maxContext, isDryRun) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
allActivatedEntries.add(entry);
|
allActivatedEntries.add(entry);
|
||||||
console.debug('WI entry activated:', entry);
|
console.debug(`WI entry ${entry.uid} activation successful, adding to prompt`, entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newEntries.length && (failedProbabilityChecks.size - probabilityChecksBefore) === activatedNow.size) {
|
const successfulNewEntries = newEntries.filter(x => !failedProbabilityChecks.has(x));
|
||||||
console.debug('[WI] Probability checks failed for all activated entries, stopping');
|
|
||||||
scanState = scan_state.NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (newEntries.length === 0) {
|
if (!newEntries.length) {
|
||||||
console.debug('[WI] No new entries activated, stopping');
|
console.debug('[WI] No new entries activated, stopping');
|
||||||
scanState = scan_state.NONE;
|
scanState = scan_state.NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (newEntries.length && !successfulNewEntries.length) {
|
||||||
|
console.debug('[WI] Probability checks failed for all activated entries, stopping');
|
||||||
|
scanState = scan_state.NONE;
|
||||||
|
}
|
||||||
|
|
||||||
if (scanState) {
|
if (scanState) {
|
||||||
const text = newEntries
|
const text = successfulNewEntries
|
||||||
.filter(x => !failedProbabilityChecks.has(x))
|
|
||||||
.filter(x => !x.preventRecursion)
|
.filter(x => !x.preventRecursion)
|
||||||
.map(x => x.content).join('\n');
|
.map(x => x.content).join('\n');
|
||||||
buffer.addRecurse(text);
|
buffer.addRecurse(text);
|
||||||
allActivatedText = (text + '\n' + allActivatedText);
|
allActivatedText = (text + '\n' + allActivatedText);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (successfulNewEntries.length) {
|
||||||
|
console.debug(`[WI] Sucessfully activated ${successfulNewEntries.length} new entries to prompt. ${allActivatedEntries.size} total entries activated.`, successfulNewEntries);
|
||||||
|
}
|
||||||
|
|
||||||
// world_info_min_activations
|
// world_info_min_activations
|
||||||
if (!scanState && !token_budget_overflowed) {
|
if (!scanState && !token_budget_overflowed) {
|
||||||
if (world_info_min_activations > 0 && (allActivatedEntries.size < world_info_min_activations)) {
|
if (world_info_min_activations > 0 && (allActivatedEntries.size < world_info_min_activations)) {
|
||||||
|
Reference in New Issue
Block a user