mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-26 02:09:33 +00:00
fix(model-param-b): match both adjacent <num>b tokens sharing one delimiter (#96288)
inferParamBFromIdOrName used a consuming trailing boundary `b(?:[^a-z0-9]|$)`,
so when two `<num>b` parameter tokens are separated by a single delimiter
("8b 70b", "8b-70b"), the first match ate the shared delimiter and the second
token's required leading boundary had nothing to match, silently skipping it —
returning the first (often smaller) size instead of the largest. Make the
trailing boundary a non-consuming lookahead.
Co-authored-by: ly-wang19 <ly-wang19@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,12 @@ describe("shared/model-param-b", () => {
|
||||
expect(inferParamBFromIdOrName("(70b) + m1.5b + qwen-14b")).toBe(70);
|
||||
});
|
||||
|
||||
it("matches both tokens when two are separated by a single delimiter", () => {
|
||||
expect(inferParamBFromIdOrName("8b 70b")).toBe(70);
|
||||
expect(inferParamBFromIdOrName("8b-70b")).toBe(70);
|
||||
expect(inferParamBFromIdOrName("7b-13b")).toBe(13);
|
||||
});
|
||||
|
||||
it("ignores malformed, zero, and non-delimited matches", () => {
|
||||
expect(inferParamBFromIdOrName("abc70beta 0b x70b2")).toBeNull();
|
||||
expect(inferParamBFromIdOrName("model 0b")).toBeNull();
|
||||
|
||||
@@ -4,7 +4,9 @@ import { normalizeLowercaseStringOrEmpty } from "@openclaw/normalization-core/st
|
||||
/** Infers the largest `<number>b` parameter-size token from a model id or display name. */
|
||||
export function inferParamBFromIdOrName(text: string): number | null {
|
||||
const raw = normalizeLowercaseStringOrEmpty(text);
|
||||
const matches = raw.matchAll(/(?:^|[^a-z0-9])[a-z]?(\d+(?:\.\d+)?)b(?:[^a-z0-9]|$)/g);
|
||||
// Trailing boundary is a lookahead so two adjacent `<num>b` tokens sharing one delimiter (e.g.
|
||||
// "8b 70b" / "8b-70b") both match; a consuming boundary ate the delimiter and skipped the second.
|
||||
const matches = raw.matchAll(/(?:^|[^a-z0-9])[a-z]?(\d+(?:\.\d+)?)b(?=[^a-z0-9]|$)/g);
|
||||
let best: number | null = null;
|
||||
for (const match of matches) {
|
||||
const numRaw = match[1];
|
||||
|
||||
Reference in New Issue
Block a user