From adc9cc993dff065afdec39e1c4c9fe8dccf02450 Mon Sep 17 00:00:00 2001 From: Hieu Le Date: Thu, 5 Nov 2026 00:06:14 +0100 Subject: [PATCH 1/2] perf(server): resolve model aliases in one memoized traversal --- .../server/src/usage/usageAggregation.test.ts | 81 +++++++++++++++---- apps/server/src/usage/usageAggregation.ts | 25 ++++-- 2 files changed, 84 insertions(+), 22 deletions(-) diff --git a/apps/server/src/usage/usageAggregation.test.ts b/apps/server/src/usage/usageAggregation.test.ts index 08b3f3ae1b8c8..5d52d55d25eef 100644 --- a/apps/server/src/usage/usageAggregation.test.ts +++ b/apps/server/src/usage/usageAggregation.test.ts @@ -212,20 +212,71 @@ describe("UsageAggregator", () => { describe("resolveModelAliases", () => { it("follows chains to the final model and drops chains that enter a loop", () => { - expect( - resolveModelAliases({ - "preview[1m]": "preview", - preview: "example-model", - loop: "back", - back: "loop", - intoLoop: "loop", - self: "self", - }), - ).toEqual( - new Map([ - ["preview[1m]", "example-model"], - ["preview", "example-model"], - ]), - ); + const aliases = Object.freeze({ + "preview[1m]": "preview", + unrelated: "other-model", + preview: "example-model", + shared: "preview", + intoLoop: "loop", + loop: "back", + back: "loop", + laterIntoLoop: "back", + deepIntoLoop: "intoLoop", + self: "self", + intoSelf: "self", + validAfterLoops: "shared", + }); + + expect([...resolveModelAliases(aliases)]).toEqual([ + ["preview[1m]", "example-model"], + ["unrelated", "other-model"], + ["preview", "example-model"], + ["shared", "example-model"], + ["validAfterLoops", "example-model"], + ]); + expect([...resolveModelAliases({})]).toEqual([]); + }); + + it("keeps Object.keys order and follows only own targets, including non-enumerable ones", () => { + const aliases = { + "10": "constructor", + "2": "toString", + first: "hidden", + ["__proto__"]: "hasOwnProperty", + constructor: "terminal", + hasOwnProperty: "constructor", + inheritedTarget: "inherited", + }; + Object.setPrototypeOf(aliases, { inherited: "must-not-follow" }); + Object.defineProperty(aliases, "hidden", { value: "constructor" }); + + expect([...resolveModelAliases(aliases)]).toEqual([ + ["2", "toString"], + ["10", "terminal"], + ["first", "terminal"], + ["__proto__", "terminal"], + ["constructor", "terminal"], + ["hasOwnProperty", "terminal"], + ["inheritedTarget", "inherited"], + ]); + expect([...resolveModelAliases({ prototypeTarget: "__proto__" })]).toEqual([ + ["prototypeTarget", "__proto__"], + ]); + }); + + it("preserves empty terminal strings and follows an own empty-string alias", () => { + expect([...resolveModelAliases({ first: "next", next: "", last: "next" })]).toEqual([ + ["first", ""], + ["next", ""], + ["last", ""], + ]); + expect([...resolveModelAliases({ first: "", "": "terminal", last: "first" })]).toEqual([ + ["first", "terminal"], + ["", "terminal"], + ["last", "terminal"], + ]); + expect([...resolveModelAliases({ first: "", "": "", valid: "terminal" })]).toEqual([ + ["valid", "terminal"], + ]); }); }); diff --git a/apps/server/src/usage/usageAggregation.ts b/apps/server/src/usage/usageAggregation.ts index 8f94c84a3c470..7526674b5a4ca 100644 --- a/apps/server/src/usage/usageAggregation.ts +++ b/apps/server/src/usage/usageAggregation.ts @@ -78,15 +78,26 @@ export interface AggregateOptions { export function resolveModelAliases( aliases: Readonly>, ): ReadonlyMap { - const resolved = new Map(); - for (const model of Object.keys(aliases)) { - const seen = new Set([model]); - let target = aliases[model]!; - while (Object.hasOwn(aliases, target) && !seen.has(target)) { - seen.add(target); + const models = Object.keys(aliases); + const memo = new Map(); + for (const model of models) { + if (memo.has(model)) continue; + const path: string[] = []; + let target = model; + while (Object.hasOwn(aliases, target) && !memo.has(target)) { + path.push(target); + // Null marks both the active walk and paths that end in a cycle. + memo.set(target, null); target = aliases[target]!; } - if (!Object.hasOwn(aliases, target)) resolved.set(model, target); + const terminal = Object.hasOwn(aliases, target) ? (memo.get(target) ?? null) : target; + for (const alias of path) memo.set(alias, terminal); + } + + const resolved = new Map(); + for (const model of models) { + const target = memo.get(model); + if (target !== null && target !== undefined) resolved.set(model, target); } return resolved; } From 1519b8696e6e97e6d96789f36c0613640a737076 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sun, 15 Nov 2026 01:03:51 +0000 Subject: [PATCH 2/2] test(server): trim alias resolver tests to the chain and loop cases Co-Authored-By: Claude Opus 5.5 --- .../server/src/usage/usageAggregation.test.ts | 75 ++++--------------- 1 file changed, 14 insertions(+), 61 deletions(-) diff --git a/apps/server/src/usage/usageAggregation.test.ts b/apps/server/src/usage/usageAggregation.test.ts index 3d939853d1846..3819903606be2 100644 --- a/apps/server/src/usage/usageAggregation.test.ts +++ b/apps/server/src/usage/usageAggregation.test.ts @@ -292,71 +292,24 @@ describe("UsageAggregator", () => { describe("resolveModelAliases", () => { it("follows chains to the final model and drops chains that enter a loop", () => { - const aliases = Object.freeze({ - "preview[1m]": "preview", - unrelated: "other-model", - preview: "example-model", - shared: "preview", - intoLoop: "loop", - loop: "back", - back: "loop", - laterIntoLoop: "back", - deepIntoLoop: "intoLoop", - self: "self", - intoSelf: "self", - validAfterLoops: "shared", - }); - - expect([...resolveModelAliases(aliases)]).toEqual([ + expect([ + ...resolveModelAliases({ + "preview[1m]": "preview", + preview: "example-model", + shared: "preview", + intoLoop: "loop", + loop: "back", + back: "loop", + laterIntoLoop: "back", + deepIntoLoop: "intoLoop", + self: "self", + validAfterLoops: "shared", + }), + ]).toEqual([ ["preview[1m]", "example-model"], - ["unrelated", "other-model"], ["preview", "example-model"], ["shared", "example-model"], ["validAfterLoops", "example-model"], ]); - expect([...resolveModelAliases({})]).toEqual([]); - }); - - it("keeps Object.keys order and follows only own targets, including non-enumerable ones", () => { - const aliases = { - "10": "constructor", - "2": "toString", - first: "hidden", - ["__proto__"]: "hasOwnProperty", - constructor: "terminal", - hasOwnProperty: "constructor", - inheritedTarget: "inherited", - }; - Object.setPrototypeOf(aliases, { inherited: "must-not-follow" }); - Object.defineProperty(aliases, "hidden", { value: "constructor" }); - - expect([...resolveModelAliases(aliases)]).toEqual([ - ["2", "toString"], - ["10", "terminal"], - ["first", "terminal"], - ["__proto__", "terminal"], - ["constructor", "terminal"], - ["hasOwnProperty", "terminal"], - ["inheritedTarget", "inherited"], - ]); - expect([...resolveModelAliases({ prototypeTarget: "__proto__" })]).toEqual([ - ["prototypeTarget", "__proto__"], - ]); - }); - - it("preserves empty terminal strings and follows an own empty-string alias", () => { - expect([...resolveModelAliases({ first: "next", next: "", last: "next" })]).toEqual([ - ["first", ""], - ["next", ""], - ["last", ""], - ]); - expect([...resolveModelAliases({ first: "", "": "terminal", last: "first" })]).toEqual([ - ["first", "terminal"], - ["", "terminal"], - ["last", "terminal"], - ]); - expect([...resolveModelAliases({ first: "", "": "", valid: "terminal" })]).toEqual([ - ["valid", "terminal"], - ]); }); });