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 != "" {