summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-01 15:23:35 +0300
committerPaul Buetow <paul@buetow.org>2026-04-01 15:23:35 +0300
commitba04917670aac3fb4dff524fcdf614f13bbbfebe (patch)
treeb6f178c5404b29687aad00383aec3ccd6d976bff
parent0cdc2fb5e732323847d683282e39e4d3cf494daf (diff)
z6: ignore whitespace translation input
-rw-r--r--internal/image/nanobanana.go16
-rw-r--r--internal/image/nanobanana_test.go33
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()