Files
openclaw/src/agents/model-selection-normalize.ts
2026-04-07 12:15:00 +08:00

93 lines
2.4 KiB
TypeScript

import { modelKey as sharedModelKey, normalizeStaticProviderModelId } from "./model-ref-shared.js";
import {
findNormalizedProviderKey,
findNormalizedProviderValue,
normalizeProviderId,
normalizeProviderIdForAuth,
} from "./provider-id.js";
import { normalizeProviderModelIdWithRuntime } from "./provider-model-normalization.runtime.js";
export type ModelRef = {
provider: string;
model: string;
};
export function modelKey(provider: string, model: string) {
return sharedModelKey(provider, model);
}
export function legacyModelKey(provider: string, model: string): string | null {
const providerId = provider.trim();
const modelId = model.trim();
if (!providerId || !modelId) {
return null;
}
const rawKey = `${providerId}/${modelId}`;
const canonicalKey = modelKey(providerId, modelId);
return rawKey === canonicalKey ? null : rawKey;
}
export {
findNormalizedProviderKey,
findNormalizedProviderValue,
normalizeProviderId,
normalizeProviderIdForAuth,
};
function normalizeProviderModelId(
provider: string,
model: string,
options?: { allowPluginNormalization?: boolean },
): string {
const staticModelId = normalizeStaticProviderModelId(provider, model);
if (options?.allowPluginNormalization === false) {
return staticModelId;
}
return (
normalizeProviderModelIdWithRuntime({
provider,
context: {
provider,
modelId: staticModelId,
},
}) ?? staticModelId
);
}
type ModelRefNormalizeOptions = {
allowPluginNormalization?: boolean;
};
export function normalizeModelRef(
provider: string,
model: string,
options?: ModelRefNormalizeOptions,
): ModelRef {
const normalizedProvider = normalizeProviderId(provider);
const normalizedModel = normalizeProviderModelId(normalizedProvider, model.trim(), options);
return { provider: normalizedProvider, model: normalizedModel };
}
type ParseModelRefOptions = ModelRefNormalizeOptions;
export function parseModelRef(
raw: string,
defaultProvider: string,
options?: ParseModelRefOptions,
): ModelRef | null {
const trimmed = raw.trim();
if (!trimmed) {
return null;
}
const slash = trimmed.indexOf("/");
if (slash === -1) {
return normalizeModelRef(defaultProvider, trimmed, options);
}
const providerRaw = trimmed.slice(0, slash).trim();
const model = trimmed.slice(slash + 1).trim();
if (!providerRaw || !model) {
return null;
}
return normalizeModelRef(providerRaw, model, options);
}