Skip to content

fix(sse): retire Gemini Web image generation - #11708

Merged
diegosouzapw merged 2 commits into
release/v3.8.51from
fix/v3850-retire-gemini-web-images
Aug 28, 2026
Merged

diegosouzapw merged 2 commits into
release/v3.8.51from
fix/v3850-retire-gemini-web-images

Conversation

@diegosouzapw

Copy link
Copy Markdown
Owner

Summary

Retire only the Gemini Web image-generation/extraction capability from the v3.8.50 release line while preserving Gemini Web chat, cookies/authentication, session rotation, tool emulation, and its three chat models.

The image capability is on a provenance/license HOLD. This change does not make a legal conclusion about derivation or incompatibility; it removes the affected surface until provenance and licensing can be cleared or the capability can be independently reimplemented.

Warning: base-red inherited from #9985. The branch is pinned to the current release/v3.8.50 tip, 091589089cd134a94df9f6cdab9ba562b2cefd18.

Provenance and license evidence

Evidence Pinned source Declared license Finding Disposition
OmniRoute introduction PR #10494, source commit 23622cd8, squash 885cd8c4 OmniRoute repository license Added the Gemini Web image parser, executor image mode, image handler, registry entry, and positive tests. The local parser comment explicitly named gpt4free and Gemini-API as corroborating reverse-engineered clients and described the size suffix as a gpt4free heuristic. Scope under review
gpt4free Gemini.py at 973504e1, distinctive parser combination in 8a90cfeb GPL-3.0 Pinned implementation contains the distinctive image extraction and full-resolution URL handling referenced by the OmniRoute code. Expressive adaptation is probable, not legally proven. HOLD
HanaokaYuzu/Gemini-API client.py at 955746da, constants AGPL-3.0 Pinned implementation was named by the OmniRoute parser comment as corroboration for the nested candidate layout. This is provenance evidence, not proof of copying. HOLD

Removed versus preserved

Removed Preserved
gemini-web/nano-banana-web and alias routing through gweb in the image registry The gemini-web provider, specialized executor, cookie/session authentication, token extraction, browser flow, cookie rotation, validation, and VNC/session support
Gemini Web image handler and its /v1/images/generations dispatch branch Gemini Web chat models: gemini-3.1-pro, gemini-3.7-flash, and gemini-3.1-flash-lite
parseStreamResponseImages, the private x_gemini_web_image_mode execution branch, 90-second image wait, and x_gemini_web_image_urls response extension Gemini Web text parsing, chat streaming, multi-turn flattening, reasoning-control validation, and tool-call emulation
Two positive test files for the retired image surface Official/legitimate image routes, including Antigravity/Gemini API image models, OpenRouter Gemini image models, Adobe Firefly Nano Banana, Fal AI Nano Banana, and Cheaper Inference image models
Current operational claims for this image surface Historical CHANGELOG and quality-baseline records, kept as historical evidence

No provider tombstone, database migration, connection deactivation, credential mutation, or chat-provider retirement is included.

Measured catalog impact

Measured by executing the registry on the exact base SHA and on this branch:

Metric Base Branch
Image providers 43 42
Declared image models 235 234
Public image catalog entries 241 240

The canonical provider count is unchanged because Gemini Web chat remains registered.

TDD evidence

RED was observed before each behavior change:

  1. The retirement catalog test expected no Gemini Web image provider but received the full gemini-web image configuration.
  2. The executor test expected the old image-mode extension to be ignored, but the response still contained x_gemini_web_image_urls: [].
  3. The artifact test expected the image parser export and dedicated handler file to be absent, but both were present.

GREEN:

  • tests/unit/gemini-web-image-retirement.test.ts: 4/4 passed.
  • Gemini Web preservation matrix: 48/48 passed (retirement, chat registration, cookies, capabilities, tools, browser error handling, and multi-turn context).
  • Image handler and route matrix: 67/67 passed, including retained Nano Banana, Antigravity, OpenRouter-compatible, Codex, and other image paths.

Gates

  • npm run typecheck:core — PASS
  • Focused ESLint on changed TypeScript files — PASS
  • npm run check:provider-consistency — PASS (270 registry entries, 352 canonical providers, 0 exceptions)
  • GITHUB_BASE_SHA=091589... npm run check:test-masking — PASS (2 deleted tests, verified replacement)
  • npm run check:tracked-artifacts — PASS
  • npm run check:any-budget:t11 — PASS
  • npm run check:changelog-integrity — PASS
  • Full unit/Vitest matrices — pending CI

The PR remains draft and open for CI/review. No merge, automerge, tag, release, or deployment is requested.

@diegosouzapw
diegosouzapw force-pushed the fix/v3850-retire-gemini-web-images branch from 2a73607 to 6610373 Compare August 28, 2026 04:01
@diegosouzapw
diegosouzapw changed the base branch from release/v3.8.50 to release/v3.8.51 August 28, 2026 04:01
@diegosouzapw
diegosouzapw marked this pull request as ready for review August 28, 2026 07:40
@diegosouzapw
diegosouzapw merged commit a818958 into release/v3.8.51 Aug 28, 2026
24 of 33 checks passed
diegosouzapw added a commit that referenced this pull request Aug 28, 2026
Rebased onto the current release/v3.8.51 tip as part of a combined provider-retirement/provenance merge batch (Designer Web, Felo Web, Runtime, GPL-derived removal, Qwen Web already landed). Large conflict set (this is the biggest PR in the batch — the common ChatGPT Web provider touches chat, images, count-tokens, session leases, and combos). Conflicts resolved:

- `open-sse/config/providers/registry/chatgpt-web/*`, `open-sse/executors/chatgpt-web*`, `open-sse/handlers/imageGeneration/providers/chatgptWeb.ts`, and their tests: kept deleted, matching the PR's stated scope.
- `open-sse/config/providers/registry/minimax/web/index.ts`, `open-sse/handlers/imageGeneration/providers/geminiWeb.ts`, `open-sse/executors/gemini-web.ts`'s stale image-mode branch: base-drift collisions against already-merged sibling retirements (#11691, #11708) — kept deleted / dropped the dead code, since this PR's own branch forked before those merged.
- `src/shared/constants/reservedProviderPrefixes.ts`, `open-sse/executors/index.ts`, `executorProxy.ts`, `virtualFactory.ts`, `autoStrategy.ts`, `src/lib/db/providers.ts`, `src/sse/handlers/chat.ts`: combined the Designer + Runtime (Felo/Qwen) + common-ChatGPT-Web retirement guard calls at each shared chokepoint — compute-once-then-OR pattern, consistent with prior combinations in this batch.
- `src/sse/services/model.ts` / `src/sse/handlers/chatHelpers.ts`: adopted this PR's new `getModelInfoOrRetirementResponse()` central wrapper (a real improvement over ad-hoc try/catch), and extended it to also catch the Designer + Runtime retirement errors it didn't originally cover, so the consolidation doesn't regress the other two mechanisms.
- `src/app/api/v1/images/edits/route.ts`: this PR moved the retirement check earlier (before `enforceApiKeyPolicy`) but left the old later call+catch block in place from base drift — removed the now-redundant duplicate `resolveImageRouteModel()` call and merged the Designer catch into the earlier one.
- `open-sse/config/imageRegistry.ts`, `tests/snapshots/executors/executor-map.json` (`keyCount` recomputed to 133), `tests/snapshots/provider/translate-path.json`: same "both sides inserted a different retired provider at the same slot" pattern — resolved by dropping both.
- `tests/unit/chatcore-executor-proxy.test.ts`, `provider-node-reserved-prefix.test.ts`, `combo-auto-candidate-expansion.test.ts`, `messages-count-tokens-route.test.ts`, `virtual-auto-combo.test.ts`: split into independent per-mechanism test blocks (established pattern); `virtual-auto-combo.test.ts`'s old "includes cookie web-session providers" positive-inclusion test (which used chatgpt-web as its example) was retired along with the provider and replaced by this PR's negative-exclusion test for the same slot.
- `docs/architecture/ARCHITECTURE.md`, `CODEBASE_DOCUMENTATION.md` (+ 4 i18n mirrors), `README.md`, `FREE-TIERS-GUIDE.md`, `docs/diagrams/free-tier-budget.svg`, `docs/screenshots/free-tier-budget-card.svg`, `docs/reference/PROVIDER_REFERENCE.md`: recomputed every stale count from the real merged state — 104 executors (`countFiles` gate logic), 351 providers (regenerated via `gen:provider-reference`), 152/351 `hasFree` entries, 445/438/7 free-tier catalog rows, 13 ToS-avoid providers, budget-card regenerated via its real generator script. One doc conflict (`oauth/` module list) needed picking HEAD's side specifically — theirs still listed the already-removed `raycast` module instead of the real `openference`.
- `config/quality/test-masking-allowlist.json`: additive merge of the PR's 17 `_deletedWithReplacement` entries alongside the batch's existing ones (one real duplicate-key mistake in my first pass, caught and fixed via a `object_pairs_hook` duplicate-key check before finalizing).

Also fixed two real, unrelated-to-my-merge issues surfaced by the focused suite:
- `tests/unit/resolve-web-provider-host.test.ts`: the PR's own test had a typo — it asserted `perplexity-web`'s resolved host as `"perplexity.ai"`, but the provider's registered `website` is `"https://www.perplexity.ai"` and the resolver returns the URL's `host` verbatim (no www-stripping), so the correct value is `"www.perplexity.ai"` (consistent with the same test's own `url` assertion).
- `tests/unit/hard-session-lease-bypass-inventory.test.ts`: this golden call-site inventory was already stale on the pristine post-#11713 tip (confirmed via a throwaway probe worktree) — `src/lib/db/providers.ts`'s 3 connection-fallback sites and a third `src/app/api/providers/route.ts` site were never added to the golden list by the earlier-merged #11698/#11720 PRs. Updated it to the real current inventory (dated inline comments explain each delta and which PR introduced it), plus this PR's own legitimate deltas (image-edits duplicate-call removal, `ChatGptWebExecutor.execute()` site removed).

Focused suite green (433/433 across executor-proxy, reserved-prefix, hard-session-lease-bypass-inventory, resolve-web-provider-host, retirement/runtime-block/source-retirement/management-retirement/image-handler-retirement, migration-168, combo-auto-candidate-expansion, virtual-auto-combo, executor-map-golden and siblings), plus `typecheck:core`, `check-file-size`, and `check-changelog-integrity` clean. Thanks for the thorough provenance-hold retirement work — appreciated.
Mafsolin added a commit to Mafsolin/OmniRoute that referenced this pull request Sep 3, 2026
Brings in the measured-RSS build memory guards (OMNIROUTE_BUILD_WORKERS 3->2,
diegosouzapw#7518/diegosouzapw#11719) that fix the OOM-killed vps-sh build, the recursive temp-dir
removal retries (diegosouzapw#12246), and the release/CI fixes.

Conflicts: 68 test files were formatting-only duplicates of the maxRetries
codemod our fork already carried (kept ours). Kept our retired-provider test
deletions (diegosouzapw#11708/diegosouzapw#11713), our layer-cached Dockerfile.bun, and our fork-only
tests; took upstream's parameterized docker-build-memory-budget test and
bundler-flag change. Re-applied the maxRetries guard to the 7 rmSync sites in
chatgpt-web-codex.test.ts that --ours would have left unguarded.
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
Merged via /merge-batch (v3.8.51 provenance sweep). Boarded and validated together with the batch's other provenance/retirement PRs in a combined worktree — full gate suite green, including the video/image regression suites and the new gemini-web-image-retirement test file (fixed a getExecutor async-signature drift found during the combined validation pass; Gemini Web chat and legitimate Gemini image providers unaffected). Thank you.
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
Rebased onto the current release/v3.8.51 tip as part of a combined provider-retirement/provenance merge batch (Designer Web, Felo Web, Runtime, GPL-derived removal, Qwen Web already landed). Large conflict set (this is the biggest PR in the batch — the common ChatGPT Web provider touches chat, images, count-tokens, session leases, and combos). Conflicts resolved:

- `open-sse/config/providers/registry/chatgpt-web/*`, `open-sse/executors/chatgpt-web*`, `open-sse/handlers/imageGeneration/providers/chatgptWeb.ts`, and their tests: kept deleted, matching the PR's stated scope.
- `open-sse/config/providers/registry/minimax/web/index.ts`, `open-sse/handlers/imageGeneration/providers/geminiWeb.ts`, `open-sse/executors/gemini-web.ts`'s stale image-mode branch: base-drift collisions against already-merged sibling retirements (diegosouzapw#11691, diegosouzapw#11708) — kept deleted / dropped the dead code, since this PR's own branch forked before those merged.
- `src/shared/constants/reservedProviderPrefixes.ts`, `open-sse/executors/index.ts`, `executorProxy.ts`, `virtualFactory.ts`, `autoStrategy.ts`, `src/lib/db/providers.ts`, `src/sse/handlers/chat.ts`: combined the Designer + Runtime (Felo/Qwen) + common-ChatGPT-Web retirement guard calls at each shared chokepoint — compute-once-then-OR pattern, consistent with prior combinations in this batch.
- `src/sse/services/model.ts` / `src/sse/handlers/chatHelpers.ts`: adopted this PR's new `getModelInfoOrRetirementResponse()` central wrapper (a real improvement over ad-hoc try/catch), and extended it to also catch the Designer + Runtime retirement errors it didn't originally cover, so the consolidation doesn't regress the other two mechanisms.
- `src/app/api/v1/images/edits/route.ts`: this PR moved the retirement check earlier (before `enforceApiKeyPolicy`) but left the old later call+catch block in place from base drift — removed the now-redundant duplicate `resolveImageRouteModel()` call and merged the Designer catch into the earlier one.
- `open-sse/config/imageRegistry.ts`, `tests/snapshots/executors/executor-map.json` (`keyCount` recomputed to 133), `tests/snapshots/provider/translate-path.json`: same "both sides inserted a different retired provider at the same slot" pattern — resolved by dropping both.
- `tests/unit/chatcore-executor-proxy.test.ts`, `provider-node-reserved-prefix.test.ts`, `combo-auto-candidate-expansion.test.ts`, `messages-count-tokens-route.test.ts`, `virtual-auto-combo.test.ts`: split into independent per-mechanism test blocks (established pattern); `virtual-auto-combo.test.ts`'s old "includes cookie web-session providers" positive-inclusion test (which used chatgpt-web as its example) was retired along with the provider and replaced by this PR's negative-exclusion test for the same slot.
- `docs/architecture/ARCHITECTURE.md`, `CODEBASE_DOCUMENTATION.md` (+ 4 i18n mirrors), `README.md`, `FREE-TIERS-GUIDE.md`, `docs/diagrams/free-tier-budget.svg`, `docs/screenshots/free-tier-budget-card.svg`, `docs/reference/PROVIDER_REFERENCE.md`: recomputed every stale count from the real merged state — 104 executors (`countFiles` gate logic), 351 providers (regenerated via `gen:provider-reference`), 152/351 `hasFree` entries, 445/438/7 free-tier catalog rows, 13 ToS-avoid providers, budget-card regenerated via its real generator script. One doc conflict (`oauth/` module list) needed picking HEAD's side specifically — theirs still listed the already-removed `raycast` module instead of the real `openference`.
- `config/quality/test-masking-allowlist.json`: additive merge of the PR's 17 `_deletedWithReplacement` entries alongside the batch's existing ones (one real duplicate-key mistake in my first pass, caught and fixed via a `object_pairs_hook` duplicate-key check before finalizing).

Also fixed two real, unrelated-to-my-merge issues surfaced by the focused suite:
- `tests/unit/resolve-web-provider-host.test.ts`: the PR's own test had a typo — it asserted `perplexity-web`'s resolved host as `"perplexity.ai"`, but the provider's registered `website` is `"https://www.perplexity.ai"` and the resolver returns the URL's `host` verbatim (no www-stripping), so the correct value is `"www.perplexity.ai"` (consistent with the same test's own `url` assertion).
- `tests/unit/hard-session-lease-bypass-inventory.test.ts`: this golden call-site inventory was already stale on the pristine post-diegosouzapw#11713 tip (confirmed via a throwaway probe worktree) — `src/lib/db/providers.ts`'s 3 connection-fallback sites and a third `src/app/api/providers/route.ts` site were never added to the golden list by the earlier-merged diegosouzapw#11698/diegosouzapw#11720 PRs. Updated it to the real current inventory (dated inline comments explain each delta and which PR introduced it), plus this PR's own legitimate deltas (image-edits duplicate-call removal, `ChatGptWebExecutor.execute()` site removed).

Focused suite green (433/433 across executor-proxy, reserved-prefix, hard-session-lease-bypass-inventory, resolve-web-provider-host, retirement/runtime-block/source-retirement/management-retirement/image-handler-retirement, migration-168, combo-auto-candidate-expansion, virtual-auto-combo, executor-map-golden and siblings), plus `typecheck:core`, `check-file-size`, and `check-changelog-integrity` clean. Thanks for the thorough provenance-hold retirement work — appreciated.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants