fix(model-servers): autorise les espaces dans le champ Arguments supplémentaires llama.cpp
Le champ contrôlé de ModelServersPanel/FirstRunWizard perdait les espaces saisis dans les arguments llama.cpp (trim/split prématuré sur chaque frappe au lieu de la seule sérialisation finale) (#113). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -97,9 +97,10 @@ export function ModelServersPanel({ vm }: ModelServersPanelProps) {
|
||||
setDraft({ ...server });
|
||||
}
|
||||
|
||||
async function submit() {
|
||||
if (!draft) return;
|
||||
const saved = await vm.save(draft);
|
||||
async function submit(nextDraft?: LocalModelServerConfig) {
|
||||
const submitted = nextDraft ?? draft;
|
||||
if (!submitted) return;
|
||||
const saved = await vm.save(submitted);
|
||||
if (saved) setDraft(null);
|
||||
}
|
||||
|
||||
@ -225,7 +226,7 @@ export function ModelServersPanel({ vm }: ModelServersPanelProps) {
|
||||
vm.clearError();
|
||||
setDraft(null);
|
||||
}}
|
||||
onSubmit={() => void submit()}
|
||||
onSubmit={(nextDraft) => void submit(nextDraft)}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
@ -343,12 +344,27 @@ function ServerEditor({
|
||||
) => Promise<ModelServerCommandPreview | null>;
|
||||
onChange: (next: LocalModelServerConfig) => void;
|
||||
onCancel: () => void;
|
||||
onSubmit: () => void;
|
||||
onSubmit: (nextDraft?: LocalModelServerConfig) => void;
|
||||
}) {
|
||||
const errors: ModelServerErrors = validateModelServer(draft);
|
||||
const valid = Object.keys(errors).length === 0;
|
||||
const patch = (next: Partial<LocalModelServerConfig>) =>
|
||||
onChange({ ...draft, ...next });
|
||||
const canonicalArgsText = draft.args.join(" ");
|
||||
const [argsText, setArgsText] = useState(canonicalArgsText);
|
||||
|
||||
useEffect(() => {
|
||||
setArgsText(canonicalArgsText);
|
||||
}, [canonicalArgsText, draft.id]);
|
||||
|
||||
function draftWithCommittedArgs(): LocalModelServerConfig {
|
||||
return { ...draft, args: parseArgs(argsText) };
|
||||
}
|
||||
|
||||
function commitArgs() {
|
||||
const next = draftWithCommittedArgs();
|
||||
onChange(next);
|
||||
}
|
||||
|
||||
// Sticky source tab: keep the chosen kind even when the field is momentarily
|
||||
// blank (an empty field clears `modelSource`, which must not snap the tab).
|
||||
@ -411,7 +427,7 @@ function ServerEditor({
|
||||
// `draftKey` captures the argv-affecting fields; `preview` is stable.
|
||||
}, [draftKey, preview]); // eslint-disable-line react-hooks/exhaustive-deps
|
||||
|
||||
const reservedHits = reservedFlagsIn(draft.args);
|
||||
const reservedHits = reservedFlagsIn(parseArgs(argsText));
|
||||
|
||||
return (
|
||||
<fieldset
|
||||
@ -642,9 +658,10 @@ function ServerEditor({
|
||||
<Caption>Arguments supplémentaires</Caption>
|
||||
<Input
|
||||
aria-label="extra arguments"
|
||||
value={draft.args.join(" ")}
|
||||
value={argsText}
|
||||
placeholder="--flash-attn --parallel 2"
|
||||
onChange={(e) => patch({ args: parseArgs(e.target.value) })}
|
||||
onChange={(e) => setArgsText(e.target.value)}
|
||||
onBlur={commitArgs}
|
||||
/>
|
||||
{reservedHits.length > 0 && (
|
||||
<small className="text-xs text-warning" role="status">
|
||||
@ -682,7 +699,7 @@ function ServerEditor({
|
||||
variant="primary"
|
||||
size="sm"
|
||||
aria-label="save model server"
|
||||
onClick={onSubmit}
|
||||
onClick={() => onSubmit(draftWithCommittedArgs())}
|
||||
disabled={busy || !valid}
|
||||
>
|
||||
Save server
|
||||
|
||||
Reference in New Issue
Block a user