mirror of
https://github.com/tiennm99/goclaw.git
synced 2026-07-25 06:21:10 +00:00
118 lines
2.6 KiB
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()
|
|
}
|