From ba04917670aac3fb4dff524fcdf614f13bbbfebe Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Wed, 1 Apr 2026 15:23:35 +0300 Subject: z6: ignore whitespace translation input --- internal/image/nanobanana.go | 16 ++++++++-------- internal/image/nanobanana_test.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/internal/image/nanobanana.go b/internal/image/nanobanana.go index c17ad1a..7c1ba26 100644 --- a/internal/image/nanobanana.go +++ b/internal/image/nanobanana.go @@ -130,8 +130,6 @@ func (c *NanoBananaClient) Search(ctx context.Context, opts *SearchOptions) ([]S description := fmt.Sprintf("Generated educational image for %s", opts.Query) if translatedWord != "" { description = fmt.Sprintf("%s (%s)", description, translatedWord) - } else if opts.Translation != "" { - description = fmt.Sprintf("%s (%s)", description, strings.TrimSpace(opts.Translation)) } result := SearchResult{ @@ -244,10 +242,10 @@ func (c *NanoBananaClient) ensureReady() error { return nil } -func (c *NanoBananaClient) resolveTranslation(ctx context.Context, opts *SearchOptions) (string, error) { - if opts.Translation != "" { - fmt.Printf("Using provided translation: %s -> %s\n", opts.Query, opts.Translation) - return opts.Translation, nil +func (c *NanoBananaClient) resolveTranslation(ctx context.Context, opts *SearchOptions, translation string) (string, error) { + if translation != "" { + fmt.Printf("Using provided translation: %s -> %s\n", opts.Query, translation) + return translation, nil } translation, err := c.translateBulgarianToEnglish(ctx, opts.Query) @@ -280,15 +278,17 @@ func (c *NanoBananaClient) buildPrompt(ctx context.Context, opts *SearchOptions) } } + translation := strings.TrimSpace(opts.Translation) + if customPrompt := strings.TrimSpace(opts.CustomPrompt); customPrompt != "" { if len(customPrompt) > 1000 { customPrompt = customPrompt[:997] + "..." } fmt.Printf("Using custom prompt: %s\n", customPrompt) - return customPrompt, "", nil + return customPrompt, translation, nil } - translatedWord, err := c.resolveTranslation(ctx, opts) + translatedWord, err := c.resolveTranslation(ctx, opts, translation) if err != nil { return "", "", err } diff --git a/internal/image/nanobanana_test.go b/internal/image/nanobanana_test.go index 84bb57b..bf0de8c 100644 --- a/internal/image/nanobanana_test.go +++ b/internal/image/nanobanana_test.go @@ -359,6 +359,39 @@ func TestNanoBananaClient_Search_CustomPromptPreservesTranslationMetadata(t *tes } } +func TestNanoBananaClient_Search_CustomPromptIgnoresWhitespaceTranslation(t *testing.T) { + originalText := nanoBananaGenerateText + originalImage := nanoBananaGenerateImage + t.Cleanup(func() { + nanoBananaGenerateText = originalText + nanoBananaGenerateImage = originalImage + }) + + nanoBananaGenerateText = func(_ context.Context, _ *NanoBananaClient, _, _, _ string, _ float32, _ int32) (string, error) { + t.Fatal("unexpected text generation for custom prompt") + return "", nil + } + nanoBananaGenerateImage = func(_ context.Context, _ *NanoBananaClient, _ string) ([]byte, string, error) { + return mustPNGBytes(t), "image/png", nil + } + + client := NewNanoBananaClient(&NanoBananaConfig{APIKey: "test-key"}) + results, err := client.Search(context.Background(), &SearchOptions{ + Query: "ябълка", + Translation: " ", + CustomPrompt: "flashcard prompt", + }) + if err != nil { + t.Fatalf("Search() unexpected error: %v", err) + } + if len(results) != 1 { + t.Fatalf("expected 1 result, got %d", len(results)) + } + if strings.Contains(results[0].Description, "(") || strings.Contains(results[0].Description, ")") { + t.Fatalf("result description = %q, want no translation metadata for whitespace-only input", results[0].Description) + } +} + func TestNanoBananaClient_Search_InvalidOptions(t *testing.T) { t.Parallel() -- cgit v1.2.3