refactor: centralize model override validation

This commit is contained in:
Peter Steinberger
2026-01-09 20:07:20 +01:00
parent f0a909f6dd
commit 7e81980747
7 changed files with 204 additions and 59 deletions

View File

@@ -9,12 +9,10 @@ import {
import { loadModelCatalog } from "../agents/model-catalog.js";
import { runWithModelFallback } from "../agents/model-fallback.js";
import {
buildAllowedModelSet,
buildModelAliasIndex,
modelKey,
getModelRefStatus,
resolveAllowedModelRef,
resolveConfiguredModelRef,
resolveHooksGmailModel,
resolveModelRefFromString,
resolveThinkingDefault,
} from "../agents/model-selection.js";
import { runEmbeddedPiAgent } from "../agents/pi-embedded.js";
@@ -301,14 +299,14 @@ export async function runCronIsolatedAgentTurn(params: {
})
: null;
if (hooksGmailModelRef) {
const allowed = buildAllowedModelSet({
const status = getModelRefStatus({
cfg: params.cfg,
catalog: await loadCatalog(),
ref: hooksGmailModelRef,
defaultProvider: resolvedDefault.provider,
defaultModel: resolvedDefault.model,
});
const key = modelKey(hooksGmailModelRef.provider, hooksGmailModelRef.model);
if (allowed.allowAny || allowed.allowedKeys.has(key)) {
if (status.allowed) {
provider = hooksGmailModelRef.provider;
model = hooksGmailModelRef.model;
}
@@ -321,34 +319,15 @@ export async function runCronIsolatedAgentTurn(params: {
if (typeof modelOverrideRaw !== "string") {
return { status: "error", error: "invalid model: expected string" };
}
const trimmed = modelOverrideRaw.trim();
if (!trimmed) {
return { status: "error", error: "invalid model: empty" };
}
const aliasIndex = buildModelAliasIndex({
cfg: params.cfg,
defaultProvider: resolvedDefault.provider,
});
const resolvedOverride = resolveModelRefFromString({
raw: trimmed,
defaultProvider: resolvedDefault.provider,
aliasIndex,
});
if (!resolvedOverride) {
return { status: "error", error: `invalid model: ${trimmed}` };
}
const allowed = buildAllowedModelSet({
const resolvedOverride = resolveAllowedModelRef({
cfg: params.cfg,
catalog: await loadCatalog(),
raw: modelOverrideRaw,
defaultProvider: resolvedDefault.provider,
defaultModel: resolvedDefault.model,
});
const key = modelKey(
resolvedOverride.ref.provider,
resolvedOverride.ref.model,
);
if (!allowed.allowAny && !allowed.allowedKeys.has(key)) {
return { status: "error", error: `model not allowed: ${key}` };
if ("error" in resolvedOverride) {
return { status: "error", error: resolvedOverride.error };
}
provider = resolvedOverride.ref.provider;
model = resolvedOverride.ref.model;