Skip to content

fix(providers): retire the suno music provider (#14224) - #14468

Merged
diegosouzapw merged 3 commits into
release/v3.8.51from
fix/14224-retire-suno
Sep 24, 2026
Merged

diegosouzapw merged 3 commits into
release/v3.8.51from
fix/14224-retire-suno

Conversation

@diegosouzapw

@diegosouzapw diegosouzapw commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator

Root cause

studio-api.suno.ai (both open-sse/config/musicRegistry.ts and the duplicate
open-sse/config/providers/registry/suno/index.ts) returns 503 Service Suspended
(Cloudflare) for every request — the host is permanently down. The live client host,
studio-api-prod.suno.com, requires a Clerk JWT exchanged from a __client cookie via
auth.suno.com, device-id/browser-token headers, and an hCaptcha challenge solved
through a headless browser plus a paid captcha-solving service (per the community
reference implementation, gcui-art/suno-api) — none of which OmniRoute's current
cookie-only fetch flow implements.

Fix

Per owner decision (binding, recorded in the plan-file frontmatter): retire the
suno provider rather than rewrite its auth (the Clerk JWT + hCaptcha path is out of
scope — new paid external dependency for one provider).

  • Removed the suno entry from musicRegistry.ts and the duplicate registry copy
    (open-sse/config/providers/registry/suno/), and its handleSunoMusicGeneration
    dispatch/branch in musicGeneration.ts.
  • Dropped suno from the API-key catalog (specialty-media.ts) and its icon wiring
    (ProviderIcon.tsx, lobeProviderIcons.ts).
  • Registered the takedown in docs/reference/REMOVED_PROVIDERS.md and guarded it via
    tests/unit/removed-providers-blocklist.test.ts (new music-registry-entry assertion +
    source-sweep, matching the puter/theoldllm precedent).
  • kie/suno-v4.0 and kie/suno-v3.5 (kie.ai-hosted, unrelated cookie flow) are
    unaffected and remain supported — API_REFERENCE.md's example now points at one of
    them instead of the retired native provider.
  • Regenerated PROVIDER_REFERENCE.md (359 → 358 providers) and corrected the
    provider-count literal everywhere check:docs-all asserts it against live code:
    package.json description and the README hero/promise-pillars/comparison-table/
    cli-terminal/tier-flow SVGs.
  • Dropped the now-orphaned onboardingProviderDescriptions.suno i18n key from all 66
    locale catalogs (same treatment as the puter/theoldllm removals).

Regression test

tests/unit/removed-providers-blocklist.test.ts — added suno to REMOVED_PROVIDERS
plus a new MUSIC_PROVIDERS[removed.id] assertion (the plan-file's repro, folded into
the blocklist contract instead of a standalone throwaway file).

RED (pre-fix, proven by reverting the implementation diff with git apply -R and
re-running against the unmodified test — not by switching branches):

✖ removed provider "suno" identifiers and domains are absent from registry/executor sources
  AssertionError: reintroduction of "suno" detected — see docs/reference/REMOVED_PROVIDERS.md
  + [
  +   'open-sse/config/musicRegistry.ts :: "suno"',
  +   'open-sse/config/musicRegistry.ts :: studio-api.suno.ai',
  +   'open-sse/config/providers/registry/suno/index.ts :: "suno"',
  +   'open-sse/config/providers/registry/suno/index.ts :: studio-api.suno.ai',
  +   'src/shared/constants/providers/apikey/specialty-media.ts :: "suno"',
  + ]
  - []

GREEN (post-fix): tests 19 / pass 19 / fail 0 (all three REMOVED_PROVIDERS entries ×
6 assertions + the doc-sync check).

Gates run

  • node --import tsx/esm --test tests/unit/removed-providers-blocklist.test.ts — 19/19 pass
  • npm run typecheck:core — exit 0, 0 errors
  • node scripts/check/check-open-sse-typecheck.mjs — openSseTypecheckErrors=0
  • npx eslint --suppressions-location config/quality/eslint-suppressions.json <every changed source/test file> — 0 errors (3 pre-existing "file ignored" warnings on the docs/ markdown paths, expected)
  • node scripts/check/check-file-size.mjs — OK, no files over baseline
  • node scripts/check/check-complexity-ratchets.mjs --base-ref origin/release/v3.8.51 — OK, 0 changed files in the gate's source scope
  • npm run check:provider-consistency — OK, 358 canonical providers, 0 registry-only exceptions
  • npm run check:docs-all — 2 STRICT drifts remain (see Remaining below); all others resolved
  • node scripts/check/check-changelog-integrity.mjs — pre-existing failure, see Remaining below

Existing tests

Ran every test file referencing "suno":

  • tests/unit/minimax-media-servicekinds.test.ts, tests/unit/new-content-providers.test.ts, tests/unit/provider-service-kind-filter-4240.test.ts — aligned to the new contract (suno removed from the expected-cases/entries lists; two assertions flipped to explicitly prove suno is retired rather than registered). 48/48 pass across the four touched suites.
  • tests/unit/registry-utils.test.ts, tests/unit/specialty-model-catalog-routes.test.ts, tests/unit/model-test-modality-guard-13376.test.ts, tests/unit/music-generation-handler.test.ts, tests/unit/provider-assets-third-party-notices.test.ts — reference "suno" only as a kie/suno-v4.0 model id, a synthetic test-only model string, a KIE response field name (sunoData), or a static third-party-notices/icon-scope list independent of the provider registry — none depend on the retired provider; left unchanged, ran green.
    • One unrelated pre-existing failure in tests/unit/specialty-model-catalog-routes.test.ts ("image catalog GET uses the unified active-credential model list", 503 instead of 200) — reproduces standalone on this file alone; the file and the route it exercises (src/app/api/v1/images/generations/route.ts) have zero diff against origin/release/v3.8.51, so this is a pre-existing environment/base issue, not caused by this change.

Remaining (accepted, not fixed here)

  • check:docs-all: AGENTS.md and llm.txt still say "359 providers" — both are agent-instruction surfaces this session must not edit (repo convention: provider counts there are only refreshed centrally during the merge-train, per prior sessions' practice). Everything else check:docs-all flagged (package.json, the 6 README/hero SVGs, PROVIDER_REFERENCE.md) was fixed to 358.
  • node scripts/check/check-changelog-integrity.mjs: fails with 474 missing bullets — ⚠️ base-red inherited. This branch was cut from origin/release/v3.8.51 at 06f1df9d; CHANGELOG.md at that point predates several since-landed reconciliation commits on the base (base has since advanced to 282db2a3). This diff never touches CHANGELOG.md; the changelog fragment for this fix lives at changelog.d/fixes/14224-retire-suno.md per convention.

Closes #14224

Plan-file: _tasks/pipeline/bugs/2-implementing/14224-fix-providers-suno-studio-api-suno-ai-returns-503-service-susp.plan.md

Rework (merge-batch 2026-09-23)

  • Merged release/v3.8.51 (tip) into the branch (real merge, no rebase/force-push). Conflicts were only in generated counts: docs/diagrams/*.svg, public/images/tier-flow-*.svg, package.json description, docs/reference/PROVIDER_REFERENCE.md.
  • Resolution: took the tip's version of those files, regenerated PROVIDER_REFERENCE.md with npm run gen:provider-reference (measured total: 359 after removing suno from a tip at 360), then aligned the provider count to 359 in the SVGs, package.json, README.md, AGENTS.md and llm.txt (+66 docs/i18n/*/llm.txt mirrors regenerated by scripts/i18n/sync-llm-mirrors.mjs). AGENTS.md/llm.txt changes are the provider count only.
  • Validation: check:docs-counts 0 STRICT drift; check:docs-sync PASS (66 llm mirrors); check:provider-consistency OK (359 canonical); focused tests (removed-providers-blocklist, minimax-media-servicekinds, new-content-providers, provider-service-kind-filter-4240) 48/48 pass; typecheck:core only the inherited cliproxyAccountHealth.ts(157,5); eslint clean on changed files; file-size OK.
  • Inherited (not from this PR): check:open-sse-typecheck flags open-sse/executors/auggie.ts TS2769/TS18047 — file identical to the tip (from fix(auggie): resolve spawn EINVAL when running the CLI shim on Windowsfix(auggie): resolve spawn EINVAL when running the CLI shim on Windows #14215).

studio-api.suno.ai returns 503 Service Suspended for every request. The
live host (studio-api-prod.suno.com) requires a Clerk JWT exchange plus a
paid hCaptcha-solving dependency that OmniRoute is not adding for one
music provider — per owner decision, retire suno instead of rewriting its
auth.

- Remove the suno entry from musicRegistry.ts and the duplicate registry
  copy (open-sse/config/providers/registry/suno/), plus its
  handleSunoMusicGeneration dispatch/branch in musicGeneration.ts.
- Drop suno from the API-key catalog (specialty-media.ts) and its icon
  wiring (ProviderIcon.tsx, lobeProviderIcons.ts).
- Register the takedown in docs/reference/REMOVED_PROVIDERS.md and guard
  it via tests/unit/removed-providers-blocklist.test.ts (music-registry +
  source-sweep assertions), matching the doc's provider-removal contract.
- kie/suno-v4.0 and kie/suno-v3.5 (kie.ai-hosted) are unaffected and
  remain supported; API_REFERENCE.md's example now points at one of them.
- Regenerate PROVIDER_REFERENCE.md (359 -> 358 providers) and correct the
  provider-count literal everywhere it is asserted against live code:
  package.json description and the README hero/promise/comparison/
  cli-terminal/tier-flow SVGs.
- Drop the now-orphaned onboardingProviderDescriptions.suno key from all
  66 i18n locale catalogs (mirrors puter/theoldllm precedent).
…4224)

The removal PR number was a placeholder guessed before opening the PR;
correct it now that #14468 exists, in both the test's REMOVED_PROVIDERS
list and the doc table row it cross-checks.
Resolve count conflicts against the tip: regenerate PROVIDER_REFERENCE
(360 -> 359 after suno removal) and align the provider counts in the SVG
diagrams, package.json description, README, AGENTS.md and llm.txt (+66
i18n mirrors via sync-llm-mirrors). Numbers only.
diegosouzapw added a commit that referenced this pull request Sep 24, 2026
) (#14415)

Merge-batch 2026-09-23 (PRs do mantenedor, Trilha B, retrabalhada).

Um worker corrigiu o defeito apontado na revisão direto no branch da PR; o detalhe está na seção "Rework (merge-batch 2026-09-23)" do corpo, com a prova de red→green. Revalidado numa árvore combinada das PRs da 2ª leva da Trilha B (#14415 #14472 #14468 #14493 #14403) sobre o tip atual de `release/v3.8.51`:
- 104/104 testes node focados + 46/46 vitest (as 6 suítes de UI que saíram da quarentena); `check:provider-consistency` OK (359)
- `typecheck:core`: só o herdado `cliproxyAccountHealth.ts:157`; `check:open-sse-typecheck`: só o herdado `auggie.ts` (base-red #14547, corrigido pela #14511)
- eslint nos arquivos alterados limpo; file-size OK
diegosouzapw added a commit that referenced this pull request Sep 24, 2026
…h a one-shot bootstrap token (#14296) (#14472)

Merge-batch 2026-09-23 (PRs do mantenedor, Trilha B, retrabalhada).

Um worker corrigiu o defeito apontado na revisão direto no branch da PR; o detalhe está na seção "Rework (merge-batch 2026-09-23)" do corpo, com a prova de red→green. Revalidado numa árvore combinada das PRs da 2ª leva da Trilha B (#14415 #14472 #14468 #14493 #14403) sobre o tip atual de `release/v3.8.51`:
- 104/104 testes node focados + 46/46 vitest (as 6 suítes de UI que saíram da quarentena); `check:provider-consistency` OK (359)
- `typecheck:core`: só o herdado `cliproxyAccountHealth.ts:157`; `check:open-sse-typecheck`: só o herdado `auggie.ts` (base-red #14547, corrigido pela #14511)
- eslint nos arquivos alterados limpo; file-size OK
@diegosouzapw
diegosouzapw merged commit 4af4937 into release/v3.8.51 Sep 24, 2026
14 of 21 checks passed
diegosouzapw added a commit that referenced this pull request Sep 24, 2026
Merge-batch 2026-09-23 (PRs do mantenedor, Trilha B, retrabalhada).

Um worker corrigiu o defeito apontado na revisão direto no branch da PR; o detalhe está na seção "Rework (merge-batch 2026-09-23)" do corpo, com a prova de red→green. Revalidado numa árvore combinada das PRs da 2ª leva da Trilha B (#14415 #14472 #14468 #14493 #14403) sobre o tip atual de `release/v3.8.51`:
- 104/104 testes node focados + 46/46 vitest (as 6 suítes de UI que saíram da quarentena); `check:provider-consistency` OK (359)
- `typecheck:core`: só o herdado `cliproxyAccountHealth.ts:157`; `check:open-sse-typecheck`: só o herdado `auggie.ts` (base-red #14547, corrigido pela #14511)
- eslint nos arquivos alterados limpo; file-size OK
diegosouzapw added a commit that referenced this pull request Sep 24, 2026
Merge-batch 2026-09-23 (PRs do mantenedor, Trilha B, retrabalhada).

Um worker corrigiu o defeito apontado na revisão direto no branch da PR; o detalhe está na seção "Rework (merge-batch 2026-09-23)" do corpo, com a prova de red→green. Revalidado numa árvore combinada das PRs da 2ª leva da Trilha B (#14415 #14472 #14468 #14493 #14403) sobre o tip atual de `release/v3.8.51`:
- 104/104 testes node focados + 46/46 vitest (as 6 suítes de UI que saíram da quarentena); `check:provider-consistency` OK (359)
- `typecheck:core`: só o herdado `cliproxyAccountHealth.ts:157`; `check:open-sse-typecheck`: só o herdado `auggie.ts` (base-red #14547, corrigido pela #14511)
- eslint nos arquivos alterados limpo; file-size OK
diegosouzapw added a commit that referenced this pull request Sep 24, 2026
… key compared without timing-safe check (#14485) (#14571)

Merge-batch 2026-09-23 (PRs do mantenedor, Trilha B).

A reconciliação com o tip atual de `release/v3.8.51` foi feita no branch da PR; o detalhe está na seção "Rework (merge-batch 2026-09-23)" do corpo, quando existe.
- #14571: a política de API key passa a rodar só quando o divert self-hosted está configurado (antes rodava 2x em toda request cloud). Prova red→green: o teste "cloud request runs the key policy ONCE" dava 429 na versão anterior e agora 5/5 passam; 29/29 no total.
- #14465: re-medido depois do merge do tip. chat.ts 2560→2561 e chatHelpers.ts 1257→1258 (+1 cada, plumbing de `forcedConnectionId`), com anotação datada dentro de `frozen`. 11/11 testes focados (inclui o guard #5849).
- #14467: reconciliada depois da #14468 (suno). Contagem de providers regerada = 358 (`gen:provider-reference` + `check:provider-consistency`); REMOVED_PROVIDERS/blocklist com as duas entradas; tripwire de prefixos reservados re-medido em 412; AGENTS.md/llm.txt mudam só o número (aprovado pelo dono). 57/57 testes focados.
- Em todas: `typecheck:core` mostra só o herdado `cliproxyAccountHealth.ts:157`, e o único vermelho de `check:open-sse-typecheck` é o herdado `auggie.ts` (#14547).
diegosouzapw added a commit that referenced this pull request Sep 24, 2026
…ders (#14116) (#14465)

Merge-batch 2026-09-23 (PRs do mantenedor, Trilha B).

A reconciliação com o tip atual de `release/v3.8.51` foi feita no branch da PR; o detalhe está na seção "Rework (merge-batch 2026-09-23)" do corpo, quando existe.
- #14571: a política de API key passa a rodar só quando o divert self-hosted está configurado (antes rodava 2x em toda request cloud). Prova red→green: o teste "cloud request runs the key policy ONCE" dava 429 na versão anterior e agora 5/5 passam; 29/29 no total.
- #14465: re-medido depois do merge do tip. chat.ts 2560→2561 e chatHelpers.ts 1257→1258 (+1 cada, plumbing de `forcedConnectionId`), com anotação datada dentro de `frozen`. 11/11 testes focados (inclui o guard #5849).
- #14467: reconciliada depois da #14468 (suno). Contagem de providers regerada = 358 (`gen:provider-reference` + `check:provider-consistency`); REMOVED_PROVIDERS/blocklist com as duas entradas; tripwire de prefixos reservados re-medido em 412; AGENTS.md/llm.txt mudam só o número (aprovado pelo dono). 57/57 testes focados.
- Em todas: `typecheck:core` mostra só o herdado `cliproxyAccountHealth.ts:157`, e o único vermelho de `check:open-sse-typecheck` é o herdado `auggie.ts` (#14547).
diegosouzapw added a commit that referenced this pull request Sep 24, 2026
…nt to validate rewrite (#14217) (#14467)

Merge-batch 2026-09-23 (PRs do mantenedor, Trilha B).

A reconciliação com o tip atual de `release/v3.8.51` foi feita no branch da PR; o detalhe está na seção "Rework (merge-batch 2026-09-23)" do corpo, quando existe.
- #14571: a política de API key passa a rodar só quando o divert self-hosted está configurado (antes rodava 2x em toda request cloud). Prova red→green: o teste "cloud request runs the key policy ONCE" dava 429 na versão anterior e agora 5/5 passam; 29/29 no total.
- #14465: re-medido depois do merge do tip. chat.ts 2560→2561 e chatHelpers.ts 1257→1258 (+1 cada, plumbing de `forcedConnectionId`), com anotação datada dentro de `frozen`. 11/11 testes focados (inclui o guard #5849).
- #14467: reconciliada depois da #14468 (suno). Contagem de providers regerada = 358 (`gen:provider-reference` + `check:provider-consistency`); REMOVED_PROVIDERS/blocklist com as duas entradas; tripwire de prefixos reservados re-medido em 412; AGENTS.md/llm.txt mudam só o número (aprovado pelo dono). 57/57 testes focados.
- Em todas: `typecheck:core` mostra só o herdado `cliproxyAccountHealth.ts:157`, e o único vermelho de `check:open-sse-typecheck` é o herdado `auggie.ts` (#14547).
diegosouzapw added a commit that referenced this pull request Sep 24, 2026
…irement, extracted failure projection

- docs: migration count 182 -> 183 in README, AGENTS.md and llm.txt (+ the
  66 llm.txt mirrors), same shape as #14559; migration 185 landed with #14544.
- #14468 retired suno: APIKEY_PROVIDERS 242 -> 241 and the translate-path
  golden loses the suno entry (regenerated; that is the only diff).
- #14527 moved the retained provider-failure projection into
  chatCore/providerFailureRetention.ts; the public-error guard now follows the
  call and still requires sanitizeErrorMessage() at the projection.

Refs #14496
diegosouzapw added a commit to gonisulaimann/OmniRoute that referenced this pull request Sep 24, 2026
…golden

cheaper-inference#14468 retired suno from the registry but left its block in the committed
translate-path golden, so the golden test stayed red on the release tip even
after the deepseek realignment. Regenerated with UPDATE_GOLDEN=1 against the
current registry; the only change is the suno block removal.
diegosouzapw added a commit to chirag127/OmniRoute that referenced this pull request Sep 29, 2026
…y the earlier release merge

release/v3.8.52 retired the suno provider (cheaper-inference#14468) and removed
providers.onboardingProviderDescriptions.suno from every catalog; the
branch's earlier merge of release/v3.8.51 had brought the key back in
42 locales, so i18n:check-keys failed with 25 locales missing a key that
en.json carried. Aligns the catalogs with the tip.

Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
@diegosouzapw
diegosouzapw deleted the fix/14224-retire-suno branch October 18, 2026 23:49
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.

fix(providers): suno: studio-api.suno.ai returns 503 Service Suspended — move to studio-api-prod.suno.com

1 participant