diff --git a/AGENTS.md b/AGENTS.md index 1bd9e6f..ccef692 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -78,7 +78,7 @@ import ( "gopkg.in/yaml.v3" - "github.com/fvigneault/smart-llama/internal/config" + "github.com/smartfrog/smart-llama/internal/config" ) ``` diff --git a/cmd/smart-llama/main.go b/cmd/smart-llama/main.go index d48a25c..0e88aee 100644 --- a/cmd/smart-llama/main.go +++ b/cmd/smart-llama/main.go @@ -1,6 +1,7 @@ package main import ( + "flag" "fmt" "log" "log/slog" @@ -9,16 +10,31 @@ import ( "os/signal" "syscall" - "github.com/fvigneault/smart-llama/internal/config" - "github.com/fvigneault/smart-llama/internal/process" - "github.com/fvigneault/smart-llama/internal/proxy" - "github.com/fvigneault/smart-llama/internal/server" + "github.com/smartfrog/smart-llama/internal/config" + "github.com/smartfrog/smart-llama/internal/process" + "github.com/smartfrog/smart-llama/internal/proxy" + "github.com/smartfrog/smart-llama/internal/server" ) +const defaultConfigPath = "config.yaml" + type App struct { - config *config.Config - log *slog.Logger - models map[string]*config.ModelConfig + configPath string + config *config.Config + log *slog.Logger + models map[string]*config.ModelConfig +} + +// resolveConfigPath returns the config path based on priority: +// flagValue > envValue > defaultConfigPath +func resolveConfigPath(flagValue, envValue string) string { + if flagValue != "" { + return flagValue + } + if envValue != "" { + return envValue + } + return defaultConfigPath } func NewApp() *App { @@ -30,7 +46,7 @@ func NewApp() *App { func (a *App) loadConfig() error { loader := config.NewLoader() - cfg, err := loader.LoadConfig("config.yaml") + cfg, err := loader.LoadConfig(a.configPath) if err != nil { return err } @@ -98,7 +114,12 @@ func (a *App) run() error { } func main() { + configFlag := flag.String("config", "", "path to configuration file") + flag.Parse() + app := NewApp() + app.configPath = resolveConfigPath(*configFlag, os.Getenv("SL_CONFIG")) + if err := app.loadConfig(); err != nil { log.Fatal(err) } diff --git a/cmd/smart-llama/main_test.go b/cmd/smart-llama/main_test.go index d98129b..1211f79 100644 --- a/cmd/smart-llama/main_test.go +++ b/cmd/smart-llama/main_test.go @@ -11,3 +11,37 @@ func TestNewApp(t *testing.T) { t.Fatal("NewApp() returned nil") } } + +func TestResolveConfigPath(t *testing.T) { + t.Run("flag takes priority over env and default", func(t *testing.T) { + got := resolveConfigPath("/from/flag", "/from/env") + want := "/from/flag" + if got != want { + t.Errorf("got %q, want %q", got, want) + } + }) + + t.Run("env takes priority over default when no flag", func(t *testing.T) { + got := resolveConfigPath("", "/from/env") + want := "/from/env" + if got != want { + t.Errorf("got %q, want %q", got, want) + } + }) + + t.Run("returns default when no flag and no env", func(t *testing.T) { + got := resolveConfigPath("", "") + want := defaultConfigPath + if got != want { + t.Errorf("got %q, want %q", got, want) + } + }) + + t.Run("flag with empty env uses flag", func(t *testing.T) { + got := resolveConfigPath("/custom/path", "") + want := "/custom/path" + if got != want { + t.Errorf("got %q, want %q", got, want) + } + }) +} diff --git a/go.mod b/go.mod index 204f6d7..c693d57 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/fvigneault/smart-llama +module github.com/smartfrog/smart-llama go 1.25.0 diff --git a/internal/process/manager.go b/internal/process/manager.go index d761439..41f3655 100644 --- a/internal/process/manager.go +++ b/internal/process/manager.go @@ -12,7 +12,7 @@ import ( "syscall" "time" - "github.com/fvigneault/smart-llama/internal/config" + "github.com/smartfrog/smart-llama/internal/config" ) // Manager manages the llama-server subprocess lifecycle. diff --git a/internal/process/manager_test.go b/internal/process/manager_test.go index 4ecff1a..5d7cd8a 100644 --- a/internal/process/manager_test.go +++ b/internal/process/manager_test.go @@ -10,7 +10,7 @@ import ( "testing" "time" - "github.com/fvigneault/smart-llama/internal/config" + "github.com/smartfrog/smart-llama/internal/config" ) func TestNewManager(t *testing.T) { diff --git a/internal/server/server.go b/internal/server/server.go index 3e32ccd..b35f3ea 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -7,8 +7,8 @@ import ( "net/http" "sync" - "github.com/fvigneault/smart-llama/internal/config" - "github.com/fvigneault/smart-llama/internal/proxy" + "github.com/smartfrog/smart-llama/internal/config" + "github.com/smartfrog/smart-llama/internal/proxy" ) // Server manages the HTTP server. diff --git a/internal/server/server_test.go b/internal/server/server_test.go index 5b0f4a9..a6d5beb 100644 --- a/internal/server/server_test.go +++ b/internal/server/server_test.go @@ -7,7 +7,7 @@ import ( "net/http/httptest" "testing" - "github.com/fvigneault/smart-llama/internal/config" + "github.com/smartfrog/smart-llama/internal/config" ) func TestHandleModelsList(t *testing.T) {