Emit prompt events in generateRaw (#4587) Closes https://github.com/SillyTavern/Extension-PromptInspector/issues/4

654ddb1608f7b69ec7ce70cd4a31e7b31887830c

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

Signed
1 files changed, +23 -0Ignore whitespace
public/script.js+23 -0
@@ -3197,6 +3197,11 @@ export async function generateRaw({ prompt = '', api = null, instructOverride =
31973197 // construct final prompt from the input. Can either be a string or an array of chat-style messages.
31983198 prompt = createRawPrompt(prompt, api, instructOverride, quietToLoud, systemPrompt, prefill);
31993199
3200+ // Allow extensions to stop generation before it happens
3201+ const eventAbortController = new AbortController();
3202+ const abortHook = () => eventAbortController.abort(new Error('Cancelled by extension'));
3203+ eventSource.on(event_types.GENERATION_STOPPED, abortHook);
3204+
32003205 try {
32013206 if (responseLengthCustomized) {
32023207 TempResponseLength.save(api, responseLength);
@@ -3204,6 +3209,23 @@ export async function generateRaw({ prompt = '', api = null, instructOverride =
32043209 /** @type {object|any[]} */
32053210 let generateData = {};
32063211
3212+ // Allow extensions to modify the prompt before generation
3213+ // 1. for text completion
3214+ if (typeof prompt === 'string') {
3215+ const eventData = { prompt: prompt, dryRun: false };
3216+ await eventSource.emit(event_types.GENERATE_AFTER_COMBINE_PROMPTS, eventData);
3217+ prompt = eventData.prompt;
3218+ }
3219+ // 2. for chat completion
3220+ if (Array.isArray(prompt)) {
3221+ const eventData = { chat: prompt, dryRun: false };
3222+ await eventSource.emit(event_types.CHAT_COMPLETION_PROMPT_READY, eventData);
3223+ prompt = eventData.chat;
3224+ }
3225+
3226+ // Check if the generation was aborted during the event
3227+ eventAbortController.signal.throwIfAborted();
3228+
32073229 switch (api) {
32083230 case 'kobold':
32093231 case 'koboldhorde':
@@ -3283,6 +3305,7 @@ export async function generateRaw({ prompt = '', api = null, instructOverride =
32833305
32843306 return message;
32853307 } finally {
3308+ eventSource.removeListener(event_types.GENERATION_STOPPED, abortHook);
32863309 if (responseLengthCustomized && TempResponseLength.isCustomized()) {
32873310 TempResponseLength.restore(api);
32883311 TempResponseLength.removeEventHook(api, eventHook);