diff --git a/extensions/tsconfig.package-boundary.paths.json b/extensions/tsconfig.package-boundary.paths.json index 4fa938bf8496..8fbd5f351c20 100644 --- a/extensions/tsconfig.package-boundary.paths.json +++ b/extensions/tsconfig.package-boundary.paths.json @@ -108,6 +108,9 @@ "@openclaw/model-catalog-core/configured-model-refs": [ "../dist/plugin-sdk/packages/model-catalog-core/src/configured-model-refs.d.ts" ], + "@openclaw/model-catalog-core/model-catalog-refs": [ + "../dist/plugin-sdk/packages/model-catalog-core/src/model-catalog-refs.d.ts" + ], "@openclaw/model-catalog-core/provider-id": [ "../dist/plugin-sdk/packages/model-catalog-core/src/provider-id.d.ts" ], diff --git a/extensions/xai/tsconfig.json b/extensions/xai/tsconfig.json index c76c229f0ad2..f6d78a0aa47f 100644 --- a/extensions/xai/tsconfig.json +++ b/extensions/xai/tsconfig.json @@ -117,6 +117,9 @@ "@openclaw/model-catalog-core/configured-model-refs": [ "../../dist/plugin-sdk/packages/model-catalog-core/src/configured-model-refs.d.ts" ], + "@openclaw/model-catalog-core/model-catalog-refs": [ + "../../dist/plugin-sdk/packages/model-catalog-core/src/model-catalog-refs.d.ts" + ], "@openclaw/model-catalog-core/provider-id": [ "../../dist/plugin-sdk/packages/model-catalog-core/src/provider-id.d.ts" ], diff --git a/packages/model-catalog-core/package.json b/packages/model-catalog-core/package.json index 2933c6ec3b76..a6788dcd8d5c 100644 --- a/packages/model-catalog-core/package.json +++ b/packages/model-catalog-core/package.json @@ -19,6 +19,11 @@ "import": "./dist/configured-model-refs.mjs", "default": "./dist/configured-model-refs.mjs" }, + "./model-catalog-refs": { + "types": "./dist/model-catalog-refs.d.mts", + "import": "./dist/model-catalog-refs.mjs", + "default": "./dist/model-catalog-refs.mjs" + }, "./provider-id": { "types": "./dist/provider-id.d.mts", "import": "./dist/provider-id.mjs", diff --git a/packages/model-catalog-core/src/index.ts b/packages/model-catalog-core/src/index.ts index 4bbd3b2e5a8e..49158c1eca99 100644 --- a/packages/model-catalog-core/src/index.ts +++ b/packages/model-catalog-core/src/index.ts @@ -1,4 +1,5 @@ export * from "./configured-model-refs.js"; +export * from "./model-catalog-refs.js"; export * from "./provider-id.js"; export * from "./provider-model-id-normalization.js"; export * from "./provider-model-id-normalize.js"; diff --git a/packages/model-catalog-core/src/model-catalog-refs.test.ts b/packages/model-catalog-core/src/model-catalog-refs.test.ts new file mode 100644 index 000000000000..cc8fe99927a9 --- /dev/null +++ b/packages/model-catalog-core/src/model-catalog-refs.test.ts @@ -0,0 +1,9 @@ +import { describe, expect, it } from "vitest"; +import { buildModelCatalogMergeKey, buildModelCatalogRef } from "./model-catalog-refs.js"; + +describe("model catalog refs", () => { + it("normalizes provider ids without lowercasing model ids in refs", () => { + expect(buildModelCatalogRef("OpenAI", "GPT-5.4")).toBe("openai/GPT-5.4"); + expect(buildModelCatalogMergeKey("OpenAI", "GPT-5.4")).toBe("openai::gpt-5.4"); + }); +}); diff --git a/src/model-catalog/refs.ts b/packages/model-catalog-core/src/model-catalog-refs.ts similarity index 85% rename from src/model-catalog/refs.ts rename to packages/model-catalog-core/src/model-catalog-refs.ts index 1bdeba3c9c84..9845ab8b540e 100644 --- a/src/model-catalog/refs.ts +++ b/packages/model-catalog-core/src/model-catalog-refs.ts @@ -1,4 +1,4 @@ -import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; +import { normalizeLowercaseStringOrEmpty } from "./provider-id.js"; export function normalizeModelCatalogProviderId(provider: string): string { return normalizeLowercaseStringOrEmpty(provider); diff --git a/scripts/lib/extension-package-boundary.ts b/scripts/lib/extension-package-boundary.ts index 0a65da10cc17..cc0a03ff2451 100644 --- a/scripts/lib/extension-package-boundary.ts +++ b/scripts/lib/extension-package-boundary.ts @@ -63,6 +63,9 @@ export const EXTENSION_PACKAGE_BOUNDARY_BASE_PATHS = { "@openclaw/model-catalog-core/configured-model-refs": [ "../dist/plugin-sdk/packages/model-catalog-core/src/configured-model-refs.d.ts", ], + "@openclaw/model-catalog-core/model-catalog-refs": [ + "../dist/plugin-sdk/packages/model-catalog-core/src/model-catalog-refs.d.ts", + ], "@openclaw/model-catalog-core/provider-id": [ "../dist/plugin-sdk/packages/model-catalog-core/src/provider-id.d.ts", ], diff --git a/scripts/prepare-extension-package-boundary-artifacts.mjs b/scripts/prepare-extension-package-boundary-artifacts.mjs index d1a386e14c21..a00de3c138de 100644 --- a/scripts/prepare-extension-package-boundary-artifacts.mjs +++ b/scripts/prepare-extension-package-boundary-artifacts.mjs @@ -70,6 +70,7 @@ const ROOT_DTS_REQUIRED_OUTPUTS = [ "dist/plugin-sdk/packages/terminal-core/src/terminal-link.d.ts", "dist/plugin-sdk/packages/terminal-core/src/theme.d.ts", "dist/plugin-sdk/packages/model-catalog-core/src/configured-model-refs.d.ts", + "dist/plugin-sdk/packages/model-catalog-core/src/model-catalog-refs.d.ts", "dist/plugin-sdk/packages/model-catalog-core/src/provider-id.d.ts", "dist/plugin-sdk/packages/model-catalog-core/src/provider-model-id-normalization.d.ts", "dist/plugin-sdk/packages/model-catalog-core/src/provider-model-id-normalize.d.ts", @@ -96,6 +97,7 @@ const PACKAGE_DTS_REQUIRED_OUTPUTS = [ "packages/plugin-sdk/dist/packages/media-generation-core/src/model-ref.d.ts", "packages/plugin-sdk/dist/packages/media-generation-core/src/normalization.d.ts", "packages/plugin-sdk/dist/packages/model-catalog-core/src/configured-model-refs.d.ts", + "packages/plugin-sdk/dist/packages/model-catalog-core/src/model-catalog-refs.d.ts", "packages/plugin-sdk/dist/packages/model-catalog-core/src/provider-id.d.ts", "packages/plugin-sdk/dist/packages/model-catalog-core/src/provider-model-id-normalization.d.ts", "packages/plugin-sdk/dist/packages/model-catalog-core/src/provider-model-id-normalize.d.ts", diff --git a/src/commands/models/list.manifest-catalog.ts b/src/commands/models/list.manifest-catalog.ts index 0e260e8d398e..9729f8a343bf 100644 --- a/src/commands/models/list.manifest-catalog.ts +++ b/src/commands/models/list.manifest-catalog.ts @@ -1,8 +1,6 @@ +import { normalizeModelCatalogProviderId } from "@openclaw/model-catalog-core/model-catalog-refs"; import type { OpenClawConfig } from "../../config/types.openclaw.js"; -import { - normalizeModelCatalogProviderId, - planManifestModelCatalogRows, -} from "../../model-catalog/index.js"; +import { planManifestModelCatalogRows } from "../../model-catalog/index.js"; import type { NormalizedModelCatalogRow } from "../../model-catalog/index.js"; import { loadManifestMetadataSnapshot } from "../../plugins/manifest-contract-eligibility.js"; import type { PluginManifestRegistry } from "../../plugins/manifest-registry.js"; diff --git a/src/commands/models/list.provider-index-catalog.ts b/src/commands/models/list.provider-index-catalog.ts index 1a369bb43d37..04721149da40 100644 --- a/src/commands/models/list.provider-index-catalog.ts +++ b/src/commands/models/list.provider-index-catalog.ts @@ -1,7 +1,7 @@ +import { normalizeModelCatalogProviderId } from "@openclaw/model-catalog-core/model-catalog-refs"; import type { OpenClawConfig } from "../../config/types.openclaw.js"; import { loadOpenClawProviderIndex, - normalizeModelCatalogProviderId, planProviderIndexModelCatalogRows, } from "../../model-catalog/index.js"; import type { NormalizedModelCatalogRow } from "../../model-catalog/index.js"; diff --git a/src/model-catalog/index.ts b/src/model-catalog/index.ts index 7828b542d749..565afab29315 100644 --- a/src/model-catalog/index.ts +++ b/src/model-catalog/index.ts @@ -1,9 +1,4 @@ export { mergeModelCatalogRowsByAuthority } from "./authority.js"; -export { - buildModelCatalogMergeKey, - buildModelCatalogRef, - normalizeModelCatalogProviderId, -} from "./refs.js"; export { normalizeModelCatalog, normalizeModelCatalogRows } from "./normalize.js"; export { loadOpenClawProviderIndex } from "./provider-index/index.js"; export { diff --git a/src/model-catalog/manifest-planner.ts b/src/model-catalog/manifest-planner.ts index c3653b7f627c..452a39eb0ece 100644 --- a/src/model-catalog/manifest-planner.ts +++ b/src/model-catalog/manifest-planner.ts @@ -1,7 +1,10 @@ +import { + buildModelCatalogMergeKey, + normalizeModelCatalogProviderId, +} from "@openclaw/model-catalog-core/model-catalog-refs"; import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; import { normalizeUniqueStringEntries } from "../shared/string-normalization.js"; import { normalizeModelCatalogProviderRows } from "./normalize.js"; -import { buildModelCatalogMergeKey, normalizeModelCatalogProviderId } from "./refs.js"; import type { ModelCatalog, ModelCatalogAlias, diff --git a/src/model-catalog/normalize.test.ts b/src/model-catalog/normalize.test.ts index 3a69bb0fc0a7..bc7a4f9ab0b8 100644 --- a/src/model-catalog/normalize.test.ts +++ b/src/model-catalog/normalize.test.ts @@ -1,10 +1,9 @@ -import { describe, expect, it } from "vitest"; import { buildModelCatalogMergeKey, buildModelCatalogRef, - normalizeModelCatalog, - normalizeModelCatalogRows, -} from "./index.js"; +} from "@openclaw/model-catalog-core/model-catalog-refs"; +import { describe, expect, it } from "vitest"; +import { normalizeModelCatalog, normalizeModelCatalogRows } from "./index.js"; describe("model catalog normalization", () => { it("normalizes catalog ownership, aliases, suppressions, and row fields", () => { diff --git a/src/model-catalog/normalize.ts b/src/model-catalog/normalize.ts index b0e150fd4314..8af1c706e657 100644 --- a/src/model-catalog/normalize.ts +++ b/src/model-catalog/normalize.ts @@ -1,3 +1,8 @@ +import { + buildModelCatalogMergeKey, + buildModelCatalogRef, + normalizeModelCatalogProviderId, +} from "@openclaw/model-catalog-core/model-catalog-refs"; import { MODEL_APIS, isModelThinkingFormat, @@ -13,11 +18,6 @@ import { normalizeTrimmedStringList, } from "../shared/string-normalization.js"; import { isRecord } from "../utils.js"; -import { - buildModelCatalogMergeKey, - buildModelCatalogRef, - normalizeModelCatalogProviderId, -} from "./refs.js"; import type { ModelCatalog, ModelCatalogAlias, diff --git a/src/model-catalog/provider-index-planner.ts b/src/model-catalog/provider-index-planner.ts index f97e88ee0222..0d570580ba6d 100644 --- a/src/model-catalog/provider-index-planner.ts +++ b/src/model-catalog/provider-index-planner.ts @@ -1,6 +1,6 @@ +import { normalizeModelCatalogProviderId } from "@openclaw/model-catalog-core/model-catalog-refs"; import { normalizeModelCatalogProviderRows } from "./normalize.js"; import type { OpenClawProviderIndex } from "./provider-index/index.js"; -import { normalizeModelCatalogProviderId } from "./refs.js"; import type { ModelCatalogProvider, NormalizedModelCatalogRow } from "./types.js"; type ProviderIndexModelCatalogPlanEntry = { diff --git a/src/model-catalog/provider-index/normalize.ts b/src/model-catalog/provider-index/normalize.ts index 76ff020ac5d7..c0c478447e4a 100644 --- a/src/model-catalog/provider-index/normalize.ts +++ b/src/model-catalog/provider-index/normalize.ts @@ -1,3 +1,4 @@ +import { normalizeModelCatalogProviderId } from "@openclaw/model-catalog-core/model-catalog-refs"; import { parseClawHubPluginSpec } from "../../infra/clawhub-spec.js"; import { parseRegistryNpmSpec } from "../../infra/npm-registry-spec.js"; import { isBlockedObjectKey } from "../../infra/prototype-keys.js"; @@ -6,7 +7,6 @@ import { normalizeOptionalString } from "../../shared/string-coerce.js"; import { normalizeUniqueTrimmedStringList } from "../../shared/string-normalization.js"; import { isRecord } from "../../utils.js"; import { normalizeModelCatalog } from "../normalize.js"; -import { normalizeModelCatalogProviderId } from "../refs.js"; import type { ModelCatalogProvider } from "../types.js"; import type { OpenClawProviderIndex, diff --git a/src/plugins/contracts/model-catalog-core-imports.test.ts b/src/plugins/contracts/model-catalog-core-imports.test.ts index f8f60bc79210..9858311986b6 100644 --- a/src/plugins/contracts/model-catalog-core-imports.test.ts +++ b/src/plugins/contracts/model-catalog-core-imports.test.ts @@ -6,6 +6,10 @@ import { listGitTrackedFiles } from "../../test-utils/repo-files.js"; const REPO_ROOT = path.resolve(import.meta.dirname, "../../.."); const LEGACY_MODEL_CATALOG_BRIDGES = new Map([ [path.join(REPO_ROOT, "src/agents/provider-id.ts"), "@openclaw/model-catalog-core/provider-id"], + [ + path.join(REPO_ROOT, "src/model-catalog/refs.ts"), + "@openclaw/model-catalog-core/model-catalog-refs", + ], [ path.join(REPO_ROOT, "src/config/model-refs.ts"), "@openclaw/model-catalog-core/configured-model-refs", diff --git a/src/plugins/gateway-startup-plugin-ids.ts b/src/plugins/gateway-startup-plugin-ids.ts index 10123bfcc0ba..f3f23a19813b 100644 --- a/src/plugins/gateway-startup-plugin-ids.ts +++ b/src/plugins/gateway-startup-plugin-ids.ts @@ -1,3 +1,4 @@ +import { buildModelCatalogMergeKey } from "@openclaw/model-catalog-core/model-catalog-refs"; import { normalizeProviderId } from "@openclaw/model-catalog-core/provider-id"; import { collectConfiguredAgentHarnessRuntimes } from "../agents/harness-runtimes.js"; import { @@ -12,7 +13,6 @@ import { resolveMemoryDreamingPluginId, } from "../memory-host-sdk/dreaming.js"; import { planManifestModelCatalogRows } from "../model-catalog/manifest-planner.js"; -import { buildModelCatalogMergeKey } from "../model-catalog/refs.js"; import { isRecord } from "../shared/record-coerce.js"; import { normalizeOptionalLowercaseString } from "../shared/string-coerce.js"; import { hasExplicitChannelConfig } from "./channel-presence-policy.js"; diff --git a/src/plugins/manifest-model-suppression.ts b/src/plugins/manifest-model-suppression.ts index 57b8d95c6b59..d14a42b3656e 100644 --- a/src/plugins/manifest-model-suppression.ts +++ b/src/plugins/manifest-model-suppression.ts @@ -1,6 +1,6 @@ +import { buildModelCatalogMergeKey } from "@openclaw/model-catalog-core/model-catalog-refs"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import { - buildModelCatalogMergeKey, planManifestModelCatalogSuppressions, type ManifestModelCatalogSuppressionEntry, } from "../model-catalog/index.js"; diff --git a/src/plugins/manifest.ts b/src/plugins/manifest.ts index 2ad9277012f6..ca74d338883c 100644 --- a/src/plugins/manifest.ts +++ b/src/plugins/manifest.ts @@ -1,5 +1,6 @@ import fs from "node:fs"; import path from "node:path"; +import { normalizeModelCatalogProviderId } from "@openclaw/model-catalog-core/model-catalog-refs"; import type { ChannelConfigRuntimeSchema } from "../channels/plugins/types.config.js"; import { MANIFEST_KEY } from "../compat/legacy-names.js"; import { ENV_SECRET_REF_ID_RE } from "../config/types.secrets.js"; @@ -7,7 +8,6 @@ import { matchRootFileOpenFailure, openRootFileSync } from "../infra/boundary-fi import { isBlockedObjectKey } from "../infra/prototype-keys.js"; import { normalizeModelCatalog, - normalizeModelCatalogProviderId, type ModelCatalog, type ModelCatalogAlias, type ModelCatalogCost, diff --git a/src/plugins/sdk-alias.ts b/src/plugins/sdk-alias.ts index d7f67c7c95eb..5d7c84b34e86 100644 --- a/src/plugins/sdk-alias.ts +++ b/src/plugins/sdk-alias.ts @@ -833,6 +833,13 @@ const WORKSPACE_PACKAGE_ALIAS_ENTRIES = [ srcFile: "configured-model-refs.ts", distFile: "configured-model-refs.mjs", }, + { + packageName: "@openclaw/model-catalog-core", + packageDir: "model-catalog-core", + subpath: "model-catalog-refs", + srcFile: "model-catalog-refs.ts", + distFile: "model-catalog-refs.mjs", + }, { packageName: "@openclaw/model-catalog-core", packageDir: "model-catalog-core", diff --git a/test/vitest/vitest.shared.config.ts b/test/vitest/vitest.shared.config.ts index 0c7f520bf9b4..e44f6c5cd7df 100644 --- a/test/vitest/vitest.shared.config.ts +++ b/test/vitest/vitest.shared.config.ts @@ -247,6 +247,16 @@ export const sharedVitestConfig = { "configured-model-refs.ts", ), }, + { + find: "@openclaw/model-catalog-core/model-catalog-refs", + replacement: path.join( + repoRoot, + "packages", + "model-catalog-core", + "src", + "model-catalog-refs.ts", + ), + }, { find: "@openclaw/model-catalog-core/provider-id", replacement: path.join(repoRoot, "packages", "model-catalog-core", "src", "provider-id.ts"), diff --git a/tsconfig.json b/tsconfig.json index 2ec2ac443ff1..6d3c3e700887 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -40,6 +40,9 @@ "@openclaw/model-catalog-core/configured-model-refs": [ "./packages/model-catalog-core/src/configured-model-refs.ts" ], + "@openclaw/model-catalog-core/model-catalog-refs": [ + "./packages/model-catalog-core/src/model-catalog-refs.ts" + ], "@openclaw/model-catalog-core/provider-id": [ "./packages/model-catalog-core/src/provider-id.ts" ], diff --git a/tsdown.config.ts b/tsdown.config.ts index 41de13768612..4de0e68ed581 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -470,6 +470,7 @@ function buildModelCatalogCoreDistEntries(): Record { return { index: "packages/model-catalog-core/src/index.ts", "configured-model-refs": "packages/model-catalog-core/src/configured-model-refs.ts", + "model-catalog-refs": "packages/model-catalog-core/src/model-catalog-refs.ts", "provider-id": "packages/model-catalog-core/src/provider-id.ts", "provider-model-id-normalization": "packages/model-catalog-core/src/provider-model-id-normalization.ts",