From 7b4adfa0cdb12aa7d35fffc53cd97b9f6ff0ac5c Mon Sep 17 00:00:00 2001 From: LordMathis Date: Wed, 20 Aug 2025 13:50:43 +0200 Subject: [PATCH] Add DefaultOnDemandStart configuration and update instance options --- pkg/config/config.go | 9 +++++++++ pkg/instance/instance.go | 24 +++++++++++++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/pkg/config/config.go b/pkg/config/config.go index 386a708..1e2694e 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -67,6 +67,9 @@ type InstancesConfig struct { // Default restart delay for new instances (in seconds) DefaultRestartDelay int `yaml:"default_restart_delay"` + // Default on-demand start setting for new instances + DefaultOnDemandStart bool `yaml:"default_on_demand_start"` + // Interval for checking instance timeouts (in minutes) TimeoutCheckInterval int `yaml:"timeout_check_interval"` } @@ -111,6 +114,7 @@ func LoadConfig(configPath string) (AppConfig, error) { DefaultAutoRestart: true, DefaultMaxRestarts: 3, DefaultRestartDelay: 5, + DefaultOnDemandStart: false, TimeoutCheckInterval: 5, // Check timeouts every 5 minutes }, Auth: AuthConfig{ @@ -221,6 +225,11 @@ func loadEnvVars(cfg *AppConfig) { cfg.Instances.DefaultRestartDelay = seconds } } + if onDemandStart := os.Getenv("LLAMACTL_DEFAULT_ON_DEMAND_START"); onDemandStart != "" { + if b, err := strconv.ParseBool(onDemandStart); err == nil { + cfg.Instances.DefaultOnDemandStart = b + } + } if timeoutCheckInterval := os.Getenv("LLAMACTL_TIMEOUT_CHECK_INTERVAL"); timeoutCheckInterval != "" { if minutes, err := strconv.Atoi(timeoutCheckInterval); err == nil { cfg.Instances.TimeoutCheckInterval = minutes diff --git a/pkg/instance/instance.go b/pkg/instance/instance.go index 5ff4bf5..f690ca1 100644 --- a/pkg/instance/instance.go +++ b/pkg/instance/instance.go @@ -34,7 +34,9 @@ type CreateInstanceOptions struct { AutoRestart *bool `json:"auto_restart,omitempty"` MaxRestarts *int `json:"max_restarts,omitempty"` RestartDelay *int `json:"restart_delay,omitempty"` - // Timeout + // On demand start + OnDemandStart *bool `json:"on_demand_start,omitempty"` + // Idle timeout IdleTimeout *int `json:"idle_timeout,omitempty"` // LlamaServerOptions contains the options for the llama server llamacpp.LlamaServerOptions `json:",inline"` @@ -46,10 +48,11 @@ type CreateInstanceOptions struct { func (c *CreateInstanceOptions) UnmarshalJSON(data []byte) error { // First, unmarshal into a temporary struct without the embedded type type tempCreateOptions struct { - AutoRestart *bool `json:"auto_restart,omitempty"` - MaxRestarts *int `json:"max_restarts,omitempty"` - RestartDelay *int `json:"restart_delay,omitempty"` - IdleTimeout *int `json:"idle_timeout,omitempty"` + AutoRestart *bool `json:"auto_restart,omitempty"` + MaxRestarts *int `json:"max_restarts,omitempty"` + RestartDelay *int `json:"restart_delay,omitempty"` + OnDemandStart *bool `json:"on_demand_start,omitempty"` + IdleTimeout *int `json:"idle_timeout,omitempty"` } var temp tempCreateOptions @@ -61,6 +64,7 @@ func (c *CreateInstanceOptions) UnmarshalJSON(data []byte) error { c.AutoRestart = temp.AutoRestart c.MaxRestarts = temp.MaxRestarts c.RestartDelay = temp.RestartDelay + c.OnDemandStart = temp.OnDemandStart c.IdleTimeout = temp.IdleTimeout // Now unmarshal the embedded LlamaServerOptions @@ -138,6 +142,11 @@ func validateAndCopyOptions(name string, options *CreateInstanceOptions) *Create optionsCopy.RestartDelay = &restartDelay } + if options.OnDemandStart != nil { + onDemandStart := *options.OnDemandStart + optionsCopy.OnDemandStart = &onDemandStart + } + if options.IdleTimeout != nil { idleTimeout := *options.IdleTimeout if idleTimeout < 0 { @@ -172,6 +181,11 @@ func applyDefaultOptions(options *CreateInstanceOptions, globalSettings *config. options.RestartDelay = &defaultRestartDelay } + if options.OnDemandStart == nil { + defaultOnDemandStart := globalSettings.DefaultOnDemandStart + options.OnDemandStart = &defaultOnDemandStart + } + if options.IdleTimeout == nil { defaultIdleTimeout := 0 options.IdleTimeout = &defaultIdleTimeout