From ac45abddd80836f14eb09132d4906cca9a9109fb Mon Sep 17 00:00:00 2001 From: iikawa0918 <115624916+iikawa0918@users.noreply.github.com> Date: Thu, 5 Nov 2026 13:30:21 +0800 Subject: [PATCH 1/2] agentcompass 0.1.4: canonicalModel resolves a multi-prefix id by its last segment canonicalModel stripped one provider prefix, so openrouter/openai/gpt-5-mini looked up openai/gpt-5-mini, missed the gpt-5-mini alias and came back unresolved. Also look the last path segment up in the aliases, as AgentCompass's resolve_canonical_model tries the raw name and then raw.rsplit('/', 1)[-1]. An id no alias knows keeps its old canonical form (openrouter/qwen/foo -> qwen/foo), so the keys quota.js and continuity.js match on don't move. 9.7 covers both. Co-Authored-By: Claude Opus 5.5 --- packages/agentcompass/package.json | 2 +- packages/agentcompass/src/catalog.js | 10 +++++++--- packages/agentcompass/test/router.test.mjs | 8 +++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/agentcompass/package.json b/packages/agentcompass/package.json index 344e3c3cd..d7c506f77 100644 --- a/packages/agentcompass/package.json +++ b/packages/agentcompass/package.json @@ -1,6 +1,6 @@ { "name": "@magpie-community/gateway-agentcompass", - "version": "0.1.1", + "version": "0.1.4", "description": "Intent, multi-dimensional capability, Model DNA, subscription quota opportunity-cost, and session-affinity routing plugin for Magpie, powered by AgentCompass.", "type": "module", "main": "./src/index.js", diff --git a/packages/agentcompass/src/catalog.js b/packages/agentcompass/src/catalog.js index fe1d33f57..b08142374 100644 --- a/packages/agentcompass/src/catalog.js +++ b/packages/agentcompass/src/catalog.js @@ -1481,9 +1481,13 @@ export function canonicalModel(rawModel, aliases = MODEL_ALIASES) { if (aliases[clean]) return aliases[clean]; const slashIdx = clean.indexOf("/"); const unprefixed = slashIdx >= 0 ? clean.slice(slashIdx + 1) : clean; - if (aliases[unprefixed]) return aliases[unprefixed]; - const lower = unprefixed.toLowerCase(); - if (aliases[lower]) return aliases[lower]; + // A multi-prefix id (`openrouter/openai/gpt-5-mini`) also resolves by its last segment, as AgentCompass's + // `resolve_canonical_model` does. An unknown id keeps only its first prefix stripped (`openrouter/qwen/foo` -> + // `qwen/foo`), the key quota.js and continuity.js already match on. + const last = clean.slice(clean.lastIndexOf("/") + 1); + for (const name of [unprefixed, unprefixed.toLowerCase(), last, last.toLowerCase()]) { + if (aliases[name]) return aliases[name]; + } return unprefixed; } diff --git a/packages/agentcompass/test/router.test.mjs b/packages/agentcompass/test/router.test.mjs index c83e15224..3b0d945d5 100644 --- a/packages/agentcompass/test/router.test.mjs +++ b/packages/agentcompass/test/router.test.mjs @@ -6,7 +6,7 @@ import test from "node:test"; import { fileURLToPath } from "node:url"; import { namedRoute, rankCandidates, selectBestRoute } from "../src/allocator.js"; -import { DEFAULT_SCORING_POLICY } from "../src/catalog.js"; +import { DEFAULT_SCORING_POLICY, canonicalModel } from "../src/catalog.js"; import { CACHE_COLD_MS, CHATGPT_CODEX_COLD_MS, @@ -1947,6 +1947,12 @@ test("9.7 PR #670 Round 2 Guard: Mainstream real model IDs & trivial single-vari `Expected claude-opus-4-6:(high|xhigh|max) for permutation [${candidateModels.join(", ")}], got ${auditOut.model}` ); } + + // A multi-prefix id resolves by its last segment; an unknown one keeps only its first prefix stripped + assert.equal(canonicalModel("openrouter/openai/gpt-5-mini"), "gpt-6-luna"); + assert.equal(canonicalModel("OpenRouter/OpenAI/GPT-5-Mini"), "gpt-6-luna"); + assert.equal(canonicalModel("openrouter/qwen/foo"), "qwen/foo"); + assert.equal(canonicalModel("qwen/foo"), "foo"); }); test("9.8 PR #670 Round 2 Guard: `options.fetch` alone never enables external scorer unless `allowExternalScorer === true`", async () => { From 39f8c5ddce50bfeba1391b8798164f57913015fa Mon Sep 17 00:00:00 2001 From: iikawa0918 <115624916+iikawa0918@users.noreply.github.com> Date: Thu, 5 Nov 2026 14:58:38 +0800 Subject: [PATCH 2/2] agentcompass 0.1.4: pin the exact-case last-segment lookup with `openrouter/minimax/MiniMax-M3` Co-Authored-By: Claude Opus 5.5 --- packages/agentcompass/test/router.test.mjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/agentcompass/test/router.test.mjs b/packages/agentcompass/test/router.test.mjs index 3b0d945d5..167143e2a 100644 --- a/packages/agentcompass/test/router.test.mjs +++ b/packages/agentcompass/test/router.test.mjs @@ -1951,6 +1951,8 @@ test("9.7 PR #670 Round 2 Guard: Mainstream real model IDs & trivial single-vari // A multi-prefix id resolves by its last segment; an unknown one keeps only its first prefix stripped assert.equal(canonicalModel("openrouter/openai/gpt-5-mini"), "gpt-6-luna"); assert.equal(canonicalModel("OpenRouter/OpenAI/GPT-5-Mini"), "gpt-6-luna"); + // Alias keys with capitals (`MiniMax-M3`) need the exact-case last-segment lookup + assert.equal(canonicalModel("openrouter/minimax/MiniMax-M3"), "minimax-m3"); assert.equal(canonicalModel("openrouter/qwen/foo"), "qwen/foo"); assert.equal(canonicalModel("qwen/foo"), "foo"); });