diff --git a/lm-launcher.jar b/lm-launcher.jar index 2a41f17..f5144be 100644 Binary files a/lm-launcher.jar and b/lm-launcher.jar differ diff --git a/src/de/extio/lm_launcher/App.java b/src/de/extio/lm_launcher/App.java index 58cce0f..1c46e4c 100644 --- a/src/de/extio/lm_launcher/App.java +++ b/src/de/extio/lm_launcher/App.java @@ -6,7 +6,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -30,14 +29,14 @@ record App(Path path, Path interpreter, @Deprecated List arguments, List "MIN_P", Model::minPDisplay, "REASONING_STOP", m -> "... thinking budget exceeded, let's answer now.\n"); - String argumentsToString(boolean showAll) { + String argumentsToString(final boolean showAll) { return this.argumentsToStringByArgs(this.appArguments.stream(), showAll); } - String argumentsToString(final List argumentOverrides, boolean showAll) { + String argumentsToString(final List argumentOverrides, final boolean showAll) { return this.argumentsToStringByArgs(this.appArguments .stream() - .map(arg -> argumentOverrides.stream().filter(a -> a.argument().equals(arg.argument())).findFirst().orElse(arg)), + .map(arg -> argumentOverrides.stream().filter(a -> a.argument().equals(arg.argument())).findFirst().orElse(arg)), showAll); } @@ -45,7 +44,7 @@ record App(Path path, Path interpreter, @Deprecated List arguments, List if (modelPath == null || modelPath.isBlank()) { return copyArguments(this.appArguments); } - final AppModelSettings savedSettings = this.findModelSettings(modelPath); + final var savedSettings = this.findModelSettings(modelPath); if (savedSettings == null) { return copyArguments(this.appArguments); } @@ -56,8 +55,8 @@ record App(Path path, Path interpreter, @Deprecated List arguments, List if (modelPath == null || modelPath.isBlank()) { return; } - final AppModelSettings updatedSettings = new AppModelSettings(modelPath, copyArguments(selectedArguments)); - for (int i = 0; i < this.modelSettings.size(); i++) { + final var updatedSettings = new AppModelSettings(modelPath, copyArguments(selectedArguments)); + for (var i = 0; i < this.modelSettings.size(); i++) { if (this.modelSettings.get(i).modelPath().equals(modelPath)) { this.modelSettings.set(i, updatedSettings); return; @@ -66,7 +65,7 @@ record App(Path path, Path interpreter, @Deprecated List arguments, List this.modelSettings.add(updatedSettings); } - private String argumentsToStringByArgs(final Stream args, boolean showAll) { + private String argumentsToStringByArgs(final Stream args, final boolean showAll) { return args .filter(arg -> showAll || (arg.optional() ? arg.default_() : true)) .map(AppArgument::argument) @@ -82,7 +81,7 @@ record App(Path path, Path interpreter, @Deprecated List arguments, List for (final AppArgument baseArgument : this.appArguments) { final int occurrenceIndex = occurrences.getOrDefault(baseArgument.argument(), 0); occurrences.put(baseArgument.argument(), occurrenceIndex + 1); - final AppArgument savedArgument = nthArgument(savedArguments, baseArgument.argument(), occurrenceIndex); + final var savedArgument = nthArgument(savedArguments, baseArgument.argument(), occurrenceIndex); mergedArguments.add(savedArgument == null ? new AppArgument(baseArgument.argument(), baseArgument.optional(), baseArgument.default_()) : new AppArgument(baseArgument.argument(), baseArgument.optional(), baseArgument.optional() ? savedArgument.default_() : baseArgument.default_())); @@ -98,7 +97,7 @@ record App(Path path, Path interpreter, @Deprecated List arguments, List } private static AppArgument nthArgument(final List arguments, final String argument, final int occurrenceIndex) { - int matchIndex = 0; + var matchIndex = 0; for (final AppArgument candidate : arguments) { if (!candidate.argument().equals(argument)) { continue; @@ -118,25 +117,41 @@ record App(Path path, Path interpreter, @Deprecated List arguments, List } void run(final Model model, final List argumentOverrides) throws IOException, IllegalArgumentException { - String interpreterStr = ""; + final List cmdParts = new ArrayList<>(); + if (this.interpreter() != null) { - interpreterStr = this.interpreter().toString().concat(" "); + cmdParts.add(this.interpreter().toString()); } - String consoleCmdStr = Data.props.getProperty("console") - .replace("CMD", interpreterStr + this.path().toString() + " " + this.argumentsToString(argumentOverrides, false)); + cmdParts.add(this.path().toString()); - if (PLACEHOLDERS.keySet().stream().anyMatch(consoleCmdStr::contains)) { - if (model == null) { - throw new IllegalArgumentException("Select a model first"); + for (final AppArgument arg_ : this.appArguments) { + final var arg = argumentOverrides.stream().filter(a -> a.argument().equals(arg_.argument())).findFirst().orElseGet(() -> arg_); + if (!arg.optional() || arg.default_()) { + var argReplaced = arg.argument(); + if (PLACEHOLDERS.keySet().contains(arg.argument())) { + if (model == null) { + throw new IllegalArgumentException("Select a model first"); + } + argReplaced = PLACEHOLDERS.get(arg.argument()).apply(model); + } + + cmdParts.add(argReplaced); } - for (final Entry> placeholder : PLACEHOLDERS.entrySet()) { - consoleCmdStr = consoleCmdStr.replace(placeholder.getKey(), placeholder.getValue().apply(model)); + } + + final List arguments = new ArrayList<>(); + for (final var arg : Data.props.getProperty("console").split("\\s+")) { + if ("CMD".equals(arg)) { + arguments.addAll(cmdParts); + } + else { + arguments.add(arg); } } Runtime.getRuntime().exec( - consoleCmdStr.split("\\s+"), + arguments.toArray(new String[0]), null, this.path().toAbsolutePath().getParent().toFile()); }