From 6c26a1c42c01104442e354cae1f7e14052b55082 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Wed, 1 Apr 2026 19:52:05 +0300 Subject: z9: clarify GUI provider matrix --- README.md | 9 +++++---- internal/cli/command.go | 4 ++-- internal/cli/command_test.go | 8 ++++---- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index c1444cc..d08c7a8 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ It has mainly been vibe coded using Claude Code CLI. -⚠️ **Important:** This tool uses OpenAI services for audio and image generation, which requires an API key. See [Quick Start](#quick-start) for setup instructions. +⚠️ **Important:** Audio generation uses OpenAI services. The no-arg GUI image path uses Google Gemini Nano Banana by default, while explicit CLI image generation currently remains OpenAI-only. See [Quick Start](#quick-start) for setup instructions. [TotalRecall screenshot](assets/totalrecall.png) [🔊 Computer / Компютър audio example](assets/audio.mp3) (Download raw file, and then play locally) @@ -27,7 +27,8 @@ It has mainly been vibe coded using Claude Code CLI. - Automatic Bulgarian to English translation - Saves translations to separate text files - Image generation: - - **OpenAI DALL-E**: AI-generated educational images with contextual scenes and random art styles + - **Google Gemini Nano Banana**: Default image path for the no-arg GUI launch + - **OpenAI DALL-E**: Explicit CLI image generation path for now - Scene generation creates memorable contexts for each word - Batch processing of multiple words - Anki-compatible export @@ -93,7 +94,7 @@ After installation, you may need to log out and log back in for the icon to appe ## Quick Start -**Note:** By default, totalrecall uses OpenAI for audio and Nano Banana for images in the GUI. Make sure to set your OpenAI API key and Google API key: +**Note:** By default, totalrecall uses OpenAI for audio. The no-arg GUI image path uses Nano Banana, while explicit CLI image generation remains OpenAI-only until `z8` lands. Make sure to set your OpenAI API key and Google API key: ```bash export OPENAI_API_KEY="sk-..." export GOOGLE_API_KEY="..." @@ -116,7 +117,7 @@ Key features: ### CLI Mode -1. Generate materials for a single word (explicit CLI runs use OpenAI for images unless you override `--image-api`): +1. Generate materials for a single word (explicit CLI image generation uses OpenAI only for now; Nano Banana CLI selection is pending `z8`): ```bash totalrecall ябълка ``` diff --git a/internal/cli/command.go b/internal/cli/command.go index eac89c2..2efe2a0 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. Launching with no arguments opens the interactive GUI, which uses Nano Banana for images by default. Use --image-api to override the image backend for explicit runs. +representative images. Launching with no arguments opens the interactive GUI, which uses Nano Banana for images by default. Use --image-api for explicit CLI runs; it currently supports OpenAI only. Nano Banana CLI selection is pending z8. Nano Banana model and text-model flags are exposed for upcoming runtime wiring. @@ -57,7 +57,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 override (GUI no-arg path defaults to Nano Banana; explicit CLI default is OpenAI)") + cmd.Flags().StringVar(&flags.ImageAPI, "image-api", flags.ImageAPI, "Image source for explicit CLI runs (OpenAI only for now; GUI no-arg path defaults to Nano Banana)") 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") diff --git a/internal/cli/command_test.go b/internal/cli/command_test.go index 6c5273d..2efe405 100644 --- a/internal/cli/command_test.go +++ b/internal/cli/command_test.go @@ -26,8 +26,8 @@ func TestCreateRootCommand(t *testing.T) { if !strings.Contains(cmd.Long, "uses Nano Banana for images by default") { t.Errorf("Expected Long description to describe the Nano Banana GUI default") } - if !strings.Contains(cmd.Long, "Use --image-api to override the image backend") { - t.Errorf("Expected Long description to explain the image backend override") + if !strings.Contains(cmd.Long, "Use --image-api for explicit CLI runs; it currently supports OpenAI only") { + t.Errorf("Expected Long description to explain the current explicit CLI image-provider matrix") } // Test that flags are set up @@ -109,8 +109,8 @@ func TestSetupFlags(t *testing.T) { if imageAPIFlag.DefValue != "openai" { t.Errorf("Expected default image-api to be openai, got %s", imageAPIFlag.DefValue) } - if imageAPIFlag.Usage != "Image source override (GUI no-arg path defaults to Nano Banana; explicit CLI default is OpenAI)" { - t.Errorf("Expected image-api help to describe the GUI Nano Banana default and explicit CLI override, got %q", imageAPIFlag.Usage) + if imageAPIFlag.Usage != "Image source for explicit CLI runs (OpenAI only for now; GUI no-arg path defaults to Nano Banana)" { + t.Errorf("Expected image-api help to describe the GUI Nano Banana default and OpenAI-only CLI image path, got %q", imageAPIFlag.Usage) } nanoBananaModelFlag := cmd.Flags().Lookup("nanobanana-model") -- cgit v1.2.3