Find callers still sending nano-banana-2 or gemini-3.1-flash-image
Sume runs the retired nano-banana-2 id as Nano Banana 2.1 and echoes your id back. A repo scan finds stale ids and gemini-3.1-flash-image before you migrate.

Two ids are going stale: gemini-3.1-flash-image, which Google deprecated on Oct 6 2026 with no shutdown date given (Gemini API changelog, read 2026-10-09), and nano-banana-2, which Sume retired. Sume still accepts google/nano-banana-2 and nano-banana-2 and runs them as Nano Banana 2.1, so nothing breaks; but the response echoes the id you sent, so you only find stale callers by scanning your code.
What Sume does with the old id
| You send | What happens | Id to use now |
|---|---|---|
| google/nano-banana-2 | Runs as google/nano-banana-2.1; the job stores the 2.1 id | google/nano-banana-2.1 |
| nano-banana-2 | Same, as a bare alias | google/nano-banana-2.1 |
| google/nano-banana-2.1 | Native catalog id | google/nano-banana-2.1 |
| gemini-3.1-flash-image | Google's deprecated id; not a Sume catalog id | Move the call to Sume with google/nano-banana-2.1 |
Scan your repo
The script prints the file, line and text for each stale id. The pattern skips nano-banana-2.1 itself by refusing a following ., digit, letter or hyphen.
import pathlib, re
OLD = re.compile(
r"(?<![\w./-])(?:google/)?nano-banana-2(?![.\w-])|gemini-3\.1-flash-image"
)
EXT = {".py", ".ts", ".js", ".json", ".yaml", ".yml", ".env", ".toml"}
for p in pathlib.Path(".").rglob("*"):
if not p.is_file() or p.suffix not in EXT or "node_modules" in p.parts:
continue
try:
lines = p.read_text(errors="ignore").splitlines()
except OSError:
continue
for n, line in enumerate(lines, 1):
if OLD.search(line):
print(f"{p}:{n}: {line.strip()[:100]}")Then fix
Replace with google/nano-banana-2.1 and keep the price in mind: the same tiers apply, $0.075 at 0.5K, $0.10 at 1K, $0.15 at 2K and $0.20 at 4K per image (price tool, read 2026-10-09). The catalog does not list the retired id, so a model picker built from GET /v1/images/models will not show it.
Gotchas
- Because the response
modelfield echoes what you sent, logs will keep sayingnano-banana-2until you change the string. - The job stores the 2.1 id, so a job read shows the model that actually ran.
- Config files and environment variables hold ids too; the script covers
.env, but not a secrets manager.
Sources
Related posts
More in Developers
- Find exhausted Sume webhook deliveries and redeliver them in Python
Page GET /v1/jobs for completed and failed jobs, keep webhook_delivery.status exhausted, and call POST /v1/jobs/{id}/webhook/redeliver for each.
- First and last frame video API call: Wan 3.0, 6 s at 720p, $0.75
A working first-frame and last-frame request for Sume's /v1/videos: Wan 3.0, 6 seconds, 720p, $0.75. Which rows accept last_frame and which do not.
- Five status vocabularies on the Sume and OpenRouter video APIs
Sume job status, the queue-shaped field, /v1/videos status, webhook delivery status and OpenRouter status differ in spelling. One TypeScript map fixes it.
- FLUX 3 Image rewrites your instruction: result.prompt vs Sume's rows
BFL's FLUX 3 Image expands an edit instruction into a detailed prompt and returns it in result.prompt. What to log, and what Sume's rows return instead.
Written by Sume