Repository navigation
fix(embeddings): remove non-existent voyage-multilingual-3.5, add missing models - #7425
kamenkadmitry wants to merge 9 commits into
Conversation
… (queue_conditions alone are eligibility-only) (cheaper-inference#7179)
…uto_merge_conditions (rules-based path is EOL 2026-07-16) (cheaper-inference#7216)
…; free plan queue is serial) (cheaper-inference#7220)
…H-hosted build hang dequeued every attempt) (cheaper-inference#7225)
…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.
There was a problem hiding this comment.
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.
| if (providerConfig.format === "voyage") { | ||
| const { top_n: _top_n, ...rest } = body; | ||
| return rest; | ||
| } |
There was a problem hiding this comment.
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,
};
}| 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); | ||
| }); |
There was a problem hiding this comment.
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>
c1f614f to
f13694d
Compare
|
Thanks for tracking this down and verifying directly against the Voyage AI API — I confirmed independently against Voyage's docs that |
|
Heads-up @kamenkadmitry: this PR is currently CONFLICTING with release/v3.8.49 — the branch adds its own |
|
Hi! I tried to sync this branch with 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 pushAfter that I verified locally: eslint clean, One note: the |
|
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
|
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. |
|
Your fix is now on |
|
Heads-up so this doesn't sit here unnecessarily: the content of this PR is already shipped. 🙏 Your changes (adding 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. 🚀 |
|
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 |
…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
…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
#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>
…per-inference#7425) (#21) Co-authored-by: OpenCode (host) <opencode@kytranempowerment.com>
Summary
Removed
voyage-multilingual-3.5from 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.5andvoyage-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.5is rejected whilevoyage-multilingual-2,voyage-3.5, andvoyage-3.5-liteare all accepted.Changes
open-sse/config/embeddingRegistry.tsvoyage-multilingual-3.5; addvoyage-3.5,voyage-3.5-lite,voyage-multilingual-2tests/unit/embedding-rerank-provider-registry.test.tsvoyage-multilingual-3.5is absent,voyage-multilingual-2is present,voyage-3.5+voyage-3.5-liteare presentTest plan
node --import tsx/esm --test tests/unit/embedding-rerank-provider-registry.test.ts— 7/7 pass (3 new)Generated with Devin