TC: Allow setting null JSON schema (#4746) * TC: Allow setting empty JSON schema * Fix check for llamacpp schema * Handle grammar/schema for Aphrodite * Conditional include for guided_json * Update default presets with null value * Conditional include into payload for grammar/schema

5837f2859977fcdf544f6ed69f67e6c13dc02b99

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

Signed
8 files changed, +31 -24Ignore whitespace
default/content/presets/textgen/Default.json+1 -1
@@ -44,7 +44,7 @@
4444 "guidance_scale": 1,
4545 "negative_prompt": "",
4646 "grammar_string": "",
4747 "json_schema": {}null,
4848 "banned_tokens": "",
4949 "sampler_priority": [
5050 "repetition_penalty",
default/content/presets/textgen/Deterministic.json+1 -1
@@ -44,7 +44,7 @@
4444 "guidance_scale": 1,
4545 "negative_prompt": "",
4646 "grammar_string": "",
4747 "json_schema": {}null,
4848 "banned_tokens": "",
4949 "sampler_priority": [
5050 "repetition_penalty",
default/content/presets/textgen/Neutral.json+1 -1
@@ -44,7 +44,7 @@
4444 "guidance_scale": 1,
4545 "negative_prompt": "",
4646 "grammar_string": "",
4747 "json_schema": {}null,
4848 "banned_tokens": "",
4949 "sampler_priority": [
5050 "repetition_penalty",
default/content/presets/textgen/Universal-Creative.json+1 -1
@@ -44,7 +44,7 @@
4444 "guidance_scale": 1,
4545 "negative_prompt": "",
4646 "grammar_string": "",
4747 "json_schema": {}null,
4848 "banned_tokens": "",
4949 "sampler_priority": [
5050 "repetition_penalty",
default/content/presets/textgen/Universal-Light.json+1 -1
@@ -44,7 +44,7 @@
4444 "guidance_scale": 1,
4545 "negative_prompt": "",
4646 "grammar_string": "",
4747 "json_schema": {}null,
4848 "banned_tokens": "",
4949 "sampler_priority": [
5050 "repetition_penalty",
default/content/presets/textgen/Universal-Super-Creative.json+1 -1
@@ -44,7 +44,7 @@
4444 "guidance_scale": 1,
4545 "negative_prompt": "",
4646 "grammar_string": "",
4747 "json_schema": {}null,
4848 "banned_tokens": "",
4949 "sampler_priority": [
5050 "repetition_penalty",
public/scripts/textgen-settings.js+24 -17
@@ -25,7 +25,7 @@ import { getEventSourceStream } from './sse-stream.js';
2525import { getCurrentDreamGenModelTokenizer, getCurrentOpenRouterModelTokenizer, loadAphroditeModels, loadDreamGenModels, loadFeatherlessModels, loadGenericModels, loadInfermaticAIModels, loadMancerModels, loadOllamaModels, loadOpenRouterModels, loadTabbyModels, loadTogetherAIModels, loadVllmModels } from './textgen-models.js';
2626import { ENCODE_TOKENIZERS, TEXTGEN_TOKENIZERS, TOKENIZER_SUPPORTED_KEY, getTextTokens, tokenizers } from './tokenizers.js';
2727import { AbortReason } from './util/AbortReason.js';
2828import { getSortableDelay, onlyUnique, arraysEqual, isObject } from './utils.js';
2929
3030export const textgen_types = {
3131 OOBA: 'ooba',
@@ -191,7 +191,7 @@ const settings = {
191191 guidance_scale: 1,
192192 negative_prompt: '',
193193 grammar_string: '',
194194 json_schema: {}null,
195195 banned_tokens: '',
196196 global_banned_tokens: '',
197197 send_banned_tokens: true,
@@ -851,11 +851,16 @@ export function initTextGenSettings() {
851851 $('#tabby_json_schema').on('input', function () {
852852 const json_schema_string = String($(this).val());
853853
854854 tryif (json_schema_string) {
855- settings.json_schema = JSON.parse(json_schema_string || '{}');
855+ try {
856- } catch {
856+ settings.json_schema = JSON.parse(json_schema_string);
857- // Ignore errors from here
857+ } catch {
858+ settings.json_schema = null;
859+ }
860+ } else {
861+ settings.json_schema = null;
858862 }
863+
859864 saveSettingsDebounced();
860865 });
861866
@@ -1152,8 +1157,8 @@ function setSettingByName(setting, value, trigger) {
11521157 }
11531158
11541159 if ('json_schema' === setting) {
11551160 settings.json_schema = value ?? {}null;
11561161 $('#tabby_json_schema').val(value ? JSON.stringify(settings.json_schema, null, 2) : '');
11571162 return;
11581163 }
11591164
@@ -1555,8 +1560,8 @@ export async function getTextGenGenerationData(finalPrompt, maxTokens, isImperso
15551560 'seed': settings.seed >= 0 ? settings.seed : undefined,
15561561 'guidance_scale': cfgValues?.guidanceScale?.value ?? settings.guidance_scale ?? 1,
15571562 'negative_prompt': cfgValues?.negativePrompt ?? substituteParams(settings.negative_prompt) ?? '',
15581563 'grammar_string': settings.grammar_string || undefined,
15591564 'json_schema': [TABBY, LLAMACPP].includes(settings.type) && settings.json_schema ? settings.json_schema : undefined,
15601565 // llama.cpp aliases. In case someone wants to use LM Studio as Text Completion API
15611566 'repeat_penalty': settings.rep_pen,
15621567 'repeat_last_n': settings.rep_pen_range,
@@ -1597,8 +1602,8 @@ export async function getTextGenGenerationData(finalPrompt, maxTokens, isImperso
15971602 'min_tokens': settings.min_length,
15981603 'skip_special_tokens': settings.skip_special_tokens,
15991604 'spaces_between_special_tokens': settings.spaces_between_special_tokens,
16001605 'guided_grammar': settings.grammar_string || undefined,
16011606 'guided_json': settings.json_schema || undefined,
16021607 'early_stopping': false, // hacks
16031608 'include_stop_str_in_output': false,
16041609 'dynatemp_min': dynatemp ? settings.min_temp : undefined,
@@ -1622,7 +1627,7 @@ export async function getTextGenGenerationData(finalPrompt, maxTokens, isImperso
16221627 }
16231628
16241629 if (settings.type === KOBOLDCPP) {
16251630 params.grammar = settings.grammar_string || undefined;
16261631 params.trim_stop = true;
16271632 }
16281633
@@ -1691,17 +1696,19 @@ export async function getTextGenGenerationData(finalPrompt, maxTokens, isImperso
16911696 }
16921697 }
16931698
1694- await eventSource.emit(event_types.TEXT_COMPLETION_SETTINGS_READY, params);
1695-
16961699 // Grammar conflicts with with json_schema
16971700 if ([LLAMACPP, APHRODITE].includes(settings.type === LLAMACPP)) {
16981701 if (paramssettings.json_schema && Object.keysisObject(paramssettings.json_schema).length > 0) {
16991702 delete params.grammar_string;
17001703 delete params.grammar;
1704+ delete params.guided_grammar;
17011705 } else {
17021706 delete params.json_schema;
1707+ delete params.guided_json;
17031708 }
17041709 }
17051710
1711+ await eventSource.emit(event_types.TEXT_COMPLETION_SETTINGS_READY, params);
1712+
17061713 return params;
17071714}
public/scripts/utils.js+1 -1
@@ -100,7 +100,7 @@ export const navigation_option = {
100100 * @param {any} item The item to check.
101101 * @returns {boolean} True if the item is an object, false otherwise.
102102 */
103103export function isObject(item) {
104104 return (item && typeof item === 'object' && !Array.isArray(item));
105105}
106106