Skip to content

Commit 5495d23

Browse files
Deduplicate scalar/enum setter boilerplate via putScalar/putEnum (#178)
Add protected putScalar(String, Object) and putEnum(String, CliArg) helpers to both CliParameters and JsonParameters base classes. Each helper stores the value in the parameters map and returns the concrete builder subtype, collapsing the previous parameters.put("--key", String.valueOf(value)); return this; pattern into a single return putScalar("--key", value); Migrate 92 call sites in ModelParameters (57 scalar + 7 enum) and InferenceParameters (28 scalar). Setters with extra semantics (range validation, conditional guards, collection serialization, toJsonString wrapping) are intentionally left as-is. Net: 184 lines removed, 160 added (incl. helpers and javadoc). Adds 17 new pure unit tests in JsonParametersTest for the helpers. All 818 Java tests and all 435 C++ tests still pass. https://claude.ai/code/session_013VVJem7fKtc4rTZP32wqbP Co-authored-by: Claude <noreply@anthropic.com>
1 parent f84f974 commit 5495d23

5 files changed

Lines changed: 333 additions & 184 deletions

File tree

src/main/java/net/ladenthin/llama/CliParameters.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package net.ladenthin.llama;
77

8+
import net.ladenthin.llama.args.CliArg;
89
import org.jetbrains.annotations.Nullable;
910

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

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

20+
/**
21+
* Store a scalar value (typically a primitive: int, long, float, double, boolean)
22+
* for the given key using {@link String#valueOf(Object)} and return this builder
23+
* typed as the concrete subtype so callers can collapse the
24+
* {@code parameters.put(...); return this;} pair into a single
25+
* {@code return putScalar(...);}.
26+
*
27+
* @param key the parameter key
28+
* @param value the scalar value; autoboxed at the call site
29+
* @param <T> the concrete subtype of this builder
30+
* @return this builder
31+
*/
32+
@SuppressWarnings("unchecked")
33+
protected final <T extends CliParameters> T putScalar(String key, Object value) {
34+
parameters.put(key, String.valueOf(value));
35+
return (T) this;
36+
}
37+
38+
/**
39+
* Store the CLI-argument string of the given enum constant for the given key and
40+
* return this builder typed as the concrete subtype.
41+
*
42+
* @param key the parameter key
43+
* @param value the enum constant; must implement {@link CliArg}
44+
* @param <T> the concrete subtype of this builder
45+
* @return this builder
46+
*/
47+
@SuppressWarnings("unchecked")
48+
protected final <T extends CliParameters> T putEnum(String key, CliArg value) {
49+
parameters.put(key, value.getArgValue());
50+
return (T) this;
51+
}
52+
1953
@Override
2054
public String toString() {
2155
StringBuilder builder = new StringBuilder();

src/main/java/net/ladenthin/llama/InferenceParameters.java

Lines changed: 28 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,7 @@ public InferenceParameters setInputSuffix(String inputSuffix) {
114114
* @return this builder
115115
*/
116116
public InferenceParameters setCachePrompt(boolean cachePrompt) {
117-
parameters.put(PARAM_CACHE_PROMPT, String.valueOf(cachePrompt));
118-
return this;
117+
return putScalar(PARAM_CACHE_PROMPT, cachePrompt);
119118
}
120119

121120
/**
@@ -125,8 +124,7 @@ public InferenceParameters setCachePrompt(boolean cachePrompt) {
125124
* @return this builder
126125
*/
127126
public InferenceParameters setNPredict(int nPredict) {
128-
parameters.put(PARAM_N_PREDICT, String.valueOf(nPredict));
129-
return this;
127+
return putScalar(PARAM_N_PREDICT, nPredict);
130128
}
131129

132130
/**
@@ -136,8 +134,7 @@ public InferenceParameters setNPredict(int nPredict) {
136134
* @return this builder
137135
*/
138136
public InferenceParameters setTopK(int topK) {
139-
parameters.put(PARAM_TOP_K, String.valueOf(topK));
140-
return this;
137+
return putScalar(PARAM_TOP_K, topK);
141138
}
142139

143140
/**
@@ -147,8 +144,7 @@ public InferenceParameters setTopK(int topK) {
147144
* @return this builder
148145
*/
149146
public InferenceParameters setTopP(float topP) {
150-
parameters.put(PARAM_TOP_P, String.valueOf(topP));
151-
return this;
147+
return putScalar(PARAM_TOP_P, topP);
152148
}
153149

154150
/**
@@ -158,8 +154,7 @@ public InferenceParameters setTopP(float topP) {
158154
* @return this builder
159155
*/
160156
public InferenceParameters setMinP(float minP) {
161-
parameters.put(PARAM_MIN_P, String.valueOf(minP));
162-
return this;
157+
return putScalar(PARAM_MIN_P, minP);
163158
}
164159

165160
/**
@@ -169,8 +164,7 @@ public InferenceParameters setMinP(float minP) {
169164
* @return this builder
170165
*/
171166
public InferenceParameters setTfsZ(float tfsZ) {
172-
parameters.put(PARAM_TFS_Z, String.valueOf(tfsZ));
173-
return this;
167+
return putScalar(PARAM_TFS_Z, tfsZ);
174168
}
175169

176170
/**
@@ -180,8 +174,7 @@ public InferenceParameters setTfsZ(float tfsZ) {
180174
* @return this builder
181175
*/
182176
public InferenceParameters setTypicalP(float typicalP) {
183-
parameters.put(PARAM_TYPICAL_P, String.valueOf(typicalP));
184-
return this;
177+
return putScalar(PARAM_TYPICAL_P, typicalP);
185178
}
186179

187180
/**
@@ -191,8 +184,7 @@ public InferenceParameters setTypicalP(float typicalP) {
191184
* @return this builder
192185
*/
193186
public InferenceParameters setTemperature(float temperature) {
194-
parameters.put(PARAM_TEMPERATURE, String.valueOf(temperature));
195-
return this;
187+
return putScalar(PARAM_TEMPERATURE, temperature);
196188
}
197189

198190
/**
@@ -202,8 +194,7 @@ public InferenceParameters setTemperature(float temperature) {
202194
* @return this builder
203195
*/
204196
public InferenceParameters setDynamicTemperatureRange(float dynatempRange) {
205-
parameters.put(PARAM_DYNATEMP_RANGE, String.valueOf(dynatempRange));
206-
return this;
197+
return putScalar(PARAM_DYNATEMP_RANGE, dynatempRange);
207198
}
208199

209200
/**
@@ -213,8 +204,7 @@ public InferenceParameters setDynamicTemperatureRange(float dynatempRange) {
213204
* @return this builder
214205
*/
215206
public InferenceParameters setDynamicTemperatureExponent(float dynatempExponent) {
216-
parameters.put(PARAM_DYNATEMP_EXPONENT, String.valueOf(dynatempExponent));
217-
return this;
207+
return putScalar(PARAM_DYNATEMP_EXPONENT, dynatempExponent);
218208
}
219209

220210
/**
@@ -224,8 +214,7 @@ public InferenceParameters setDynamicTemperatureExponent(float dynatempExponent)
224214
* @return this builder
225215
*/
226216
public InferenceParameters setRepeatLastN(int repeatLastN) {
227-
parameters.put(PARAM_REPEAT_LAST_N, String.valueOf(repeatLastN));
228-
return this;
217+
return putScalar(PARAM_REPEAT_LAST_N, repeatLastN);
229218
}
230219

231220
/**
@@ -235,8 +224,7 @@ public InferenceParameters setRepeatLastN(int repeatLastN) {
235224
* @return this builder
236225
*/
237226
public InferenceParameters setRepeatPenalty(float repeatPenalty) {
238-
parameters.put(PARAM_REPEAT_PENALTY, String.valueOf(repeatPenalty));
239-
return this;
227+
return putScalar(PARAM_REPEAT_PENALTY, repeatPenalty);
240228
}
241229

242230
/**
@@ -246,8 +234,7 @@ public InferenceParameters setRepeatPenalty(float repeatPenalty) {
246234
* @return this builder
247235
*/
248236
public InferenceParameters setFrequencyPenalty(float frequencyPenalty) {
249-
parameters.put(PARAM_FREQUENCY_PENALTY, String.valueOf(frequencyPenalty));
250-
return this;
237+
return putScalar(PARAM_FREQUENCY_PENALTY, frequencyPenalty);
251238
}
252239

253240
/**
@@ -257,8 +244,7 @@ public InferenceParameters setFrequencyPenalty(float frequencyPenalty) {
257244
* @return this builder
258245
*/
259246
public InferenceParameters setPresencePenalty(float presencePenalty) {
260-
parameters.put(PARAM_PRESENCE_PENALTY, String.valueOf(presencePenalty));
261-
return this;
247+
return putScalar(PARAM_PRESENCE_PENALTY, presencePenalty);
262248
}
263249

264250
/**
@@ -268,8 +254,7 @@ public InferenceParameters setPresencePenalty(float presencePenalty) {
268254
* @return this builder
269255
*/
270256
public InferenceParameters setMiroStat(MiroStat mirostat) {
271-
parameters.put(PARAM_MIROSTAT, String.valueOf(mirostat.ordinal()));
272-
return this;
257+
return putScalar(PARAM_MIROSTAT, mirostat.ordinal());
273258
}
274259

275260
/**
@@ -279,8 +264,7 @@ public InferenceParameters setMiroStat(MiroStat mirostat) {
279264
* @return this builder
280265
*/
281266
public InferenceParameters setMiroStatTau(float mirostatTau) {
282-
parameters.put(PARAM_MIROSTAT_TAU, String.valueOf(mirostatTau));
283-
return this;
267+
return putScalar(PARAM_MIROSTAT_TAU, mirostatTau);
284268
}
285269

286270
/**
@@ -290,8 +274,7 @@ public InferenceParameters setMiroStatTau(float mirostatTau) {
290274
* @return this builder
291275
*/
292276
public InferenceParameters setMiroStatEta(float mirostatEta) {
293-
parameters.put(PARAM_MIROSTAT_ETA, String.valueOf(mirostatEta));
294-
return this;
277+
return putScalar(PARAM_MIROSTAT_ETA, mirostatEta);
295278
}
296279

297280
/**
@@ -301,8 +284,7 @@ public InferenceParameters setMiroStatEta(float mirostatEta) {
301284
* @return this builder
302285
*/
303286
public InferenceParameters setPenalizeNl(boolean penalizeNl) {
304-
parameters.put(PARAM_PENALIZE_NL, String.valueOf(penalizeNl));
305-
return this;
287+
return putScalar(PARAM_PENALIZE_NL, penalizeNl);
306288
}
307289

308290
/**
@@ -312,8 +294,7 @@ public InferenceParameters setPenalizeNl(boolean penalizeNl) {
312294
* @return this builder
313295
*/
314296
public InferenceParameters setNKeep(int nKeep) {
315-
parameters.put(PARAM_N_KEEP, String.valueOf(nKeep));
316-
return this;
297+
return putScalar(PARAM_N_KEEP, nKeep);
317298
}
318299

319300
/**
@@ -323,8 +304,7 @@ public InferenceParameters setNKeep(int nKeep) {
323304
* @return this builder
324305
*/
325306
public InferenceParameters setSeed(int seed) {
326-
parameters.put(PARAM_SEED, String.valueOf(seed));
327-
return this;
307+
return putScalar(PARAM_SEED, seed);
328308
}
329309

330310
/**
@@ -334,8 +314,7 @@ public InferenceParameters setSeed(int seed) {
334314
* @return this builder
335315
*/
336316
public InferenceParameters setNProbs(int nProbs) {
337-
parameters.put(PARAM_N_PROBS, String.valueOf(nProbs));
338-
return this;
317+
return putScalar(PARAM_N_PROBS, nProbs);
339318
}
340319

341320
/**
@@ -345,8 +324,7 @@ public InferenceParameters setNProbs(int nProbs) {
345324
* @return this builder
346325
*/
347326
public InferenceParameters setMinKeep(int minKeep) {
348-
parameters.put(PARAM_MIN_KEEP, String.valueOf(minKeep));
349-
return this;
327+
return putScalar(PARAM_MIN_KEEP, minKeep);
350328
}
351329

352330
/**
@@ -396,8 +374,7 @@ public InferenceParameters setPenaltyPrompt(int[] tokens) {
396374
* @return this builder
397375
*/
398376
public InferenceParameters setIgnoreEos(boolean ignoreEos) {
399-
parameters.put(PARAM_IGNORE_EOS, String.valueOf(ignoreEos));
400-
return this;
377+
return putScalar(PARAM_IGNORE_EOS, ignoreEos);
401378
}
402379

403380
/**
@@ -513,8 +490,7 @@ public InferenceParameters setSamplers(Sampler... samplers) {
513490
* @return this builder
514491
*/
515492
public InferenceParameters setUseChatTemplate(boolean useChatTemplate) {
516-
parameters.put(PARAM_USE_JINJA, String.valueOf(useChatTemplate));
517-
return this;
493+
return putScalar(PARAM_USE_JINJA, useChatTemplate);
518494
}
519495

520496
/**
@@ -570,8 +546,7 @@ public InferenceParameters setMessages(String systemMessage, List<Pair<String, S
570546
* @return this builder
571547
*/
572548
public InferenceParameters setTopNSigma(float topNSigma) {
573-
parameters.put(PARAM_TOP_N_SIGMA, String.valueOf(topNSigma));
574-
return this;
549+
return putScalar(PARAM_TOP_N_SIGMA, topNSigma);
575550
}
576551

577552
/**
@@ -596,8 +571,7 @@ public InferenceParameters setReasoningFormat(ReasoningFormat reasoningFormat) {
596571
* @return this builder
597572
*/
598573
public InferenceParameters setReasoningBudgetTokens(int budgetTokens) {
599-
parameters.put(PARAM_REASONING_BUDGET_TOKENS, String.valueOf(budgetTokens));
600-
return this;
574+
return putScalar(PARAM_REASONING_BUDGET_TOKENS, budgetTokens);
601575
}
602576

603577
/**
@@ -610,8 +584,7 @@ public InferenceParameters setReasoningBudgetTokens(int budgetTokens) {
610584
* @return this builder
611585
*/
612586
public InferenceParameters setContinueFinalMessage(boolean continueFinalMessage) {
613-
parameters.put(PARAM_CONTINUE_FINAL_MESSAGE, String.valueOf(continueFinalMessage));
614-
return this;
587+
return putScalar(PARAM_CONTINUE_FINAL_MESSAGE, continueFinalMessage);
615588
}
616589

617590
/**
@@ -630,8 +603,7 @@ public InferenceParameters setContinueFinalMessage(ContinuationMode mode) {
630603
}
631604

632605
InferenceParameters setStream(boolean stream) {
633-
parameters.put(PARAM_STREAM, String.valueOf(stream));
634-
return this;
606+
return putScalar(PARAM_STREAM, stream);
635607
}
636608

637609
}

src/main/java/net/ladenthin/llama/JsonParameters.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package net.ladenthin.llama;
77

8+
import net.ladenthin.llama.args.CliArg;
89
import net.ladenthin.llama.json.ParameterJsonSerializer;
910

1011
import java.util.HashMap;
@@ -49,4 +50,37 @@ String toJsonString(String text) {
4950
if (text == null) return null;
5051
return serializer.toJsonString(text);
5152
}
53+
54+
/**
55+
* Store a scalar value (typically a primitive: int, long, float, double, boolean)
56+
* for the given key using {@link String#valueOf(Object)} and return this builder
57+
* typed as the concrete subtype so callers can collapse the
58+
* {@code parameters.put(...); return this;} pair into a single
59+
* {@code return putScalar(...);}.
60+
*
61+
* @param key the parameter key
62+
* @param value the scalar value; autoboxed at the call site
63+
* @param <T> the concrete subtype of this builder
64+
* @return this builder
65+
*/
66+
@SuppressWarnings("unchecked")
67+
protected final <T extends JsonParameters> T putScalar(String key, Object value) {
68+
parameters.put(key, String.valueOf(value));
69+
return (T) this;
70+
}
71+
72+
/**
73+
* Store the CLI-argument string of the given enum constant for the given key and
74+
* return this builder typed as the concrete subtype.
75+
*
76+
* @param key the parameter key
77+
* @param value the enum constant; must implement {@link CliArg}
78+
* @param <T> the concrete subtype of this builder
79+
* @return this builder
80+
*/
81+
@SuppressWarnings("unchecked")
82+
protected final <T extends JsonParameters> T putEnum(String key, CliArg value) {
83+
parameters.put(key, value.getArgValue());
84+
return (T) this;
85+
}
5286
}

0 commit comments

Comments
 (0)