Skip to content

feat(providers): add Sarvam AI, Writer Palmyra and PLaMo API-key providers - #8161

Merged
diegosouzapw merged 3 commits into
diegosouzapw:release/v3.8.49from
alvaretto:feat/providers-tier2
Jul 23, 2026
Merged

diegosouzapw merged 3 commits into
diegosouzapw:release/v3.8.49from
alvaretto:feat/providers-tier2

Conversation

@alvaretto

Copy link
Copy Markdown
Contributor

Adds three OpenAI-compatible API-key providers: Sarvam AI (India), Writer Palmyra and PLaMo (Preferred Networks, Japan).

Each endpoint was smoke-tested against the live upstream before writing the registry entry, so no baseUrl here is copied from documentation alone.

Verification

Provider Probe Result
sarvam GET https://api.sarvam.ai/v1/models 200 unauthenticated, lists sarvam-105b + sarvam-30b
sarvam POST /v1/chat/completions 403 with OpenAI-shaped {"error":{"code":"invalid_api_key_error"}}
writer POST https://api.writer.com/v1/chat/completions 401 auth error
writer POST /v1/definitely-not-a-real-route-xyz 404 endpoint not available via API gateway
plamo GET https://api.platform.preferredai.jp/v1/models 400 missing key in request header

The Writer negative control matters: their documented chat route is /v1/chat, so a bare 401 on /v1/chat/completions would not by itself prove the OpenAI alias exists. Because an unknown path returns a distinct 404 from the gateway, the 401 confirms /v1/chat/completions is a real route.

Deliberate omissions

  • sarvam-m — discontinued upstream; only sarvam-105b (128K) and sarvam-30b (64K) are registered.
  • Palmyra medical / financial / creative / vision — deprecated upstream, so only palmyra-x5 (1M ctx) and palmyra-x4 (128K) are registered.
  • plamo-3.0-prime-beta (discontinued 2026-07-31) and plamo-2.2-prime (discontinued 2026-09-30) — only plamo-3.0-prime (262K ctx) is wired up.

Free-tier metadata is claimed only where it is documented and durable. Sarvam ships a permanent signup credit that does not expire, so it is marked hasFree: true. PLaMo's 10M-token grant is a launch campaign that expires 2026-07-31 and Writer documents no free tier, so both are hasFree: false.

Validation

typecheck:core, lint, check:provider-consistency, check:docs-sync, check:doc-links, check:docs-counts, plus tests/unit/chat-openai-compat-providers.test.ts and the provider-translate-path-golden suite — all green. The golden snapshot diff was audited structurally: exactly the three new ids added, no existing entry modified or removed.

Two gate failures reproduce identically on release/v3.8.49 without this branch and are left untouched as out of scope:

  • lint — 271 no-explicit-any errors in tests/unit/combo-routing-engine.test.ts (arrived with feat(routing): add prompt-cache affinity #8008); config/quality/eslint-suppressions.json still allows 269.
  • check:docs-counts — README claims "11 composable engines" while the code has 12.

@alvaretto
alvaretto requested a review from diegosouzapw as a code owner July 22, 2026 13:49
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

…iders

Three OpenAI-compatible API-key providers, each verified against a live
endpoint smoke test before registration:

- sarvam (India): /v1/models answers 200 unauthenticated and lists
  sarvam-105b (128K ctx) and sarvam-30b (64K ctx). The older sarvam-m is
  discontinued upstream and is deliberately not registered.
- writer (Palmyra): api.writer.com exposes the OpenAI alias
  /v1/chat/completions alongside its native /v1/chat — confirmed with a
  negative control, since an unknown route answers 404 'endpoint not
  available via API gateway' while /v1/chat/completions answers 401.
  Registers palmyra-x5 (1M ctx) and palmyra-x4 (128K ctx); the
  medical/financial/creative/vision variants are deprecated upstream and
  are omitted.
- plamo (Preferred Networks, Japan): only plamo-3.0-prime (262K ctx) is
  registered. plamo-3.0-prime-beta is discontinued on 2026-07-31 and
  plamo-2.2-prime on 2026-09-30, so neither is worth wiring up.

Free-tier metadata is claimed only where it is documented and durable:
Sarvam ships a permanent signup credit, while PLaMo's 10M-token grant is
a campaign that expires on 2026-07-31 and Writer documents no free tier,
so both are registered with hasFree: false.
@alvaretto
alvaretto force-pushed the feat/providers-tier2 branch from 7575869 to fedd7b0 Compare July 22, 2026 14:57
# Conflicts:
#	README.md
#	docs/reference/PROVIDER_REFERENCE.md
#	open-sse/config/providers/index.ts
#	src/app/api/providers/[id]/models/discovery/providerSets.ts
#	tests/unit/chat-openai-compat-providers.test.ts
@diegosouzapw

Copy link
Copy Markdown
Owner

Thanks, @alvaretto! 🙏 Merged — adds Sarvam AI, Writer Palmyra and PLaMo as API-key providers. Rebased onto the current release tip (union-merged the provider registry with the sibling #8077 additions, regenerated PROVIDER_REFERENCE.md + the translate-path golden, dropped a stray 1MB K3banner-1.png and the stale bundle noise). provider-consistency + golden gates green.

@diegosouzapw
diegosouzapw merged commit 7ca821a into diegosouzapw:release/v3.8.49 Jul 23, 2026
2 of 5 checks passed
diegosouzapw added a commit that referenced this pull request Jul 24, 2026
…ate (#8386)

* test: realign catalog snapshot tests to current deliberate catalog state

Six catalog/snapshot tests drifted behind deliberate catalog changes that
were already validated by newer sibling tests. No production code touched;
every change aligns a stale snapshot to behavior already validated by newer
sibling tests.

Root causes (all confirmed against the current code before editing):

- tests/unit/providers-constants-split.test.ts: APIKEY_PROVIDERS grew from
  187 to 195 entries via #8077 (clova-studio/internlm/ant-ling, regional),
  #8161 (sarvam/plamo → regional, writer → frontier-labs) and #8170
  (typhoon → regional, inception → frontier-labs). Family counts verified
  to sum to 195 (gateways 60, frontier-labs 24, inference-hosts 28,
  enterprise-cloud 17, regional 40, specialty-media 26) with no duplicates.
  Updated the two assertions and extended the changelog comment.

- tests/unit/qianfan-provider.test.ts: the expected Baidu Qianfan website
  URL was the pre-#8128 wenxinworkshop path. #8128/#6271 moved it to
  https://cloud.baidu.com/product-s/qianfan_home, already locked by the
  sibling regression test tests/unit/baidu-qianfan-website-urls-6271.test.ts.

- tests/unit/t31-t33-t34-t38-model-specs.test.ts and
  tests/unit/auto-combo-credentialed-model-pool.test.ts: the Antigravity
  catalog refactor (#8013) retired gemini-3-pro-preview/claude-sonnet-5 and
  renamed the Gemini 3.5 Flash tiers (low/medium/high ->
  extra-low/low/gemini-3-flash-agent), confirmed against
  ANTIGRAVITY_PUBLIC_MODELS and tests/unit/antigravity-retired-public-models.test.ts.
  Swapped the retired IDs for currently-registered ones
  (gemini-3.6-flash-high, claude-sonnet-4-6, gemini-3-flash-agent,
  gemini-3.5-flash-low/extra-low) and moved the wildcard-exclusion prefix
  test from the now-2-tier "gemini-3.5-*" group to "gemini-3.6-*", which has
  3 real tiers today (same >=3 semantics, just pointed at a prefix that
  still has 3 members).

- tests/unit/model-alias-seed.test.ts: getModelInfo("gemini-3.1-pro") now
  canonicalizes through ALIAS_TO_PROVIDER_ID["agy"] = "antigravity" (#8050),
  the same pattern already applied to opencode -> opencode-zen. Updated the
  expected provider id.

- tests/unit/video-dashscope.test.ts (deleted, 216 lines): #8266
  reorganized the Alibaba video catalog so the flat wan2.7-t2v id no longer
  exists under the plain "alibaba" provider (only the dated
  wan2.7-t2v-2026-06-12 does); the flat id now lives only under
  "qwen-cloud". All 6 tests in the file failed because they built  requests
  against alibaba/wan2.7-t2v, which the new allowlist now rejects with 400
  ("unsupported alibaba video model") - verified directly against
  VIDEO_PROVIDERS in open-sse/config/videoRegistry.ts. Coverage already
  exists and was confirmed passing pre-deletion in
  tests/unit/alibaba-video-media.test.ts (including an explicit
  "Alibaba rejects video models outside its own allowlist" case for this
  exact id) and tests/unit/qwen-cloud-video-media.test.ts (covers the same
  id under qwen-cloud). Note: the deleted file's DashScope upstream
  error-path assertions (401 missing credentials, 502 missing task_id, 502
  FAILED status, 504 poll timeout) don't have a byte-for-byte equivalent in
  the two replacement files, though the shared dashscopeHandler.ts code
  path they exercise remains covered by several sibling *-media.test.ts
  files for the happy path and local validation.

- tests/unit/authz/spawn-capable-prefixes-client-safe.test.ts: #7892 added
  /api/vnc-session to the SPAWN_CAPABLE_PREFIXES deny-list (Hard Rules
  #15/#17 hardening). Bumped the expected length 10 -> 11 and added the
  entry to the test's named list for documentation.

Refs #8013, #8050, #8266, #7892, #8128

* chore(quality): allowlist the video-dashscope.test.ts deletion with its replacements

check:test-masking (pr-test-policy CI gate) requires a _deletedWithReplacement
entry for any deleted test file, even when the deletion is a verified-legitimate
supersession. Documents the same #8266 rationale from the prior commit in the
machine-checked allowlist so the deletion is not flagged as unexplained masking.

Refs #8266
HouMinXi pushed a commit to HouMinXi/OmniRoute that referenced this pull request Aug 2, 2026
…iders (diegosouzapw#8161)

* feat(providers): add Sarvam AI, Writer Palmyra and PLaMo API-key providers

Three OpenAI-compatible API-key providers, each verified against a live
endpoint smoke test before registration:

- sarvam (India): /v1/models answers 200 unauthenticated and lists
  sarvam-105b (128K ctx) and sarvam-30b (64K ctx). The older sarvam-m is
  discontinued upstream and is deliberately not registered.
- writer (Palmyra): api.writer.com exposes the OpenAI alias
  /v1/chat/completions alongside its native /v1/chat — confirmed with a
  negative control, since an unknown route answers 404 'endpoint not
  available via API gateway' while /v1/chat/completions answers 401.
  Registers palmyra-x5 (1M ctx) and palmyra-x4 (128K ctx); the
  medical/financial/creative/vision variants are deprecated upstream and
  are omitted.
- plamo (Preferred Networks, Japan): only plamo-3.0-prime (262K ctx) is
  registered. plamo-3.0-prime-beta is discontinued on 2026-07-31 and
  plamo-2.2-prime on 2026-09-30, so neither is worth wiring up.

Free-tier metadata is claimed only where it is documented and durable:
Sarvam ships a permanent signup credit, while PLaMo's 10M-token grant is
a campaign that expires on 2026-07-31 and Writer documents no free tier,
so both are registered with hasFree: false.

* regen golden+ref

---------

Co-authored-by: Álvaro Ángel Molina <alvaretto@users.noreply.github.com>
Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
HouMinXi pushed a commit to HouMinXi/OmniRoute that referenced this pull request Aug 2, 2026
…ate (diegosouzapw#8386)

* test: realign catalog snapshot tests to current deliberate catalog state

Six catalog/snapshot tests drifted behind deliberate catalog changes that
were already validated by newer sibling tests. No production code touched;
every change aligns a stale snapshot to behavior already validated by newer
sibling tests.

Root causes (all confirmed against the current code before editing):

- tests/unit/providers-constants-split.test.ts: APIKEY_PROVIDERS grew from
  187 to 195 entries via diegosouzapw#8077 (clova-studio/internlm/ant-ling, regional),
  diegosouzapw#8161 (sarvam/plamo → regional, writer → frontier-labs) and diegosouzapw#8170
  (typhoon → regional, inception → frontier-labs). Family counts verified
  to sum to 195 (gateways 60, frontier-labs 24, inference-hosts 28,
  enterprise-cloud 17, regional 40, specialty-media 26) with no duplicates.
  Updated the two assertions and extended the changelog comment.

- tests/unit/qianfan-provider.test.ts: the expected Baidu Qianfan website
  URL was the pre-diegosouzapw#8128 wenxinworkshop path. diegosouzapw#8128/diegosouzapw#6271 moved it to
  https://cloud.baidu.com/product-s/qianfan_home, already locked by the
  sibling regression test tests/unit/baidu-qianfan-website-urls-6271.test.ts.

- tests/unit/t31-t33-t34-t38-model-specs.test.ts and
  tests/unit/auto-combo-credentialed-model-pool.test.ts: the Antigravity
  catalog refactor (diegosouzapw#8013) retired gemini-3-pro-preview/claude-sonnet-5 and
  renamed the Gemini 3.5 Flash tiers (low/medium/high ->
  extra-low/low/gemini-3-flash-agent), confirmed against
  ANTIGRAVITY_PUBLIC_MODELS and tests/unit/antigravity-retired-public-models.test.ts.
  Swapped the retired IDs for currently-registered ones
  (gemini-3.6-flash-high, claude-sonnet-4-6, gemini-3-flash-agent,
  gemini-3.5-flash-low/extra-low) and moved the wildcard-exclusion prefix
  test from the now-2-tier "gemini-3.5-*" group to "gemini-3.6-*", which has
  3 real tiers today (same >=3 semantics, just pointed at a prefix that
  still has 3 members).

- tests/unit/model-alias-seed.test.ts: getModelInfo("gemini-3.1-pro") now
  canonicalizes through ALIAS_TO_PROVIDER_ID["agy"] = "antigravity" (diegosouzapw#8050),
  the same pattern already applied to opencode -> opencode-zen. Updated the
  expected provider id.

- tests/unit/video-dashscope.test.ts (deleted, 216 lines): diegosouzapw#8266
  reorganized the Alibaba video catalog so the flat wan2.7-t2v id no longer
  exists under the plain "alibaba" provider (only the dated
  wan2.7-t2v-2026-06-12 does); the flat id now lives only under
  "qwen-cloud". All 6 tests in the file failed because they built  requests
  against alibaba/wan2.7-t2v, which the new allowlist now rejects with 400
  ("unsupported alibaba video model") - verified directly against
  VIDEO_PROVIDERS in open-sse/config/videoRegistry.ts. Coverage already
  exists and was confirmed passing pre-deletion in
  tests/unit/alibaba-video-media.test.ts (including an explicit
  "Alibaba rejects video models outside its own allowlist" case for this
  exact id) and tests/unit/qwen-cloud-video-media.test.ts (covers the same
  id under qwen-cloud). Note: the deleted file's DashScope upstream
  error-path assertions (401 missing credentials, 502 missing task_id, 502
  FAILED status, 504 poll timeout) don't have a byte-for-byte equivalent in
  the two replacement files, though the shared dashscopeHandler.ts code
  path they exercise remains covered by several sibling *-media.test.ts
  files for the happy path and local validation.

- tests/unit/authz/spawn-capable-prefixes-client-safe.test.ts: diegosouzapw#7892 added
  /api/vnc-session to the SPAWN_CAPABLE_PREFIXES deny-list (Hard Rules
  diegosouzapw#15/diegosouzapw#17 hardening). Bumped the expected length 10 -> 11 and added the
  entry to the test's named list for documentation.

Refs diegosouzapw#8013, diegosouzapw#8050, diegosouzapw#8266, diegosouzapw#7892, diegosouzapw#8128

* chore(quality): allowlist the video-dashscope.test.ts deletion with its replacements

check:test-masking (pr-test-policy CI gate) requires a _deletedWithReplacement
entry for any deleted test file, even when the deletion is a verified-legitimate
supersession. Documents the same diegosouzapw#8266 rationale from the prior commit in the
machine-checked allowlist so the deletion is not flagged as unexplained masking.

Refs diegosouzapw#8266
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…iders (diegosouzapw#8161)

* feat(providers): add Sarvam AI, Writer Palmyra and PLaMo API-key providers

Three OpenAI-compatible API-key providers, each verified against a live
endpoint smoke test before registration:

- sarvam (India): /v1/models answers 200 unauthenticated and lists
  sarvam-105b (128K ctx) and sarvam-30b (64K ctx). The older sarvam-m is
  discontinued upstream and is deliberately not registered.
- writer (Palmyra): api.writer.com exposes the OpenAI alias
  /v1/chat/completions alongside its native /v1/chat — confirmed with a
  negative control, since an unknown route answers 404 'endpoint not
  available via API gateway' while /v1/chat/completions answers 401.
  Registers palmyra-x5 (1M ctx) and palmyra-x4 (128K ctx); the
  medical/financial/creative/vision variants are deprecated upstream and
  are omitted.
- plamo (Preferred Networks, Japan): only plamo-3.0-prime (262K ctx) is
  registered. plamo-3.0-prime-beta is discontinued on 2026-07-31 and
  plamo-2.2-prime on 2026-09-30, so neither is worth wiring up.

Free-tier metadata is claimed only where it is documented and durable:
Sarvam ships a permanent signup credit, while PLaMo's 10M-token grant is
a campaign that expires on 2026-07-31 and Writer documents no free tier,
so both are registered with hasFree: false.

* regen golden+ref

---------

Co-authored-by: Álvaro Ángel Molina <alvaretto@users.noreply.github.com>
Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…ate (diegosouzapw#8386)

* test: realign catalog snapshot tests to current deliberate catalog state

Six catalog/snapshot tests drifted behind deliberate catalog changes that
were already validated by newer sibling tests. No production code touched;
every change aligns a stale snapshot to behavior already validated by newer
sibling tests.

Root causes (all confirmed against the current code before editing):

- tests/unit/providers-constants-split.test.ts: APIKEY_PROVIDERS grew from
  187 to 195 entries via diegosouzapw#8077 (clova-studio/internlm/ant-ling, regional),
  diegosouzapw#8161 (sarvam/plamo → regional, writer → frontier-labs) and diegosouzapw#8170
  (typhoon → regional, inception → frontier-labs). Family counts verified
  to sum to 195 (gateways 60, frontier-labs 24, inference-hosts 28,
  enterprise-cloud 17, regional 40, specialty-media 26) with no duplicates.
  Updated the two assertions and extended the changelog comment.

- tests/unit/qianfan-provider.test.ts: the expected Baidu Qianfan website
  URL was the pre-diegosouzapw#8128 wenxinworkshop path. diegosouzapw#8128/diegosouzapw#6271 moved it to
  https://cloud.baidu.com/product-s/qianfan_home, already locked by the
  sibling regression test tests/unit/baidu-qianfan-website-urls-6271.test.ts.

- tests/unit/t31-t33-t34-t38-model-specs.test.ts and
  tests/unit/auto-combo-credentialed-model-pool.test.ts: the Antigravity
  catalog refactor (diegosouzapw#8013) retired gemini-3-pro-preview/claude-sonnet-5 and
  renamed the Gemini 3.5 Flash tiers (low/medium/high ->
  extra-low/low/gemini-3-flash-agent), confirmed against
  ANTIGRAVITY_PUBLIC_MODELS and tests/unit/antigravity-retired-public-models.test.ts.
  Swapped the retired IDs for currently-registered ones
  (gemini-3.6-flash-high, claude-sonnet-4-6, gemini-3-flash-agent,
  gemini-3.5-flash-low/extra-low) and moved the wildcard-exclusion prefix
  test from the now-2-tier "gemini-3.5-*" group to "gemini-3.6-*", which has
  3 real tiers today (same >=3 semantics, just pointed at a prefix that
  still has 3 members).

- tests/unit/model-alias-seed.test.ts: getModelInfo("gemini-3.1-pro") now
  canonicalizes through ALIAS_TO_PROVIDER_ID["agy"] = "antigravity" (diegosouzapw#8050),
  the same pattern already applied to opencode -> opencode-zen. Updated the
  expected provider id.

- tests/unit/video-dashscope.test.ts (deleted, 216 lines): diegosouzapw#8266
  reorganized the Alibaba video catalog so the flat wan2.7-t2v id no longer
  exists under the plain "alibaba" provider (only the dated
  wan2.7-t2v-2026-06-12 does); the flat id now lives only under
  "qwen-cloud". All 6 tests in the file failed because they built  requests
  against alibaba/wan2.7-t2v, which the new allowlist now rejects with 400
  ("unsupported alibaba video model") - verified directly against
  VIDEO_PROVIDERS in open-sse/config/videoRegistry.ts. Coverage already
  exists and was confirmed passing pre-deletion in
  tests/unit/alibaba-video-media.test.ts (including an explicit
  "Alibaba rejects video models outside its own allowlist" case for this
  exact id) and tests/unit/qwen-cloud-video-media.test.ts (covers the same
  id under qwen-cloud). Note: the deleted file's DashScope upstream
  error-path assertions (401 missing credentials, 502 missing task_id, 502
  FAILED status, 504 poll timeout) don't have a byte-for-byte equivalent in
  the two replacement files, though the shared dashscopeHandler.ts code
  path they exercise remains covered by several sibling *-media.test.ts
  files for the happy path and local validation.

- tests/unit/authz/spawn-capable-prefixes-client-safe.test.ts: diegosouzapw#7892 added
  /api/vnc-session to the SPAWN_CAPABLE_PREFIXES deny-list (Hard Rules
  diegosouzapw#15/diegosouzapw#17 hardening). Bumped the expected length 10 -> 11 and added the
  entry to the test's named list for documentation.

Refs diegosouzapw#8013, diegosouzapw#8050, diegosouzapw#8266, diegosouzapw#7892, diegosouzapw#8128

* chore(quality): allowlist the video-dashscope.test.ts deletion with its replacements

check:test-masking (pr-test-policy CI gate) requires a _deletedWithReplacement
entry for any deleted test file, even when the deletion is a verified-legitimate
supersession. Documents the same diegosouzapw#8266 rationale from the prior commit in the
machine-checked allowlist so the deletion is not flagged as unexplained masking.

Refs diegosouzapw#8266
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