From d561fd36dd6755d3905dbd99a467d98a23b7cd75 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Thu, 27 Aug 2026 12:50:14 +0800 Subject: [PATCH] refactor(qa-lab): reuse model reference splitter (#130317) --- .../qa-lab/src/model-catalog.runtime.test.ts | 7 +++++-- extensions/qa-lab/src/model-catalog.runtime.ts | 14 ++------------ 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/extensions/qa-lab/src/model-catalog.runtime.test.ts b/extensions/qa-lab/src/model-catalog.runtime.test.ts index 07cbd79f720e..c778a484edf4 100644 --- a/extensions/qa-lab/src/model-catalog.runtime.test.ts +++ b/extensions/qa-lab/src/model-catalog.runtime.test.ts @@ -53,8 +53,11 @@ describe("qa runner model catalog", () => { ); await expect(loadQaRunnerModelOptions({ repoRoot })).resolves.toEqual([ - expect.objectContaining({ key: "openai/gpt-5.6-luna" }), - expect.objectContaining({ key: "anthropic/claude-sonnet-4-6" }), + expect.objectContaining({ key: "openai/gpt-5.6-luna", provider: "openai" }), + expect.objectContaining({ + key: "anthropic/claude-sonnet-4-6", + provider: "anthropic", + }), ]); }); diff --git a/extensions/qa-lab/src/model-catalog.runtime.ts b/extensions/qa-lab/src/model-catalog.runtime.ts index 098f115df23d..85a1ee855ba1 100644 --- a/extensions/qa-lab/src/model-catalog.runtime.ts +++ b/extensions/qa-lab/src/model-catalog.runtime.ts @@ -4,6 +4,7 @@ import path from "node:path"; import { runCommandWithTimeout } from "openclaw/plugin-sdk/process-runtime"; import { resolvePreferredOpenClawTmpDir } from "openclaw/plugin-sdk/temp-path"; import { QA_CHILD_STDERR_TAIL_BYTES, QA_CHILD_STDOUT_MAX_BYTES } from "./child-output.js"; +import { splitQaModelRef } from "./model-selection.js"; import { resolveQaNodeExecPath } from "./node-exec.js"; import { isPreferredQaLiveFrontierCatalogModel, @@ -33,22 +34,11 @@ export type QaRunnerModelOption = { preferred: boolean; }; -function splitModelKey(key: string) { - const slash = key.indexOf("/"); - if (slash <= 0 || slash === key.length - 1) { - return null; - } - return { - provider: key.slice(0, slash), - model: key.slice(slash + 1), - }; -} - function selectQaRunnerModelOptions(rows: ModelRow[]): QaRunnerModelOption[] { const options = rows .filter((row) => row.available === true && !row.missing) .map((row) => { - const parsed = splitModelKey(row.key); + const parsed = splitQaModelRef(row.key); return { key: row.key, name: row.name,