From d32dc8fbebf2ffffc7566b3bd15f142602fc5c0e Mon Sep 17 00:00:00 2001 From: Yetibot Date: Tue, 4 Aug 2026 17:43:40 +0000 Subject: [PATCH] fix: use correct Gemini 3.1 image and Veo 3.1 models to resolve 404 errors --- config/config.sample.edn | 4 +-- src/yetibot/core/commands/veo.clj | 12 ++++----- src/yetibot/core/util/gemini.clj | 7 ++--- .../core/test/commands/bameme_test.clj | 4 +-- .../core/test/commands/banana_test.clj | 4 +-- test/yetibot/core/test/commands/veo.clj | 26 +++++++++---------- .../core/test/commands/weathermap_test.clj | 4 +-- 7 files changed, 31 insertions(+), 30 deletions(-) diff --git a/config/config.sample.edn b/config/config.sample.edn index 271ebc65..12cd23ce 100644 --- a/config/config.sample.edn +++ b/config/config.sample.edn @@ -52,8 +52,8 @@ :url "http://localhost:3003", :ebay {:appid ""}, :gemini {:api {:key "" - ;; optional: override the default model (gemini-3.6-flash-image-preview) - ;; :model "gemini-3.6-flash-image-preview" + ;; optional: override the default model (gemini-3.1-flash-image) + ;; :model "gemini-3.1-flash-image" ;; monthly budget in USD for image generation (default: 10.00) ;; :monthly-budget 10.00 ;; estimated cost per image in USD (default: 0.045 for Gemini 3.6 Flash 512px) diff --git a/src/yetibot/core/commands/veo.clj b/src/yetibot/core/commands/veo.clj index adfa1eae..304edd8f 100644 --- a/src/yetibot/core/commands/veo.clj +++ b/src/yetibot/core/commands/veo.clj @@ -13,11 +13,11 @@ (some-> msg (string/replace #"key=[^\s&\"]+" "key=***"))) (def model-presets - {"lite" {:model "veo-3.6-lite-generate-preview" :duration 4} - "fast" {:model "veo-3.6-fast-generate-preview" :duration 4} - "gigaveo" {:model "veo-3.6-generate-preview" :duration 8} - "preview" {:model "veo-3.6-generate-preview" :duration 8} - "better" {:model "veo-3.6-generate-preview" :duration 8}}) + {"lite" {:model "veo-3.1-generate-preview" :duration 4} + "fast" {:model "veo-3.1-generate-preview" :duration 4} + "gigaveo" {:model "veo-3.1-generate-preview" :duration 8} + "preview" {:model "veo-3.1-generate-preview" :duration 8} + "better" {:model "veo-3.1-generate-preview" :duration 8}}) (defn parse-model-and-prompt [raw-prompt] @@ -47,7 +47,7 @@ (defn veo-cmd "veo # generate a short AI video with Veo - gigaveo # generate a high-quality 8-second video with flagship Veo 3.6 model + gigaveo # generate a high-quality 8-second video with flagship Veo 3.1 model Examples: veo a cat jumping diff --git a/src/yetibot/core/util/gemini.clj b/src/yetibot/core/util/gemini.clj index fca8c66c..b29aa966 100644 --- a/src/yetibot/core/util/gemini.clj +++ b/src/yetibot/core/util/gemini.clj @@ -26,7 +26,7 @@ ;; (YB_GEMINI_KEY) with the rest of Yetibot's Gemini features. (def config (or (:value (get-config ::config [:gemini])) {})) -(def default-model "gemini-3.6-flash-image-preview") +(def default-model "gemini-3.1-flash-image") (defn gemini-model [] default-model) @@ -48,7 +48,7 @@ ;; -- Monthly budget throttling -- (def ^:private default-cost-per-image - "Default estimated cost per generated image in USD (gemini-3.6-flash-image-preview pricing, tied to default-model)." + "Default estimated cost per generated image in USD (gemini-3.1-flash-image pricing, tied to default-model)." 0.039) (def ^:private default-monthly-budget @@ -58,6 +58,7 @@ (defn cost-per-image [] (or (parse-number (-> config :cost :per)) (case (gemini-model) + "gemini-3.1-flash-image" 0.039 "gemini-3.6-flash-image-preview" 0.039 ;; Add other models and their costs here as needed default-cost-per-image))) @@ -340,7 +341,7 @@ (def ^:private api-base "https://generativelanguage.googleapis.com/v1beta") -(def default-veo-model "veo-3.6-lite-generate-preview") +(def default-veo-model "veo-3.1-generate-preview") (defn veo-model [] (or (-> config :veo :model) default-veo-model)) diff --git a/test/yetibot/core/test/commands/bameme_test.clj b/test/yetibot/core/test/commands/bameme_test.clj index ba806a52..d30ee4f0 100644 --- a/test/yetibot/core/test/commands/bameme_test.clj +++ b/test/yetibot/core/test/commands/bameme_test.clj @@ -6,7 +6,7 @@ (facts "about bameme-cmd" (fact "it generates a meme and returns URL with model and cost footer" (bm/bameme-cmd {:match "bameme drake: writing tests / shipping to prod" :chat-source {}}) - => (contains {:result/value #"http://localhost:3003/generated-images/img123.png\n\nSent via gemini-3.6-flash-image-preview \| Cost: \$0.039" + => (contains {:result/value #"http://localhost:3003/generated-images/img123.png\n\nSent via gemini-3.1-flash-image \| Cost: \$0.039" :result/data {:id "img123" :prompt "bameme drake: writing tests / shipping to prod" :url "http://localhost:3003/generated-images/img123.png"}}) (provided (gemini/configured?) => true @@ -14,5 +14,5 @@ (gemini/generate-image "Create a meme in the style of the 'drake' meme template with this text: writing tests / shipping to prod" anything []) => {:data "bytes" :mime-type "image/png"} (yetibot.core.webapp.routes.images/store-image! {:data "bytes" :mime-type "image/png"}) => "img123" (gemini/yetibot-base-url) => "http://localhost:3003" - (gemini/gemini-model) => "gemini-3.6-flash-image-preview" + (gemini/gemini-model) => "gemini-3.1-flash-image" (gemini/cost-per-image) => 0.039))) diff --git a/test/yetibot/core/test/commands/banana_test.clj b/test/yetibot/core/test/commands/banana_test.clj index c7ce5096..4c271d23 100644 --- a/test/yetibot/core/test/commands/banana_test.clj +++ b/test/yetibot/core/test/commands/banana_test.clj @@ -27,7 +27,7 @@ (facts "about banana-cmd" (fact "it generates an image and returns URL with model and cost footer" (b/banana-cmd {:match "banana monkey" :chat-source {}}) - => (contains {:result/value #"http://localhost:3003/generated-images/img123.png\n\nSent via gemini-3.6-flash-image-preview \| Cost: \$0.039" + => (contains {:result/value #"http://localhost:3003/generated-images/img123.png\n\nSent via gemini-3.1-flash-image \| Cost: \$0.039" :result/data {:id "img123" :prompt "banana monkey" :url "http://localhost:3003/generated-images/img123.png"}}) (provided (gemini/configured?) => true @@ -35,5 +35,5 @@ (gemini/generate-image "Generate an image: monkey" b/banana-system-instruction []) => {:data "bytes" :mime-type "image/png"} (yetibot.core.webapp.routes.images/store-image! {:data "bytes" :mime-type "image/png"}) => "img123" (gemini/yetibot-base-url) => "http://localhost:3003" - (gemini/gemini-model) => "gemini-3.6-flash-image-preview" + (gemini/gemini-model) => "gemini-3.1-flash-image" (gemini/cost-per-image) => 0.039))) diff --git a/test/yetibot/core/test/commands/veo.clj b/test/yetibot/core/test/commands/veo.clj index e677588e..a1c07af7 100644 --- a/test/yetibot/core/test/commands/veo.clj +++ b/test/yetibot/core/test/commands/veo.clj @@ -35,11 +35,11 @@ (provided (gemini/configured?) => true (image-input/extract-images "a cool robot dancing" {}) => {:prompt "a cool robot dancing" :image-urls nil} - (gemini/generate-video "a cool robot dancing" nil "veo-3.6-lite-generate-preview" 4) => :video-bytes + (gemini/generate-video "a cool robot dancing" nil "veo-3.1-generate-preview" 4) => :video-bytes (store-image! :video-bytes) => "img123" (gemini/yetibot-base-url) => "http://localhost:3000" - (gemini/calculate-video-cost "veo-3.6-lite-generate-preview" 4) => 0.20 - (chat/send-msg "<@user123>: http://localhost:3000/generated-images/img123.mp4 (Cost: $0.20)") => anything))) + (gemini/calculate-video-cost "veo-3.1-generate-preview" 4) => 1.60 + (chat/send-msg "<@user123>: http://localhost:3000/generated-images/img123.mp4 (Cost: $1.60)") => anything))) (fact "future handles failure, posts error message" (binding [chat/*adapter* :mock-adapter @@ -51,25 +51,25 @@ (provided (gemini/configured?) => true (image-input/extract-images "a cool robot dancing" {}) => {:prompt "a cool robot dancing" :image-urls nil} - (gemini/generate-video "a cool robot dancing" nil "veo-3.6-lite-generate-preview" 4) => (throw (Exception. "API Error")) + (gemini/generate-video "a cool robot dancing" nil "veo-3.1-generate-preview" 4) => (throw (Exception. "API Error")) (chat/send-msg "<@user123>: Video generation failed: API Error") => anything)))) (facts "about veo model and prompt parsing" (fact "correctly parses lite preset" (veo/parse-model-and-prompt "lite a cute cat") - => {:model "veo-3.6-lite-generate-preview" :duration 4 :prompt "a cute cat"}) + => {:model "veo-3.1-generate-preview" :duration 4 :prompt "a cute cat"}) (fact "correctly parses fast preset" (veo/parse-model-and-prompt "fast a cute cat") - => {:model "veo-3.6-fast-generate-preview" :duration 4 :prompt "a cute cat"}) + => {:model "veo-3.1-generate-preview" :duration 4 :prompt "a cute cat"}) (fact "correctly parses gigaveo preset" (veo/parse-model-and-prompt "gigaveo a cute cat") - => {:model "veo-3.6-generate-preview" :duration 8 :prompt "a cute cat"}) + => {:model "veo-3.1-generate-preview" :duration 8 :prompt "a cute cat"}) (fact "correctly parses better preset" (veo/parse-model-and-prompt "better a cute cat") - => {:model "veo-3.6-generate-preview" :duration 8 :prompt "a cute cat"}) + => {:model "veo-3.1-generate-preview" :duration 8 :prompt "a cute cat"}) (fact "ignores preset when no prompt text follows" (veo/parse-model-and-prompt "lite") @@ -90,11 +90,11 @@ (provided (gemini/configured?) => true (image-input/extract-images "lite a cool robot" {}) => {:prompt "lite a cool robot" :image-urls nil} - (gemini/generate-video "a cool robot" nil "veo-3.6-lite-generate-preview" 4) => :video-bytes + (gemini/generate-video "a cool robot" nil "veo-3.1-generate-preview" 4) => :video-bytes (store-image! :video-bytes) => "img123" (gemini/yetibot-base-url) => "http://localhost:3000" - (gemini/calculate-video-cost "veo-3.6-lite-generate-preview" 4) => 0.20 - (chat/send-msg "<@user123>: http://localhost:3000/generated-images/img123.mp4 (Cost: $0.20)") => anything))) + (gemini/calculate-video-cost "veo-3.1-generate-preview" 4) => 1.60 + (chat/send-msg "<@user123>: http://localhost:3000/generated-images/img123.mp4 (Cost: $1.60)") => anything))) (fact "veo-cmd with gigaveo cmd generates 8s video with flagship model" (binding [chat/*adapter* :mock-adapter @@ -106,10 +106,10 @@ (provided (gemini/configured?) => true (image-input/extract-images "a cool robot" {}) => {:prompt "a cool robot" :image-urls nil} - (gemini/generate-video "a cool robot" nil "veo-3.6-generate-preview" 8) => :video-bytes + (gemini/generate-video "a cool robot" nil "veo-3.1-generate-preview" 8) => :video-bytes (store-image! :video-bytes) => "img123" (gemini/yetibot-base-url) => "http://localhost:3000" - (gemini/calculate-video-cost "veo-3.6-generate-preview" 8) => 3.20 + (gemini/calculate-video-cost "veo-3.1-generate-preview" 8) => 3.20 (chat/send-msg "<@user123>: http://localhost:3000/generated-images/img123.mp4 (Cost: $3.20)") => anything)))) (facts "about redact" diff --git a/test/yetibot/core/test/commands/weathermap_test.clj b/test/yetibot/core/test/commands/weathermap_test.clj index 6b53541b..10bccbd3 100644 --- a/test/yetibot/core/test/commands/weathermap_test.clj +++ b/test/yetibot/core/test/commands/weathermap_test.clj @@ -10,7 +10,7 @@ (fact "it generates a weather map image and returns URL" (wm/weathermap-cmd {:chat-source {} :user {:username "test-user"}}) - => (contains {:result/value #"http://localhost:3003/generated-images/img456.png\n\nSent via gemini-3.6-flash-image-preview \| Cost: \$0.039" + => (contains {:result/value #"http://localhost:3003/generated-images/img456.png\n\nSent via gemini-3.1-flash-image \| Cost: \$0.039" :result/data {:id "img456" :prompt "A highly detailed, professional weather map of North America showing temperature heat map, wind movements (using beautiful swirling arrows and streamlines), and air quality index overlays. Use modern weather graphics. The current conditions for reference in some cities are: Edmonton: 15C, Sunnyvale: 25C" :url "http://localhost:3003/generated-images/img456.png"}}) @@ -20,5 +20,5 @@ (gemini/generate-image "A highly detailed, professional weather map of North America showing temperature heat map, wind movements (using beautiful swirling arrows and streamlines), and air quality index overlays. Use modern weather graphics. The current conditions for reference in some cities are: Edmonton: 15C, Sunnyvale: 25C" anything) => {:data "bytes" :mime-type "image/png"} (yetibot.core.webapp.routes.images/store-image! {:data "bytes" :mime-type "image/png"}) => "img456" (gemini/yetibot-base-url) => "http://localhost:3003" - (gemini/gemini-model) => "gemini-3.6-flash-image-preview" + (gemini/gemini-model) => "gemini-3.1-flash-image" (gemini/cost-per-image) => 0.039)))