diff --git a/README.md b/README.md index e944e5f..697a384 100644 --- a/README.md +++ b/README.md @@ -172,16 +172,17 @@ server: ```yaml instances: - port_range: [8000, 9000] # Port range for instances (default: [8000, 9000]) - data_dir: "~/.local/share/llamactl" # Directory for all llamactl data (default varies by OS) - configs_dir: "~/.local/share/llamactl/instances" # Directory for instance configs (default: data_dir/instances) - logs_dir: "~/.local/share/llamactl/logs" # Directory for instance logs (default: data_dir/logs) - auto_create_dirs: true # Automatically create data/config/logs directories (default: true) - max_instances: -1 # Maximum instances (-1 = unlimited) - llama_executable: "llama-server" # Path to llama-server executable - default_auto_restart: true # Default auto-restart setting - default_max_restarts: 3 # Default maximum restart attempts - default_restart_delay: 5 # Default restart delay in seconds + port_range: [8000, 9000] # Port range for instances (default: [8000, 9000]) + data_dir: "~/.local/share/llamactl" # Directory for all llamactl data (default varies by OS) + configs_dir: "~/.local/share/llamactl/instances" # Directory for instance configs (default: data_dir/instances) + logs_dir: "~/.local/share/llamactl/logs" # Directory for instance logs (default: data_dir/logs) + auto_create_dirs: true # Automatically create data/config/logs directories (default: true) + max_instances: -1 # Maximum instances (-1 = unlimited) + llama_executable: "llama-server" # Path to llama-server executable + default_auto_restart: true # Default auto-restart setting + default_max_restarts: 3 # Default maximum restart attempts + default_restart_delay: 5 # Default restart delay in seconds + timeout_check_interval: 5 # Default instance timeout check interval in minutes ``` **Environment Variables:** @@ -195,6 +196,7 @@ instances: - `LLAMACTL_DEFAULT_AUTO_RESTART` - Default auto-restart setting (true/false) - `LLAMACTL_DEFAULT_MAX_RESTARTS` - Default maximum restarts - `LLAMACTL_DEFAULT_RESTART_DELAY` - Default restart delay in seconds +- `LLAMACTL_TIMEOUT_CHECK_INTERVAL` - Default instance timeout check interval in minutes #### Authentication Configuration diff --git a/pkg/config/config.go b/pkg/config/config.go index fd33715..386a708 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -66,6 +66,9 @@ type InstancesConfig struct { // Default restart delay for new instances (in seconds) DefaultRestartDelay int `yaml:"default_restart_delay"` + + // Interval for checking instance timeouts (in minutes) + TimeoutCheckInterval int `yaml:"timeout_check_interval"` } // AuthConfig contains authentication settings @@ -98,16 +101,17 @@ func LoadConfig(configPath string) (AppConfig, error) { EnableSwagger: false, }, Instances: InstancesConfig{ - PortRange: [2]int{8000, 9000}, - DataDir: getDefaultDataDirectory(), - InstancesDir: filepath.Join(getDefaultDataDirectory(), "instances"), - LogsDir: filepath.Join(getDefaultDataDirectory(), "logs"), - AutoCreateDirs: true, - MaxInstances: -1, // -1 means unlimited - LlamaExecutable: "llama-server", - DefaultAutoRestart: true, - DefaultMaxRestarts: 3, - DefaultRestartDelay: 5, + PortRange: [2]int{8000, 9000}, + DataDir: getDefaultDataDirectory(), + InstancesDir: filepath.Join(getDefaultDataDirectory(), "instances"), + LogsDir: filepath.Join(getDefaultDataDirectory(), "logs"), + AutoCreateDirs: true, + MaxInstances: -1, // -1 means unlimited + LlamaExecutable: "llama-server", + DefaultAutoRestart: true, + DefaultMaxRestarts: 3, + DefaultRestartDelay: 5, + TimeoutCheckInterval: 5, // Check timeouts every 5 minutes }, Auth: AuthConfig{ RequireInferenceAuth: true, @@ -217,6 +221,11 @@ func loadEnvVars(cfg *AppConfig) { cfg.Instances.DefaultRestartDelay = seconds } } + if timeoutCheckInterval := os.Getenv("LLAMACTL_TIMEOUT_CHECK_INTERVAL"); timeoutCheckInterval != "" { + if minutes, err := strconv.Atoi(timeoutCheckInterval); err == nil { + cfg.Instances.TimeoutCheckInterval = minutes + } + } // Auth config if requireInferenceAuth := os.Getenv("LLAMACTL_REQUIRE_INFERENCE_AUTH"); requireInferenceAuth != "" { if b, err := strconv.ParseBool(requireInferenceAuth); err == nil { diff --git a/pkg/instance/instance.go b/pkg/instance/instance.go index 2f795a1..7d5d7c5 100644 --- a/pkg/instance/instance.go +++ b/pkg/instance/instance.go @@ -124,7 +124,7 @@ func validateAndCopyOptions(name string, options *CreateInstanceOptions) *Create if options.IdleTimeout != nil { idleTimeout := *options.IdleTimeout if idleTimeout < 0 { - log.Printf("Instance %s IdleTimeout value (%d) cannot be negative, setting to 0 seconds", name, idleTimeout) + log.Printf("Instance %s IdleTimeout value (%d) cannot be negative, setting to 0 minutes", name, idleTimeout) idleTimeout = 0 } optionsCopy.IdleTimeout = &idleTimeout @@ -156,7 +156,7 @@ func applyDefaultOptions(options *CreateInstanceOptions, globalSettings *config. } if options.IdleTimeout == nil { - defaultIdleTimeout := 0 // Default to 0 seconds if not set + defaultIdleTimeout := 0 options.IdleTimeout = &defaultIdleTimeout } } diff --git a/pkg/instance/timeout.go b/pkg/instance/timeout.go new file mode 100644 index 0000000..1807170 --- /dev/null +++ b/pkg/instance/timeout.go @@ -0,0 +1 @@ +package instance