Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions src/main/java/net/ladenthin/llama/CliParameters.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

package net.ladenthin.llama;

import net.ladenthin.llama.args.CliArg;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
Expand All @@ -16,6 +17,39 @@ abstract class CliParameters {

final Map<String, @Nullable String> parameters = new HashMap<>();

/**
* Store a scalar value (typically a primitive: int, long, float, double, boolean)
* for the given key using {@link String#valueOf(Object)} and return this builder
* typed as the concrete subtype so callers can collapse the
* {@code parameters.put(...); return this;} pair into a single
* {@code return putScalar(...);}.
*
* @param key the parameter key
* @param value the scalar value; autoboxed at the call site
* @param <T> the concrete subtype of this builder
* @return this builder
*/
@SuppressWarnings("unchecked")
protected final <T extends CliParameters> T putScalar(String key, Object value) {
parameters.put(key, String.valueOf(value));
return (T) this;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well-implemented helper method. The use of String.valueOf() is the correct choice here:

  • Locale-independent (uses '.' as decimal separator for floats/doubles)
  • Handles all primitive types uniformly
  • Safe for nulls (returns "null" string, which is appropriate for a parameter value)

The unchecked cast is safe because the method is only called on instances that extend CliParameters.


/**
* Store the CLI-argument string of the given enum constant for the given key and
* return this builder typed as the concrete subtype.
*
* @param key the parameter key
* @param value the enum constant; must implement {@link CliArg}
* @param <T> the concrete subtype of this builder
* @return this builder
*/
@SuppressWarnings("unchecked")
protected final <T extends CliParameters> T putEnum(String key, CliArg value) {
parameters.put(key, value.getArgValue());
return (T) this;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct enum handling. Uses getArgValue() instead of ordinal() or enum name—this is the right approach for CLI argument serialization. Mirrors the original pattern used throughout ModelParameters.


@Override
public String toString() {
StringBuilder builder = new StringBuilder();
Expand Down
84 changes: 28 additions & 56 deletions src/main/java/net/ladenthin/llama/InferenceParameters.java
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,7 @@ public InferenceParameters setInputSuffix(String inputSuffix) {
* @return this builder
*/
public InferenceParameters setCachePrompt(boolean cachePrompt) {
parameters.put(PARAM_CACHE_PROMPT, String.valueOf(cachePrompt));
return this;
return putScalar(PARAM_CACHE_PROMPT, cachePrompt);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct usage in InferenceParameters. Boolean parameter correctly converted via putScalar(). String.valueOf(true/false) produces lowercase "true"/"false" strings, which is correct for JSON serialization.

}

/**
Expand All @@ -125,8 +124,7 @@ public InferenceParameters setCachePrompt(boolean cachePrompt) {
* @return this builder
*/
public InferenceParameters setNPredict(int nPredict) {
parameters.put(PARAM_N_PREDICT, String.valueOf(nPredict));
return this;
return putScalar(PARAM_N_PREDICT, nPredict);
}

/**
Expand All @@ -136,8 +134,7 @@ public InferenceParameters setNPredict(int nPredict) {
* @return this builder
*/
public InferenceParameters setTopK(int topK) {
parameters.put(PARAM_TOP_K, String.valueOf(topK));
return this;
return putScalar(PARAM_TOP_K, topK);
}

/**
Expand All @@ -147,8 +144,7 @@ public InferenceParameters setTopK(int topK) {
* @return this builder
*/
public InferenceParameters setTopP(float topP) {
parameters.put(PARAM_TOP_P, String.valueOf(topP));
return this;
return putScalar(PARAM_TOP_P, topP);
}

/**
Expand All @@ -158,8 +154,7 @@ public InferenceParameters setTopP(float topP) {
* @return this builder
*/
public InferenceParameters setMinP(float minP) {
parameters.put(PARAM_MIN_P, String.valueOf(minP));
return this;
return putScalar(PARAM_MIN_P, minP);
}

/**
Expand All @@ -169,8 +164,7 @@ public InferenceParameters setMinP(float minP) {
* @return this builder
*/
public InferenceParameters setTfsZ(float tfsZ) {
parameters.put(PARAM_TFS_Z, String.valueOf(tfsZ));
return this;
return putScalar(PARAM_TFS_Z, tfsZ);
}

/**
Expand All @@ -180,8 +174,7 @@ public InferenceParameters setTfsZ(float tfsZ) {
* @return this builder
*/
public InferenceParameters setTypicalP(float typicalP) {
parameters.put(PARAM_TYPICAL_P, String.valueOf(typicalP));
return this;
return putScalar(PARAM_TYPICAL_P, typicalP);
}

/**
Expand All @@ -191,8 +184,7 @@ public InferenceParameters setTypicalP(float typicalP) {
* @return this builder
*/
public InferenceParameters setTemperature(float temperature) {
parameters.put(PARAM_TEMPERATURE, String.valueOf(temperature));
return this;
return putScalar(PARAM_TEMPERATURE, temperature);
}

/**
Expand All @@ -202,8 +194,7 @@ public InferenceParameters setTemperature(float temperature) {
* @return this builder
*/
public InferenceParameters setDynamicTemperatureRange(float dynatempRange) {
parameters.put(PARAM_DYNATEMP_RANGE, String.valueOf(dynatempRange));
return this;
return putScalar(PARAM_DYNATEMP_RANGE, dynatempRange);
}

/**
Expand All @@ -213,8 +204,7 @@ public InferenceParameters setDynamicTemperatureRange(float dynatempRange) {
* @return this builder
*/
public InferenceParameters setDynamicTemperatureExponent(float dynatempExponent) {
parameters.put(PARAM_DYNATEMP_EXPONENT, String.valueOf(dynatempExponent));
return this;
return putScalar(PARAM_DYNATEMP_EXPONENT, dynatempExponent);
}

/**
Expand All @@ -224,8 +214,7 @@ public InferenceParameters setDynamicTemperatureExponent(float dynatempExponent)
* @return this builder
*/
public InferenceParameters setRepeatLastN(int repeatLastN) {
parameters.put(PARAM_REPEAT_LAST_N, String.valueOf(repeatLastN));
return this;
return putScalar(PARAM_REPEAT_LAST_N, repeatLastN);
}

/**
Expand All @@ -235,8 +224,7 @@ public InferenceParameters setRepeatLastN(int repeatLastN) {
* @return this builder
*/
public InferenceParameters setRepeatPenalty(float repeatPenalty) {
parameters.put(PARAM_REPEAT_PENALTY, String.valueOf(repeatPenalty));
return this;
return putScalar(PARAM_REPEAT_PENALTY, repeatPenalty);
}

/**
Expand All @@ -246,8 +234,7 @@ public InferenceParameters setRepeatPenalty(float repeatPenalty) {
* @return this builder
*/
public InferenceParameters setFrequencyPenalty(float frequencyPenalty) {
parameters.put(PARAM_FREQUENCY_PENALTY, String.valueOf(frequencyPenalty));
return this;
return putScalar(PARAM_FREQUENCY_PENALTY, frequencyPenalty);
}

/**
Expand All @@ -257,8 +244,7 @@ public InferenceParameters setFrequencyPenalty(float frequencyPenalty) {
* @return this builder
*/
public InferenceParameters setPresencePenalty(float presencePenalty) {
parameters.put(PARAM_PRESENCE_PENALTY, String.valueOf(presencePenalty));
return this;
return putScalar(PARAM_PRESENCE_PENALTY, presencePenalty);
}

/**
Expand All @@ -268,8 +254,7 @@ public InferenceParameters setPresencePenalty(float presencePenalty) {
* @return this builder
*/
public InferenceParameters setMiroStat(MiroStat mirostat) {
parameters.put(PARAM_MIROSTAT, String.valueOf(mirostat.ordinal()));
return this;
return putScalar(PARAM_MIROSTAT, mirostat.ordinal());
}

/**
Expand All @@ -279,8 +264,7 @@ public InferenceParameters setMiroStat(MiroStat mirostat) {
* @return this builder
*/
public InferenceParameters setMiroStatTau(float mirostatTau) {
parameters.put(PARAM_MIROSTAT_TAU, String.valueOf(mirostatTau));
return this;
return putScalar(PARAM_MIROSTAT_TAU, mirostatTau);
}

/**
Expand All @@ -290,8 +274,7 @@ public InferenceParameters setMiroStatTau(float mirostatTau) {
* @return this builder
*/
public InferenceParameters setMiroStatEta(float mirostatEta) {
parameters.put(PARAM_MIROSTAT_ETA, String.valueOf(mirostatEta));
return this;
return putScalar(PARAM_MIROSTAT_ETA, mirostatEta);
}

/**
Expand All @@ -301,8 +284,7 @@ public InferenceParameters setMiroStatEta(float mirostatEta) {
* @return this builder
*/
public InferenceParameters setPenalizeNl(boolean penalizeNl) {
parameters.put(PARAM_PENALIZE_NL, String.valueOf(penalizeNl));
return this;
return putScalar(PARAM_PENALIZE_NL, penalizeNl);
}

/**
Expand All @@ -312,8 +294,7 @@ public InferenceParameters setPenalizeNl(boolean penalizeNl) {
* @return this builder
*/
public InferenceParameters setNKeep(int nKeep) {
parameters.put(PARAM_N_KEEP, String.valueOf(nKeep));
return this;
return putScalar(PARAM_N_KEEP, nKeep);
}

/**
Expand All @@ -323,8 +304,7 @@ public InferenceParameters setNKeep(int nKeep) {
* @return this builder
*/
public InferenceParameters setSeed(int seed) {
parameters.put(PARAM_SEED, String.valueOf(seed));
return this;
return putScalar(PARAM_SEED, seed);
}

/**
Expand All @@ -334,8 +314,7 @@ public InferenceParameters setSeed(int seed) {
* @return this builder
*/
public InferenceParameters setNProbs(int nProbs) {
parameters.put(PARAM_N_PROBS, String.valueOf(nProbs));
return this;
return putScalar(PARAM_N_PROBS, nProbs);
}

/**
Expand All @@ -345,8 +324,7 @@ public InferenceParameters setNProbs(int nProbs) {
* @return this builder
*/
public InferenceParameters setMinKeep(int minKeep) {
parameters.put(PARAM_MIN_KEEP, String.valueOf(minKeep));
return this;
return putScalar(PARAM_MIN_KEEP, minKeep);
}

/**
Expand Down Expand Up @@ -396,8 +374,7 @@ public InferenceParameters setPenaltyPrompt(int[] tokens) {
* @return this builder
*/
public InferenceParameters setIgnoreEos(boolean ignoreEos) {
parameters.put(PARAM_IGNORE_EOS, String.valueOf(ignoreEos));
return this;
return putScalar(PARAM_IGNORE_EOS, ignoreEos);
}

/**
Expand Down Expand Up @@ -513,8 +490,7 @@ public InferenceParameters setSamplers(Sampler... samplers) {
* @return this builder
*/
public InferenceParameters setUseChatTemplate(boolean useChatTemplate) {
parameters.put(PARAM_USE_JINJA, String.valueOf(useChatTemplate));
return this;
return putScalar(PARAM_USE_JINJA, useChatTemplate);
}

/**
Expand Down Expand Up @@ -570,8 +546,7 @@ public InferenceParameters setMessages(String systemMessage, List<Pair<String, S
* @return this builder
*/
public InferenceParameters setTopNSigma(float topNSigma) {
parameters.put(PARAM_TOP_N_SIGMA, String.valueOf(topNSigma));
return this;
return putScalar(PARAM_TOP_N_SIGMA, topNSigma);
}

/**
Expand All @@ -596,8 +571,7 @@ public InferenceParameters setReasoningFormat(ReasoningFormat reasoningFormat) {
* @return this builder
*/
public InferenceParameters setReasoningBudgetTokens(int budgetTokens) {
parameters.put(PARAM_REASONING_BUDGET_TOKENS, String.valueOf(budgetTokens));
return this;
return putScalar(PARAM_REASONING_BUDGET_TOKENS, budgetTokens);
}

/**
Expand All @@ -610,8 +584,7 @@ public InferenceParameters setReasoningBudgetTokens(int budgetTokens) {
* @return this builder
*/
public InferenceParameters setContinueFinalMessage(boolean continueFinalMessage) {
parameters.put(PARAM_CONTINUE_FINAL_MESSAGE, String.valueOf(continueFinalMessage));
return this;
return putScalar(PARAM_CONTINUE_FINAL_MESSAGE, continueFinalMessage);
}

/**
Expand All @@ -630,8 +603,7 @@ public InferenceParameters setContinueFinalMessage(ContinuationMode mode) {
}

InferenceParameters setStream(boolean stream) {
parameters.put(PARAM_STREAM, String.valueOf(stream));
return this;
return putScalar(PARAM_STREAM, stream);
}

}
Expand Down
34 changes: 34 additions & 0 deletions src/main/java/net/ladenthin/llama/JsonParameters.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

package net.ladenthin.llama;

import net.ladenthin.llama.args.CliArg;
import net.ladenthin.llama.json.ParameterJsonSerializer;

import java.util.HashMap;
Expand Down Expand Up @@ -49,4 +50,37 @@ String toJsonString(String text) {
if (text == null) return null;
return serializer.toJsonString(text);
}

/**
* Store a scalar value (typically a primitive: int, long, float, double, boolean)
* for the given key using {@link String#valueOf(Object)} and return this builder
* typed as the concrete subtype so callers can collapse the
* {@code parameters.put(...); return this;} pair into a single
* {@code return putScalar(...);}.
*
* @param key the parameter key
* @param value the scalar value; autoboxed at the call site
* @param <T> the concrete subtype of this builder
* @return this builder
*/
@SuppressWarnings("unchecked")
protected final <T extends JsonParameters> T putScalar(String key, Object value) {
parameters.put(key, String.valueOf(value));
return (T) this;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Identical helper on JsonParameters base class. Good that both CliParameters and JsonParameters carry the same helpers, since ModelParameters extends CliParameters (not JsonParameters). Ensures DRY principle while maintaining type safety for each subclass hierarchy.


/**
* Store the CLI-argument string of the given enum constant for the given key and
* return this builder typed as the concrete subtype.
*
* @param key the parameter key
* @param value the enum constant; must implement {@link CliArg}
* @param <T> the concrete subtype of this builder
* @return this builder
*/
@SuppressWarnings("unchecked")
protected final <T extends JsonParameters> T putEnum(String key, CliArg value) {
parameters.put(key, value.getArgValue());
return (T) this;
}
}
Loading
Loading