Files
goclaw/cmd/setup_provider.go

118 lines
2.6 KiB
Go

package cmd
import (
"fmt"
"net/url"
"os"
)
// setupProviderStep guides the user through provider configuration.
func setupProviderStep() {
fmt.Println("── Step 1: Providers ──")
fmt.Println()
providers, err := fetchProviders()
if err != nil {
fmt.Fprintf(os.Stderr, "Error fetching providers: %v\n", err)
return
}
if len(providers) > 0 {
fmt.Printf(" Found %d existing provider(s):\n", len(providers))
for _, p := range providers {
fmt.Printf(" - %s (%s)\n", p.Name, p.ProviderType)
}
fmt.Println()
addMore, err := promptConfirm("Add another provider?", false)
if err != nil || !addMore {
return
}
} else {
fmt.Println(" No providers configured yet. Let's add one.")
fmt.Println()
}
for {
addProvider()
another, err := promptConfirm("Add another provider?", false)
if err != nil || !another {
break
}
}
}
func addProvider() {
typeOptions := []SelectOption[string]{
{"Anthropic", "anthropic"},
{"OpenAI", "openai"},
{"OpenRouter", "openrouter"},
{"DashScope (Alibaba)", "dashscope"},
{"OpenAI-compatible", "openai-compat"},
}
providerType, err := promptSelect("Provider type", typeOptions, 0)
if err != nil {
return
}
name, err := promptString("Provider name", "", providerType)
if err != nil {
return
}
apiKey, err := promptPassword("API key", "will be encrypted at rest")
if err != nil || apiKey == "" {
fmt.Println(" Skipped (no API key).")
return
}
baseURL := ""
if providerType == "openai-compat" {
baseURL, err = promptString("Base URL", "e.g. https://api.example.com/v1", "")
if err != nil {
return
}
}
body := map[string]any{
"name": name,
"provider_type": providerType,
"api_key": apiKey,
"enabled": true,
}
if baseURL != "" {
body["base_url"] = baseURL
}
resp, err := gatewayHTTPPost("/v1/providers", body)
if err != nil {
fmt.Fprintf(os.Stderr, " Error: %v\n", err)
return
}
providerID, _ := resp["id"].(string)
fmt.Printf(" Provider %q created.\n", name)
// Auto-verify (ping mode — empty body)
if providerID != "" {
fmt.Print(" Verifying... ")
verifyResp, err := gatewayHTTPPost("/v1/providers/"+url.PathEscape(providerID)+"/verify", nil)
if err != nil {
fmt.Printf("FAILED (%v)\n", err)
return
}
if valid, _ := verifyResp["valid"].(bool); valid {
fmt.Println("OK")
} 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'.")
}
}
fmt.Println()
}