fix: normalize provider metadata live filters

This commit is contained in:
Shakker
2026-04-27 18:02:24 +01:00
parent 4cd2cabe7f
commit 5531502cb0
2 changed files with 86 additions and 7 deletions

View File

@@ -23,7 +23,7 @@ import {
createProviderApiKeyResolver,
createProviderAuthResolver,
} from "./models-config.providers.secrets.js";
import { findNormalizedProviderValue } from "./provider-id.js";
import { findNormalizedProviderValue, normalizeProviderId } from "./provider-id.js";
const log = createSubsystemLogger("agents/model-providers");
@@ -133,18 +133,55 @@ function resolvePluginMetadataProviderOwners(
if (!pluginMetadataSnapshot) {
return undefined;
}
const normalizedProvider = normalizeProviderId(provider);
if (!normalizedProvider) {
return undefined;
}
const owners = new Set<string>();
for (const owner of pluginMetadataSnapshot.owners.providers.get(provider) ?? []) {
owners.add(owner);
}
for (const owner of pluginMetadataSnapshot.owners.cliBackends.get(provider) ?? []) {
owners.add(owner);
}
appendNormalizedPluginMetadataOwners(
owners,
pluginMetadataSnapshot.owners.providers,
provider,
normalizedProvider,
);
appendNormalizedPluginMetadataOwners(
owners,
pluginMetadataSnapshot.owners.cliBackends,
provider,
normalizedProvider,
);
return owners.size > 0
? [...owners].toSorted((left, right) => left.localeCompare(right))
: undefined;
}
function appendNormalizedPluginMetadataOwners(
target: Set<string>,
ownerMap: ReadonlyMap<string, readonly string[]>,
provider: string,
normalizedProvider: string,
): void {
for (const owner of ownerMap.get(provider) ?? []) {
target.add(owner);
}
if (normalizedProvider !== provider) {
for (const owner of ownerMap.get(normalizedProvider) ?? []) {
target.add(owner);
}
}
for (const [ownedId, owners] of ownerMap.entries()) {
if (
ownedId !== provider &&
ownedId !== normalizedProvider &&
normalizeProviderId(ownedId) === normalizedProvider
) {
for (const owner of owners) {
target.add(owner);
}
}
}
}
export function resolveProviderDiscoveryFilterForTest(params: {
config?: OpenClawConfig;
workspaceDir?: string;

View File

@@ -90,4 +90,46 @@ describe("resolveProviderDiscoveryFilterForTest", () => {
}),
).toEqual(["anthropic"]);
});
it("normalizes mixed-case backend ids through plugin metadata owners", () => {
const snapshot = {
owners: metadataOwners({
cliBackends: new Map([["claude-cli", ["anthropic"]]]),
}),
};
expect(resolvePluginMetadataProviderOwnersForTest(snapshot, "Claude-CLI")).toEqual([
"anthropic",
]);
expect(
resolveProviderDiscoveryFilterForTest({
env: liveFilterEnv({
OPENCLAW_LIVE_TEST: "1",
OPENCLAW_LIVE_PROVIDERS: "Claude-CLI",
}),
resolveOwners: (provider) => resolvePluginMetadataProviderOwnersForTest(snapshot, provider),
}),
).toEqual(["anthropic"]);
});
it("normalizes provider aliases through plugin metadata owners", () => {
const snapshot = {
owners: metadataOwners({
providers: new Map([["volcengine", ["volcengine"]]]),
}),
};
expect(resolvePluginMetadataProviderOwnersForTest(snapshot, "bytedance")).toEqual([
"volcengine",
]);
expect(
resolveProviderDiscoveryFilterForTest({
env: liveFilterEnv({
OPENCLAW_LIVE_TEST: "1",
OPENCLAW_LIVE_PROVIDERS: "bytedance",
}),
resolveOwners: (provider) => resolvePluginMetadataProviderOwnersForTest(snapshot, provider),
}),
).toEqual(["volcengine"]);
});
});