skabandclient: fix handling of empty skaband-addr
This had regressed considerably.
Fixes #96
Co-Authored-By: sketch <hello@sketch.dev>
Change-ID: s4d698cae3417a4f9k
diff --git a/cmd/sketch/main.go b/cmd/sketch/main.go
index b9caf9d..08f8cd8 100644
--- a/cmd/sketch/main.go
+++ b/cmd/sketch/main.go
@@ -1,6 +1,7 @@
package main
import (
+ "cmp"
"context"
"flag"
"fmt"
@@ -149,6 +150,7 @@
oneShot bool
prompt string
modelName string
+ llmAPIKey string
listModels bool
verbose bool
version bool
@@ -186,6 +188,7 @@
flag.BoolVar(&flags.oneShot, "one-shot", false, "exit after the first turn without termui")
flag.StringVar(&flags.prompt, "prompt", "", "prompt to send to sketch")
flag.StringVar(&flags.modelName, "model", "claude", "model to use (e.g. claude, gpt4.1)")
+ flag.StringVar(&flags.llmAPIKey, "llm-api-key", "", "API key for the LLM provider; if not set, will be read from an env var")
flag.BoolVar(&flags.listModels, "list-models", false, "list all available models and exit")
flag.BoolVar(&flags.verbose, "verbose", false, "enable verbose output")
flag.BoolVar(&flags.version, "version", false, "print the version and exit")
@@ -244,13 +247,16 @@
}
// Get credentials and connect to skaband if needed
- privKey, err := skabandclient.LoadOrCreatePrivateKey(skabandclient.DefaultKeyPath())
- if err != nil {
- return err
- }
- pubKey, modelURL, apiKey, err := skabandclient.Login(os.Stdout, privKey, flags.skabandAddr, flags.sessionID, flags.modelName)
- if err != nil {
- return err
+ var pubKey, modelURL, apiKey string
+ if flags.skabandAddr != "" {
+ privKey, err := skabandclient.LoadOrCreatePrivateKey(skabandclient.DefaultKeyPath())
+ if err != nil {
+ return err
+ }
+ pubKey, modelURL, apiKey, err = skabandclient.Login(os.Stdout, privKey, flags.skabandAddr, flags.sessionID, flags.modelName)
+ if err != nil {
+ return err
+ }
}
// Get current working directory
@@ -303,7 +309,7 @@
// with access to outside environment variables.
func runInContainerMode(ctx context.Context, flags CLIFlags, logFile *os.File) error {
// Get credentials from environment
- apiKey := os.Getenv("SKETCH_MODEL_API_KEY")
+ apiKey := cmp.Or(os.Getenv("SKETCH_MODEL_API_KEY"), flags.llmAPIKey)
pubKey := os.Getenv("SKETCH_PUB_KEY")
modelURL, err := skabandclient.LocalhostToDockerInternal(os.Getenv("SKETCH_MODEL_URL"))
if err != nil && os.Getenv("SKETCH_MODEL_URL") != "" {
@@ -324,9 +330,9 @@
if flags.modelName == "gemini" {
envName = gem.GeminiAPIKeyEnv
}
- apiKey = os.Getenv(envName)
+ apiKey = cmp.Or(os.Getenv(envName), flags.llmAPIKey)
if apiKey == "" {
- return fmt.Errorf("%s environment variable is not set", envName)
+ return fmt.Errorf("%s environment variable is not set, -llm-api-key flag not provided", envName)
}
} else {
// Connect to skaband
diff --git a/dockerimg/dockerimg.go b/dockerimg/dockerimg.go
index 966373b..41026a4 100644
--- a/dockerimg/dockerimg.go
+++ b/dockerimg/dockerimg.go
@@ -495,15 +495,19 @@
if config.Model != "" {
cmdArgs = append(cmdArgs, "-model="+config.Model)
}
- if config.SkabandAddr != "" {
- cmdArgs = append(cmdArgs, "-skaband-addr="+config.SkabandAddr)
- }
+ cmdArgs = append(cmdArgs, "-skaband-addr="+config.SkabandAddr)
if config.Prompt != "" {
cmdArgs = append(cmdArgs, "-prompt", config.Prompt)
}
if config.OneShot {
cmdArgs = append(cmdArgs, "-one-shot")
}
+ if config.ModelURL == "" {
+ // Forward ANTHROPIC_API_KEY for direct use.
+ // TODO: have outtie run an http proxy?
+ // TODO: select and forward the relevant API key based on the model
+ cmdArgs = append(cmdArgs, "-llm-api-key="+os.Getenv("ANTHROPIC_API_KEY"))
+ }
// Add additional docker arguments if provided
if config.DockerArgs != "" {