@@ -12,6 +12,7 @@ import (
1212 "math"
1313 "os"
1414 "path/filepath"
15+ "reflect"
1516 "strings"
1617
1718 "github.com/LM4eu/goinfer/gie"
@@ -228,54 +229,105 @@ func (cfg *Cfg) setSwapModels() {
228229 }
229230
230231 for model , flags := range cfg .ExtraModels {
232+ gi := true
233+ mc := commonMC
231234 switch {
232235 case flags == "" :
233- cfg .addModelCfg (model , "${cmd-common} -hf " + model , commonMC )
234- cfg .addModelCfg (A_ + model , "${cmd-goinfer} -hf " + model , goinferMC )
236+ flags = "-hf " + model
235237 case strings .HasPrefix (flags , "--embd-" ):
236- cfg . addModelCfg ( model , "${cmd-common} " + flags , commonMC )
238+ gi = false
237239 case strings .HasPrefix (flags , "--fim-" ):
238- cfg .addModelCfg (model , "${cmd-common} " + flags , fimMC )
239- case strings .Contains (flags , "-m " ), strings .Contains (flags , "-hf " ):
240- cfg .addModelCfg (model , "${cmd-common} " + flags , commonMC )
241- cfg .addModelCfg (A_ + model , "${cmd-goinfer} " + flags , goinferMC )
240+ mc = fimMC
241+ gi = false
242242 default :
243- cfg .addModelCfg (model , "${cmd-common} -hf " + model + " " + flags , commonMC )
244- cfg .addModelCfg (A_ + model , "${cmd-goinfer} -hf " + model + " " + flags , goinferMC )
243+ }
244+ cfg .addModelCfg (model , "${cmd-common}" , flags , mc )
245+ if gi {
246+ goinferMC .UseModelName = model // overrides the model name that is sent to /upstream server
247+ cfg .addModelCfg (A_ + model , "${cmd-goinfer}" , flags , goinferMC )
245248 }
246249 }
247250
248251 // For each model, set two model settings:
249252 // 1. for the OpenAI endpoints
250253 // 2. for the /completion endpoint (prefix with A_ and hide the model)
251- for name , mi := range info {
252- goinferMC .UseModelName = name // overrides the model name that is sent to /upstream server
253- args := " " + mi .Flags + " -m " + mi .Path
254- cfg .addModelCfg (name , "${cmd-common}" + args , commonMC ) // API for Cline, RooCode, RolePlay...
255- cfg .addModelCfg (A_ + name , "${cmd-goinfer}" + args , goinferMC ) // API for Agent-Smith...
254+ for model , mi := range info {
255+ goinferMC .UseModelName = model // overrides the model name that is sent to /upstream server
256+ flags := mi .Flags + " -m " + mi .Path
257+ cfg .addModelCfg (model , "${cmd-common}" , flags , commonMC ) // API for Cline, RooCode, RolePlay...
258+ cfg .addModelCfg (A_ + model , "${cmd-goinfer}" , flags , goinferMC ) // API for Agent-Smith...
256259 }
257260}
258261
259262// Add the model settings within the llama-swap configuration.
260- func (cfg * Cfg ) addModelCfg (modelName , cmd string , mc * config.ModelConfig ) {
261- mCfg := * mc // copy
262- mCfg .Cmd = cmd
263-
264- mCfg .CheckEndpoint = "/health"
265- if strings .Contains (cmd , " -hf " ) {
266- // -hf may download a model for a while
267- // but /health check will stop it,
268- // so better to disable /health check
269- mCfg .CheckEndpoint = "none"
263+ func (cfg * Cfg ) addModelCfg (model , cmd , flags string , mc * config.ModelConfig ) {
264+ nMC := * mc // copy
265+
266+ nMC .CheckEndpoint = "/health"
267+ nMC .Cmd = cmd
268+ if flags != "" {
269+ nMC .Cmd += " " + flags
270+ if strings .Contains (flags , " -hf " ) {
271+ // -hf may download a model for a while
272+ // but /health check will stop it,
273+ // so better to disable /health check
274+ nMC .CheckEndpoint = "none"
275+ }
270276 }
271277
272- old , ok := cfg .Swap .Models [modelName ]
278+ model = strings .Replace (model , "-GGUF" , "" , 1 )
279+ old , ok := cfg .Swap .Models [model ]
273280 if ok {
274- slog .Debug ("Overwrite config" , "old" , old )
275- slog .Debug ("Overwrite config" , "new" , modelName )
281+ merge (& old , & nMC , flags )
282+ }
283+ cfg .Swap .Models [model ] = nMC
284+ }
285+
286+ // Add the model settings within the llama-swap configuration.
287+ func merge (old , mc * config.ModelConfig , newFlags string ) {
288+ if reflect .DeepEqual (old .Cmd , mc .Cmd ) {
289+ return // same values
290+ }
291+
292+ if old .Cmd == mc .Cmd {
293+ slog .Debug ("Overwrite but same" , "cmd" , old .Cmd )
294+ return
295+ }
296+
297+ if newFlags == "" {
298+ slog .Debug ("Empty flags => Skip new, keep" , "old" , old .Cmd )
299+ * mc = * old
300+ return
301+ }
302+
303+ oH := strings .Contains (old .Cmd , " -hf " )
304+ nH := strings .Contains (newFlags , "-hf " )
305+ oM := strings .Contains (old .Cmd , " -m " )
306+ nM := strings .Contains (newFlags , "-m " )
307+
308+ if oH && oM {
309+ slog .Warn ("Overwrite. Cannot use both -hf and -m" , "cmd" , old .Cmd )
310+ return
311+ }
312+ if nH && nM {
313+ slog .Warn ("Overwrite. Cannot use both -hf and -m" , "flags" , newFlags )
314+ * mc = * old
315+ return
316+ }
317+ if oH && nM {
318+ slog .Debug ("Skip -hf (old) to use -m (new)" , "old" , old .Cmd , "new" , mc .Cmd )
319+ return
320+ }
321+ if nH && oM {
322+ slog .Debug ("Skip -hf (new) to use -m (old)" , "old" , old .Cmd , "new" , mc .Cmd )
323+ * mc = * old
324+ return
276325 }
277326
278- cfg .Swap .Models [modelName ] = mCfg
327+ slog .Info ("Merge" , "old" , old .Cmd )
328+ slog .Info ("Merge" , "new" , mc .Cmd )
329+ mc .Cmd = old .Cmd + " " + newFlags
330+ slog .Info ("Merge" , "both" , mc .Cmd )
279331}
280332
281333func (cfg * Cfg ) setAPIKey (debug , noAPIKey bool ) {
0 commit comments