Refactor command argument building across backends

This commit is contained in:
2025-09-19 19:46:54 +02:00
parent 9eecb37aec
commit ec5485bd0e
4 changed files with 209 additions and 176 deletions

View File

@@ -2,9 +2,9 @@ package llamacpp
import (
"encoding/json"
"llamactl/pkg/backends"
"reflect"
"strconv"
"strings"
)
type LlamaServerOptions struct {
@@ -313,64 +313,10 @@ func (o *LlamaServerOptions) UnmarshalJSON(data []byte) error {
return nil
}
// BuildCommandArgs converts InstanceOptions to command line arguments
// BuildCommandArgs converts InstanceOptions to command line arguments using the common builder
func (o *LlamaServerOptions) BuildCommandArgs() []string {
var args []string
v := reflect.ValueOf(o).Elem()
t := v.Type()
for i := 0; i < v.NumField(); i++ {
field := v.Field(i)
fieldType := t.Field(i)
// Skip unexported fields
if !field.CanInterface() {
continue
}
// Get the JSON tag to determine the flag name
jsonTag := fieldType.Tag.Get("json")
if jsonTag == "" || jsonTag == "-" {
continue
}
// Remove ",omitempty" from the tag
flagName := jsonTag
if commaIndex := strings.Index(jsonTag, ","); commaIndex != -1 {
flagName = jsonTag[:commaIndex]
}
// Convert snake_case to kebab-case for CLI flags
flagName = strings.ReplaceAll(flagName, "_", "-")
// Add the appropriate arguments based on field type and value
switch field.Kind() {
case reflect.Bool:
if field.Bool() {
args = append(args, "--"+flagName)
}
case reflect.Int:
if field.Int() != 0 {
args = append(args, "--"+flagName, strconv.FormatInt(field.Int(), 10))
}
case reflect.Float64:
if field.Float() != 0 {
args = append(args, "--"+flagName, strconv.FormatFloat(field.Float(), 'f', -1, 64))
}
case reflect.String:
if field.String() != "" {
args = append(args, "--"+flagName, field.String())
}
case reflect.Slice:
if field.Type().Elem().Kind() == reflect.String {
// Handle []string fields
for j := 0; j < field.Len(); j++ {
args = append(args, "--"+flagName, field.Index(j).String())
}
}
}
config := backends.ArgsBuilderConfig{
SliceHandling: backends.SliceAsMultipleFlags, // Llama uses multiple flags for arrays
}
return args
return backends.BuildCommandArgs(o, config)
}