cmd/sketch: de-dup some code

No functional changes.
diff --git a/cmd/sketch/main.go b/cmd/sketch/main.go
index 0f85924..1fdac7a 100644
--- a/cmd/sketch/main.go
+++ b/cmd/sketch/main.go
@@ -474,28 +474,10 @@
 		return err
 	}
 
-	// Get credentials and connect to skaband if needed
-	privKey, err := skabandclient.LoadOrCreatePrivateKey(skabandclient.DefaultKeyPath(flags.skabandAddr))
+	spec, pubKey, err := resolveModel(flags)
 	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
-	}
-	if flags.skabandAddr != "" {
-		flags.mcpServers = append(flags.mcpServers, skabandMcpConfiguration(flags))
-	} else {
-		// When not using skaband, get API key from environment or flag
-		envName := ant.APIKeyEnv
-		if flags.modelName == "gemini" {
-			envName = gem.GeminiAPIKeyEnv
-		}
-		apiKey = cmp.Or(os.Getenv(envName), flags.llmAPIKey)
-		if apiKey == "" {
-			return fmt.Errorf("%s environment variable is not set, -llm-api-key flag not provided", envName)
-		}
-	}
 
 	// Get current working directory
 	cwd, err := os.Getwd()
@@ -515,8 +497,8 @@
 		LocalAddr:         flags.addr,
 		SkabandAddr:       flags.skabandAddr,
 		Model:             flags.modelName,
-		ModelURL:          modelURL,
-		ModelAPIKey:       apiKey,
+		ModelURL:          spec.modelURL,
+		ModelAPIKey:       spec.apiKey,
 		Path:              cwd,
 		GitUsername:       flags.gitUsername,
 		GitEmail:          flags.gitEmail,
@@ -576,13 +558,27 @@
 // runInUnsafeMode handles execution on the host machine without Docker.
 // This mode is used when the -unsafe flag is provided.
 func runInUnsafeMode(ctx context.Context, flags CLIFlags, logFile *os.File) error {
-	privKey, err := skabandclient.LoadOrCreatePrivateKey(skabandclient.DefaultKeyPath(flags.skabandAddr))
+	spec, pubKey, err := resolveModel(flags)
 	if err != nil {
 		return err
 	}
-	pubKey, antURL, apiKey, err := skabandclient.Login(os.Stdout, privKey, flags.skabandAddr, flags.sessionID, flags.modelName)
+	return setupAndRunAgent(ctx, flags, spec.modelURL, spec.apiKey, pubKey, false, logFile)
+}
+
+type modelSpec struct {
+	modelURL string
+	apiKey   string
+}
+
+// resolveModel logs in to skaband (as appropriate) and resolves the flags to a model URL and API key.
+func resolveModel(flags CLIFlags) (spec modelSpec, pubKey string, err error) {
+	privKey, err := skabandclient.LoadOrCreatePrivateKey(skabandclient.DefaultKeyPath(flags.skabandAddr))
 	if err != nil {
-		return err
+		return modelSpec{}, "", err
+	}
+	pubKey, modelURL, apiKey, err := skabandclient.Login(os.Stdout, privKey, flags.skabandAddr, flags.sessionID, flags.modelName)
+	if err != nil {
+		return modelSpec{}, "", err
 	}
 
 	if flags.skabandAddr == "" {
@@ -593,13 +589,13 @@
 		}
 		apiKey = cmp.Or(os.Getenv(envName), flags.llmAPIKey)
 		if apiKey == "" {
-			return fmt.Errorf("%s environment variable is not set, -llm-api-key flag not provided", envName)
+			return modelSpec{}, "", fmt.Errorf("%s environment variable is not set, -llm-api-key flag not provided", envName)
 		}
 	} else {
 		flags.mcpServers = append(flags.mcpServers, skabandMcpConfiguration(flags))
 	}
 
-	return setupAndRunAgent(ctx, flags, antURL, apiKey, pubKey, false, logFile)
+	return modelSpec{modelURL: modelURL, apiKey: apiKey}, pubKey, nil
 }
 
 // setupAndRunAgent handles the common logic for setting up and running the agent