fix(ai): harden custom settings payload against invalid JSON and races
Custom setting values were JSON-escaped but emitted unquoted, so any non-numeric value (e.g. "high") produced an invalid JSON payload and failed the whole request; quoting the value manually could not work either, since the escaper turns quotes into \". Emit RFC 8259 scalars (number/true/false/null) bare and everything else as a quoted JSON string. Reserved payload keys (model, messages, stream) would duplicate the fixed fields with parser-dependent precedence; reject them in ai_set_provider_setting (surfaced as an error by /ai set custom) and skip them at payload-build time for settings loaded from hand-edited prefs. provider->settings was mutated on the main thread while the request thread iterates it when building the payload; guard both sides with a new per-provider settings_lock. Also refresh stale docs: ai_parse_response no longer mentions the dropped Perplexity "text" path, the payload docstring says "messages" instead of "input", and the /ai help example uses a realistic scalar setting.
This commit is contained in:
@@ -10787,8 +10787,11 @@ cmd_ai_set(ProfWin* window, const char* const command, gchar** args)
|
||||
cons_bad_cmd_usage(command);
|
||||
return TRUE;
|
||||
}
|
||||
ai_set_provider_setting(args[2], args[3], args[4]);
|
||||
cons_show("Setting '%s' for provider '%s' set to: %s", args[3], args[2], args[4]);
|
||||
if (ai_set_provider_setting(args[2], args[3], args[4])) {
|
||||
cons_show("Setting '%s' for provider '%s' set to: %s", args[3], args[2], args[4]);
|
||||
} else {
|
||||
cons_show_error("Cannot set '%s' for provider '%s': unknown provider or reserved key (model, messages, stream).", args[3], args[2]);
|
||||
}
|
||||
cons_show("");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user