diff options
| author | Paul Buetow <paul@buetow.org> | 2026-04-01 15:36:50 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-04-01 15:36:50 +0300 |
| commit | 3967d8dca4ebe87e43d243c5bbffe34ca0dcab51 (patch) | |
| tree | c2c974cb06ad5f65514f492ea8e21f98291a52e2 /internal/cli/command.go | |
| parent | ba04917670aac3fb4dff524fcdf614f13bbbfebe (diff) | |
z7: wire Nano Banana CLI config
Diffstat (limited to 'internal/cli/command.go')
| -rw-r--r-- | internal/cli/command.go | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/internal/cli/command.go b/internal/cli/command.go index a5a8c13..7bf57d6 100644 --- a/internal/cli/command.go +++ b/internal/cli/command.go @@ -20,7 +20,7 @@ func CreateRootCommand(flags *Flags) *cobra.Command { Long: `totalrecall generates Anki flashcard materials from Bulgarian words. It creates audio pronunciation files using OpenAI TTS and downloads -representative images from web search APIs. +representative images using OpenAI or Gemini Nano Banana. Examples: totalrecall # Launch interactive GUI (default) @@ -55,7 +55,7 @@ func setupFlags(cmd *cobra.Command, flags *Flags) { // Local flags cmd.Flags().StringVarP(&flags.OutputDir, "output", "o", defaultOutputDir, "Output directory") cmd.Flags().StringVarP(&flags.AudioFormat, "format", "f", flags.AudioFormat, "Audio format (wav or mp3)") - cmd.Flags().StringVar(&flags.ImageAPI, "image-api", flags.ImageAPI, "Image source (only openai supported)") + cmd.Flags().StringVar(&flags.ImageAPI, "image-api", flags.ImageAPI, "Image source (openai or nanobanana; default: nanobanana)") cmd.Flags().StringVar(&flags.BatchFile, "batch", "", "Process words from file (one per line)") cmd.Flags().BoolVar(&flags.SkipAudio, "skip-audio", false, "Skip audio generation") cmd.Flags().BoolVar(&flags.SkipImages, "skip-images", false, "Skip image download") @@ -79,6 +79,10 @@ func setupFlags(cmd *cobra.Command, flags *Flags) { cmd.Flags().StringVar(&flags.OpenAIImageQuality, "openai-image-quality", flags.OpenAIImageQuality, "Image quality: standard or hd (dall-e-3 only)") cmd.Flags().StringVar(&flags.OpenAIImageStyle, "openai-image-style", flags.OpenAIImageStyle, "Image style: natural or vivid (dall-e-3 only)") + // Nano Banana Image Generation flags + cmd.Flags().StringVar(&flags.NanoBananaModel, "nanobanana-model", flags.NanoBananaModel, "Nano Banana image model (Gemini image preview model)") + cmd.Flags().StringVar(&flags.NanoBananaTextModel, "nanobanana-text-model", flags.NanoBananaTextModel, "Nano Banana text model for prompt generation") + // Bind flags to viper if err := bindFlagsToViper(cmd); err != nil { fmt.Fprintf(os.Stderr, "Warning: failed to bind flags to config: %v\n", err) @@ -87,17 +91,19 @@ func setupFlags(cmd *cobra.Command, flags *Flags) { func bindFlagsToViper(cmd *cobra.Command) error { bindings := map[string]string{ - "audio.format": "format", - "audio.openai_model": "openai-model", - "audio.openai_voice": "openai-voice", - "audio.openai_speed": "openai-speed", - "audio.openai_instruction": "openai-instruction", - "output.directory": "output", - "image.provider": "image-api", - "image.openai_model": "openai-image-model", - "image.openai_size": "openai-image-size", - "image.openai_quality": "openai-image-quality", - "image.openai_style": "openai-image-style", + "audio.format": "format", + "audio.openai_model": "openai-model", + "audio.openai_voice": "openai-voice", + "audio.openai_speed": "openai-speed", + "audio.openai_instruction": "openai-instruction", + "output.directory": "output", + "image.provider": "image-api", + "image.openai_model": "openai-image-model", + "image.openai_size": "openai-image-size", + "image.openai_quality": "openai-image-quality", + "image.openai_style": "openai-image-style", + "image.nanobanana_model": "nanobanana-model", + "image.nanobanana_text_model": "nanobanana-text-model", } var errs []error @@ -156,7 +162,8 @@ func GetOpenAIKey() string { return viper.GetString("audio.openai_key") } -// GetGoogleAPIKey retrieves the Google API key from environment or config. +// GetGoogleAPIKey retrieves the Google API key from GOOGLE_API_KEY or config. +// It prefers image.google_api_key and falls back to google.api_key for older configs. func GetGoogleAPIKey() string { // First check environment variable if key := os.Getenv("GOOGLE_API_KEY"); key != "" { @@ -164,5 +171,10 @@ func GetGoogleAPIKey() string { } // Then check config file + if key := viper.GetString("image.google_api_key"); key != "" { + return key + } + + // Fall back to the legacy key for compatibility with older configs. return viper.GetString("google.api_key") } |
