Add reasoning slash commands

a7516937f78108f5cfa589a4f5869e8c92ef5e0d

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

1 files changed, +68 -0Ignore whitespace
public/scripts/reasoning.js+68 -0
@@ -1,7 +1,12 @@
1import { chat, closeMessageEditor, saveChatConditional, saveSettingsDebounced, substituteParams, updateMessageBlock } from '../script.js';1import { chat, closeMessageEditor, saveChatConditional, saveSettingsDebounced, substituteParams, updateMessageBlock } from '../script.js';
2import { t } from './i18n.js';2import { t } from './i18n.js';
3import { MacrosParser } from './macros.js';
3import { Popup } from './popup.js';4import { Popup } from './popup.js';
4import { power_user } from './power-user.js';5import { power_user } from './power-user.js';
6import { SlashCommand } from './slash-commands/SlashCommand.js';
7import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from './slash-commands/SlashCommandArgument.js';
8import { commonEnumProviders } from './slash-commands/SlashCommandCommonEnumsProvider.js';
9import { SlashCommandParser } from './slash-commands/SlashCommandParser.js';
5import { copyText } from './utils.js';10import { copyText } from './utils.js';
611
7/**12/**
@@ -101,6 +106,67 @@ function loadReasoningSettings() {
101 });106 });
102}107}
103108
109function registerReasoningSlashCommands() {
110 SlashCommandParser.addCommandObject(SlashCommand.fromProps({
111 name: 'reasoning-get',
112 returns: ARGUMENT_TYPE.STRING,
113 helpString: t`Get the contents of a reasoning block of a message. Returns an empty string if the message does not have a reasoning block.`,
114 unnamedArgumentList: [
115 SlashCommandArgument.fromProps({
116 description: 'Message ID. If not provided, the message ID of the last message is used.',
117 typeList: ARGUMENT_TYPE.NUMBER,
118 enumProvider: commonEnumProviders.messages(),
119 }),
120 ],
121 callback: (_args, value) => {
122 const messageId = !isNaN(Number(value)) ? Number(value) : chat.length - 1;
123 const message = chat[messageId];
124 const reasoning = message?.extra?.reasoning;
125 return reasoning !== PromptReasoning.REASONING_PLACEHOLDER ? reasoning : '';
126 },
127 }));
128
129 SlashCommandParser.addCommandObject(SlashCommand.fromProps({
130 name: 'reasoning-set',
131 returns: ARGUMENT_TYPE.STRING,
132 helpString: t`Set the reasoning block of a message. Returns the reasoning block content.`,
133 namedArgumentList: [
134 SlashCommandNamedArgument.fromProps({
135 name: 'at',
136 description: 'Message ID. If not provided, the message ID of the last message is used.',
137 typeList: ARGUMENT_TYPE.NUMBER,
138 enumProvider: commonEnumProviders.messages(),
139 }),
140 ],
141 unnamedArgumentList: [
142 SlashCommandArgument.fromProps({
143 description: 'Reasoning block content.',
144 typeList: ARGUMENT_TYPE.STRING,
145 }),
146 ],
147 callback: async (args, value) => {
148 const messageId = !isNaN(Number(args[0])) ? Number(args[0]) : chat.length - 1;
149 const message = chat[messageId];
150 if (!message?.extra) {
151 return '';
152 }
153
154 message.extra.reasoning = String(value);
155 await saveChatConditional();
156
157 closeMessageEditor('reasoning');
158 updateMessageBlock(messageId, message);
159 return message.extra.reasoning;
160 },
161 }));
162}
163
164function registerReasoningMacros() {
165 MacrosParser.registerMacro('reasoningPrefix', () => power_user.reasoning.prefix, t`Reasoning Prefix`);
166 MacrosParser.registerMacro('reasoningSuffix', () => power_user.reasoning.suffix, t`Reasoning Suffix`);
167 MacrosParser.registerMacro('reasoningSeparator', () => power_user.reasoning.separator, t`Reasoning Separator`);
168}
169
104function setReasoningEventHandlers(){170function setReasoningEventHandlers(){
105 $(document).on('click', '.mes_reasoning_copy', (e) => {171 $(document).on('click', '.mes_reasoning_copy', (e) => {
106 e.stopPropagation();172 e.stopPropagation();
@@ -225,4 +291,6 @@ function setReasoningEventHandlers(){
225export function initReasoning() {291export function initReasoning() {
226 loadReasoningSettings();292 loadReasoningSettings();
227 setReasoningEventHandlers();293 setReasoningEventHandlers();
294 registerReasoningSlashCommands();
295 registerReasoningMacros();
228}296}