Refactor generateRaw/generateQuietPrompt calls (#4277) * generateQuietPrompt: Update to object arguments * generateRaw: Update to object arguments * Fix jsdoc * Fix lint * Unwrap JSON schema options * Remove default args from gen call

1a921576430e1e0d63b3ef4efe8d6f4e9d544cf4

Cohee <18619528+Cohee1207@users.noreply.github.com>

Signed
7 files changed, +90 -48Ignore whitespace
public/script.js+45 -32
@@ -2330,37 +2330,43 @@ export function getStoppingStrings(isImpersonate, isContinue) {
23302330
23312331/**
23322332 * Background generation based on the provided prompt.
23332333 * @paramtypedef {stringobject} quietPrompt Instruction prompt for the AIGenerateQuietPromptParams
2334- * @param {boolean} [quietToLoud] Whether the message should be sent in a foreground (loud) or background (quiet) mode
2334+ * @prop {string} [quietPrompt] Instruction prompt for the AI
23352335 * @paramprop {boolean} [skipWIANquietToLoud] Whether tothe skipmessage additionshould ofbe Worldsent Infoin anda Author'sforeground Note(loud) intoor thebackground prompt(quiet) mode
23362336 * @paramprop {stringboolean} [quietImageskipWIAN] ImageWhether to useskip foraddition theof quietWorld Info and Author's Note into the prompt
23372337 * @paramprop {string} [quietNamequietImage] NameImage to use for the quiet prompt (defaults to "System:")
23382338 * @paramprop {numberstring} [responseLengthquietName] Maximum responseName length.to Ifuse unset,for the globalquiet defaultprompt value(defaults isto used."System:")
23392339 * @paramprop {number} [forceChIdresponseLength] Character IDMaximum toresponse uselength. forIf thisunset, generationthe run.global Worksdefault invalue groupsis onlyused.
23402340 * @paramprop {AdditionalRequestOptionsnumber} [options={}forceChId] AdditionalCharacter ID to use for this generation requestrun. optionsWorks in groups only.
2341+ * @prop {object} [jsonSchema] JSON schema to use for the structured generation. Usually requires a special instruction.
2342+ * @param {GenerateQuietPromptParams} params Parameters for the quiet prompt generation
23412343 * @returns {Promise<string>} Generated text. If using structured output, will contain a serialized JSON object.
23422344 */
23432345export async function generateQuietPrompt({ quietPrompt = '', quietToLoud = false, skipWIAN = false, quietImage = null, quietName = null, responseLength = null, forceChId = null, { jsonSchema = null } = {}) {
2344- console.log('got into genQuietPrompt');
2346+ if (arguments.length > 0 && typeof arguments[0] !== 'object') {
2347+ console.trace('generateQuietPrompt called with positional arguments. Please use an object instead.');
2348+ [quietPrompt, quietToLoud, skipWIAN, quietImage, quietName, responseLength, forceChId, jsonSchema] = arguments;
2349+ }
2350+
23452351 const responseLengthCustomized = typeof responseLength === 'number' && responseLength > 0;
23462352 let eventHook = () => { };
23472353 try {
23482354 /** @type {GenerateOptions} */
23492355 const optionsgenerateOptions = {
23502356 quiet_prompt: quietPrompt ?? '',
2351- quietToLoud,
2357+ quietToLoud: quietToLoud ?? false,
23522358 skipWIAN: skipWIAN ?? false,
23532359 force_name2: true,
23542360 quietImage: quietImage ?? null,
23552361 quietName: quietName ?? null,
23562362 force_chid: forceChId ?? null,
23572363 jsonSchema: jsonSchema ?? null,
23582364 };
23592365 if (responseLengthCustomized) {
23602366 TempResponseLength.save(main_api, responseLength);
23612367 eventHook = TempResponseLength.setupEventHook(main_api);
23622368 }
23632369 const result = await Generate('quiet', optionsgenerateOptions);
23642370 return removeReasoningFromString(result);
23652371 } finally {
23662372 if (responseLengthCustomized && TempResponseLength.isCustomized()) {
@@ -3121,18 +3127,25 @@ export function createRawPrompt(prompt, api, instructOverride, quietToLoud, syst
31213127/**
31223128 * Generates a message using the provided prompt.
31233129 * If the prompt is an array of chat-style messages and not using chat completion, it will be converted to a text prompt.
3124- * @param {string | object[]} prompt Prompt to generate a message from. Can be a string or an array of chat-style messages, i.e. [{role: '', content: ''}, ...]
3130+ * @typedef {object} GenerateRawParams
3125- * @param {string} api API to use. Main API is used if not specified.
3131+ * @prop {string | object[]} [prompt] Prompt to generate a message from. Can be a string or an array of chat-style messages, i.e. [{role: '', content: ''}, ...]
31263132 * @paramprop {booleanstring} instructOverride[api] trueAPI to override instructuse. mode,Main falseAPI tois useused theif defaultnot valuespecified.
31273133 * @paramprop {boolean} quietToLoud[instructOverride] true to generate a message inoverride systeminstruct mode, false to generate a messageuse inthe characterdefault modevalue
3128- * @param {string} [systemPrompt] System prompt to use.
3134+ * @prop {boolean} [quietToLoud] true to generate a message in system mode, false to generate a message in character mode
31293135 * @paramprop {numberstring} [responseLengthsystemPrompt] Maximum response length. If unset, the global defaultSystem valueprompt isto useduse.
3130- * @param {boolean} [trimNames] Whether to allow trimming "{{user}}:" and "{{char}}:" from the response.
3136+ * @prop {number} [responseLength] Maximum response length. If unset, the global default value is used.
3131- * @param {string} [prefill] An optional prefill for the prompt.
3137+ * @prop {boolean} [trimNames] Whether to allow trimming "{{user}}:" and "{{char}}:" from the response.
31323138 * @paramprop {AdditionalRequestOptionsstring} [optionsprefill] AdditionalAn optionsoptional prefill for generationthe prompt.
3139+ * @prop {object} [jsonSchema] JSON schema to use for the structured generation. Usually requires a special instruction.
3140+ * @param {GenerateRawParams} params Parameters for generating a message
31333141 * @returns {Promise<string>} Generated message
31343142 */
31353143export async function generateRaw({ prompt = '', api = null, instructOverride = false, quietToLoud = false, systemPrompt = '', responseLength = null, trimNames = true, prefill = '', optionsjsonSchema = null } = {}) {
3144+ if (arguments.length > 0 && typeof arguments[0] !== 'object') {
3145+ console.trace('generateRaw called with positional arguments. Please use an object instead.');
3146+ [prompt, api, instructOverride, quietToLoud, systemPrompt, responseLength, trimNames, prefill, jsonSchema] = arguments;
3147+ }
3148+
31363149 if (!api) {
31373150 api = main_api;
31383151 }
@@ -3184,7 +3197,7 @@ export async function generateRaw(prompt, api, instructOverride, quietToLoud, sy
31843197 if (api === 'koboldhorde') {
31853198 data = await generateHorde(prompt.toString(), generateData, abortController.signal, false);
31863199 } else if (api === 'openai') {
31873200 data = await sendOpenAIRequest('quiet', generateData, abortController.signal, options{ jsonSchema });
31883201 } else {
31893202 const generateUrl = getGenerateUrl(api);
31903203 const response = await fetch(generateUrl, {
@@ -3209,7 +3222,7 @@ export async function generateRaw(prompt, api, instructOverride, quietToLoud, sy
32093222 throw new Error(data.response);
32103223 }
32113224
32123225 if (options?.jsonSchema) {
32133226 return extractJsonFromData(data, { mainApi: api });
32143227 }
32153228
@@ -9315,7 +9328,7 @@ function addDebugFunctions() {
93159328 registerDebugFunction('generationTest', 'Send a generation request', 'Generates text using the currently selected API.', async () => {
93169329 const text = prompt('Input text:', 'Hello');
93179330 toastr.info('Working on it...');
93189331 const message = await generateRaw(text,{ null,prompt: false,text false});
93199332 alert(message);
93209333 });
93219334 registerDebugFunction('toggleEventTracing', 'Toggle event tracing', 'Useful to see what triggered a certain event.', () => {
public/scripts/backgrounds.js+1 -1
@@ -421,7 +421,7 @@ async function autoBackgroundCommand() {
421421
422422 const list = options.map(option => `- ${option.text}`).join('\n');
423423 const prompt = stringFormat(autoBgPrompt, list);
424424 const reply = await generateQuietPrompt(prompt,{ false,quietPrompt: falseprompt });
425425 const fuse = new Fuse(options, { keys: ['text'] });
426426 const bestMatch = fuse.search(reply, { limit: 1 });
427427
public/scripts/extensions/expressions/index.js+3 -3
@@ -1,6 +1,6 @@
11import { Fuse } from '../../../lib.js';
22
33import { characters, eventSource, event_types, generateQuietPrompt, generateRaw, getRequestHeaders, main_api, online_status, saveSettingsDebounced, substituteParams, substituteParamsExtended, system_message_types, this_chid } from '../../../script.js';
44import { dragElement, isMobile } from '../../RossAscends-mods.js';
55import { getContext, getApiUrl, modules, extension_settings, ModuleWorkerWrapper, doExtrasFetch, renderExtensionTemplateAsync } from '../../extensions.js';
66import { loadMovingUIState, performFuzzySearch, power_user } from '../../power-user.js';
@@ -1056,10 +1056,10 @@ export async function getExpressionLabel(text, expressionsApi = extension_settin
10561056 inApiCall = true;
10571057 switch (extension_settings.expressions.promptType) {
10581058 case PROMPT_TYPE.raw:
10591059 emotionResponse = await generateRaw(text,{ main_api,prompt: falsetext, false,systemPrompt: prompt });
10601060 break;
10611061 case PROMPT_TYPE.full:
10621062 emotionResponse = await generateQuietPrompt(prompt,{ false,quietPrompt: falseprompt });
10631063 break;
10641064 }
10651065 } finally {
public/scripts/extensions/memory/index.js+15 -3
@@ -506,7 +506,7 @@ async function summarizeCallback(args, text) {
506506 case summary_sources.extras:
507507 return await callExtrasSummarizeAPI(text);
508508 case summary_sources.main:
509509 return removeReasoningFromString(await generateRaw(text,{ '',prompt: falsetext, false,systemPrompt: prompt, responseLength: extension_settings.memory.overrideResponseLength }));
510510 case summary_sources.webllm: {
511511 const messages = [{ role: 'system', content: prompt }, { role: 'user', content: text }].filter(m => m.content);
512512 const params = extension_settings.memory.overrideResponseLength > 0 ? { max_tokens: extension_settings.memory.overrideResponseLength } : {};
@@ -677,7 +677,13 @@ async function summarizeChatMain(context, force, skipWIAN) {
677677 if (prompt_builders.DEFAULT === extension_settings.memory.prompt_builder) {
678678 try {
679679 inApiCall = true;
680- summary = await generateQuietPrompt(prompt, false, skipWIAN, '', '', extension_settings.memory.overrideResponseLength);
680+ /** @type {import('../../../script.js').GenerateQuietPromptParams} */
681+ const params = {
682+ quietPrompt: prompt,
683+ skipWIAN: skipWIAN,
684+ responseLength: extension_settings.memory.overrideResponseLength,
685+ };
686+ summary = await generateQuietPrompt(params);
681687 } finally {
682688 inApiCall = false;
683689 }
@@ -701,7 +707,13 @@ async function summarizeChatMain(context, force, skipWIAN) {
701707 return null;
702708 }
703709
704- const rawSummary = await generateRaw(rawPrompt, '', false, false, prompt, extension_settings.memory.overrideResponseLength);
710+ /** @type {import('../../../script.js').GenerateRawParams} */
711+ const params = {
712+ prompt: rawPrompt,
713+ systemPrompt: prompt,
714+ responseLength: extension_settings.memory.overrideResponseLength,
715+ };
716+ const rawSummary = await generateRaw(params);
705717 summary = removeReasoningFromString(rawSummary);
706718 index = lastUsedIndex;
707719 } finally {
public/scripts/extensions/stable-diffusion/index.js+1 -1
@@ -2726,7 +2726,7 @@ function getUserAvatarUrl() {
27262726 * @returns {Promise<string>} - A promise that resolves when the prompt generation completes.
27272727 */
27282728async function generatePrompt(quietPrompt) {
27292729 const reply = await generateQuietPrompt(quietPrompt,{ false,quietPrompt false});
27302730 const processedReply = processReply(reply);
27312731
27322732 if (!processedReply) {
public/scripts/extensions/vectors/index.js+4 -4
@@ -257,17 +257,17 @@ async function summarizeExtra(element) {
257257/**
258258 * Summarizes messages using the main API method.
259259 * @param {HashedMessage} element hashed message
260260 * @returns {Promise<boolean>} SucessSuccess
261261 */
262262async function summarizeMain(element) {
263263 element.text = removeReasoningFromString(await generateRaw({ prompt: element.text, '', false, false,systemPrompt: settings.summary_prompt }));
264264 return true;
265265}
266266
267267/**
268268 * Summarizes messages using WebLLM.
269269 * @param {HashedMessage} element hashed message
270270 * @returns {Promise<boolean>} SucessSuccess
271271 */
272272async function summarizeWebLLM(element) {
273273 if (!isWebLlmSupported()) {
@@ -1751,7 +1751,7 @@ jQuery(async () => {
17511751
17521752 $('#api_key_nomicai').toggleClass('success', !!secret_state[SECRET_KEYS.NOMICAI]);
17531753 [event_types.SECRET_WRITTEN, event_types.SECRET_DELETED, event_types.SECRET_ROTATED].forEach(event => {
17541754 eventSource.on(event, (/** @type {string} */ key) => {
17551755 if (key !== SECRET_KEYS.NOMICAI) return;
17561756 $('#api_key_nomicai').toggleClass('success', !!secret_state[SECRET_KEYS.NOMICAI]);
17571757 });
public/scripts/slash-commands.js+21 -4
@@ -3645,7 +3645,17 @@ async function generateRawCallback(args, value) {
36453645 }
36463646
36473647 setEphemeralStopStrings(resolveVariable(args?.stop));
3648- const result = await generateRaw(value, '', isFalseBoolean(args?.instruct), quietToLoud, systemPrompt, length, trimNames, prefillPrompt);
3648+ /** @type {import('../script.js').GenerateRawParams} */
3649+ const params = {
3650+ prompt: value,
3651+ instructOverride: isFalseBoolean(args?.instruct),
3652+ quietToLoud: quietToLoud,
3653+ systemPrompt: systemPrompt,
3654+ responseLength: length,
3655+ trimNames: trimNames,
3656+ prefill: prefillPrompt,
3657+ };
3658+ const result = await generateRaw(params);
36493659 return result;
36503660 } catch (err) {
36513661 console.error('Error on /genraw generation', err);
@@ -3681,7 +3691,14 @@ async function generateCallback(args, value) {
36813691 setEphemeralStopStrings(resolveVariable(args?.stop));
36823692 const name = args?.name;
36833693 const char = findChar({ name: name });
3684- const result = await generateQuietPrompt(value, quietToLoud, false, '', char?.name ?? name, length);
3694+ /** @type {import('../script.js').GenerateQuietPromptParams} */
3695+ const params = {
3696+ quietPrompt: value,
3697+ quietToLoud: quietToLoud,
3698+ quietName: char?.name ?? name,
3699+ responseLength: length,
3700+ };
3701+ const result = await generateQuietPrompt(params);
36853702 return result;
36863703 } catch (err) {
36873704 console.error('Error on /gen generation', err);
@@ -4352,7 +4369,7 @@ export async function generateSystemMessage(_, prompt) {
43524369
43534370 // Generate and regex the output if applicable
43544371 toastr.info('Please wait', 'Generating...');
43554372 let message = await generateQuietPrompt(prompt,{ false,quietPrompt: falseprompt });
43564373 message = getRegexedString(message, regex_placement.SLASH_COMMAND);
43574374
43584375 sendNarratorMessage(_, message);
@@ -4609,7 +4626,7 @@ export async function promptQuietForLoudResponse(who, text) {
46094626
46104627 //text = `${text}${power_user.instruct.enabled ? '' : '\n'}${(power_user.always_force_name2 && who != 'raw') ? characters[character_id].name + ":" : ""}`
46114628
46124629 let reply = await generateQuietPrompt({ quietPrompt: text, quietToLoud: true, false});
46134630 text = await getRegexedString(reply, regex_placement.SLASH_COMMAND);
46144631
46154632 const message = {