From ad232d3e9c4c0a7a51f91fc7a71e22daadb035cd Mon Sep 17 00:00:00 2001 From: viettranx Date: Mon, 27 Apr 2026 12:00:11 +0700 Subject: [PATCH] fix(cli): providers verify --model flag + onboard parser (#1034) --- cmd/providers_cmd.go | 46 ++++++++++++++++++++----------------------- cmd/setup_provider.go | 13 +++++------- 2 files changed, 26 insertions(+), 33 deletions(-) diff --git a/cmd/providers_cmd.go b/cmd/providers_cmd.go index 77e988f7..4ad8581e 100644 --- a/cmd/providers_cmd.go +++ b/cmd/providers_cmd.go @@ -181,7 +181,7 @@ func runProvidersAdd() { if providerID != "" { verify, err := promptConfirm("Verify connection now?", true) if err == nil && verify { - runProviderVerify(providerID) + runProviderVerify(providerID, "") } } } @@ -266,45 +266,41 @@ func providersDeleteCmd() *cobra.Command { } func providersVerifyCmd() *cobra.Command { - return &cobra.Command{ + var modelFlag string + cmd := &cobra.Command{ Use: "verify ", - Short: "Verify provider connectivity and list models", + Short: "Verify provider connectivity (ping) or a specific model", + Long: "Without --model: pings the provider (registered + reachable check).\nWith --model: sends a small chat request to validate the model alias.", Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { requireRunningGatewayHTTP() - runProviderVerify(args[0]) + runProviderVerify(args[0], modelFlag) }, } + cmd.Flags().StringVar(&modelFlag, "model", "", "model alias to verify (omit for connectivity ping)") + return cmd } -func runProviderVerify(providerID string) { +func runProviderVerify(providerID, model string) { fmt.Print("Verifying provider... ") - resp, err := gatewayHTTPPost("/v1/providers/"+url.PathEscape(providerID)+"/verify", nil) + var body any + if model != "" { + body = map[string]string{"model": model} + } + resp, err := gatewayHTTPPost("/v1/providers/"+url.PathEscape(providerID)+"/verify", body) if err != nil { fmt.Printf("FAILED\n %v\n", err) return } - - if ok, _ := resp["success"].(bool); ok { + if valid, _ := resp["valid"].(bool); valid { fmt.Println("OK") - // Show available models - raw, _ := json.Marshal(resp["models"]) - var models []httpProviderModel - if json.Unmarshal(raw, &models) == nil && len(models) > 0 { - fmt.Printf(" Available models: %d\n", len(models)) - limit := 10 - for i, m := range models { - if i >= limit { - fmt.Printf(" ... and %d more\n", len(models)-limit) - break - } - fmt.Printf(" - %s\n", m.ID) - } - } - } else { - msg, _ := resp["error"].(string) - fmt.Printf("FAILED\n %s\n", msg) + return } + msg, _ := resp["error"].(string) + if msg == "" { + msg = "verification failed" + } + fmt.Printf("FAILED\n %s\n", msg) } // defaultBaseURL returns the default API base URL for a provider type. diff --git a/cmd/setup_provider.go b/cmd/setup_provider.go index 9a5fd2ee..0e9ffbee 100644 --- a/cmd/setup_provider.go +++ b/cmd/setup_provider.go @@ -1,7 +1,6 @@ package cmd import ( - "encoding/json" "fmt" "net/url" "os" @@ -95,7 +94,7 @@ func addProvider() { providerID, _ := resp["id"].(string) fmt.Printf(" Provider %q created.\n", name) - // Auto-verify + // Auto-verify (ping mode — empty body) if providerID != "" { fmt.Print(" Verifying... ") verifyResp, err := gatewayHTTPPost("/v1/providers/"+url.PathEscape(providerID)+"/verify", nil) @@ -103,15 +102,13 @@ func addProvider() { fmt.Printf("FAILED (%v)\n", err) return } - if ok, _ := verifyResp["success"].(bool); ok { + if valid, _ := verifyResp["valid"].(bool); valid { fmt.Println("OK") - raw, _ := json.Marshal(verifyResp["models"]) - var models []httpProviderModel - if json.Unmarshal(raw, &models) == nil { - fmt.Printf(" %d models available.\n", len(models)) - } } else { msg, _ := verifyResp["error"].(string) + if msg == "" { + msg = "verification failed" + } fmt.Printf("FAILED (%s)\n", msg) fmt.Println(" You can update the API key later with 'goclaw providers update'.") }