Skip to content

fix(embeddings): remove non-existent voyage-multilingual-3.5, add missing models - #7425

Closed
kamenkadmitry wants to merge 9 commits into
cheaper-inference:release/v3.8.49from
careerfactory:fix/voyage-embedding-registry-models
Closed

kamenkadmitry wants to merge 9 commits into
cheaper-inference:release/v3.8.49from
careerfactory:fix/voyage-embedding-registry-models

Conversation

@kamenkadmitry

Copy link
Copy Markdown
Contributor

Summary

  • Removed voyage-multilingual-3.5 from the Voyage AI embedding registry — this model does not exist in the Voyage AI API and causes HTTP 400 on every request: "Model voyage-multilingual-3.5 is not supported." The model was added to the registry by mistake.

  • Added voyage-multilingual-2 — the real multilingual embedding model from Voyage AI, which was missing from the registry.

  • Added voyage-3.5 and voyage-3.5-lite — both exist in the Voyage AI API and were missing from the registry.

Verification

Confirmed directly against the Voyage AI API that voyage-multilingual-3.5 is rejected while voyage-multilingual-2, voyage-3.5, and voyage-3.5-lite are all accepted.

Changes

File Change
open-sse/config/embeddingRegistry.ts Remove voyage-multilingual-3.5; add voyage-3.5, voyage-3.5-lite, voyage-multilingual-2
tests/unit/embedding-rerank-provider-registry.test.ts 3 new tests: verify voyage-multilingual-3.5 is absent, voyage-multilingual-2 is present, voyage-3.5 + voyage-3.5-lite are present

Test plan

  • node --import tsx/esm --test tests/unit/embedding-rerank-provider-registry.test.ts — 7/7 pass (3 new)
  • Pre-commit hooks (prettier, eslint, docs-sync, any-budget check, tracked-artifacts) — pass
  • Manual: verify all Voyage AI embedding models pass test-all

Generated with Devin

diegosouzapw and others added 7 commits July 14, 2026 13:28
…uto_merge_conditions (rules-based path is EOL 2026-07-16) (cheaper-inference#7216)
…in's copy hard-fails every PR (cheaper-inference#7341)

main's copy of this test still does git I/O inside a unit test:

    const baseSrc = git(['show', 'origin/main:' + FILE]);

Runners check out a shallow single ref, so origin/main does not resolve and the
test dies with 'fatal: invalid object name origin/main'. Every PR into main
fails Unit Tests (7/8) on it — today that is cheaper-inference#7313, cheaper-inference#7315, cheaper-inference#7316, cheaper-inference#7334, cheaper-inference#7336
and cheaper-inference#7337, six PRs red on a defect none of them introduced. cheaper-inference#7313 has no other
red at all.

release/v3.8.49 already carries a fix (2e42b8e, cheaper-inference#7174: try/catch, fetch
origin/main on demand, t.skip() when unreachable), but it only reaches main at
release time — so main stays broken for the whole cycle. Cherry-picking it would
also import a new problem: PR Test Policy classifies t.skip() as a silenced
assertion, which we watched it correctly catch on cheaper-inference#7300 today.

This is the hermetic version instead (ported from cheaper-inference#7327, which does the same for
the release branch): read the file straight off disk, compare against an empty
base so baseTaut/baseExtTaut are 0 — the strictest possible comparison point —
and call evaluateMasking() directly. No git ref, no fetch, no skip, nothing the
runner's checkout depth can break.

The cheaper-inference#6634 regression stays covered: the guard's logic lives in
SELF_TEST_FIXTURE_RE (check-test-masking.mjs:337), not in the test. Proven both
ways on main before committing — neutralise SELF_TEST_FIXTURE_RE to /$^/ and
the test FAILS; restore it and it passes 2/2, with check-test-masking.mjs left
byte-identical.

Co-authored-by: growab <nekron@icloud.com>
…bers (cheaper-inference#7347)

main's ratchet had been failing --require-tighten on every PR: 11 metrics
improved but the baseline was never tightened. Same class as the cheaper-inference#6634
selfref guard — an infra fix that lands only on the release branch leaves
main red for the whole cycle, and every PR into main pays for it.

Values are the merged-coverage numbers from a run on main itself (a local
run measures ~68% vs CI's ~80%; the baseline's own note warns about that
gap). Only the 11 coverage values change — gitleaks and semgrepFindings
keep main's own state.

No changelog fragment: cheaper-inference#7326 carries it on release/v3.8.49, and a second
one here would double the entry at release time.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates the Voyage AI embedding models in the registry, adds proxy support for rerank requests, and strips the top_n parameter from Voyage AI rerank requests to prevent HTTP 400 errors. Feedback points out that because top_n is stripped from the upstream request, the response adapter must be updated to slice the returned results so the client's requested limit is still respected, along with adding corresponding test coverage.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread open-sse/handlers/rerank.ts Outdated
Comment on lines +54 to +57
if (providerConfig.format === "voyage") {
const { top_n: _top_n, ...rest } = body;
return rest;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Stripping top_n from the upstream request to Voyage AI is necessary because their API rejects it. However, because transformResponseFromProvider does not handle the voyage format, the full list of reranked documents returned by Voyage AI is passed back to the client. This means the client's requested top_n limit is ignored, and they will receive more results than expected.

To fix this, transformResponseFromProvider should be updated to slice the results array when providerConfig.format === "voyage", similar to how it is handled for deepinfra.

Example fix for transformResponseFromProvider (which is outside the current diff):

if (providerConfig.format === "voyage") {
  const topN = typeof options.top_n === "number" && options.top_n > 0 ? options.top_n : undefined;
  return {
    ...data,
    results: topN && Array.isArray(data.results) ? data.results.slice(0, topN) : data.results,
  };
}

Comment on lines +72 to +87
test("#7350 voyage-ai request adapter strips top_n (Voyage API rejects it)", () => {
const cfg = getRerankProvider("voyage-ai");
assert.equal(cfg.format, "voyage");
const out = transformRequestForProvider(cfg, {
model: "rerank-2.5",
query: "q",
documents: ["a", "b"],
top_n: 1,
return_documents: false,
});
assert.equal("top_n" in out, false, "top_n must be stripped for voyage-ai");
assert.equal(out.model, "rerank-2.5");
assert.equal(out.query, "q");
assert.deepEqual(out.documents, ["a", "b"]);
assert.equal(out.return_documents, false);
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The test verifies that top_n is stripped from the request, but there is no test verifying that the client's requested top_n is actually respected in the returned response. Since top_n is stripped from the upstream request, Voyage AI will return all documents. Without slicing the results in the response adapter, the client will receive all documents instead of the requested subset.

Consider adding a test case to verify that the response adapter correctly slices the results for the voyage format when top_n is specified.

…sing models

voyage-multilingual-3.5 does not exist in the Voyage AI API and causes
HTTP 400 on every request. Removed it and added voyage-multilingual-2
(the real multilingual model), voyage-3.5, and voyage-3.5-lite which
were missing from the registry.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@kamenkadmitry
kamenkadmitry force-pushed the fix/voyage-embedding-registry-models branch from c1f614f to f13694d Compare July 16, 2026 14:30
@diegosouzapw

Copy link
Copy Markdown
Collaborator

Thanks for tracking this down and verifying directly against the Voyage AI API — I confirmed independently against Voyage's docs that voyage-multilingual-3.5 doesn't exist and that voyage-3.5, voyage-3.5-lite, and voyage-multilingual-2 are the real model IDs, so this fix is correct. Ran your test file locally: 7/7 pass, lint clean, no conflicts with the other open embeddings/rerank PRs. Merging as-is; I'll just adjust the commit message on merge (drop the Devin footer/trailer per our commit conventions) and may tweak the voyage-3.5-lite dimensions value (1024 is Voyage's documented default, 512 is an alternate option) and the #7351 reference in the test comment (that issue number points at an unrelated PR) — neither blocks the fix itself.

@diegosouzapw
diegosouzapw changed the base branch from main to release/v3.8.49 July 17, 2026 19:58
@diegosouzapw

Copy link
Copy Markdown
Collaborator

Heads-up @kamenkadmitry: this PR is currently CONFLICTING with release/v3.8.49 — the branch adds its own .mergify.yml (from an older base) which now collides with the repo's current queue config (add/add). We resolved it locally keeping the tip's config, but the head fork is an organization repo (careerfactory), so maintainer pushes are rejected (403) even with edits-allowed. Could you either merge release/v3.8.49 into your branch keeping the repo's .mergify.yml, or re-open the branch from your personal fork? The voyage registry fix itself looks good and is queued to land as soon as the branch is pushable/mergeable.

@diegosouzapw

Copy link
Copy Markdown
Collaborator

Hi! I tried to sync this branch with release/v3.8.49 from the maintainer side so CI would go green before merge, but pushing to the fork is blocked (403: Permission to careerfactory/OmniRoute.git denied) — the fork's org settings override the "allow edits by maintainers" flag, so this has to come from your side.

The good news: I resolved it locally and the conflicts are trivial — both are unrelated cycle drift, neither touches your actual changes. On your branch:

git fetch upstream release/v3.8.49
git merge upstream/release/v3.8.49
# both conflicts resolve by taking the release side:
git checkout upstream/release/v3.8.49 -- .mergify.yml config/quality/quality-baseline.json
git commit
git push

After that I verified locally: eslint clean, typecheck:core clean, and your own test file passes in full. Nothing in your code needed changing.

One note: the Fast Quality Gates job may still show red — that's a known base-red on the release branch itself (a stryker.conf.json tap.testFiles drift), not anything from your PR. Fix is up in #7729.

@diegosouzapw

Copy link
Copy Markdown
Collaborator

Still tracking as fix-in-place — needs a rebase onto the current release/v3.8.49 tip to clear the conflict (the branch is drifted, touching .mergify.yml/quality-baseline.json as artifacts of that drift, not real changes). The underlying model-registry fix is still needed and hasn't been superseded.

…ge-embedding-registry-models

# Conflicts:
#	.mergify.yml
#	config/quality/quality-baseline.json
@kamenkadmitry

Copy link
Copy Markdown
Contributor Author

Rebased onto release/v3.8.49 — conflicts in .mergify.yml and quality-baseline.json resolved by taking the release side. The embedding registry fix is unchanged and still applies cleanly.

diegosouzapw pushed a commit that referenced this pull request Jul 19, 2026
…sing models

Cherry-picked from PR #7425 (org-fork branch cannot receive pushes; the PR
stays open for reference). Refs #7425
@diegosouzapw

Copy link
Copy Markdown
Collaborator

Your fix is now on release/v3.8.49 as commit 6847d93 — cherry-picked with you preserved as the commit author, plus a changelog credit (#7425 — thanks @kamenkadmitry). We had to land it via cherry-pick because your fork's branch rejects maintainer pushes (org-owned fork, 403 despite maintainerCanModify), so GitHub may not flag this PR as Merged automatically. Nothing else needed from you — thanks for the registry fix! Feel free to close this PR, or leave it and we'll close it once the release ships.

@diegosouzapw

Copy link
Copy Markdown
Collaborator

Heads-up so this doesn't sit here unnecessarily: the content of this PR is already shipped. 🙏

Your changes (adding voyage-3.5, voyage-3.5-lite, voyage-multilingual-2 and removing the non-existent voyage-multilingual-3.5) are live on release/v3.8.49 as commit 6847d93ee8 — authored by you, cherry-picked because the org-fork branch couldn't receive pushes. So you have full commit credit for it already.

This PR is effectively bookkeeping at this point. Feel free to close it, or leave it open for reference — either is fine. Thanks for the registry cleanup, and sorry for the fork-push friction. 🚀

@diegosouzapw

Copy link
Copy Markdown
Collaborator

Thanks, @kamenkadmitry! 🙏 Closing — the branch has drifted very far from the current release tip (the rebase surfaces 300+ files of conflicts), so it can't be merged as-is without clobbering newer catalog work. If voyage-multilingual-3.5 is still mis-listed on the latest release/v3.8.49, a fresh focused branch removing it would merge cleanly — very happy to take that.

@kamenkadmitry
kamenkadmitry deleted the fix/voyage-embedding-registry-models branch July 25, 2026 07:41
@diegosouzapw diegosouzapw mentioned this pull request Jul 28, 2026
HouMinXi pushed a commit to HouMinXi/OmniRoute that referenced this pull request Aug 2, 2026
…sing models

Cherry-picked from PR cheaper-inference#7425 (org-fork branch cannot receive pushes; the PR
stays open for reference). Refs cheaper-inference#7425
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
…sing models

Cherry-picked from PR cheaper-inference#7425 (org-fork branch cannot receive pushes; the PR
stays open for reference). Refs cheaper-inference#7425
KytranKatarn added a commit to KytranKatarn/OmniRoute that referenced this pull request Oct 22, 2026
#3)

* fix(sse): retain app-server usage and tool-result replay

* feat(ds9): catalog fixes + aihorde sync + wildcard + Voyage embeddings

- Fix catalog builder to surface aihorde chat models in /v1/models (Option A + B):
  * Add dummy aihorde connection row (keyless provider)
  * Update isProviderActive() to include passthrough providers with synced models
  * Export PASSTHROUGH_PROVIDERS constant
- Add aihordeChatCatalog service:
  * Fetches live chat models from oai.aihorde.net/v1/models
  * Persists to syncedAvailableModels under connection-specific key
  * Integrated with 6h modelSyncScheduler
- Fix wildcard expansion (aihorde/*):
  * collectProviderModelIds() now includes synced models for passthrough providers
- Voyage embeddings fix (cheaper-inference#7425):
  * Add missing models: voyage-code-4, voyage-3, voyage-3-lite, voyage-large-2-instruct, voyage-large-2, voyage-4-nano
  * Remove non-existent voyage-multilingual-3.5 (never existed)
  * Total Voyage models: 19 (was 11)

Verified: /v1/models shows 26 aihorde chat models; aihorde/* expands to 27 models; 116 embedding tests pass.

---------

Co-authored-by: Developer <developer@kytranempowerment.com>
Co-authored-by: OpenCode (host) <opencode@kytranempowerment.com>
KytranKatarn added a commit to KytranKatarn/OmniRoute that referenced this pull request Oct 23, 2026
…per-inference#7425) (#21)

Co-authored-by: OpenCode (host) <opencode@kytranempowerment.com>
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